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.