Поместите новый класс домена в ваш проект:
class Message {
String code
Locale locale
String text
}
Добавьте следующие строки в ваш resources.groovy
:
// Place your Spring DSL code here
beans = {
messageSource(DatabaseMessageSource) {
messageBundleMessageSource = ref("messageBundleMessageSource")
}
messageBundleMessageSource(org.codehaus.groovy.grails.context.support.PluginAwareResourceBundleMessageSource) {
basenames = "WEB-INF/grails-app/i18n/messages"
}
}
И добавьте следующий класс в вашу папку src/groovy
:
class DatabaseMessageSource extends AbstractMessageSource {
def messageBundleMessageSource
protected MessageFormat resolveCode(String code, Locale locale) {
Message msg = messageBundleMessageSource.resolveCode(code, locale)
def format
if(msg) {
format = new MessageFormat(msg.text, msg.locale)
}
else {
format = Message.findByCodeAndLocale(code, locale)
}
return format;
}
}
Теперь Grails попытается разрешить сообщение из пакета сообщений. Если он недоступен, он будет искать его из базы данных. Вы можете добавить некоторую обработку ошибок, но эта версия работает, если все сообщения доступны хотя бы в одном месте.
Подробнее см. http://graemerocher.blogspot.com/2010/04/reading-i18n-messages-from-database.html.
Некоторые подробности изменений, внесенных в resources.groovy
:
В этом файле вы можете определить инъецируемые классы groovy, которые можно включить, просто указав переменную с тем же именем, как определено в resources.groovy
. Например. в этом файле есть messageSource
и messageBundleMessageSource
, которые вы можете включить в любой контроллер или служебные файлы. Если эта переменная определена, создается экземпляр класса в скобках.
В этом случае мы перезаписываем общий messageSource
, чтобы использовать нашу пользовательскую реализацию DatabaseMessageSource
. Поэтому функция I18n message
теперь будет использовать нашу пользовательскую реализацию.
Поскольку наша пользовательская реализация требует проверки message.properties
-файлов, мы сохраняем исходный источник сообщений во втором компоненте. Определив этот экземпляр в нашей пользовательской реализации, мы все еще можем использовать старую реализацию (и, следовательно, искать сообщения обычным способом).