Интернационализация JSF 2.0

У меня есть приложение, в котором я пытаюсь установить доступность интернационализации.

Это мои лица-config.xml:

<application>
    <locale-config>
        <default-locale>lt</default-locale>
        <supported-locale>en</supported-locale>
        <supported-locale>de</supported-locale>
    </locale-config>
    <resource-bundle>
        <base-name>application</base-name>
        <var>msg</var>
    </resource-bundle>
</application>

У меня есть три файла свойств:

application_lt.properties
application_en.properties
application_de.properties

Класс бобов:

@ManagedBean(name = Beans.LOCALE_BEAN)
@SessionScoped
public class LocaleBean extends BaseBean implements Serializable {

    private String lang;

    public String getLang() {
        return lang;
    }

    public void setLang(String lang) {
        this.lang = lang;
    }
}

Класс действий:

@ManagedBean(name = "localeAction")
@SessionScoped
public class LocaleAction extends BaseAction implements Serializable {

    public void changeLocale() {
        LocaleBean localeBean = getBean(Beans.LOCALE_BEAN);
        String language = localeBean.getLang();
        FacesContext.getCurrentInstance().getViewRoot().setLocale(new Locale(language));
    }

}

Чтобы изменить локаль, я использую commandLink:

<h:commandLink action="#{localeAction.changeLocale}">
    <f:setPropertyActionListener target="#{localeBean.lang}" value="en"/>
    English
</h:commandLink>

<h:commandLink action="#{localeAction.changeLocale}">
    <f:setPropertyActionListener target="#{localeBean.lang}" value="lt"/>
    Lithuanian
</h:commandLink>

Первая проблема:

Я определил, что моя локаль по умолчанию — «lt»: lt. Почему при запуске текстовые значения моего приложения загружаются из application_en.properties, а не из application_lt.properties?

Вторая проблема:

Когда я выполняю действие commandLink, языковой стандарт меняется в зависимости от выбранного языкового стандарта. Но выполнение действия было одним щелчком, второй щелчок по любой другой ссылке приложения также в порядке, и когда я нажимаю на любую ссылку приложения в третий раз, текстовые значения помещаются из application_en.properties. Кажется, что локаль как-то меняется...

Любые идеи?


person Paulius Matulionis    schedule 03.05.2012    source источник
comment
<f:setPropertyActionListener... не требуется в JSF 2.0, так как вы можете вызывать методы с аргументами.   -  person Thorbjørn Ravn Andersen    schedule 04.05.2012


Ответы (2)


Я определил, что моя локаль по умолчанию — «lt»: lt. Почему при запуске моего приложения текстовые значения загружаются из application_en.properties, а не из application_lt.properties?

Очевидно, потому что ваш браузер идентифицирует себя с локалью en в качестве предпочтительной локали в заголовке запроса Accept-Language. Затем JSF автоматически использует его, поскольку он входит в число поддерживаемых языков. Вам нужно будет изменить предпочтительный язык в настройках браузера.


Когда я выполняю действие commandLink, языковой стандарт меняется в зависимости от выбранного языкового стандарта. Но выполнение действия было одним щелчком, второй щелчок по любой другой ссылке приложения также в порядке, и когда я нажимаю на любую ссылку приложения в третий раз, текстовые значения помещаются из application_en.properties. Похоже, что локаль как-то меняется.

Видимо, вы изменили мнение. Ваш метод действия изменяет только языковой стандарт текущего представления. Вы должны убедиться, что вы установили языковой стандарт из LocaleBean в <f:view> основного шаблона или, по крайней мере, во всех представлениях.

<f:view locale="#{localeBean.lang}">

Смотрите также:

person BalusC    schedule 03.05.2012
comment
Да, ты прав. Я установил ‹f:view locale=#{localeBean.lang}/› в качестве основного шаблона, и это сработало. А для первой проблемы я присвоил своей переменной lang значение lt и теперь при запуске приложения все работает как мне нужно. Спасибо! - person Paulius Matulionis; 04.05.2012

Первая проблема Когда дело доходит до локали, JSF считывает HTTP-заголовок Accept-Language клиентского браузера и использует наиболее предпочтительную локаль. Если он не поддерживается приложением (настройки Faces-config), то он использует второй наиболее предпочтительный языковой стандарт из заголовка HTTP и т. д. Если ни один из предпочитаемых клиентом языковых стандартов не поддерживается приложением, то используется языковой стандарт по умолчанию из Faces-config.xml. используется. В результате может случиться так, что локаль по умолчанию из Faces-config.xml будет просто проигнорирована.

Таким образом, кажется, что ваш клиентский браузер может отправлять английскую локаль в заголовке HTTP Accept-Language.

Вторая проблема. Это происходит из-за того, что по умолчанию локаль устанавливается для каждого запроса, а не для сеанса пользователя. Взгляните на этот вопрос, чтобы узнать, как преодолеть это.

person Piotr Kochański    schedule 03.05.2012