我有一个 Web 应用程序,它使用带有 PrimeFaces 的 JSF,并且有一个 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()
方法中,我userLocale
使用 Faces Context 中的语言环境设置对象。
@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
}