【问题标题】:playframework 2.2 java: how to set language (i18n) from subdomainplayframework 2.2 java:如何从子域设置语言(i18n)
【发布时间】:2014-02-14 17:54:51
【问题描述】:

如何在 playframework 2.2 (java) 中不仅从用户浏览器设置,而且从子域(应该具有更高优先级)设置语言(i18n)?

以下应该有效:

  • example.com -> 英语或德语,取决于浏览器设置
  • en.example.com -> 强制英语
  • de.example.com -> 强制德语

用户应该能够在不丢失会话的情况下在子域之间切换。

因为我有很多 java 控制器,所以如果解决方案在一个集中的地方工作会很棒(比如 Global.java 的过滤器可能在 scala 中)。

【问题讨论】:

    标签: java internationalization playframework-2.2


    【解决方案1】:

    您可以为此使用 play.mvc.Controller 超类的 changeLang(String code) 方法。

    然后你需要告诉你的语言解析器,哪个域使用我们默认的语言,为此使用application.conf 或数据库记录。接下来取决于您想要实现的目标,只需使用 Global 类来拦截您的所有请求,或者创建一个简单的操作来更改语言,然后他们将返回同一页面(因此用户可以自己决定他想要使用哪种语言) .

    它是某种基于 cookie 的机制,所以我不确定它是否不需要执行强制页面重新加载(即通过重定向到相同的路径)无论如何我假设你会告诉我们什么时候你会检查它;)

    编辑:

    那可能是 ie。喜欢

    public Action onRequest(final Http.Request request, final Method actionMethod) {
    
        if (request.host().equals("de.yourdomain.tld")
                && (request.cookie("PLAY_LANG") == null || !request.cookie("PLAY_LANG").value().equals("de"))) {
            return new Action.Simple() {
                public Result call(Http.Context ctx) throws Throwable {
                    ctx.changeLang("de");
                    return redirect(request.path());
                }
            };
        } else {
            return super.onRequest(request, actionMethod);
        }
    }
    

    只要确保你在application.conf 中添加了de lang,否则你会得到漂亮的、无穷无尽的重定向循环。 PLAY_LANG 是 Play 存储所选语言的典型 cookie 名称。

    【讨论】:

    • 但是如何从 Global 类和 java 中更改语言?我什至不知道如何在 onRequest 中设置 cookie。这些东西在网络框架中应该很容易......
    • 检查我的编辑...它是从我的脑海中写出来的,所以请自己验证错误
    猜你喜欢
    • 2011-08-01
    • 2011-04-30
    • 2015-08-05
    • 2012-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多