2

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

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

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

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

谢谢!

4

2 回答 2

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 构造逻辑更清晰。

于 2013-05-21T11:08:08.607 回答
1

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

像这样的东西似乎有效:

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

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

于 2012-11-27T23:22:35.620 回答