Thanks Hannes! I tried the route with the Decorator once, and ended up having to write some java-code into the interceptor via the BodyBuilder .... 'twas not nice.
Your example worked great, i only had to pass some more Services (AssetSource to get the URLs, my ProjectContextProvider to get the ResourceBundles for my text) into the build-Method in AppModule, then i could return the value for a Message-Key from the bundles, or if not existant, from the fallbackMessages. Cheers, Mike Hannes Heijkenskjöld wrote: > > Hi > > I have recently wondered about the same, and have now built something > that after much trial and error now works. > > Basically, I have created a Messages implementation that wraps both a > tapestry Messages object and our own database messages. If a message is > not found in our database, the default Messages object is queried. > > To get Tapestry to use my Messages implementation i had to decorate the > ComponentMessagesSource (and ValidationMessagesSource), since it is not > possible to replace the one in Tapestry. I think I read about decorating > services here: > http://tapestry.apache.org/tapestry5/tapestry-ioc/decorator.html and on > the mailing list. > > My messages source service doesn't implement the ComponentMessagesSource > interface. I use an interception object for that. Hopefully you can > understand how it works from my example code below: > > public class CommonsMessages extends AbstractMessages { > > private Messages fallbackMessages; > > protected String valueForKey(final key) { > ... logic to get key from db, use fallbackMessages as fallback... > } > > } > > ----- > > public class CommonsMessagesSource { > > public Messages getMessages(Locale locale, Messages fallbackMessages) > { > ... code that creates a CommonsMessages object, with > fallbackMessages ... > } > } > > ---- > > // This is the decorating class > public class CommonsComponentMessagesSourceInterceptor implements > ComponentMessagesSource { > > private final CommonsMessagesSource service; > private final ComponentMessagesSource delegate; > > public CommonsComponentMessagesSourceInterceptor > (CommonsMessagesSource service, ComponentMessagesSource delegate) > { > this.service = service; > this.delegate = delegate; > } > > public Messages getMessages(ComponentModel componentModel, Locale > locale) { > > return service.getMessages(locale, > delegate.getMessages(componentModel, locale)); > } > > // Not sure about how I should handle this one > public void addInvalidationListener( > InvalidationListener invalidationlistener) { > delegate.addInvalidationListener(invalidationlistener); > } > } > > --- > > In AppModule.java: > > // Method for instantiating and configuring the custom messages > source > public static CommonsMessagesSource buildCommonsMessagesSource() > { > CommonsMessagesSource messagesSource = new > CommonsMessagesSource(); > return messagesSource; > } > > // Method that decorates the default MessagesSource using the > interceptor class > @Match("ComponentMessagesSource") > public static ComponentMessagesSource decorateComponentMessagesSource > (Object delegate, CommonsMessagesSource service) > { > return new CommonsComponentMessagesSourceInterceptor(service, > (ComponentMessagesSource)delegate); > } > > This is how I got it to work, there may be other ways ofcourse. There > might even be better ways :-) > > Cheers, > /Hannes > > Michael Capper skrev: >> Summary: How do I include additional localization-key/values-pairs in my >> global messages-catalog, originating from some app_<lang>.properties or >> from >> a database? >> >> Hi, >> I'd like to extend the Hash-Table containing the message-keys and >> message-values used in my app. The app_en.properties provides the basic >> global localization data, but I need even more data, which is spead about >> in >> other .properties-files or even in a Database. What I'd like to do would >> be >> to read in the data somewhere, and pass it on to the Messages(or >> ResourceBundle) somehow, so when I @Inject the Messages into a >> page/component or use the 'message:' binding, the extra localization is >> available at a root level. >> >> Thanks for any help or pointers, >> Mike > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > > > -- View this message in context: http://www.nabble.com/T5-%3A-Expanding-Messages-Catalog-for-localization-from-arbitrary-source-tp16608683p16718330.html Sent from the Tapestry - User mailing list archive at Nabble.com. --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]