2013-04-13 125 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()調用。