Este documento contiene la información básica para crear programas con Soporte de Idioma Local (NLS), utilizando la biblioteca ‘libintl’ y el paquete GetText.
1 Adaptación de los fuentes 1.1 Ficheros de cabecera necesarios El fichero de cabecera propio de la biblioteca:#include1.2 Directorio de localización Se trata de un directorio en el que se almacena la informaci�n para cada idioma. Suele ser /usr/share/locale.
#define DIRLOCALE “/usr/share/locale”1.3 Nombre del paquete El nombre del paquete es elección suya. Sólo advertir que supondría un grave problema la existencia de otro paquete internacionalizado con el mismo nombre. Por ejemplo
#define PAQUETE “miprog”1.4 Abreviatura de la sustitución de cadenas Por motivos prácticos, se debe definir una macro que abrevie la sustitución de cadenas. Por ejemplo
#define _(Cadena) gettext(str)Luego, cada cadena que deba ser traducida se trata de la siguiente forma: En el caso
printf("�Hola, mundo!");se sustituye por
printf(_("�Hola, mundo!"));1.5 Inicialización del entorno Al principio del programa, antes de la primera cadena, y usualmente en ‘main’, se realizan las siguientes llamadas:
bindtextdomain(PAQUETE,DIRLOCALE); textdomain(PAQUETE);1.6 Compilación Finalmente, se compila con la opcion -lintl:
cc -omiprog miprog.c -lintly eso es todo… En adelante el programa tomará la variable de entorno LANG para conocer el idioma que debe utilizar. Buscará en el directorio
$ xgettext [OPCIONES] ARCHIVO-DE-ENTRADA …-a, –extract-all obtiene todas las cadenas -d, –default-domain=NOMBRE usa NOMBRE.po como salida, en lugar de messages.po. -f, –files-from=ARCHIVO obtiene la lista de archivos de entrada desde ARCHIVO. -i, –indent escribe el archivo .po utilizando el estilo de sangr�as (m�s bonito). -j, –join-existing une los mensajes con el archivo existente. -p, –output-dir=DIR los archivos de salida se pondr�n en el directorio DIR -w, –width=NUMERO ajusta la anchura de la p�gina de salida. -x, –exclude-file=ARCHIVO no se extraen las cadenas contenidas en ARCHIVO. 2.2 msgfmt Es el compilador de ficheros de mensajes: obtiene un fichero binario .mo desde uno fuente .po.
$ msgfmt [OPCIONES] ARCHIVO.po-c, –check comprueba las cadenas de texto traducidas. -o, –output-file=ARCHIVO indica que el nombre del archivo de salida ser� ARCHIVO. -v, –verbose muestra las anomal�as del archivo de entrada 3 Ejemplo: El programa bye bye.c:
#include #include #define DIRLOCALE “/usr/share/locale” #define PAQUETE “bye” #define _(Cadena) gettext(Cadena) main() { bindtextdomain(PAQUETE,DIRLOCALE); textdomain(PAQUETE); printf(_("Bye, people!n")); } gettext -ai -dbye bye.crado, aproximadamente, el siguiente fichero: bye.po:
# SOME DESCRIPTIVE TITLE. # Copyright © YEAR Free Software Foundation, Inc. # FIRST AUTHOR , YEAR. # #: bye.c:12 #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION" "POT-Creation-Date: 1997-07-17 21:52+0000" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE" "Last-Translator: FULL NAME " "Language-Team: LANGUAGE " "MIME-Version: 1.0" "Content-Type: text/plain; charset=CHARSET" "Content-Transfer-Encoding: ENCODING" #: bye.c:16 msgid "Bye, people!" msgstr ""e introduzca los TODOS los campos de traducci�n. No se olvide de traducir la cadena. da así:
# Mensajes en Castellano para BYE # Victor M Varela , 1997. # msgid “” msgstr “” "Project-Id-Version: bye 1.00n" "POT-Creation-Date: 1997-07-17 22:15+0000n" "PO-Revision-Date: 1997-07-17 22:20 MET" "Last-Translator: Victor M Varela" "Language-Team: Spanish" "MIME-Version: 1.0" "Content-Type: text/plain; charset=iso-8859-1” "Content-Transfer-Encoding: 8-bit" #: bye.c:16 msgid "Bye, people!" msgstr "¡Adios, gente!"y ejecute: Se habrá creado el fichero “es.mo"… (lo de “es” va por “espa�ol") * Copie el fichero es.mo al directorio /usr/share/locale/es/LC_MESSAGES con el nombre bye.mo. * Ahora compile:
cc -obye bye.c -lintlY ya está, ahora sólo queda hacer un par de pruebas: * Ejecute: LANG=es bye y obtendrá ¡Adios, gente! * Ejecute: LANG=otro-valor bye y resultará ¡Bye, people!