播放2.4.x如何使用消息而不是MessagesApi I18N

Alv*_*oao 2 scala internationalization playframework playframework-2.4

I18N指南中,我与国际化指南有所不同

我将结果强制为查询字符串中的语言,它可以工作,但需要以"正确的方式"完成.保持工作并在以后寻找更好的方法是一种很好的形式:

注意:我使用"MessagesApi"来实现它.

请看下面的代码:

package controllers
import play.api._
import play.api.mvc._
import play.api.i18n.I18nSupport
import play.api.i18n.Messages.Implicits._
import play.api.i18n.MessagesApi
import javax.inject.Inject
import play.api.i18n.Lang
import play.api.i18n._
class Application  @Inject() ( val messagesApi: MessagesApi) extends   Controller with I18nSupport {

def index = Action {  implicit request =>
            request.getQueryString("lang") match{
        case Some(lang) =>  messagesApi.setLang(Ok(views.html.index()(messagesApi,Lang(lang))),Lang(lang))
        case None => messagesApi.setLang(Ok(views.html.index()(messagesApi,Lang("en"))),Lang("en"))
    }
}}
Run Code Online (Sandbox Code Playgroud)

index.scala.html

 @()(implicit message: MessagesApi ,l: Lang)
 <li><a href="./?lang=en"><img src="@routes.Assets.versioned("images/BR.png")" /></a></li>
 <li><a href="./?lang=en"><img src="@routes.Assets.versioned("images/US.gif")" /></a></li>
 <header>
    <h1>@message("intro")</h1>
 </header>
    <p>@Html(message("description"))</p>
Run Code Online (Sandbox Code Playgroud)

CONF/application.conf

 play.i18n.langs = [ "en", "pt","fr" ]
Run Code Online (Sandbox Code Playgroud)

akk*_*kie 8

如果将I18nSupport特征混合到控制器中,则在范围内进行隐式转换,将转换RequestHeaderMessages实例.如果您查看该request2Messages方法,则可以看到它调用该MessagesApi.preferred(request: RequestHeader)方法.

因此,在您的情况下,您必须创建一个子类DefaultMessagesApi并覆盖MessagesApi.preferred方法,以检索Lang当前在控制器中实现的查询字符串.然后,您可以将实例绑定到MessagesApi特征,以​​便自动注入.

要绑定您的实例,您应该创建自己的I18nModule类似于Play提供的默认实例.

注意:仅适用于Guice Injection,因为它是Play使用的默认方法.对于编译时间DI,您必须遵循另一种方法.

package modules

import play.api.i18n._
import play.api.{Configuration, Environment}
import play.api.inject.Module

class I18nModule extends Module {
  def bindings(environment: Environment, configuration: Configuration) = {
    Seq(
      bind[Langs].to[DefaultLangs],
      bind[MessagesApi].to[YourMessagesApi]
    )
  }
}
Run Code Online (Sandbox Code Playgroud)

然后,您必须禁用默认播放I18nModule模块并启用您的模块.

play.modules.disabled += "play.api.i18n.I18nModule"
play.modules.enabled += "modules.I18nModule"
Run Code Online (Sandbox Code Playgroud)

现在,在模板中,您必须只传递隐式Messages实例.

 @()(implicit messages: Messages)
Run Code Online (Sandbox Code Playgroud)