1

这个问题建立在我在这里找到的一个案例之上

index.scala.html

@(text: String)(implicit messages: Messages)

@main("Fancy title") {
  <h1>@messages("header.index")</h1>
  <div>@text</div>
}

main.scala.html

@(title: String)(content: Html)(implicit messages: Messages)
  <html>
  <head>
    <title>@title</title>
  </head>
  <body>
    <h1>@messages("header.main")</h1>
    @content
  <body>
</html>

在此示例中,我有index调用main并且我希望两者都访问messages

编译器在index内给了我“找不到参数消息的隐含值:play.api.i18n.Messages ”,但是如果我从main中删除隐式参数声明,则index可以正常工作并获取消息。似乎编译器告诉我它不知道如何将隐式参数向下传递。

在尝试解决方法之前,我想了解为什么这不起作用。

4

3 回答 3

1

在 Play 2.4 中,您需要在控制器中注入 MessageAPI 并在您的操作中调用首选菜单来创建消息。如果您将其定义为隐含在您的操作中。然后一切都会奏效。

于 2015-06-12T20:54:08.860 回答
1

首先让我添加控制器的代码,以使我的原始示例更清晰。

Application.scala(原始)

class Application @Inject() (val messagesApi: MessagesApi) extends Controller with I18nSupport { 
   def index = Action { implicit request => 
      Ok(views.html.index("blah bla blah")) 
}

在更详细地研究了 Play Framework 文档(在这里)之后,我了解了一种从模板中访问消息的替代方法(这可能也更简洁)。

Application.scala(新)

class Application extends Controller { 
   def index = Action {
      Ok(views.html.index("blah bla blah"))
   }
}

index.scala.html(新)

@import play.i18n._
@(text: String)
@main("Fancy title") {
  <h1>@Messages.get("header.index")</h1>
  <div>@text</div>
}

main.scala.html(新)

@import play.i18n._
@(title: String)(content: Html)
  <html>
    <head>
      <title>@title</title>
    </head>
    <body>
      <h1>@Messages.get("header.main")</h1>
      @content
    <body>
  </html>

控制器不再需要所有额外的基础设施。

视图需要添加导入语句,但会丢失隐式参数声明。

使用@Messages.get("xyz")而不是访问消息@Messages("xyz")


目前这种方法适合我的需要。

于 2015-06-13T01:10:36.657 回答
0

Play 框架会将您的请求隐式转换为 MessagesApi 以供您查看。但是,您确实需要request =>在控制器方法中包含隐式参数。还要I18nSupport在您的控制器中包含该特征。

import play.api.i18n.{MessagesApi, I18nSupport}

@Singleton
class HomeController @Inject() (cc: ControllerComponents)
extends AbstractController(cc) with I18nSupport {

  def showIndex = Action { implicit request =>
    Ok(views.html.index("All the langs"))
  }
}
于 2018-10-30T13:40:36.617 回答