JSF setLocale не работает должным образом - PullRequest
5 голосов
/ 20 января 2011

Я реализовал интернационализацию в своем приложении JSF, как описано здесь .

Но я столкнулся с проблемой: при смене языка все тексты на моей странице меняются. Но затем, если я нажму на навигационную ссылку, чтобы перейти на другую страницу, локаль вернется к стандартной локали!

Я думаю, что что-то здесь упускаю. Поэтому я предоставляю свой код ниже и надеюсь, что вы можете помочь:

LocaleBean.java:

    @ManagedBean(name="locale")
    @SessionScoped
    public class LocaleBean {

    private Locale locale = FacesContext.getCurrentInstance().getViewRoot().getLocale();

    public Locale getLocale() {
        return locale;
    }

    public void setLanguage(String language) {
        locale = new Locale(language);
        FacesContext.getCurrentInstance().getViewRoot().setLocale(locale);
    }

    public String getLanguage() {
        return locale.getLanguage();
    }
    }

Часть JSF (это часть моего шаблона):

    <h:outputText value=" #{text['common.language']}: " /> 
        <h:selectOneMenu value="#{locale.language}" onchange="submit()">
            <f:selectItem itemValue="de" itemLabel="Deutsch" />
            <f:selectItem itemValue="en" itemLabel="English" />
        </h:selectOneMenu>

лица-config.xml:

<?xml version="1.0" encoding="UTF-8"?>
<faces-config
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
    version="2.0">
     <application>
           <locale-config>
                <default-locale>de</default-locale>
                <supported-locale>en</supported-locale>
           </locale-config>
       <resource-bundle>
        <base-name>org.dhbw.stg.wwi2008c.mopro.ui.text</base-name>
        <var>text</var>
       </resource-bundle>
     </application>
</faces-config>

Затем я Text.java из учебника и только изменил путь к комплекту.

Вот мой каталог:

Если чего-то важного не хватает, спросите, пожалуйста.

1 Ответ

9 голосов
/ 20 января 2011

FacesContext - экземпляр в области запроса.поэтому ваше значение будет установлено только для этого конкретного запроса.

добавьте xhtml

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

ИЛИ:

Зарегистрируйте обработчик представления
в лицах-config.xml

 <application>
           ...
       <view-handler>com.yourcompany.MyLocaleViewHandler</view-handler> 

и

public class MyLocaleViewHandler extends ViewHandler {

    private final ViewHandler base;


    @Override
    public Locale calculateLocale(FacesContext context) {
      //fetch the session scoped bean and return the
      LocaleBean bean = (LocaleBean ) context.getExternalContext().getRequest().getSession().getAttribute("locale");//this line is not tested.
      return locale;
    }
      //other stuff..


    }
...