使用 Scala 播放 Framework 2.4.0 和 I18n
Posted
技术标签:
【中文标题】使用 Scala 播放 Framework 2.4.0 和 I18n【英文标题】:Play Framework 2.4.0 and I18n with Scala 【发布时间】:2015-06-11 12:51:32 【问题描述】:我有一个使用 Play Framework 2.3.8 的项目,我正在使用 Play Framework 2.4 进行迁移,但我遇到了 I18n 问题。
现在我有这样的视图代码:
@Messages("components.navbar.text")(locale.MyLang)
语言环境在哪里:
object locale
var MyLang =Lang("it")
def changeLang(newLang:String): Unit =
MyLang=Lang(newLang)
我会在不使用隐式语言的情况下维护这个结构,可能吗?
在某些情况下,我在同一页面中使用了不同的语言,在这种情况下,隐式语言既困难又无聊。
【问题讨论】:
您能否提供一个示例,说明您将如何在模板中执行此操作?听起来您可以使用标准的隐式Messages
对象,并为某些块覆盖它的语言。
【参考方案1】:
如果我正确理解您的问题,即您想覆盖用户为页面的某些块选择的语言,我会使用隐式 Messages
对象来执行此操作(对于 Play 2.4):
@()(implicit messages: Messages)
<!-- some section in the user's chosen language -->
<h1>@Messages("hello.world")</h1>
<!-- some section in a specific language -->
@defining(messages.copy(lang = play.api.i18n.Lang("it")) implicit messages =>
<h2>@Messages("something.in.italian")</h2>
也就是说,使用defining
为某些嵌套的 html 块创建新的(隐式)消息。
如果你真的想去城里(我不一定推荐这个),你可以通过隐式类将italian
方法添加到Messages
:
(在my.package.utils.i18n.MessagesExtensions.scala
):
package my.packages.utils.i18n
import play.api.i18n.Lang, Messages
implicit class MessagesExtensions(messages: Messages)
def italian = messages.copy(lang = Lang("it"))
// and an `as` method for good measure:
def as(code: String) = messages.copy(lang = Lang(code))
要在视图中进行这项工作,您需要将类添加到您的 templateImport
中的 build.sbt
:
templateImports in Compile ++= Seq(
"my.packages.utils.i18n.MessagesExtensions"
)
然后在您的模板中,您可以这样做:
@()(implicit messages: Messages)
<!-- some section in the user's chosen language -->
<h1>@Messages("hello.world")</h1>
<!-- some section in a specific language -->
@defining(messages.italian) implicit messages =>
<h2>@Messages("something.in.italian")</h2>
....
<!-- or singly, in another language -->
<h3>@Messages("another.thing.in.french")(messages.as("fr"))</h3>
但这可能有点矫枉过正,除非它真的可以为您节省大量的样板语言切换。
【讨论】:
谢谢,但我决定编写我的课程来处理翻译和 i18n,对我来说,playframework 2.4 中的新库很笨拙。我更喜欢旧版本。以上是关于使用 Scala 播放 Framework 2.4.0 和 I18n的主要内容,如果未能解决你的问题,请参考以下文章
在 Play Framework 2.4 中为 Scala 实现 Akka
在 Play Framework 2.4 中为 Scala 实现 CORS
使用 Scala 播放 Framework 2.4.0 和 I18n