2012-07-16 41 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() 
    ... 
}