2015-04-22 6 views
5

Hier ist meine routes Datei:I18n im Play-Framework 2.4.0

GET /:lang  controller.Application.index(lang: String) 
GET /:lang/news controller.Application.news(lang: String) 

Beachten Sie, dass alle von ihnen mit /:lang beginnen.

Derzeit schreibe ich Application.scala als

def index(lang: String) = Action { 
    implicit val messages: Messages = play.api.i18n.Messages.Implicits.applicationMessages(
    Lang(lang), play.api.Play.current) 
    Ok(views.html.index("title")) 
} 

Auf diese Weise habe ich so viele implicit Messages als Action zu schreiben. Gibt es dafür eine bessere Lösung?

Antwort

1

Passing nur Lang ist einfacher Option:

def lang(lang: String) = Action { 
    Ok(views.html.index("play")(Lang(lang))) 
} 

//template 
@(text: String)(implicit lang: play.api.i18n.Lang) 
@Messages("hello") 

Sie einige Code mithilfe von Aktions Zusammensetzung wiederverwenden können, wickelte Anfrage und Aktion definieren:

case class LocalizedRequest(val lang: Lang, request: Request[AnyContent]) extends WrappedRequest(request) 

def LocalizedAction(lang: String)(f: LocalizedRequest => Result) = { 
    Action{ request => 
     f(LocalizedRequest(Lang(lang), request)) 
    } 
} 

Jetzt können Sie LocalizedAction wie diese wiederverwenden :

//template 
@(text: String)(implicit request: controllers.LocalizedRequest) 
@Messages("hello") 

//controller 
def lang(lang: String) = LocalizedAction(lang){implicit request => 
    Ok(views.html.index("play")) 
} 
+0

Es scheint gut, aber ist es irgendwie möglich, nur '@Messages (" Hallo ")' in Vorlage zu schreiben? –

+0

Ja, in beiden Fällen können Sie die zweite Klammer weglassen nach '@Messages (" Hallo ")', ich habe Antwort – Infinity

+1

bearbeitet Der erste Fall funktioniert gut. Aber im zweiten Fall muss ich '@Messages (" Hallo ") schreiben (request.messages)' oder ich bekomme einen Kompilierungsfehler 'konnte keinen impliziten Wert für Parameter-Nachrichten finden: play.api.i18n.Messages' . P.S. In Play 2.4 wurde der zweite Parameter von 'Messages' durch' play.api.i18n.Messages' ersetzt. –

0

Schließlich löste ich dieses Problem in der folgenden Weg.

Wie @Infinity vermuten lässt, definiert Ich wickelte Anfrage und Wirkung wie:

case class LocalizedRequest(messages: Messages, 
          request: Request[AnyContent]) 
    extends WrappedRequest(request) 


object Actions { 
    def LocalizedAction(lang: String)(f: LocalizedRequest => Result) = { 
    Action { request => 
     f(LocalizedRequest(applicationMessages(Lang(lang), current), request)) 
    } 
    } 

    object Implicits { 
    implicit def localizedRequest2Messages(implicit request: LocalizedRequest): Messages = request.messages 
    } 
} 

Jetzt bin ich in der Lage LocalizedAction wie folgt zu verwenden:

def lang(lang: String) = LocalizedAction(lang) { implicit request => 
    Ok(views.html.index("play")) 
} 

Um jedoch die implicit wegzulassen Parameter von Messages, die eine play.api.i18n.Messages sein sollte, fügte ich eine Zeile zu meiner Vorlage hinzu:

@import controllers.Actions.Implicits._ 
+1

Es kann hilfreich sein. Stattdessen platzieren Sie '@import controllers.Actions.Implicits._' überall, Sie können' TwirlKeys.templateImports ++ = Seq ("controllers.Actions.Implicits ._") 'in build.sbt setzen. – HEX