获取简体中文的Locale变体

时间:2015-04-09 10:59:09

标签: 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 resourcesspecial_locale_codesspecial_locale_names)。

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

2 个答案:

答案 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);

在这里使用自己的资源可能更安全(避免 内部的使用)