我试图让所有的地区从JVM来填充国家下拉。 第一项是一个空不空对象。 这是因为我使用一个TreeMap集合添加国家缩写和(可显示)名称不为空。 看看下面来看看收集是什么。
{=, AE=United Arab Emirates, AL=Albania, AR=Argentina, AT=Austria, AU=Australia, BA=Bosnia and Herzegovina, BE=Belgium, BG=Bulgaria, BH=Bahrain, BO=Bolivia, BR=Brazil,....
下面的代码。 我删除空对象,以确保第一个值是不是空的。
public Map<String, String> countries(Locale currentLocale) {
Map<String, String> countries = new TreeMap<String, String>();
for (Locale locale : Locale.getAvailableLocales()) {
countries.put(locale.getCountry(),
locale.getDisplayCountry(currentLocale));
}
countries.remove("");
return countries;
}
JVM版本 - (建1.7.0_09-B05)
该javadocs中基本涵盖这一点。
对于locale.getCountry()
你会发现:
返回此语言环境,这要么是空字符串 ,大写的ISO 3166两字母代码,或UN M.49 3位数代码的国家/地区代码。
而对于locale.getDisplayCountry()
你会发现:
返回的语言环境的国家名适合显示给用户。 如果可能的话,返回的名称将被本地化为默认语言环境。 例如,如果语言环境是fr_FR并且默认的语言环境是en_US,getDisplayCountry()将返回“法国”; 如果语言环境是en_US并且默认的语言环境是fr_FR,getDisplayCountry()将返回“Etats-紫光”。 如果返回的名称不能本地化默认语言环境(比方说,我们没有对克罗地亚的日本名称),则该功能将依赖英文名,并使用ISO代码作为最终的值。 如果该语言环境未指定国家,这个函数返回一个空字符串。
你不能“看到”一个不具有ISO代码,并回落至因为它不能本地化的语言环境,没有一个英文名称是(或者,没有一个国家指定)。 这是完全有效的,你与两个空字符串(虽然没什么用)清盘。
有问题的区域比其他没有Locale.ROOT 。 locale == Locale.ROOT
我的结束,我认为同样会为你真实的。
为什么Locale.ROOT
存在? 据http://www.oracle.com/technetwork/java/javase/java8locales-2095355.html :
默认的“JRE”区域供应商的资源,为Locale.ROOT语言环境,如果没有指定的语言环境提供者支持请求的语言环境中使用。 例如,如果只有“CLDR”中规定的“java.locale.providers”系统属性,校书郎,工作起来就像要求为根语言环境,因为“CLDR”区域供应商不提供分页器语言环境数据。 指定“CLDR,JRE”补充“JRE”区域供应商的校书郎功能,以及更喜欢“CLDR”区域供应商的其他地区数据为“JRE”的人。
尝试
for (Locale locale : Locale.getAvailableLocales()) {
System.out.println(locale.getLanguage() + " " + locale.getCountry());
}
你会看到,某些地区只有语言没有任何一个国家
ms MY
ar QA
is IS
fi FI
pl
en MT
...