我知道可以将更好的语言设置为与代码进行会话
Ok(views.html.index()).withLang(lang)但它仅适用于下一个请求和当前请求用户获取默认语言的页面。 我试过这样可能:
implicit val lang = Lang("de") Ok(views.html.index("Homepage"))没有成功。 实现这一目标的正确方法是什么? 以下是观点:
@(message: String)(implicit messages: Messages) @main(message) { @messages("admin.area.enter") }I know it is possible to set preferable language to session with code
Ok(views.html.index()).withLang(lang)But it will work only on next request and on the current request user get page in default language. I've tried make it possible like this:
implicit val lang = Lang("de") Ok(views.html.index("Homepage"))without success. What is a correct way to achieve this? Here is the view:
@(message: String)(implicit messages: Messages) @main(message) { @messages("admin.area.enter") }最满意答案
有关国际化的Play 2.4文档说明
“此外,Play知道如何注入MessagesApi值(使用DefaultMessagesApi实现),因此您只需使用@ javax.inject.Inject注释注释您的控制器,然后让Play自动为您组合连接。”
像这样的东西
控制器:
class FooController @Inject() (val messagesApi: MessagesApi) extends Controller with I18nSupport { def index() = Action { implicit request => Ok(views.html.index()) } }模板:
@()(implicit messages: Messages, lang: Lang) Messages says @messages("hello.msg")如果您希望实现语言选择器组件,那么这个答案可能会有所帮助
Play 2.4和Scala 2.11.6中的语言选择器
下面是一个复合动作的示例,它修改了请求标头。
object LanguageAction extends ActionBuilder[Request] { def invokeBlock[A](request: Request[A], block: (Request[A]) => Future[Result]) = { val newRequest = new WrappedRequest[A](request) { //calculate from request url val lang = Lang("fr") override lazy val acceptLanguages = Seq(lang) } block(newRequest) } }控制器:
class FooController @Inject() (val messagesApi: MessagesApi) extends Controller with I18nSupport { def index() = LanguageAction { implicit request => Ok(views.html.index()) } }视图:
@()(implicit messages: Messages, lang: Lang) @messages("foo.bar")The Play 2.4 documentation on internationalization states
"Also, Play knows out of the box how to inject a MessagesApi value (that uses the DefaultMessagesApi implementation), so you can just annotate your controller with the @javax.inject.Inject annotation and let Play automatically wire the components for you."
Something like this
Controller:
class FooController @Inject() (val messagesApi: MessagesApi) extends Controller with I18nSupport { def index() = Action { implicit request => Ok(views.html.index()) } }Template:
@()(implicit messages: Messages, lang: Lang) Messages says @messages("hello.msg")If you wish to implement a language picker component then this answer might help
Language selector in Play 2.4 & Scala 2.11.6
Here is an example with a composite action which modifies the request header.
object LanguageAction extends ActionBuilder[Request] { def invokeBlock[A](request: Request[A], block: (Request[A]) => Future[Result]) = { val newRequest = new WrappedRequest[A](request) { //calculate from request url val lang = Lang("fr") override lazy val acceptLanguages = Seq(lang) } block(newRequest) } }Controller:
class FooController @Inject() (val messagesApi: MessagesApi) extends Controller with I18nSupport { def index() = LanguageAction { implicit request => Ok(views.html.index()) } }View:
@()(implicit messages: Messages, lang: Lang) @messages("foo.bar")更多推荐
发布评论