GWTの国際化 (その3)

さて、前回から随分と間が空いてしまったが、GWTの国際化、次の方法は「動的な文字列を使った」国際化だ。

この方法はGWTが提供する辞書クラス(com.google.gwt.i18n.client.Dictionary)でjavascript中のオブジェクトの定数値を読み込むのだが、、その方法は非常に明確であり例を紹介すれば解説はいらないだろう。

javascriptオブジェクト定数を用意する

エントリポイント等、参照されるHTML中に辞書の元となるjavascriptオブジェクトを記述する

  • AddressBook.html
<!doctype html>
<html>
  <head>
    <title>AddressBook</title>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    :
    :
    <script type="text/javascript">
      var AddressInfoConst = {
	    fullName: "かずず",
	    address: "川崎市",
	    email: "kazzz@email.com",
	    married: "true",
	    gender: "male"
      };
    </script>
  </head>
  :
辞書クラスを使って辞書を初期化する

GWTjavascriptのコンテキストにアクセスできるため、以下のように辞書オブジェクトをjavascriptオブジェクト定数の名前で初期化することで、使用が可能となる。

public class AddressBook implements EntryPoint {
    @Override
    public void onModuleLoad() {
        :
        :
        
        Dictionary dic = Dictionary.getDictionary("AddressInfoConst");
        String fullName = dic.get("fullName");
        String address = dic.get("address");
        String email = dic.get("email");
        boolean married = Boolean.valueOf(dic.get("married"));
        AddressInfo.Gender gender = AddressInfo.Gender.valueOf(dic.get("gender"));
        AddressInfo info = new AddressInfo(fullName, address, email, married, gender);
        :
    }
}

見て判ると思うがjavascriptオブジェクトのプロパティはそのまま辞書のキーとして使用する。

辞書から詠み込んだ値を利用する

辞書から読み込んだ内容をGWT Widgetのプロパティにセットする。

  • AddressInfoComposite.java
public class AddressInfoComposite extends Composite {
    :
    :
    public void setAddressInfo(AddressInfo addressInfo) {
      this.addressInfo = addressInfo;

      this.fullNameTextBox.setText(addressInfo.fullName);
      this.addressTextBox.setText(addressInfo.address);
      this.emailTextBox.setText(addressInfo.email);
      this.marriedCheckBox.setValue(addressInfo.married == true);
      this.maleRadioButton.setValue(addressInfo.gender == Gender.male);
      this.femaleRadioButton.setValue(addressInfo.gender == Gender.female);
    }

ここまでの成果としてPCとAndroidでほぼ同じ画面を表示できているのが判るだろう。

この方法、国際化というよりはJavaの世界にJavascriptのオブジェクトを簡単に送り込む方法としていろいろと応用できそうである。

なおこれは当然だが、型とオブジェクトの参照が解決されている静的な国際化に比べると今回の動的な方法は処理コストがかかる。