2016-12-30 1 views
0

Ich verwende einfache Middleware die ResultZuerst im Play 2.3.x machen nicht korrekte Sprache nicht verwendet

object WithLanguage extends ActionFunction[User, User] { 
    def invokeBlock[A](request: User[A], block: (User[A]) => Future[Result]): Future[Result] = { 
     if(request.cookies.get(Play.langCookieName).isEmpty){ 
     val lang: Lang = Lang.get(request.user.language).getOrElse(play.api.i18n.Lang.preferred(request.acceptLanguages)) 
     block(request).withLang(lang)) 

     } else { 
     block(request) 
     } 
    } 
    } 

Aber die erste Antwort nicht mit der entsprechenden Sprache wiedergegeben zu aktualisieren - auf Refresh ja.

Ich kann es durch eine kreisförmige Umleitung im Falle der Einrichtung eines neuen Cookie Future(Redirect(request.uri).withLang(...) zur Arbeit arbeiten, aber ich frage mich, ob es einen saubereren Weg gibt.

+0

Haben Sie versucht, die Anfrage vor dem Aufruf des Blocks zu ändern? Block (request.withLang (lang)) – mavarazy

+0

Dank @mavarazy ja die Anfrage hat nicht die Methode 'withLang' nur das Ergebnis tut – tgk

+1

Können Sie Anfrage ändern und einen Cookie setzen, vor der Verarbeitung im Block? – mavarazy

Antwort

0

Das funktioniert ... Es ist möglich, die Anfrage Header zwingend zu ändern, aber das Schreiben dieser Art fühlt sich falsch an.

object WithLanguage extends ActionFunction[User, User] { 
    def invokeBlock[A](request: User[A], block: (User[A]) => Future[Result]): Future[Result] = { 
     if(request.cookies.get(Play.langCookieName).isEmpty){ 
     val cookies = Cookies(request.headers.get(COOKIE)).cookies + (Play.langCookieName -> Cookie(Play.langCookieName, request.user.language.code)) 
     val updatedHeaders = new Headers { 
      val data: Seq[(String, Seq[String])] = (request.headers.toMap + (COOKIE -> Seq(Cookies.encode(cookies.values.toSeq)))).toSeq 
     } 
     val modifiedRequest = User(
      user = request.user, 
      request = Request(request.copy(headers = updatedHeaders), request.body) 
     ) 
     block(modifiedRequest).map(_.withLang(request.user.language)) // redundant cookie set on result 
     } else { 
     block(request) 
     } 
    } 
    } 
Verwandte Themen