Traducción de proyectos con GNU gettext en 15 minutos



Documentos relacionados
Cómo instalar fácilmente tu WordPress tras contratar un hosting en Hostalia

AGREGAR UN EQUIPO A UNA RED Y COMPARTIR ARCHIVOS CON WINDOWS 7

TUTORIAL (TRANSLATE.CLASS)

Programa diseñado y creado por Art-Tronic Promotora Audiovisual, S.L.

Toda base de datos relacional se basa en dos objetos

MANUAL DE AYUDA MODULO TALLAS Y COLORES

MANAUAL DE MANTENIMIENTO PARA LA PÁGINA WEB DE PROYECTO ADL GESTOR DE CONTENIDOS

Tutorial: Primeros Pasos con Subversion

Programa de Fabricación para Android

TUTORIAL ENVIO SMS MASIVOS. 1. Segmentación de la base de datos de clientes


Conceptos Generales en Joomla

MANUAL DE AYUDA TAREA PROGRAMADA COPIAS DE SEGURIDAD

Proceso de cifrado. La fortaleza de los algoritmos es que son públicos, es decir, se conocen todas las transformaciones que se aplican al documento

Notas para la instalación de un lector de tarjetas inteligentes.

COMO CREAR UNA PÁGINA WEB 2-INTRODUCCIÓN A DREAWEAVER

Tutorial: Cómo realizar tu primer programa en C++ En el Sistema Operativo Windows

Entre los más conocidos editores con interfaz de desarrollo tenemos:

CATÁLOGO CATÁLOGO CATÁLOGO CATÁLOGO CATÁLOGO

Gestión de Subtotales en Documentos de Venta WhitePaper Febrero de 2007

Curso Internet Básico - Aularagon

Tenemos que instalar los programas de los usuarios también (los anteriormente mencionados) y los siguientes que vamos a nombrar.

- A continuación, se nos abrirá la siguiente ventana pidiendo contraseña, que el cliente haya especificado al instalar Wingest 7

Manual de uso. Manual de uso - citanet 1

Implantar Microsoft Software Updates Service (SUS)

Objetivos de la práctica: - Practicar uso de ficheros: abrir, cerrar y tratamiento de información contenida en el fichero.

CASO PRÁCTICO. CASOS PRÁCTICOS Internet (CP15 y CP16)

MÓDULO 3 HERRAMIENTAS EN LA NUBE: ANFIX

MANUAL COPIAS DE SEGURIDAD

PUESTA EN MARCHA PROGRAMA GESTION DE OPTICAS. Junio

Instalación de ActivePerl en MS Windows

Internet Information Server

El control de la tesorería consiste en gestionar desde la aplicación los cobros y pagos generados a partir de las facturas de venta y de compra.

ESCUELA SUPERIOR DE INFORMATICA Prácticas de Estadística UNA SESIÓN EN SPSS

Tutorial de Introducción a la Informática Tema 0 Windows. Windows. 1. Objetivos

Instalar protocolo, cliente o servicio nuevo. Seleccionar ubicación de red. Práctica - Compartir y conectar una carpeta

Manual de usuario de Parda Programa de Almacenamiento y Recuperación de Datos Automático

Introducción a la plataforma Moodle Aníbal de la Torre Plataforma Moodle. Accediendo a los contenidos

**NOTA** las partes tachadas todavía no están escritas, se ira actualizando poco a poco el documento

Guía nuevo panel de clientes Hostalia

Crear la base de datos antes de la instalación de Wordpress.

Manual hosting acens

Edición de Ofertas Excel Manual de Usuario

El Entorno Integrado de Desarrollo Dev-C++ (Ayuda básica para las primeras sesiones de prácticas)

MANUAL PARA GESTIÓN DE INCIDENCIAS INFORMÁTICAS

GIT Dinahosting 3. Hola!

Iptables, herramienta para controlar el tráfico de un servidor

Mejoras introducidas MARKETING GIO

Ajustes del Curso en egela (Moodle 2.5)

MANUAL CAMBIO DE CLAVE WIFI

Escritorio remoto y VPN. Cómo conectarse desde Windows 7

Transacciones y bloqueos en SQL-Server

Plataforma e-ducativa Aragonesa. Manual de Administración. Bitácora

Paso 1 - Servidor de correo en Ubuntu: Instalar Apache 2

