Index: trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/LabelCompositionStrategy.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/LabelCompositionStrategy.java	(revision 19043)
+++ trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/LabelCompositionStrategy.java	(revision 19045)
@@ -145,17 +145,5 @@
          * The list of default name tags from which a label candidate is derived.
          */
-        private static final String[] DEFAULT_NAME_TAGS = {
-            "name:" + LanguageInfo.getJOSMLocaleCode(),
-            "name",
-            "int_name",
-            "distance",
-            "railway:position",
-            "ref",
-            "operator",
-            "brand",
-            "addr:unit",
-            "addr:flats",
-            "addr:housenumber"
-        };
+        private static final String[] DEFAULT_NAME_TAGS = getDefaultNameTags();
 
         /**
@@ -175,4 +163,22 @@
             Config.getPref().addPreferenceChangeListener(this);
             initNameTagsFromPreferences();
+        }
+
+        /* Is joining an array really that complicated in Java? */
+        private static String[] getDefaultNameTags() {
+            ArrayList<String> tags = new ArrayList<String>(Arrays.asList(LanguageInfo.getOSMLocaleCodes("name:")));
+            tags.addAll(Arrays.asList(new String[]{
+                "name",
+                "int_name",
+                "distance",
+                "railway:position",
+                "ref",
+                "operator",
+                "brand",
+                "addr:unit",
+                "addr:flats",
+                "addr:housenumber"
+            }));
+            return tags.toArray(String[]::new);
         }
 
Index: trunk/src/org/openstreetmap/josm/tools/LanguageInfo.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/LanguageInfo.java	(revision 19043)
+++ trunk/src/org/openstreetmap/josm/tools/LanguageInfo.java	(revision 19045)
@@ -155,4 +155,45 @@
 
     /**
+     * Replies the OSM locale codes for the default locale.
+     *
+     * @return the OSM locale codes for the default locale
+     * @see #getOSMLocaleCode(String, Locale)
+     * @since 19045
+     */
+    public static String[] getOSMLocaleCodes(String prefix) {
+        return getOSMLocaleCodes(prefix, Locale.getDefault());
+    }
+
+    /**
+     * Replies the locale codes used by OSM for a given locale.
+     *
+     * In most cases OSM uses the 2-character ISO 639 language code ({@link Locale#getLanguage()}
+     * to identify the locale of a localized resource, but in some cases it may use the
+     * programmatic name for locales, as replied by {@link Locale#toString()}.
+     *
+     * For unknown country codes and variants this function already does fallback to
+     * internally known translations.
+     *
+     * @param prefix a prefix like {@code name:}.
+     * @param locale the locale. Replies "en" if null.
+     * @return the OSM codes for the given locale
+     * @since 19045
+     */
+    public static String[] getOSMLocaleCodes(String prefix, Locale locale) {
+        if (prefix == null) {
+            prefix = "";
+        }
+        String main = getJOSMLocaleCode(locale);
+        switch (main) {
+            case "zh_CN":
+                return new String[]{prefix+"zh-Hans-CN", prefix+"zh-Hans", prefix+"zh"};
+            case "zh_TW":
+                return new String[]{prefix+"zh-Hant-TW", prefix+"zh-Hant", prefix+"zh"};
+            default:
+                return new String[]{prefix+main};
+        }
+    }
+
+    /**
      * Replies the locale code used by Java for a given locale.
      *
