How can I create a map with all i18n-messages in Grails

后端 未结 2 1658
闹比i
闹比i 2021-01-02 09:14

I need this to render a part of it in a controller like:

class MessageController {

  def index = {

    def messageMap = listAlli18nMessages() // the questi         


        
相关标签:
2条回答
  • 2021-01-02 09:34

    Finally I found an answer - override the default 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 grails-app/conf/spring/resources.groovy:

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

    Corresponding controller code:

    class MessageController {
        def messageSource
    
        def index = {
            def messageMap = messageSource.listMessageCodes(request.locale)
    
            render (contentType: "text/xml") {
                messageMap {key, message ->
                    ..
                }
            }
        }
    }
    
    0 讨论(0)
  • 2021-01-02 09:40

    The approach you are taking doesn't look to be possible based on the API docs for PluginAwareResourceBundleMessageSource. This will get you close to a solution

    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 讨论(0)
提交回复
热议问题