2012-07-16 58 views
3

我在播放2.0/Java的写了一个定制DateFormatter因为默认一个似乎是国际化,不知道(的实现细节这里无关紧要)Playframework 2.0.1DateFormatter接收系统区域

public class DateFormatter extends Formatters.SimpleFormatter<Date> 

我的应用程序配置包含

application.langs="pt-br, en" 

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

从逻辑上讲,Lang.preferred(名单)返回p T-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); 
} 

BUT(和可悲的是)

的语言环境中

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

通过我的自定义DateFormatter收到是系统(JVM)区域,EN -US,而不是请求首选。

这是正常的吗?我在这里错过了什么?

+0

通过观察源代码(https://github.com/playframework/Play20/blob/master/framework/src /play/src/main/java/play/data/format/Formatters.java#L203),我认为它实际上是一个错误,因为它没有从请求中获取Locale。您应该填写一个错误(https://play.lighthouseapp.com/projects/82401-play-20/overview)。 – 2012-07-16 08:16:30

回答

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); 
    } 

} 

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

+0

谢谢你的想法。我使用了类似的解决方法,使用Lang和Context类:Context ctx = Context.current() Lang首选= Lang.preferred(ctx.request()。acceptLanguages());您的解决方案稍微好一点,因为它提供了一个中央解决方案。再次感谢。 – 2012-07-16 12:07:50

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() 
    ... 
} 
相关问题