我正在使用表单助手和自定义表单模板在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 answer到this 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。
答案 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。