我在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,而不是请求首选区域。
这是正常的吗?我在这里缺少什么?
答案 0 :(得分:2)
我认为您可以使用此解决方法:
对于每个请求,使用Global interceptor,您可以设置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);
}
}
我没有测试它,但值得拍摄: - )
答案 1 :(得分:0)
遗憾的是,nico ekito提到的全局覆盖在Play 2.2中不是可靠的解决方案,可能是因为线程。我的经验是,语言环境有时是不正确的,格式化程序工作不可预测(有时用其他语言格式化然后在上下文中设置)。
所以基本上John Smith的最终解决方案更加可靠。不使用格式化程序方法参数中传递的语言环境,而是使用上下文语言环境:
public Date parse(String date, Locale locale) {
Context context = Context.current();
Lang preferred = Lang.preferred(context.request().acceptLanguages());
Locale contextLocale = preferred.toLocale()
...
}