2012-11-27 31 views
2

我想在播放Scala模板中格式化日期。到目前为止,我已经写到:播放2.0日期格式

<p>@DateFormat.getInstance().format(deadline)</p> 

其中截止日期是我输出到网页的日期。但是,这使用JVM的语言环境,而不是用户选择的语言环境。

我的应用程序目前支持两种语言环境,挪威语(不)和英语(en)。这适用于消息,但不适用于Date s。于是,我就加入了GlobalSettings拦截每个请求,如下图所示,但显然它从来没有被调用:

import java.lang.reflect.Method; 
import java.util.Locale; 
import org.springframework.context.i18n.LocaleContext; 
import org.springframework.context.i18n.LocaleContextHolder; 
import play.GlobalSettings; 
import play.i18n.Lang; 
import play.mvc.Action; 
import play.mvc.Http.Request; 

public class Global extends GlobalSettings { 

    @SuppressWarnings("rawtypes") 
    @Override 
    public Action onRequest(final Request request, final Method actionMethod) { 

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

是否有人有办法解决这个问题?这是Play中的已知错误吗?我使用的是2.0.4版本。

谢谢!

回答

2

我尝试了estmatic的解决方案,但它没有正确区分同一种语言的国家变体,例如,如果我的浏览器的首选语言是“en_AU”和“en_US”,那么它只会使用“ en“部分,导致美国式的日期(月份为第一),而不是澳式风格的日期(日期第一次,正确且适当)。

我的解决方案是创建一个辅助类,如下所示:

public class Formatter extends Controller { 

    private static final int DATE_STYLE = LONG; 
    private static final int TIME_STYLE = SHORT; 

    /** 
    * Formats the given Date as a date and time, using the locale of the current 
    * request's first accepted language. 
    * 
    * @param date the date to format (required) 
    * @return the formatted date 
    * @see play.mvc.Http.Request#acceptLanguages() 
    */ 
    public static String formatDateTime(final Date date) { 
     final Locale locale = getPreferredLocale(); 
     return DateFormat.getDateTimeInstance(
       DATE_STYLE, TIME_STYLE, locale).format(date); 
    } 

    private static Locale getPreferredLocale() { 
     final List<Lang> acceptedLanguages = request().acceptLanguages(); 
     final Lang preferredLanguage = acceptedLanguages.isEmpty() ? 
       Lang.preferred(acceptedLanguages) : acceptedLanguages.get(0); 
     return new Locale(preferredLanguage.language(), preferredLanguage.country()); 
    } 
} 

然后在我的Scala的模板,所有我所要做的就是使用(例如):

@import my.package.Formatter 
... 
Date = @Formatter.formatDateTime(someDate) 

这似乎更清洁而不是在模板中使用很多Locale构建逻辑。

1

那么你需要提供语言环境,当你得到你的DateFormat实例;否则它只会使用系统默认的语言环境,而不是从浏览器获得的Play。

像这样的事情似乎工作:

@DateFormat.getDateInstance(DateFormat.LONG, (implicitly[Lang]).toLocale).format(deadline) 

implicitly[Lang]位基本上是调用Lang.preferred(request.acceptLanguages()就像你在你的onRequest()方法做。

+0

太棒了!谢谢! –