如何使用hashmap将密钥中的消息国际化(键:值)

时间:2013-11-22 17:14:11

标签: grails internationalization

我需要使用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}

2 个答案:

答案 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)