Scala 迁移到2.6和表单错误未绑定play.i18n.Messages的任何实现

Scala 迁移到2.6和表单错误未绑定play.i18n.Messages的任何实现,scala,playframework,playframework-2.6,Scala,Playframework,Playframework 2.6,在我的项目中,我在控制器的范围之外定义了一个注册表单。。。原因是我需要从不同的源文件重用它 package views.form import javax.inject.{Inject, Singleton} import play.api.data.Form import play.api.data.Forms._ import play.api.i18n.Messages case class Signup(email: String, password: String, repeatP

在我的项目中,我在控制器的范围之外定义了一个
注册表单
。。。原因是我需要从不同的源文件重用它

package views.form

import javax.inject.{Inject, Singleton}
import play.api.data.Form
import play.api.data.Forms._
import play.api.i18n.Messages

case class Signup(email: String, password: String, repeatPassword: String, name: String) extends MyUsernamePassword

@Singleton
class SignupForm @Inject() (implicit val messages: Messages) {
  val Instance = Form {
    mapping(
      "email" -> email,
      "password" -> nonEmptyText(minLength = 5),
      "repeatPassword" -> nonEmptyText(minLength = 5),
      "name" -> nonEmptyText
    )(Signup.apply)(Signup.unapply).
      verifying(messages("playauthenticate.password.signup.error.passwords_not_same"),
        data => (data.password != null) && data.password.equals(data.repeatPassword))
  }
}

但这会导致运行时错误
play.i18n.Messages未绑定任何实现
。如何修复它?

迁移到
MessagesApi

import javax.inject.{Inject, Singleton}
import play.api.data.Form
import play.api.data.Forms._
import play.api.i18n.{Lang, Langs, MessagesApi}

case class Signup(email: String, password: String, repeatPassword: String, name: String) extends MyUsernamePassword

@Singleton
class SignupForm @Inject() (implicit val langs: Langs, val messagesApi: MessagesApi) {
  implicit val lang: Lang = langs.availables.head
  val Instance = Form {
    mapping(
      "email" -> email,
      "password" -> nonEmptyText(minLength = 5),
      "repeatPassword" -> nonEmptyText(minLength = 5),
      "name" -> nonEmptyText
    )(Signup.apply)(Signup.unapply).
    verifying(messagesApi("playauthenticate.password.signup.error.passwords_not_same")(lang),
      data => (data.password != null) && data.password.equals(data.repeatPassword))
  }
}

您需要在配置文件中指定语言。例如,
play.i18n.langs=[“en”、“en-US”、“fr”]
。可以找到更多详细信息。

谢谢!!我以前一直在使用
MessagesApi
,但它需要一个Lang隐式语言,在迁移到2.6之后,它就不再被注入了。我在这里阅读是为了使用消息:。一个问题:为什么它在语句
val lang:lang=…
中拾取任意lang?我希望它隐式地来自某个地方的请求。。。但是,它完成了任务,运行时错误现在消失了。@SkyWalker我刚刚将
val-lang:lang=langs.availables.head
复制为伪代码,但我相信您通常会从请求中提取语言,如
val-lang:lang=request.messages.lang
,但在您的情况下,因为这不在您的控制器内,您需要一些逻辑来选择正确的语言,请求独立(不确定您现在是如何做到的)