国際化(internationalization)のこと。i18nと略されることもある。Strutsで日本語、英語の切り替えが簡単にできるようにする方法を調べた。
これをきちんとしないと、Strutsのログに以下のように出てしまう。
//例 ApplicationResources.propertiesだけ作った場合
[WARN ] - Resource com/daipresents/ApplicationResources_ja.properties Not Found.
[WARN ] - Resource com/daipresents/ApplicationResources_ja_JP.properties Not Found.
警告なのは、「ロケール日本のプロパティファイルがないからMessageResources.properties」を使うからいいよ。という意味だろう。日本オンリーであっても警告して教えてくれるわけだ。
対応方法
- JSPから日本語を切り出す
- validation.xmlから日本語を切り出す
- プロパティファイルの作成
JSPから日本語の切り出す
struts-config.xmlでメッセージリソースを使うことを宣言する。
<message-resources parameter="com.daipresents.ApplicationResources" />
JSPではメッセージリソースを使って文字を出力する。
<bean:message key="page.title" />
validation.xmlから日本語を切り出す
作成中ですわ
プロパティファイルの作成
今回は英語と日本語を用意する。
用意するのは
- ApplicationResources.properties(デフォルト 日本語)
- ApplicationResources_ja.properties(日本語)
- ApplicationResources_en.properties(英語)
の3ファイル
プロパティファイルの命名規則は以下。
ベース名_言語コード_国コード_地域コード.properties
- 言語コード
- ja(日本語)
- en(英語)
- 国コード
- JP(日本)
- US(アメリカ合衆国)
詳しくは「ResourceBundle.getBundle
を参考にどうぞ。
ResourceBundleの検出方法をまとめると
- 指定されたロケール&デフォルトロケール(Locale.getDefault)を使う
- 指定されたロケールが空だったらbaseNameのプロパティファイルを使う
- それ以外の場合は指定されたロケールを使って以下の順番で探す
- baseName + “_” + language + “_” + country + “_” + variant
- baseName + “_” + language + “_” + country
- baseName + “_” + language
- それでも見つからなくて指定されたロケールとデフォルトロケールが異なる場合は、デフォルトのロケールを使って以下の順番で探す
- baseName + “_” + language + “_” + country + “_” + variant
- baseName + “_” + language + “_” + country
- baseName + “_” + language
- それでも見つからない場合は「MissingResourceException」
探す順番が↑なので、message.properties_ja_JPがなければ結局警告となる。
確認
ブラウザの言語に「英語」を追加して優先順位を上げる。そしてJSPを見ると英語版のプロパティファイルで表示されるはず。
コンテント・ネゴシエーション
HTTP/1.1では、ヘッダに含まれるメタデータを使って、
複数のリソースの中から最も適切なものを選択するための
コンテント・ネゴシエーションの仕組みが定められています。
参考:Web KANZAKI
というわけで、Webサーバがこの辺をがんばってくれてもいる。Apacheで「.ja」ファイルとかが使える理由でしょうか。
ブラウザの言語を変えただけでStrutsは国際化対応できる
疑問
ブラウザの言語を変えただけで、なぜにStrutsのResourceBundleまでもが「こっちは英語?」とか「これは日本語?」とかを切り分けれるのか?
答え
デフォルトで、Struts ではユーザ セッションごとに
ロケール オブジェクトが提供されます。
このロケール オブジェクトは、ユーザから提供された情報に基づいて
適切に設定できます。(引用:WebLogic Server での Struts に関する問題の調査パターンより
Strutsが使っているロケール
調べた結果、最低以下の箇所で使われている(と思われる)
ActionServletの初期化パラメタlocale
これはAction.LOCALE_KEYという名までセッションに格納される。デフォルトではtrueになっていて、Localeが使われている。
このロケールを置き換える場合はこのキーを使って置き換えることが可能。
controllerのlocale
struts-config.xmlで設定可能
<controller processorClass="org.apache.struts.action.RequestProcessor"
locale="true"/>
html:htmlタグ
lang属性がある。
<html lang="ja">