次の ResourceBundle プロパティ ファイルがあるとします。
- メッセージのプロパティ
- messages_en.properties
- messages_es.properties
- messages_{一部のロケール}.properties
注: messages.properties には、デフォルト ロケールのすべてのメッセージが含まれています。messages_en.properties は本当に空です - 正確さのためにそこにあるだけです。messages_en.properties は、messages.properties にフォールバックします!
そして、web.xml に次の構成パラメーターがあるとします。
<context-param>
<param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
<param-value>messages</param-value>
</context-param>
<context-param>
<param-name>javax.servlet.jsp.jstl.fmt.fallbackLocale</param-name>
<param-value>en</param-value>
</context-param>
選択したロケールが「es」で、リソースが「es」に翻訳されていない場合、「en」にフォールバックし、最終的に「messages.properties」にフォールバックすると予想されます (messages_en.properties が空であるため)。 .
これが Jetty での仕組みです。これも WebSphere でテストしました。
樹脂が問題
問題は、Resin (3.0.23) に到達したときです。フォールバック解決がまったく機能しません! メッセージを表示するには、次のことを行う必要があります。
- messages.properties の名前を messages_en.properties に変更します (基本的に、messages.properties と messages_en.properties の内容を入れ替えます)。
- messages_en.properties のキーが、messages_{every other locale}.properties でも定義されていることを確認してください (まったく同じ場合でも)。
これを行わないと、「???some.key???」になります。JSPで。
助けてください!これは当惑します。
-- レ
解決
pom.xml に以下を追加します (maven を使用している場合)
...
<properties>
<taglibs.version>1.1.2</taglibs.version>
</properties>
...
<!--
Resin ships with a crappy JSTL implementation that doesn't work with
fallback locales for resource bundles correctly; we therefore include
our own JSTL implementation in the WAR, and avoid this problem. This
can be removed if the target container is not resin.
-->
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>${taglibs.version}</version>
<scope>compile</scope>
</dependency>