2010-01-21 126 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