Teníamos muchas cadenas que contenían la misma subcadena, desde oraciones sobre la comprobación del registro o cómo contactarse con el soporte, hasta cadenas tipo branding que contienen el nombre de la empresa o del producto. La repetición nos estaba causando algunos problemas (principalmente errores tipográficos o de copiar/pegar) pero también causa problemas, ya que aumenta la cantidad de texto que nuestro traductor tiene que traducir.¿Cómo evito la repetición en cadenas Java ResourceBundle?
La solución que se me ocurrió fue algo como esto:
public class ExpandingResourceBundleControl extends ResourceBundle.Control {
public static final ResourceBundle.Control EXPANDING =
new ExpandingResourceBundleControl();
private ExpandingResourceBundleControl() { }
@Override
public ResourceBundle newBundle(String baseName, Locale locale, String format,
ClassLoader loader, boolean reload)
throws IllegalAccessException, InstantiationException, IOException {
ResourceBundle inner = super.newBundle(baseName, locale, format, loader, reload);
return inner == null ? null : new ExpandingResourceBundle(inner, loader);
}
}
ExpandingResourceBundle
delegados al paquete de recursos reales, pero realiza la conversión de {{}} this.kind.of.thing para buscar la clave en Los recursos.
Cada vez que desee obtener uno de estos, usted tiene que ir:
ResourceBundle.getBundle("com/acme/app/Bundle", EXPANDING);
Y esto funciona bien - por un tiempo.
Lo que ocurre es que algún código nuevo (en nuestro caso código autogenerado que fue escupido de Matisse) busca el mismo paquete de recursos sin especificar el control personalizado. Esto parece ser no reproducible si escribe una prueba simple de unidad que lo llama con y luego sin, pero ocurre cuando la aplicación se ejecuta de manera real. De alguna manera, el caché dentro de ResourceBundle
expulsa el buen valor y lo reemplaza por el roto. Aún no entiendo por qué y los archivos jar de Sun se compilaron sin información de depuración, por lo que la depuración es una tarea ardua.
Mis preguntas:
¿Hay alguna manera de establecer a nivel mundial el ResourceBundle.Control por defecto que podría no ser consciente de? Eso resolvería todo de manera bastante elegante.
¿Hay alguna otra manera de manejar este tipo de cosas elegantemente, quizás sin alterar las clases de ResourceBundle?
Eso es algo que podría manejarse fácilmente mediante metaprogramación, si Java lo tuviera. –