rio's blog

おいでいただきありがとうございます。このブログでは、ソフトウェア開発や音楽(特にB'z)、車の事などを主にてきと〜に書いていく予定です。Rio's Laboratory (http://homepage3.nifty.com/rio_i/lab/) にて、いくつか文書とフリーソフトウェアを公開してます。

Wicket の勉強 (2) 国際化(i18n) について

さて、前回Wicket の入口について書きました。普通だと、これからどんどん使うコンポーネントを増やしていくという流れになると思うのですが…

今回は、いきなりですが国際化をテーマに書きたいと思います!

理由は、国際化がやりづらい場合は自分のフレームワーク候補から消えるから。

個人で使う場合は構わないのですが、業務で使うとなると高い確率で国際化機能が必要になるため、出来ればフレームワークの方で簡単に対処できる方が嬉しいんです。優先度が高い要望なのです。


html のタグで簡単に実現(プログラム側での変更が不要な場合)

単に国際化したいだけで、プログラムで実行時に内容を切り替えたりしない文字列であれば、html で wicket:message タグで文字列を囲むことで簡単に実現できます(言語情報を記述したプロパティファイルが別途必要ですけど)。Java 側のコンポーネント記述の方でも何とかできるみたいなんですが、ここは Struts の様にタグだけで済む方が嬉しいので、敢えて調べてません!

具体的には、国際化したい文字列を以下の様に wicket:message タグで囲みます。

<wicket:message key="helloworld">Hello</wicket:message>

すると、上の例の場合 helloworld キーに対応した国際化文字列をプロパティファイルから検索してきて、Hello の代わりに表示してくれます。対応する文字列が見つからなかった場合は、Hello がデフォルトの文字列として表示されます。

タグで囲んだ文字列だけでなく、タグ属性についても国際化できます。

<input type="submit" value="Default text" wicket:message="value:helloworld"/>

wicket:message 属性値を "対象の属性名:キー" とします。上の例の場合、value 属性が helloworld キーに対応する国際化文字列に置き換わるというわけです。見つからなかった場合は、元の文字列を使います。

プログラム中で国際化文字列をプロパティファイルから取得したい場合

現在の処理状況表示など、プログラムで表示内容を切り替えたい場合も多いと思います。この様な場合に Java プログラムにて国際化文字列を取得するためには、org.apache.wicket.Component#getString() を使います。

public final java.lang.String getString(java.lang.String key);
public final java.lang.String getString(java.lang.String key, IModel model);
public final java.lang.String getString(java.lang.String key, IModel model, java.lang.String defaultValue);

なお、上記のメソッドは Component 上で getLocalizer().getString(String key, Component component) を実行するのと同じ様です。getString() で取得した国際化文字列をコンポーネントのモデルに設定してあげれば、動的にコンポーネントの表示内容を変えることができます。

プロパティファイルの検索

国際化文字列は、多くの Java アプリケーション同様プロパティファイルとして用意します。プロパティファイルは、コンポーネント(Page とか Label とか)単位に作成することができます。それらのファイルの検索順序ですが、Apache Wicket の Wiki あたりで発見した検索の流れと最新版の流れがどうやら違っている様でして…

1.3 での検索順は ここ で紹介されている流れの様です。簡単にまとめると

となります。プロパティファイル名は コンポーネント名{_ロケール}.properties とします。例えば MyLabel に対応するプロパティファイルは MyLabel.properties や MyLabel_ja.properties の様になります。ロケールについては、現在のロケールに該当するファイルを探した後にロケール無しのファイルがデフォルトとして使われます。もっと分かりやすい説明は、ここここ をご参照ください。プロパティファイルの検索順序だけでなく、プロパティファイル内の検索キーに応じた検索順序についても書かれています。

なお、自分が Apache Wicket の Wiki で見つけた順序は

です。

なお、各プロパティファイルは対応するクラスと同じクラスパス階層に存在しないといけないみたいです(実験でしか確認していないため、設定を変える等の方法があるかもしれません)。

ロケール

現在のロケールですが、クライアントが提供したロケールが自動的に選択されて org.apache.wicket.Session に保存されます。自分で個別に設定したい場合は、WebPage でも使える org.apache.wicket.Component#getSession() を使って、getSession().setLocale(Locale.US) の様に設定できます。また、コンポーネント毎にロケールを変えたい場合は、そのコンポーネントの getLocale() をオーバーライドすることで実現できます。

なお、クライアントがロケール情報を指定しない場合、Java のデフォルトロケールを使用します(Locale.getDefault()/Locale.setDefault() によって操作可能)。

ロケール切り替えのサンプル

以下に、手動ロケール切り替えのサンプルを載せておきます。


FC2 Blog Ranking に参加してます。クリックよろしくお願いします!

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2008/07/15(火) 10:00:00|
  2. Wicket
  3. | トラックバック:0
  4. | コメント:0

<<Wicket の勉強 (3) IAuthorizationStrategy を実装して認証/認可を実現する | ホーム | デミオ、修理のために旅立ちました…>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://rio1218.blog26.fc2.com/tb.php/67-504c2644
この記事にトラックバックする(FC2ブログユーザー)