播放 2.4.x 如何使用 Messages 而不是 MessagesApi I18N
Play 2.4.x how use Messages and not MessagesApi I18N
处做了一些与国际化指南不同的事情
我将结果强制为查询字符串中的语言,它有效,但需要在 "correct way" 中完成。
这是一个很好的形式,可以保留工作并在以后寻找更好的方法:
注意:我使用 "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>
conf/application.conf
play.i18n.langs = [ "en", "pt","fr" ]
如果您将 I18nSupport
特性混合到您的控制器中,那么您在作用域中有一个 implicit conversion,它将 RequestHeader
转换为 Messages
实例。如果您查看 request2Messages
方法,您会发现它调用了 MessagesApi.preferred(request: RequestHeader)
方法。
因此,在您的情况下,您必须创建 DefaultMessagesApi
的子类并重写 MessagesApi.preferred 方法以从控制器中当前实现的查询字符串中检索 Lang
。然后你可以将你的实例绑定到 MessagesApi
特征,这样它就会自动注入。
要绑定您的实例,您应该创建自己的 I18nModule
,类似于 Play 提供的 default。
注意:仅用于 Guice 注入,因为它是 Play 使用的默认方法。对于编译时 DI,您必须遵循 another approach.
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]
)
}
}
那么您必须禁用默认的 Play I18nModule
模块并启用您的模块。
play.modules.disabled += "play.api.i18n.I18nModule"
play.modules.enabled += "modules.I18nModule"
现在在您的模板中,您必须只传递隐式 Messages
实例。
@()(implicit messages: Messages)
我将结果强制为查询字符串中的语言,它有效,但需要在 "correct way" 中完成。 这是一个很好的形式,可以保留工作并在以后寻找更好的方法:
注意:我使用 "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>
conf/application.conf
play.i18n.langs = [ "en", "pt","fr" ]
如果您将 I18nSupport
特性混合到您的控制器中,那么您在作用域中有一个 implicit conversion,它将 RequestHeader
转换为 Messages
实例。如果您查看 request2Messages
方法,您会发现它调用了 MessagesApi.preferred(request: RequestHeader)
方法。
因此,在您的情况下,您必须创建 DefaultMessagesApi
的子类并重写 MessagesApi.preferred 方法以从控制器中当前实现的查询字符串中检索 Lang
。然后你可以将你的实例绑定到 MessagesApi
特征,这样它就会自动注入。
要绑定您的实例,您应该创建自己的 I18nModule
,类似于 Play 提供的 default。
注意:仅用于 Guice 注入,因为它是 Play 使用的默认方法。对于编译时 DI,您必须遵循 another approach.
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]
)
}
}
那么您必须禁用默认的 Play I18nModule
模块并启用您的模块。
play.modules.disabled += "play.api.i18n.I18nModule"
play.modules.enabled += "modules.I18nModule"
现在在您的模板中,您必须只传递隐式 Messages
实例。
@()(implicit messages: Messages)