我正在尝试使用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"/>
答案 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
答案 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"/>