1 El ingl[eacute]s como idioma universal#$+
KEl ingl[eacute]s es el idioma oficial por regla general en la pr[aacute]ctica 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 s[oacute]lo a los usuarios dentro del mundo GNU/Linux sino a cualquier usuario de los sistemas de la informaci[oacute]n. Es por esto que el ingl[eacute]s es el idioma en el que habitualmente los programas presentan sus mensajes, y la mayor[iacute]a de la documentaci[oacute]n est[aacute] realizada en ingl[eacute]s.
No cabe duda que el uso de un [uacute]nico lenguaje facilita la coordinaci[oacute]n del trabajo de los desarrolladores, a la hora de intercambiar ideas, y la difusi[oacute]n de un proyecto, pero los usuarios desean m[aacute]s, desean que los entornos en los que trabajen est[eacute]n adaptados a sus entornos espec[iacute]ficos.
Esta adaptaci[oacute]n no es exclusivamente, aunque s[iacute] es la primera evidencia, la traducci[oacute]n de todos y cada uno de los mensajes, men[uacute]s, botones, etc. que muestra el programa al usuario. Tambi[eacute]n incluye la adaptaci[oacute]n del programa para que al utilizar otras caracter[iacute]sticas eminentemente locales, se "adapte" al entorno. Por ejemplo, al utilizar unidades monetarias muestre preferentemente las unidades locales con las expresiones habituales de separaci[oacute]n de decimales, nomenclatura, etc. o que la representaci[oacute]n de fechas y horas se haga en la manera acostumbrada al usuario (d[iacute]a-mes-a[ntilde]o en lugar de mes-d[iacute]a-a[ntilde]o por ejemplo), o incluso que las unidades m[eacute]tricas utilizadas para la representaci[oacute]n de distancias, pesos, etc. sean las utilizadas por el usuario.
La modificaci[oacute]n de un software para que sea capaz de ofrecer estas funciones es lo que se conoce como internacionalizaci[oacute]n (muchas veces se reduce al acr[oacute]nimo 'i18n'). Mientras que la modificaci[oacute]n de estas funciones para adaptar un programa a un determinado entorno se conoce como localizaci[oacute]n (muchas veces reducido a 'l10n'). Explic[aacute]ndolo en forma breve, los programadores internacionalizan y los traductores localizan.

2 Internacionalizaci[oacute]n de mensajes: gettext#$+
KDentro de la internacionalizaci[oacute]n de programas, uno de los aspectos m[aacute]s cr[iacute]ticos es la posibilidad de traducir los mensajes que presenta el programa al usuario. No s[oacute]lo los mensajes que puedan aparecer en el interfaz gr[aacute]fico, 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 internacionalizaci[oacute]n de mensajes en programas es Gettext. Esta herramienta, desarrollada entre 1994 y 1995 por un grupo variado de programadores, facilita la creaci[oacute]n de programas que pueden distribuirse con m[uacute]ltiples cat[aacute]logos 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 s[oacute]lo tiene que marcar los mensajes que cree que deben traducirse. Asimismo, la modificaci[oacute]n del c[oacute]digo fuente y reubicaci[oacute]n de los mensajes es relativamente transparente al traductor, que s[oacute]lo tiene que mantener actualizado un listado de traducciones de los mensajes. Las herramientas de gettext se encargan, por debajo, de homogeneizar los cat[aacute]logos y modificar [eacute]stos cuando las fuentes cambian, pero preservando las traducciones ya realizadas.
De esta forma, el trabajo de traducci[oacute]n de los mensajes de un programa se reduce a una traducci[oacute]n inicial de todos los mensajes y al mantenimiento de los peque[ntilde]os (o grandes) cambios en el c[oacute]digo que puedan suponer la introducci[oacute]n (o desaparici[oacute]n) 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 traducci[oacute]n para la generaci[oacute]n de nuevas versiones de su programa.

