数年前までは、アプリケーションの開発者は、
自分の国の住民だけをサポートしていればよいと考えていました。
そこでは、ただ1つ(ときどき2つ)の言語と日付、数値、貨幣のような量を表すのに1種類の方法しか使用されていいませんでした。
しかしながら、Webテクノロジベースのアプリケーション開発の爆発も、
インターネットおよび他の広くアクセス可能なネットワーク上のアプリケーションの配置も、
多くの場合に、目に見えない国境を与えていました。
しかし、インターネットおよび、他の広くアクセス可能なネットワークと同様に、
Webテクノロジベースのアプリケーション開発は、多くの場合において国境をなくしました。
これは、アプリケーションが(もしシャレが許されるならば)国際化
(“i”と“n”の間の文字数が18なので、「i18n」と呼ばれます)
と、地域化のサポートの必要性に形を変えました。
Javaプラットフォーム上のStruts はアプリケーションの国際化と地域化を助けます。
よく知られている重要な概念は以下のとおりです
- Locale - 国際化をサポートするJavaの基本クラスは、
java.util.Localeです。
それぞれのLocaleは特定の国と言語(オプション言語バリエーションの追加)を表します。
そしてまた、数値と日付のようなものの為のフォーマットのセットを仮定しています。
- ResourceBundle -
java.util.ResourceBundleクラスは複数言語のメッセージを
サポートする基本的なツールを提供します。
詳しくは、ResoruceBundleクラスのJavadocと、
JDKのリリースに同封の国際化に関するドキュメントの情報を参照してください。
- PropertyResourceBundle -
ResourceBundleの標準実装のうちの1つは、
初期化プロパティファイルで使っているシンタックス“name=value”
を用いてリソースを定義します。
これは、Webアプリケーションで使われるメッセージのリソースバンドルを用意する場合にとても便利です。
なぜなら、これらメッセージは一般的なテキストだからです。
- MessageFormat -
java.text.MessageFormatクラスは、
ランタイムに指定された引数によってメッセージ文字列
(この場合、メッセージはリソースバンドルから検索されたもの)
の一部を置き換える事を可能にします。
これは文章を作成している時に有効です。
しかし、単語は異なる言語で、異なる順に現れるでしょう。
メッセージ中のプレースホルダ文字列{0}は、
第1のランタイム引き数と入れ替えられ、{1}は第2の引き数などと入れ替えられます。
- MessageResources -
Strutsのクラス
org.apache.struts.util.MessageResources を使うと、リソースバンドルのセットをデータベースのように扱うことができ、サーバ自身が動いているデフォルトの Localeの代わりに、特定の Locale(通常は現在のユーザに関連付けられている)の特定のメッセージ文字列を要求することができます。
Strutsのようなフレームワークで国際化サポートは、ユーザに対する文字や画像の表示
の国際化に限られていることに注意してください。Localeで指定された入力方法
(日本語や中国語、韓国語のような言語と共に使われる)は、クライアントデバイス
(通常はWebブラウザ)に依存します。
国際化されたアプリケーションでは、使用するプラットフォームの JDK のドキュメントに含まれている国際化ドキュメントに記述されているステップに従って、それぞれの言語用のメッセージを含んだプロパティファイルを作成します。以下に例を示します。
ソースコードが com.mycompany.mypackage というパッケージの中に作成されていて、(起点となるディレクトリからの相対パスで)com/mycompany/mypackage というディレクトリに格納されているとします、com.mycompany.mypackage.MyResources というリソースバンドルを作成するためには、com/mycompany/mypackage ディレクトリの中に以下のファイルを作成します。
- MyResources.properties - サーバのデフォルト言語をメッセージとして記述します。デフォルト言語が英語の場合、
このようなエントリーを記述します
- MyResources_xx.properties - ISO言語コードが“xx”である言語で、同じメッセージを記述します
(ISOコードの現在のリストへのリンクはjavadoc のリソースバンドルのページを参照してください)。
前述のメッセージのフランス語の場合は、このようなエントリー
prompto.hello=Bonjour
を記述します。サポートする言語と同数のファイルが必要となります。
Web アプリケーション配置指定子でコントローラサーブレットを設定するときに、初期化パラメータの中でアプリケーション用のリソースバンドルのベース名を定義する必要があります。
上に記述されたケースでは、それがcom.mycompany.mypackage.MyResourcesになるでしょう。
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>application</param-name>
<param-value>com.mycompany.mypackage.MyResources</param-value>
</init-param>
<.../>
</servlet>
重要な事は、アプリケーション内のクラスパス上でリソースバンドルが見つかる事です。
別のアプローチはアプリケーションのクラスホルダーにMyResoureces.properties
ファイルを格納する事です。
その後、単にアプリケーションの値として、“myResources”を指定することができます。
ただし、もし、ビルドスクリプトがターゲット"clean"の一部としてクラスを削除する場合、
それが、削除されないように注意してください。
もし行うなら、アプリケーションのコンパイルをする場合に
classesディレクトリにsrc/conf
ディレクトリの内容をコピーするAntのタスクがあります。
<!-- Copy any configuration files -->
<copy todir="classes">
<fileset dir="src/conf"/>
</copy>