2010-01-21 87 views
9

我发现了一些在Java中locales-如果我打印出可用区域设置的列表中缺少的国家,Java中缺少语言环境?

TreeSet<String> m = new TreeSet<String>(); 
for (Locale l : Locale.getAvailableLocales()) { 
    m.add(l.getDisplayCountry()); 
} 
for (String s : m) { 
    System.out.println(s); 
} 

我错过了许多国家,包括尼日利亚,伊朗,吉尔吉斯斯坦,巴基斯坦。任何人都可以阐明这一点,或者有更好的(更全面的)在java中获取国家列表的方式吗?

1.6.0_16-B01

+0

我怀疑国务院的出口限制至少与该清单有关...... – kdgregory 2010-01-21 17:20:22

+1

但不管怎样,我质疑区域设置表是否构建国家列表的合理方式。当然,这取决于您的使用情况,但我认为大多数应用程序会使用更小的列表更好,而任何需要处理历史数据的应用程序都需要更大的列表。 – kdgregory 2010-01-21 17:23:43

+0

让我好奇,如果有办法以某种方式将您自己的语言环境添加到列表中... – Stroboskop 2010-01-21 17:31:41

回答

2

有世界各国和区域设置之间没有一个一对一的映射。区域设置指定区域。它们旨在标记语言多样性等内容。只是一个清晰的例子:印度,斯里兰卡,巴基斯坦,孟加拉国都是不同的国家..但他们使用英语的方式在任何重大的方面都没有什么不同......它是一个人口统计学的东西..所有这些国家都可以依靠印度语区域

+0

是的,我知道地区和国家之间并没有真正的概念1-1映射。尽管如此,我还是希望(假设?)我得到了一份完整的清单(我认为没有仔细观察)。 javadoc参考的ISO列表也错过了巴基斯坦(http://www.loc.gov/standards/iso639-2/php/English_list.php),但它又是一个语言列表,而不是国家列表。 – 2010-01-21 17:25:53

2

静态方法Locale.getISOCountries()返回ISO 3166 Countries列表中的国家/地区的所有两个字母代码。如果您运行下面的代码:

String[] codes = Locale.getISOCountries(); 
for (String code : codes) { 
    System.out.println(code); 
} 

你会发现,PK(巴基斯坦),NG(尼日利亚)和KG(吉尔吉斯斯坦)都在列表中。请注意,这并不意味着与该国家相关的语言环境已安装。如果要实现任何特定于语言环境的行为,则仅支持的语言环境是由Locale.getAvailableLocales返回的语言环境。

+0

@Tendayi Mawushe - 国家代码可能存在,但这并不意味着日期/数字格式化程序(例如)将自动提供所需的功能。 – McDowell 2010-01-21 18:08:39

+1

是的,PK在那里,但据我所知,除了得到2个字母的ISO代码之外,你什么也做不了。例如,您不能从两个字母的代码中获取国家/地区名称。 – 2010-01-21 19:20:19

+0

我知道这并不意味着该国家的语言环境已安装。然而,这个问题似乎只是试图获取一个国家列表,而不是做任何特定地区的行为。我会在答案中明确说明。 – 2010-01-22 10:12:22

6

Sun Java 6仅支持有限的语言环境子集。支持格式化类/写入系统/等的向量。列在JDK documentation中。

现在,我还没有这样做,但是......

可以在支持塞通过SPI的其他语言环境(描述here)。例如,要为新语言环境提供日期格式化程序,您可以通过实施DateFormatProvider服务来完成。你可以通过装饰现有的实现来实现这一点 - 我会看看ICU4J库,看看它是否提供了你想要的支持。

1

如果你想支持更多的语言环境/国家比目前可在太阳JDK,考虑增加ICU4J罐子你java.ext.dirs - 你不仅会得到更完整的国家和语言环境也为Collator体面的支持列表中,DateFormat