まず最初に:バックエンドコード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)を学習して使用する方が、車輪の再発明よりも優れています。学習曲線が少し急になるかもしれないことを私は知っていますが、それは価値があります。