## Una Lista para Internacionalizar un Programa Existente

Muchos programas no son internacionalizados cuando se escriben por primera vez. Estos programas podrían haber empezado como prototipos, o quizás no se hubiera pensado en su distribución internacional. Si se necesita internacionalizar un programa existente, se deberían realizar las siguientes tareas:

- Identificar los datos dependientes de la cultura.

  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:

  - mensajes
  - etiquetas de componentes GUI
  - ayuda online
  - sonidos
  - colores
  - grafuicos
  - iconos
  - fechas
  - horas
  - números
  - monedas
  - medidas
  - números de teléfono
  - honores y títulos
  - direcciones
  - distribuciones de página

  Para más información puedes ver Datos sensibles a la Cultura

- Aislar texto traducible en fardos de recursos.

  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.

- Tratar con mensajes compuestos

  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.

- Formatear Números y Monedas

  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.

- Formatear Fechas y Horas

  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.

- Manejar mensajes de Excepción

  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.

- Comparación de Cadenas

  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.

- Utilizar Atributos de Caracteres Unicode

  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)) {

- Convertir Texto No-Unicode

  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.

- Reservar espacio suficiente en el GUI

  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.

  Ozito