[英]Change Localization In JSF Throughout The Session
我有一个Web应用程序,该Web应用程序将JSF与PrimeFaces结合使用,还有一个JSF,它允许用户动态更改语言环境。 但是,在用户转到另一个JSF之后,语言环境又变回默认值。 我在这里和这里查看了代码,但仍然无法正常工作。
在我的资源目录中,我有3个属性文件。
Project
- src/main/resources
- <default package>
- messages_en_US.properties
- messages_zh_CN.properties
- messages_zh_TW.properties
在我的faces-config.xml
我定义了语言环境
<application>
<locale-config>
<default-locale>en_US</default-locale>
<supported-locale>zh_TW</supported-locale> <!-- generic traditional chinese -->
<supported-locale>zh_CN</supported-locale> <!-- generic simplified chinese -->
</locale-config>
<message-bundle>
messages
</message-bundle>
<resource-bundle>
<base-name>messages</base-name>
<var>msg</var>
</resource-bundle>
</application>
在允许用户更改语言环境的JSF中,它实际上是用户个人资料页面。 从Ennum中读取<p:selectOneMenu />
项目,并单击“保存”按钮更改语言环境。
<p:selectOneMenu id="defaultLanguage" value="#{userController.userLanguage}">
<f:selectItems value="#{userController.langcode}" var="lang" itemValue="#{lang.locale}"
itemLabel="#{lang.locale} - #{lang.desc}" />
</p:selectOneMenu>
...
<p:commandButton id="save" value="#{msg.save}" title="#{msg.save}" icon="ui-icon-disk"
styleClass="action-buttons" actionListener="#{userController.doSave}" update="@form" />
在UserController
ManagedBean中,代码如下:
@ManagedBean
@ViewScoped
public class UserController extends BaseController implements Serializable {
public void doSave(ActionEvent e) {
String lang;
String country = null;
String[] selectedLanguage = userLanguage.split("_");
lang = selectedLanguage[0];
if (selectedLanguage.length > 1) {
country = selectedLanguage[1];
setUserLocale(new Locale(lang, country));
}
else {
setUserLocale(new Locale(lang));
}
LOG.debug("userLanguage: {}; lang: {}", userLanguage, lang);
FacesContext.getCurrentInstance().getViewRoot().setLocale(userLocale); // sets the locale from the selected user language
Messages.addGlobalInfo(getMessage(msgInfoUpdated));
}
private LangCode userLangCode; // getter + setter
private LangCode[] langcode = LangCode.values(); // getter + setter
@ManagedProperty(value = "#{loginController.userLocale}")
private Locale userLocale; // getter + setter
}
在JSF中,我尝试添加<f:view locale="#{loginController.locale}" />
。 但是还是一样。 在调试方式下,转到新的JSF页面时, userLocale
的值始终是缺省语言环境,而不是用户更改的语言环境。
LoginController
代码如下。 在doLogin()
方法中,我使用Faces上下文中的语言环境设置了userLocale
对象。
@ManagedBean
@SessionScoped
public class LoginController extends BaseController implements Serializable {
public String doLogin() {
String returnValue;
try {
currentUser = aduserFacade.validateUserLogin(username, password);
LOG.debug("Successful login: {}", currentUser.getUsrId());
// Set currentUser object into request session attribute
FacesContext context = FacesContext.getCurrentInstance();
HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getRequest();
setUserSession();
userLocale = Faces.getLocale();
request.getSession().setAttribute("userSession", userSession);
returnValue = "main";
}
catch (Exception e) {
Messages.addGlobalError(getMessage(e.getMessage()));
LOG.error(e.toString(), e);
returnValue = null;
}
return returnValue;
}
private Locale userLocale; // getter + setter
}
您的语言环境无法保留的原因是,您注入的语言环境属性在注入时尚未用新值更新。 参见,当您注入托管bean属性时,与托管bean本身一样
@ManagedProperty(value = "#{loginController.userLocale}")
代替
@ManagedProperty(value = "#{loginController}")
您将获得静态值注入。 即使注入的Bean中的值已更新,您仍将仅获得在初始化注入的Bean时立即设置的陈旧值。 因此,您需要做的是注入整个LoginController
,然后自己提取值,以便获得最新的值。
也可以看看
与您的问题无关,您实际上不应该将成员变量和注入放在类的底部。 使您的代码不方便阅读
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.