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