更具体地说,我需要允许在url中传递区域设置然后更改区域设置。这应该是一个全局行为,必须在调用任何操作之前发生,以便区域设置更改从当前请求生效。
GlobalSettings.onRequest()
尚未绑定Http.Context
,据我所知,它没有用于更改该阶段的语言环境的API。
我可以有一个更改语言环境的操作,但我不知道如何将其设置为全局,以便所有请求首先转到该操作,并且我不想注释每个控制器,因为它很容易被遗忘。
我正在使用Play框架2.1.2,任何指针都会受到赞赏。
答案 0 :(得分:5)
有几种选择。
http://www.playframework.com/documentation/2.1.2/JavaActionsComposition
使用以下
覆盖GlobalSettings.onRequest @Override
public Action onRequest(Request request, Method actionMethod) {
return new Action.Simple() {
public Result call(Context ctx) throws Throwable {
**//do your lang changing stuff**
return delegate.call(ctx);
}
};
}
答案 1 :(得分:0)
我不确定您是否使用scala或java。
这是在scala中完成语言字段标题更新的一种方法:
import play.api.mvc.{Headers, Handler, RequestHeader}
import play.api.http.HeaderNames
import play.api.GlobalSettings
object Global extends GlobalSettings {
val LangQueryString = "lang"
def updateLanguageHeader(lang: String)(request: RequestHeader) =
request.copy(
headers = new Headers {
val data = (request.headers.toMap + (HeaderNames.ACCEPT_LANGUAGE -> Seq(lang))).toList
})
def remLangQueryString(request: RequestHeader) =
request.copy(
queryString = request.queryString - LangQueryString)
def updateLangFromQueryString(request: RequestHeader) =
request.getQueryString(LangQueryString) match {
case Some(lang) =>
(updateLanguageHeader(lang) _ andThen remLangQueryString)(request)
case _ =>
request
}
override def onRouteRequest(request: RequestHeader): Option[Handler] = {
super.onRouteRequest(updateLangFromQueryString(request))
}
}