Internacionalización (I18n) con DisplayTag y Spring

La librería de tags Displaytag nos permite mostrar listas de objetos en forma de tabla, facilitandónos la ordenación, la paginación de los resultados, el agrupamiento, la exportación de datos, etc., tal cómo ya habíamos comentado en un post anterior. La configuración se realiza mediante un fichero de propiedades que debe localizarse en el CLASSPATH de la aplicación, llamado display-tag.properties. En él se definen, tanto los estilos y apariencia, como los mensajes que aparecerán cuando se muestran los controles de paginación, o no hay datos, etc. La labor de configuración es bastante sencilla, pero cuando tu aplicación es multiidioma y necesitas configurar los mensajes o etiquetas que aparecen en la tabla en función del idioma del usuario, el tema no es tan trivial.

Displaytag

En nuestra aplicación desarrollamos con Spring framework y tenemos configurada la internacionalización en el fichero xml de configuración de Spring de la siguiente forma:
<!-- Bean para recoger el archivo de propiedades con los mensajes -->
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basenames">
<list>
<value>/WEB-INF/properties/messages</value>
</list>
</property>
<!-- Tiempo para la actualización del archivo properties -->
<property name="cacheSeconds" value="60"></property>
</bean>
<!-- Bean para cambiar el idioma (permite cambiar el “Locale” actual en cada petición al servidor, mediante el uso del parámetro 'siteLanguage') -->
<bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
<property name="paramName">
<value>siteLanguage</value>
</property>
</bean>
<!-- Bean que especifica el "locale" actual utilizando la sesión del usuario -->
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"></bean>

Por defecto la aplicación recoge el idioma en el que esté configurado el navegador, pero una vez que hemos iniciado la aplicación podemos modificar el idioma durante la sesión del usuario. Para esto se realizará una petición al servidor con el parámetro “siteLanguage” y el nuevo locale. Hemos tenido que realizar una tarea previa en las páginas para que no inserten los mensajes de forma literal, sino que contengan una clave con la que se obtengan los mensajes almacenados en el fichero de propiedades. En nuestro caso utilizamos el fichero messages.properties para los mensajes en castellano y messages_en.properties para los mensajes en inglés, por ejemplo (el sufijo representa el idioma, en, es, de, it,fr,etc.).

Tan sólo nos falta la configuración del displaytag para que tanto los mensajes como los títulos de las columnas de la tabla se configuren siguiendo el idioma seleccionado. En el caso de los encabezados de las columnas actuamos de la misma manera que en las demás etiquetas de la página, es decir, en la cabecera hacemos referencia a una clave que recogerá el mensaje del fichero de mensajes con el idioma correspondiente:

<display:column titleKey="etiq.tabla.titulo" property="titulo" sortable="true" sortProperty="titulo"></display:column>

Los demás mensajes de la tabla se recogen del fichero de configuración displaytag.properties. En él se deben añadir estas dos líneas:
# locale provider (Jstl provider by default)
locale.provider=org.displaytag.localization.I18nSpringAdapter
# locale.resolver (nothing by default, simply use locale from request)
locale.resolver=org.displaytag.localization.I18nSpringAdapter

Una vez hecho esto tenemos que configurar un nuevo fichero displaytag.properties con el sufijo correspondiente al idioma seleccionado (displaytag_en.properties, displaytag_de.properties, etc.), pero únicamente con las claves de los mensajes que queremos cambiar con el idioma, no es necesario duplicar todo el fichero, ya que los valores que no se encuentren los recoge del original. Este nuevo fichero se debe localizar en la misma carpeta, siempre en el classpath de la aplicación, como por ejemplo en la carpeta donde residan las clases java.

Una respuesta a “Internacionalización (I18n) con DisplayTag y Spring”

Deja un comentario

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