0

現在、私の J2EE アプリケーションは以下の国をサポートしています

MessagesBundle_en_GB.properties (United Kingdom )
MessagesBundle_en_US.properties (United States )
MessagesBundle_it_IT.properties (Italy )
MessagesBundle_pt_BR.properties (Brazil )
MessagesBundle_sv_SE .properties (Sweden)

そこで、上記のすべての国に対してプロパティ ファイルを作成し、その中でキーと値のペアを定義しました。このコンセプトには Resource Bundle を使用しています。

そして、キー名にアクセスする方法はこの方法です

bundle.getString("userName"));
bundle.getString("Mobile"));

今私の質問は、

上記のように、ユーザーはいずれかの国に属している可能性があるため、JSP ページ内で Locale 値を設定するにはどうすればよいですか

教えてください、どうもありがとうございました

// これはハードコードされています。これを動的に設定するにはどうすればよいですか??

ResourceBundle bundle = ResourceBundle.getBundle("MessagesBundle", Locale.UK);
4

3 に答える 3

1

ResourceBundle.getBundle(BUNDLE_NAME).getString(key);文字列にアクセスするために使用します。

Resourcebundle キャッシュをクリアするなどしてデフォルト ロケールを更新するLocale.setDefault(<REQUIRED_LOCALE>);場合: ResourceBundle.clearCache();

の次の呼び出しはResourceBundle.getBundle(BUNDLE_NAME).getString(key);、選択されたロケールのローカライズされた文字列を返す必要があります。

于 2012-04-30T10:48:20.090 に答える
0

まず最初に:バックエンドコードResourceBundle.getBundle(Locale)で使用できます。ただし、これをJSPページで直接使用しないでください。代わりにJSTLを使用する必要があります。それでは、詳細を見ていきましょう。

ResourceBundleを直接使用する必要がない理由は2つあります。1つはこれに関連しています:

<% 
try {
  ResourceBundle rb = ResourceBundle.getBundle("messages", locale);
} catch (MissingResourceException mre) {
   // LOG THIS!
}
%>

これはかなり醜いですね。これは、探しているベース名のバンドルがない場合にスローされるMissingResourceExceptionに注意する必要があるためです。さらに悪いことに、特定のシナリオにキーがない場合、同じ例外がスローされる可能性があります。

rb.getString("key");

したがって、これも考慮に入れる必要があります。

<% 
try {
  rb.getString("key");
} catch (MissingResourceException mre) {
   // LOG THIS!
}
%>

どのように見えますか?
もちろん、ResourceBundleから派生し、これらのメソッドをオーバーライドして、例外がスローされないようにすることもできますが、これは、これよりもはるかに多くの作業です。

<fmt:setLocale value="fr_CA" scope="session"/>
<fmt:bundle basename="com.taglib.weblog.Greeting">
<fmt:message key="com.taglib.weblog.Greeting.greeting">

これが、JSPでJSTLを使用する必要がある理由です。この記事で、JSTLfori18nの使用方法の詳細をお読みください。

さて、あなたの最初の質問は、言語ネゴシエーション(W3C用語)、または必要に応じてロケール検出についてでした。JSPアプリケーションでそれを行う方法は?
最も簡単で最も一般的なシナリオは、HTTPのAccept-Languageヘッダーの内容を読み取ることです。Javaサーブレットの世界では、これはServletRequestの getLocale()またはgetLocales()メソッドを呼び出し、JSPページからアクセスできるHttpSessionオブジェクトの変数に割り当てることを意味します。サーブレット側でHttpSessionにアクセスする方法がわからない場合は、getSession()メソッドがあります。

これは、サーブレットに直接アクセスできる場合に機能します。必要がない場合は、すべてを実行するロケールフィルターを作成(または既存)する必要があります。ご想像のとおり、これはかなり一般的なシナリオです。それが、人々がすでに(ずっと前に)必要なクラスを書いた理由です。いくつかのフレームワークで見つけることができますが、特にSpringFrameworkについて説明します
奇妙に聞こえるかもしれませんが、単純な解決策を探している場合は、一般的なWebフレームワーク(つまり、Spring MVC)を学習して使用する方が、車輪の再発明よりも優れています。学習曲線が少し急になるかもしれないことを私は知っていますが、それは価値があります。

于 2012-05-01T09:33:25.673 に答える
0

それを行う最も簡単な方法は、実装することHttpFilterです。たとえば. It should be mapped to、web.xml で LocaleHttpFilter /*` を呼び出して、リクエストがアプリケーションに到着するたびに呼び出されるようにします。

フィルタはリクエストを検出し、現在のロケールを決定します。URL パラメータ、HTTP ヘッダー、GeoIP ルックアップなどに基づいて決定する場合があります。呼び出す必要があるロケールについて決定したら、次のようにします。

Locale.setDefault(locale)

次に、使用できます

ResourceBundle.getBundle("MessageBundle").getString("hello");

コードの任意の場所で。この行は"hello"、フィルターに設定された現在のロケールに従って文字列の値を返します。

于 2012-04-30T10:44:58.283 に答える