Obtención de los literales de i18n de base de datos en JSF2.

Obtención de los literales de i18n de base de datos en JSF2.


0. Índice de contenidos.


1. Introducción

Hace poco publicábamos un tutorial sobre cómo obtener los literales de internacionalización (i18n) de una base de datos con el soporte de iBatis en una aplicación Spring MVC y, en este tutorial, siguiendo el mismo hilo argumental vamos a exponer cómo realizarlo en JSF2, configurando el sistema estándar y, haciendo uso del soporte de inyección de Spring, con Spring Data.

Este tutorial surge también como complemento al publicado sobre “selección manual de idioma en la interfaz de usuario con JSF2“, y respondiendo a una petición realizada por los asistentes a uno de nuestros últimos cursos de formación sobre JSF2; si, como es lógico, en el transcurso de los mismos no podemos abarcar aquello que queda fuera de temario, hacemos el esfuerzo de cubrirlo después a través de adictosaltrabajo.com.


2. Entorno.

El tutorial está escrito usando el siguiente entorno:

  • Hardware: Portátil MacBook Pro 15′ (2.4 GHz Intel Core i7, 8GB DDR3 SDRAM).
  • Sistema Operativo: Mac OS X Lion 10.7.4
  • JSF 2.1.12

3. Configuración.

La configuración a nivel de JSF, se centra en el xml de configuración faces-config.xml, asignando los idiomas soportados y el de por defecto.

Además, en la etiqueta <resource-bundle> en vez de asignar un prefijo para nuestros ficheros de recursos “messages.properties”, declaramos una referencia a una clase que resuelva la internacionalización de los literales. Esa clase es el punto crítico, que veremos en el siguiente punto.


4. Implementación del ResourceBundle.

Declarada la clase solo nos resta implementarla, y podría tener un código similar al siguiente, extendiendo de ResourceBundle:

Dos cuestiones claves:

  • Línea 20: la obtención del repositorio de MessageResourceRepository para realizar las consultas de los literales, para lo cuál se hace uso de una clase de utilidades que permite obtener un bean del contexto de Spring invocando a un método estático, y
  • Líneas 25 a 27: invocación a un método del repositorio pasando como parámetros, además del código del literal, el idioma obtenido del nodo raíz del contexto JSF.

La clase de utilidades que comentábamos podría tener un código como el siguiente:

Para construir el repositorio simplemente creamos la interfaz, siguiendo los pasos ya descritos en el tutorial sobre Spring Data no necesitamos nada más:

La entidad de persistencia para recuperar los literales podría tener las siguientes propiedades:

Esas propiedades se traducirán en las siguientes columnas en la tabla correspondiente de base de datos:

Para cubrir el resto de aspectos de nuestra aplicación es la configuración habitual tanto de JSF como de Spring para hacerlos convivir.


5. Conclusiones.

Con el soporte de Spring Data, la parte de persistencia queda bastante limpia de código y solo nos quedaría dar un toque de calidad añadiendo a la recuperación de base de datos una capa de caché que evite repetir las consultas puesto que serán, efectivamente, muy repetitivas.

Un saludo.

Jose

jmsanchez@autentia.com