CONFEDERACIÓN DE EMPRESARIOS DE MÁLAGA

Instituto Tecnológico de Las América. Materia Sistemas operativos III. Temas. Facilitador José Doñe. Sustentante Robín Bienvenido Disla Ramirez

CITRIX Citrix Application Streaming

Impress : Programa de presentaciones de OpenOffice.

Manual de instalación Actualizador masivo de Stocks y Precios

Hot Potatoes, aplicaciones educativas

Trazabilidad ERP Microsa Gestión de Lotes

Presentaciones. Con el estudio de esta Unidad pretendemos alcanzar los siguientes objetivos:

NORMA 34.14(SEPA) 05/11/2013

INFORMACIÓN DE NAVEGADORES

Manual de Instalación Declaración y Liquidación Modelos

Servicio Webmail. La fibra no tiene competencia

Año: 2008 Página 1 de 18

GENERACIÓN DE TRANSFERENCIAS

Práctica 00: Compilador

EL PROGRAMA DE PRESENTACIONES IMPRESS (I)

Gestor de contenidos de la plataforma web

Manual para la utilización de PrestaShop

MANUAL DE USUARIO APLICACIÓN SYSACTIVOS

TEMA 4: EMPEZANDO A NAVEGAR ESCUELA UNIVERSITARIA DE INFORMÁTICA. Raúl Martín Martín

Manual de configuración de Thunderbird ÍNDICE

Guía rápida del usuario. Dolibarr.es ERP/CRM versión1.0

Manual uso cuentas WebMail con Thunderbird

Oficina Online. Manual del administrador

Ejercicios - Persistencia en Android: ficheros y SQLite

Plantillas Office. Manual de usuario Versión 1.1

Cómo capturar páginas web con el programa GNU Wget

Internet aula abierta

UNIVERSIDAD DE MEDELLÍN NUEVO PORTAL WEB MANUAL DE USUARIO GESTOR DE CONTENIDOS

Crear una presentación

PREPARANDO EL ENTORNO DE DESARROLLO PARA PROGRAMAR EN PHP. DESCARGAR E INSTALAR NOTEPAD++ (CU00808B)

Práctica del paso de generación de Leads

Paso de Borland Turbo C (bajo DOS) a Anjuta (Linux) 1.

Cómo instalar el software de CRM Personas en un alojamiento web remoto

WINDOWS : TERMINAL SERVER

Una vez que tengamos el padrón de un determinado tributo con todos sus datos actualizados, podemos generar los recibos de ese padrón.

Manual de software. Dynamic Cloud. 10/2014 MS-Dynamic_Cloud v1.2

ÍTEMS DEL MENÚ CREACIÓN Y GESTIÓN (Última revisión: lunes, 9 de marzo de 2009)

Configuración Y Diseño Del Correo Electrónico Y Web Personal De IESA

Guía para el tratamiento en Allegro de recibos para centros no pertenecientes a la Generalitat Valenciana.

Se ha confeccionado una aplicación sencilla para poder probar el interfaz de gestión explotación de MEGA, Modelo Estandarizado de Gestión de Agua.

Creando una webquests

5. Composer: Publicar sus páginas en la web

Instalación de Fedora Core 18 junto a Windows 7.

Transcripción:

Traducción de proyectos con GNU gettext en 15 minutos José Tomás Tocino García Hackathon UCA - Diciembre 2010 Este documento tiene licencia «Reconocimiento-CompartirIgual 3.0 España» de Creative Commons http://creativecommons.org/licenses/by-sa/3.0/es Índice 1. Introducción 1 1.1. Internacionalización vs localización......................... 2 1.2. El paquete de herramientas de GNU gettext.................... 2 2. Pasos en el proceso de traducción 2 2.1. Adaptación del código fuente............................. 2 2.2. Generando los ficheros de traducción........................ 3 2.2.1. Creando la plantilla.pot............................ 4 2.2.2. Creando los ficheros de traducción.po.................... 5 2.2.3. Creando los binarios.mo............................ 5 2.3. Compilación y ejecución................................ 6 2.4. Mantenimiento..................................... 6 3. Goodies finales 7 3.1. PO-mode en Emacs................................... 7 3.2. Referencia........................................ 7 1. Introducción GNU gettext es un conjunto de herramientas libres de internacionalización que permite traducir nuestros proyectos de una manera sencilla. Es el sistema de i18n 1 más utilizado, y lo podéis encontrar en una gran cantidad de proyectos. Las ventajas de usar un sistema como gettext en lugar del típico menú de elección de idiomas dentro de la aplicación son muchas. Por ejemplo, con gettext el ajuste del idioma es transparente al usuario. Además, ofrece todas las ventajas de usar un sistema establecido y prácticamente estándar. 1 i18n es una alternativa a escribir internacionalización, el 18 simboliza los 18 caracteres entre la i inicial y la n final 1

