2011-09-09 18 views
5

jsfで国際化がどのように機能するのだろうか?私はcoreservlets.comについてチュートリアルを読んでいますが、私の場合はわずかに異なります。そのチュートリアルでiは、またBeanが<f:view>タグで使用するプロパティgetCurrentLocale()を有していなければならないバックアップ(ロケール変更するためのリスナー)のactionListenerにJSF 2.0の国際化

FacesContext.getCurrentInstance().getViewRoot().setLocale(newLocale); 

を使用しなければならないと述べました。

メッセージを持つ2つのプロパティファイル(デフォルトと指定されたロケール)は、faces-config.xmlに登録されています。 <f:view>タグは、私はまた、私はロケールごとに(のactionListener付き)2つのボタンを持っている1ページ(いるindex.xhtml)

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

でしかありません。バッキングBeanでは、現在のロケール変数を変更するだけです(getViewRoot().setLocale(newLocale)を使用しないでください)。しかし、ロケールすべてのページの変更(彼らは<f:view locale="#{bean.locale}">を持っていない場合でも)

答えて

22

は、設定の3つの方法があります
アプリケーションのロケールの設定次の2つのメッセージファイルに

messages.properties 
    messages_de.properties 

を以下しているとしましょうアプリケーションのロケールと私はあなたは最初のがここに必要と思う。

1 - ブラウザにロケールを選択させることができます。ブラウザがアプリケーションに接続するとき、それは通常のHTTPヘッダに

2 - あなたが設定することができますしたAccept-Language値を含んWEB-INF/faces-config.xml:

<faces-config> 
    <application> 
     <locale-config> 
     <default-locale>en</default-locale> 
     <supported-locale>de</supported-locale> 
     </locale-config> 
    </application> 
</faces-config> 

にデフォルトとサポートされるロケールを設定し

プログラム的にロケール。

はUIViewRootオブジェクトのあるsetLocaleメソッドを呼び出します。

UIViewRoot viewRoot = FacesContext.getCurrentInstance().getViewRoot(); 
viewRoot.setLocale(new Locale("de")); 

3 - あなたはlocale属性 - 例えばでf:view要素を使用することにより、個々のページ
のロケールを設定することができます。

<f:view locale="de"> 

ロケールを動的に設定することができます。

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


宣言メッセージが
今ロケールを使用すると、メッセージを宣言するために、次の2つの方法のいずれかを使用することができます設定されていることをバンドル

1-VIAが、直面しているコンフィグバンドル最も簡単な方法はにある faces-configという名前のファイルを提供してください。以下の内容で、アプリケーションのWEB-INFディレクトリ内のxml:

<?xml version="1.0"?> 
<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> 
     <resource-bundle> 
     <base-name>com.corejsf.messages</base-name> 
     <var>msgs</var> 
     </resource-bundle> 
    </application> 
</faces-config> 

2 - でアクセスを必要とする各JSFページ。代わりに、グローバルリソースバンドルの宣言を使用しての 、あなたはFを追加することができます:loadBundle要素をこのように、バンドルへのアクセスを必要とする各JSFページへ:いずれの場合も

<f:loadBundle basename="com.corejsf.messages" var="msgs"/> 

、バンドル内のメッセージがありますmsgsという名前のマップ変数からアクセスできます。

は今デフォルトのプロパティ、すなわち英語財産

next=Next 

が持っているファイルを言うことができますボタンの上に適切なラベルを表示し、ドイツはequivallentすなわち

next=Weiter 

持って、あなたはロケールを設定し、MESGを宣言しましたあなたは

のようにコマンドボタンのラベルを置くためにそれにアクセスすることができますバンドル10

上記の回答は、Hortsmen Core Java Server Faces bookから抽出され、変更されています。 3.そして2ポイントで:

+0

私が何かを追加したいと思います。 JSFページごとに行うのではなく、template.xhtmlで実行できます。 – karlihnos