如何获得简体中文说明(简体)?从可用的区域设置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
)。
除了必须在我的资源中硬编码/包含此字符串之外的任何解决方案?
答案 0 :(得分:5)
让我解释一下我如何解决这个问题的过程。首先,我在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);
打印
区域设置:zh_cn
注意小写。所以specialLocaleCodes[i].equals(code)
无法返回true。那么我就在Locale.java左右徘徊,长话短说,我们可以通过这样做来绕过这种改变情况的混乱(并且你必须将第3个参数保持为空字符串才能使其工作):
Locale locale = new Locale("zh", "CN", "");
System.out.println("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:中文
答案 1 :(得分:1)
你可以像LocalePicker
中那样访问android内部资源:com.android.internal.R.array.special_locale_names
:
final Resources resources = context.getResources();
final String[] specialLocaleNames = resources.getStringArray(com.android.internal.R.array.special_locale_names);
但在这里使用自己的资源可能更安全(避免 内部的使用)