play2.5 中的隐式消息编译错误

implicit messages compile error in play2.5

我有一个 play2.5 应用程序和一个表单,我希望在其中国际化错误消息。我将表单放在一个单独的对象中,并在控制器中使用它。但是播放没有编译,因为找不到隐式消息。

我想这是一个微不足道的解决方案,但我是玩 scala 的新手,如果有任何提示,我将不胜感激。

错误:(14, 45) 找不到参数消息的隐含值:play.api。i18n.Messages "username" -> email.verifying(消息("error.email.required"), {!_.isEmpty}),

object LoginForm {

  val form = Form(
    mapping(
      "username" -> email.verifying(Messages("error.email.required"), {!_.isEmpty}),
      "pasword" -> nonEmptyText(8,20).verifying(Messages("error.password.required"), {!_.isEmpty})
    )(Data.apply)(Data.unapply)
  )

  case class Data(
    username: String,
    password: String
  )

}

您需要使用 I18nSupport 特性来获取范围内的隐式 play.api.i18n.Messages 值。完整解释在这里:

https://www.playframework.com/documentation/2.5.x/ScalaI18N#Externalizing-messages

对于您的 use-case,最简单的方法是在使用 I18nSupport 特征的控制器内部定义表单。由于您是 Scala 和 Play 的新手,我推荐这种方法。

一种更高级的方法是在 LoginForm 特征中定义表单并声明对 I18nSupport 特征的依赖。这看起来像:

trait LoginForm{
  self: I18nSupport =>

  //define form here
}

然后你只需将这个 LoginForm 特性混合到你需要它的控制器中(它应该混合在 I18nSupport 特性中)。

像这样隐式地为表单提供 lang 是否有效?

def form(implicit lang: Lang) = Form(
    mapping(
      "username" -> email.verifying(Messages("error.email.required"), {!_.isEmpty}),
      "pasword" -> nonEmptyText(8,20).verifying(Messages("error.password.required"), {!_.isEmpty})
    )(Data.apply)(Data.unapply)
  )

有时将表单移动到案例的伴生对象会很好 class:

case class Data(
    username: String,
    password: String
  )

object Data {
  def form(implicit lang: Lang) = ...
}