消息无法在生产中使用的国际化 - Play Framework

时间:2018-02-20 14:55:42

标签: scala playframework internationalization

我正在运行Play Framework(2.3)+ Scala应用程序,我刚刚开始翻译它。

我有以下配置:

application.langs="en,es"

还有message和messages.es文件。我希望应用程序根据浏览器的语言显示消息,因此我将其更改为ES。

当我在电脑上运行时,一切看起来都很好,但是一旦部署它就无法正常工作。我已经检查过local和prod的conf文件都有相同的值。我还检查了请求的Accept-Language参数,它包含“es”。浏览器仍在ES中。

我想也许我可以在application.langs中更改语言的顺序,但我希望“en”成为我的默认语言。

任何人都可以帮助我吗?

更新

我已经部署了一个修改,它打印了lang的值:

@()(implicit lang: Lang)
@import play.api.Play.current

[...]

lang = @lang.code,
date = @(new java.util.Date().format("yyyy-MM-dd HH:mm"))

我在localhost和prod中获得了不同的结果:

  • Localhost:lang = es-ES,date = 2018-02-20 16:37
  • 生产:lang = en-US,date = 2018-02-20 16:44

似乎在localhost中,语言被正确覆盖了浏览器语言,但在生产中却没有。这有意义吗?

更新2:

所以,我一直在测试一些理论......我认为它可能不是Play Framework的东西。这是我发现的:

  1. 在localhost中运行应用程序,我更改了浏览器的语言=>应用程序的语言不会改变,它会一直显示ES
  2. 将application.langs中的“es”替换为“fr”应用程序在EN中显示时,浏览器的语言无关紧要
  3. 将messages.es重命名为messages.fr(内容保存在ES中)也无效,该应用程序显示在EN中。
  4. 在这些测试中,@ lang.code的值始终相同:lang = es-ES。另一方面,Lang.applicables从步骤1变为2:langList = Lang(en,)Lang(fr,)。

    我从中收集到的是,我在应用程序中设置的语言并不重要,还有另一个地方设置Lang并且巧合,它在localhost中设置为es-ES,在生产中设置为en-US 。它可能与服务器的Locale有关。这可以改变吗?

1 个答案:

答案 0 :(得分:0)

解决了!我在模板中添加了一个隐式参数Lang,因此它将从请求标头Accept-Languages中获取值。然后我看到@ lang.code改为“es”!

为了清楚起见,你需要将这个隐含Lang添加到你的所有模板中,否则它将回到“默认”Lang,我仍然不确定它来自何处。所以我有一个调用@header(),@ footer()等的main.scala.html。我将隐含添加到所有这些中:

@()(content: Html)(implicit lang: Lang)
<!DOCTYPE html>
<html>
    <head>
        [...]
        @analytics()
    </head>
    <body>
        <div id="header">
            @header()
        </div>
        @content
        @footer()
    </body>
</html>
相关问题