2012-11-27 48 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

太棒了!謝謝! –