2013-04-02 28 views
1

我有一个Web应用程序,它使用带有PrimeFaces的JSF,并且有一个JSF允许用户动态更改区域设置。但是当用户转到另一个JSF后,语言环境将变回默认值。我看着代码herehere,但仍然无法让它工作。在整个会话期间在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 

} 

在我试图添加<f:view locale="#{loginController.locale}" />的JSF。但仍然如此。在调试模式下,当转到新的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 

} 
+0

使'UserController'会话的作用域记住语言选择并设置视图语言环境以相应地更改视图。 – skuntsel

+0

但它不应该在UserController中工作我使用ManagedProperty注释将值设置为来自LoginController(@SessionScoped)的属性? –

回答

2

您的语言环境没有持的理由是,你注射的区域设置属性尚未与新价值在你注入它的更新版本。看,当你注入管Bean属性,作为对管理bean本身作为

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

代替

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

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


无关看到你的问题,你真的不应该把成员变量和注射类的底部。使代码不方便阅读

+0

谢谢!我希望这被记录在某处,并且博客关于@ManagedProperty的人声明注入属性和managedbean之间的区别。这也是我之前问过的其他问题的答案http://stackoverflow.com/questions/15755588/change-localization-in-jsf?noredirect=1#comment22391867_15755588 –

+0

不客气@AlvinSim – kolossus

相关问题