3 Preparar un programa para internacionalizaci[oacute]n#$+
KLo primero que debe hacer un programador para internacionalizar su software es detectar en qu[eacute] puntos de [eacute]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 env[iacute]en en determinadas circunstancias de error). Estos mensajes (cadenas de caracteres) tienen que ser marcados de forma que pueda extraerse esta informaci[oacute]n.
Algunos de los cambios que son necesarios hacer a las fuentes del programa las realiza el programa gettextize. Este programa, invocado directamente en el directorio ra[iacute]z de las fuentes realiza las siguientes funciones:
· copia el fichero ABOUT-NLS que describe el entorno de internacionalizaci[oacute]n utilizado.
· crea el directorio intl/ y pone all[iacute] todos los ficheros que se distribuyen con gettext, estos ficheros son los ficheros de cabecera de la librer[iacute]a libintl y deben ser id[eacute]nticos entre distintos proyectos de software internacionalizados.
· crea el directorio po/ y el fichero Makefile.in.in dentro de [eacute]ste. Este directorio ser[aacute] el repositorio de la traducci[oacute]n de mensajes que se incluir[aacute] con la distribuci[oacute]n 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 internacionalizaci[oacute]n pueda llevarse f[aacute]cilmente a cabo:
· crear el fichero po/POTFILES.in e introducir en [eacute]l una lista (un fichero por l[iacute]nea) con los ficheros que contienen mensajes marcados para traducci[oacute]n. 
· modificar el fichero configure.in (del sistema de auto configuraci[oacute]n) para: 
·  introducir los cambios necesarios para que el sistema de auto-configuraci[oacute]n busque las librer[iacute]as de internacionalizaci[oacute]n (con la macro AM[lowbar]GNU[lowbar]GETTEXT).
· indicar los idiomas a los que est[aacute] traducido el programa (ficheros .po con traducciones) con la definici[oacute]n de ALL[lowbar]LINGUAS.
· declarar el nombre del paquete y versi[oacute]n. Generalmente se har[aacute] con las siguientes l[iacute]neas, y esto permitir[aacute] a gettext el hacer un seguimiento de las fuentes de c[oacute]digo frente a las traducciones de mensajes. Como se ver[aacute] m[aacute]s adelante podr[aacute]n 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 gui[oacute]n configure, cambiando  la macro AC[lowbar]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 internacionalizaci[oacute]n al configurar las fuentes. 
· modificar el fichero Makefile.in en el directorio ra[iacute]z y en los de las fuentes de forma que se incluyan las librer[iacute]as de internacionalizaci[oacute]n al compilar (tanto al generar los ficheros objeto como al enlazar din[aacute]micamente), y para que se instalen los ficheros po en el sistema al ejecutar a make install.  
Con estos cambios, el desarrollador se asegura que, al configurar el programa se detecte el soporte (o no) de internacionalizaci[oacute]n del sistema y que, tras esto, se compilen las fuentes de la manera adecuada y se instalen con soporte de internacionalizaci[oacute]n (incluyendo todos los ficheros de las traducciones) si el sistema no carece de soporte para [eacute]ste.
Una vez realizado estos cambios es necesario cambiar las fuentes C en s[iacute] del programa, para marcar los mensajes que se deban traducir. La b[uacute]squeda de estos mensajes puede ser algo tediosa, aunque depender[aacute] del programa en s[iacute]. Se puede seguir la m[aacute]xima de "todo aquello que se presenta al usuario debe ser internacionalizado" y as[iacute] buscar mensajes que se presenten a este (mediante funciones de salida como printf) o cadenas que se utilicen para generar salidas (como botones o men[uacute]s). Una vez localizadas, estos mensajes deben rodearse con una llamada a gettext. As[iacute], una l[iacute]nea de c[oacute]digo del estilo de  

printf("Hola, mundo");

  se convertir[aacute] a 

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

  Tambi[eacute]n es com[uacute]n utilizar la forma abreviada [lowbar]() con un [num   ]DEFINE previo, en lugar de la llamada a gettext. En la mayor[iacute]a de estos casos estos cambios no afectan mucho al c[oacute]digo as[iacute], sin embargo habr[aacute] casos en los que sea necesario modificar ligeramente el c[oacute]digo. Por ejemplo, cuando la cadena de caracteres a traducir se hab[iacute]a supuesto de un tama[ntilde]o fijo de caracteres. No olvidemos que lo que har[aacute] la funci[oacute]n gettext en tiempo de ejecuci[oacute]n ser[aacute] sustituir esta cadena por el equivalente traducido dentro de la ejecuci[oacute]n del programa.
