2013-10-17 65 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,它不僅僅是基本名稱。 –