3

我在 Play 2.0 / Java 中编写了一个自定义 DateFormatter,因为默认的似乎是 i18n-unaware (实现细节在这里无关紧要)

public class DateFormatter extends Formatters.SimpleFormatter<Date>

我的应用程序配置包含

application.langs="pt-br, en"

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

逻辑上, 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);
}

但是(可悲的是)

我的自定义 DateFormatter 收到的语言环境

@Override
public Date parse(String date, Locale locale)  {
    ...
}

系统的 (JVM) 语言环境,en-US,而不是请求首选的语言环境。

这是正常的吗?我在这里想念什么?

4

2 回答 2

2

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

对于每个请求,使用全局拦截器,您可以设置 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);
    }

}

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

于 2012-07-16T09:02:13.443 回答
0

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

所以基本上约翰史密斯的最终解决方案要可靠得多。不要使用在格式化程序方法参数中传递的语言环境,而是使用那里的上下文语言环境:

public Date parse(String date, Locale locale)  {
    Context context = Context.current();
    Lang preferred = Lang.preferred(context.request().acceptLanguages());
    Locale contextLocale = preferred.toLocale()
    ...
}
于 2014-03-28T22:51:32.340 回答