2013-10-17 68 views
2

我想在Grails的i18n messageSource中添加一些额外的值。在Grails中动态设置消息i18n

默认的message.properties工作正常,但我需要从远程资源加载一些额外的值(我知道它不好,但你知道,管理......)。

我试图通过Boostrap.groovy 例如加载这些变量:

def messageSource = new StaticMessageSource() 
messageSource.addMessage("key1", new Locale("en"), "English Value") 
messageSource.addMessage("key2", new Locale("de"), "Other Language Value") 

当我尝试通过

<g:message code="key1" /> 

仅返回键来访问他们在任何GSP,就好像在StaticMessageSource中根本没有设置的值一样。显然,我没有很好的文档。

Grails网站上没有任何内容,SpringFramework上也没有任何内容。 将不胜感激任何建议。

将消息集添加到消息源Session的任何其他方式!?

回答

4

messageSource bean在Grails中声明为PluginAwareResourceBundleMessageSource类。当我需要更多funcionality时,我创建了一个grails plugin并配置上下文以加载我的Grails类的class intead。

喜欢的东西:

的src /常规/ MyMessageSource.groovy

class MyMessageSource extends PluginAwareResourceBundleMessageSource { 
    String getMessage(String key, Object[] args, Locale locale) { 
    String message 
    //handle your custom keys 
    if(key.contains('myCoolMessagePrefix') { 
    } else { 
     //or delegate to the default of Grails 
     message = super.getMessage(key, args, locale) 
    } 

    return message 
    } 
} 

插件描述符 - > MyMessagesGrailsPlugin.groovy

def doWithSpring = { 
    //here we change the bean definition to use the customized messagesource 
    def beanconf = springConfig.getBeanConfig('messageSource') 
    def beandef = beanconf ? beanconf.beanDefinition : springConfig.getBeanDefinition('messageSource') 

    if (beandef) { 
    beandef.beanClassName = MyMessageSource.class.name 
    } 
} 
1

我已经解决了类似的问题通过以下方式:

  1. 设定的自定义信息码grailsApplication.config(你可以 设置在那里,无论你想,只要你可以从你的 自定义的MessageSource得到它)
  2. 延长PluginAwareResourceBundleMessageSource
  3. 覆盖的resolveCode和resolveCodeWithArguments,检查您的 自定义来源
  4. 使用“应用程序”引用(其在基类)去 的配置
  5. 重新定义resources.groovy消息源:

为messageSource(MyMessageSource){豆 - > bean.autowire = “绰号” // - 这是重要 基本名称= “WEB-INF /的grails-app/I18N /消息” }

+0

更改只是bean定义而不是声明messageSource会让你选择让Grails i18n插件配置bean。如果你看看I18nGrailsPlugin,它不仅仅是基本名称。 –