我需要使用Grails标准国际化方法使用Hashmap翻译消息密钥。
我收到一个Enum和一个带有绑定的地图,这些地图将在文本中被替换。 Enum表示,哪个密钥将被恢复。绑定具有要在翻译中替换的值。
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}
答案 0 :(得分:0)
最后我用蛮力做到了。可能不是最好的答案,但我找不到更好的答案。 基本上我使用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,但它也适用于object,因为grails / groovy处理对象,如HashMaps,反之亦然
答案 1 :(得分:0)
这更清洁。 :)
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)