获取简体中文的Locale变体

m0s*_*it0 12 android locale

我怎样才能得到简体中文说明(简体)?从可用的语言环境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_codesspecial_locale_names)加载的.

除了必须在我的资源中硬编码/包含此字符串之外的任何解决方案?

Dra*_*kes 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);
}
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:中文