GWTアプリケーションの国際化 (その2)
GWTアプリケーションの国際化 (その1)から少々空いてしまったが、GWTの国際化についての続きを書く。
前回は静的な文字列定数とConstantsインタフェースを使って国際化を行ったが、この方法には拡張された方法がある。
実際のアプリケーションではよく使うが、例えばある項目のガイダンスメッセージとして使う語句があるとしよう。
"{0}を入力してください"
アプリケーション実行時には項目名に合わせてパラメタで{0}を置き換えることで「"氏名"を入力してください」「"住所"を入力してください」等メッセージを使い回すことできるものだ。
GWTはこのようなメッセージを前回同様のプロパティファイルとMessagesインタフェースで簡単に実装できるが、実装の手順はConstantsインタフェースを使った場合と非常に似ており簡単だ。
インタフェースを作成する
前回同様に国際化メッセージを取得するためのインタフェースをMessagesインタフェースを継承して作成する。
- IAddressBookMessages.java
import com.google.gwt.i18n.client.Messages; public interface IAddressBookMessages extends Messages { String enterFor(String itemName); }
前回と違うのはメソッドシグネチャにパラメタを持つことである。これこそ上述した仮パラメタ"{0}"を置換する実パラメタを指定するためのものであり、文字列で指定する。
国際化リソースをプロパティファイルで用意する
国際化に必要なJavaプロパティファイルをインタフェースと同名のファイル名でロケール毎に用意する。同様にデフォルトロケール(サフィックスを付加しないファイル名)のプロパティは必ず用意する
- IAddressBookMessages_ja_JP.properties
enterFor={0}を入力してください
- IAddressBookMessages.properties
enterFor=enter {0}
Constantsの時と同様にインタフェースのメソッド名とプロパティのキー名を合わせることが制約となる。仮パラメタはMessageFormatクラスで使用する形式と同様で、{0}、{1}と0オリジンで順に指定する。
定数インタフェースのインスタンスを生成して使う
GWTクラスによりMessagesインタフェースの実体化を行うことで、同インタフェースのメソッドを使って国際化リソースを取得することができる。
final IAddressBookMessages messages = (IAddressBookMessages)GWT.create(IAddressBookMessages.class); this.addressTextBox.addFocusHandler(new FocusHandler() { @Override public void onFocus(FocusEvent event) { messageLabel.setText(messages.enterFor(addressLabel.getText())); } });
実行結果
上のコード片のように、この画面で言うと「住所」にフォーカスが当たると「住所を入力してください」とメッセージが表示される。他の項目にも同様のコードがあり、ラベルの文字列をガイダンスの項目名としてメッセージのパラメタを置換する訳だ。
なお、ロケールの設定等はConstantsインタフェースの時と同様なので割愛する。
このようにパラメタでメッセージを置換することができるMessagesインタフェースを使う方法は便利だが、Constantsインタフェースの時と違ってインタフェースの戻り値を整数やブール値等の文字列以外の型を使用することはできない。
次回は動的に文字列を取得する方法を書く予定。