9
を使用しています

コントローラー:国際化エラー:コントローラとテンプレートが異なる暗黙の言語

def test = Action { implicit request => 
    import play.api.i18n._ 
    val msg = Messages("error.invalid") 
    implicit val langInController = lang(request) 
    Ok(views.html.test(langInController, msg)) 
} 

ビュー:

@(langInController: play.api.i18n.Lang, msg:String)(implicit request: Request[_]) 
<div>Lang from controller: @langInController, Message: @msg</div> 
<div>Message from view: @play.api.i18n.Messages("error.required")</div> 

メッセージリソース、conf/messages.zh-CN

error.required=该字段必填 

をしよう
  1. 要求ヘッダーAccept-Language:en-us,en;q=0.5を送信してtestアクションにアクセスする英語のFirefoxを使用します。結果は次のとおりです。

    Language from controller: Lang(en,), Message: This field is required 
    Message in view: 该字段必填 
    
  2. はそれを訪問するリクエストヘッダAccept-Language:zh-CN,zh;q=0.8を送り、中国Google Chromeを使用します。結果は次のとおりです。

    Language: Lang(zh,CN), Message: 该字段必填 
    Message in view: 该字段必填 
    

テストから、我々がいることを知っている:テンプレートで使用されたリクエストヘッダのAccept-Language

  • 暗黙の言語があるから、コントローラでの暗黙の言語がある

    1. OSによって決定される。

    環境:

    1. プレイ2は、私のOSは、Windows 7のx64  中国語版

    である私がプレイ2は同じ暗黙的に使用すべきだと思うのGitHubから最新play2.1-SNAPSHOT(2012-03-16)

  • ですコントローラとビューの言語。私はBuild.sbtで何かを追加することによって、それを修正することができます:

    TemplateMixinだけである
    val main = PlayProject(...) (
        templatesImport ++= Seq("utilis.TemplateMixin._") 
    ) 
    

    object TemplateMixin extends play.api.mvc.Controller 
    

    (それはコントローラを拡張し、ちょうどimplicit def lang(request)のようないくつかのメソッドを、再利用することである。)

    をしかし、私はそれがPlayフレームワークによって行われるべきだと思います。

  • 答えて

    17

    play.api.i18n.Messages(key)関数は、タイプLangの暗黙のパラメータを追加します。したがって、Messages("foo")と書くと、Messages("foo")(l)に展開されます。ここで、lは、現在の暗黙のスコープから取られたタイプLangの値です。

    jvmのデフォルトロケールを使用して、常にdefault implicit langlow priorityを持つ)があります。

    しかし、Controllerの内部にある場合、暗黙的な要求があると、優先度の高い暗黙的な値が見つかる可能性があります。この値は、要求のヘッダーのAccept-Languageにあります。

    テンプレート内にある場合、テンプレートが別の暗黙的なlangをインポートしない限り、デフォルトの暗黙的なlangが使用されます。

    あなたの例では、コントローラから計算されたメッセージはAccept-Languageリクエストヘッダーを使用し、ビューから計算されたメッセージはjvmのデフォルトロケールを使用します。

    あなたのテンプレートにタイプLangの暗黙のパラメータを追加する場合は、このパラメータがデフォルトLANGよりも高い優先順位を持つことになりますし、メッセージを計算するために使用されます。

    @(langInController: Lang, msg:String)(implicit request: RequestHeader, lang: Lang) 
    
    <div>Lang from controller: @langInController, Message: @msg</div> 
    <div>Message from view: @Messages("error.required")</div> 
    

    テンプレートを呼ぶことにしますControllerアクションから、その暗黙的なlangが渡されるので、同じlangがビューとコントローラの両方で使用されます。

    +1

    もう一度ありがとうございます。 play2のドキュメントには良い答えが追加されるべきです。 – Freewind

    +0

    これはデフォルトの動作ではないのはなぜですか?私は、ほとんどのアプリが、ビュー内の陰的なLandをコントローラで使用されているものと同じにしたいと思っています。 – Ike

    +0

    これをデフォルトの動作にするには、(暗黙の値を提供できない)Javaコントローラで使用するテンプレートとScalaコントローラで使用するテンプレートを区別する必要があります。 –

    関連する問題