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インタフェースの時と違ってインタフェースの戻り値を整数やブール値等の文字列以外の型を使用することはできない。

次回は動的に文字列を取得する方法を書く予定。