internacionalizacion.ppt [Modo de...
Transcript of internacionalizacion.ppt [Modo de...
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
13/04/2007
18
Formateando números…
13/04/2007 DAI
Formateando monedas…
13/04/2007 DAI
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
13/04/2007
20
Construcción de patrones
Sintaxis:
13/04/2007 DAI
Construir patrones
13/04/2007 DAI
13/04/2007
21
Formateo sensible a la localidad
13/04/2007 DAI
Modificar símbolos de formateo
13/04/2007 DAI
13/04/2007
22
Formatear fechas
Uso de clase DateFormat
13/04/2007 DAI
Formatear fechas
DateFormat.estilo
13/04/2007 DAI
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
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
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
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
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
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
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
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
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
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
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
13/04/2007
34
Leyendo/escribiendo streams no unicode
13/04/2007 DAI