2013-04-13 101 views
2

我使用的形式助手和一个自定义表单模板来渲染我的形式在这样的游戏框架:表单错误的i18n播放框架

@(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。

+0

奇怪。放在'messages.nl'中的其他消息是否正确翻译?在你提到的其他问题中描述的方法完美地工作,你可以在https://play-authenticate.herokuapp.com/signup查看它(手动切换到波兰语或德语) – biesior

+0

但是当然,我试过这个,它工作,感谢提醒我! – Aerus

回答

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 
    } 
} 

然后,您可以调用这个在斯卡拉表单模板静态函数是这样的:

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

显示基于在messages.xx文件的默认错误消息的翻译错误。

0

一般情况下,如果在messages.xx资源文件中也发现了错误代码,即使您在其他地方编写自定义验证程序,它们也会被本地化。您不必在范围内使用Lang或自己调用Messages()。例如。在斯卡拉玩:

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传递显式的Messages()调用。