GWTアプリケーションの国際化 (その1)
GWTは国際化のための仕組みがあるが、大きく二つ方法に分類できる。
・静的な文字列(定数)を使った国際化
・動的な文字列を使った国際化
まずは馴染みの深い静的な文字列を使った国際化の方法をメモする。
静的な文字列(定数)を使った国際化
インタフェースを作成する
国際化に対応した文字列を取得するメソッドを定義したJavaインタフェースをConstantsインタフェースから継承して記述する。
- IAddressBookConstants.java
public interface IAddressBookConstants extends Constants { String fullName(); String address(); String email(); String married(); String gender(); String gender_male(); String gender_female(); }
国際化リソースをプロパティファイルで用意する
国際化に必要なJavaプロパティファイルをインタフェースと同名のファイル名でロケール毎に用意する。また、デフォルトロケール(サフィックスを付加しないファイル名)のプロパティは必ず用意する※
- IAddressBookConstants.properties
fullName=fullName address=address email=e-mail married=married gender=gender gender_male=male gender_female=female
- IAddressBookConstants_ja_JP.properties
fullName=氏名?? address=住所?? email=e-mail married=既婚 gender=性別 gender_male=男 gender_female=女
このように、プロパティのキー名とインタフェースのメソッド名を一致させる必要がある。
定数インタフェースのインスタンスを生成して使う
GWTクラスにより定数インタフェースの実体化を行うことで、同インタフェースのメソッドを使って国際化リソースを取得することができる。
IAddressBookConstants constants = (IAddressBookConstants)GWT.create(IAddressBookConstants.class); this.fullNameLabel.setText(constants.fullName()); this.addressLabel.setText(constants.address()); this.emailLabel.setText(constants.email()); this.marriedLabel.setText(constants.married()); this.genderLabel.setText(constants.gender()); this.maleRadioButton.setText(constants.gender_male()); this.femaleRadioButton.setText(constants.gender_female());
なお、アプリケーションで使用されるロケールはデフォルトが使われるが、エントリポイントに対応したページ(HTML)からmetaタグによって設定することもできる。
- AddressBook.html
<!doctype html> <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <meta name="gwt:property" content="locale=ja_JP"/> <title>AddressBook</title> : : </html>
この方法の良い所はコンパイル時にリソースとその型が解決されてエラーチェックもできることである。
※これを用意しないと、GWTコンパイルが失敗する。
"[ERROR] Line 41: Failed to resolve 'net.kazzz.client.IAddressBookConstants' via deferred binding"