¿Debo usar java.text.MessageFormat para mensajes localizados sin marcadores de posición?

StackOverflow https://stackoverflow.com/questions/495776

Pregunta

Estamos localizando el texto de la interfaz de usuario para una aplicación web que se ejecuta en Java 5, y tenemos un dilema sobre cómo enviamos mensajes que se definen en archivos de propiedades, el tipo utilizado por java.util.Properties .

Algunos mensajes incluyen un marcador de posición que se completará usando java.text.MessageFormat . Por ejemplo:

search.summary = Your search for {0} found {1} items.

MessageFormat es molesto, porque una comilla simple es un carácter especial, a pesar de ser común en el texto en inglés. Debe escribir dos para una cita literal literal:

warning.item = This item''s {0} is not valid.

Sin embargo, tres cuartos de los aproximadamente 1000 mensajes de la aplicación no incluyen un marcador de posición. Esto significa que podemos generarlos directamente, evitando MessageFormat y dejar las comillas simples:

help.url = The web page's URL

Pregunta: ¿deberíamos usar MessageFormat para todos los mensajes, para una sintaxis coherente, o evitar MessageFormat donde podamos, por lo que la mayoría de los mensajes no necesitan escapar?

Hay claramente ventajas y desventajas de cualquier manera.

Tenga en cuenta que la documentación de la API para MessageFormat reconoce el problema y sugiere una falta de solución:

  

Las reglas para usar comillas dentro de   patrones de formato de mensaje desafortunadamente   han demostrado ser algo confusos.   En particular, no siempre es obvio   a los localizadores si comillas simples   necesita ser duplicado o no. Asegurarse   para informar a los localizadores sobre las reglas,   y decirles (por ejemplo, usando   comentarios en la fuente del paquete de recursos   archivos) qué cadenas se procesarán   por MessageFormat.

¿Fue útil?

Solución

Simplemente escriba su propia implementación de MessageFormat sin esta característica molesta. Puede consultar el código de SLF4J Logger .

Tienen su propia versión del formateador de mensajes que se puede usar de la siguiente manera:

logger.debug("Temperature set to {}. Old temperature was {}.", t, oldT);

Los marcadores de posición vacíos se podrían usar con un orden predeterminado y numerados para algunos casos de localización en los que diferentes idiomas realizan permutaciones de palabras o partes de oraciones.

Otros consejos

Al final decidimos evitar el problema de comillas simples usando siempre & # 8216; curly & # 8217; citas:

warning.item = This item\u2019s {0} is not valid.

Use el carácter `en lugar de 'para citar. Lo usamos todo el tiempo sin problemas.

Use MessageFormat solo cuando lo necesite, de lo contrario, solo se hinchará el código y no tendrá valor adicional.

En mi opinión, la consistencia es importante para este tipo de cosas. Los archivos de propiedades y MessageFormat ya tienen muchas limitaciones. Si encuentra estos problemas, podría & Quot; compilar & Quot; sus archivos de propiedades para generar los formados correctamente. Pero yo diría ir con el uso de MessageFormat en todas partes. De esta manera, a medida que mantiene el código, no necesita preocuparse sobre qué cadenas están formateadas y cuáles no. Resulta más sencillo tratarlo, ya que puede transferir el procesamiento de mensajes a una biblioteca y no preocuparse por los detalles a un alto nivel.

Otra alternativa ... Al cargar el archivo de propiedades, simplemente envuelva el flujo de entrada en un FilterInpuStream que duplica cada cotización.

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