2

我想允许我的 Web 应用程序的用户更改当前语言(用于i18n目的)。这是通过将语言代码作为 HTTP GET 参数(例如/somePage?lang=en)附加到 URL 来完成的。然后在相应的控制器方法中解析语言代码并通过.withLang(lang).

我正在使用动作组合来提供此功能并避免样板代码:

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. call /somePage1: 以默认语言提供服务
  2. call /somePage2?lang=en: 仍以默认语言提供服务
  3. 电话/somePage3:用英语服务

为什么语言更改没有立即生效?

4

1 回答 1

4

我只是通过使用 aRedirect而不是直接渲染页面来解决它:

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)
  }
}
于 2013-07-21T10:46:31.463 回答