获取简体中文的语言环境变体

Getting Locale variant for simplified chinese

如何获得简体中文描述(简体)?从可用的语言环境 Locale.SIMPLIFIED_CHINESE,似乎没有方法 return 这个描述:

我也尝试过使用不同的构造函数构建一个新的 Locale,但也无济于事。

new Locale("zh", "CN");
new Locale("zh", "CN", "Hans");

我检查了 Android source code for LocalePicker and I've concluded that it is loaded from the resourcesspecial_locale_codesspecial_locale_names)。

除了必须 hardcode/include 我的资源中的这个字符串之外还有什么解决方案吗?

您可能可以访问 android 内部资源:com.android.internal.R.array.special_locale_names 与在 LocalePicker 中完成的方式相同:

final Resources resources = context.getResources();
final String[] specialLocaleNames = resources.getStringArray(com.android.internal.R.array.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) 不可能 return 为真。然后我四处寻找 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:中文