2013-11-24 8 views
8

を使用している私は英語に私のJSF Webプロジェクトのデフォルトの場所を設定したかったので、 私は次のようでした:<デフォルト・ロケール><サポート・ロケール>の代わりに、動作するようには思えない

messages_de_DE.properties 
messages_en_EN.properties 

と:私は私のsrcフォルダde.hof.tschuwwa.resourcesでパッケージを持っているし、そのパッケージの 内側に私は2つのプロパティファイルを持っている

<application> 
    <locale-config> 
     <default-locale>en_EN</default-locale> 
     <supported-locale>de_DE</supported-locale> 
    </locale-config> 
    <resource-bundle> 
     <base-name>de.hof.tschuwwa.resources.messages</base-name> 
     <var>msg</var> 
    </resource-bundle> 
</application> 

-config.xmlが直面しています私は小さなXHTMLファイルでそれをテストした:

<h:body> 
    <ui:composition template="/templates/master.xhtml"> 
     <ui:define name="header"> 
      <h:form> 
       <h:commandButton action="#{navigationService.toLogin}" value="#{msg['login']}" /> 
       <h:commandButton action="#{navigationService.toRegister}" value="#{msg['register']}" /> 
      </h:form> 
     </ui:define>    
    </ui:composition> 
</h:body> 

私は自分のアプリケーションを起動すると、それはドイツの値ではなく 英語の値を示しています。私はデフォルトの言語を英語にしたかった。

どのようにデフォルト言語を設定できますか? faces-config.xml default-locale が動作していないようです。

また、私は自分のローカリゼーションをどのように変更できるか知る必要があります。私はこの小さな サービス書いた:

@Named 
@SessionScoped 
public class LanguageService implements Serializable { 
    private static final long serialVersionUID = 1L; 

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

をして、フォーム内の次のボタンを試してみた:

<p:commandButton id="english" value="English" action="#{languageService.changeLanguage('en')}" immediate="true" /> 
<p:commandButton id="german" value="Deutsch" action="#{languageService.changeLanguage('de')}" immediate="true" /> 

が、私はそれらを使用したときに何も起こりませんでした。

+0

ブラウザはデフォルトのロケールをDEに設定していますか? –

+0

私のブラウザが英語のデフォルトのローカルに変更されても、私のウェブアプリケーションはすべてのドイツ語のメッセージを読み込みます – Mulgard

+0

本当にen_ENのロケールはありますか? en_USまたはen_GBを使用すると、すべてが正常に動作することを90%確信しています。もちろん、プロパティファイルの名前を変更します。 – Osw

答えて

21
<default-locale>en_EN</default-locale> 

まず第一に、あなたはロケール識別子en_ENであり間違いをしました。最初の2つの小文字は、ISO 693-1言語コードを表します。これはオプションであり、国コードが存在する場合にのみ必要です。最後の大文字の2文字はISO 3166-1 Alpha-2の国コードを表します。これはオプションで、American Englishen_US)とBritish Englishen_GB)のような国固有の言語方言を区別するためにのみ使用されます。 "England"のような国はないので、en_ENは間違いがあります。おそらくenまたはおそらくen_USをここで使用したいと思うでしょう。

したがって、そう

<default-locale>en</default-locale> 

適切messages_en.propertiesファイル有します。


は、どのように私は私のデフォルトの言語を設定することができますか? faces-config.xml default-localeは機能していないようです。

<default-locale>のみクライアントがAccept-Language HTTPリクエストヘッダの風味に単独でロケールを供給しなかった場合に使用される、または<supported-locale>に定義したようなものアプリケーションによってサポートされていないものを供給されます。多くの(うらやましい)クライアントが実際にAccept-Languageヘッダーを設定しました。 HTTPトラフィックモニタを使用すると、それらを見ることができます。

enter image description here

(画面は言う:en-USenが0.8の「重み」を有する第二の嗜好(1)のデフォルトの「重み」を有する第一優先である、nl第三あります優先度は0.6です; Chromeではchrome://settings/languagesで言語を追加/削除/並べ替えで変更できます)

これを防止し、不明確な理由で「デフォルト」ロケールを強制したい場合は、<f:view locale>を明示的に「デフォルト」ロケールに設定する必要があります(実際にはオーバーライドしていますそのプログラムに設定されているクライアントの優先ロケール—ウェブブラウザ)。

例:

@Named 
@SessionScoped 
public class LanguageService implements Serializable { 

    private Locale locale; 

    @PostConstruct 
    public void init() { 
     locale = FacesContext.getCurrentInstance().getApplication().getDefaultLocale(); 
    } 

    // ... 
} 

:あなたのバッキングBeanでのこの新しいプロパティを

<h:head><h:body>を包むだけでマスターテンプレートに入れ、)

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

また、私は自分のローカリゼーションをどのように変更できるのか知る必要があります。

この特定の例ではあなたの間違いは、あなたがアクションを起動した後、ビューを更新していないということです。コマンドボタンにupdate="@all"を追加する必要があります。しかし、別の間違いがあります:あなたは後続のリクエストのためにロケールを覚えていません。再び "デフォルト"のロケールに戻ります。このプロパティで<f:view locale>を設定する必要があります。これは既に前に詳細に答えられています:Localization in JSF, how to remember selected locale per session instead of per request/view

+0

ユーザーがフォームに情報を入力し、ボタン "english"または "german"で言語を変更した場合、ユーザーが既に入力した情報を保持する方法はありますか? – user1643352

関連する問題