Grails:从另一条消息中调用本地化消息
Grails: Call a localization message from within another message
来自 Struts/XWorks 我能够做这样的事情
Messages.properties
myMessage.invalid.fieldvalue=Invalid input for $'{'getText("{0}")'}'
email.label=Email Address
申请代码
getText("myMessage.invalid.fieldvalue",new String[] {"email.label"})
Output: Invalid input for Email Address
所以基本上我传递给消息的参数实际上是另一条消息的代码,我想同时呈现它们。
我似乎找不到使用 Grails/Spring 消息传递的方法。这可能吗?如果可能的话如何?
编辑:
为了更清楚地说明我要求这样做的原因之一,请看这个例子。
假设我有 5 个域 classes 与 属性 emailAddress
要验证 NULL,我必须这样做
myClass1.emailAddress.nullable=Email Address cannot be NULL
myClass2.emailAddress.nullable=Email Address cannot be NULL
myClass3.emailAddress.nullable=Email Address cannot be NULL
myClass4.emailAddress.nullable=Email Address cannot be NULL
myClass5.emailAddress.nullable=Email Address cannot be NULL
我想做的只是通过覆盖默认验证消息来简单地发送消息
OLD: default.null.message=Property [{0}] of class [{1}] cannot be null
NEW: default.null.message=getMessage({0}) cannot be null
emailAddress=Email Address
所以现在任何时候 class 都有一个名为 emailAddress
的 属性 并且它验证为 NULL 我将收到消息 Email Address cannot be null
。没有必要有 5 条消息基本上说同样的事情。如果我有另一个 class 和 属性 emailAddress
那么它已经处理好了,我不需要复制和粘贴第 6 行。
每当我有 class 共享 属性 名称时,我所要做的就是为每个 属性 添加一行,这将应用于所有 classes
sharedProp1= Shared property 1
sharedProp2= Shared property 2
在控制器中时,为要国际化的参数调用 message
并将其存储在局部变量中。
然后调用 message
获取完整消息,并添加带有国际化参数值的本地变量作为该消息的参数。
def emailLabel = message(code: "email.label")
def fullMessage = message(code: 'myMessage.invalid.fieldvalue', args: [emailLabel])
您的 messages.properties 将包含类似
的内容
myMessage.invalid.fieldvalue=Invalid input for {0}
email.label=Email Address
我能够通过扩展 MessageSource
并覆盖 resolveArguments
方法来完成此任务。
class CustomMessageSource extends ReloadableResourceBundleMessageSource {
@Override
protected Object[] resolveArguments(Object[] args, Locale locale) {
if (args == null) {
return new Object[0];
}
List<Object> resolvedArgs = new ArrayList<Object>(args.length);
for (Object arg : args) {
if (arg instanceof MessageSourceResolvable) {
resolvedArgs.add(getMessage((MessageSourceResolvable) arg, locale));
}
else {
//resolvedArgs.add(arg) **REPLACED THIS LINE
resolvedArgs.add(getMessage(arg, null, arg, locale));
}
}
return resolvedArgs.toArray(new Object[resolvedArgs.size()]);
}
}
我在评估您的消息参数的循环中替换了一行。我基本上接受了这个论点,看看它是否是另一条消息的关键。如果是,则用该消息替换参数,如果否,则继续正常使用参数
确保在您的 resources.groovy
文件中映射新的 messageSource
beans = {
messageSource(groovyUtils.CustomMessageSource) {
basenames = "messages"
}
}
来自 Struts/XWorks 我能够做这样的事情
Messages.properties
myMessage.invalid.fieldvalue=Invalid input for $'{'getText("{0}")'}'
email.label=Email Address
申请代码
getText("myMessage.invalid.fieldvalue",new String[] {"email.label"})
Output: Invalid input for Email Address
所以基本上我传递给消息的参数实际上是另一条消息的代码,我想同时呈现它们。
我似乎找不到使用 Grails/Spring 消息传递的方法。这可能吗?如果可能的话如何?
编辑: 为了更清楚地说明我要求这样做的原因之一,请看这个例子。
假设我有 5 个域 classes 与 属性 emailAddress
要验证 NULL,我必须这样做
myClass1.emailAddress.nullable=Email Address cannot be NULL
myClass2.emailAddress.nullable=Email Address cannot be NULL
myClass3.emailAddress.nullable=Email Address cannot be NULL
myClass4.emailAddress.nullable=Email Address cannot be NULL
myClass5.emailAddress.nullable=Email Address cannot be NULL
我想做的只是通过覆盖默认验证消息来简单地发送消息
OLD: default.null.message=Property [{0}] of class [{1}] cannot be null
NEW: default.null.message=getMessage({0}) cannot be null
emailAddress=Email Address
所以现在任何时候 class 都有一个名为 emailAddress
的 属性 并且它验证为 NULL 我将收到消息 Email Address cannot be null
。没有必要有 5 条消息基本上说同样的事情。如果我有另一个 class 和 属性 emailAddress
那么它已经处理好了,我不需要复制和粘贴第 6 行。
每当我有 class 共享 属性 名称时,我所要做的就是为每个 属性 添加一行,这将应用于所有 classes
sharedProp1= Shared property 1
sharedProp2= Shared property 2
在控制器中时,为要国际化的参数调用 message
并将其存储在局部变量中。
然后调用 message
获取完整消息,并添加带有国际化参数值的本地变量作为该消息的参数。
def emailLabel = message(code: "email.label")
def fullMessage = message(code: 'myMessage.invalid.fieldvalue', args: [emailLabel])
您的 messages.properties 将包含类似
的内容myMessage.invalid.fieldvalue=Invalid input for {0}
email.label=Email Address
我能够通过扩展 MessageSource
并覆盖 resolveArguments
方法来完成此任务。
class CustomMessageSource extends ReloadableResourceBundleMessageSource {
@Override
protected Object[] resolveArguments(Object[] args, Locale locale) {
if (args == null) {
return new Object[0];
}
List<Object> resolvedArgs = new ArrayList<Object>(args.length);
for (Object arg : args) {
if (arg instanceof MessageSourceResolvable) {
resolvedArgs.add(getMessage((MessageSourceResolvable) arg, locale));
}
else {
//resolvedArgs.add(arg) **REPLACED THIS LINE
resolvedArgs.add(getMessage(arg, null, arg, locale));
}
}
return resolvedArgs.toArray(new Object[resolvedArgs.size()]);
}
}
我在评估您的消息参数的循环中替换了一行。我基本上接受了这个论点,看看它是否是另一条消息的关键。如果是,则用该消息替换参数,如果否,则继续正常使用参数
确保在您的 resources.groovy
文件中映射新的 messageSource
beans = {
messageSource(groovyUtils.CustomMessageSource) {
basenames = "messages"
}
}