En muchos casos, esta modificaci[oacute]n de las fuentes, cuando los mensajes de salida est[aacute]n definidos claramente, se puede hacer incluso de forma directa mediante la sustituci[oacute]n de expresiones regulares con un sencillo programa en PERL o awk.
En cualquier caso, la documentaci[oacute]n de gettext incluye precisas explicaciones de c[oacute]mo modificar convenientemente las fuentes para que tengan soporte de internacionalizaci[oacute]n.
En el listado 1 se muestra un ejemplo de la internacionalizaci[oacute]n de un programa. En este caso se trata del programa hello, un programa de demostraci[oacute]n de GNU que muestra el consabido "Hello, world!" por pantalla al ejecutarse. Como puede verse (con '+' se indican las l[iacute]neas a[ntilde]adidas y con '-' las eliminadas) se han modificado, rode[aacute]ndolos con una llamada a la funci[oacute]n gettext todos los mensajes que se env[iacute]an por pantalla. Tambi[eacute]n se han a[ntilde]adido las directivas de compilador necesarias para incluir las funciones de internacionalizaci[oacute]n.
El resultado de ejecutar xgettext hello.c se muestra en el listado 2. Como puede verse aqu[iacute], todas las cadenas marcadas con gettext() han sido extra[iacute]das y el fichero resultante es una plantilla que puede utilizarse para traducir directamente [eacute]stas.

4 Traducci[oacute]n de los mensajes#$+
KUna vez que se han modificado de forma adecuada las fuentes, se utilizar[aacute] la herramienta xgettext para extraer de [eacute]stas las cadenas que pueden ser traducidas. Estas cadenas se extraen todas juntas a un s[oacute]lo fichero po/messages.pot. Este fichero ser[aacute] el que se pueda utilizar como plantilla posteriormente por los traductores para generar los ficheros LENGUAJE.po.
Este proceso se muestra de forma completa en la figura 1. Como puede verse all[iacute] [eacute]ste fichero se obtiene a trav[eacute]s de las fuentes ya preparadas para internacionalizarse. Si se dispone de una traducci[oacute]n de una versi[oacute]n previa del programa, podr[aacute] utilizarse el programa msgmerge para utilizar las traducciones ya realizadas de mensajes en la generaci[oacute]n del fichero a traducir. Msgmerge tiene la ventaja de que es capaz de juntar ficheros .po de forma difusa. Es decir, aunque las fuentes hayan modificado la localizaci[oacute]n de los mensajes a internacionalizar, es capaz de encontrar d[oacute]nde deber[iacute]a incluir un texto ya traducido.
Con el fichero .po generado, con o sin traducciones previas, [eacute]ste puede ser ya distribuido a los responsables de las traducciones para que incorporen a [eacute]ste la traducci[oacute]n 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[aacute] un aspecto similar al del Listado 2. Sin embargo, si el programa ya ha sido internacionalizado previamente, el fichero tendr[aacute] cadenas traducidas y cadenas sin traducir, o incluso cadenas que han sido modificadas en la [uacute]ltima versi[oacute]n del programa y necesitan ser revisadas.

5 La evoluci[oacute]n en ficheros po#$+
K¿C[oacute]mo evolucionan los ficheros .po? Uno podr[iacute]a pensar que una vez realizada la traducci[oacute]n de los mensajes a un determinado idioma para un programa no es necesario realizar nada m[aacute]s. Sin embargo esto no es as[iacute], 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 men[uacute]s, etc. cambien tambi[eacute]n con el tiempo. Aunque el grueso de los mensajes pueda no variar, es necesario revisar, con cada nueva versi[oacute]n que se distribuye de un programa los mensajes internacionalizados.
Pero sin embargo, y he aqu[iacute] una de las maravillas de gettext, esta revisi[oacute]n 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 traducci[oacute]n no tiene por qu[eacute] interrumpir la distribuci[oacute]n de un programa. S[iacute], los mensajes no estar[aacute]n todos traducidos, pero [eacute]sto "s[oacute]lo" se traducir[aacute] en que un usuario ver[aacute] 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 versi[oacute]n del programa por no poder contactar con los traductores cuando a lo mejor se est[aacute] hablando de un programa internacionalizado a m[aacute]s de diez idiomas. Tambi[eacute]n es mejor que ver los mensajes en el idioma original cuando no se ha podido llegar a traducir el 100[percnt] de los mensajes.
Asisten en esta tarea las herramientas, msgmerge y msgcmp. La segunda permite determinar si se han traducido todos los mensajes con respecto a la [uacute]ltima versi[oacute]n disponible del programa, y la primera permite distribuir una nueva versi[oacute]n de un fichero de mensajes "mezclando" los mensajes ya traducidos con los nuevos a traducir.

