2

現在、プログラムでロケールを設定しようとしていますが、適切な解決策が見つかりません。ユースケースは、ロケールパラメータを持つデータを自分のサイトに投稿する別のWebサイトがあり、このロケールに基づいて、ページをレンダリングする必要がある場合です。

preRenderView、コンストラクター、PostConstructでロケールを設定しようとしましたが、もう遅いようです。

なにか提案を?ありがとう。

4

2 に答える 2

4

UIViewRoot#setLocale()重要な点は、ビューがレンダリングされる前にロケールを設定する必要があるということです。ビューの<f:view locale="#{languageBean.currentLocale}">構築中にのみ設定されます。したがって、Beanプロパティのみを変更する目的でその後呼び出されるリクエストベースのアクションは、効果がありません。本当に手動で呼び出す必要UIViewRoot#setLocale()もあります。

最も簡単なのは、プロパティUIViewRoot#setLocale()のセッターでもそのジョブを実行することです。currentLocale質問コメントでダニエルによって提供されたリンクの回答で言及されているBeanの例は、まさにそれを実行します。JSF2.0は、ブラウザからプログラムでセッション全体にロケールを設定します。このように、ページを一度リロードするのに醜いJSハックは必要ありません。

あなた自身の答えに基づいて、別の考えられる問題があります:あなたの「レシーバーBean」はリクエストスコープであり、#{languageBean}それ自体ではないようです。このBeanが、ビューのロケール/言語関連の側面(言語のドロップダウン、ローカライズされたテキストなど)ので初めて構築された場合、それらを変更するには遅すぎます。Beanの構築をレンダリング前のビューイベントに移動したいとします(例:via <f:event listener>)。別の方法は、代わりにプロパティのゲッターでリクエストパラメータ収集ジョブを実行することです。currentLocale

于 2013-01-17T13:14:19.713 に答える
1

プレーンなJavaScriptを使用してページを読み込むことで問題を解決しました。

PostConstructで、コンテキストのリクエストパラメータマップからパラメータを読み取りました。//ロケールを設定します

try {
    languageBean.setCurrentLocale(LocaleUtils.toLocale(temp.getLocale()));
} catch (IllegalArgumentException | NullPointerException e) {
    languageBean.setCurrentLocale(Locale.JAPAN);
}

次に、プレーンJavaScriptを使用してページをリロードします。

<script type="text/javascript">
    window.onload = function() {
        if (!window.location.hash) {
            window.location = window.location + '#loaded';
            window.location.reload();
        }
    }
</script>

私はここにもっと詳細なコードを書きました:http: //czetsuya-tech.blogspot.com/2013/01/loading-locale-from-postget-parameter.html

于 2013-01-17T08:30:18.337 に答える