如何在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()不起作用,因为它导致使用默认语言,而不是每个请求的语言。
答案 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