我想允许我的网络应用程序的用户更改当前语言(用于i18n目的)。这是通过将语言代码作为HTTP GET参数(例如/somePage?lang=en
)附加到URL来完成的。然后在相应的控制器方法中解析语言代码,并通过.withLang(lang)
进行设置。
我正在使用action composition来提供此功能并避免使用样板代码:
def withLang(f: => Request[AnyContent] => Result) = Action { implicit request =>
request.getQueryString("lang").flatMap(Lang.get(_)) match {
case Some(lang) => f(request).withLang(lang)
case None => f(request)
}
}
然后可以如下使用该组合物:
def somePage = withLang { implicit request =>
//do some stuff
Ok(views.html.somePage())
}
此解决方案正常。如果我拨打/somePage?lang=en
,Web应用程序的语言将永久切换为英语。但是,这仅适用于后续页面。当前页面仍以旧语言提供:
/somePage1
:以默认语言提供/somePage2?lang=en
:仍以默认语言提供/somePage3
:英语服务为什么语言变化不会立即生效?
答案 0 :(得分:4)
我刚刚使用Redirect
解决了问题,而不是直接渲染页面:
def withLang(f: => Request[AnyContent] => Result) = Action { implicit request =>
val referrer = request.headers.get(REFERER).getOrElse("/")
request.getQueryString("lang").flatMap(Lang.get(_)) match {
case Some(lang) => Redirect(referrer).withLang(lang)
case None => f(request)
}
}