Lasciatemi spiegare il mio processo su come l'ho affrontato. In primo luogo, ho trovato questo blocco di codice in 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);
}
che prende in un Locale
come già sapete. Quindi cerca di trovare il codice locale nell'array di stringhe specialLocaleCodes
. Il specialLocaleNames
si sta cercando sono ottenuti da arrays.xml come hai utilmente dichiarato:
<string-array translatable="false" name="special_locale_codes">
<item>ar_EG</item>
<item>zh_CN</item>
<item>zh_TW</item>
</string-array>
e le lingue corrispondenti
<string-array translatable="false" name="special_locale_names">
<item>العربية</item>
<item>中文 (简体)</item>
<item>中文 (繁體)</item>
</string-array>
Avviso il codice con il cinese semplificato è zh_CN e gli ultimi due caratteri sono in maiuscolo.
Tuttavia,
Locale locale = new Locale("zh_CN");
System.out.println("Locale: " + locale);
stampe
Locale: zh_cn
Avviso minuscolo. Quindi non c'è modo specialLocaleCodes[i].equals(code)
restituirà true.Allora ho curiosato Locale.java e, per farla breve, possiamo ignorare che guazzabuglio che cambia caso per fare questo (e si deve mantenere il terzo parametro come una stringa vuota per questo lavoro):
Locale locale = new Locale("zh", "CN", "");
System.out.println("Locale: " + locale);
Stampe
Locale: zh_CN
Con questo si dovrebbe essere in grado di fare questo:
Locale locale = new Locale("zh", "CN", "");
System.out.println("Name:" + locale.getDisplayName(locale));
Ulteriori controlli in seguito su Kitkat utilizzare questo (grazie Andrea!)
int specialLocaleNamesId = Resources.getSystem().getIdentifier("special_locale_names", "array", "android");
String[] specialLocaleNames = Resources.getSystem().getStringArray(specialLocaleNamesId);
è stato possibile stampare
العربية, 中文 (简体), 中文 (繁體)
come previsto. Tuttavia, qualcosa in Kitkat sta ancora impedendo la corretta visualizzazione della stringa. Frustrante.
Tuttavia, in Lollipop 5.0+ e Java 1.7 questo funziona utilizzando forLanguageTag()
in Locale.
Locale locale = Locale.forLanguageTag("zh-Hans");
System.out.println("getDisplayName:" + locale.getDisplayName(locale));
System.out.println("getDisplayLanguage:" + locale.getDisplayLanguage(locale));
che stampa
getDisplayName: 中文 (简体 中文)
getDisplayLanguage: 中文
risolto. È stato un problema divertente :) – Drakes
@Drakes che desideri! Sto solo scherzando, bel tentativo però :) – m0skit0