2012年4月15日日曜日

Play Framework 2.0を学ぶ:その2 テンプレートのi18nではまった

Play Framework 2.0(Scala)のテンプレートの国際化ではまったのでメモ。

やりたいこと

テンプレートの文言を外部リソースに切り出したい。
で、言語に対応した文言を表示したい。とりあえず今回は日本語で。


やったこと

Messages and internationalization を参考に、こんな感じで設定。

  1. application.confにて、日本語を使えるように設定。
  2. application.langs="en,ja"
    
    ダブルクオートで囲む必要があるそうな。
  3. conf配下にmessges.jaファイルを作成。
    key=メッセージです!
    
    という形式で登録。
  4. テンプレートを修正し、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に定義された値を表示します。

0 件のコメント:

コメントを投稿