2

私たちの Wicket アプリでは、ユーザーごとに個別の UI 言語と数字/日付形式のロケール (例: 英語の UI、数字と日付形式: ドイツ語) が必要です。

セッション ロケールを Locale.GERMAN に設定すると、ドイツ語の数字と日付の形式とドイツ語のリソース (MyForm_de.properties など) の両方が取得されます。

セッション ロケールを数字と日付のロケールに設定し、カスタム ComponentStringResourceLoader を使用して文字列をロードすることで、この問題を回避しました (return super.loadStringResource(clazz, key, language != null ? new Locale(language) : locale, style, Variation) )))。ただし、別のユーザーとしてログオンすると、言語が混在し始めるため、文字列がキャッシュされているようです。

キャッシングを制御する方法を知っている人はいますか (それが問題の原因であると仮定します)。注: キャッシュを防止したくありません (おそらくパフォーマンスが低下するため)。カスタムリソースローダーで正しく動作するように、キャッシング動作をオーバーライドしたいと思います。

または、この問題を解決するためのより良いアプローチがありますか?

カスタム StringResourceLoader に使用したコードは次のとおりです。

ComponentStringResourceLoader myComponentStringResourceLoader = new ComponentStringResourceLoader() {
@Override
public String loadStringResource(Class<?> clazz, String key, Locale locale, String style, String variation) {
   return super.loadStringResource(clazz, key, getLoggedOnUser().getUILanguageLocale(), style, variation);
  }
};
getResourceSettings().getStringResourceLoaders().add(0, myComponentStringResourceLoader);

セッション ロケールを設定するコードを次に示します (数値と日付の書式設定に使用)。

getSession().setLocale(getLoggedOnUser().getNumberAndDateLocale());
4

1 に答える 1

1

ラベルの i18n にセッションのロケールを使用し、日付に別のロケールを使用する必要があるコンポーネントに #getLocale() または #getConverter() をオーバーライドできます。ドイツ語ロケールで値をレンダリングする必要がある TextField について話していると思います。その場合は、#getLocale() で常に Locale.GERMAN を返す GermanTextField を作成してください。

于 2012-04-25T11:23:04.763 に答える