§メッセージ API と多言語対応
§アプリケーションの対応言語を指定する
アプリケーションの対応言語は、fr
や en-US
のように、 ISO 639-2 言語コード の後に省略可能な ISO 3166-1 alpha-2 国コード を続けて指定します。
初めに、 conf/application/conf.
ファイルであなたのアプリケーションの対応言語を指定しましょう。
play.i18n.langs = [ "en", "en-US", "fr" ]
§メッセージの外部ファイル化
メッセージは conf/messages.xxx
のようなファイルに外部化することができます。
デフォルトの conf/messages
というファイルは、全ての言語にマッチします。このファイルに加えて conf/messages.fr
や conf/messages.en-US
のように言語ごとのメッセージファイルを指定することができます。
メッセージは、play.api.i18n.Messages
オブジェクトから取得することができます。
val title = Messages("home.title")
全ての国際化対応に関する API 呼び出しは、現在のスコープから暗黙の引数 play.api.i18n.Messages
を受け取ります。この暗黙の値は、使用言語と (原則的に) 国際化されたメッセージの両方を含んでいます。
このような暗黙の値を取得する最も簡単な方法は、I18nSupport
トレイトを使用することです。例えばコントローラーの中で次のように使用することができます。
import play.api.i18n.I18nSupport
class MyController(val messagesApi: MessagesApi) extends Controller with I18nSupport {
// ...
暗黙のスコープ内に Lang
もしくは RequestHeader
が存在する限り、I18nSupport
トレイトは暗黙の Messages
値を与えます。
メモ:
RequestHeader
が暗黙のスコープ内に存在する場合は、そのAccept-Language
ヘッダとMessagesApi
の対応言語を考慮した上で適切な言語が決定され、使用されます。 テンプレートに@()(implicit messages: Messages)
のように、暗黙のパラメータMessages
を追加する必要があります。メモ: Play はなにも設定しなくても (
DefaultMessagesApi
実装を使う)MessagesApi
をインジェクションする方法も “知って” いるので、@javax.inject.Inject
アノテーションでコントローラを注釈するだけで、Play は自動的にこのコンポーネントを結びつけることができます。
§メッセージの書式
メッセージは java.text.MessageFormat
ライブラリを使ってフォーマットされます。例えば、次のようなメッセージが定義されているとしましょう。
files.summary=The disk {1} contains {0} file(s).
このメッセージのパラメータは次のように指定できます。
Messages("files.summary", d.files.length, d.name)
§アポストロフィに対する注意
メッセージには java.text.MessageFormat
を使うので、シングルクォーテーションは引数代入をエスケープするためのメタキャラクタとして使われることに注意してください。
例えば、以下のようなメッセージが定義されているとします:
info.error=You aren''t logged in!
example.formatting=When using MessageFormat, '''{0}''' is replaced with the first parameter.
結果は以下のようになるでしょう:
Messages("info.error") == "You aren't logged in!"
Messages("example.formatting") == "When using MessageFormat, '{0}' is replaced with the first parameter."
§HTTP リクエストから対応言語を取得する
HTTP リクエストから対応言語を取得することができます。
def index = Action { request =>
Ok("Languages: " + request.acceptLanguages.map(_.code).mkString(", "))
}
Next: アプリケーションのテスト
このドキュメントの翻訳は Play チームによってメンテナンスされているものではありません。 間違いを見つけた場合、このページのソースコードを ここ で確認することができます。 ドキュメントガイドライン を読んで、お気軽にプルリクエストを送ってください。