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 つだけ)。

messages.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

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 に答える