SlideShare una empresa de Scribd logo
I18N: Localización de contenidos


             mayo de 2005
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 I18N
    java.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   ResourceBundle.getBundle("application",locale);



          Application_fr.properties
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”
          <message-resources parameter=“es.captiva.ApplicationMessages“
                   null="false"/>
          <message-resources parameter=“es.captiva.survey.SurveyMessages"
                   key="survey"
                   null="false"/>

       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
ActionErrors
       Mensajes de error que se devuelven del Action
        al formulario.
       Vamos añadiendo “claves”
         Es posible añadir parámetros
            ActionErrors errors = new ActionErrors();
            errors.add(ActionErrors.GLOBAL_ERROR,
            new ActionError("record.updated",recordId));


       Los salvamos en el request
            saveErrors(request,errors);


       Los mostramos con “<html:errors/>”
ActionMessages
   Reemplazan y complementan los
    ActionErrors desde v1.1
   Se utiliza con el tag <h:messages>
        Nos permite añadir HTML al texto
        <html:messages id="message" messages="true">
                <bean:write name="message"/><BR>
        </html:messages>

        Selector de mensajes o errores
           messages=“true”
           Combinación de errores y mensajes de éxito
Tags afectadas por I18N (I)

bean:message    html:file
bean:write      html:hidden
html:errors     html:multibox
html:html       html:password
html:image      html:radio
html:img        html:select
html:messages   html:submit
html:option     html:text
html:button     html:textarea
html:cancel     html:form
html:checkbox   html:link
Tags afectadas por I18N (II)
Atributo       Descripción y Tags
arg0 ...       Valores para introducer como parámetros, si los hay. [message write]
arg4
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,        Clave del mensaje a utilizar para textos alternativos.
titleKey       [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,       Clave del mensaje con la cadena que contiene el nombre la imagen a
srcKey                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">
                                                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á
             <init-param>
                 <param-name>locale</param-name>
                 <param-value>true</param-value>
             </init-param>


   Ficheros de mensajes
       WEB-INF/classes
           Ficheros sueltos
       WEB-INF/lib
           Dentro de los JAR
Localizando... (y II)
   Reemplazamos el texto por tags
       <bean:message>
   Realizamos las traducciones

Más contenido relacionado

La actualidad más candente

Structured Query Language (Guía rápida)
Structured Query Language (Guía rápida)Structured Query Language (Guía rápida)
Structured Query Language (Guía rápida)
Juan Pablo Cid Velasco
 
Manual Java Xml Html
Manual Java Xml HtmlManual Java Xml Html
Manual Java Xml Html
lrivera2
 
Guía Practica conexión BD 2021
Guía Practica conexión BD  2021Guía Practica conexión BD  2021
Guía Practica conexión BD 2021
lissette_torrealba
 
Carro De Compras
Carro De ComprasCarro De Compras
Carro De Compras
riqsiq
 
Persistencia De Objetos(Hibernate)
Persistencia De Objetos(Hibernate)Persistencia De Objetos(Hibernate)
Persistencia De Objetos(Hibernate)
Ronald Cuello
 
Guía herramientas de BD PHP
Guía herramientas de BD PHPGuía herramientas de BD PHP
Guía herramientas de BD PHP
lissette_torrealba
 
Qué es xml
Qué es xmlQué es xml
Mysql adodb pdf_php
Mysql adodb pdf_phpMysql adodb pdf_php

La actualidad más candente (8)

Structured Query Language (Guía rápida)
Structured Query Language (Guía rápida)Structured Query Language (Guía rápida)
Structured Query Language (Guía rápida)
 
Manual Java Xml Html
Manual Java Xml HtmlManual Java Xml Html
Manual Java Xml Html
 
Guía Practica conexión BD 2021
Guía Practica conexión BD  2021Guía Practica conexión BD  2021
Guía Practica conexión BD 2021
 
Carro De Compras
Carro De ComprasCarro De Compras
Carro De Compras
 
Persistencia De Objetos(Hibernate)
Persistencia De Objetos(Hibernate)Persistencia De Objetos(Hibernate)
Persistencia De Objetos(Hibernate)
 
Guía herramientas de BD PHP
Guía herramientas de BD PHPGuía herramientas de BD PHP
Guía herramientas de BD PHP
 
Qué es xml
Qué es xmlQué es xml
Qué es xml
 
Mysql adodb pdf_php
Mysql adodb pdf_phpMysql adodb pdf_php
Mysql adodb pdf_php
 

Destacado

04 actions
04 actions04 actions
03 action forms
03 action forms03 action forms
03 action forms
Roberto Moreno Doñoro
 
07 tiles
07 tiles07 tiles
Presentacion
PresentacionPresentacion
Curso Java Avanzado 6 Struts
Curso Java Avanzado   6 StrutsCurso Java Avanzado   6 Struts
Curso Java Avanzado 6 Struts
Emilio Aviles Avila
 
Clase xiv
Clase xivClase xiv
Unidad 6. colecciones
Unidad 6. coleccionesUnidad 6. colecciones
Unidad 6. colecciones
Roberto Moreno Doñoro
 
02 instalación
02 instalación02 instalación
02 instalación
Roberto Moreno Doñoro
 
5. Curso Java Struts I (Framework para Java) - Curso 2005-2006
5. Curso Java Struts I (Framework para Java) - Curso 2005-20065. Curso Java Struts I (Framework para Java) - Curso 2005-2006
5. Curso Java Struts I (Framework para Java) - Curso 2005-2006
Samuel Marrero
 
Jerarquia componentes
Jerarquia componentesJerarquia componentes
Jerarquia componentes
Roberto Moreno Doñoro
 
Patrones j2 ee
Patrones j2 eePatrones j2 ee
Patrones j2 ee
Roberto Moreno Doñoro
 
01 introducción
01 introducción01 introducción
01 introducción
Roberto Moreno Doñoro
 
Unidad 4. interfaces
Unidad 4. interfacesUnidad 4. interfaces
Unidad 4. interfaces
Roberto Moreno Doñoro
 
06 validación
06 validación06 validación
06 validación
Roberto Moreno Doñoro
 
21 bibsw tablasyotros
21 bibsw tablasyotros21 bibsw tablasyotros
21 bibsw tablasyotros
Roberto Moreno Doñoro
 

Destacado (15)

04 actions
04 actions04 actions
04 actions
 
03 action forms
03 action forms03 action forms
03 action forms
 
07 tiles
07 tiles07 tiles
07 tiles
 
Presentacion
PresentacionPresentacion
Presentacion
 
Curso Java Avanzado 6 Struts
Curso Java Avanzado   6 StrutsCurso Java Avanzado   6 Struts
Curso Java Avanzado 6 Struts
 
Clase xiv
Clase xivClase xiv
Clase xiv
 
Unidad 6. colecciones
Unidad 6. coleccionesUnidad 6. colecciones
Unidad 6. colecciones
 
02 instalación
02 instalación02 instalación
02 instalación
 
5. Curso Java Struts I (Framework para Java) - Curso 2005-2006
5. Curso Java Struts I (Framework para Java) - Curso 2005-20065. Curso Java Struts I (Framework para Java) - Curso 2005-2006
5. Curso Java Struts I (Framework para Java) - Curso 2005-2006
 
Jerarquia componentes
Jerarquia componentesJerarquia componentes
Jerarquia componentes
 
Patrones j2 ee
Patrones j2 eePatrones j2 ee
Patrones j2 ee
 
01 introducción
01 introducción01 introducción
01 introducción
 
Unidad 4. interfaces
Unidad 4. interfacesUnidad 4. interfaces
Unidad 4. interfaces
 
06 validación
06 validación06 validación
06 validación
 
21 bibsw tablasyotros
21 bibsw tablasyotros21 bibsw tablasyotros
21 bibsw tablasyotros
 

Similar a 08 i18 n

Framework .NET 3.5 06 Operativa básica del framework .net
Framework .NET 3.5 06 Operativa básica del framework .netFramework .NET 3.5 06 Operativa básica del framework .net
Framework .NET 3.5 06 Operativa básica del framework .net
Antonio Palomares Sender
 
Un poco más allá con grails. PrimerViernes
Un poco más allá con grails. PrimerViernesUn poco más allá con grails. PrimerViernes
Un poco más allá con grails. PrimerViernes
Dani Latorre
 
CSA - Web Parts en SharePoint 2010
CSA - Web Parts en SharePoint 2010CSA - Web Parts en SharePoint 2010
CSA - Web Parts en SharePoint 2010
Comunidad SharePoint
 
Hands-on Spring 3: The next generation
Hands-on Spring 3: The next generationHands-on Spring 3: The next generation
Hands-on Spring 3: The next generation
Sergi Almar i Graupera
 
UDA-Anexo gestión de properties
UDA-Anexo gestión de propertiesUDA-Anexo gestión de properties
UDA-Anexo gestión de properties
Ander Martinez
 
Manual Basico De Struts
Manual Basico De StrutsManual Basico De Struts
Manual Basico De Struts
carlossanchezvillena
 
Tutorial3 Desymfony - La Vista. Twig
Tutorial3 Desymfony - La Vista. TwigTutorial3 Desymfony - La Vista. Twig
Tutorial3 Desymfony - La Vista. Twig
Marcos Labad
 
Persistencia de objetos con Hibernate
Persistencia de objetos con HibernatePersistencia de objetos con Hibernate
Persistencia de objetos con Hibernate
Mauro Gomez Mejia
 
Tarea_Investigacion programacion .pdf
Tarea_Investigacion programacion .pdfTarea_Investigacion programacion .pdf
Tarea_Investigacion programacion .pdf
BrimmerRamrez
 
Persistencia de un modelo de objetos
Persistencia de un modelo de objetosPersistencia de un modelo de objetos
Persistencia de un modelo de objetos
Jorge Ercoli
 
04. Implementando APIs HTML5
04. Implementando APIs HTML5 04. Implementando APIs HTML5
04. Implementando APIs HTML5
Danae Aguilar Guzmán
 
Cómo guardar las marcas de un mapa de google en un archivo xml y acceder a es...
Cómo guardar las marcas de un mapa de google en un archivo xml y acceder a es...Cómo guardar las marcas de un mapa de google en un archivo xml y acceder a es...
Cómo guardar las marcas de un mapa de google en un archivo xml y acceder a es...
Abimael Fernandes
 
Entidades en drupal 8
Entidades en drupal 8Entidades en drupal 8
Entidades en drupal 8
Atenea tech
 
Desarrollo de Aplicaciones Web II - Sesión 03 - Formularios y Validaciones
Desarrollo de Aplicaciones Web II - Sesión 03 - Formularios y ValidacionesDesarrollo de Aplicaciones Web II - Sesión 03 - Formularios y Validaciones
Desarrollo de Aplicaciones Web II - Sesión 03 - Formularios y Validaciones
Didier Granados
 
Programación_del_lado_del_servidor......
Programación_del_lado_del_servidor......Programación_del_lado_del_servidor......
Programación_del_lado_del_servidor......
SaulSalinasNeri
 
Ajax Huancayo
Ajax HuancayoAjax Huancayo
Ajax Huancayo
Jonathan Lara Vasquez
 
Clase 19 programación en base a patrones
Clase 19 programación en base a patronesClase 19 programación en base a patrones
Clase 19 programación en base a patrones
Pablo Andres Cáceres Ferreira
 
Doctrine2 sf2Vigo
Doctrine2 sf2VigoDoctrine2 sf2Vigo
Doctrine2 sf2Vigo
Ignacio Martín
 
Trabajo de programacion
Trabajo de programacionTrabajo de programacion
Trabajo de programacion
CarlosAguilera73
 
Tutorial Nro. 2 de Desarollo de Aplicaciones Móviles con Android
Tutorial Nro. 2 de Desarollo de Aplicaciones Móviles con AndroidTutorial Nro. 2 de Desarollo de Aplicaciones Móviles con Android
Tutorial Nro. 2 de Desarollo de Aplicaciones Móviles con Android
Luis Ernesto Castillo Alfaro
 

Similar a 08 i18 n (20)

Framework .NET 3.5 06 Operativa básica del framework .net
Framework .NET 3.5 06 Operativa básica del framework .netFramework .NET 3.5 06 Operativa básica del framework .net
Framework .NET 3.5 06 Operativa básica del framework .net
 
Un poco más allá con grails. PrimerViernes
Un poco más allá con grails. PrimerViernesUn poco más allá con grails. PrimerViernes
Un poco más allá con grails. PrimerViernes
 
CSA - Web Parts en SharePoint 2010
CSA - Web Parts en SharePoint 2010CSA - Web Parts en SharePoint 2010
CSA - Web Parts en SharePoint 2010
 
Hands-on Spring 3: The next generation
Hands-on Spring 3: The next generationHands-on Spring 3: The next generation
Hands-on Spring 3: The next generation
 
UDA-Anexo gestión de properties
UDA-Anexo gestión de propertiesUDA-Anexo gestión de properties
UDA-Anexo gestión de properties
 
Manual Basico De Struts
Manual Basico De StrutsManual Basico De Struts
Manual Basico De Struts
 
Tutorial3 Desymfony - La Vista. Twig
Tutorial3 Desymfony - La Vista. TwigTutorial3 Desymfony - La Vista. Twig
Tutorial3 Desymfony - La Vista. Twig
 
Persistencia de objetos con Hibernate
Persistencia de objetos con HibernatePersistencia de objetos con Hibernate
Persistencia de objetos con Hibernate
 
Tarea_Investigacion programacion .pdf
Tarea_Investigacion programacion .pdfTarea_Investigacion programacion .pdf
Tarea_Investigacion programacion .pdf
 
Persistencia de un modelo de objetos
Persistencia de un modelo de objetosPersistencia de un modelo de objetos
Persistencia de un modelo de objetos
 
04. Implementando APIs HTML5
04. Implementando APIs HTML5 04. Implementando APIs HTML5
04. Implementando APIs HTML5
 
Cómo guardar las marcas de un mapa de google en un archivo xml y acceder a es...
Cómo guardar las marcas de un mapa de google en un archivo xml y acceder a es...Cómo guardar las marcas de un mapa de google en un archivo xml y acceder a es...
Cómo guardar las marcas de un mapa de google en un archivo xml y acceder a es...
 
Entidades en drupal 8
Entidades en drupal 8Entidades en drupal 8
Entidades en drupal 8
 
Desarrollo de Aplicaciones Web II - Sesión 03 - Formularios y Validaciones
Desarrollo de Aplicaciones Web II - Sesión 03 - Formularios y ValidacionesDesarrollo de Aplicaciones Web II - Sesión 03 - Formularios y Validaciones
Desarrollo de Aplicaciones Web II - Sesión 03 - Formularios y Validaciones
 
Programación_del_lado_del_servidor......
Programación_del_lado_del_servidor......Programación_del_lado_del_servidor......
Programación_del_lado_del_servidor......
 
Ajax Huancayo
Ajax HuancayoAjax Huancayo
Ajax Huancayo
 
Clase 19 programación en base a patrones
Clase 19 programación en base a patronesClase 19 programación en base a patrones
Clase 19 programación en base a patrones
 
Doctrine2 sf2Vigo
Doctrine2 sf2VigoDoctrine2 sf2Vigo
Doctrine2 sf2Vigo
 
Trabajo de programacion
Trabajo de programacionTrabajo de programacion
Trabajo de programacion
 
Tutorial Nro. 2 de Desarollo de Aplicaciones Móviles con Android
Tutorial Nro. 2 de Desarollo de Aplicaciones Móviles con AndroidTutorial Nro. 2 de Desarollo de Aplicaciones Móviles con Android
Tutorial Nro. 2 de Desarollo de Aplicaciones Móviles con Android
 

Más de Roberto Moreno Doñoro

20 curvaselipticas
20 curvaselipticas20 curvaselipticas
20 curvaselipticas
Roberto Moreno Doñoro
 
19 protocoloscripto
19 protocoloscripto19 protocoloscripto
19 protocoloscripto
Roberto Moreno Doñoro
 
18 correoseguro
18 correoseguro18 correoseguro
18 correoseguro
Roberto Moreno Doñoro
 
17 certdigitalespkcs
17 certdigitalespkcs17 certdigitalespkcs
17 certdigitalespkcs
Roberto Moreno Doñoro
 
16 autenticafirma
16 autenticafirma16 autenticafirma
16 autenticafirma
Roberto Moreno Doñoro
 
15 funcioneshash
15 funcioneshash15 funcioneshash
15 funcioneshash
Roberto Moreno Doñoro
 
14 cifraasimetrica
14 cifraasimetrica14 cifraasimetrica
14 cifraasimetrica
Roberto Moreno Doñoro
 
13 ciframochilas
13 ciframochilas13 ciframochilas
13 ciframochilas
Roberto Moreno Doñoro
 
12 cifrasimetrica
12 cifrasimetrica12 cifrasimetrica
12 cifrasimetrica
Roberto Moreno Doñoro
 
11 cifraflujo
11 cifraflujo11 cifraflujo
11 cifraflujo
Roberto Moreno Doñoro
 
10 ciframoderna
10 ciframoderna10 ciframoderna
10 ciframoderna
Roberto Moreno Doñoro
 
09 cifraclasica
09 cifraclasica09 cifraclasica
09 cifraclasica
Roberto Moreno Doñoro
 
08 compalgoritmos
08 compalgoritmos08 compalgoritmos
08 compalgoritmos
Roberto Moreno Doñoro
 
07 teorianumeros
07 teorianumeros07 teorianumeros
07 teorianumeros
Roberto Moreno Doñoro
 
06 teoriainfo
06 teoriainfo06 teoriainfo
06 teoriainfo
Roberto Moreno Doñoro
 
05 gestionseg
05 gestionseg05 gestionseg
05 gestionseg
Roberto Moreno Doñoro
 
04 calidadinfo
04 calidadinfo04 calidadinfo
04 calidadinfo
Roberto Moreno Doñoro
 
02 breveintrocripto
02 breveintrocripto02 breveintrocripto
02 breveintrocripto
Roberto Moreno Doñoro
 
01 presentalibro
01 presentalibro01 presentalibro
01 presentalibro
Roberto Moreno Doñoro
 
03 introseginfo
03 introseginfo03 introseginfo
03 introseginfo
Roberto Moreno Doñoro
 

Más de Roberto Moreno Doñoro (20)

20 curvaselipticas
20 curvaselipticas20 curvaselipticas
20 curvaselipticas
 
19 protocoloscripto
19 protocoloscripto19 protocoloscripto
19 protocoloscripto
 
18 correoseguro
18 correoseguro18 correoseguro
18 correoseguro
 
17 certdigitalespkcs
17 certdigitalespkcs17 certdigitalespkcs
17 certdigitalespkcs
 
16 autenticafirma
16 autenticafirma16 autenticafirma
16 autenticafirma
 
15 funcioneshash
15 funcioneshash15 funcioneshash
15 funcioneshash
 
14 cifraasimetrica
14 cifraasimetrica14 cifraasimetrica
14 cifraasimetrica
 
13 ciframochilas
13 ciframochilas13 ciframochilas
13 ciframochilas
 
12 cifrasimetrica
12 cifrasimetrica12 cifrasimetrica
12 cifrasimetrica
 
11 cifraflujo
11 cifraflujo11 cifraflujo
11 cifraflujo
 
10 ciframoderna
10 ciframoderna10 ciframoderna
10 ciframoderna
 
09 cifraclasica
09 cifraclasica09 cifraclasica
09 cifraclasica
 
08 compalgoritmos
08 compalgoritmos08 compalgoritmos
08 compalgoritmos
 
07 teorianumeros
07 teorianumeros07 teorianumeros
07 teorianumeros
 
06 teoriainfo
06 teoriainfo06 teoriainfo
06 teoriainfo
 
05 gestionseg
05 gestionseg05 gestionseg
05 gestionseg
 
04 calidadinfo
04 calidadinfo04 calidadinfo
04 calidadinfo
 
02 breveintrocripto
02 breveintrocripto02 breveintrocripto
02 breveintrocripto
 
01 presentalibro
01 presentalibro01 presentalibro
01 presentalibro
 
03 introseginfo
03 introseginfo03 introseginfo
03 introseginfo
 

08 i18 n

  • 1. I18N: Localización de contenidos mayo de 2005
  • 2. 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!
  • 3. 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 I18N java.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.
  • 4. 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)
  • 5. 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 ResourceBundle.getBundle("application",locale); Application_fr.properties
  • 6. 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.
  • 7. Componentes I18N en Struts  Atributo “Locale” almacenado en la sesión  LocaleAction  MessageResources  ResourceBundle  ActionErrors  ActionMessages  Tags afectadas por I18N
  • 8. 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
  • 9. 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”
  • 10. MessageResources  API de Struts para recuperar mensajes localizados  Por defecto: PropertyResourceBundle  Podemos extenderlo a XML o BBDD  Manejada desde Tags  Pero podemos acceder directamente
  • 11. 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
  • 12. ResourceBundle (II)  Configurables desde “struts-config.xml” <message-resources parameter=“es.captiva.ApplicationMessages“ null="false"/> <message-resources parameter=“es.captiva.survey.SurveyMessages" key="survey" null="false"/>  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
  • 13. ActionErrors  Mensajes de error que se devuelven del Action al formulario.  Vamos añadiendo “claves”  Es posible añadir parámetros ActionErrors errors = new ActionErrors(); errors.add(ActionErrors.GLOBAL_ERROR, new ActionError("record.updated",recordId));  Los salvamos en el request saveErrors(request,errors);  Los mostramos con “<html:errors/>”
  • 14. ActionMessages  Reemplazan y complementan los ActionErrors desde v1.1  Se utiliza con el tag <h:messages>  Nos permite añadir HTML al texto <html:messages id="message" messages="true"> <bean:write name="message"/><BR> </html:messages>  Selector de mensajes o errores  messages=“true”  Combinación de errores y mensajes de éxito
  • 15. Tags afectadas por I18N (I) bean:message html:file bean:write html:hidden html:errors html:multibox html:html html:password html:image html:radio html:img html:select html:messages html:submit html:option html:text html:button html:textarea html:cancel html:form html:checkbox html:link
  • 16. Tags afectadas por I18N (II) Atributo Descripción y Tags arg0 ... Valores para introducer como parámetros, si los hay. [message write] arg4 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, Clave del mensaje a utilizar para textos alternativos. titleKey [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, Clave del mensaje con la cadena que contiene el nombre la imagen a srcKey utilizar, como URL o path. [image img] formatKey Clave que recupera una cadena con información de formateo. [write]
  • 17. 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">
  • 18. I18N en tiles  Diferentes layout según locales  Utilizando el mismo esquema de nombres que para los properties
  • 19. I18N en validación (I)  Diferentes validaciones según locale  Formatos de datos diferentes  Campos que no aplican
  • 20. 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"> 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>
  • 21. Localizando... (I)  Activar “locale”: por defecto lo está <init-param> <param-name>locale</param-name> <param-value>true</param-value> </init-param>  Ficheros de mensajes  WEB-INF/classes  Ficheros sueltos  WEB-INF/lib  Dentro de los JAR
  • 22. Localizando... (y II)  Reemplazamos el texto por tags  <bean:message>  Realizamos las traducciones