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

时间:2015-08-07 12:49:44

标签: scala playframework internationalization playframework-2.4

Hello Stackoverflow社区!

我已经在我的Play 2.4应用程序中工作了,所以这是一个良好的开端。

我现在要做的是覆盖发送到模板的隐式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>
}

不幸的是,结果是:

  • <span>元素包含首选的浏览器语言:&#34; Lang(en,)&#34;
  • <h1>元素包含我在messages.en
  • 中写的值

感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

我做了一点点不同: 我将结果强制为查询字符串中的语言。 保持工作并在以后寻找更好的方法是一种很好的形式:

注意:我使用了&#34; MessagesApi&#34;实现它。

&#13;
&#13;
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"))
      }
  }

}
&#13;
conf/application.conf:
play.i18n.langs=["en","pt","fr"]
&#13;
@()(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>
&#13;
&#13;
&#13;

答案 1 :(得分:0)

冲突的暗示会阻止Play 2.4上的消息完全覆盖,但我相信您可以通过以下代码获得您大致想要的内容。

这是我的代码:

我的conf / Application.conf:

home.title=Svedish

我的conf / messages.sv

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

}

我的Application.scala控制器:

@()(implicit messages: IPMessages)

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

我的index.scala.html视图:

{{1}}

答案 2 :(得分:0)

这是我开始工作的最干净的方式:

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视图的代码未更改。