Pregunta

Hemos tenido una gran cantidad de cadenas que contenía la misma sub-cadena, desde frases sobre comprobando el registro o la forma de soporte de contacto, a la marca como cadenas que contengan la empresa o producto nombre. La repetición estaba causando algunos problemas para nosotros mismos (principalmente tipográficos o copiar / pegar errores) pero también causa problemas ya que aumenta la cantidad de texto nuestro traductor tiene que traducir.

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 se desea conseguir uno de estos, se tiene que ir:

ResourceBundle.getBundle("com/acme/app/Bundle", EXPANDING);

Y esto bien las obras -. Por un tiempo

Lo que pasa es que con el tiempo algún código nuevo (en nuestro código autogenerado caso que se escupió de Matisse) busca el mismo paquete de recursos sin especificar el control personalizado. Esto parece ser no reproducibles si se escribe una prueba de unidad simple que lo llama y luego con el exterior, sino que se produce cuando la aplicación se ejecuta de verdad. De alguna manera la memoria caché dentro ResourceBundle expulsa el valor bueno y lo sustituye por el roto. Todavía tengo que averiguar por qué y archivos jar de Sun fueron compilados y sin información de depuración de modo debugging es una tarea.

Mis preguntas:

  1. ¿Hay alguna manera de establecer a nivel mundial el ResourceBundle.Control por defecto que podría no ser consciente de? Eso resolvería todo lugar elegante.

  2. ¿Hay alguna otra manera de manejar este tipo de cosas con elegancia, tal vez sin la manipulación de las clases ResourceBundle en absoluto?

¿Fue útil?

Solución

Creo que esto es un defecto fundamental en la forma ResourceBundles están diseñados para funcionar: las claves de referencia que otras teclas violan automáticamente el seco (no se repiten a sí mismo) principio. La forma en que me dieron en torno a esta era similar a su método: crear una clase ReflectiveResourceBundle que le permite especificar las claves de recursos en los mensajes usando la notación EL

.

THE WAY MAL:

my.name.first=Bob
my.name.last=Smith
my.name.full=Bob Smith

la manera correcta:

my.name.first=Bob
my.name.last=Smith
my.name.full=${my.name.first} ${my.name.last}

He cargado el código de GitHub por lo que cualquiera puede descargar o demás eso. Además, he añadido un código de ejemplo para cualquier persona que utilice el Marco de Rayas ( http://www.stripesframework.org/ ) para llegar rápidamente y funcionando.

El truco para conseguir que esto funcione con taglibs fmt JSTL norma fue la creación de un interceptor que reemplazó el recurso de HttpServletRequest con los nuestros. La apariencia del código de algo como esto:

ResourceBundle bundle = MyStaticResourceHoldingTheBundle.getBundle();
Config.set(request, Config.FMT_LOCALIZATION_CONTEXT, new LocalizationContext(bundle, locale));

Tome un vistazo al paquete stripes.interceptor en el enlace anterior para más detalles.

Otros consejos

Si las repeticiones de cadena se localizan en el sentido de que usted conoce a una determinada cadena se repetirá pero sólo dentro de un mismo proyecto de tal manera que el intercambio de paquetes de recursos no es una pesadilla de diseño, entonces usted podría considerar romper las cadenas hacia abajo en número- múltiple partes de valor. Separar las partes que se repiten de aquellos que no lo hacen y reutilizar las piezas repetidas. Por ejemplo, digamos que usted tiene los siguientes dos cadenas se necesita mostrar:

  1. "El Robin cubiertas de rojo es un pequeño natural paseriformes a Australia."
  2. "The Robin Rojo-capsulado se encuentra en regiones del secador a través de gran parte del continente."

El paquete de recursos podría ser como sigue:

robin.name=The Red-capped Robin
robin.native=is a small passerine bird native to Australia.
robin.region=is found in dryer regions across much of the continent.

y luego combinar las piezas necesarias donde bundle.getString("robin.name")+bundle.getString(robin.native). necesaria

Una cosa que hay que tener cuidado es que aunque las reglas de la gramática como fin sujeto predicado etc. podría no ser la misma en todos los idiomas. Por lo que tendría que ser un poco cuidadoso cuando las sentencias de división.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top