Internacionalización de Programas Java

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.

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP