Internationalization Playframework 2.0.1数据格式化程序接收系统区域设置

Internationalization Playframework 2.0.1数据格式化程序接收系统区域设置,internationalization,playframework-2.0,Internationalization,Playframework 2.0,我在Play2.0/Java中编写了一个定制的DateFormatter,因为默认的DateFormatter似乎是i18n不知道的(这里的实现细节无关紧要) 浏览器选项中定义的语言包含这两种(接受语言) 从逻辑上讲,Lang.preferred(List)返回pt br作为首选语言,如中所示 @Override public Action onRequest(Request request, Method method) { Lang preferred = Lang.preferr

我在Play2.0/Java中编写了一个定制的DateFormatter,因为默认的DateFormatter似乎是i18n不知道的(这里的实现细节无关紧要)

浏览器选项中定义的语言包含这两种(接受语言)

从逻辑上讲,Lang.preferred(List)返回pt br作为首选语言,如中所示

@Override
public Action onRequest(Request request, Method method) {

    Lang preferred = Lang.preferred(request.acceptLanguages());
    Logger.debug("Preferred language is " + preferred.toLocale());

    return super.onRequest(request, method);
}
但是(很遗憾)

我的自定义日期格式化程序在中接收的区域设置

@Override
public Date parse(String date, Locale locale)  {
    ...
}
系统的(JVM)区域设置,在美国,而不是请求首选区域设置


这正常吗?我缺少什么?

我认为您可以使用以下解决方法:

对于每个请求,可以使用设置LocaleContextHolder来设置请求的语言环境:

public class Global extends GlobalSettings {

    @Override
    public Action onRequest(final Request request, Method actionMethod) {
        LocaleContextHolder.setLocaleContext(new LocaleContext() {
            public Locale getLocale() {
                            Lang preferred = Lang.preferred(request.acceptLanguages());
                return preferred.toLocale();
            }
        });
        return super.onRequest(request, actionMethod);
    }

}

我没有测试它,但值得一试:-)

很遗憾,nico ekito提到的全局覆盖在Play 2.2中不是可靠的解决方案,可能是因为线程。我的经验是,区域设置有时不正确,格式化程序工作不可预测(有时使用其他语言格式化,然后在上下文中设置)

因此,约翰·史密斯的最终解决方案基本上更加可靠。不要使用在formatter方法参数中传递的区域设置,而是使用其中的上下文区域设置:


通过查看源代码(),我认为它实际上是一个bug,因为它没有从请求中获取语言环境。您应该填充bug()。谢谢您的想法。我使用Lang和Context类使用了类似的解决方法:Context ctx=Context.current()Lang preferred=Lang.preferred(ctx.request().acceptLanguages());您的解决方案要好一点,因为它提供了一个中心解决方案。再次感谢。
@Override
public Date parse(String date, Locale locale)  {
    ...
}
public class Global extends GlobalSettings {

    @Override
    public Action onRequest(final Request request, Method actionMethod) {
        LocaleContextHolder.setLocaleContext(new LocaleContext() {
            public Locale getLocale() {
                            Lang preferred = Lang.preferred(request.acceptLanguages());
                return preferred.toLocale();
            }
        });
        return super.onRequest(request, actionMethod);
    }

}
public Date parse(String date, Locale locale)  {
    Context context = Context.current();
    Lang preferred = Lang.preferred(context.request().acceptLanguages());
    Locale contextLocale = preferred.toLocale()
    ...
}