0

此代码已完全简化,但重现了我的问题:

BackingBean.java

public String reload(){
    System.out.println(FacesContext.getCurrentInstance()
            .getViewRoot().getLocale());
    return "test";
}

public void setLocale(){
    System.out.println("locale changed!");
    FacesContext.getCurrentInstance()
            .getViewRoot().setLocale(Locale.FRANCE);
}

测试.xhtml

<h:form>
    <h:commandLink action="#{backingBean.reload}" value="reload page"/>
</h:form>
<h:form>
   <h:commandLink action="#{backingBean.setLocale}" value="change locale"/>
</h:form>

输出:

en
locale changed!
fr_FR
en

如果您将更改语言环境,然后调用reload两次方法,则语言环境将重置为 default enlocale重置的原因是什么?此外,仅在转发到其他页面的情况下才会发生,如果您将reload方法更改为void,则区域设置将保持不变fr

public void reload(){
    System.out.println(FacesContext.getCurrentInstance()
            .getViewRoot().getLocale());
}

输出:

en
locale changed!
fr_FR
fr_FR

但经过 2 次转发后,语言环境将改回en

4

1 回答 1

5

在会话范围内不会记住视图区域设置。它在视图范围内被记住(见鬼,视图本身代表了整个视图范围!)。

如果您需要记住会话范围内的语言环境,那么您需要创建一个会话范围的托管 bean 并将其作为<f:view locale>主模板中的属性进行引用。

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

也可以看看:

于 2013-01-22T17:29:42.450 回答