如何使用hashmap(key:value)对grails中的消息进行国际化

如何使用hashmap(key:value)对grails中的消息进行国际化,grails,internationalization,Grails,Internationalization,我需要使用Grails标准国际化方法,使用Hashmap翻译消息键 我收到一个带有绑定的枚举和映射,它们将在文本中被替换。 枚举指示要恢复的密钥。绑定具有要在转换上替换的值 messageSource.getMessage("mail.layout.subject.${templateName}",ARGS,"",locale) 问题是我需要像数组一样将映射传递给args,而不是像映射一样,但我不知道args的顺序 我的问题是,如果有任何方法可以创建转换键,如: mail.layout.sub

我需要使用Grails标准国际化方法,使用Hashmap翻译消息键

我收到一个带有绑定的枚举和映射,它们将在文本中被替换。 枚举指示要恢复的密钥。绑定具有要在转换上替换的值

messageSource.getMessage("mail.layout.subject.${templateName}",ARGS,"",locale)
问题是我需要像数组一样将映射传递给args,而不是像映射一样,但我不知道args的顺序

我的问题是,如果有任何方法可以创建转换键,如:

mail.layout.subject.ENUM1=Blablabl {name} bablablabl {age}
而不是

mail.layout.subject.ENUM1=Blablabl {0} bablablabl {1}

最后我用蛮力做到了。也许这不是最好的答案,但我找不到更好的。 基本上,我使用te消息资源获得翻译,然后使用它查找自定义表达式

def messageSource =  grailsApplication.getMainContext().getBean('messageSource')
def subject = messageSource.getMessage("mail.layout.subject.NOTIFICATION",null,"",locale)
主题资源实例

mail.layout.subject.NOTIFICATION=The user {friend.name} is friend of {user}
绑定示例:

def bindings = [friend:[name:"Jhon",surname:"Smith"],user:"David"]
用这句话,我用绑定的值替换我的表达式

Pattern pattern = Pattern.compile("\\{[^}]+\\}")
def res = subject.replaceAll(pattern,{
     def expresion = it[1..it.size()-2] // removes brackets
     def fields = expresion.split("\\.");

     def res  = bindings
     fields.each{
     println(it)
         res = res."${it}"
     }
     return res

 })
在这个过程之后,主题变成:用户Jhon是David的朋友


该示例使用HashMaps的HashMap,但它也适用于对象,因为grails/groovy像HashMaps和viceversa一样处理对象,这更干净了

import groovy.text.SimpleTemplateEngine

def text = 'Dear "$firstname $lastname",So nice to meet you in ${city.name}.See you in ${month},${signed}'  
def binding = ["firstname":"Sam", "lastname":"Pullara", "city":["name":"San Francisco", "id":"28"], "month":"December", "signed":"Groovy-Dev"]  
def engine = new SimpleTemplateEngine()
template = engine.createTemplate(text).make(binding)