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

时间:2013-04-02 04:24:53

标签: jsf localization

我有一个Web应用程序,它使用带有PrimeFaces的JSF,并且有一个允许用户动态更改语言环境的JSF。但是在用户转到另一个JSF之后,语言环境会更改回默认值。 我查看了代码herehere,但仍无法使其发挥作用。

在我的资源目录中,我有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 Context中的语言环境设置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

}

1 个答案:

答案 0 :(得分:2)

您的语言环境未能保留的原因是您注入的语言环境属性尚未使用新值进行更新,因为您注入它时。注入托管bean属性时,请参阅

中的托管bean本身
@ManagedProperty(value = "#{loginController.userLocale}")

而不是

 @ManagedProperty(value = "#{loginController}") 

您将获得静态值注入。即使在注入bean的值已经更新之后,您仍然只能获得在注入的bean初始化时设置的陈旧值。所以你需要做的是注入整个LoginController,然后自己拉取值,这样你就可以得到最新的值。

另见


与您的问题无关,您真的不应该将成员变量和注入放在类的底部。使您的代码不方便阅读