Obtener la variante de la configuración regional para el chino simplificado

¿Cómo puedo obtener una descripción simplificada de chino (简体)? De la localidad disponible Locale.SIMPLIFIED_CHINESE , ningún método parece devolver esta descripción:

  • getDisplayLanguage() devuelve el nombre de idioma correcto, pero sin la variante.
  • getDisplayName() devuelve el nombre de idioma y país correctos, pero también sin la variante.
  • getDisplayVariant() devuelve una cadena vacía.

También he intentado construir una nueva configuración Locale usando los constructores diferentes, también en vano.

 new Locale("zh", "CN"); new Locale("zh", "CN", "Hans"); 

He comprobado el código fuente de Android para LocalePicker y he llegado a la conclusión de que se carga desde los recursos ( special_locale_codes y special_locale_names ).

¿Alguna solución además de tener que codificar / incluir esta cadena en mis recursos?

Permítanme explicar mi proceso sobre cómo abordé esto. Primero, encontré este bloque de código en LocalePicker.java

 private static String getDisplayName(Locale l, String[] specialLocaleCodes, String[] specialLocaleNames) { String code = l.toString(); for (int i = 0; i < specialLocaleCodes.length; i++) { if (specialLocaleCodes[i].equals(code)) { return specialLocaleNames[i]; } } return l.getDisplayName(l); } 

Que tiene en una Locale como usted ya sabe. A continuación, intenta encontrar el código de configuración regional en la specialLocaleCodes cadenas specialLocaleCodes . Los specialLocaleNames que estás buscando se obtienen de arrays.xml como has dicho útilmente:

 <string-array translatable="false" name="special_locale_codes"> <item>ar_EG</item> <item>zh_CN</item> <item>zh_TW</item> </string-array> 

Y los idiomas correspondientes

 <string-array translatable="false" name="special_locale_names"> <item>العربية</item> <item>中文 (简体)</item> <item>中文 (繁體)</item> </string-array> 

Observe que el código con el chino simplificado es zh_CN y los dos últimos caracteres están en mayúsculas.

Sin embargo,

 Locale locale = new Locale("zh_CN"); System.out.println("Locale: " + locale); 

huellas dactilares

Localidad: zh_cn

Observe la minúscula. Por lo tanto, no es posible que specialLocaleCodes[i].equals(code) devuelva true. Así que yo empujé alrededor de Locale.java y, a lo largo de la historia corta, podemos pasar por alto ese revoltijo cambiador de casos haciendo esto (y DEBE mantener el 3er parámetro como una cadena vacía para que esto funcione):

 Locale locale = new Locale("zh", "CN", ""); System.out.println("Locale: " + locale); 

Huellas dactilares

Localidad: zh_CN

Con esto usted debe ser capaz de hacer esto:

 Locale locale = new Locale("zh", "CN", ""); System.out.println("Name:" + locale.getDisplayName(locale)); 

Sobre la inspección más adelante en Kitkat usando esto (gracias Andrew!)

 int specialLocaleNamesId = Resources.getSystem().getIdentifier("special_locale_names", "array", "android"); String[] specialLocaleNames = Resources.getSystem().getStringArray(specialLocaleNamesId); 

Era posible imprimir

العربية, 中文 (简体), 中文 (繁體)

como se esperaba. Sin embargo, algo en Kitkat sigue impidiendo que se muestre la cadena correcta. Frustrante.


Sin embargo, en Lollipop 5.0+ y Java 1.7 esto funciona usando forLanguageTag() en Locale.

 Locale locale = Locale.forLanguageTag("zh-Hans"); System.out.println("getDisplayName:" + locale.getDisplayName(locale)); System.out.println("getDisplayLanguage:" + locale.getDisplayLanguage(locale)); 

Que imprime

GetDisplayName: 中文 (简体 中文)
GetDisplayLanguage: 中文

Probablemente podría acceder al recurso interno de android: com.android.internal.R.array.special_locale_names la misma manera que lo hace en LocalePicker :

 final Resources resources = context.getResources(); final String[] specialLocaleNames = resources.getStringArray(com.android.internal.R.array.special_locale_names); 

Pero es probablemente más seguro usar su propio recurso aquí (evitando el uso de internos)

  • Iniciar la aplicación con un idioma específico
  • Android Cómo instalar los locales instalados del sistema
  • Comprobación de configuración regional de la matriz de cadenas de Android
  • Los números arábigos con ar-ae y ar-sa locale en Android
  • ¿Por qué podría Resources.getString () devolver intermitentemente cadenas de la configuración regional equivocada?
  • La mejor manera de determinar automáticamente el idioma del usuario
  • Número en árabe en texto árabe en Android
  • Forzar locale para Android con resConfig
  • Cómo cambiar el idioma de com.facebook.widget.LoginButton en Android
  • ¿Cómo detectar si el idioma es el inglés (Todas las variantes) en Android?
  • La actividad está parpadeando tras el cambio de configuración regional en Android 4.1+
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.