获取简体中文的语言环境变体
Getting Locale variant for simplified chinese
如何获得简体中文描述(简体)?从可用的语言环境 Locale.SIMPLIFIED_CHINESE
,似乎没有方法 return 这个描述:
getDisplayLanguage()
return 是正确的语言名称,但没有变体。
getDisplayName()
return 正确的语言名称和国家/地区,但也没有变体。
getDisplayVariant()
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 resources(special_locale_codes
和 special_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:中文
如何获得简体中文描述(简体)?从可用的语言环境 Locale.SIMPLIFIED_CHINESE
,似乎没有方法 return 这个描述:
getDisplayLanguage()
return 是正确的语言名称,但没有变体。getDisplayName()
return 正确的语言名称和国家/地区,但也没有变体。getDisplayVariant()
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 resources(special_locale_codes
和 special_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:中文