At first create a model class:
Then implement a class that extends the org.springframework.context.support.AbstractMessageSource class. In the example below I am using simple GORM finders to lookup a message using the code and locale
Then configure an appropriate cache bean (I'm using Ehcache) in Spring and wire it into your MessageSource in grails-app/conf/spring/resources.groovy file:
http://graemerocher.blogspot.com/2010/04/reading-i18n-messages-from-database.html
package com.locale.messaging class Message { String code Locale locale String text static constraints = { code(unique: ["locale"]) } static mapping = { version(false); } }
Then implement a class that extends the org.springframework.context.support.AbstractMessageSource class. In the example below I am using simple GORM finders to lookup a message using the code and locale
package com.locale.messaging import com.locale.messaging.Message import net.sf.ehcache.Ehcache import org.springframework.context.support.AbstractMessageSource import net.sf.ehcache.Element; import java.text.MessageFormat /** * Created with IntelliJ IDEA. * User: pritom * Date: 9/12/13 * Time: 9:09 AM * To change this template use File | Settings | File Templates. */ class DatabaseMessageSource extends AbstractMessageSource { Ehcache messageCache def messageBundleMessageSource @Override protected MessageFormat resolveCode(String code, Locale locale) { def key = "${code}_${locale.language}_${locale.country}_${locale.variant}"; def format = messageCache.get(key)?.value; if (!format) { Message message = Message.findByCodeAndLocale(code, locale); if (message) { format = new MessageFormat(message.text, message.locale); } else { format = messageBundleMessageSource.resolveCode(code, locale); } messageCache.put(new Element(key, format)) } else { format = (MessageFormat) format; } return format; } }
Then configure an appropriate cache bean (I'm using Ehcache) in Spring and wire it into your MessageSource in grails-app/conf/spring/resources.groovy file:
import com.bitmascot.util.DatabaseMessageSource import org.springframework.cache.ehcache.EhCacheFactoryBean // Place your Spring DSL code here beans = { messageCache(EhCacheFactoryBean) { eternal = false; timeToIdle = 5000; } messageSource(DatabaseMessageSource) { messageCache = messageCache messageBundleMessageSource = ref("messageBundleMessageSource") } messageBundleMessageSource(org.codehaus.groovy.grails.context.support.PluginAwareResourceBundleMessageSource) { basenames = "grails-app/i18n/messages" } }
http://graemerocher.blogspot.com/2010/04/reading-i18n-messages-from-database.html