我正在尝试在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版本。
谢谢!
答案 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()
。