6 ¿Qui[eacute]n traduce los programas?#$+
KComo se puede ver en listado 2, la traducci[oacute]n 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 traducci[oacute]n a usuarios que no tengan ning[uacute]n tipo de conocimiento de programaci[oacute]n. Para mantener un fichero .po al d[iacute]a s[oacute]lo es necesario conocer tanto el idioma original como el idioma final de la traducci[oacute]n.
As[iacute] pues, uno de los objetivos logrados de la librer[iacute]a gettext es que cualquier persona, con unos m[iacute]nimos conocimientos, pueda colaborar en la internacionalizaci[oacute]n de los programas derivados del software libre. No siendo necesario ser un desarrollador de programas, ni una persona experta en programaci[oacute]n para llevar estas tareas a cabo.
En el proyecto GNU se dan soporte a distintos grupos de internacionalizaci[oacute]n que son las personas responsables de la traducci[oacute]n de los programas. A[uacute]n as[iacute] no es necesario una dedicaci[oacute]n permanente a estos grupos para internacionalizar un programa, como ya se ha visto, la internacionalizaci[oacute]n puede ser un esfuerzo puntual y concreto. La existencia de los grupos garantiza, sin embargo, la correcta revisi[oacute]n de estos trabajos puntuales que pueden realizar los usuarios, la elaboraci[oacute]n de glosarios que den uniformidad a los programas traducidos y la actualizaci[oacute]n de las traduccioens en vistas de nuevas versiones de programas.

7 Distribuci[oacute]n de los binarios#$+
KCon las traducciones ya realizadas de los ficheros .po de los distintos lenguajes disponibles, ya s[oacute]lo queda generar el formato necesario para su distribuci[oacute]n. En la distribuci[oacute]n de mensajes traducidos, se utilizan ficheros .mo que genera de forma autom[aacute]tica la herramienta msgftm. Estos ficheros binarios se distribuyen de forma conjunta con el c[oacute]digo fuente, instal[aacute]ndose en ubicaciones predefinidas.
La librer[iacute]a gettext cargar[aacute] dichos binarios cuando el entorno del usuario indique un idioma del que est[aacute] disponible la correspondiente versi[oacute]n traducida.
Esta ubicaci[oacute]n suele ser /usr/share/locale/LENGUAJE/LC[lowbar]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[aacute] que ser el sistema de instalaci[oacute]n del sistema operativo del usuario el que le de la opci[oacute]n de eliminar dichos idiomas.

8 Herramientas de gettext#$+
KYa se han visto, en la descripci[oacute]n de las tareas de internacionalizaci[oacute]n, algunos de los programas que incorpora la librer[iacute]a de GNU gettext para ayudar a la tarea de internacionalizaci[oacute]n. La librer[iacute]a incorpora, en total, los siguientes programas:
· gettextize. A[ntilde]ade los ficheros necesarios al [aacute]rbol de fuentes de un programa para su internacionalizaci[oacute]n. Estos ficheros son comunes a todos los programas con [eacute]sta caracter[iacute]stica.
· 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 cat[aacute]logo, incorpora las traducciones a los correspondientes ficheros de un programa internacionalizado.
· msgfmt. Genera los ficheros binarios con los mensajes traducidos para su distribuci[oacute]n, es decir, los ficheros .mo
· msgunfmt. Realiza la operaci[oacute]n inversa al programa anterior, es decir, de un fichero .mo genera su equivalente .po 
· msgcomm. Busca mensajes comunes entre dos o m[aacute]s ficheros .po. 
· msgcmp. Compara dos ficheros .po para comprobar que ambos contienen el mismo n[uacute]mero de cadenas traducidas, con lo que permite verificar si se han traducido todos y cada uno de los mensajes del programa. 