1.1. Internacionalización vs localización La internacionalización de un proyecto consiste en prepararlo de forma que sea capaz de trabajar y presentarse en una multitud de idiomas. Por otro lado, la localización trata de coger un programa internacionalizado y darle la suficiente información para que se adapte al idioma y configuración del usuario actual. 1.2. El paquete de herramientas de GNU gettext GNU gettext está compuesto de un conjunto de elementos que forman un framework de trabajo común. En particular, esto incluye: Una serie de directivas y convenciones a la hora de escribir un programa. Un esquema estándar de organización de ficheros y directorios para guardar los ficheros relacionados con la traducción ( Os suena LC_MESSAGES?) Una biblioteca que provee funciones relacionadas con las cadenas traducidas. Algunas utilidades para la creación y edición de los ficheros con las cadenas de traducción. Un modo para Emacs :) 2. Pasos en el proceso de traducción A la hora de adaptar un proyecto para internacionalizarlo hay que seguir una serie de pasos bastante mecánicos que se repiten cada vez que añadamos o modifiquemos las cadenas de nuestro proyecto. 2.1. Adaptación del código fuente Primero, necesitamos adaptar el código de nuestro programa, marcando de alguna forma las cadenas que queremos que queden traducidas. Podría pensarse que este paso podría ser automático, pero hay cadenas que a buen seguro no queremos que sean traducidas, como por ejemplo parámetros de funciones o cosas así. Para ello, añadiremos las siguientes líneas al inicio de nuestro fichero fuente: 1 #include <libintl.h> 2 #include <locale.h> 3 #define _(x) gettext(x) La biblioteca libintl será la encargada de la internacionalización de nuestro proyecto, siendo de especial interés su función char * gettext (const char *), a la que le pasaremos las cadenas originales y nos devolverá la cadena traducida dependiendo del locale del sistema. Para hacer menos evidente su uso, utilizamos la macro definida arriba. Nota: Para ahorrarnos trabajo y problemas, el idioma por defecto será el inglés, ya que los ficheros de traducción iniciales se generan en inglés y no he encontrado ninguna forma de cambiarlo. 2

Lo siguiente será, lógicamente, cambiar todas las cadenas que queramos traducir en nuestro proyecto, de forma que en realidad sean siempre llamadas a la función gettext, o preferiblemente a su macro _(). 1 string mensaje = "Hello world"; Pasará a ser: 1 string mensaje = _("Hello world"); Algo a tener en cuenta es que es necesario elegir un nombre para el dominio de la internacionalización, que por regla general coincidirá con el proyecto. En nuestro ejemplo, este nombre será jakatoner (del inglés hackathon y el sufijo ibérico -er). En las primeras líneas de nuestro proyecto añadiremos las siguientes instrucciones de inicialización: 1 bind_textdomain_codeset ("jakatoner", "UTF-8"); 2 setlocale(lc_all, ""); 3 bindtextdomain("jakatoner", "lang" ); 4 textdomain("jakatoner"); Eso le indicará a la biblioteca de i18n cuál es el dominio de la traducción, así como el directorio de las traducciones (lang), y pondrá el locale por defecto. Así pues, un posible fichero main.cpp de ejemplo podría ser: 1 #include <iostream> 2 #include <libintl.h> 3 #include <locale.h> 4 5 #define _(x) gettext(x) 6 7 using namespace std; 8 9 int main(int argc, char *argv[]) 10 { 11 bind_textdomain_codeset ("jakatoner", "UTF-8"); 12 setlocale(lc_all, ""); 13 bindtextdomain("jakatoner", "lang" ); 14 textdomain("jakatoner"); 15 16 cout << _("Hello world") << endl; 17 return 0; 18 } 2.2. Generando los ficheros de traducción Una vez que tengamos todas las cadenas a traducir apropiadamente adaptadas como se ha comentado antes, pasaremos a crear los ficheros con los que realizaremos las traducciones. Hay varios tipos de estos ficheros: 3

