Grails i18n From Database but Default Back To File
以下代码基于以上链接实现。
class DatabaseMessageSource extends PluginAwareResourceBundleMessageSource {
Ehcache messageCache
def messageBundleMessageSource
@Override
protected MessageFormat resolveCode(String code, Locale locale) {
println code + " : " + locale.language
def messageKey = new MessageKey(code, locale)
def messageFormat = messageCache.get(messageKey)?.value
if (!messageFormat) {
I18nMessage i18nMessage = I18nMessage.findByCodeAndLanguageCode(code, locale.language)
if (i18nMessage)
messageFormat = new MessageFormat(i18nMessage.text)
else
messageFormat = super.resolveCode(code, locale)
messageCache.put new Element(messageKey, messageFormat)
}
return messageFormat;
}
在resources.groovy文件中,此bean配置为 如下面的代码所示。
beans = {
messageCache(EhCacheFactoryBean) {
timeToLive = 500
}
messageSource(DatabaseMessageSource) {
messageCache = messageCache
basename = "WEB-INF/grails-app/i18n/messages"
}
}
在gsp页面中,调用g:message,如下所示
1.<g:message code="someObject.create"/>
2.<g:message code="someObject.create" default="Create"/>
3.<g:message code="someObject.create" args="['']"/>
对于g:message标记中给出的相同代码,1,2不显示数据库中给出的文本。第3个标记用法显示数据库中添加的文本内容。 1个标签显示someObject.create。 2 Tag显示Create value,3rd tag显示添加的db文本。
为什么1和2符号不显示数据库中的动态值?并且还只调用了resolveCode()1次。