java.util.Locale有一个空的第一项

时间:2012-12-30 06:44:36

标签: java jvm locale

我试图从JVM获取所有语言环境以填充国家/地区下拉列表。第一项是空的非null对象。它不是null,因为我使用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)

3 个答案:

答案 0 :(得分:3)

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代码并且正在回归到它,因为它无法本地化到你的语言环境而且没有英文名称(或者,不是有一个国家指定)。对于你来说两者都是空字符串是完全有效的(但是,相当无用)。

答案 1 :(得分:3)

有问题的区域设置不是Locale.ROOTlocale == Locale.ROOT在我的结尾,我认为对你来说也是如此。

为什么Locale.ROOT存在?根据{{​​3}}:

  

如果没有指定的语言环境提供程序支持所请求的语言环境,则使用默认的“JRE”语言环境提供程序的Locale.ROOT语言环境资源。例如,如果在“java.locale.providers”系统属性中仅指定了“CLDR”,则Collat​​or的工作方式与ROOT语言环境请求的一样,因为“CLDR”语言环境提供程序不提供Collat​​or区域设置数据。指定“CLDR,JRE”补充了“JRE”语言环境提供程序的Collat​​or功能,并且更喜欢将“CLDR”语言环境提供程序的其他语言环境数据添加到“JRE”的语言环境中。

答案 2 :(得分:0)

尝试

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

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

ms MY
ar QA
is IS
fi FI
pl 
en MT
...