Internacionalización

Jsf tiene soporte para internalización, también llamado i18n, donde 18 es el número de letras entre la i y la n en “internationalization”. Para saber el idioma que vamos a utilizar se utiliza el “Locale”, que representa una combinación del código del idioma y del código del país. El código del idioma es obligatorio, y está formado por dos letras en minúscula, por ejemplo “en”, para el Inglés o “es” para el Español. El código del país, se representa con dos letras mayúsculas, por ejemplo “ES”, para España. Locales válidos pueden estar formados únicamente por el idioma, como “en”, o “es”, o bien, por la combinación del idioma y el país, como por ejemplo “en_US” o “es_ES”.

i18n

i18n

Definir los locales soportados

Para configurar el locale, hay que especificar los locales que se van a utilizar en el fichero faces-config.xml

Estamos indicando que el idioma por defecto es el español, y que se soportan otros locales como el inglés, el español de España y el inglés de Estados Unidos.

Una vez que hemos especificado los idiomas a utilizar, tenemos que crear los archivos de recursos con las distintas traducciones “resource bundles”. Estos ficheros están formados por pares, clave/valor, con las claves a utilizar y los mensajes. Las claves son las mismas para todos los locales, por ejemplo, podríamos crear un fichero para el idioma español “literales_es.properties”, con este contenido:

Y su equivalente para el idioma inglés en el fichero “literales_en.properties”:

NOTA: Dos cosas a tener en cuenta. 1. No se pueden utilizar puntos “.”, en las claves, ya que es un valor reservado en expresiones EL. 2. Una vez creado el fichero de recursos habrá que codificarlo usando caracteres Unicode.

Como se puede ver, el nombre de los ficheros está formado por “literales” seguido del idioma y de “.properties”. El fichero de recursos a utilizar por defecto se llamaría, en este ejemplo “literales.properties”. Los ficheros de recursos se colocarán en el classpath

Personalizar los mensajes Jsf

En el caso de los validadores y conversores estándar, se utilizan mensajes predefinidos, podemos ver algunos de ellos:

Podemos personalizar estos mensajes para los distintos idiomas que nos interese, sobreescribiendo estas claves en el fichero de recursos multiidioma, de modo que se muestre el texto que nos interese. Por ejemplo, podríamos añadir las siguientes claves, en el fichero “literales_es_ES.properties”:

Usar el fichero de recursos en los componentes

En la vista, se puede utilizar una etiqueta como la siguiente:

En “basename” se especifica el nombre del fichero en el classpath, en el ejemplo anterior, hemos colocado los ficheros multiidioma en el paquete “com.notodocodigo.i18n”. Con “var”, le damos una etiqueta para tener acceso a cada clave multiidioma. Ahora podremos acceder a la clave “saludo”, con la expresión “#{msg.saludo}”.

También se puede especificar el fichero de recursos de manera global en faces-config.xml, de este modo:

Determinar el locale actual a utilizar

El locale a utilizar se determina a partir del locale configurado en la aplicación cliente. Los navegadores web, envían una cabecera HTTP, que especifica el lenguaje soportado. En Jsf el locale a utilizar se determina por la unión del locale del navegador y los locales soportados, aunque se puede determinar un locale configurándolo en la vista con la etiqueta .

Aquí finalizamos este artículo, en el próximo hablaremos sobre los eventos en Jsf. Si te ha gustado el artículo, no dudes en poner un comentario.

5 comentarios:

  1. Ludwin Buitrago

    Hola notodocodigo.

    Me gusta poder ver las diferentes formas de establecer la internacionalización.
    Pero me queda la duda de que si decido usar la etiqueta
    para establecer el idioma por defecto y los soportados.
    Como indico la ruta de los archivos de propiedades de cada idioma
    pensaria que debo hacerlo en el faces-config.xml tambien.
    y me queda la duda si debo definir todas las rutas de todos mis archivos
    de mensajes en el faces-config.xml para luego poder hacer los
    cambios por medio del metodo FacesContext.getCurrentInstance().getViewRoot().setLocale(Locale ….);

    Gracias

    • Hola Ludwin

      Únicamente hay que hacer referencia a un único fichero de propiedades, por ejemplo:
      com.notodocodigo.i18n.literales
      El resto de ficheros ya los carga Jsf en función del locale que se esté utilizando.
      Si estamos usando el locale es_ES, buscará el fichero
      com.notodocodigo.i18n.literales_es_ES.properties
      y si no lo encuentra, usará el fichero por defecto
      com.notodocodigo.i18n.literales.properties

      Para hacer referencia al fichero se puede indicar esto en la vista
      o en faces-config.xml
      Creo que no es obligatorio definir los locales por defecto.

      Un saludo

  2. Me preguntaba si me puedes ayudar con algo.

    Sucede que estoy “traducciendo” mi aplicación al portugues de brasil, al ingles y al español. La cuestion en todos los idiomas me funciona bien excepto en en portugues.

    No se si es por el codigo del idioma (pt – portugues) o br (br – portugues brasil). No he encontrado un listado oficial de codigos de idiomas para jsf 2.2 que es la versión que estoy utilzando.

    Agradezco me puedas ayudar

  3. Vladimir Alfaro

    No pongo comentarios, pero te lo ganastes!! Exelente post! 😀

Deja un comentario

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