2012-12-30 11 views
3

我想從JVM獲取所有的語言環境來填充國家下拉菜單。第一個項目是一個空的非空對象。它不爲空,因爲我使用TreeMap集合來添加國家縮寫和(可顯示)名稱。看下面看看收藏是什麼。java.util.Locale有一個空的第一項

{=, 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

javadocs基本上覆蓋了這一點。

對於locale.getCountry()你會發現:

返回此語言環境的國家/地區代碼,要麼是空字符串,大寫的ISO 3166兩字母代碼,或UN M.49 3位數字代碼。

而對於locale.getDisplayCountry()你發現:

返回的語言環境的國家名適合顯示給用戶。如果可能,返回的名稱將被本地化爲默認語言環境。例如,如果區域設置爲fr_FR且默認區域設置爲en_US,則getDisplayCountry()將返回「France」;如果區域設置爲en_US且默認區域設置爲fr_FR,則getDisplayCountry()將返回「Etats-Unis」。如果返回的名稱不能在默認語言環境中進行本地化(例如,我們沒有克羅地亞語的日語名稱),則此功能將返回英文名稱,並將ISO代碼作爲最後的度假值。如果區域設置未指定國家/地區,則此函數返回空字符串。

你不能「看到」的人沒有ISO代碼,因此它不能被本地化到你的語言環境,也沒有英文名字(或者,沒有指定國家)。這對你來說完全有效,因爲兩者都有空串(儘管相當無用)。

+0

對。但爲什麼locale.getCountry()和locale.getDisplayCountry()都是空的? – Mukus

+0

其實我重新讀你的答案,這是有道理的。我不認爲使用JVM是獲取國家名單的正確途徑。此外,名稱基於選定的語言環境。對於美國,我們會失去其他人的名字,我們會得到更多。 – Mukus

+0

右鍵 - 它是'Locale',但是...沒有任何你想要的東西。其中一些只有語言標籤。 –

0

嘗試

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

你會看到,某些地區只有語言,沒有國家

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

你沒有調用正確的方法來獲取國家名稱。 – Mukus

3

有問題的語言環境是Locale.ROOTlocale == Locale.ROOT在我的最後,我認爲對你來說也是如此。

爲什麼Locale.ROOT存在?據http://www.oracle.com/technetwork/java/javase/java8locales-2095355.html

默認「JRE」區域提供的對Locale.ROOT區域資源,如果沒有指定的語言環境提供者支持請求的語言環境中使用。例如,如果在「java.locale.providers」系統屬性中僅指定了「CLDR」,則Collat​​or的工作方式與ROOT區域設置相同,因爲「CLDR」區域設置提供程序不提供Collat​​or區域設置數據。指定「CLDR,JRE」補充了「JRE」語言環境提供程序的Collat​​or功能,並且將「CLDR」語言環境提供程序的其他語言環境數據優先選擇爲「JRE」。

+0

這可能是SO正在尋找的答案。 –