2011-01-12 5 views
0

ドメインクラスからエラーメッセージをローカライズしようとしました。これは、デフォルトのエラー・メッセージ、例えばで可能です:Grailsでの検証(エラー)メッセージのローカライズ

default.blank.messageは=プロパティ[{0}]空白にすることはできません

とローカライズされた属性名、例えば:

customer.address.label =お客様の住所

ここで、 "顧客"は自分のドメインクラスであり、アドレスはその属性です。

私の問題は、特定のエラーメッセージが必要なために一部の属性をローカライズできないことです。 例えば:=プロパティ[{0}]

has.to.be.a.numberは数

contingent.size.label =偶発大きさでなければなりません。

しかし、私が受け取るメッセージは、[プロパティ[条件付サイズ]は数字でなければなりません。]ではなく、[プロパティ[サイズ]は数字でなければなりません。私はローカライズカント

メッセージは以下の通りである:

  • プロパティ[{0}]プロパティは、[{0}]有効な日付//私はできないでなければならない数
  • なければなりませんグラムを使用します。この文脈で日付ピッカー


は、私はまた、

package cz.quanti.spaportal.touristOffice 

import ... 

class TouristOffice { 
    String customerNumber 
    int minimalContingent 
    Address address 
    User user 
    ContactPerson contactPerson 

    static hasMany = [contingents: Contingent] 

    static constraints = { 
     customerNumber(unique:true, nullable: true, blank: true) 
     user(nullable: true, blank: true) 
     contactPerson(nullable: false) 
     minimalContingent(min: 0) 
     address(nullable: false) 
    } 
動作しないいくつかの他のドメインクラスに他のいくつかの例を追加

"minimalContingent"のみがローカライズされていません:(メッセージはローカライズされ、最小限の属性はありません) プロパティ[minimalContingent]は数字でなければなりません。

+0

どのようなバリデータを使用していますか?ドメインクラスコードに制約を加えてください。 – mfloryan

+0

ドメインクラスはパッケージに含まれていますか、または既定のパッケージを使用していますか? –

+0

さらに、ラベルを有効にするか、カスタム検証メッセージを有効にすることに問題がありますか?私は前者を前提にしていましたが、あなたの質問を再読した後、あなたはどの問題があるのか​​、もう少しあいまいです。 –

答えて

1

私は属性への全体のパス(最後に "ラベル"なし)が有効であると思います。次のようになります。

com.example.Customer.homeAddress=Customer address 

必要に応じて小文字と大文字を使用してください。

2

定義でドメインクラスパッケージを使用していることを確認してください。大文字を確認してください。私はそれが違いを作るかどうかわからないんだけど、私の成功messages.properties使用したラベルは、次のように似て見てきた:

// messages.properties 
com.example.Customer.address.label=Customer address 
com.example.Contingent.size.label=Contingent size 

// or if you're using the default package 
Customer.address.label=Customer address 
... 


あなたの更新の後、あなたが何かを明確にすることができますか?ない場合は、それを追加した場合

cz.quanti.spaportal.touristOffice.TouristOffice.minimalContingent.label=... 

、それは動作しません:あなたは、あなたのmessages.propertiesに、次の必要がありますか?

+0

私はデフォルトのパッケージを使用していません。しかし、デフォルトメッセージのほとんどは、両方の場合に動作します。com.example.Customer.name.label = Nameおよびcustomer.name.label = Name – John

4

検証メッセージに問題がある場合は、インスタンスのerrorsコレクションを使用して、検証エラーのコードをいつでもチェックできます。

Customer c = ... 

c.validate() 

c.errors.each { println it } 
c.errors.getFieldError("address").codes.each { println it } 
c.errors.getFieldError("address").defaultMessage 

コードをチェックしてメッセージをローカライズするための単体テストを作成します。

+0

これは良いアイデアのようです。しかし、これはすべてのエラー(および関連するコード)のうちのいくつかだけを出力します(ユニットテストのインスタンス2が5(gsp))。私が得たこれらのエラーは、ローカライズされ、正常に動作します(しかし、印刷されない他のいくつかのエラーもうまく動作していますが、一部ではありません)。 – John

関連する問題