Importante: Éste tutorial trata solamente de extraer los textos de un programa y no de explicar todo el proceso de compilación, prueba y las opciones que hay para usar con Gettext. Para esto existe la documentación oficial de Gettext.
Para poder internacionalizar tu software, necesitas:
- Linux: Más fácil y la mayoría de las distribuciones ya tiene los programas requeridos para esta tarea. Si todavía no tienes Linux, recomiendo Lubuntu (ya tiene Gettext y GCC y es muy liviano). Para ver una lista de las mejores distribuciones Linux visita nuestro artículo enlazado al final de éste tutorial.
- GCC: Para compilar los programas C, C++, etc…
- Gettext: Para extraer textos a ser traducidos del código fuente del programa.
- Poedit: Para editar las traducciones. Poedit es un programa opcional pero recomendable para una edición más fácil y rápida de las traducciones.
Puedes instalar los programas con el comando en la terminal de Linux:
sudo su
(Debes ingresar la contraseña del administardor) y después:
apt-get install gcc & apt-get install gettext & apt-get install poedit
Vamos a escribir primero un programa “Hello World”:
#include<stdio.h> int main() { printf("Hello Worldn"); return 0; }
Ahora, para internacionalizar el programa con gettext, necesitamos agregar algunas cosas:
#include<libintl.h> #include<locale.h> #include<stdio.h> #define _(String) gettext (String) int main() { setlocale(LC_ALL,""); bindtextdomain("helloworld",""); textdomain("helloworld"); printf(_("Hello Worldn")); return 0; }
Qué cambios se hicieron?
Primero debemos importar la librería de gettext usando #include<locale.h> y #include<stdio.h>.
Después de importar esto, necesitamos definir que los textos en ‘_()’ son lo mismo que llamar directamente la función ‘gettext()’ – es sólo para que sea más corto.
Ahora necesitamos poner este código al principio de la función main():
setlocale(LC_ALL,""); bindtextdomain("helloworld",""); textdomain("helloworld");
Y por ultimo debemos encerrar cada texto que se puede mostrar en la pantalla como:
_(“Texto”)
Esos fueron todos los cambios para internacionalizar el programa. Los textos tipo _(“Texto”) son reemplazados por la librería de gettext con las traducciones. Si una frase no tiene traducción, se usará el texto predeterminado que está dentro de _(“Texto”).
¿Cómo extraer los textos del código fuente?
Ya podemos extraer los textos para ser traducidos (los identificados como ‘_(TEXTO)’) con el siguiente comando:
xgettext -d helloworld -o helloworld.pot -k_ -s helloworld.c
Después de ejecutar el comando anterior, se generará un archivo llamado helloworld.pot el cual puedes copiar y renombrar a helloworld.po para después traducir los textos en helloworld.po. Helloworld.pot se parecerá a:
# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSIONn" "Report-Msgid-Bugs-To: n" "POT-Creation-Date: 2013-11-08 12:00+0530n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONEn" "Last-Translator: FULL NAME <EMAIL@ADDRESS>n" "Language-Team: LANGUAGE <LL@li.org>n" "MIME-Version: 1.0n" "Content-Type: text/plain; charset=CHARSETn" "Content-Transfer-Encoding: 8bitn" #: helloworld.c:13 #, c-format msgid "Hello Worldn" msgstr ""
Ahora puedes traducir el texto dentro de msgid al lenguaje que quieras en msgstr.
Enlaces para más información:
He estado trabajando con esta herramienta de traducción gettext: https://poeditor.com/ y lo que realmente hace un gran trabajo. Soporta un gran número de traductores en el mismo proyecto, trabajando en diferentes idiomas. Hay también un montón de características que facilitan el trabajo. Se lo recomiendo.
Hola Maris y gracias por tu comentario!
Realmente es una excelente herramienta. Yo también la uso para traducir software.
Saludos.