1

Как объявить локализуемые сообщения проверки формы в 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) 
) 

Как сообщение проверки для первого поля (Password1) будет объявлен в способ, которым будет использоваться соответствующий параметр (minLength)?

Определение формы вызывает verifying, который принимает только сообщения типа String без параметров:

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

Кроме того, вызов сообщения() при определении вида не работает, потому что это приводит к языку по умолчанию используется, вместо языка каждого запроса.

ответ

0

Если вы используете встроенный валидатор minLength, это будет работать из коробки для вас. Если вы действительно хотите переопределить его, проверьте, как реализован вариант по умолчанию, источники Play включены, поэтому вы уже имеете их на своем жестком диске. Вы можете найти построение в логике проверки в YOUR_PLAY_INSTALLATION/framework/src/play/src/main/scala/play/api/data/validation/Validation.scala

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)) 
} 
Смежные вопросы