22
mayo de 2005 I18N: Localización de contenidos

08 i18 n

Embed Size (px)

Citation preview

Page 1: 08 i18 n

mayo de 2005

I18N: Localización de contenidos

Page 2: 08 i18 n

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!

Page 3: 08 i18 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.

Page 4: 08 i18 n

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)

Page 5: 08 i18 n

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);

Page 6: 08 i18 n

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.

Page 7: 08 i18 n

Componentes I18N en Struts

Atributo “Locale” almacenado en la sesión LocaleAction MessageResources ResourceBundle ActionErrors ActionMessages Tags afectadas por I18N

Page 8: 08 i18 n

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

Page 9: 08 i18 n

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”

Page 10: 08 i18 n

MessageResources

API de Struts para recuperar mensajes localizados

Por defecto: PropertyResourceBundle Podemos extenderlo a XML o BBDD

Manejada desde Tags Pero podemos acceder directamente

Page 11: 08 i18 n

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

Page 12: 08 i18 n

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"/>

Page 13: 08 i18 n

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);

Page 14: 08 i18 n

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>

Page 15: 08 i18 n

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

Page 16: 08 i18 n

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]

Page 17: 08 i18 n

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">

Page 18: 08 i18 n

I18N en tiles

Diferentes layout según locales Utilizando el mismo esquema de nombres

que para los properties

Page 19: 08 i18 n

I18N en validación (I)

Diferentes validaciones según locale Formatos de datos diferentes Campos que no aplican

Page 20: 08 i18 n

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>

Page 21: 08 i18 n

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>

Page 22: 08 i18 n

Localizando... (y II)

Reemplazamos el texto por tags <bean:message>

Realizamos las traducciones