initializeMessageSource method
Initializes the MessageSource for this context.
This is invoked during setup 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
@mustCallSuper
Future<void> initializeMessageSource() async {
final factory = getPodFactory();
if (await factory.containsLocalPod(MESSAGE_SOURCE_POD_NAME)) {
_messageSource = await factory.getPod(MESSAGE_SOURCE_POD_NAME);
if (logger.getIsTraceEnabled()) {
logger.trace("Using message source ${_messageSource!.runtimeType}");
}
} 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() ?? cl.getBestConstructor([]) ?? cl.getDefaultConstructor();
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 factory.registerSingleton(
MESSAGE_SOURCE_POD_NAME,
del,
object: ObjectHolder<MessageSource>(
_messageSource!,
packageName: PackageNames.CORE,
qualifiedName: del.getQualifiedName(),
),
);
if (logger.getIsTraceEnabled()) {
logger.trace("No message source found, using default message source ${_messageSource!.runtimeType}");
}
}
return Future.value();
}