MessageFormat en Java

 

Java nos proporciona la clase MessageFormat para la construcción de mensajes de texto que se muestran en pantalla. En vez de construir un mensaje concatenando cadenas (para los puristas: no pongo StringBuilder para simplificar)

String mensaje = "se han encontrado " + numeroErrores + "errores";

deberíamos usar la clase MessageFormat, de esta manera

String mensaje = MessageFormat.format ("se han encontrado {0} errores", numeroErrores);

En este caso, MessageFormat reemplaza {0} por el valor de la variable que le pasamos. Podemos poner más variables poniendo {1}, {2}  y así sucesivamente.

¿Por qué es importante usar MessageFormat en vez de construir la cadena como en el primer ejemplo?

Aparte de que MessageFormat tiene más posibilidades que no menciono aquí, un motivo importante es la posible traducción a otros idiomas de nuestra aplicación. Antes de nada, que quede claro que no tengo ni papa de inglés, así que el ejemplo que pongo seguro que es totalmente incorrecto. Quédate con la idea y no con los detalles.

Supongamos que usamos la primera forma, construyendo el String a partir de varios cachos. Si para preparar el código para otro idioma usamos la internacionalización de nuestro IDE, lo más probable es que nos saque un fichero de propiedades con algo como esto

propiedad1=se han encontrado
propiedad2=errores

Ahora vamos y le damos esto a nuestro traductor favorito. El ve un trozo de frase y una palabra. De ninguna forma puede adivinar que forman parte de la misma frase, así que traduce cada cacho separado y nos lo da

propiedad1=have been found
propiedad2=errors

y la frase en nuestro código quedará como "have been found 3 errors". Ya digo que no sé inglés, pero posiblemente esta frase no está bien construida para un inglés.

Sin embargo, si hubiesemos usado MessageFormat, habríamos obtenido este fichero de propiedades

propiedad1=se han encontrado {0} errores

y advirtiendo al traductor que los {0} serán datos que se pongan en esa posición de la frase, él posiblemente lo traduzca por algo como

propiedad1={0} errors have been found

y el texto quedará "3 errors have been found". Insisto en que no sé inglés, pero posiblemente esta frase esté mejor construida que la anterior.

 

Esta entrada ha sido publicada en buenas costumbres de programación, java, Lenguajes de Programación y etiquetada como , . Guarda el enlace permanente.

8 respuestas a MessageFormat en Java

  1. mercu dijo:

    Lo cierto es que de esta forma queda mucho mas elegante. Has comentado que tiene mas ventajas podrias comentarlas? Me parece un tema muy intereaante.

  2. Chuidiang dijo:

    Hola:

    Las demás ventajas. Complicando un poco el código se puede conseguir que el mensaje quede como

    «no se han encontrado errores»
    «se ha encontrado 1 error»
    «se han encontrado 3 errores»

    es decir, los plurales, pequeños cambios para el caso de cero, etc. Para ver los detalles, echa un ojo en la API http://java.sun.com/javase/6/docs/api/java/text/MessageFormat.html en el que hay varios ejemplos.

    Se bueno.

  3. mercu dijo:

    muchas gracias ya le he hechdo un ojo, y esta muy interesante.

  4. mikelber dijo:

    Gracias!,
    lo necesitaba para enviar emails automaticos con parámetros

  5. Oscar dijo:

    Que traductor usas para poder decirle que coloque lo de {0}???

  6. Chuidiang dijo:

    Me refiero a un traductor humano. No me fío de un traductor automático para una traducción seria de una aplicación.

  7. Edwinem dijo:

    Muchas gracias, eres de mucha ayuda dando ideas!

  8. Chuidiang dijo:

    @Oscar, si pruebas google translator y donde la palabra pones {0}, {1} … verás que te hace la traducción y te conserva ese {0}, {1} … En cualquier caso, como te digo, la traducción posiblemente no sea muy de fiar, con o sin {0}, {1} …

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.