.POT (Portable Object Template) Es el primer fichero que se genera, y contiene todas las cadenas extraídas del código fuente, que servirá luego como plantilla para los ficheros.po..po (Portable Object) Son los ficheros principales de traducción, los que se editan con las cadenas traducidas. Hay uno por cada locale que queramos incluir..mo (Machine Object) Son la versión binaria de los ficheros.po, los que nuestra aplicación usará para leer las cadenas traducidas. La forma de organizar los diferentes ficheros está bastante estandarizada, de forma que lo más recomendado es seguirla de no hacerlo podemos tener problemas a la hora de que el programa encuentre los ficheros de traducción. En la raíz de nuestro proyecto tendremos una carpeta po que albergará el fichero de plantilla.pot, en nuestro caso jakatoner.pot, así como los ficheros.po de cada locale: en.po, es.po, etc. Además, también en la raíz tendremos otra carpeta llamada lang. Dentro de ella habrá una carpeta por cada fichero.po en la carpeta antes mencionada, y dentro de cada una de ellas, una carpeta LC_MESSAGES, que albergará el fichero.mo correspondiente, todos con el nombre del dominio, en nuestro caso jakatoner.mo La estructura de directorios que obtendremos será algo así: lang -- en -- LC_MESSAGES -- jakatoner.mo -- es -- LC_MESSAGES -- jakatoner.mo po -- en.po -- es.po -- jakatoner.pot 2.2.1. Creando la plantilla.pot Así pues, el primer paso será generar el fichero.pot. Para ello utilizaremos la utilidad xgettext, que tiene una pechá de opciones. Así pues, creamos los directorios antes comentados y usamos la siguiente expresión: 1 xgettext --package-name jakatoner --package-version 0.1 \ 2 --default-domain jakatoner --output po/jakatoner.pot --from-code=utf-8 \ 3 --copyright-holder="tu nombre" --msgid-bugs-address="tu@mail.com" \ 4 -s -k_ -C main.cpp La mayoría de las opciones son autoexplicativas, pero es interesante conocer el significado de las que no lo son: 4

-s Salida ordenada, ordena las cadenas en el fichero de plantilla, útil cuando tenemos muchos ficheros fuente y queremos tener las cadenas organizadas. -k_ Indica que también busque cadenas marcadas con _(cadena) además de gettext(cadena). -C Indica que el lenguaje es C++. Con esto tendremos el fichero en po/jakatoner.pot. Es necesario editarlo y cambiar el valor de CHARSET (en la línea Content-Type:...) por UTF-8, xgettext aún no ofrece ninguna opción para autorrellenar este campo. 2.2.2. Creando los ficheros de traducción.po El siguiente paso será el de crear un fichero.po para cada uno de los idiomas a los que queramos traducir nuestro proyecto. Para ello utilizaremos la utilidad msginit de la siguiente manera, suponiendo los idiomas inglés y español: 1 msginit -l es -o po/es.po -i po/jakatoner.pot 2 msginit -l en -o po/en.po -i po/jakatoner.pot Al ejecutar los comandos nos pedirán nuestro email en un mensaje bastante utópico en el que describe un mundo en el que el feedback del usuario realmente existe más allá del Tu programa es una mierda!! Si le echamos un vistazo al fichero po/es.po, aparte de toda la morralla inicial, nos encontraremos con las cadenas de nuestro programa de la siguiente manera: 1 #: main.cpp:15 2 msgid "Hello world" 3 msgstr "" El formato es muy sencillo: la primera línea indica la situación de la cadena en el código fuente, la segunda es la cadena original, y la tercera es la cadena traducida. Para el fichero en español, quedaría: 1 #: main.cpp:15 2 msgid "Hello world" 3 msgstr "Hola mundo" Cabe notar que como el lenguaje original es el inglés, podemos dejar el fichero en.po intacto, ya que por defecto utilizará las cadenas originales. 2.2.3. Creando los binarios.mo Una vez terminado el apartado anterior, nos queda el último paso, que es generar los ficheros binarios con las traducciones. Para ello, utilizaremos la utilidad msgfmt, que convertirá los.po en.mo, de la siguiente manera: 1 mkdir lang/{es,en}/lc_messages 2 msgfmt -c -v -o lang/es/lc_messages/jakatoner.mo po/es.po 3 msgfmt -c -v -o lang/en/lc_messages/jakatoner.mo po/en.po La opción -c indica que se hagan chequeos ante errores, y la opción -v muestra una salida extendida (verbose). Con esto, ya tendremos todos los ficheros necesarios. 5

