  Artculo para la revista Linux Actual nmero 18: Interna
  cionalizacin de programas en GNU/Linux
  Javier Fernndez-Sanguino Pea
  10 junio 2001

  La internacionalizacin es el proceso que permite que un programa
  ofrezca a un usuario un entorno de computacin adaptado a su propio
  pas: lenguaje, smbolos monetarios, formatos de fecha y hora...  En
  ste artculo se vern los distintos esfuerzos que se estn llevando a
  cabo para hacer al SO GNU/Linux internacional, centrndose en la
  internacionalizacin de programas.

  11..  EEll iinnggllss ccoommoo iiddiioommaa uunniivveerrssaall

  El ingls es el idioma oficial por regla general en la prctica
  totalidad de proyectos de software libre en la actualidad. Este idioma
  se ha convertido en este siglo en el idioma internacional por
  excelencia, y es una realidad que afecta, no slo a los usuarios
  dentro del mundo GNU/Linux sino a cualquier usuario de los sistemas de
  la informacin. Es por esto que el ingls es el idioma en el que
  habitualmente los programas presentan sus mensajes, y la mayora de la
  documentacin est realizada en ingls.


  No cabe duda que el uso de un nico lenguaje facilita la coordinacin
  del trabajo de los desarrolladores, a la hora de intercambiar ideas, y
  la difusin de un proyecto, pero los usuarios desean ms, desean que
  los entornos en los que trabajen estn adaptados a sus entornos
  especficos.


  Esta adaptacin no es exclusivamente, aunque s es la primera
  evidencia, la traduccin de todos y cada uno de los mensajes, mens,
  botones, etc. que muestra el programa al usuario. Tambin incluye la
  adaptacin del programa para que al utilizar otras caractersticas
  eminentemente locales, se "adapte" al entorno. Por ejemplo, al
  utilizar unidades monetarias muestre preferentemente las unidades
  locales con las expresiones habituales de separacin de decimales,
  nomenclatura, etc. o que la representacin de fechas y horas se haga
  en la manera acostumbrada al usuario (da-mes-ao en lugar de mes-da-
  ao por ejemplo), o incluso que las unidades mtricas utilizadas para
  la representacin de distancias, pesos, etc. sean las utilizadas por
  el usuario.


  La modificacin de un software para que sea capaz de ofrecer estas
  funciones es lo que se conoce como internacionalizacin (muchas veces
  se reduce al acrnimo 'i18n'). Mientras que la modificacin de estas
  funciones para adaptar un programa a un determinado entorno se conoce
  como localizacin (muchas veces reducido a 'l10n'). Explicndolo en
  forma breve, los programadores internacionalizan y los traductores
  localizan.



  22..  IInntteerrnnaacciioonnaalliizzaacciinn ddee mmeennssaajjeess:: ggeetttteexxtt

  Dentro de la internacionalizacin de programas, uno de los aspectos
  ms crticos es la posibilidad de traducir los mensajes que presenta
  el programa al usuario. No slo los mensajes que puedan aparecer en el
  interfaz grfico, por ejemplo, sino todo tipo de mensajes de error que
  genere el programa, ayuda en las opciones al ejecutarse, etc.


  La herramienta GNU para la internacionalizacin de mensajes en
  programas es Gettext. Esta herramienta, desarrollada entre 1994 y 1995
  por un grupo variado de programadores, facilita la creacin de
  programas que pueden distribuirse con mltiples catlogos de mensajes
  en distintos idiomas. Posteriormente, en entornos localizados, los
  programas pueden presentar los mensajes correspondientes al entorno
  declarado por el usuario.


  Esta herramienta es relativamente transparente al programador, ya que
  slo tiene que marcar los mensajes que cree que deben traducirse.
  Asimismo, la modificacin del cdigo fuente y reubicacin de los
  mensajes es relativamente transparente al traductor, que slo tiene
  que mantener actualizado un listado de traducciones de los mensajes.
  Las herramientas de gettext se encargan, por debajo, de homogeneizar
  los catlogos y modificar stos cuando las fuentes cambian, pero
  preservando las traducciones ya realizadas.


  De esta forma, el trabajo de traduccin de los mensajes de un programa
  se reduce a una traduccin inicial de todos los mensajes y al
  mantenimiento de los pequeos (o grandes) cambios en el cdigo que
  puedan suponer la introduccin (o desaparicin) de mensajes. Y el
  trabajo del programador se limita a incorporar las funciones
  necesarias en su programa. Una vez hecho esto, el trabajo de ambos
  grupos puede proceder por separado, lo cual facilita el desarrollo en
  ambos sentidos. Es decir, un traductor no tiene que depender del
  programador para incorporar un nuevo idioma y un programador no
  depende del esfuerzo de traduccin para la generacin de nuevas
  versiones de su programa.


  33..  PPrreeppaarraarr uunn pprrooggrraammaa ppaarraa iinntteerrnnaacciioonnaalliizzaacciinn

  Lo primero que debe hacer un programador para internacionalizar su
  software es detectar en qu puntos de ste se introducen mensajes que
  van destinados al usuario (bien porque sean mensajes que aparezcan en
  pantalla durante el uso del programa o porque se enven en
  determinadas circunstancias de error). Estos mensajes (cadenas de
  caracteres) tienen que ser marcados de forma que pueda extraerse esta
  informacin.



  Algunos de los cambios que son necesarios hacer a las fuentes del
  programa las realiza el programa _g_e_t_t_e_x_t_i_z_e. Este programa, invocado
  directamente en el directorio raz de las fuentes realiza las
  siguientes funciones:


    copia el fichero ABOUT-NLS que describe el entorno de
     internacionalizacin utilizado.

    crea el directorio intl/ y pone all todos los ficheros que se
     distribuyen con _g_e_t_t_e_x_t, estos ficheros son los ficheros de
     cabecera de la librera _l_i_b_i_n_t_l y deben ser idnticos entre
     distintos proyectos de software internacionalizados.

    crea el directorio po/ y el fichero Makefile.in.in dentro de ste.
     Este directorio ser el repositorio de la traduccin de mensajes
     que se incluir con la distribucin del programa.

  Sin embargo, aunque se hayan realizado estos cambios a las fuentes, el
  desarrollador tiene que realizar otros de forma manual para asegurar
  que la internacionalizacin pueda llevarse fcilmente a cabo:



    crear el fichero po/POTFILES.in e introducir en l una lista (un
     fichero por lnea) con los ficheros que contienen mensajes marcados
     para traduccin.

    modificar el fichero configure.in (del sistema de auto
     configuracin) para:


    introducir los cambios necesarios para que el sistema de auto-
     configuracin busque las libreras de internacionalizacin (con la
     macro AM_GNU_GETTEXT).

    indicar los idiomas a los que est traducido el programa (ficheros
     .po con traducciones) con la definicin de ALL_LINGUAS.

    declarar el nombre del paquete y versin. Generalmente se har con
     las siguientes lneas, y esto permitir a _g_e_t_t_e_x_t el hacer un
     seguimiento de las fuentes de cdigo frente a las traducciones de
     mensajes. Como se ver ms adelante podrn variar de forma
     independiente:



       PACKAGE=programa
       VERSION=X.Y.Z
       AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE")
       AC_DEFINE_UNQUOTED(VERSION, "$VERSION")
       AC_SUBST(PACKAGE)
       AC_SUBST(VERSION)



    incorporar nuevos ficheros a los  que se modifican con el guin
     _c_o_n_f_i_g_u_r_e, cambiando  la macro AC_OUTPUT, para incluir a
     intl/Makefile y po/Makefile.in.


    modificar los ficheros acconfig.h y aclocal.m4 (si existen) para
     incluir las funciones necesarias para que se detecte el soporte de
     internacionalizacin al configurar las fuentes.

    modificar el fichero Makefile.in en el directorio raz y en los de
     las fuentes de forma que se incluyan las libreras de
     internacionalizacin al compilar (tanto al generar los ficheros
     objeto como al enlazar dinmicamente), y para que se instalen los
     ficheros po en el sistema al ejecutar a _m_a_k_e _i_n_s_t_a_l_l.

  Con estos cambios, el desarrollador se asegura que, al configurar el
  programa se detecte el soporte (o no) de internacionalizacin del
  sistema y que, tras esto, se compilen las fuentes de la manera
  adecuada y se instalen con soporte de internacionalizacin (incluyendo
  todos los ficheros de las traducciones) si el sistema no carece de
  soporte para ste.


  Una vez realizado estos cambios es necesario cambiar las fuentes C en
  s del programa, para marcar los mensajes que se deban traducir. La
  bsqueda de estos mensajes puede ser algo tediosa, aunque depender
  del programa en s. Se puede seguir la mxima de "todo aquello que se
  presenta al usuario debe ser internacionalizado" y as buscar mensajes
  que se presenten a este (mediante funciones de salida como printf) o
  cadenas que se utilicen para generar salidas (como botones o mens).
  Una vez localizadas, estos mensajes deben rodearse con una llamada a
  gettext. As, una lnea de cdigo del estilo de
       printf("Hola, mundo\n");



  se convertir a


       printf(gettext("Hola, mundo\n"));



  Tambin es comn utilizar la forma abreviada ___(_) con un #DEFINE pre
  vio, en lugar de la llamada a gettext. En la mayora de estos casos
  estos cambios no afectan mucho al cdigo as, sin embargo habr casos
  en los que sea necesario modificar ligeramente el cdigo. Por ejemplo,
  cuando la cadena de caracteres a traducir se haba supuesto de un
  tamao fijo de caracteres. No olvidemos que lo que har la funcin
  _g_e_t_t_e_x_t en tiempo de ejecucin ser sustituir esta cadena por el
  equivalente traducido dentro de la ejecucin del programa.

  En muchos casos, esta modificacin de las fuentes, cuando los mensajes
  de salida estn definidos claramente, se puede hacer incluso de forma
  directa mediante la sustitucin de expresiones regulares con un
  sencillo programa en PERL o awk.


  En cualquier caso, la documentacin de _g_e_t_t_e_x_t incluye precisas
  explicaciones de cmo modificar convenientemente las fuentes para que
  tengan soporte de internacionalizacin.


  En el listado 1 se muestra un ejemplo de la internacionalizacin de un
  programa. En este caso se trata del programa _h_e_l_l_o, un programa de
  demostracin de GNU que muestra el consabido "Hello, world!" por
  pantalla al ejecutarse. Como puede verse (con '+' se indican las
  lneas aadidas y con '-' las eliminadas) se han modificado,
  rodendolos con una llamada a la funcin _g_e_t_t_e_x_t todos los mensajes
  que se envan por pantalla. Tambin se han aadido las directivas de
  compilador necesarias para incluir las funciones de
  internacionalizacin.

  El resultado de ejecutar _x_g_e_t_t_e_x_t _h_e_l_l_o_._c se muestra en el listado 2.
  Como puede verse aqu, todas las cadenas marcadas con gettext() han
  sido extradas y el fichero resultante es una plantilla que puede
  utilizarse para traducir directamente stas.



  44..  TTrraadduucccciinn ddee llooss mmeennssaajjeess

  Una vez que se han modificado de forma adecuada las fuentes, se
  utilizar la herramienta _x_g_e_t_t_e_x_t para extraer de stas las cadenas
  que pueden ser traducidas. Estas cadenas se extraen todas juntas a un
  slo fichero _p_o_/_m_e_s_s_a_g_e_s_._p_o_t. Este fichero ser el que se pueda
  utilizar como plantilla posteriormente por los traductores para
  generar los ficheros _L_E_N_G_U_A_J_E_._p_o.


  Este proceso se muestra de forma completa en la figura 1. Como puede
  verse all ste fichero se obtiene a travs de las fuentes ya
  preparadas para internacionalizarse. Si se dispone de una traduccin
  de una versin previa del programa, podr utilizarse el programa
  _m_s_g_m_e_r_g_e para utilizar las traducciones ya realizadas de mensajes en
  la generacin del fichero a traducir. _M_s_g_m_e_r_g_e tiene la ventaja de que
  es capaz de juntar ficheros .po de forma _d_i_f_u_s_a. Es decir, aunque las
  fuentes hayan modificado la localizacin de los mensajes a
  internacionalizar, es capaz de encontrar dnde debera incluir un
  texto ya traducido.


  Con el fichero .po generado, con o sin traducciones previas, ste
  puede ser ya distribuido a los responsables de las traducciones para
  que incorporen a ste la traduccin de los mensajes existentes. Si nos
  encontramos ante un programa que se va a internacionalizar en este
  momento a un nuevo idioma, el fichero .po tendr un aspecto similar al
  del Listado 2. Sin embargo, si el programa ya ha sido
  internacionalizado previamente, el fichero tendr cadenas traducidas y
  cadenas sin traducir, o incluso cadenas que han sido modificadas en la
  ltima versin del programa y necesitan ser revisadas.


  55..  LLaa eevvoolluucciinn eenn ffiicchheerrooss ppoo

  Cmo evolucionan los ficheros .po? Uno podra pensar que una vez
  realizada la traduccin de los mensajes a un determinado idioma para
  un programa no es necesario realizar nada ms. Sin embargo esto no es
  as, los programas son entes vivos, cambian, evolucionan, incorporan
  nuevas funcionalidades, etc. Esto trae consigo, como uno pudiera
  esperar, que los mensajes que se ofrecen al usuario, los botones, los
  mens, etc. cambien tambin con el tiempo. Aunque el grueso de los
  mensajes pueda no variar, es necesario revisar, con cada nueva versin
  que se distribuye de un programa los mensajes internacionalizados.


  Pero sin embargo, y he aqu una de las maravillas de gettext, esta
  revisin no influye para nada la tarea del programador o programadores
  encargados de mejorar y distribuir las nuevas versiones del programa.
  Es decir, el hecho de que no haya una persona encargada de una
  determinada traduccin no tiene por qu interrumpir la distribucin de
  un programa. S, los mensajes no estarn todos traducidos, pero sto
  "slo" se traducir en que un usuario ver los mensajes en dos
  idiomas. Los traducidos, en su idioma nativo, y los no traducidos en
  el idioma original.


  Evidentemente, esto es mucho mejor que no disponer de una nueva
  versin del programa por no poder contactar con los traductores cuando
  a lo mejor se est hablando de un programa internacionalizado a ms de
  diez idiomas. Tambin es mejor que ver los mensajes en el idioma
  original cuando no se ha podido llegar a traducir el 100% de los
  mensajes.


  Asisten en esta tarea las herramientas, _m_s_g_m_e_r_g_e y _m_s_g_c_m_p. La segunda
  permite determinar si se han traducido todos los mensajes con respecto
  a la ltima versin disponible del programa, y la primera permite
  distribuir una nueva versin de un fichero de mensajes "mezclando" los
  mensajes ya traducidos con los nuevos a traducir.


  66..  QQuuiinn ttrraadduuccee llooss pprrooggrraammaass??

  Como se puede ver en listado 2, la traduccin de mensajes es muy
  sencilla, y cualquier usuario puede coger un fichero .po traducido
  parcialmente y rellenar los "huecos" que falten. Este hecho, en el
  mundo GNU lleno de personas de muchas capacidades distintas dispuestas
  a colaborar, garantiza la posibilidad de colaborar y de formar parte
  de un equipo de traduccin a usuarios que no tengan ningn tipo de
  conocimiento de programacin. Para mantener un fichero .po al da slo
  es necesario conocer tanto el idioma original como el idioma final de
  la traduccin.


  As pues, uno de los objetivos logrados de la librera gettext es que
  cualquier persona, con unos mnimos conocimientos, pueda colaborar en
  la internacionalizacin de los programas derivados del software libre.
  No siendo necesario ser un desarrollador de programas, ni una persona
  experta en programacin para llevar estas tareas a cabo.


  En el proyecto GNU se dan soporte a distintos grupos de
  internacionalizacin que son las personas responsables de la
  traduccin de los programas. An as no es necesario una dedicacin
  permanente a estos grupos para internacionalizar un programa, como ya
  se ha visto, la internacionalizacin puede ser un esfuerzo puntual y
  concreto. La existencia de los grupos garantiza, sin embargo, la
  correcta revisin de estos trabajos puntuales que pueden realizar los
  usuarios, la elaboracin de glosarios que den uniformidad a los
  programas traducidos y la actualizacin de las traduccioens en vistas
  de nuevas versiones de programas.



  77..  DDiissttrriibbuucciinn ddee llooss bbiinnaarriiooss

  Con las traducciones ya realizadas de los ficheros .po de los
  distintos lenguajes disponibles, ya slo queda generar el formato
  necesario para su distribucin. En la distribucin de mensajes
  traducidos, se utilizan ficheros .mo que genera de forma automtica la
  herramienta _m_s_g_f_t_m. Estos ficheros binarios se distribuyen de forma
  conjunta con el cdigo fuente, instalndose en ubicaciones
  predefinidas.


  La librera gettext cargar dichos binarios cuando el entorno del
  usuario indique un idioma del que est disponible la correspondiente
  versin traducida.


  Esta ubicacin suele ser /usr/share/locale/LENGUAJE/LC_MESSAGES, lo
  que permite que, el usuario que no desee mensajes en otros idiomas
  distintos del suyo, pueda eliminar aquellos que no considere
  importantes. En cualquier caso, los binarios del programa se
  distribuyen habitualmente con todos los mensajes traducidos a todos
  los idiomas, y tendr que ser el sistema de instalacin del sistema
  operativo del usuario el que le de la opcin de eliminar dichos
  idiomas.



  88..  HHeerrrraammiieennttaass ddee ggeetttteexxtt

  Ya se han visto, en la descripcin de las tareas de
  internacionalizacin, algunos de los programas que incorpora la
  librera de GNU gettext para ayudar a la tarea de
  internacionalizacin. La librera incorpora, en total, los siguientes
  programas:


    gettextize. Aade los ficheros necesarios al rbol de fuentes de un
     programa para su internacionalizacin. Estos ficheros son comunes a
     todos los programas con sta caracterstica.

    xgettext. Extrae los mensajes a traducir de unas fuentes
     internacionalizadas, generando el fichero messages.po
     correspondiente.
    msgmerge. De una serie de mensajes ya traducidos, dentro de un
     catlogo, incorpora las traducciones a los correspondientes
     ficheros de un programa internacionalizado.

    msgfmt. Genera los ficheros binarios con los mensajes traducidos
     para su distribucin, es decir, los ficheros .mo

    msgunfmt. Realiza la operacin inversa al programa anterior, es
     decir, de un fichero .mo genera su equivalente .po

    msgcomm. Busca mensajes comunes entre dos o ms ficheros .po.

    msgcmp. Compara dos ficheros .po para comprobar que ambos contienen
     el mismo nmero de cadenas traducidas, con lo que permite verificar
     si se han traducido todos y cada uno de los mensajes del programa.



  99..  CCoonncclluussiioonneess

  En este artculo se ha visto cmo se internacionaliza un programa, y
  qu herramientas se pueden utilizar para ello, particularizando a la
  librera ms utilizada del mundo de software libre, la librera
  Gettext. Aunque ste artculo se ha centrado en la
  internacionalizacin de fuentes en C/C++, tambin es posible
  internacionalizar fuentes escritas en otros lenguajes de programacin.
  Por ejemplo, PERL cuenta con una librera de adaptacin a gettext
  llamada Locale::gettext que permite la internacionalizacin de
  programas interpretados en este lenguaje.


  El usuario avanzado, que desee encontrar ms informacin, puede acudir
  a  http://www.gnu.org/software/gettext/gettext.html (y
  gettext.gnu.org). Si tiene instalado el software de gettext, tambin
  dispondr de la ayuda en lnea, que podr consultar ejecutando info
  gettext


  Si desea ayudar al esfuerzo de internacionalizacin de programas de
  GNU, contacte con su equipo local de trabajo. Puede contribuir sus
  trabajos a travs del Proyecto de Traducciones Libres (_F_r_e_e
  _T_r_a_n_s_l_a_t_i_o_n _P_r_o_y_e_c_t, n. del a.)  en
  http://www.iro.umontreal.ca/contrib/po/.  Si desea ver el estado de
  las traducciones existe una base de datos de traducciones y
  traductores que puede consultar en
  http://www.iro.umontreal.ca/ pinard/po/registry.cgi?team=es.  En
  cualquier caso, algunos programas internacionalizados pueden no
  haberse incluido en el proyecto GNU, para hacerse una idea de la
  internacionalizacin de programas en un sistema operativo GNU/Linux,
  pruebe a consultar, por ejemplo, el Monitor de traducciones de Debian
  en http://www.debian.org/intl/l10n/po-es



  1100..  SSuummaarriiooss

  El ingls es el idioma oficial de la mayora de los proyectos de
  software libre.

  Los usuarios desean que sus entornos estn adaptados a ellos.

  La modificacin del software es parte de la internacionalizacin.


  La librera gettext es el estndar para internacionalizar programas.

  Para preparar un programa hay que detectar dnde se ofrecen mensajes
  al usuario.

  Algunos cambios para la internacionalizacin se pueden hacer de forma
  automtica.

  El soporte de internacionalizacin se puede detectar al compilar el
  programa.

  Es necesario marcar los mensajes en las fuentes en C.

  La plantilla de mensajes est en el fichero messages.pot

  Los mensajes se traducen en los ficheros .po

  Los ficheros .po se pueden utilizar aunque estn parcialmente
  traducidos.

  Gettext incorpora una variedad de herramientas para ayudar a la
  internacionalizacin.

  La traduccin de mensajes es tan sencilla que cualquier usuario puede
  colaborar.

  PERL tambin incorpora una librera de adaptacin a gettext.



  1111..  LLiissttaaddooss


  LISTADO 1



  $ diff -ur hello/hello-1.3/hello.c ./hello-int/hello-1.3/hello.c
  --- hello/hello-1.3/hello.c     Sun Jun 10 18:30:47 2001
  +++ ./hello.c   Tue May 16 21:49:28 2000
  @@ -64,6 +64,12 @@
   #endif /* HAVE_ALLOCA_H.  */
   #endif /* GCC.  */

  +#include >libintl.h<
  +#define _(String) gettext (String)
  +
  +#include "config.h"

   #define the (1)

  @@ -79,7 +85,7 @@

   extern char version[];

  -char usage[] = "Usage: %s [-htvm] [--help] [--traditional] [--version] [--mail]\n";
  +char usage[] = gettext("Usage: %s [-htvm] [--help] [--traditional] [--version] [--mail]\n");

   static char *progname;

  @@ -91,6 +97,14 @@
     int optc;
     int h = 0, v = 0, t = 0, m = 0, lose = 0, z = 0;

  +#ifdef ENABLE_NLS
  +   setlocale (LC_ALL, "");
  +   bindtextdomain (PACKAGE, LOCALEDIR);
  +   textdomain (PACKAGE);
  +#endif
  +
  +
  +
     progname = argv[0];

   #define king
  @@ -136,15 +150,15 @@
     if (h)
       {
         /* Print help info and exit.  */
  -      fputs ("This is GNU Hello, THE greeting printing program.\n",
  +      fputs (gettext("This is GNU Hello, THE greeting printing program.\n"),
               stderr);
         fprintf (stderr, usage, progname);
  -      fputs ("  -h, --help\t\t\tPrint a summary of the options\n", stderr);
  -      fputs ("  -t, --traditional\t\tUse traditional greeting format\n",
  +      fputs (gettext("  -h, --help\t\t\tPrint a summary of the options\n"), stderr);
  +      fputs (gettext("  -t, --traditional\t\tUse traditional greeting format\n"),

               stderr);
  -      fputs ("  -v, --version\t\t\tPrint the version number\n", stderr);
  -      fputs ("  -m, --mail\t\t\tPrint your mail\n", stderr);
  +      fputs (gettext("  -v, --version\t\t\tPrint the version number\n"), stderr);
  +      fputs (gettext("  -m, --mail\t\t\tPrint your mail\n"), stderr);
         exit (0);
       }

  @@ -177,7 +191,7 @@
                struct passwd *pwd = getpwuid (getuid ());
                if (! pwd)
                  {
  -                 fprintf (stderr, "%s: Who are you?\n", progname);
  +                 fprintf (stderr, gettext("%s: Who are you?\n"), progname);
                    exit (1);
                  }
                user = pwd->pw_name;
  @@ -239,13 +253,13 @@
          }
       }
     else if (z)
  -    puts ("Nothing happens here.");
  +    puts (gettext("Nothing happens here."));
     else
       {
         if (t)
  -        printf ("hello, world\n");
  +        printf (gettext("hello, world\n"));
         else
  -        puts ("Hello, world!");
  +        puts (gettext("Hello, world!"));
       }

     exit (0);
  @@ -260,7 +274,7 @@
     char *ptr = malloc (size);
     if (! ptr)
       {
  -      fprintf (stderr, "%s: virtual memory exhausted\n", progname);
  +      fprintf (stderr, gettext("%s: virtual memory exhausted\n"), progname);
         exit (1);
       }
     return ptr;



  PIE LISTADO 1: Modificaciones realizadas al cdigo de hello.c para
  internacionalizacin

  LISTADO 2



  # SOME DESCRIPTIVE TITLE.
  # Copyright (C) YEAR Free Software Foundation, Inc.
  # FIRST AUTHOR >EMAIL@ADDRESS<, YEAR.
  #
  #, fuzzy
  msgid ""
  msgstr ""
  "Project-Id-Version: PACKAGE VERSION\n"
  "POT-Creation-Date: 2001-06-10 19:29+0200\n"
  "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
  "Last-Translator: FULL NAME >EMAIL@ADDRESS<\n"
  "Language-Team: LANGUAGE >LL@li.org<\n"
  "MIME-Version: 1.0\n"
  "Content-Type: text/plain; charset=CHARSET\n"
  "Content-Transfer-Encoding: ENCODING\n"

  #: hello.c:88
  #, c-format
  msgid "Usage: %s [-htvm] [--help] [--traditional] [--version] [--mail]\n"
  msgstr ""

  #: hello.c:153
  msgid "This is GNU Hello, THE greeting printing program.\n"
  msgstr ""

  #: hello.c:156
  msgid "  -h, --help\t\t\tPrint a summary of the options\n"
  msgstr ""

  #: hello.c:157
  msgid "  -t, --traditional\t\tUse traditional greeting format\n"
  msgstr ""

  #: hello.c:160
  msgid "  -v, --version\t\t\tPrint the version number\n"
  msgstr ""

  #: hello.c:161
  msgid "  -m, --mail\t\t\tPrint your mail\n"
  msgstr ""

  #: hello.c:194
  #, c-format
  msgid "%s: Who are you?\n"
  msgstr ""

  #: hello.c:256
  msgid "Nothing happens here."
  msgstr ""

  #: hello.c:260
  msgid "hello, world\n"
  msgstr ""

  #: hello.c:262
  msgid "Hello, world!"
  msgstr ""

  #: hello.c:277
  #, c-format
  msgid "%s: virtual memory exhausted\n"
  msgstr ""



  PIE LISTADO 2: Fichero po de hello.c



  1122..  CCaappttuurraass

  Figura 1: El proceso completo de internacionalizacin con gettext



  1133..  NNoottaass ddee mmaaqquueettaacciinn



  1144..  NNoottaass ddee ccoooorrddiinnaacciinn



