我的表单包含用户个人资料设置。其中一个设置是网站的默认语言。当用户更改默认语言设置时,我想更改当前会话的区域设置。 处理表格的方法:
@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“丢失了”
答案 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>
我希望它有所帮助。