可本地化的表单验证消息

时间:2013-11-21 19:14:44

标签: forms scala playframework internationalization playframework-2.2

如何在Play Framework 2.2.1中声明可本地化的表单验证消息,包括需要参数的消息?

例如,在conf/messages中提供这些本地化消息:

password.tooShort="Password needs at least {0} characters."
password.doNotMatch="Passwords don't match."

这样的表单定义:

val minLength = 8
val changePasswordForm = Form (
  Password ->
    tuple(
      Password1 -> nonEmptyText.verifying("password.tooShort", p => p.length() >= minLength),
      Password2 -> nonEmptyText
    ).verifying("password.doNotMatch", passwords => passwords._1 == passwords._2)
)

如何以使用适当参数的方式(minLength)声明第一个字段(Password1)的验证消息?

表单定义调用verifying,它只接受不带参数的String消息:

def verifying(error: => String, constraint: (T => Boolean)): Mapping[T] = {
  verifying(Constraint { t: T =>
    if (constraint(t)) Valid else Invalid(Seq(ValidationError(error)))
  })
}

此外,在表单定义期间调用Messages()不起作用,因为它导致使用默认语言,而不是每个请求的语言。

2 个答案:

答案 0 :(得分:2)

在表单定义期间调用play.api.i18n.Messages不起作用,因为范围中没有play.api.i18n.Lang对象。将表单定义从val更改为def,并为Lang对象添加隐式方法参数。

val minLength = 8
def changePasswordForm(implicit lang: play.api.i18n.Lang) = Form (
  Password ->
    tuple(
      Password1 -> nonEmptyText.verifying(Messages("password.tooShort",minLength), p => p.length() >= minLength),
      Password2 -> nonEmptyText
    ).verifying(Messages("password.doNotMatch"), passwords => passwords._1 == passwords._2)
)

您需要在控制器操作中使用此表单定义,并在范围内使用隐式请求。请求将自动提供Lang对象。

示例:

def myAction = Action { implicit request =>
    Ok(html.myFormPage(changePasswordForm))
}

答案 1 :(得分:0)

如果您使用minLength验证器中的构建,这将为您提供开箱即用的功能。如果你真的想重新实现它,请查看默认实现的方式,包括Play的来源,这样你就已经将它们放在你的硬盘上了。您可以在YOUR_PLAY_INSTALLATION/framework/src/play/src/main/scala/play/api/data/validation/Validation.scala

中找到构建验证逻辑
相关问题