我怎样才能得到简体中文说明(简体)?从可用的语言环境Locale.SIMPLIFIED_CHINESE,似乎没有方法返回此描述:
getDisplayLanguage() 返回正确的语言名称,但没有变体.getDisplayName() 返回正确的语言名称和国家/地区,但也没有变体.getDisplayVariant() 返回一个空字符串.我也尝试Locale使用不同的构造函数构建一个新的,也无济于事.
new Locale("zh", "CN");
new Locale("zh", "CN", "Hans");
Run Code Online (Sandbox Code Playgroud)
我已经检查了Android源代码,LocalePicker并且我得出结论,它是从资源(special_locale_codes和special_locale_names)加载的.
除了必须在我的资源中硬编码/包含此字符串之外的任何解决方案?
让我解释一下我如何解决这个问题的过程.首先,我在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);
}
Run Code Online (Sandbox Code Playgroud)
Locale如你所知,它接受了.然后它尝试在specialLocaleCodes字符串数组中查找语言环境代码.将specialLocaleNames你正在寻求从获得arrays.xml为你帮忙,说:
<string-array translatable="false" name="special_locale_codes">
<item>ar_EG</item>
<item>zh_CN</item>
<item>zh_TW</item>
</string-array>
Run Code Online (Sandbox Code Playgroud)
和相应的语言
<string-array translatable="false" name="special_locale_names">
<item>???????</item>
<item>?? (??)</item>
<item>?? (??)</item>
</string-array>
Run Code Online (Sandbox Code Playgroud)
请注意,带有简体中文的代码是zh_CN,最后两个字符是大写的.
然而,
Locale locale = new Locale("zh_CN");
System.out.println("Locale: " + locale);
Run Code Online (Sandbox Code Playgroud)
版画
区域设置:zh_cn
注意小写.所以没有办法specialLocaleCodes[i].equals(code)会回归真实.所以我在Locale.java周围探索,长话短说,我们可以通过这样做绕过那个改变大小写的混乱(并且你必须将第3个参数保持为空字符串才能使其工作):
Locale locale = new Locale("zh", "CN", "");
System.out.println("Locale: " + locale);
Run Code Online (Sandbox Code Playgroud)
打印
区域设置:zh_CN
有了这个你应该能够做到这一点:
Locale locale = new Locale("zh", "CN", "");
System.out.println("Name:" + locale.getDisplayName(locale));
Run Code Online (Sandbox Code Playgroud)
在使用这个进一步检查Kitkat(谢谢安德鲁!)
int specialLocaleNamesId = Resources.getSystem().getIdentifier("special_locale_names", "array", "android");
String[] specialLocaleNames = Resources.getSystem().getStringArray(specialLocaleNamesId);
Run Code Online (Sandbox Code Playgroud)
可以打印出来
العربية,中文(简体),中文(繁体)
正如所料.但是,Kitkat中的某些内容仍然阻止显示正确的字符串.令人沮丧.
但是,在Lollipop 5.0+和Java 1.7中,这适用forLanguageTag()于Locale.
Locale locale = Locale.forLanguageTag("zh-Hans");
System.out.println("getDisplayName:" + locale.getDisplayName(locale));
System.out.println("getDisplayLanguage:" + locale.getDisplayLanguage(locale));
Run Code Online (Sandbox Code Playgroud)
打印
getDisplayName:中文(简体中文)
getDisplayLanguage:中文
| 归档时间: |
|
| 查看次数: |
1622 次 |
| 最近记录: |