如何在g:select中将i18n与Grails/Groovy枚举一起使用?

如何在g:select中将i18n与Grails/Groovy枚举一起使用?,grails,groovy,internationalization,enums,Grails,Groovy,Internationalization,Enums,我试图让i18n本地化在Grails/Groovy枚举上工作 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 t

我试图让i18n本地化在Grails/Groovy枚举上工作

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"/>

罗布·弗莱彻(Rob Fletcher,2009年起)在中展示了一种方法

确保枚举类
实现org.springframework.context.MessageSourceResolvable


然后实施

很抱歉耽搁了,但我认为这会对您有所帮助。我在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"/>
${message(code:'enum.value.'+fieldValue(bean: someDomainClass, field: "notification"))}
这是如果您有一个域类,其中一个属性的类型为Notification

希望这有帮助。
再见

您需要实现
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
选择标记应如下所示:

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

你应该得到+100,但因为我做不到,所以我得到了+1!谢谢