表单错误i18n Play框架

时间:2013-04-13 14:00:33

标签: forms templates internationalization playframework-2.0

我正在使用表单助手和自定义表单模板在Play框架中呈现我的表单,如下所示:

@(lang: Lang)(myForm: Form[MyModel])

@import play.i18n._
@import helper._

@implicitField = @{ FieldConstructor(formTemplate.f) }

@form ( action = routes.Application.index() ){
    @inputText(
        field = myForm("username"),
        '_label -> Messages.get(lang, "username")
    )
}

使用lang的不同值调用模板时,标签将以相应的语言显示。

但是,提交表单时,错误消息始终以主要语言显示。 (即Required字段始终为This field is required.

提到the answerthis post,我在语言文件中更改了默认错误消息(目前只有2个):

messages.en

username=Username
error.required=This field is required

messages.nl

username=Gebruikersnaam
error.required=Dit veld is verplicht

如何确保错误以正确的语言打印?

我已经尝试在自定义模板中执行以下操作,但没有成功:

@(elements: helper.FieldElements)

<!-- snipped some HTML code -->
<span class="help">
    @(elements.infos(elements.args.get('_lang) match { 
        case Some(language) => language.asInstanceOf[play.api.i18n.Lang] 
        case None => new Lang("en","uk")
    }).mkString(", "))
</span>             

'_lang -> lang添加到@inputText来电。

我习惯用Java编程,只在Play模板中做了一些Scala。我正在使用Play 2.0.4。

2 个答案:

答案 0 :(得分:1)

我发现最简单的方法(注意:我用Java编程)是在你的一个模型中定义一个返回用户语言的静态方法:

public class User{
    import play.i18n.Lang;

    //simplified
    public static Lang getLanguage(){        
    if(session("language" != null){
        return Lang.forCode(session.get("language"));
    } else {
        return Lang.forCode("en"); //default language
    }
}

然后,您可以在Scala表单模板中调用此静态函数,如下所示:

<span class="errors">@elements.errors(User.getLanguage()).mkString(", ")</span>

根据messages.xx文件中的默认错误消息显示已翻译的错误。

答案 1 :(得分:0)

一般情况下,如果您的错误代码也在messages.xx资源文件中找到,那么即使您在其他地方编写自定义验证程序,它们也会进行本地化。您不必在范围内使用Lang或自己调用Messages()。例如。在Scala Play:

  val validPhone = """\+?[0-9_\-\. \(\)]*$""".r

  val phoneCheckConstraint: Constraint[String] = Constraint("constraints.phonecheck")({
    plainText =>
      val errors = plainText match {
        case validPhone() => Nil
        case _ => Seq(ValidationError("error.phonenumber"))
      }
      if (errors.isEmpty) {
        Valid
      } else {
        Invalid(errors)
      }
  })

如果你只是

error.phonenumber=Invalid phone number

在您的messages.en文件和其他messages.xx文件中的翻译版本中,即使没有Lang在声明范围内,它们也会被Play本地化。因此,除了在模板和其他地方进行显式的Messages()调用之外,不需要传递Lang。