在 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>
}
很遗憾,结果是:
<span>
元素包含首选浏览器语言:"Lang(en,)"
<h1>
元素包含我在 messages.en
中写入的值
感谢您的帮助!
相互冲突的隐式阻止在 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>
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>
}
很遗憾,结果是:
<span>
元素包含首选浏览器语言:"Lang(en,)"<h1>
元素包含我在messages.en
中写入的值
感谢您的帮助!
相互冲突的隐式阻止在 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>