2013-07-21 65 views
2

我想允許我的Web應用程序的用戶更改當前語言(用於i18n的用途)。這是通過將語言代碼作爲HTTP GET參數附加到URL來完成的(例如/somePage?lang=en)。語言代碼然後在相應的控制器方法中解析並通過.withLang(lang)進行設置。玩!框架的.withLang(...)不立即生效

我使用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

我只是解決它通過直接使用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) 
    } 
} 
+0

這同樣適用於閃存的cookie。 –