0

JSF アプリで、ログイン時に特定のユーザー ロケールを設定したいと考えています。

これを行うには、彼のプロパティからユーザー ロケールを取得し、次の方法でユーザー ロケールを設定します。

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

ログイン成功時のログインフェイズ中。

私の問題は、ユーザーセッション中に後続のフェーズでユーザーにメッセージを表示すると、経由するロケールが表示されることです

FacesContext context = FacesContext.getCurrentInstance();
    if (context != null && context.getViewRoot() != null) {
        locale = context.getViewRoot().getLocale();
        ... 

常にデフォルトのロケールです。

コードにロケールを設定するポイントが他にないため、なぜこれが起こるのかわかりません。

4

2 に答える 2

1

基本的に、現在のビューであるログイン ページのロケールのみを設定しています。セッション スコープでユーザー ロケールを記憶し、同じセッションの後続のすべてのビューでも設定する必要があります。

これを行うにはuserLocale、セッション スコープ Bean のプロパティを作成し (おそらくログインしているユーザー自体だけでしょうか?)、それを<f:view locale>マスター テンプレートのように参照します。

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

viewRoot.setLocale(user.getLocale())これは、すべてのビューに対して暗黙的に実行されます。

以下も参照してください。

于 2013-01-16T11:30:00.457 に答える
0

ユーザーが優先するローカルに関する情報をリクエストから収集する理由について、さらに何かを言う必要がありますが、ヘッダーから取得するとしましょうaccept-language

次に、JSF仕様が言うように:

UIViewRoot の Locale は、ViewHandler の createView() メソッドの実行中に ViewHandler によって決定および設定されます。このメソッドは、ユーザーのプリファレンスとアプリケーションのサポートされているロケールを組み合わせて調べることによって、アクティブなロケールを決定する必要があります。

したがって、1 つは ViewRoot で Locale を設定し、リクエスト ヘッダーから Locale を収集することです。もう 1 つは、構成ファイルでサポートされているロケールを適切に設定することです。

仕様の他の部分で読むことができます(ViewHandler calculateLocale方法を参照):

メソッド Application.getSupportedLocales() は、この JSF アプリケーションがサポートできるロケールを定義します。このメソッドは、そのようなデータ ソースを照合し、現在のアプリケーションを現在のユーザーにレンダリングするための最良の選択である Locale オブジェクトを返す必要があります。

なぜそのような流れになっているのでしょうか。アプリがそのロケールで応答を送信することがサポートされていない場合、ユーザーが優先するロケールでユーザーに応答を送信できないためです。faces-config.xmlあとは、次のようにinディレクトリを構成するだけです (WEB-INFこれも JSF 仕様からコピーされます)。

<faces-config>
  <application>
    <locale-config>
      <default-locale>en</default-locale>
      <supported-locale>de</supported-locale>
      <supported-locale>fr</supported-locale>
      <supported-locale>es</supported-locale>
//    ...
    </locale-config>
  </application>
</faces-config>
于 2013-01-16T11:17:05.057 に答える