2012-12-28 62 views

回答

0

這只是一個靜態變量countries設置適當的標籤的事:

static { 
    countries = new LinkedHashMap<String,Object>(); 
    countries.put("English", Locale.ENGLISH); //label, value 
    countries.put("Deutsch", Locale.GERMAN); 
    countries.put("Français", Locale.FRENCH); 
    // ... fill in with additional languages/locales as needed 
} 

你可以在原來的語言這裏的語言名稱的大名單:http://www.omniglot.com/language/names.htm

UPDATE:根據OP的評論,他需要翻譯成各種語言的語言名稱。對於這一點,人們可以想出一個解決方案簡單地使地圖語言地圖的(這是相當多的地圖),像這樣:

// set a default value for localeCode 
private String localeCode = Locale.ENGLISH.toString(); 
// ... 
static { 
    countries = new LinkedHashMap<Object, <String,Object>>(); 
    englishCountries = new LinkedHashMap<String,Object>(); 
    englishCountries.put("English", Locale.ENGLISH); //label, value 
    englishCountries.put("German", Locale.GERMAN); 
    englishCountries.put("French", Locale.FRENCH); 
    countries.put(Locale.ENGLISH, englishCountries); 
    germanCountries = new LinkedHashMap<String,Object>(); 
    germanCountries.put("Englisch", Locale.ENGLISH); 
    germanCountries.put("Deutsch", Locale.GERMAN); 
    germanCountries.put("Französisch", Locale.FRENCH); 
    countries.put(Locale.GERMAN, germanCountries); 
    frenchCountries = new LinkedHashMap<String,Object>(); 
    frenchCountries.put("Anglais", Locale.ENGLISH); 
    frenchCountries.put("Allemand", Locale.GERMAN); 
    frenchCountries.put("Français", Locale.FRENCH); 
    countries.put(Locale.FRENCH, frenchCountries); 
    // ... fill in with additional languages/locales as needed 
} 

public Map<Object, <String,Object>> getCountriesInMap() { 
    return countries; 
} 

// adapted value change listener from original: 
public void countryLocaleCodeChanged(ValueChangeEvent e){ 
    String newLocaleValue = e.getNewValue().toString(); 
    //loop country map to compare the locale code 
    for (Object key : countries.keySet()) { 
     if (key.toString().equals(newLocaleValue)) { 
      FacesContext.getCurrentInstance().getViewRoot() 
       .setLocale((Locale) key); 
     } 
    } 
} 

,然後你會選擇適當的地圖被用於selectItems的,像這樣的東西:

<h:selectOneMenu value="#{language.localeCode}" onchange="submit()" 
    valueChangeListener="#{language.countryLocaleCodeChanged}"> 
    <f:selectItems value="#{language.countriesInMap[language.localeCode]}" /> 
</h:selectOneMenu> 

注:不要忘記爲language.localeCode設置默認值,或下拉列表將不會顯示任何選項

請注意,這可能是不是是一個很好的可用性的想法,因爲錯誤地選擇一種外語的用戶可能很難爲她回到一種已知的語言(這就是爲什麼它是一個良好的做法,使列表中有各自的語言的語言名稱)。

+0

也許我不表達自己的權利。我希望selectOneMenu根據所選語言環境中的名稱來顯示語言的標籤。 例如,如果實際區域設置爲en_EN,則應將德語顯示爲「德語」,如果實際區域設置爲de_DE,則應將德語顯示爲「Deutch」。謝謝 – webmeiker

+0

哦,好吧!嗯...你會需要更多的地圖。讓我想出一個新的解決方案... – elias

+0

我已經更新了我的答案,您需要使用已翻譯的語言名稱進行更改。請注意我對這種方法可能引發的可用性問題的評論。 – elias