玩!框架.withLang(...)不立即生效

时间:2013-07-21 10:20:10

标签: scala internationalization playframework-2.0

我想允许我的网络应用程序的用户更改当前语言(用于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应用程序的语言将永久切换为英语。但是,这仅适用于后续页面。当前页面仍以旧语言提供:

  1. 致电/somePage1:以默认语言提供
  2. 致电/somePage2?lang=en:仍以默认语言提供
  3. 致电/somePage3:英语服务
  4. 为什么语言变化不会立即生效?

1 个答案:

答案 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)
  }
}