<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ include file="/WEB-INF/jsp/include.jsp" %> Internacionalización con Spring

Internacionalización

Ramiro Lago Bagüés (Enero 2008)


Introducción

Resulta interesante tener todos los mensajes (normales o de error) en un archivo properties, además sería útil que tuviésemos un archivo properties por cada idioma, de tal forma que se cargase de manera automática el archivo properties de mensajes en función del idioma escogido en el sistema. En nuestro ejemplo pondremos en el directorio bin los siguientes archivos:

Si estuvieramos en un proyecto web, el directorio activo para los archivos properties es WEB-INF/classes. En nuestro ejemplo, como es una sencilla aplicación de consola, el directorio activo es bin.

La idea es usar el interface MessageSource para obtener de manera agil mensajes.

 

Definir el bean del tipo MessageSource

En el archivo xml de definición de contexto tenemos que indicar la creación de un bean del tipo MessageSource


	<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
		<property name="basenames">
			<list>
				<value>mensajes/textos</value>
				<value>mensajes/errores</value>
			</list>
		</property>
	</bean>

Algunos aspectos a resaltar:

 

Obtener los mensajes

En este ejemplo conseguimos el bean del tipo org.springframework.context.MessageSource a partir de una XmlBeanFactory. El método que utilizamos para conseguir el mensaje es getMessage(), que está sobrecargado. En la versión que utilizamos tenemos los siguientes argumentos:


	        XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource("org/xml/application-context.xml"));

	        MessageSource fuenteDeMensajes = (MessageSource) factory.getBean( "messageSource");

	        //// Obtengo un mensaje del properties por defecto (archivo textos.properties)
	        String mensaje = fuenteDeMensajes.getMessage("mensaje.bienvenida", null, "No hay mensaje de bienvenida", null);
	        System.out.println( mensaje );

	        //// Obtengo un mensaje del properties por defecto, usando argumentos (archivo errores.properties)
	        String str[] = {"Arg1","Arg2"};
	        mensaje = fuenteDeMensajes.getMessage("argumento.requerido", str, "No hay mensaje de error", null);
	        System.out.println( mensaje );

	        //// Obtengo un mensaje del properties en inglés (archivo textos_en.properties), definiendo el idioma con el 4º arg
	        Locale loc = new Locale( "en");
	        mensaje = fuenteDeMensajes.getMessage("mensaje.bienvenida", null, "No hay mensaje de bienvenida", loc);
	        System.out.println( mensaje );

En el primer uso de getMessage() realizamos la llamada más habitual: no hay argumentos ni idioma. En el segundo caso indicamos un array de argumentos. En el tercer caso indicamos el idioma inglés, que lo toma de textos_en.properties. La salida por pantalla sería:


Bienvenido al manejo de Bundle de Spring
Los argumentos "Arg1" y "Arg2" son requeridos
Welcome to use the Spring Bundle

Podríamos conseguir el MessageSource de manera más directa:


MessageSource fuenteDeMensajes = new org.springframework.context.support.ClassPathXmlApplicationContext("org/xml/application-context.xml");

En resumen, MessageSource cumple con las reglas del ResourceBundle del JDK.



Volver