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

标签 android locale

如何获得简体中文描述(简体)?从可用的区域设置 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_codesspecial_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/

相关文章:

java - 创建 gradle 插件时将生成的 java 或 kotlin 源代码放在哪里?

java - OnPost执行结果为空

c# - 如何从代码统一安装Android apk

locale - 为什么 Edge 不支持我的 PC 的区域设置(特别是日期格式)?

java - 整洁的架构、数据请求编排器、演示器或用例/交互器?

java - 无法在 libgdx 中加载渐进式 jpeg 图像

java - NumberFormat.getCurrencyInstance() 不返回语言环境中国和法国的货币符号 (jdk-1.8)

Django 的 makemessages 创建了很多模糊条目

c++ - 为什么unicode编码需要函数wsetlocale()?

java - 获取 GWT 中的当前区域设置