Cuando se diseña una aplicación web se utiliza un idioma para generar la información, pero generalmente se quiere que pueda encontrarse expresada en algún otro idioma más.
La internacionalización es el proceso que permite diseñar una aplicación de tal forma que se encuentre adaptada a varios lenguajes y regiones sin cambios en la aplicación.
La localización, en cambio, es el proceso de adaptación software para un lenguaje o región específica añadiendo un componente específico local y texto de traducción.
La principal tarea de la localización es traducir todos los elementos y documentación de la interface de usuario. Implica, no sólo cambios en la interacción del lenguaje, sino también cambios en representación numérica, fechas, monedas, etc.
JSF tiene soporte para internacionalización y localización. La implementación de referencia proporciona mensajes de error para validaciones y conversiones.Si se quiere adaptar el resto del texto de una aplicación a diferentes localizaciones se necesitará realizar un pequeño esfuerzo: Hay que informar a JSF de qué lenguajes se quieren soportar.
- Se necesita crear un Resource Boundle (conjunto de cadenas de caracteres).
- Una vez cargado el Resource Boundle se podrá hacer referencia a cadenas de caracteres en varios idiomas sin más que teniendo su identificador.
Configuración de localizaciones
Una localización representa una combinación de país y lenguaje.
Desde el punto de vista técnico, una localización es representada mediante una cadena en dos partes: código del país y código del lenguaje. Los códigos de los lenguajes son dos letras en minúscula. En cambio, los códigos de los países son dos letras en mayúscula.
El primer paso para soportar múltiples lenguajes es informar a la aplicación cuáles son soportadas. Esta tarea se realiza en el fichero de configuración. Veamos un ejemplo:
<application> <locale-config> <default-locale>en</default-locale> <supported-locale>en</supported-locale> <supported-locale>es</supported-locale> </locale-config> <message-bundle>CustomMessages</message-bundle> </application>
Esto significa que soporta el inglés y el español, y que el inglés es el lenguaje por defecto. Se puede ser aún más específico:
<application> <locale-config> <default-locale>en</default-locale> <supported-locale>en</supported-locale> <supported-locale>en_US</supported-locale> <supported-locale>es_ES</supported-locale> </locale-config> <message-bundle>CustomMessages</message-bundle> </application>
De esta forma indicamos que soporta el inglés de Estados Unidos y el español de España. La localización del cliente será determinada gracias a la aplicación cliente. Los navegadores envían una cabecera HTTP que especifica el lenguaje que soportan. Una vez que se ha configurado la aplicación correctamente, hay que almacenar los distintos textos de la aplicación en los distintos lenguajes en Resource bundles. No son más que ficheros de propiedades con pares clave/valor. Cada cadena tiene una clave que es la misma clave para los distintos idiomas. Veamos algún ejemplo: Para inglés:
LocalizacionRecursos_en.properties halloween=Every day is like Halloween. numberOfVisits=You have visited us {0} time(s), {1}. Rock on! toggleLocale=Translate to Spanish helloImage=../images/hola.gif
No se puede utilizar el punto en tecnología JSF para crear claves en este tipo de fichero.
Estos ficheros pueden ser almacenados en cualquier lugar de la aplicación, aunque es muy recomendable almacenarlos en la carpeta WEB-INF/classes.