Zona HTML Zona Java Zona PHP Zona ASP Zona Bases de datos
Inicio > Tutoriales > Lenguajes orientados a objeto > Java > J2SE > Internacionalización de Programas Java
-Tutoriales

Internacionalización de Programas Java


Seleccionar la Localidad

Un programa internacionalizado muestra información diferente a lo ancho del mundo. Por ejemplo, el programa mostrará diferentes mensajes en París, Tokio o Nueva York. Si el proceso de localización está bien ajustado, el programa mostrará diferentes mensajes en Nueva York y en Londres, teniendo en cuenta las diferencias entre el Inglés americano y el británico. ¿Cómo puede un programa internacionalizado identificar el idioma y la región de sus usuarios finales? Es sencillo, refiriendose a un objeto Locale.

Un objeto Locale es un identificador para una combinación particular de idioma, región y cultura. Si una clase varía su comportamiento de acuerdo con un objeto Locale, se dice que es sensible a la localidad. Por ejemplo, la clase NumberFormat es sensible a la localidad porque el formateo de números depende de la localidad. NumberFormat podría devolver un número como 902 300 (Francia), o 902.300 (Alemania), o 902,300 (U.S.). Los objetos Locale son sólo identificadores. El trabajo real, como el formateo o la detección de límites de palabras lo realizan los métodos de las clases sensibles a la localidad.

En esta lección aprenderás cómo trabajar con objetos Locale, y cómo realizar las siguientes tareas.

. Crear un Objeto Locale

Cuando se crea un objeto Locale, se debe específicar un código de idioma y un código de país. Existe un tercer parámetro opcional, la variante.

Para crear un objeto Locale, se especifica el código del idioma y el código del país. Por ejemplo para especificar el idioma Francés y el país Canada, se llamará al constructor de esta forma.

aLocale = new Locale("fr","CA");

En el siguiente ejemplo, creamos objetos Locale para el idioma Inglés en U.S.A. y Gran Bretaña.

bLocale = new Locale("en","US");
cLocale = new Locale("en","GB");

El primer argumento es el código del lenguaje, un par de letras minúsculas conformes a la norma ISO-639. Puedes encontrar una lista completa de códigos ISO-639 en http://www.ics.uci.edu/pub/ietf/http/related/iso639.txt

El segundo argumento es el código de país. Que consiste en dos letras mayúsculas, conforme a la norma ISO3166. Puedes encontrar un copia de esta norma en:http://www.chemie.fu-berlin.de/diverse/doc/ISO_3166.html

Además, si necesitas distinguir todavía más tu Locale, puedes especificar un tercer parámetro, llamado código de variante. Si existen variaciones en el idioma utilizado dentro del mismo país, podrías querer especificar una variante. Por ejemplo, en el Sur de Estados Unidos, la gente suele decier "y'all," cuando en el Norte dicen "you all." Se podría crear diferentes objetos Locale de esta forma.

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

Los códigos de variante no conforman un estándard. Son arbitrarios y específicos de la aplicación. Si se crean objetos Locale con los códigos de variante NORTH y SOUTH, como en el ejemplo anterior, sólo nuestra aplicación sabrá como tratarlos.

Normalmente, se específican códigos de variante para identificar diferencias cuasadas por la plataforma de ordenador. Por ejemplo, las diferencias de fuentes podría forzar a utilizar caracteres diferentes en Windows y en UNIX. Se podría definir los objetos Locale con estos códigos de variante.

xLocale = new Locale("de", "DE" ,"UNIX");
yLocale = new Locale("de", "DE", "WINDOWS");

El código de país y el código de variante son opcionales. Se podría crear un objeto Locale para el idioma Inglés de esta forma.

enLocale = new Locale("en", "");

Sin embargo, si se omite el código de país, la aplicación no podrá adaptarse a las diferencias regionales del idioma. Por ejemplo, un programa que utilice el objeto enLocale no podrá mostra la palabra "colour" en U.K. y la palabra "color" en U.S.A.

Por conveniencia, la clase Locale proporciona constantes para algunos idiomas y paises. Por ejemplo, se puede crear un objeto Locale especificando las constantes JAPANESE o JAPAN. Los objetos creados por las dos sentencias siguientes son equivalentes.

j1Locale = Locale.JAPAN;
j2Locale = new Locale("ja", "JA");

