2011-01-20 18 views
5

私は、hereのようにJSFアプリケーションに国際化を実装しました。JSF setLocaleが適切に動作しない

しかし、問題が発生しました:ロケールを変更すると、ページのすべてのテキストが変更されます。しかし、別のページに移動するためにナビゲーションリンクをクリックすると、ロケールは標準ロケールに戻ります!

私はここで何かが間違っていると思います。だから私は以下の私のコードを提供し、あなたが役立つことを願って:

LocaleBean.java:

@ManagedBean(name="locale") 
    @SessionScoped 
    public class LocaleBean { 

    private Locale locale = FacesContext.getCurrentInstance().getViewRoot().getLocale(); 

    public Locale getLocale() { 
     return locale; 
    } 

    public void setLanguage(String language) { 
     locale = new Locale(language); 
     FacesContext.getCurrentInstance().getViewRoot().setLocale(locale); 
    } 

    public String getLanguage() { 
     return locale.getLanguage(); 
    } 
    } 

JSFパート(私のテンプレートのそれの一部):

<h:outputText value=" #{text['common.language']}: " /> 
     <h:selectOneMenu value="#{locale.language}" onchange="submit()"> 
      <f:selectItem itemValue="de" itemLabel="Deutsch" /> 
      <f:selectItem itemValue="en" itemLabel="English" /> 
     </h:selectOneMenu> 

顔-config.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<faces-config 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd" 
    version="2.0"> 
    <application> 
      <locale-config> 
       <default-locale>de</default-locale> 
       <supported-locale>en</supported-locale> 
      </locale-config> 
     <resource-bundle> 
     <base-name>org.dhbw.stg.wwi2008c.mopro.ui.text</base-name> 
     <var>text</var> 
     </resource-bundle> 
    </application> 
</faces-config> 

私はチュートリアルのText.javaを変更し、bundle-pathのみを変更しました。

ここに私のディレクトリ:

重要な何かがそれをしてくださいお願いし欠落している場合。

答えて

9

FacesContextは要求スコープのインスタンスです。その特定のリクエストに対してのみ値が設定されます。

<f:view locale="#{locale.locale}"> 

やXHTMLに追加します。

は、ビューハンドラを登録顔-config.xmlの

<application> 
      ... 
     <view-handler>com.yourcompany.MyLocaleViewHandler</view-handler> 

public class MyLocaleViewHandler extends ViewHandler { 

    private final ViewHandler base; 


    @Override 
    public Locale calculateLocale(FacesContext context) { 
     //fetch the session scoped bean and return the 
     LocaleBean bean = (LocaleBean) context.getExternalContext().getRequest().getSession().getAttribute("locale");//this line is not tested. 
     return locale; 
    } 
     //other stuff.. 


    } 
関連する問題