Grails:从另一条消息中调用本地化消息

时间:2016-03-11 20:10:35

标签: spring grails resourcebundle

来自Struts / XWorks我能够做到这样的事情

Messages.properties

constexpr

申请代码

myMessage.invalid.fieldvalue=Invalid input for $'{'getText("{0}")'}'
email.label=Email Address

所以基本上我传递给消息的参数实际上是另一条消息的代码,我想将它们一起渲染。

我似乎无法通过Grails / Spring消息传递找到一种方法。这是可能的,如果是这样的话?

修改的: 为了更清楚地说明我要求这样做的原因之一就是这个例子。

假设我有5个具有属性getText("myMessage.invalid.fieldvalue",new String[] {"email.label"}) Output: Invalid input for Email Address

的Domain类

要验证NULL,我必须这样做

emailAddress

我希望能够做的只是通过覆盖默认验证消息来实现消息传递

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 的属性并且它验证为NULL我将收到消息emailAddress。没有必要有5条消息基本上说同样的事情。如果我有另一个具有属性Email Address cannot be null的类,那么它已经处理完了,我不必复制并粘贴第6行。

任何时候我都有包含共享属性名称的类,我所要做的就是为每个将应用于所有类的属性添加一行

emailAddress

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

我可以通过扩展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"
    }
}