【问题标题】:Play 2.4.x how use Messages and not MessagesApi I18N玩 2.4.x 如何使用 Messages 而不是 MessagesApi I18N
【发布时间】:2015-09-03 17:47:39
【问题描述】:

我在play I18N guide 上做了一些不同于国际化指南的工作

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

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

【问题讨论】:

  • 有什么问题?
  • 最好的方法是什么?它太硬编码了

标签: scala playframework internationalization playframework-2.4


【解决方案1】:

如果您将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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多