2012-10-11 5 views
7

Ho bisogno di questo per rendere una parte di esso in un controllore del tipo:Come si crea una mappa con tutti i i18n-messaggi in 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

risposta

9

Finalmente ho trovato una risposta - ignorare l'impostazione predefinita 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) 
    } 
} 

In graal-app/conf/primavera/resources.groovy:

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

codice del controller corrispondente:

class MessageController { 
    def messageSource 

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

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

Ho provato questo e non ha funzionato, la fonte del messaggio esteso non è stata utilizzata. Forse correlato al seguente messaggio che ho ricevuto all'avvio 'java.lang.RuntimeException: l'agente di ricarica è uscito tramite un'eccezione, si prega di generare un errore jira | a org.springsource.loaded.agent.ClassPreProcessorAgentAdapter.transform (ClassPreProcessorAgentAdapter.java:104) 'Quindi, se all'inizio non funziona, non temere, riprovare più tardi e funzionerà –

+0

' request.locale' didn funziona correttamente per me Ho usato 'RequestContextUtils.getLocale (request)' invece. – haisi

0

L'approccio che sta assumendo non sembra essere possibile sulla base sui documenti API per PluginAwareResourceBundleMessageSource. Questo ti porterà vicino ad una soluzione di

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

Grazie per avermi risposto. Ma il punto è che non voglio conoscere tutti i codici prima. – Adrian

Problemi correlati