initMessageSource method
Initializes the MessageSource for this context.
This is invoked during refresh to set up i18n message resolution.
By default, it discovers non-abstract subclasses of MessageSource,
wraps them in a DelegatingMessageSource
, and registers the result
in the pod factory.
Subclasses can override this method to provide a custom message source strategy.
This is part of Jetleaf – a framework which developers can use to build web applications.
Implementation
@protected
Future<void> initMessageSource() async {
if (podFactory != null && await containsLocalPod(MESSAGE_SOURCE_POD_NAME)) {
_messageSource = await getPod(MESSAGE_SOURCE_POD_NAME);
} else {
final mcl = Class<MessageSource>(null, PackageNames.CORE);
final del = Class<DelegatingMessageSource>(null, PackageNames.CORE);
final sources = <MessageSource>[];
final classes = mcl.getSubClasses().where((cl) => cl.isInvokable());
for(final cl in classes) {
final defc = cl.getNoArgConstructor();
if(defc != null) {
final source = defc.newInstance();
sources.add(source);
} else {
if(logger.getIsWarnEnabled()) {
logger.warn("Message ${cl.getName()} does not have a no-arg constructor");
}
}
}
_messageSource = DelegatingMessageSource(sources);
await registerSingleton(
MESSAGE_SOURCE_POD_NAME,
del,
object: ObjectHolder<MessageSource>(
_messageSource!,
packageName: PackageNames.CORE,
qualifiedName: del.getQualifiedName()
)
);
}
return Future.value();
}