在Grails中动态设置消息i18n

时间:2013-10-17 15:35:44

标签: spring grails grails-2.0

我正在尝试在Grails的i18n messageSource中添加一些额外的值。

默认的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")

当我尝试通过

在任何GSP中访问它们时
<g:message code="key1" /> 

仅返回密钥,就好像StaticMessageSource中未设置的值一样。显然我对文档运气不太好。

Grails网站上没有任何内容,SpringFramework上几乎没有任何内容。 将不胜感激。

将另一组消息添加到messageSource会话的另一种方法!?

2 个答案:

答案 0 :(得分:4)

messageSource bean在Grails中使用PluginAwareResourceBundleMessageSource类声明。当我需要更多的功能时,我创建一个grails plugin并配置上下文以加载Grails one的类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
  }
}

插件描述符 - &gt; 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)

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

  1. 在grailsApplication.config中设置自定义消息代码(您可以 设置你想要的地方,只要你能从你的地方找到它 自定义MessageSource)
  2. 扩展PluginAwareResourceBundleMessageSource
  3. 覆盖resolveCode和resolveCodeWithArguments,检查你的 自定义来源
  4. 使用“应用程序”引用(在基类中)来获取 配置
  5. 在resources.groovy中重新定义消息来源:
  6. messageSource(MyMessageSource){bean - &gt;     bean.autowire =“byName”// - 这很重要     basenames =“WEB-INF / grails-app / i18n / messages” }