Пример интернационализации JSF2

Принимая в качестве отправной точки пример интернационализации JSF2 этой ссылки:

http://www.mkyong.com/jsf2/jsf-2-internationalization- пример/

Я хочу, чтобы этот пример отображал язык комбо в выбранном языке.

Может ли кто-нибудь указать мне, как это можно сделать?

Благодаря!

0
nl ja de

2 ответы

Это просто вопрос установки правильных меток в статической переменной countries :

static {
    countries = new LinkedHashMap();
    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
}

You can get a bigger list of language names in their original language here: http://www.omniglot.com/language/names.htm

UPDATE: According to OP's comment, he needs the language names translated to every language. For that, one could come up with a solution simply making a map of language maps (that's quite a few maps), like this:

// set a default value for localeCode
private String localeCode = Locale.ENGLISH.toString();
// ...
static {
    countries = new LinkedHashMap>();
    englishCountries = new LinkedHashMap();
    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();
    germanCountries.put("Englisch", Locale.ENGLISH);
    germanCountries.put("Deutsch", Locale.GERMAN);
    germanCountries.put("Französisch", Locale.FRENCH);
    countries.put(Locale.GERMAN, germanCountries);
    frenchCountries = new LinkedHashMap();
    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> 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, с чем-то вроде этого:


     

Примечание. Не забудьте установить значение по умолчанию для language.localeCode , или в раскрывающемся списке не будет отображаться никаких параметров

Обратите внимание, однако, что это, вероятно, НЕ хорошая идея для удобства использования, поскольку пользователю, который по ошибке выбирает иностранный язык, может быть трудно вернуться к известному языку для нее (вот почему это хорошая практика, чтобы списки имели имена языков на каждом собственном языке).

0
добавлено
о, хорошо! хм ... вам понадобится еще несколько карт для этого. позвольте мне придумать новое решение для этого ...
добавлено автор elias, источник
Я обновил свой ответ с изменением, которое вам нужно будет сделать, чтобы использовать имена переведенных языков. Пожалуйста, обратите внимание также на мои комментарии по вопросам удобства использования, которые этот подход может поднять.
добавлено автор elias, источник
Пожалуйста!
добавлено автор elias, источник
Может быть, я не выражаю себя правильно. Я хочу, чтобы selectOneMenu отображал метку языка в соответствии с тем, как он указан в выбранной локали. Например, если фактическая локаль - en_EN, немецкий язык должен отображаться как «немецкий», а если фактическая локаль - de_DE, немецкий язык должен отображаться как «Deutch». благодаря
добавлено автор JLLMNCHR, источник
Ваша заметка о удобстве открыла мне глаза. Я собираюсь забыть свой изначально желаемый подход и оставить вещи такими, какие они есть. Благодаря!
добавлено автор JLLMNCHR, источник

Это просто вопрос установки правильных меток в статической переменной countries :

static {
    countries = new LinkedHashMap();
    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
}

You can get a bigger list of language names in their original language here: http://www.omniglot.com/language/names.htm

UPDATE: According to OP's comment, he needs the language names translated to every language. For that, one could come up with a solution simply making a map of language maps (that's quite a few maps), like this:

// set a default value for localeCode
private String localeCode = Locale.ENGLISH.toString();
// ...
static {
    countries = new LinkedHashMap>();
    englishCountries = new LinkedHashMap();
    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();
    germanCountries.put("Englisch", Locale.ENGLISH);
    germanCountries.put("Deutsch", Locale.GERMAN);
    germanCountries.put("Französisch", Locale.FRENCH);
    countries.put(Locale.GERMAN, germanCountries);
    frenchCountries = new LinkedHashMap();
    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> 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, с чем-то вроде этого:


     

Примечание. Не забудьте установить значение по умолчанию для language.localeCode , или в раскрывающемся списке не будет отображаться никаких параметров

Обратите внимание, однако, что это, вероятно, НЕ хорошая идея для удобства использования, поскольку пользователю, который по ошибке выбирает иностранный язык, может быть трудно вернуться к известному языку для нее (вот почему это хорошая практика, чтобы списки имели имена языков на каждом собственном языке).

0
добавлено
о, хорошо! хм ... вам понадобится еще несколько карт для этого. позвольте мне придумать новое решение для этого ...
добавлено автор elias, источник
Я обновил свой ответ с изменением, которое вам нужно будет сделать, чтобы использовать имена переведенных языков. Пожалуйста, обратите внимание также на мои комментарии по вопросам удобства использования, которые этот подход может поднять.
добавлено автор elias, источник
Пожалуйста!
добавлено автор elias, источник
Может быть, я не выражаю себя правильно. Я хочу, чтобы selectOneMenu отображал метку языка в соответствии с тем, как он указан в выбранной локали. Например, если фактическая локаль - en_EN, немецкий язык должен отображаться как «немецкий», а если фактическая локаль - de_DE, немецкий язык должен отображаться как «Deutch». благодаря
добавлено автор JLLMNCHR, источник
Ваша заметка о удобстве открыла мне глаза. Я собираюсь забыть свой изначально желаемый подход и оставить вещи такими, какие они есть. Благодаря!
добавлено автор JLLMNCHR, источник