如何在g:select中使用带有Grails / Groovy枚举的i18n?

时间:2011-09-27 15:36:05

标签: grails groovy internationalization enums

我正在尝试使用Grails / Groovy枚举进行i18n本地化工作,

public enum Notification  {
    GENERIC(0),
    CONFIRM_RESERVATION(100),
    CONFIRM_ORDER(200),
    CONFIRM_PAYMENT(300),

    final int id;

    private Notification(int id) {
        this.id = id
    }

    String toString() {
        id.toString()
    }

    String getKey() {
        name()
    }
}

有关如何实现这一目标的任何提示?我试图将完整的类名等放在本地化中,但这似乎不起作用

<g:select from="${Notification.values()}"  name="notification" valueMessagePrefix="full.path.to.package.Notification"/>

3 个答案:

答案 0 :(得分:13)

对不起延迟,但我认为这可以帮到你。我和enum和i18n有同样的问题。这是我找到的解决方案:

按照之前定义的枚举后,在message.properties文件中为枚举的每个值添加一个条目,例如:

enum.value.GENERIC
enum.value.CONFIRM_RESERVATION
enum.value.CONFIRM_ORDER
enum.value.CONFIRM_PAYMENT

然后,当您想要在select元素中显示枚举的值时,请执行以下操作:

<g:select from="${path.to.package.Notification.values()}"  keys="${path.to.package.Notification?.values()}" name="notification" valueMessagePrefix="enum.value"/>

根据有关select标记的Grails文档,使用属性valueMessagePrefix中的值,后跟一个点(。),然后是枚举元素的值。这样它就会转到message.properties文件并搜索你之前放的行。

现在,您需要做的另一件事是例如在数据列表中,显示每条记录的枚举值。在这种情况下,您需要执行以下操作:

${message(code:'enum.value.'+fieldValue(bean: someDomainClass, field: "notification"))}

如果您的域类具有一个Notification类型的属性,则为此。

希望这有帮助。 再见!

答案 1 :(得分:7)

Rob Fletcher在this blog post中展示了一种方法(来自2009年)

确保您的枚举课程implements org.springframework.context.MessageSourceResolvable

然后实施the methods it defines

答案 2 :(得分:0)

您需要实现MessageSourceResolvable来提供您的代码:

enum Notification implements org.springframework.context.MessageSourceResolvable {

    GENERIC(0),
    CONFIRM_RESERVATION(100),
    CONFIRM_ORDER(200),
    CONFIRM_PAYMENT(300),

    final int id;

    private Notification(int id) {
        this.id = id
    }

    String toString() {
        id.toString()
    }

    String getKey() {
        name()
    }

    public Object[] getArguments() { [] as Object[] }

    //This methods do the trick
    public String[] getCodes() { [ "notification." + name() ] }

    public String getDefaultMessage() { name() }
}

并在i18n中定义您的消息:

notification.GENERIC=Generic
notification.CONFIRM_RESERVATION=Confirm reservation
notification.CONFIRM_ORDER=Confirm order
notification.CONFIRM_PAYMENT=Confirm payment

select标签应如下所示:

<g:select name="type" from='${Notification.values()}' optionKey="id"/>