Internacionalización de una aplicación en C
Para mostrar como se realiza este proceso vamos a usar el típico programa Hello World
#include<stdio.h>
int main(void)
{
printf("Hello World");
}
Editando el Codigo
para empezar en necesario agregar las librerías que permiten el uso del API GNU Gettext
#include <libintl.h> #include <locale.h>
Luego es necesario incluir unas definiciones que permiten al gettext idinfificar las cadenas que se deben traducir.
#define _(String) gettext(String) // cadenas traducibles #define N_(String) (String) // cadenas no traducibles
Lo siguiente es incluir las funciones setlocale(), bindtextdomain() y textdomain():
•setlocale(LC,""): el primer parámetro de esta función es usado para definir las categorías de localización Usar LC_ALL afectará a todas las categorías de localización. el segundo parámetro permite definir el LOCALE que va a usar el programa, al darle el valor "" al locale, estaremos usando el locale definido por el usuario (obtenido de las variables de entorno LANG o LC). Si no hay un locale definido por el usuario, se utiliza el valor por defecto "C".
•bindtextdomain("nameDir","ruta"): esta funcion define el directorio base de la jerarquia en donde estan contenidos los archivos *.mo
•textdomain("nameArch"):
finalmente el código debe quedar de esta forma
#include <stdio.h>
#include <libintl.h>
#include <locale.h>
#define _(String) gettext(String) // cadenas traducibles
#define N_(String) (String) // cadenas no traducibles
int main(void)
{
setlocale(LC_ALL,"");
bindtextdomain("hola", "locale");
textdomain("hola");
printf(_("Hello World"));
}Al compilarlo volvemos a observar que la salida por pantalla sigue siendo Hello World. Eso es debido a que hemos preparado las fuentes para la localización, pero no hemos realizado la localización en sí misma. Para ello, comenzamos por extraer las cadenas marcadas del código fuente con la utilidad xgettext. Con esto obtendremos un archivo .po que podremos utilizar de plantilla. En nuestro caso deberemos teclear lo siguiente:
$ xgettext -k_ hola.c -o hola.po
El resultado será el archivo hola.po. Prestamos especial atención a las siguientes líneas:
#: hola.c:15 msgid "Hello World\n" msgstr ""
A continuacion
Creamos el directorio locale/es/LC_MESSAGES/ en el mismo directorio donde está situado hola.c Copiamos el archivo plantilla hola.po a dicho directorio Lo editamos, poniendo la traducción correcta:
#: hola.c:15 msgid "Hello World\n" msgstr "Hola Mundo\n"
Y finalmente generamos el archivo binario de localización dependiente de la máquina:
$ msgfmt hola.po -o hola.mo
