日期:2014-05-18  浏览次数:20764 次

求助:jsf 的国际化问题
想实现一个在登陆页面中选择语言(比如中文或英文)然后在接下的页面中根据所选的语言,用对应的语言显示

在登陆页面中
<h:selectOneMenu   id= "selectLanguage "   value= "#{loginBean.language} "
  onchange= "this.form.submit();
"valueChangeListener= "{loginBean.changeLocale} ">
<f:selectItem   itemValue= "zh "   itemLabel= "#{res.zh} "   />
<f:selectItem   itemValue= "tw "   itemLabel= "#{res.tw} "   />
<f:selectItem   itemValue= "en "   itemLabel= "#{res.en} "   />
</h:selectOneMenu>
下拉选择框的事件响应如下:
public   void   changeLocale(ValueChangeEvent   event)   {  
                  String   newLanguage   =   (String)event.getNewValue();
                  if( "zh ".equals(newLanguage)){
                                    setLanguage( "zh_CN ");
                                    System.out.println( "zh ");
}
else   if( "tw ".equals(newLanguage)){
setLanguage( "zh_TW ");
}
else   if( "en ".equals(newLanguage)){
setLanguage( "en_US ");
System.out.println( "en ");
}
}

public   void   setLanguage(String   language)   {
if(language==null){
FacesContext   ctx   =   FacesContext.getCurrentInstance();
language   =   ctx.getViewRoot().getLocale().toString();
}
this.language   =   language;
}
在其他的页面上我用如下的方式:
  <f:view   locale= "#{loginBean.language} ">  
  <f:loadBundle   basename= "messages "   var= "msgs "/>    

在faces_config.xml我加了
<locale-config>
<default-locale> zh_CN </default-locale>
<supported-locale> en_US </supported-locale>
<supported-locale> zh_TW </supported-locale>
</locale-config>

但是除了登陆页面在我选英文后可以根据改变
其他的页面上都不行
都是按选择中文时显示




------解决方案--------------------
除非你的loginBean.language是session级的,否则不要在其它的页面中写
<f:view locale= "#{loginBean.language} ">
<f:loadBundle basename= "messages " var= "msgs "/>
直接写 <f:view> ,只在第一页写locale属性即可,因为如果你的loginBean.language一旦为空,它就会自己在xml找到zh_CN,所以就成中文了。
------解决方案--------------------
上apache下载一个myfaces-example-simple-1.1.5-SNAPSHOT.war的例子,研究研究