0

バックグラウンド

データベースに格納されているフィールド ラベルの従来の国際化がいくつかあるため、"マージされた" messageSource を作成しようとしました。コードがデータベースに存在する場合は戻ります。存在しない場合は、PluginAwareResourceBundleMessageSource を使用して i18n を調べます。

問題

何らかの理由で、cachedMergedPluginProperties がロケールに対して間違ったファイルをキャッシュしています。たとえば、en_US を検索すると、pt_BR メッセージを受信します (マップのキーは en_US ですが、プロパティは pt_BR です)。

次のように messageSource を宣言しました。

messageSource(DatabaseMessageSource) {
  messageBundleMessageSource = { org.codehaus.groovy.grails.context.support.PluginAwareResourceBundleMessageSource m ->
    basenames = "WEB-INF/grails-app/i18n/messages"
    } 
}  

内側の Bean は、Grails が type の 2 つの Bean を許可しないためですMessageSource

PluginAwareResourceBundleMessageSourceGrails のデフォルトとは異なる宣言をしていますか? この Bean 宣言を確認できる Grails のファイルはどれですか?

4

1 に答える 1

1

内部で宣言を見つけましたが、I18nGrailsPluginそれは私のものよりも少し詳細です:

String baseDir = "grails-app/i18n"
String version = GrailsUtil.getGrailsVersion()
String watchedResources = "file:./${baseDir}/**/*.properties".toString()
...
 Set baseNames = []

        def messageResources
        if (application.warDeployed) {
            messageResources = parentCtx?.getResources("**/WEB-INF/${baseDir}/**/*.properties")?.toList()
        }
        else {
            messageResources = plugin.watchedResources
        }

        if (messageResources) {
            for (resource in messageResources) {
                // Extract the file path of the file's parent directory
                // that comes after "grails-app/i18n".
                String path
                if (resource instanceof ContextResource) {
                    path = StringUtils.substringAfter(resource.pathWithinContext, baseDir)
                }
                else {
                    path = StringUtils.substringAfter(resource.path, baseDir)
                }

                // look for an underscore in the file name (not the full path)
                String fileName = resource.filename
                int firstUnderscore = fileName.indexOf('_')

                if (firstUnderscore > 0) {
                    // grab everyting up to but not including
                    // the first underscore in the file name
                    int numberOfCharsToRemove = fileName.length() - firstUnderscore
                    int lastCharacterToRetain = -1 * (numberOfCharsToRemove + 1)
                    path = path[0..lastCharacterToRetain]
                }
                else {
                    // Lop off the extension - the "basenames" property in the
                    // message source cannot have entries with an extension.
                    path -= ".properties"
                }
                baseNames << "WEB-INF/" + baseDir + path
            }
        }

        LOG.debug "Creating messageSource with basenames: $baseNames"

        messageSource(PluginAwareResourceBundleMessageSource) {
            basenames = baseNames.toArray()
            fallbackToSystemLocale = false
            pluginManager = manager
            if (Environment.current.isReloadEnabled() || GrailsConfigUtils.isConfigTrue(application, GroovyPagesTemplateEngine.CONFIG_PROPERTY_GSP_ENABLE_RELOAD)) {
                def cacheSecondsSetting = application?.flatConfig?.get('grails.i18n.cache.seconds')
                if (cacheSecondsSetting != null) {
                    cacheSeconds = cacheSecondsSetting as Integer
                } else {
                    cacheSeconds = 5
                }
            }
        }

Grails では同じタイプの Bean を 2 つ持つことができないため、MessageSourceこのコードをコピーして、私の「マージされた」メッセージソースに適応させる必要がありました。

于 2012-11-21T16:51:20.640 に答える