2

我正在使用表单助手和自定义表单模板在 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.

正如对这篇文章的回答所提到的,我在我的语言文件中更改了默认错误消息(目前只有 2 个):

消息.en

username=Username
error.required=This field is required

消息.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。

4

2 回答 2

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 文件中的默认错误消息显示已翻译的错误。

于 2013-04-14T08:11:42.077 回答
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。

于 2015-02-28T02:30:46.053 回答