2015-04-22 2 views
5

Вот мой routes файл:I18n в Play Framework 2.4.0

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

Обратите внимание, что все они начинаются с /:lang.

В настоящее время я пишу Application.scala в

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")) 
} 

Таким образом, я должен написать столько implicit Messages, как Action. Есть ли лучшее решение для этого?

ответ

1

Передача только Lang проще вариант:

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

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

Вы можете повторно использовать код, используя состав действий, определить обернутый запрос и действие:

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

Теперь вы можете повторно использовать LocalizedAction как это :

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

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

Кажется хорошим, но как-то можно написать только '@Messages (" hello ")' в шаблоне? –

+0

Да, в обоих случаях вы можете опустить вторую скобку после '@Messages (« hello »)', я отредактировал ответ – Infinity

+1

Первый случай работает отлично. Но во втором случае я должен написать '@Messages (« hello ») (request.messages)' или я получу ошибку компиляции 'не смог найти неявное значение для сообщений параметров: play.api.i18n.Messages' , Постскриптум в игре 2.4 второй параметр 'Messages' был заменен на' play.api.i18n.Messages'. –

0

И наконец, я решил эту проблему в следующий способ.

Как следует @Infinity, я определил, завернутые запрос и действие, как:

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 
    } 
} 

Теперь я могу использовать LocalizedAction так:

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

Однако для того, чтобы опускать implicit параметр Messages, который должен быть play.api.i18n.Messages, я добавил строку в мой шаблон:

@import controllers.Actions.Implicits._ 
+1

Это может быть полезно. Вместо этого размещайте '@import controllerlers.Actions.Implicits._' всюду, вы можете установить' TwirlKeys.templateImports ++ = Seq ("controllers.Actions.Implicits ._") 'в build.sbt. – HEX

Смежные вопросы