3

私のxhtmlページには、次のタグが含まれています。

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

言語Beanを実装しました:

@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;
  }

}

次に、コマンドリンクをレンダリングしてロケールを切り替えます。

<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>

私のページのいくつかの場所に、メッセージをレンダリングするいくつかの出力があります。

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

私のfaces-config.xmlで、次のように構成しました。

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

今私の問題:最初のクリックはスイッチロケールメソッドにアクセスしますが、メッセージバンドルはページで更新されません。同じ言語をもう一度クリックすると、メッセージバンドルが更新されます。メッセージバンドルのルックアップは、常にロケールの切り替えより1ステップ遅れています。メッセージバンドルのルックアップが同期するように、h:commandButtonタグを使用してロケールを切り替えるにはどうすればよいですか(リンクが必要で、スタイルガイドはまたはの使用を禁止しています)。

Mojarra 2.0.9(サーブレットAPI2.5に基づくJSF2.0)でGF2.1を使用しています。どんなアドバイスでも大歓迎です。

編集:

わかりました、私たちがいくつかの「特別な」ことを試みたのは私のせいであることがわかりました;-)

私は私たちが持っているものと私たちが試していることを説明しようとします:

  • Mavenを使用してソフトウェアを構築しています
  • SVNリポジトリでは、ビジネス目的ごとに論理的に異なるWebアプリを分離しています
  • ビルド時に、すべてのWebアプリを1つに集約します(WARオーバーレイ)
  • したがって、ビジネス目的のWebアプリごとに、faces-config-<business-webapp-id>.xmlが登録されています。
  • 各Webアプリには、「<business-webapp-id>msg」という名前で登録された独自のリソースバンドルがあります。
  • 登録されているすべてのWebアプリのナビゲーションアイテムをレンダリングする共通のWebアプリ(フレームワーク)があります
  • 各Webには、nav-itemsを登録する可能性があります。
  • フレームワークは、現在のナビゲーションアイテムが返されるフェーズ中に、すべてのリソースバンドルを1つの大きなリソースバンドルに集約しようとします。

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

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

私の「挑戦」を理解できるように説明したことを願っています。

4

1 に答える 1

2

この問題がどのように、そしてなぜ引き起こされるのかわかりません。JSFにビューを再作成させるために、以下を試すことができます。アクションメソッドに戻る代わりにnull、空の文字列を返すか、同じビューへのリダイレクトを強制します。

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

また

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

具体的な質問とは関係なく、ご使用の環境がEL 2.2をサポートしている場合、これに単一のアクション方法を使用すると、よりドライになります。例えば

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

<h:commandLink action="#{languageBean.switchLanguage('EN')}">English</h:commandLink>
于 2012-03-16T12:15:55.797 に答える