Los mensajes de texto son la forma más obvia de datos que varían con la cultura, porque deben ser traducidos. Sin embargo, hay otros tipos de datos que podrían variar con la región o el idioma. La siguiente lista contiene ejemplos de datos dependientes de la cultura:
Para más información puedes ver Datos sensibles a la Cultura
La traducción es costosa. Se puede ayudar a reducir los costes aislando el texto que debe ser traducido en objetos ResourceBundle. El texto traducible incluye mensajes de estado, mensajes de error, entradas de diario, y etiquetas de componentes GUI. Este texto está codificado dentro de los programas que no han sido internacionalizados. Se necesitará localizar las ocurrencias del texto escrito que se muestra a los usuarios finales. Por ejemplo, se necesitará limpiar código como éste:
String buttonLabel = "OK";
...
Button okButton = new Button(buttonLabel);
Puedes ver Aislar Objetos específicos de la Localidad en un ResourceBundle.
Los mensajes compuestos contienen datos variables. En el mensaje, "El disco contiene 1100 ficheros," el entero 1100 podría variar. Este mensaje es díficil de traducir porque la posición del entero en la sentencia no es la misma en todos los idiomas. El siguiente mensaje no es traducible porque el orden de los elementos de la sentencia está codificado por concatenación:
Integer fileCount;
...
String diskStatus = "The disk contains " + fileCount.toString() + " files.";
Siempre que sea posible, se debería evitar construir mensajes compuestos porque son difíciles de traducir. Sin embargo, si la aplicación necesita mensajes compuestos se pueden manejar con las técnicas descritas en Formatear Mensajes.
Si la aplicación muestra números y monedas, necesitaremos formatearlas de una forma independiente de la Localidad. El siguiente código todavía no está internacionalizado porque no muestra corectamente los números en todos los paises:
Double amount;
TextField amountField;
...
String displayAmount = amount.toString();
amountField.setText(displayAmount);
Necesitaremos reemplazar el código anterior con una rutina que formatee correctamente los números. El lenguaje de programación Java proporciona varias clases que formatean números y monedas. Estas clases se explicaron en la sección, Formatear Números y Moneda.
La fecha y la hora varían con la región y el idioma, Si el código contiene sentencias como la siguiente, necesitaremos cambiarlas:
Date currentDate = new Date();
TextField dateField;
...
String dateString = currentDate.toString();
dateField.setText(dateString);
Si utilizamos las clases de formateo de fechas nuestra aplicación podrá mostrar la fecha y la hora de la forma correcta en todo el mundo. Para ejemplos e instrucciones, puedes ver
Formatear Fechas y Horas.
Deberíamos evitar a nuestros usuarios finales los mensajes de excepción codificados en nuestro propio idioma. La sección Trabajar con Excepciones muestra como atajar este problema.
Cuando se ordena o se busca texto, se necesita comparar cadenas. Si el texto se muestra, no deberíamos utilizar los métodos de comparación de la clase String. Un programa que no haya sido internacionalizado podría comparar las cadenas de esta forma:
String target;
String candidate;
...
if (target.equals(candidate)) {
...
if (target.compareTo(candidate) < 0) {
...
Los métodos String.equals String.compareTo realizan comparaciones binarias. que no son efectivas cuando se ordena o se busca en algunos idiomas. En su lugar, deberíamos utilizar la clase Collator, que se describe en la sección Compariar Strings.
Los desarrolladores acostrumbrados a programar en otros lenguajes podrían determinar los atributos de un caracter comparándolo con un caracter constante. Por ejemplo, podrían escribir código como éste:
char ch;
...
if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')) {
// ch is a letter
...
if (ch >= '0' && ch <= '9') {
// ch is a digit
...
if ((ch == ' ') || (ch == '\n') || (ch == '\t')) {
// ch is a whitespace
Este tipo de código no funciona en todos los idiomas, Deberíamos reemplazar esta comparación de caracteres con llamadas a los métodos proporcionados por la clase
Character. Por ejemplo, podríamos reemplazar el código anterior con las siguientes sentencias:
char ch;
...
if (Character.isLetter(ch)) {
...
if (Character.isDigit(ch)) {
...
if (Character.isSpaceChar(ch)) {
Los caracteres en el lenguaje de programación Java están codificados en Unicode. Si nuestras aplicaciones manejan texto no-Unicode, debemos traducirlo a Unicode. Para más información, puedes ver Convertir texto No-Unicode.
Normalmente el texto se expande cuando se traduce del inglés a otros idiomas. También la anchura de los caracteres no es la misma para todos los juegos de caracteres y tipos de fuentes. Debemos asegurarnos de diseñar el GUI con espacio de sobra.