Index: trunk/src/org/openstreetmap/josm/gui/preferences/display/LanguagePreference.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/display/LanguagePreference.java	(revision 8231)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/display/LanguagePreference.java	(revision 8232)
@@ -3,5 +3,4 @@
 
 import static org.openstreetmap.josm.tools.I18n.tr;
-import static org.openstreetmap.josm.tools.I18n.trc;
 
 import java.awt.Component;
@@ -28,4 +27,5 @@
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.I18n;
+import org.openstreetmap.josm.tools.LanguageInfo;
 
 /**
@@ -73,5 +73,5 @@
         else
             return Main.pref.put("language",
-                    ((Locale)langCombo.getSelectedItem()).toString());
+                    LanguageInfo.getJOSMLocaleCode((Locale)langCombo.getSelectedItem()));
     }
 
@@ -87,4 +87,5 @@
             setSelectedItem(null);
             if (language != null) {
+                language = LanguageInfo.getJavaLocaleCode(language);
                 for (Locale locale: data) {
                     if (locale == null) {
@@ -121,7 +122,5 @@
                     l == null
                             ? tr("Default (Auto determined)")
-                            : "ca__valencia".equals(l.toString())
-                            ? trc("language", "Valencian")
-                            : l.getDisplayName(l),
+                            : LanguageInfo.getDisplayName(l),
                     index, isSelected, cellHasFocus);
         }
Index: trunk/src/org/openstreetmap/josm/tools/LanguageInfo.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/LanguageInfo.java	(revision 8231)
+++ trunk/src/org/openstreetmap/josm/tools/LanguageInfo.java	(revision 8232)
@@ -1,4 +1,6 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.tools;
+
+import static org.openstreetmap.josm.tools.I18n.trc;
 
 import java.util.Locale;
@@ -107,4 +109,41 @@
      * Replies the locale code used by Java for a given locale.
      *
+     * @param locale the locale. Replies "en" if null.
+     * @return the Java code for the given locale
+     * @since 8232
+     */
+    public static String getJavaLocaleCode(String localeName) {
+        if (localeName == null) return "en";
+        if ("ca@valencia".equals(localeName)) {
+            localeName = "ca__valencia";
+        } else if ("he".equals(localeName)) {
+            localeName = "iw_IL";
+        } else if ("id".equals(localeName)) {
+            localeName = "in";
+        }
+        return localeName;
+    }
+
+    /**
+     * Replies the display string used by JOSM for a given locale.
+     *
+     * In most cases returns text replied by {@link Locale#getDisplayName()}, for some
+     * locales an override is used (i.e. when unsupported by Java).
+     *
+     * @param locale the locale. Replies "en" if null.
+     * @return the display string for the given locale
+     * @since 8232
+     */
+    public static String getDisplayName(Locale locale) {
+        String full = locale.toString();
+        if ("ca__valencia".equals(full))
+            return trc("language", "Valencian");
+
+        return locale.getDisplayName();
+    }
+
+    /**
+     * Replies the locale code used by Java for a given locale.
+     *
      * In most cases JOSM and Java uses the same codes, but for some exceptions this is needed.
      *
@@ -113,12 +152,7 @@
      */
     public static Locale getLocale(String localeName) {
-        if ("ca@valencia".equals(localeName)) {
+        localeName = getJavaLocaleCode(localeName);
+        if ("ca__valencia".equals(localeName)) {
             return new Locale("ca", "", "valencia");
-        }
-        if ("he".equals(localeName)) {
-            localeName = "iw_IL";
-        }
-        else if ("id".equals(localeName)) {
-            localeName = "in";
         }
         Locale l;
