example - java text messageformat format
¿Debo usar java.text.MessageFormat para mensajes localizados sin marcadores de posición? (5)
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 emitimos mensajes que están definidos en archivos de propiedades, del 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. Tienes que escribir dos para una comilla simple literal:
warning.item = This item''''s {0} is not valid.
Sin embargo, tres cuartas partes de los 1000 mensajes de la aplicación no incluyen un marcador de posición. Esto significa que podemos enviarlos directamente, evitando MessageFormat y dejando solos las comillas simples:
help.url = The web page''s URL
Pregunta: ¿Deberíamos usar MessageFormat para todos los mensajes, para sintaxis consistente, o evitar MessageFormat donde podamos, entonces la mayoría de los mensajes no necesitan escaparse?
Claramente, hay pros y contras de cualquier manera.
Tenga en cuenta que la documentación de API para MessageFormat reconoce el problema y sugiere una no solución:
Las reglas para usar citas dentro de los patrones de formato de mensaje desafortunadamente han demostrado ser algo confusas. En particular, no siempre es obvio para los localizadores si las comillas simples deben doblarse o no. Asegúrese de informar a los localizadores sobre las reglas y decirles (por ejemplo, mediante el uso de comentarios en los archivos fuente del paquete de recursos) qué cadenas serán procesadas por MessageFormat.
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 "compilar" sus archivos de propiedades para generarlos correctamente. Pero yo diría que utilicen MessageFormat en todas partes. De esta manera, a medida que mantiene el código, no necesita preocuparse por qué cadenas tienen formato y cuáles no. Se vuelve más simple de manejar, ya que puede transferir el procesamiento de mensajes a una biblioteca y no preocuparse por los detalles en un nivel alto.
Otra alternativa ... Al cargar el archivo de propiedades, simplemente ajuste el valor de entrada en un FilterInpuStream que duplica cada cita.
Simplemente escriba su propia implementación de MessageFormat sin esta característica molesta. Puede mirar el código de SLF4J Logger .
Tienen su propia versión de 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 pueden usar con el orden predeterminado y numerados para algunos casos de localización en los que diferentes idiomas hacen permutaciones de palabras o partes de oraciones.
Use el `carácter en vez de ''para citar. Lo usamos todo el tiempo sin problemas.
Use MessageFormat solo cuando lo necesite, de lo contrario, solo ensucian el código y no tienen ningún valor adicional.
Al final, decidimos dejar de lado el problema de la oferta única al usar siempre comillas ''rizadas'':
warning.item = This item/u2019s {0} is not valid.