diff --git a/apps/routerconsole/java/src/net/i2p/router/web/CSSHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/CSSHelper.java
index e0be9d2f8001ec4952d9872a2af7b75d01fc5ef4..1df32a23dab22ed392db645f39050de32ce2be74 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/CSSHelper.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/CSSHelper.java
@@ -53,19 +53,20 @@ public class CSSHelper extends HelperBase {
 
     /**
      * change default language for the router AND save it
-     * @param lang xx OR xx_XX
+     * @param lang xx OR xx_XX OR xxx OR xxx_XX
      */
     public void setLang(String lang) {
         // Protected with nonce in css.jsi
-        if (lang != null) {
+        if (lang != null && lang.length() > 0) {
             Map m = new HashMap(2);
-            if (lang.length() == 2) {
+            int under = lang.indexOf('_');
+            if (under < 0) {
                 m.put(Messages.PROP_LANG, lang.toLowerCase(Locale.US));
                 m.put(Messages.PROP_COUNTRY, "");
                 _context.router().saveConfig(m, null);
-            } else if (lang.length() == 5) {
-                m.put(Messages.PROP_LANG, lang.substring(0, 2).toLowerCase(Locale.US));
-                m.put(Messages.PROP_COUNTRY, lang.substring(3, 5).toUpperCase(Locale.US));
+            } else if (under > 0 && lang.length() > under + 1) {
+                m.put(Messages.PROP_LANG, lang.substring(0, under).toLowerCase(Locale.US));
+                m.put(Messages.PROP_COUNTRY, lang.substring(under + 1).toUpperCase(Locale.US));
                 _context.router().saveConfig(m, null);
             }
         }
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigUIHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigUIHelper.java
index ba65110ef93d65eeff53864df277eb0b618a2021..52137d7cce05d7ebd5576232048fd0bde2f4e25c 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigUIHelper.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigUIHelper.java
@@ -70,6 +70,7 @@ public class ConfigUIHelper extends HelperBase {
      *  See http://en.wikipedia.org/wiki/ISO_639-1 .
      *  Any language-specific flag added to the icon set must be
      *  added to the top-level build.xml for the updater.
+     *  As of 0.9.12, ISO 639-2 three-letter codes are supported also.
      */
     private static final String langs[][] = {
         { "ar", "lang_ar", _x("Arabic"), null },
@@ -138,7 +139,8 @@ public class ConfigUIHelper extends HelperBase {
                 buf.append("checked=\"checked\" ");
             buf.append("value=\"").append(lang).append("\">")
                .append("<img height=\"11\" width=\"16\" alt=\"\" src=\"/flags.jsp?c=").append(langs[i][1]).append("\"> ");
-            String slang = lang.length() > 2 ? lang.substring(0, 2) : lang;
+            int under = lang.indexOf('_');
+            String slang = (under > 0) ? lang.substring(0, under) : lang;
             buf.append(Messages.getDisplayLanguage(slang, langs[i][2], _context));
             String name = langs[i][3];
             if (name != null) {
diff --git a/core/java/src/net/i2p/util/Translate.java b/core/java/src/net/i2p/util/Translate.java
index 632658cb149a9cecd68679402bbefce8759eacd6..8c53428496332f528b9c73090e4c06b86cc146da 100644
--- a/core/java/src/net/i2p/util/Translate.java
+++ b/core/java/src/net/i2p/util/Translate.java
@@ -135,7 +135,7 @@ public abstract class Translate {
     }
 
     /**
-     *  Two-letter lower case
+     *  Two- or three-letter lower case
      *  @return lang in routerconsole.lang property, else current locale
      */
     public static String getLanguage(I2PAppContext ctx) {
@@ -192,7 +192,7 @@ public abstract class Translate {
      *  by langCode, using the current language.
      *  Uses translation if available, then JVM Locale.getDisplayLanguage() if available, else default param.
      *
-     *  @param langCode two-letter lower-case
+     *  @param langCode two- or three-letter lower-case
      *  @param dflt e.g. "English"
      *  @since 0.9.5
      */