Pozwolę sobie wyjaśnić proces, w jaki sposób to rozwiązałem. Po pierwsze, uważam, że ten blok kodu w 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);
}
która odbywa się w Locale
jak już wiesz. Następnie próbuje znaleźć kod lokalny w tablicy łańcuchowej specialLocaleCodes
. specialLocaleNames
szukasz uzyskuje się z arrays.xml jak już usłużnie stwierdził:
<string-array translatable="false" name="special_locale_codes">
<item>ar_EG</item>
<item>zh_CN</item>
<item>zh_TW</item>
</string-array>
i odpowiadające im języki
<string-array translatable="false" name="special_locale_names">
<item>العربية</item>
<item>中文 (简体)</item>
<item>中文 (繁體)</item>
</string-array>
Wskazówka kod z chińskim uproszczonym jest zh_CN a ostatnie dwa znaki są pisane wielką literą.
Jednakże
Locale locale = new Locale("zh_CN");
System.out.println("Locale: " + locale);
drukuje
lokalizacyjnych: zh_cn
komunikatu dolnej części obudowy. Więc nie ma mowy, że specialLocaleCodes[i].equals(code)
zwróci true.Więc potem szturchnął wokół Locale.java i, krótko mówiąc, możemy ominąć takim przypadku zmieniających zbieraniną w ten sposób (i trzeba zachować 3rd parametr jako pusty ciąg znaków to zadziałało):
Locale locale = new Locale("zh", "CN", "");
System.out.println("Locale: " + locale);
Prints
Locale: zh_CN
Mając to powinieneś być w stanie to zrobić:
Locale locale = new Locale("zh", "CN", "");
System.out.println("Name:" + locale.getDisplayName(locale));
Po dalszej inspekcji na KitKat pomocą tego (dziękuję Andrew!)
int specialLocaleNamesId = Resources.getSystem().getIdentifier("special_locale_names", "array", "android");
String[] specialLocaleNames = Resources.getSystem().getStringArray(specialLocaleNamesId);
możliwe było wydrukowanie
العربية, 中文 (简体), alfabetyczny (Spis)
zgodnie z oczekiwaniami. Jednak coś w KitKat nadal uniemożliwia wyświetlanie prawidłowego łańcucha. Denerwujący.
Jednak w Lollipop 5.0+ i Java 1.7 to działa przy użyciu forLanguageTag()
w Locale.
Locale locale = Locale.forLanguageTag("zh-Hans");
System.out.println("getDisplayName:" + locale.getDisplayName(locale));
System.out.println("getDisplayLanguage:" + locale.getDisplayLanguage(locale));
drukowany
GetDisplayName: alfabetyczny (简体 alfabetyczny)
getDisplayLanguage: alfabetyczny
rozwiązany. Był zabawny problem. :) – Drakes
@ Drakes, które chcesz! Po prostu żartuję, ale spróbuj :) – m0skit0