在 i18n Play 2.4 Scala 模板中设置隐式语言

Setting implicit language in i18n Play 2.4 Scala template

Whosebug 社区您好!

我的 Play 2.4 应用程序中有 i18n,所以这是一个好的开始。

我现在要做的是覆盖发送到模板的隐式 Lang。例如,如果 IP 地址位于瑞典,我想将隐式 Lang 设置为瑞典语,而不管浏览器中设置的首选语言是什么。如何做到这一点?

这是我的代码:

我的Application.scala控制器:

package controllers

import javax.inject.Inject

import play.api.i18n.{I18nSupport, Lang, MessagesApi}
import play.api.mvc._

class Application @Inject() (val messagesApi: MessagesApi) extends Controller with I18nSupport {
  def index = Action { implicit request =>
    if (isIpAddressLocatedInSweden) {
      implicit val langFromIp = Lang.apply("sv")
      Logger.info("Language set to Swedish")
    }

    Ok(views.html.index())
  }

  private def isIpAddressLocatedInSweden: Boolean = {
    [...]
  }
}

我的 index.scala.html 观点:

@()(implicit messages: Messages, lang: Lang)

@main("Page Title") {
<span>@lang.toString()</span>
<h1>@Messages("home.title")</h1>
}

很遗憾,结果是:

感谢您的帮助!

相互冲突的隐式阻止在 Play 2.4 上完全覆盖 Messages,但我相信您可以使用下面的代码得到您大致想要的东西。

这是我的代码:

我的conf/Application.conf:

# The application languages
# ~~~~~
play.i18n.langs = [ "en", "sv" ]

我的conf/messages.sv

home.title=Svedish

我的 Application.scala 控制器:

package controllers

import javax.inject.Inject

import play.api.i18n.{I18nSupport, Lang, MessagesApi}
import play.api.mvc._

class IPMessages(lang: Lang, messages: MessagesApi) extends play.api.i18n.Messages(lang, messages){}

class Application @Inject() (val messagesApi: MessagesApi) extends Controller with I18nSupport {
  def index = Action { implicit request =>
    val langFromIp = if (isIpAddressLocatedInSweden) {
       new Lang("sv") 
    } else {
        request.acceptLanguages.head
    }
    implicit val ipMessages: IPMessages = new IPMessages(langFromIp, messagesApi) 
    Ok(views.html.index())
  }

  private def isIpAddressLocatedInSweden: Boolean = true

}

我的 index.scala.html 观点:

@()(implicit messages: IPMessages)

@main("Page Title") {
<span>@messages.toString()</span>
<h1>@messages("home.title")</h1>
}

这是我让它工作的最干净的方式:

我的 Application.scala 控制器代码:

class Application @Inject()(val messagesApi: MessagesApi) extends Controller with I18nSupport {
  def index = Action { implicit request =>
    val lang = if (isIpAddressLocatedInSweden) {
      Lang.apply("sv")
    } else {
      Lang.preferred(request.acceptLanguages)
    }

    Ok(views.html.index()).withLang(lang)
  }

  private def isIpAddressLocatedInSweden: Boolean = {
    [...]
  }
}

index.scala.html视图的代码没有改变。

我做了一些不同的事情: 我将结果强制为查询字符串中的语言。 这是一个很好的形式,可以保留工作并在以后寻找更好的方法:

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

}
conf/application.conf:
play.i18n.langs=["en","pt","fr"]
@()(implicit message: MessagesApi ,l: Lang)
<header>
  <li>
    <!-- change the language -->
    <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>
  <h1>@message("intro")</h1>
</header>
<p>@Html(message("description"))</p>
<p>@Html(message("description.education"))</p>