3

我正在尝试从 JVM 获取所有语言环境以填充 Country 下拉列表。第一项是空的非空对象。它不为空,因为我正在使用 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 版本 - (build 1.7.0_09-b05)

4

3 回答 3

4

javadocs基本上涵盖了这一点。

locale.getCountry()您找到:

返回此语言环境的国家/地区代码,它应该是空字符串、大写的 ISO 3166 2 字母代码或 UN M.49 3 位数代码。

并为locale.getDisplayCountry()您找到:

返回适合向用户显示的区域设置国家/地区的名称。如果可能,返回的名称将针对默认语言环境进行本地化。例如,如果语言环境是 fr_FR,默认语言环境是 en_US,getDisplayCountry() 将返回“France”;如果语言环境是 en_US 并且默认语言环境是 fr_FR,getDisplayCountry() 将返回“Etats-Unis”。如果返回的名称无法针对默认语言环境进行本地化(例如,我们没有克罗地亚的日文名称),则此函数将使用英文名称,并使用 ISO 代码作为最后的值。如果语言环境未指定国家/地区,则此函数返回空字符串。

您无法“看到”的那个没有 ISO 代码,并且由于它无法本地化到您的区域设置并且也没有英文名称(或者,没有国家指定的)。为两者都使用空字符串是完全有效的(虽然,相当没用)。

于 2012-12-30T07:33:49.273 回答
3

有问题的语言环境就是Locale.ROOTlocale == Locale.ROOT就我而言,我认为对你来说也是如此。

为什么Locale.ROOT存在?根据http://www.oracle.com/technetwork/java/javase/java8locales-2095355.html

如果指定的语言环境提供者都不支持请求的语言环境,则使用 Locale.ROOT 语言环境的默认“JRE”语言环境提供者的资源。例如,如果在“java.locale.providers”系统属性中仅指定了“CLDR”,则 Collat​​or 的工作方式就像请求 ROOT 语言环境一样,因为“CLDR”语言环境提供程序不提供 Collat​​or 语言环境数据。指定“CLDR,JRE”补充了“JRE”语言环境提供者的整理器功能,并且更喜欢“CLDR”语言环境提供者的其他语言环境数据而不是“JRE”的数据。

于 2015-09-01T04:52:32.273 回答
0

尝试

    for (Locale locale : Locale.getAvailableLocales()) {
        System.out.println(locale.getLanguage() + " " + locale.getCountry());
    }

你会看到一些语言环境只有语言没有国家

ms MY
ar QA
is IS
fi FI
pl 
en MT
...
于 2012-12-30T07:24:03.617 回答