Tratar con Mensajes Concatenados

En esta sección pasaremos a través de un programa de ejemplo para demostrar cómo internacionalizar un mensaje concatenado. El programa de ejemplo hace uso de la clase MessageFormat. El código fuente completo los puedes encontrar en MessageFormatDemo.java.

1. Identificar las Variables del Mensaje

La versión inglesa del mensaje que queremos internacionalizar es esta:
At 1:15 PM on April 13, 1998, we detected 7 spaceships on the planet Mars.
      ^             ^                     ^                           ^
      |             |                     |                           |
     Date          Date                 Number                      String

Observa que hemos subrayado las variables, y hemos identificado qué tipo de objetos representará estos datos.

2. Aislar el Patrón del Mensaje en un ResourceBundle

Vamos a almecenar el mensaje en un ResourceBundle llamado MessageBundle. Aquí tienes el código de creacción del ResourceBundle:
ResourceBundle messages =
   ResourceBundle.getBundle("MessageBundle",currentLocale);
Este ResourceBundle está compuesto por un fichero de propiedades para cada Localidad. Como nuestro ResourceBundle se llama MessageBundle, el fichero de propiedades para la Localidad U.S. English se llamará MessageBundle_en_US.properties. Aquí tienes los contendos de este fichero de propiedades:
template = At {2,time,short} on {2,date,long}, we detected {1,number,integer} spaceships on the planet {0}.
planet = Mars
Hemos especificado el patrón en la primera línea del fichero de propiedades. Si comparamos este patrón con el mensaje de texto mostrado en el paso 1, veremos que se ha reemplazado cada variable del mensaje con un argumento encerrado entre corchetes. Cada argumento empieza con un dígito llamado el número de argumento, que corresponde con el índice de un elemento en un array de Object que contiene los valores de los argumentos. Observa que en el patrón, estos argumentos no están en ningún orden particular. Se pueden situar los argumentos en cualquier orden dentro del patrón. El único requerimiento es que el número del argumento tenga un elemento correspondiente en el array de valores de los argumentos. En el siguiente paso explicaremos el array de valores de argumentos, pero primero echemos un vistazo a todos los argumentos del patrón. La siguiente tabla proporciona algunos detalles sobre los argumentos.

ArgumentoDescripción
{2,time,short} La parte horaria de un objeto Date. El estilo "short" especifica el estilo de formato DateFormat.SHORT.
{2,date,long} La parte de la fecha de un objeto Date. El mismo objeto Date se utiliza para las dos variables de fecha y hora. En el array de argumentos Object el índice que contiene el objeto Date es el 2.
{1,number,integer} Un objeto Number, además cualificado con el estilo numérico "integer".
{0} El String del ResourceBundle que corresponde con la clave "planet".

Para una descripción completa de la síntaxis de argumentos, puedes ver la documentación del API para la clase MessageFormat.

3. Seleccionar los Argumentos del Mensaje

En las siguientes líneas de código, asignamos los calores para cada argumento del patrón. Los índices de los elementos del array messageArguments corresponden con los números de los argumentos del patrón. Por ejemplo, el elemento de índice 1, que es un Integer(7), corresponde con el argumento {1,number,integer} del patrón. Extraemos los objetos String, que son los elementos 0 y 3, del ResourceBundle con getString, porque deben ser traducidos. El array de argumentos del mensaje se define de esta forma:
Object[] messageArguments = {
   messages.getString("planet"),
   new Integer(7),
   new Date()
};

4. Crear el Formateador

Luego, creamos un objeto MessageFormat. Seleccionamos la Localidad porque nuestro mensaje contiene objetos Date y Number, que deberían ser formateados de una manera sensible a la Localidad. Por ejemlo en inglés NorteAmericano la fechas 4/13/98 está en el formato correcto, pero en francés debería formatearse como 13/04/98. Creamos el formateador de mensajes de la siguiente forma:
MessageFormat formatter = new MessageFormat("");
formatter.setLocale(currentLocale);

5. Formatear el Mensaje utilizando el Patrón y los Argumentos

En este paso, demostraremos como trabajan juntos, el patrón, los argumentos del mensaje y el formateador. Primero, extraemos el String del patrón del ResourceBundle con el método getString. La clave para el patrón es "template." Pasamos el patrón al formateador con el método applyPattern. Luego, formateamos el mensaje utilizando el array de argumentos del mensaje llamando al método format. El String devuelto por este método ya está listo para utilizar. Todo esto se realiza con sólo dos líneas de código:
formatter.applyPattern(messages.getString("template"));
String output = formatter.format(messageArguments);

6. Ejecutar el Programa de Desmostración

Veamos que sucede cuando el programa se ejecuta con la Localidad U.S. English:
% java MessageFormatDemo en US

currentLocale = en_US

At 1:15 PM on April 13, 1998, we detected 7 spaceships on the planet Mars.
Cuando se ejecuta el programa para la Localidad Alemana, observamos que la fecha y la hora han sido localizadas:
% java MessageFormatDemo de DE

currentLocale = de_DE

Um 13.15 Uhr am 13. April 1998 haben wir 7 Raumschiffe auf dem Planeten Mars entdeckt.

Ozito