刷新页面加载新的语言环境

问题描述:

我试图做一个JSF重新加载区域(在视图中定义)刷新页面加载新的语言环境

<f:view locale="#{admin.userLocale}"> 
    <h:commandButton image="images/ukflag.gif" action="#{admin.returnToEnglish}" immediate="true" onclick="window.location.reload()" /> 
    <h:commandButton value="1" action="#{admin.returnToEnglish}" immediate="true" onclick="window.location.reload()" /> 
    <h:commandButton value="2" action="#{admin.returnToEnglish}" immediate="true" onclick="history.go(0)" /> 
    <h:commandButton value="3" action="#{admin.returnToEnglish}" immediate="true" onclick="window.location.href=window.location.href" /> 
    <h:commandLink value="4"> 
     <a4j:support event="onclick" reRender="GeneralConfigForm" action="#{admin.returnToEnglish}" /> 
    </h:commandLink> 
</f:view> 

我尝试了所有的上述按钮。 他们都做同样的事情 - 他们调用方法更改语言环境,页面重新加载,但新的语言环境标签未正确加载。 此时,如果我再次重新载入更改,并且语言环境显示正确。

如何让按钮更早地更新本地,以便页面在显示时显示新的区域设置?

谢谢!

P.S - 在JSF 1.2

我不知道如何得到它刷新后工作。 #{admin.userLocale}是否存储在请求范围而不是会话范围中?前四个按钮根本不会调用任何JSF操作。 onclick中的JS函数首先被执行,它会更改当前页面,因此默认操作会被完全中止。第五个似乎是唯一的应该工作,虽然<h:form>缺少所有这些按钮,但我敢打赌,这只是代码示例的简单化。

无论如何,通常的做法是将用户指定的语言环境存储在会话范围中。当您想通过JSF操作方法更改它时,则需要事后发送重定向,以便使用所需的区域设置创建新视图。否则,最初的语言环境的确会在响应中使用,因此你必须

FacesContext.getCurrentInstance().getViewRoot().setLocale(newLocale); 

的操作方法来改变自己的观点。