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.
- Configuración de idioma turco e inglés: traducir caracteres turcos a equivalentes latinos
- Android - El idioma de WebView cambia abruptamente en Android N
- Establecer la configuración regional mediante programación
- Lenguaje hindi
- Configuración de la configuración regional ¿No funciona?
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?
- Código de configuración local para hebreo / Referencia a otros códigos de configuración regional?
- Configuración regional: onConfigurationChanged not called
- La configuración de Android cambia de forma aleatoria al valor predeterminado
- Texto de Android a voz en diferentes idiomas
- Cómo obtener el formato de fecha de configuración regional en mes y día
- Cómo restaurar la configuración regional predeterminada de una aplicación para Android
- Android obtiene la configuración actual, no predeterminada
- Cambiar el idioma de las cadenas en la actividad de Android
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)
- ¿Qué desencadena (o genera) KeyEvent.ACTION_MULTIPLE?
- Implementación de android como un servidor (receptor) en airplay