9 Conclusiones#$+
KEn este art[iacute]culo se ha visto c[oacute]mo se internacionaliza un programa, y qu[eacute] herramientas se pueden utilizar para ello, particularizando a la librer[iacute]a m[aacute]s utilizada del mundo de software libre, la librer[iacute]a Gettext. Aunque [eacute]ste art[iacute]culo se ha centrado en la internacionalizaci[oacute]n de fuentes en C/C++, tambi[eacute]n es posible internacionalizar fuentes escritas en otros lenguajes de programaci[oacute]n. Por ejemplo, PERL cuenta con una librer[iacute]a de adaptaci[oacute]n a gettext llamada Locale::gettext que permite la internacionalizaci[oacute]n de programas interpretados en este lenguaje.
El usuario avanzado, que desee encontrar m[aacute]s informaci[oacute]n, puede acudir a  http://www.gnu.org/software/gettext/gettext.html (y gettext.gnu.org). Si tiene instalado el software de gettext, tambi[eacute]n dispondr[aacute] de la ayuda en l[iacute]nea, que podr[aacute] consultar ejecutando info gettext
Si desea ayudar al esfuerzo de internacionalizaci[oacute]n de programas de GNU, contacte con su equipo local de trabajo. Puede contribuir sus trabajos a trav[eacute]s del Proyecto de Traducciones Libres (Free Translation Proyect, 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://www2.iro.umontreal.ca/[nbsp  ]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 internacionalizaci[oacute]n 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

10 Sumarios#$+
KEl ingl[eacute]s es el idioma oficial de la mayor[iacute]a de los proyectos de software libre.
Los usuarios desean que sus entornos est[eacute]n adaptados a ellos.
La modificaci[oacute]n del software es parte de la internacionalizaci[oacute]n.
La librer[iacute]a gettext es el est[aacute]ndar para internacionalizar programas.
Para preparar un programa hay que detectar d[oacute]nde se ofrecen mensajes al usuario.
Algunos cambios para la internacionalizaci[oacute]n se pueden hacer de forma autom[aacute]tica.
El soporte de internacionalizaci[oacute]n se puede detectar al compilar el programa.
Es necesario marcar los mensajes en las fuentes en C.
La plantilla de mensajes est[aacute] en el fichero messages.pot
Los mensajes se traducen en los ficheros .po
Los ficheros .po se pueden utilizar aunque est[eacute]n parcialmente traducidos.
Gettext incorpora una variedad de herramientas para ayudar a la internacionalizaci[oacute]n.
La traducci[oacute]n de mensajes es tan sencilla que cualquier usuario puede colaborar.
PERL tambi[eacute]n incorpora una librer[iacute]a de adaptaci[oacute]n a gettext.

11 Listados#$+
K
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 [gt    ]libintl.h[lt    ] 
+#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]"; 
+char usage[] = gettext("Usage: %s [-htvm] [--help] [--traditional] [--version] [--mail]"); 
  
 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.", 
+      fputs (gettext("This is GNU Hello, THE greeting printing program."), 
             stderr); 
       fprintf (stderr, usage, progname); 
-      fputs ("  -h, --helpa summary of the options", stderr); 
-      fputs ("  -t, --traditionaltraditional greeting format", 
+      fputs (gettext("  -h, --helpa summary of the options"), stderr); 
+      fputs (gettext("  -t, --traditionaltraditional greeting format"), 
              
             stderr); 
-      fputs ("  -v, --versionthe version number", stderr); 
-      fputs ("  -m, --mailyour mail", stderr); 
+      fputs (gettext("  -v, --versionthe version number"), stderr); 
+      fputs (gettext("  -m, --mailyour mail"), stderr); 
       exit (0); 

@@ -177,7 +191,7 @@ 
              struct passwd *pwd = getpwuid (getuid ()); 
              if (! pwd) 
                 
-                 fprintf (stderr, "%s: Who are you?", progname); 
+                 fprintf (stderr, gettext("%s: Who are you?"), 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"); 
+        printf (gettext("hello, world")); 
       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", progname); 
+      fprintf (stderr, gettext("%s: virtual memory exhausted"), progname); 
       exit (1); 
      
   return ptr;

 PIE LISTADO 1: Modificaciones realizadas al c[oacute]digo de hello.c para internacionalizaci[oacute]n
LISTADO 2 

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

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

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

#: hello.c:156 
msgid "  -h, --helpa summary of the options" 
msgstr "" 

#: hello.c:157 
msgid "  -t, --traditionaltraditional greeting format" 
msgstr "" 

#: hello.c:160 
msgid "  -v, --versionthe version number" 
msgstr "" 

#: hello.c:161 
msgid "  -m, --mailyour mail" 
msgstr "" 

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

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

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

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

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

PIE LISTADO 2: Fichero po de hello.c

12 Capturas#$+
KFigura 1: El proceso completo de internacionalizaci[oacute]n con gettext

13 Notas de maquetaci[oacute]n#$+
K

14 Notas de coordinaci[oacute]n#$+
K