【问题标题】:Setting implicit language in i18n Play 2.4 Scala template在 i18n Play 2.4 Scala 模板中设置隐式语言
【发布时间】:2015-08-07 12:49:44
【问题描述】:

你好 Stackoverflow 社区!

我的 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>
}

不幸的是,结果是:

  • &lt;span&gt; 元素包含首选浏览器语言:“Lang(en,)”
  • &lt;h1&gt; 元素包含我在messages.en 中写入的值

感谢您的帮助!

【问题讨论】:

标签: scala playframework internationalization playframework-2.4


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    冲突的隐式阻止完全覆盖 Play 2.4 上的消息,但我相信您可以使用下面的代码获得您大致寻找的内容。

    这是我的代码:

    我的 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>
    }
    

    【讨论】:

    • 感谢您的回答,感谢您,我发现了request.acceptLanguages。有了这个帮助,我认为我以一种更简洁的方式解决了这个问题(没有额外的课程),看看接受的答案,你可能会觉得很有趣!
    【解决方案3】:

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

    我的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 视图的代码不变。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多