Como producir programas internacionalizados

domingo, 20 de julio de 1997

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:
#include 
1.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 -lintl
y eso es todo… En adelante el programa tomará la variable de entorno LANG para conocer el idioma que debe utilizar. Buscará en el directorio /$LANG/LC_MESSAGES un archivo con el nombre .mo. Si existe, utilizará los mensajes traducidos que contenga, en caso contrario prevalecerán los originales. NOTA: Para mayor portabilidad, se recomienda que la internacionalizaci�n solo constituya una opción dentro del Makefile. Todavía hay muchos sistemas que no han adoptado el estándar NLS. 2 Creación de los mensajes para cada idioma Para crear los archivos .mo se utiliza el paquete GetText, del que solo vamos a describir las dos más importantes: xgettext y msgfmt. 2.1 xgettext Es el programa que extrae las cadenas de los fuentes en C.
$ 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.c
rado, 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 -lintl
Y 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!