2009-01-30 13 views
11

Localizamos 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.¿Debo usar java.text.MessageFormat para mensajes localizados sin marcadores de posición?

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

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

MessageFormat es molesto, ya que una sola cita es un carácter especial, a pesar de ser común en el texto Inglés. Usted tiene que escribir dos por una comilla simple literal:

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

Sin embargo, las tres cuartas partes de 1000 más o menos mensajes de la aplicación no incluyen un marcador de posición. Esto significa que podemos hacer salir directamente, evitando MessageFormat, y dejar las comillas simples solos:

help.url = The web page's URL 

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

Existen claramente pros y contras en ambos sentidos.

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

Las reglas para el uso de citas dentro mensaje modelos de formato lamentablemente han demostrado ser un tanto confuso. En particular, no siempre es obvio a los localizadores si las comillas simples deben doblarse o no. Asegúrese para informar a los localizadores sobre las reglas, y cuéntelas (por ejemplo, mediante el uso de comentarios en los archivos fuente fuente ) qué cadenas serán procesadas por MessageFormat.

Respuesta

2

Simplemente escriba su propia implementación de MessageFormat sin esta función molesta. Puede mirar el código de SLF4J Logger.

Ellos tienen su propia versión del mensaje formateador que se puede utilizar como siguen:

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

marcadores de posición vacíos podrían utilizarse con orden predeterminado y numeradas para algunos casos de localización en diferentes idiomas hacen permutaciones de palabras o partes de frases.

+0

¿Es posible utilizar la librería antes de simplemente dar formato a una cadena sin embargo? –

+0

parece que este mecanismo está enterrado profundamente en el código. tal vez tengas más suerte: http://logback.qos.ch/download.html –

+0

De hecho, así que supongo que buscaré una implementación alternativa. –

-1

Otra alternativa ... Al cargar el archivo de propiedades, simplemente ajuste la intensidad de entrada en un FilterInpuStream que duplica cada cita.

+0

No todos sus mensajes requieren dos comillas simples. Lo que significa que tiene que hackear el reconocimiento de cadenas de formato de mensaje. Eek. – JonMR

1

Use el `carácter en lugar de 'para hacer comillas. 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.

0

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.

2

Al final nos decidimos a esquivar el problema único cotización utilizando siempre ‘rizado’ cita:

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