Primefaces改变语言环境

时间:2012-10-17 12:26:42

标签: primefaces jsf-2 locale

我的表单包含用户个人资料设置。其中一个设置是网站的默认语言。当用户更改默认语言设置时,我想更改当前会话的区域设置。 处理表格的方法:

@ManagedBean(name="userEditBean")
@RequestScoped
public class UserEditBean {


    @ManagedProperty(value = LanguageBean.INJECTION_NAME)
    private LanguageBean languageMB;

    private AdminUsersEditForm editForm = new AdminUsersEditForm();


    public String changeDefaultLanguage() {
        editForm.getUser().setDefaultLanguage(editForm.getLocaleCode());
        adminUserEditService.update(editForm.getUser());
        languageMB.changeLocale(editForm.getLocaleCode());
        FacesContext context = FacesContext.getCurrentInstance();  
        context.addMessage(null, new FacesMessage(languageMB.translate("user.edit.languageChanged")));
        return "/pages/protected/user/edit.xhtml?faces-redirect=true";
    }

还有changeLocale:

@ManagedBean(name="languageMB")
@SessionScoped
public class LanguageBean implements Serializable {
    public void changeLocale(String newLocaleValue) {
            //loop country map to compare the locale code
            for (Map.Entry<String, Object> entry : countries.entrySet()) {
                if(entry.getValue().toString().equals(newLocaleValue)){
                    FacesContext.getCurrentInstance()
                            .getViewRoot().setLocale((Locale)entry.getValue());
                }
            }
        }

数据库中的语言已更改,但站点仍保留在旧语言环境中。当我从eventListener调用changeLocale来更改站点语言时,它可以工作,那么问题出在哪里。谢谢。

更新 我做了一些调试,问题出在ViewHandlingStrategy#createView()的行上:

if (ctx.getViewRoot() != null) {
    locale = ctx.getViewRoot().getLocale();

ctx.getViewRoot()显然返回null,而locale未设置为grom getViewRoot()。 但我不知道,我的viewRoot“丢失了”

1 个答案:

答案 0 :(得分:2)

我想你的语言环境bean是@SessionScoped bean吗?

如果是这种情况,您还应该:

  • 如果您不使用模板,请在根模板或所有页面中设置区域设置:

    <f:view contentType="text/html" locale="#{yourLocaleBean.locale}">
        <h:head>
            <!-- headers here -->
        </h:head>
        <h:body>
            <!-- content here -->
        </h:body>
    </f:view>
    

我希望它有所帮助。