2012-03-15 4 views
2

私はユーザーが利用可能な言語を選択できるコンボボックスを持っています。アプリケーションには、各言語のプロパティファイルが含まれています。 ページの「リソース」セクションで、リソース・バンドルは、ユーザー構成文書の言語タグ(DE、EN ...)に従って計算されます。"On-The-Fly"リソースバンドルを設定する方法は?

コンボボックスの値に応じてonChangeイベントの言語を変更する簡単な方法はありますか?私はcontext.setProperty(???)と思った。 提案がありますか?

答えて

5

このアプリケーションを幅広く実装するには、フェーズリスナーを使用できます。この例では、使用するロケールは "Language"という名前のsessionScope変数に格納されます。

すべての許可されたロケールを含むXPageにコンボボックスを追加するだけです。

<xp:comboBox id="comboBox1" value="#{sessionScope.Language}"> 
    <xp:selectItem itemLabel="Chinese" itemValue="zh"></xp:selectItem> 
    <xp:selectItem itemLabel="German" itemValue="de"></xp:selectItem> 
    <xp:selectItem itemLabel="Turkish" itemValue="tr"></xp:selectItem> 
    <xp:eventHandler event="onchange" submit="true" refreshMode="complete" /> 
</xp:comboBox> 

次に、あなたはこのように位相リスナーを使用する必要があります。

package ch.hasselba.xpages.jsf.core; 

import javax.faces.context.FacesContext; 
import javax.faces.application.Application; 
import javax.faces.event.PhaseEvent; 
import javax.faces.event.PhaseId; 
import javax.faces.event.PhaseListener; 
import javax.faces.component.UIViewRoot; 
import java.util.Locale; 
import java.util.Map; 

public class LocalizationSetter implements PhaseListener { 

    private static final long serialVersionUID = -1L; 
    private static final String scopeVarName = "Language"; 
    private static final String scopeName = "sessionScope"; 

    public void afterPhase(PhaseEvent event) {} 

    public void beforePhase(PhaseEvent event) { 
     FacesContext facesContext = event.getFacesContext(); 
     UIViewRoot view = facesContext.getViewRoot(); 
     view.setLocale(getLanguage(facesContext)) ; 
    } 

    public PhaseId getPhaseId() { 
     return PhaseId.RENDER_RESPONSE; 
    } 

    private Locale getLanguage(FacesContext facesContext){ 
     try{ 
      Application app = facesContext.getApplication(); 
      Object obj = app.getVariableResolver().resolveVariable(facesContext, scopeName); 
      Object lang = ((Map) obj).get(scopeVarName); 
      if(lang != null){ 
       return new Locale((String) lang); 
      } 
     }catch(Exception e){} 

     return Locale.getDefault(); 
    } 
} 

あなたは「getLanguag()」メソッドでユーザープロファイルにアクセスするために検索/などを追加することができます。

希望これは スヴェン素晴らしい

+0

に役立ちます。どうもありがとうございました。 –

1

私は過去にこれといくつか苦労し、それを正しく解決していません。 言語を設定することができます

context.setLocaleString( "en"); context.reloadPage();

しかし、言語をユーザーのドキュメントに応じて変更したい場合は、あなたが持っている各beforePageLoadイベントにコードを追加する必要があると思います。ブラウザは常にhtml lang = ".."の設定を使用するので、リソースバンドルはこの設定でも言語を使用します。

手動リロードや再ロードを行わずに動作させるにはいくつか問題があります。 phaselistenerを使用してlang属性を変更することもできます

関連する問題