Cuando se específica una constante de idioma, la porción del país del objeto Locale no se define. Las siguientes sentencias crean objetos Locale equivalentes.

j3Locale = Locale.JAPANESE;
j4Locale = new Locale("ja", "");

. Identificar Localidades Disponibles

Las clases sensibles a la localidad sólo soportan ciertas definiciones de localidades. Esta sección muestra cómo determinar que definiciones de localidades están soportadas.

Se puede crear un objeto Locale con cualquier combinación de códigos válidos de idioma y de país, pero eso no significa que se pueda utilizar. Recuerda, un objeto Locale es sólo un identificador. El objeto Locale se pasa a otros objetos que realizan el trabajo verdadero. Estos otros objetos, que llamamos sensibles a la localidad, no saben como tratar todas las posibles definiciones de Locale.

Para encontrar los tipos de definiciones de Locale que reconoce una clase sensible a la localidad, se llama al método getAvailableLocales. Por ejemplo, para encontrar las definiciones de localidades soportadas por la clase DateFormat, se podría escribir una rutina como ésta.


import java.util.*;
import java.text.*;

public class Available {

   static public void main(String[] args) {

      Locale list[] = DateFormat.getAvailableLocales();

      for (int i = 0; i < list.length; i++) {
          System.out.println
             (list[i].getLanguage() + " " + list[i].getCountry());
      }
   } 
}
 

. La Localidad por Defecto

Si no se asigna un objeto Locale a un objeto sensible a la localidad, depende del objeto Locale devuelto por el método getDefault. Se puede seleccionar el objeto Locale por defecto de dos formas.

  • Seleccionar las propiedades del sistema user.language y user.region. La clase Locale selecciona el valor por defecto recuperando los valores de estas propiedades.
  • Llamando al método setDefault.

El siguiente ejemplo muestra estas dos técnicas de seleccionar el objeto Locale por defecto.

import java.util.*;

public class DefaultLocale {

   static public void main(String[] args) {

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

      aLocale = new Locale("fr", "FR");
      Locale.setDefault(aLocale);
      System.out.println(aLocale.toString());
   }
}

Aquí está la salida de este programa.

ja_JA
fr_FR

No dependas de la localidad por defecto a menos que la selecciones antes con uno de los dos métodos mostrados arriba. Si no lo haces podrías encontrarte que la localidad por defecto devuelta por getDefault podría no ser la misma en todas las plataformas Java.

. El ámbito de una Localidad

En la plataforma Java, no se específica un objeto Locale global seleccionando una variable de entorno antes de ejecutar la apliación. En su lugar, se asigna un objeto Locale a cada objeto sensible a la localidad.

No existe algo parecido a una Localidad global en el lenguaje de programación Java. Se puede especificar una localidad por defecto, como se describió en la página anterior, pero no es necesario que se utilice la misma localidad a lo largo de todo el programa. Si se desea, se pude asignar un objeto Locale diferente para cada objeto sensible a la localidad de nuestro programa. Este es el caso cuando se escriben aplicaciones multi-idioma, que pueden mostrar información en distintos idiomas. Pero para la mayoría de las aplicaciones se seleciona el mismo objeto Locale para todos los objetos sensibles a la localidad.

La programación distribuida alcanza algunas cotas interesantes. Por ejemplo, supongamos que hemos diseñado una aplicación servidor que recibe peticiones de clientes de distintos paises. Si el objeto Locale de cada cliente es diferente, ¿cual debería ser el objeto Locale del Servidor? Quizás el servidor sea multi-hilo, y cada thread seleccione su objeto Locale para los servicios de su cliente. O quizás todos los datos pasados entre el servidor y lo clientes deberían ser independientes de la localidad.

¿Qué diseño deberíamos utilizar? La respuesta depende de los requerimientos específicos de la aplicación, si están involucrados sistemas legales, y de lo complejo que se quiera el sistema. Teoricamente, se podrían selecionar todos los objetos sensibles a la localidad tanto en el cliente como en el servidor con un objeto Locale diferente. Por supuesto, esto no podría ser en la práctica, pero demuestra la flexibilidad de los objetos Locale en el lenguaje de programación Java.

 
Patrocinados
 

Copyright © 1999-2006 Programación en castellano. Todos los derechos reservados.
Formulario de Contacto - Datos legales - Publicidad

Hospedaje web y servidores dedicados linux por Ferca Network