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

Scala 播放2.4.x如何使用消息而不是消息SAPI I18N,scala,playframework,internationalization,playframework-2.4,Scala,Playframework,Internationalization,Playframework 2.4,我做了一些不同于国际化指南的工作,在 我将结果强制转换为查询字符串中的语言,它可以工作,但需要以“正确的方式”完成。 这是一种很好的形式,可以保留工作并在以后寻找更好的方法: 注意:我使用了“MessagesApi”来实现它 请参阅下面的代码: package controllers import play.api._ import play.api.mvc._ import play.api.i18n.I18nSupport import play.api.i18n.Messages.Impl

我做了一些不同于国际化指南的工作,在

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

注意:我使用了“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"))
    }
}}
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>

如果您将
I18nSupport
特性混合到控制器中,那么您就有了一个in范围,可以将
RequestHeader
转换为
消息
实例。如果查看
request2Messages
方法,则可以看到它调用
MessagesApi.preferred(request:RequestHeader)
方法

因此,在您的情况下,您必须创建
DefaultMessagesApi
的子类,并重写从查询字符串中检索
Lang
的方法,就像当前在控制器中实现的那样。然后,您可以将实例绑定到
MessagesApi
trait,以便自动注入它

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

注意:仅用于Guice注入,因为它是Play使用的默认方法。对于编译时DI,您必须遵循

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

play.modules.disabled += "play.api.i18n.I18nModule"
play.modules.enabled += "modules.I18nModule"
现在,在模板中,只能传递隐式
消息
实例

 @()(implicit messages: Messages)

问题是什么?最好的方法是什么?太硬了
play.modules.disabled += "play.api.i18n.I18nModule"
play.modules.enabled += "modules.I18nModule"
 @()(implicit messages: Messages)