2012-10-11 69 views
7

我需要這一切國際化的消息的地圖來呈現它的一部分像一個控制器:如何創建與Grails的

class MessageController { 

    def index = { 

    def messageMap = listAlli18nMessages() // the question 

    render (contentType: "text/xml") { 
     messageMap {key, message -> 
      .. 
     } 
    } 
    } 
} 
+0

http://stackoverflow.com/a/11773556/1342525 – 16dots

回答

9

最後,我找到了答案 - 覆蓋默認的Grails爲messageSource:

class ExtendedPluginAwareResourceBundleMessageSource extends PluginAwareResourceBundleMessageSource { 
    Map<String, String> listMessageCodes(Locale locale) { 
     Properties properties = getMergedProperties(locale).properties 
     Properties pluginProperties = getMergedPluginProperties(locale).properties 
     return properties.plus(pluginProperties) 
    } 
} 

在的grails-app/conf目錄/春/ resources.groovy:

beans = { 
    messageSource(ExtendedPluginAwareResourceBundleMessageSource) { 
     basenames = "WEB-INF/grails-app/i18n/messages" 
    } 
} 

通訊控制器代碼:

class MessageController { 
    def messageSource 

    def index = { 
     def messageMap = messageSource.listMessageCodes(request.locale) 

     render (contentType: "text/xml") { 
      messageMap {key, message -> 
       .. 
      } 
     } 
    } 
} 
+0

我試過了,它沒有工作,擴展的消息源沒有被使用。也許與下面的消息有關:''java.lang.RuntimeException:重載代理通過異常退出,請引發jira錯誤| 'org.springsource.loaded.agent.ClassPreProcessorAgentAdapter.transform(ClassPreProcessorAgentAdapter.java:104)''所以,如果一開始這不起作用,不要害怕,只是稍後再試,它會起作用 –

+0

'request.locale' didn不適合我。我用'RequestContextUtils.getLocale(request)'代替。 – haisi

0

的方法,你正在服用看起來不能夠基於在PluginAwareResourceBundleMessageSource的API文檔上。這將讓你接近的解決方案

class MessageController { 
    def messageSource 

    def index = { 
     Locale locale = new Locale('en'); 
     List codes = ['default.paginate.prev','default.paginate.next','default.boolean.true','default.boolean.false'] 
     def messageMap = messagesForCodes(codes,locale) 
     render (contentType: "text/xml") { 
      messageMap {key, message -> 
       .. 
      } 
     } 
    } 

    private def messagesForCodes(codes, locale){ 
     Map messages = [:] 
     codes.each{code-> 
      messages[code] = messageSource.getMessage(code,null,locale) 
     } 
     messages 
    } 
} 
+0

謝謝你回答我。但重要的是,我不想在之前知道所有的代碼。 – Adrian