Play Framework 2.0(Scala)のテンプレートの国際化ではまったのでメモ。
やりたいこと
テンプレートの文言を外部リソースに切り出したい。
で、言語に対応した文言を表示したい。とりあえず今回は日本語で。
やったこと
Messages and internationalization を参考に、こんな感じで設定。
- application.confにて、日本語を使えるように設定。
application.langs="en,ja"
ダブルクオートで囲む必要があるそうな。
- conf配下にmessges.jaファイルを作成。
key=メッセージです!
という形式で登録。
- テンプレートを修正し、messagesファイルを参照するよう修正。
@Mesasges("key")
という形式で登録。
とここで問題発生。
「メッセージです!」と表示されずに、「key」と表示されてしまいました。
messages.enファイル内でメッセージを定義しても「key」と表示されてしまう始末。
HTTPヘッダーのAccept-Languageにもja、enが含まれているのになー。
解決方法
"play framework i18n template"で検索したところ、下記を発見。
i18n error: controller and templates uses different implicit Langs
これによると、
- Messagesは、implicit paramterとしてLang型の引数(lang)を取る。そのlangは、明示的に指定されない場合、JVMのデフォルトロケールを使う。
- コントローラ内でMessagesが呼び出される際にimplicit requestが定義してあれば、そのrequestのHTTPヘッダーからAccept-Languageを取得してMessgesの引数langに暗黙的に値を設定してくれる。
- が、テンプレート内ではスコープ内にlangを見つけられないからJVMデフォルトのロケールが使われるよ。
とのこと。
対応策としては、テンプレートの引数にimplicit parameterとしてLangを付与すれば良い、ということで、viewは下記の通りになります。
(1行目が追加した箇所)
@(implicit lang: Lang)
@Mesasges("key")
こうすると、Messagesの引数に暗黙的にlangの値が渡され、今回の日本語環境の場合はmessages.jaに定義された値を表示します。