internacionalizacion.ppt [Modo de...

34
13/04/2007 1 INTERNACIONALIZACIÓN 13/04/2007 DAI Mercados Globales z Vender aplicaciones en todo el mundo Î mayor cuota de mercado, mayores ventas z Necesitamos adaptarnos al cliente: idioma, formatos de datos,etc z Ejemplo: Formato de fecha España: dd/mm/yy EEUU mm/dd/yy Alemania: dd.mm.yy 13/04/2007 DAI

Transcript of internacionalizacion.ppt [Modo de...

Page 1: internacionalizacion.ppt [Modo de compatibilidad]dis.um.es/~jfernand/0607/dai/internacionalizacion.pdf · zEjemplos: aLocale= new Locale(“en”, “US”); ... zUso de la clase

13/04/2007

1

INTERNACIONALIZACIÓN

13/04/2007 DAI

Mercados Globales

Vender aplicaciones en todo el mundo mayor cuota de mercado, mayores ventas

Necesitamos adaptarnos al cliente: idioma, formatos de datos,etc

Ejemplo: Formato de fecha– España: dd/mm/yy– EEUU mm/dd/yy– Alemania: dd.mm.yy

13/04/2007 DAI

Page 2: internacionalizacion.ppt [Modo de compatibilidad]dis.um.es/~jfernand/0607/dai/internacionalizacion.pdf · zEjemplos: aLocale= new Locale(“en”, “US”); ... zUso de la clase

13/04/2007

2

Internacionalización

Proceso de diseñar una aplicación para que pueda ser adaptada a diferentes idiomas y regiones, sin necesitad de cambios de ingenieríag

13/04/2007 DAI

Características de un programa internacionalizado

Con la adición de datos de localización, el mismo ejecutable puede ser ejecutado en cualquier lugar del mundo. El texto mostrado por el programa está en el idioma nativo del usuario final. Los elementos textuales como mensajes de estado y etiquetas de elementos GUI no están codificadas dentro del programa. Son almacenados fuera del código fuente y recuperados de forma dinámicadinámica. El soporte de nuevos idiomas no requiere re-compilación. Otros datos dependientes de la cultura, como fechas y monedas, aparecen en el formato e idioma de la región del usuario final. Puede ser localizado rápidamente.

13/04/2007 DAI

Page 3: internacionalizacion.ppt [Modo de compatibilidad]dis.um.es/~jfernand/0607/dai/internacionalizacion.pdf · zEjemplos: aLocale= new Locale(“en”, “US”); ... zUso de la clase

13/04/2007

3

Localización

Proceso de adaptar software para una región o idioma específico añadiendo componentes específicos de la localidad y traduciendo el texto

Fase posterior a la internacionalización

13/04/2007 DAI

Datos sensibles a la cultura

Texto NúmerosMonedaFechas y horasI áImágenesColoresSonidos

13/04/2007 DAI

Page 4: internacionalizacion.ppt [Modo de compatibilidad]dis.um.es/~jfernand/0607/dai/internacionalizacion.pdf · zEjemplos: aLocale= new Locale(“en”, “US”); ... zUso de la clase

13/04/2007

4

Transformación de internacionalización Java

Sin internacionalización: Imprimir mensaje: System.out.println(“Hello”);

Con internacionalización:Elegir localización:

currentLocale = new Locale(language country);currentLocale new Locale(language, country);Seleccionar los textos localizados: messages

=ResourceBundle.getBundle("MessagesBundle",currentLocale);Imprimir mensaje: System.out.println(messages.getString(“greetings”);

13/04/2007 DAI

Pasos para la internacionalización en Java

Crear el fichero de propiedades

Definir la localidad (Locale)

G ti l bj t d l lid dGestionar el objeto de localidad (ResourceBundle)

13/04/2007 DAI

Page 5: internacionalizacion.ppt [Modo de compatibilidad]dis.um.es/~jfernand/0607/dai/internacionalizacion.pdf · zEjemplos: aLocale= new Locale(“en”, “US”); ... zUso de la clase

13/04/2007

5

Crear el fichero de propiedades

Almacena la información en texto plano sobre los textos traducibles de los mensajes a mostrarMessagesBundle.properties

greetings = Hellofarewell = Goodbyeinquiry = How are you?

MessagesBundle_fr_FR.propertiesgreetings = Bonjour.farewell = Au revoir.inquiry = Comment allez-vous?

fr: idioma FR: país13/04/2007 DAI

Definir la localidad (Locale)

Locale: Define idioma y país

Únicamente identificar, no hacen nada

Ejemplos: aLocale= new Locale(“en”, “US”);aLocale= new Locale(“fr”, “CA”);aLocale= new Locale(“fr”, “FR”);

13/04/2007 DAI

Page 6: internacionalizacion.ppt [Modo de compatibilidad]dis.um.es/~jfernand/0607/dai/internacionalizacion.pdf · zEjemplos: aLocale= new Locale(“en”, “US”); ... zUso de la clase

13/04/2007

6

Definiendo Locale

Idioma (obligatorio): Códigos ISO639País(opcional): Códigos ISO3166Código de variante (opcional)– De idioma

nLocale = new Locale("en", "US" ,"NORTH");sLocale = new Locale("en" "US" "SOUTH");sLocale = new Locale( en , US , SOUTH );

– De plataformaxLocale = new Locale("de", "DE" ,"UNIX");yLocale = new Locale("de", "DE", "WINDOWS");

13/04/2007 DAI

Locales disponibles y por defecto

Locales constantes: Locale.JAPAN, Locale.JAPANESE (para algunos países e idiomas)

No todas las combinaciones son posibles: Locale list[]= DateFormat.getAvailableLocales();

Si i l l bj t ibl l l lid dSi no se asigna un locale a un objeto sensible a la localidad, se usa el Locale por defecto

Properties props = System.getProperties();props.put("user.language", "ja");props.put("user.region", "JA");System.setProperties(props);Locale aLocale = Locale.getDefault();System.out.println(aLocale.toString());

13/04/2007 DAI

Page 7: internacionalizacion.ppt [Modo de compatibilidad]dis.um.es/~jfernand/0607/dai/internacionalizacion.pdf · zEjemplos: aLocale= new Locale(“en”, “US”); ... zUso de la clase

13/04/2007

7

Ámbito de una localidad

No existe locale global, sino que se aplica un locale a cada objeto sensible a localización

Locale por defecto como “global”

13/04/2007 DAI

Gestión de ResourceBundle

Contienen objetos específicos de una localidad

Sirven para aislar los datos sensibles a la localidad

Ejemplo: getBundle(nombrearchivo, locale)

currentLocale = new Locale(language country);currentLocale = new Locale(language, country);ResourceBundle messages=

ResourceBundle.getBundle("MessagesBundle",currentLocale);String msg1 = messages.getString("greetings");

Buscaría en MessagesBundle_language_country.properties13/04/2007 DAI

Page 8: internacionalizacion.ppt [Modo de compatibilidad]dis.um.es/~jfernand/0607/dai/internacionalizacion.pdf · zEjemplos: aLocale= new Locale(“en”, “US”); ... zUso de la clase

13/04/2007

8

Relacionar un ResourceBundle con un Locale

Conjunto de subclases relacionadasEjemplo que seguiremos: Etiqueta de un botón

ButtonLabel; ButtonLabel_de; ButtonLabel_en_GB; ButtonLabel_fr_CA_UNIX

Locale currentLocale = new Locale("fr", "FR", "UNIX");ResourceBundle introLabels =ResourceBundle.getBundle("ButtonLabel", currentLocale);

Si no existe el ResourceBundle para ese Locale, se busca el más p ,cercano, en este orden:

ButtonLabel_fr_CA_UNIX; ButtonLabel_fr_CA; ButtonLabel_fr; ButtonLabel

Si getBundle no encuentra correspondencia busca en locale por defecto.

Si no encuentra en el locale por defecto MissingResourceException13/04/2007 DAI

PropertyResourceBundle

Subclase de ResourceBundle

Uno o más ficheros de propiedades, que no forman parte del código

Se añade una nueva localización añadiendo el nuevo fichero de propiedades

Sólo Strings

13/04/2007 DAI

Page 9: internacionalizacion.ppt [Modo de compatibilidad]dis.um.es/~jfernand/0607/dai/internacionalizacion.pdf · zEjemplos: aLocale= new Locale(“en”, “US”); ... zUso de la clase

13/04/2007

9

ListResourceBundle

Subclase de ResourceBundle

Maneja recursos con una lista.

Cada LRB está constituido por un fichero de clase

No se deben usar para almacenar strings que deben ser traducidos, ya que requieren compilación y generar un nuevo fichero fuente para soportar nuevas localizaciones

13/04/2007 DAI

Parejas clave-valor

Con clases de propiedadesclass ButtonLabel_en extends ListResourceBundle {

// English versionpublic Object[ ] [ ] getContents() {return contents;

}

static final Object[][] contents = { {"OkKey", "OK"}, {"CancelKey", "Cancel"}, };}

String okLabel = ButtonLabel.getString("OkKey");

Con ficheros de propiedades: ButtonLabel.propertiesOkKey = OKCancelKey = Cancel

13/04/2007 DAI

Page 10: internacionalizacion.ppt [Modo de compatibilidad]dis.um.es/~jfernand/0607/dai/internacionalizacion.pdf · zEjemplos: aLocale= new Locale(“en”, “US”); ... zUso de la clase

13/04/2007

10

Preparar el uso de un ResourceBundle

Pasos a seguir antes de crear y cargar ResourceBundles

– Identificar los objetos específicos de una localidad

– Organizar objetos ResourceBundle

13/04/2007 DAI

Identificar los objetos específicos de una localidad

String, Component, Graphics, Image, Color, Audioclip

No incluimos fechas, horas, monedas Cambio de formato, no de objeto

¿Qué incluir?– Etiquetas de menú (específico de la localidad, dura toda la sesión)q ( p , )– Por lo general strings Evaluar coste de localización frente al

uso del objeto localizado

¿Qué no incluir?– Campos introducidos por el usuario

13/04/2007 DAI

Page 11: internacionalizacion.ppt [Modo de compatibilidad]dis.um.es/~jfernand/0607/dai/internacionalizacion.pdf · zEjemplos: aLocale= new Locale(“en”, “US”); ... zUso de la clase

13/04/2007

11

Organizar objetos ResourceBundle

Usar un objeto ResourceBundle por cada tipo de objeto (p.ej botones). Ventajas:– Código legible y de fácil mantenimiento– Acceso rápido al reducir el tamaño de cada

ResourceBundle– Comodidad a la hora de trabajar con ficheros de

propiedades más pequeños

13/04/2007 DAI

Utilizar ficheros de propiedades

Pasos– Crear el fichero de propiedades por defecto– Crear ficheros de propiedades adicionales– Especificar la localidad– Crear el ResourceBundle– Obtener el texto localizado– Iterar a través de todas las claves

13/04/2007 DAI

Page 12: internacionalizacion.ppt [Modo de compatibilidad]dis.um.es/~jfernand/0607/dai/internacionalizacion.pdf · zEjemplos: aLocale= new Locale(“en”, “US”); ... zUso de la clase

13/04/2007

12

Crear el fichero de propiedades por defecto

Nombre base del ResourceBundle+.propertiesEjemplo:LabelsBundle.properties para el fichero de propiedades de etiquetas

13/04/2007 DAI

clavevalor

Crear ficheros adicionales

Necesario para soportar una nueva localizaciónEj:LabelsBundle_de_DE.properties

13/04/2007 DAI

Page 13: internacionalizacion.ppt [Modo de compatibilidad]dis.um.es/~jfernand/0607/dai/internacionalizacion.pdf · zEjemplos: aLocale= new Locale(“en”, “US”); ... zUso de la clase

13/04/2007

13

Especificar la localidad

13/04/2007 DAI

Crear el ResourceBundle

En este paso relacionamos la localidad, el ficheros de propiedades y el ResourceBundle

Primero busca un fichero de clase y si no existe, un fichero de propiedades

En vez de usar getBundle, se podría haber creado un PropertyResourceBundle

– Requiere el nombre exacto (uso de InputStream)– Usar getBundle permite que el sistema pueda buscar el que más se ajuste

en caso de no existir

13/04/2007 DAI

Page 14: internacionalizacion.ppt [Modo de compatibilidad]dis.um.es/~jfernand/0607/dai/internacionalizacion.pdf · zEjemplos: aLocale= new Locale(“en”, “US”); ... zUso de la clase

13/04/2007

14

Obtener el texto localizado

Retorna en value el valor de key en el idioma apropiado, según la localidad establecida p p , gpara el ResourceBundle labels

13/04/2007 DAI

Obtener los valores de todas las claves

Uso de getKeys

13/04/2007 DAI

Page 15: internacionalizacion.ppt [Modo de compatibilidad]dis.um.es/~jfernand/0607/dai/internacionalizacion.pdf · zEjemplos: aLocale= new Locale(“en”, “US”); ... zUso de la clase

13/04/2007

15

Usar un ListResourceBundle

Fichero de clase que incluye la localización, por lo que cada nueva localización exige recompilarPasos– Crear las subclasesC ea as subc ases– Especificar localidad– Crear el ResourceBundle– Recuperar los objetos localizados

13/04/2007 DAI

Crear las subclases de LRB

13/04/2007 DAI

Page 16: internacionalizacion.ppt [Modo de compatibilidad]dis.um.es/~jfernand/0607/dai/internacionalizacion.pdf · zEjemplos: aLocale= new Locale(“en”, “US”); ... zUso de la clase

13/04/2007

16

Especificar la localidad

Cada objeto Locales es una clase de StatsBundle

13/04/2007 DAI

Crear el ResourceBundle

El método getBundle busca primero un fichero de clase con nombre basefichero de clase con nombre base StatsBundle

13/04/2007 DAI

Page 17: internacionalizacion.ppt [Modo de compatibilidad]dis.um.es/~jfernand/0607/dai/internacionalizacion.pdf · zEjemplos: aLocale= new Locale(“en”, “US”); ... zUso de la clase

13/04/2007

17

Recuperar el objeto localizado

Hay que tener en cuenta que stats contiene l l Obj tpares clave-valor que son Objects

13/04/2007 DAI

Formateo de Números y Monedas

La clase NumberFormat facilita conseguir formatos específicos de localidad para números, monedas y porcentajes (métodos de factoría)

Si NumberFormat no soporta la localidad que necesitamos crear nuestro propio formateador mediante patrones

13/04/2007 DAI

Page 18: internacionalizacion.ppt [Modo de compatibilidad]dis.um.es/~jfernand/0607/dai/internacionalizacion.pdf · zEjemplos: aLocale= new Locale(“en”, “US”); ... zUso de la clase

13/04/2007

18

Formateando números…

13/04/2007 DAI

Formateando monedas…

13/04/2007 DAI

Page 19: internacionalizacion.ppt [Modo de compatibilidad]dis.um.es/~jfernand/0607/dai/internacionalizacion.pdf · zEjemplos: aLocale= new Locale(“en”, “US”); ... zUso de la clase

13/04/2007

19

Formateando porcentajes…

13/04/2007 DAI

Formateando con patrones…

Se especifica el patrón con la clase DecimalFormat: ceros iniciales/finales, sufijos, prefijos, separadores de miles/decimales

DecimalFormatSymbols: Para cambiar el símbolo del separado decimal

13/04/2007 DAI

Page 20: internacionalizacion.ppt [Modo de compatibilidad]dis.um.es/~jfernand/0607/dai/internacionalizacion.pdf · zEjemplos: aLocale= new Locale(“en”, “US”); ... zUso de la clase

13/04/2007

20

Construcción de patrones

Sintaxis:

13/04/2007 DAI

Construir patrones

13/04/2007 DAI

Page 21: internacionalizacion.ppt [Modo de compatibilidad]dis.um.es/~jfernand/0607/dai/internacionalizacion.pdf · zEjemplos: aLocale= new Locale(“en”, “US”); ... zUso de la clase

13/04/2007

21

Formateo sensible a la localidad

13/04/2007 DAI

Modificar símbolos de formateo

13/04/2007 DAI

Page 22: internacionalizacion.ppt [Modo de compatibilidad]dis.um.es/~jfernand/0607/dai/internacionalizacion.pdf · zEjemplos: aLocale= new Locale(“en”, “US”); ... zUso de la clase

13/04/2007

22

Formatear fechas

Uso de clase DateFormat

13/04/2007 DAI

Formatear fechas

DateFormat.estilo

13/04/2007 DAI

Page 23: internacionalizacion.ppt [Modo de compatibilidad]dis.um.es/~jfernand/0607/dai/internacionalizacion.pdf · zEjemplos: aLocale= new Locale(“en”, “US”); ... zUso de la clase

13/04/2007

23

Formatear horas

Similar a fecha, excepto getTimeInstance en vez de getDateInstance

13/04/2007 DAI

Formatear fecha y hora

getDateTimeFormat(estilo_fecha, estilo_hora, locale)

13/04/2007 DAI

Page 24: internacionalizacion.ppt [Modo de compatibilidad]dis.um.es/~jfernand/0607/dai/internacionalizacion.pdf · zEjemplos: aLocale= new Locale(“en”, “US”); ... zUso de la clase

13/04/2007

24

Formatear fechas y horas con patrones

Uso de la clase SimpleDateFormat

13/04/2007 DAI

Formatear fechas y horas con patrones

13/04/2007 DAI

Page 25: internacionalizacion.ppt [Modo de compatibilidad]dis.um.es/~jfernand/0607/dai/internacionalizacion.pdf · zEjemplos: aLocale= new Locale(“en”, “US”); ... zUso de la clase

13/04/2007

25

Cambiar símbolos de formato

Uso de clase DateFormatSymbols

13/04/2007 DAI

Día de la semana

Formateo de mensajes

También necesitamos adaptar mensajes de error o de información

Por lo general estos mensajes contienen datos con variables por lo que no nos bastadatos con variables, por lo que no nos basta usar un ResourceBundle

Necesitamos pasos adicionales13/04/2007 DAI

Page 26: internacionalizacion.ppt [Modo de compatibilidad]dis.um.es/~jfernand/0607/dai/internacionalizacion.pdf · zEjemplos: aLocale= new Locale(“en”, “US”); ... zUso de la clase

13/04/2007

26

Primer intento

Construir mensaje por concatenación de mensajes

Orden dependiente del idioma

13/04/2007 DAI

Tratar con mensajes concatenados

Tipos de variables: fechas, horas, cadenas, números, monedas y porcentajes

Daremos formato en base a un patrón que aplicaremos a un objeto MessageFormataplicaremos a un objeto MessageFormat

Paso 1: Identificar las variables del mensaje

13/04/2007 DAI

Page 27: internacionalizacion.ppt [Modo de compatibilidad]dis.um.es/~jfernand/0607/dai/internacionalizacion.pdf · zEjemplos: aLocale= new Locale(“en”, “US”); ... zUso de la clase

13/04/2007

27

Tratar con mensajes concatenados

Paso 2: Aislar el patrón del mensaje en un ResourceBundle

13/04/2007 DAI

Tratar con mensajes concatenados

Paso 3: Seleccionar los argumentos del mensaje

Paso 4: Crear el FormateadorPaso 4: Crear el Formateador

13/04/2007 DAI

Page 28: internacionalizacion.ppt [Modo de compatibilidad]dis.um.es/~jfernand/0607/dai/internacionalizacion.pdf · zEjemplos: aLocale= new Locale(“en”, “US”); ... zUso de la clase

13/04/2007

28

Tratar con mensajes concatenados

Paso 5: Formatear el mensaje usando patrón y argumentos

Resultado

13/04/2007 DAI

Formateo de plurales

Uso de clase ChoiceFormatPaso 1: Definir el patrón

Paso 2: Crear el Resource Bundle

13/04/2007 DAI

Page 29: internacionalizacion.ppt [Modo de compatibilidad]dis.um.es/~jfernand/0607/dai/internacionalizacion.pdf · zEjemplos: aLocale= new Locale(“en”, “US”); ... zUso de la clase

13/04/2007

29

Formateo de plurales

Paso 3: Crear Formateador de Mensaje

Paso 4: Crear Formateador de Choice

13/04/2007 DAI

Formateo de plurales

Paso 5: Aplicar el patrón

Paso 6: Asignar formatos

13/04/2007 DAI

Asocia objetos Format a los argumentos del patrón del mensaje

Page 30: internacionalizacion.ppt [Modo de compatibilidad]dis.um.es/~jfernand/0607/dai/internacionalizacion.pdf · zEjemplos: aLocale= new Locale(“en”, “US”); ... zUso de la clase

13/04/2007

30

Formateo del plurales

Paso 7: Seleccionar argumentos y formato del mensaje

Paso 8: ResultadoPaso 8: Resultado

13/04/2007 DAI

Localizando excepciones

Trabajamos dentro del catch de la excepción

Paso 1:Crear ResourceBundle con el contenido del texto

Paso 2: Recuperar el patrón

Paso 3: Aplicar el patrón

13/04/2007 DAI

Page 31: internacionalizacion.ppt [Modo de compatibilidad]dis.um.es/~jfernand/0607/dai/internacionalizacion.pdf · zEjemplos: aLocale= new Locale(“en”, “US”); ... zUso de la clase

13/04/2007

31

Otra posibilidad

Clase que herede de Exception donde implementamos getLocalizedMessage

13/04/2007 DAI

Comparaciones de strings independientes de la localidad

Uso de clase Collator

Se obtiene un RuleBasedCollator que usa reglas para la ordenación de cadenasreglas para la ordenación de cadenas

13/04/2007 DAI

Page 32: internacionalizacion.ppt [Modo de compatibilidad]dis.um.es/~jfernand/0607/dai/internacionalizacion.pdf · zEjemplos: aLocale= new Locale(“en”, “US”); ... zUso de la clase

13/04/2007

32

Ejemplo Collator

13/04/2007 DAI

Detectar límites de texto

Uso de clase BreakIterator: Tiene cursor imaginario que apunta al límite actual de la cadena

Cada instancia solo puede detectar un tipoCada instancia solo puede detectar un tipo de límite

13/04/2007 DAI

Page 33: internacionalizacion.ppt [Modo de compatibilidad]dis.um.es/~jfernand/0607/dai/internacionalizacion.pdf · zEjemplos: aLocale= new Locale(“en”, “US”); ... zUso de la clase

13/04/2007

33

Usar Texto no Unicode

En Java el tipo char es carácter UnicodeConvertimos en juegos de caracteres con String.getBytesEjemplo: Pasar a UTF-8

13/04/2007 DAI

Usar Texto no Unicode

Ejemplo: Pasar a UTF-8

13/04/2007 DAI

Page 34: internacionalizacion.ppt [Modo de compatibilidad]dis.um.es/~jfernand/0607/dai/internacionalizacion.pdf · zEjemplos: aLocale= new Locale(“en”, “US”); ... zUso de la clase

13/04/2007

34

Leyendo/escribiendo streams no unicode

13/04/2007 DAI