Estoy desarrollando una aplicación Java de varios módulos. Cada módulo contiene varios paquetes de recursos: cuando una clase Demo.java requiere traducciones, se crea un paquete de recursos Demo.properties en el mismo paquete. Como se supone que la aplicación no falla cuando falta una traducción, quiero que la clave de traducción se use como alternativa.
Desde Java 9, un ResourceBundleProvider debería ser la forma correcta de implementar paquetes de recursos personalizados:
package my.app.core; public class KeyFallbackResourceBundleProvider extends AbstractResourceBundleProvider { @Override public ResourceBundle getBundle(String baseName, Locale locale) { var bundle = super.getBundle(baseName, locale); return new ResourceBundle() { @Override protected Object handleGetObject(String key) { try { return bundle.getObject(key); } catch (MissingResourceException e) { return key; } } @Override public Enumeration<String> getKeys() { return bundle.getKeys(); } }; } } Ahora, necesito ResourceBundle#getBundle(String) para usar ese proveedor en cada clase que carga un paquete de recursos. Sin embargo, parece que el nombre que se supone que tiene el proveedor depende del nombre del paquete a cargar, lo cual no es aceptable para mi caso de uso. Además, quiero usar el mismo proveedor para todos los módulos (que pueden depender directamente de él).
¿Hay alguna forma de lograr esto sin tener que implementar un ResourceBundleProvider para cada paquete de recursos? Y si no, ¿hay alguna otra forma de implementar el mecanismo de reserva clave que describí?