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]

Reply via email to