2012-03-15 16 views
2

に、私は次のタグが含まれていないメッセージ・バンドル:JSF 2.0 - hの切り替えロケール:のcommandLink - 私のXHTMLページで同期

:私は言語Beanを実装した

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

@ManagedBean(name = "languageBean") 
@SessionScoped 
public class LanguageBean implements Serializable { 

    private static final long serialVersionUID = -4260383661321467037L; 

    ...  

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

    public String switchToDE() { 
    LOGGER.info("switching to german"); 
    Locale german = Locale.GERMAN; 
    FacesContext.getCurrentInstance().getViewRoot().setLocale(german); 
    this.locale = german; 
    return null; 
    } 

    public String switchToEN() { 
    LOGGER.info("switching to english"); 
    Locale english = Locale.ENGLISH; 
    FacesContext.getCurrentInstance().getViewRoot().setLocale(english); 
    this.locale = english; 
    return null; 
    } 

    public Locale getLocale() { 
    return locale; 
    } 

    public void setLocale(final Locale locale) { 
    this.locale = locale; 
    } 

} 

その後、私は、ロケールを切り替えるcommandLinksをレンダリングしたい:

私が設定している私の顔-config.xmlに

#{msg['message.key.1'] 

:今

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

私のページでいくつかの場所では

<ul> 
    <li> 
     <h:form> 
      <h:commandLink class="" action="#{languageBean.switchToDE}">Deutsch</h:commandLink> 
     </h:form> 
    </li> 
    <li> 
     <h:form> 
      <h:commandLink action="#{languageBean.switchToEN}">English</h:commandLink> 
    </h:form> 
    </li> 
</ul> 

私は、メッセージをレンダリングするいくつかの出力を持っています私の問題:最初のクリックは、スイッチロケールメソッドにアクセスしますが、メッセージバンドルはページ内で更新されません。同じ言語でもう一度クリックすると、メッセージバンドルが更新されます。メッセージバンドルの検索は、常にロケールの切り替えの一歩です。 h:commandButtonタグでロケールを切り替えるにはどうすればいいですか(リンクが必要ですが、スタイルガイドではorを使用できません)、メッセージバンドルのルックアップが同期していますか?

Mojarra 2.0.9(Servlet API 2.5に基づくJSF 2.0)でGF 2.1を使用しています。 アドバイスをよろしくお願いいたします。

EDIT:

[OK]を、私はそれは私のせいな原因は、我々はいくつかの「特別」なもの;-)

は、私たちが持っているものと我々がしようと何を説明しようと試みるだったことが判明

  • 我々は、ビルドtiの中にSVNレポ
  • に異なるビジネス上の目的のために、論理的に異なるWebアプリケーションを分離しているのmaven
  • で私たちのソフトウェアを構築しています私たちは<ビジネス-webappの-ID > .xmlファイルが
  • を登録直面-CONFIG-各Webアプリケーションは、それ自身のリソースを持っているので、私たちはそれぞれのビジネスのためのWebアプリケーションaを目的としている
  • 1(WAR-オーバーレイ)にすべてのWebアプリケーションを集約します各ウェブ
  • 登録されているすべてのWebアプリケーションのために、我々はナビゲーション項目をレンダリングする一般的なWebアプリケーション(フレームワーク)を持っている名前「<ビジネス-webappの-ID > MSG」
  • に登録バンドルのnav-アイテムを登録する可能性があります。
  • フレームワークは現在、現在のナビゲーションアイテムが返される段階で、すべてのリソースバンドルを1つの大きなリソースバンドルに集約しようとします。

ナビゲーションBeanのメソッドgetItems()が、switchLocaleメソッドがトリガされる前に呼び出され、ロケールの切り替えが遅すぎることがわかりました。

これで、h:commandLinkを使用してロケールを切り替えたり、ah:outputLinkを使用してロケールを切り替える可能性があるかどうかを尋ねてみると、「getItems()」のバッキングBeanメソッドを使用する前にロケールの切り替えが行われますトリガー?

わかりやすいように私の「挑戦」を説明してくれることを願っています。

+0

public String switchLanguage(String language) { // ... } 

、あなたは言語を切り替えるには、AJAXを使用しませんでしたか?一方を除外するには、リダイレクトしたり、null以外を返すとどうなりますか? (空の文字列など) – BalusC

+0

ロケールの切り替えにajaxを使用しません。そして、私はロケールの切り替えがすべてのページで可能でなければならないため、この時点で正確な結果を知らないのでnullを返します。 JSFバッキングBeanでどのようにリダイレクトできますか? – Walter

+1

JSFに強制的に新しいビューを作成させるか、 'return viewRoot.getViewId()+"?faces-redirect = true ";'を 'return null;'の代わりに 'return"同じビューにリダイレクトします。 – BalusC

答えて

1

この問題がどのように発生したのか、原因がわかりません。 JSFに強制的にビューを再作成させるために、次のことを試すことができます。アクションメソッドにnullを返す代わりに、空の文字列を返すか、同じビューにリダイレクトを強制します。

public String switchToDE() { 
    // ... 
    return ""; 
} 

または

public String switchToDE() { 
    // ... 
    return FacesContext.getCurrentInstance().getViewRoot().getViewId() + "?faces-redirect=true"; 
} 

無関係具体的な質問へのご使用の環境がEL 2.2サポートしている場合は、このための単一のアクションメソッドを使用している場合、それはDRYよりでしょう。例えば。あなたの本当のコードで

<h:commandLink action="#{languageBean.switchLanguage('EN')}">English</h:commandLink> 
+0

ありがとうございました。私がリダイレクトする前に言ったように、getViewId()は私のためのトリックを行い、本当に十分です。私はあなたがここでそれを言及するように、すでに一つのメソッドにリファクタリングしています。私たちはGlassfish 2.1で実行していますので、パラメータをELで使用することはできません。まず、選択したロケールを設定するためにタグを追加しました。 – Walter

関連する問題