Documentation

You are viewing the documentation for Play 1. The documentation for Play 2 is here.

国際化

国際化 (I18N) とは、アプリケーションを異なる言語に適応させ、地域の差異を吸収することを意味します。アプリケーションを国際化対応可能にするためには、以下の手順に従ってください。

使用するのは UTF-8 だけ!

Play はたったひとつの文字エンコーディングをサポートします: UTF-8 です。文字エンコーディングの問題は異様で扱いが難しいので、Play は、ただひとつの文字エンコーディングをサポートすることを選択しました。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>

考察を続けます

次:
キャッシュ