播放2.0日期格式

时间:2012-11-27 18:01:30

标签: date internationalization playframework-2.0

我正在尝试在Play中格式化Scala模板中的日期。到目前为止,我已经写了这个:

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

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

我的应用目前支持两种语言环境,挪威语(不)和英语(en)。这适用于消息,但不适用于Date。所以我尝试添加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 个答案:

答案 0 :(得分: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 :(得分:1)

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

这样的事似乎有效:

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

implicitly[Lang]位基本上就像你在onRequest()方法中那样调用Lang.preferred(request.acceptLanguages()