1

我有一个 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" />

UserControllerManagedBean中,代码如下:

@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

}
4

1 回答 1

2

您的语言环境未能保留的原因是您注入的语言环境属性尚未更新为您注入时的新值。看,当您注入托管 bean 属性时,与托管 bean 本身一样

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

代替

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

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

也可以看看


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

于 2013-04-02T06:48:47.163 回答