【问题标题】:Localizing validation (error) messages in Grails在 Grails 中本地化验证(错误)消息
【发布时间】:2011-06-07 22:23:26
【问题描述】:

我尝试本地化来自域类的错误消息。这可以通过默认错误消息来实现,例如:

default.blank.message=属性 [{0}] 不能为空

和本地化的属性名称,例如:

customer.address.label=客户地址

“客户”是我的域类,地址是它的属性。

我的问题是我无法本地化某些属性,因为我需要特定的错误消息。 例如:

has.to.be.a.number=属性 [{0}] 必须是数字

contingent.size.label=条件大小。

但我得到的消息是“属性 [大小] 必须是数字”而不是“属性 [条件大小] 必须是数字”。

我无法本地化的消息如下:

  • 属性 [{0}] 必须是数字
  • 属性 [{0}] 必须是有效日期 // 我不能在这种情况下使用 g:datePicker


我添加了一些其他示例以及其他一些也不起作用的域类
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”未本地化:(消息已本地化,minimal 属性未本地化) 属性 [minimalContingent] 必须是一个数字。

【问题讨论】:

  • 你使用什么验证器?请添加带有约束的域类代码。
  • 您的域类是在一个包中,还是在使用默认包?
  • 此外,您是否在让标签正常工作或让自定义验证消息正常工作方面遇到问题?我假设是前者,但在重新阅读你的问题后,现在对你遇到的问题有点模糊。
  • @mflorian - 我正在使用标准 grails 验证,使用域类中定义的约束。
  • @Rob Hruska - 好吧,我想让标签本地化,因为消息有效。但如果没有其他可能,我想做自定义验证消息。

标签: grails localization internationalization


【解决方案1】:

如果您对验证消息有疑问,您可以随时使用实例上的errors 集合检查验证错误的代码。

Customer c = ...

c.validate()

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

编写单元测试来检查代码以本地化消息。

【讨论】:

  • 嗯,这似乎是个好主意。但是,这只会打印所有错误中的一部分(以及相关代码)(我的意思是例如 2(在单元测试中)或 5(在 gsp 中))。我得到的这些错误是本地化的并且运行良好(但其他一些未打印出来的错误也运行良好,有些则没有)。
【解决方案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
...


更新后,您能澄清一下吗?您的messages.properties 中是否有以下内容:
cz.quanti.spaportal.touristOffice.TouristOffice.minimalContingent.label=...

如果没有,加进去有效果吗?

【讨论】:

  • 我没有使用默认包。然而,大多数默认消息在这两种情况下都有效:com.example.Customer.name.label=Name 和 customer.name.label=Name
【解决方案3】:

我认为属性的整个路径(最后没有“标签”)应该适合你。看起来像这样:

com.example.Customer.homeAddress=Customer address

记得在需要的地方使用小写和大写!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-05
    • 1970-01-01
    • 2011-08-26
    • 1970-01-01
    • 2013-12-17
    • 1970-01-01
    • 2010-11-10
    • 1970-01-01
    相关资源
    最近更新 更多