繁体   English   中英

在整个会话中更改JSF中的本地化

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM