scalaplayframeworkplayframework-2.6

Migrating to 2.6 and Form error No implementation for play.i18n.Messages was bound


In my project I define a SignupForm outside the scope of a Controller ... the reason being I need reusing it from different source files.

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

But this leads to the runtime error No implementation for play.i18n.Messages was bound. How can I fix it?


Solution

  • Migrate to 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))
      }
    }
    

    You'll need to specify your languages in your configuration file. For example, play.i18n.langs = [ "en", "en-US", "fr" ]. More details can be found here.