如何获得简体中文描述(简体)?从可用的区域设置 Locale.SIMPLIFIED_CHINESE
,似乎没有方法返回此描述:
getDisplayLanguage()
返回正确的语言名称,但没有变体。getDisplayName()
返回正确的语言名称和国家/地区,但也没有变体。getDisplayVariant()
返回空字符串。
我还尝试使用不同的构造函数构建一个新的 Locale
,但也无济于事。
new Locale("zh", "CN");
new Locale("zh", "CN", "Hans");
我检查了 Android source code for LocalePicker
我得出的结论是 loaded from the resources (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);
}
它采用您已经知道的 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>
和相应的语言
<string-array translatable="false" name="special_locale_names">
<item>العربية</item>
<item>中文 (简体)</item>
<item>中文 (繁體)</item>
</string-array>
注意简体中文代码是zh_CN,最后两个字符大写。
但是,
Locale locale = new Locale("zh_CN");
System.out.println("Locale: " + locale);
打印
Locale: zh_cn
注意小写。所以 specialLocaleCodes[i].equals(code)
不可能返回 true。然后我四处寻找Locale.java并且,长话短说,我们可以通过这样做绕过大小写转换的困惑(并且您必须将第 3 个参数保留为空字符串才能正常工作):
Locale locale = new Locale("zh", "CN", "");
System.out.println("Locale: " + locale);
打印
Locale: zh_CN
有了这个你应该能够做到这一点:
Locale locale = new Locale("zh", "CN", "");
System.out.println("Name:" + locale.getDisplayName(locale));
进一步检查 Kitkat 使用这个(谢谢安德鲁!)
int specialLocaleNamesId = Resources.getSystem().getIdentifier("special_locale_names", "array", "android");
String[] specialLocaleNames = Resources.getSystem().getStringArray(specialLocaleNamesId);
可以打印出来
العربية,中文 (简体),中文 (繁體)
如预期。但是,Kitkat 中的某些内容仍然阻止显示正确的字符串。令人沮丧。
然而,在Lollipop 5.0+ Java 1.7 在 Locale 中使用 forLanguageTag()
可以工作。
Locale locale = Locale.forLanguageTag("zh-Hans");
System.out.println("getDisplayName:" + locale.getDisplayName(locale));
System.out.println("getDisplayLanguage:" + locale.getDisplayLanguage(locale));
打印
getDisplayName:中文 (简体中文)
getDisplayLanguage:中文
关于android - 获取简体中文的语言环境变体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29536631/