9

次のようなコントローラーでその一部をレンダリングするには、これが必要です。

class MessageController {

  def index = {

    def messageMap = listAlli18nMessages() // the question

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

2 に答える 2

11

最後に答えを見つけました - デフォルトの 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/spring/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 ->
                ..
            }
        }
    }
}
于 2012-10-12T11:37:48.773 に答える
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
    }
}
于 2012-10-11T20:29:28.523 に答える