2.3. Compilación y ejecución Para compilar nuestro proyecto, si utlizamos GCC no será necesario enlazar a ninguna librería especial, puesto que libintl ya viene en la biblioteca estándar. Así pues, good old gcc, here we go: 1 g++ -o jakatoner main.cpp Tras esto, podremos probar nuestro programa: 1 jose@jose-desktop:~$./jakatoner 2 Hola mundo 3 jose@jose-desktop:~$ LANG=en_UK./jakatoner 4 Hello world 2.4. Mantenimiento Supongamos ahora que añadimos una línea más a nuestro código, en la que se utiliza una cadena nueva. Si seguimos el proceso anterior perderemos todas las traducciones que ya teníamos, ya que los ficheros se crearían de cero. Para evitar esto, GNU gettext ofrece una utilidad llamada msgmerge que nos permitirá actualizar los ficheros.po con las nuevas cadenas manteniendo las traducciones ya realizadas. Así pues, supongamos que añadimos esta línea al fichero: 1 cout << _("Bye bye, dear user") << endl; Generamos el fichero de plantilla.pot igual que lo hicimos antes, pero a la hora de generar los ficheros.po utilizaremos lo siguiente: 1 xgettext --package-name jakatoner --package-version 0.1 \ 2 --default-domain jakatoner --output po/jakatoner.pot --from-code=utf-8 \ 3 --copyright-holder="tu nombre" --msgid-bugs-address="tu@mail.com" \ 4 -s -k_ -C main.cpp 5 6 msgmerge -s -U po/es.po po/jakatoner.pot 7 msgmerge -s -U po/en.po po/jakatoner.pot La opción -s genera una salida ordenada, y -U indica que la operación es de actualización (update). Con esto, ya tendremos el fichero.po con las nuevas cadenas añadidas y las cadenas antiguas sin cambios, podremos proceder a añadir las traducciones y generar los ficheros.mo tal y como se ha explicado previamente. 1 msgfmt -c -v -o lang/es/lc_messages/jakatoner.mo po/es.po 2 msgfmt -c -v -o lang/en/lc_messages/jakatoner.mo po/en.po 3 4./jakatoner 5 Hola mundo 6 Nos vemos, querido usuario 7 8 LANG=en_UK./jakatoner 9 Hello world 10 Bye bye, dear user 6

3. Goodies finales 3.1. PO-mode en Emacs Como comenté al principio, existe un modo de Emacs para la edición eficiente de archivos.po. Puede instalarse manualmente de la manera habitual o en sistemas basados en paquetería deb con el siguiente comando: 1 sudo apt-get install gettext-el Una vez hecho esto, al abrir un fichero.po entraremos en el modo PO (podemos forzarlo con M-x po-mode). Hay gran cantidad de comandos para editar los ficheros PO, pero los más útiles son los siguientes: Con n y p iremos al siguiente o anterior mensaje de traducción. Para saltar entre los mensajes traducidos usaremos t y T. Para los no traducidos, u y U. Para editar la traducción, pulsamos Intro, que abrirá un marco con el mensaje a editar. Tras modificarlo, podemos confirmar los cambios con C-c C-c o cancelarlos con C-c C-k Podemos acceder a la ayuda en cualquier momento pulsando h. Una vez acostumbrados, la edición de estos ficheros se hará mucho más liviana y rápida. Existen, de cualquier modo, editores íntegramente dedicados a la edición de ficheros.po. 3.2. Referencia Para ampliar conocimientos sobre GNU gettext, lo mejor es dirigirse a la referencia oficial 2 que, aunque bastante extensa, resulta muy interesante y amena de leer, explicando toda clase de casos especiales de traducción, como aquellos en los que aparecen cadenas de formato relacionadas con sentencias al estilo de printf y otros casos particulares. 2 http://www.gnu.org/software/gettext/manual/gettext.html 7