Struts1.3.5で国際化対応

感想おまちしてます!

国際化(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(英語)
  • 国コード

ResourceBundleの検出方法をまとめると

  • 指定されたロケール&デフォルトロケール(Locale.getDefault)を使う
  • 指定されたロケールが空だったらbaseNameのプロパティファイルを使う
  • それ以外の場合は指定されたロケールを使って以下の順番で探す
    1. baseName + “_” + language + “_” + country + “_” + variant
    2. baseName + “_” + language + “_” + country
    3. baseName + “_” + language
  • それでも見つからなくて指定されたロケールとデフォルトロケールが異なる場合は、デフォルトのロケールを使って以下の順番で探す
    1. baseName + “_” + language + “_” + country + “_” + variant
    2. baseName + “_” + language + “_” + country
    3. 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">