Upload
roberto-moreno-donoro
View
110
Download
2
Embed Size (px)
Citation preview
mayo de 2005
I18N: Localización de contenidos
Introducción
Internacionalización “Proceso de diseñar una aplicación de forma que
pueda ser adaptada a diversos lenguajes y regiones sin tener que cambiar el código”
También conocida por “i18n”
¿Por qué molestarnos? Mercado global Mejor diseño de la aplicación
Java esta pensado para i18n ¡Struts también!
I18N en Java (I)
Requisitos para I18N Detectar y distinguir diferentes localizaciones Mostrar mensajes adaptados con el mismo ejecutable Escalabilidad sin recompilar Formatear datos sensibles a la localización (fechas,
monedas,...)
Clases clave para I18Njava.util.Locale Diferencia las localizaciones.
java.util.ResourceBundle Gestiona los mensajes y sus traducciones.
java.text.MessageFormat Permite formatear elementos como fechas o unidades monetarias.
I18N en Java (II)
“java.util.Locale” Estructura muy simple
Languaje (String) Código ISO 639: es, en, eu, fr,...
Country (String) Código ISO 3166: ES, UK, US, FR,...
Variant (String)
I18N en Java (III)
“java.util.ResourceBundle” Clase abstract: API para acceder a mensajes
PropertyResourceBundle ListResourceBundle
Ficheros de properties Renombrados para cada locale
Application.properties
Application_es_ES.properties
Application_fr.properties
ResourceBundle.getBundle("application",locale);
I18N en Java (y IV)
“java.text.MessageFormat” Permite utilizar mensajes como plantillas
que se rellenan en runtime
En el disco con etiqueta {0} hay {1} ficheros.
diskParameters[0] = (Object) diskName;diskParameters[1] = (Object) fileCount;formatter.applyPattern(messages.getString("disk.inventory"));String output = formatter.format(diskParameters);
En el disco con etiqueta Fotos del Viaje hay 24 ficheros.
Componentes I18N en Struts
Atributo “Locale” almacenado en la sesión LocaleAction MessageResources ResourceBundle ActionErrors ActionMessages Tags afectadas por I18N
Atributo “Locale” en sesión
Diferente de “ServletRequest.getLocale()”
Manipulable desde la aplicación Utilizado por el resto de componentes de
Struts Accesible como:
1.0: Action.LOCALE_KEY 1.1+: Globals.LOCALE_KEY
LocaleAction
Action que realiza un cambio de locale org.apache.struts.actions.LocaleAction
Recoge parámetros del request “language” “country” “page”: URL a la que redireccionar tras el cambio
Podemos configurar un forward si no utilizamos “page”: “success”.
Es necesario crear un “ActionForm” con los campos que vamos a utilizar Podemos usar un “DynaActionForm”
MessageResources
API de Struts para recuperar mensajes localizados
Por defecto: PropertyResourceBundle Podemos extenderlo a XML o BBDD
Manejada desde Tags Pero podemos acceder directamente
ResourceBundle (I)
Gestionados por el controlador Los carga según se necesitan Una vez cargados se mantienen en
memoria Struts carga uno por defecto, pero podemos
utilizar los que queramos
ResourceBundle (II)
Configurables desde “struts-config.xml”
Atributos “parameter”: nombre del archivo properties
Sin la extension Con el path dentro del classpath
“key”: identificador del bundle Si no se especifica es el default No puede haber varios default
<message-resources parameter=“es.captiva.ApplicationMessages“ null="false"/>
<message-resources parameter=“es.captiva.survey.SurveyMessages" key="survey" null="false"/>
ActionErrors
Mensajes de error que se devuelven del Action al formulario.
Vamos añadiendo “claves” Es posible añadir parámetros
Los salvamos en el request
Los mostramos con “<html:errors/>”
ActionErrors errors = new ActionErrors();errors.add(ActionErrors.GLOBAL_ERROR,new ActionError("record.updated",recordId));
saveErrors(request,errors);
ActionMessages
Reemplazan y complementan los ActionErrors desde v1.1
Se utiliza con el tag <h:messages> Nos permite añadir HTML al texto
Selector de mensajes o errores messages=“true” Combinación de errores y mensajes de éxito
<html:messages id="message" messages="true"><bean:write name="message"/><BR>
</html:messages>
Tags afectadas por I18N (I)
bean:messagebean:writehtml:errorshtml:htmlhtml:imagehtml:imghtml:messageshtml:optionhtml:buttonhtml:cancelhtml:checkbox
html:filehtml:hiddenhtml:multiboxhtml:passwordhtml:radiohtml:selecthtml:submithtml:texthtml:textareahtml:formhtml:link
Tags afectadas por I18N (II)Atributo Descripción y Tags
arg0 ...arg4
Valores para introducer como parámetros, si los hay. [message write]
bundle Nombre asociado al bundle de mensajes que ha de utilizarse. Si se omite se utiliza el bundle por defecto. [message write image img option errors messages]
key Clave del mensaje que ha de recuperarse del bundle de mensajes. Si no se indica se intenta utilizar el valor de los atributos “name” y “property”. [message write image img option]
locale Nombre del atributo de session que contiene el Locale. Si no se especifica se assume el por defecto. [message write image img errors messages]
altKey,titleKey
Clave del mensaje a utilizar para textos alternativos.[button cancel file hidden image img multibox password
radio reset select submit text textarea]
titleKey Clave para el mensaje que contiene el texto de titulo. (No alternative text.) [form link]
pageKey,srcKey
Clave del mensaje con la cadena que contiene el nombre la imagen a utilizar, como URL o path. [image img]
formatKey Clave que recupera una cadena con información de formateo. [write]
Tags afectadas por I18N (III)
<bean:write name="inputForm" property="amount" format="$#.##"/>
<bean:write name="inputForm" property="amount" formatKey="pattern.currency"/>
<bean:message key=“user.description" bundle=“UserMessages"/>
<html:image pageKey="images.sign" altKey="images.sign.alt"titleKey="images.sign.title">
I18N en tiles
Diferentes layout según locales Utilizando el mismo esquema de nombres
que para los properties
I18N en validación (I)
Diferentes validaciones según locale Formatos de datos diferentes Campos que no aplican
I18N en validación (y II)<formset>
<form name="registrationForm"><field property="postOffice" depends="required"> <arg0 key="registrationForm.postOffice.displayname"/></field><field property="postalCode" depends="required,mask">
<arg0 key="registrationForm.postalCode.displayname"/><var>
<var-name>mask</var-name><var-value>^\d{5}\d*$</var-value>
</var></field>
</form>
<form name="registrationForm" locale="fr" country="CA"locale="fr" country="CA"><field property="postalCode“ depends="required,mask"> <arg0 key="registrationForm.postalCode.displayname"/><var>
<var-name>mask</var-name><var-value>^[a-zA-Z]*$</var-value>
</var></field>
</form></formset>
Localizando... (I)
Activar “locale”: por defecto lo está
Ficheros de mensajes WEB-INF/classes
Ficheros sueltos
WEB-INF/lib Dentro de los JAR
<init-param><param-name>locale</param-name><param-value>true</param-value>
</init-param>
Localizando... (y II)
Reemplazamos el texto por tags <bean:message>
Realizamos las traducciones