国際化
国際化 (I18N) とは、アプリケーションを異なる言語に適応させ、地域の差異を吸収することを意味します。アプリケーションを国際化対応可能にするためには、以下の手順に従ってください。
使用するのは UTF-8 だけ!
Play はたったひとつの文字エンコーディングをサポートします: UTF-8 です。文字エンコーディングの問題は異様で扱いが難しいので、Play は、ただひとつの文字エンコーディングをサポートすることを選択しました。UTF-8 では、すべての言語のすべての文字を表示することができます。
アプリケーション全体を通して、一貫して UTF-8 を使用するよう気を付けてください:
- すべてのソースファイルを UTF-8 として編集してください
- HTTP ヘッダに適切な文字エンコーディングを定義してください
- HTML meta タグに UTF-8 を設定してください
- データベースを使用する場合は、UTF-8 を使用するようデータベースを設定し、常に UTF-8 を使用して接続してください
注意
UTF-8 エンコーディングに関する問題は、Play の設定ファイルのほとんどが、それらが Java プロパティファイルであるにも関わらず、*.properties と名付けられていない理由です。Java は、プロパティファイルは iso-8859-1 でエンコーディングしなければならないという制約を課します。Play の設定ファイルは UTF-8 でエンコーディングしなければなりません。これ以上なにか言う必要はありますか?
メッセージの外部化
I18N をサポートするには、アプリケーション中のすべてのメッセージを外部化しなければなりません。
アプリケーションの conf/ ディレクトリに messages という名前のファイルを作成してください。このファイルは本当にただの Java プロパティファイルです。
hello=Hello!
back=Back
その後、アプリケーションで使用する言語ごとに、特別な message ファイルを定義することができます。単純に、ISO 言語コードをファイルの拡張子として追加してください。
例えば、対応するフランス語の訳語を含むメッセージファイルは conf/messages.fr です:
hello=Bonjour!
back=Retour
アプリケーションがサポートする言語の定義
サポートする言語のリストを conf/application.conf に定義してください:
application.langs=fr,en,ja
新しいユーザからの最初のリクエストの際は、Play は使用するデフォルトの言語を推測します。これは HTTP Accept-language ヘッダを解析して行います。その後、選択した言語を PLAY_LANG クッキーに保存します。このため、次のリクエストは選択した言語を使用します。
play.i18n.Lang オブジェクトにアクセスすることで、アプリケーションからこのユーザの現在の言語情報を検索することができます:
String lang = Lang.get();
このユーザの言語情報を恒久的に変更したい場合は、change() メソッドを使用します:
Lang.change("ja");
新しい値は、このユーザの言語クッキーに保存し直されます。
ロケールに沿った日付データフォーマット
使用するデフォルトの日付フォーマットを設定するには、application.conf を編集し、以下のプロパティを設定します:
date.format=yyy-MM-dd
date.format.fr=dd/MM/yyyy
application.conf において言語 fr が同様に利用可能となっていること (上記参照) を確認してください。
application.langs=fr,en
この設定は、${date.format()} を使用したテンプレートにおける日付のレンダリングに作用します。
この設定は、日付パラメータがバインドされたときのデフォルトのデータフォーマットも設定します。
ローカライズされたメッセージの検索
メッセージファイルに定義したメッセージをアプリケーションコードから検索することができます。Java からは、 play.i18n.Messages オブジェクトを使用します。
public static void hello() {
renderText(Messages.get("hello"));
}
標準的な Java のフォーマット構文に通じるメッセージフォーマットをサポートしています。メッセージ中に動的な内容を定義することもできます:
hello=Hello %s!
そして、以下のようにします。
public static void hello(String user) {
renderText(Messages.get("hello", user));
}
テンプレートからは、特別な &{…} 構文を使用することでローカライズされたメッセージを表示することができます:
<h1>&{'hello'}</h1>
または、動的な内容を使用することもできます:
<h1>&{'hello', params.user}</h1>
考察を続けます
次: キャッシュ