Hi,
Thanks for your help, no it doesn’t seem to work. I found a solution using
decorate method, but I am not sure it’s really clean.
public static ComponentMessagesSource
decorateComponentMessagesSource(ComponentMessagesSource current, @Autobuild
CustomComponentMessagesSourceImpl custom, UpdateListenerHub updateListenerHub)
{
updateListenerHub.addUpdateListener(custom);
return custom;
}
Just wondering if there is no cleaner way.
I believe message formatter should be a service that should be overridable.
My implementation works as follow if it detects in the format a MessageFormat
pattern it will use a customer formatter, otherwise it will use the default
MessageFormatterImpl.
Inside MapMessages:
private MessageFormatter buildMessageFormatter(String key)
{
String format = get(key);
if (MESSAGE_FORMAT_PATTERN.matcher(format).find()) {
return new CustomMessageFormatterImpl(format, locale);
}
return new MessageFormatterImpl(format, locale);
}
> Le 17 juin 2021 à 12:41, Volker Lamp <[email protected]> a écrit :
>
> Hello Numa,
>
> I think you are missing withId() in your binder method to assign a unique
> name.
>
> See https://tapestry.apache.org/ioc-cookbook-overriding-ioc-services.html
> <https://tapestry.apache.org/ioc-cookbook-overriding-ioc-services.html>
>
> Cheers,
>
> Volker
>
>
> Am Do., 17. Juni 2021 um 12:20 Uhr schrieb Numa Schmeder <[email protected]
> <mailto:[email protected]>>:
>
>> Hello,
>>
>> I am trying to override the ComponentMessageSource service with a custom
>> ComponentMessageSourceImpl. The main reason to override the service is to
>> be able to use a custom implementation of MapMessages in
>> MessageFormatterImpl.
>> Currently it uses only String Formatter, which is very good for some time
>> of formatting but less practical for i18n formatting as it doesn’t handle
>> plurals at all. I would like to revert to classic MessageFormat.
>>
>> This is what I have done in my module:
>> @Contribute(ServiceOverride.class)
>> public static void
>> setupApplicationServiceOverrides(MappedConfiguration<Class<?>,Object>
>> configuration, @Local ComponentMessagesSource messagesSource)
>> {
>> // configuration.add(HibernateSessionSource.class,
>> hibernateSessionSource);
>> //overriding existing default component message source to add
>> MessageFormat
>> configuration.override(ComponentMessagesSource.class, messagesSource);
>>
>> }
>>
>> public static ComponentMessagesSource
>> buildCustomComponentMessagesSource(UpdateListenerHub updateListenerHub,
>> @Autobuild ComponentMessagesSourceImpl service)
>> {
>> updateListenerHub.addUpdateListener(service);
>> return service;
>> }
>>
>> If anyone has a clue on how to override this service this would be very
>> helpful. I always end up with 2 conflicting service, and
>> configuration.override doesn’t work.
>> It tapestry module ComponentMessageSource is built using a builder method
>> and then injected
>> public static ComponentMessagesSource
>> buildComponentMessagesSource(UpdateListenerHub updateListenerHub,
>> @Autobuild ComponentMessagesSourceImpl service)
>> {
>> updateListenerHub.addUpdateListener(service);
>> return service;
>> }
>>
>> Thank you for your help :)
>>
>> Best regards,
>>
>> <http://www.dfacto.ch/ <http://www.dfacto.ch/>> Numa Schmeder
>> www.dfacto.ch <http://www.dfacto.ch/> <
>> http://www.dfacto.ch/ <http://www.dfacto.ch/>>
>> [email protected] <mailto:[email protected]> <mailto:[email protected]
>> <mailto:[email protected]>> | M +41 79 538 30 01
>>
>> DIGITAL STRATEGY | DESIGN | DEVELOPMENT