Hace tiempo Kevin explicaba en uno de sus artículos como traducir script en BASH si usar gettext, gracias a que bash es un sistema interpretado la solución planteada es muy buena pero en lenguajes como C no podemos usar esto ya que al necesitar una compilación es mucho más complicado, no tanto en su programación como la posterior compilación. Por tanto en este artículo voy a explicar como se puede traducir un programa en C usando gettext.
Para empezar necesitamos una librería estandar llamada locale.h y la no estándar libint1.h, como sabéis basta con dos #include para colocarlas. Quedaría así:
Lo siguiente es inicializar los locales y para ello usaremos las siguientes cuatro lineas que estarán en el main de nuestro programa:
Habría que cambiar el nombre por el nombre del archivo binario con el que se conocerá el programa. Luego, la ruta puede ser tanto absoluta como relativa aunque recomendamos que sea absoluta. Es importante recalcar que el funcionamiento de gettext en cuanto a carpetas es este: «/…/idioma/LC_MESSAGES/nombre.mo» siendo «/…/» lo que hay que sustituir por la ruta de la carpeta. Por ejemplo, en cryptojka el fichero se guarda en «/usr/share/cryptojka/i18n» y dentro de esa carpeta tenemos «es/LC_MESSAGES/cryptojka.mo» es por eso que es importante recordarlo cuando pongamos los archivos .mo.
Pero ¿qué son los archivos .mo? son los archivos derivados de los archivos .po que vienen siendo una relación entre el texto original y el texto traducido, pero no nos adelantemos.
Lo siguiente que tenemos que hacer es capturar los textos, para ello usaremos la función gettext. También podemos simplificarlo haciendo un #define _ gettext o cualquier otra cosa en la que ahora _ será el nuevo gettext. Para capturar el texto la sintaxis es la siguiente
Como se puede ver si queremos pasar un parámetro lo ponemos fuera del gettext y funciona de la misma manera. Una vez que tenemos todos nuestros textos con la función gettext vamos a generar el fichero .pot (plantilla) con el que generaremos las traducciones, entramos en la terminal y ejecutamos el siguiente comando:
xgettext *.c --output=cryptojka.pot --keyword=gettext --from-code=UTF-8
Ahora que tenemos la plantilla hay que generar un fichero destinado al lenguaje en concreto. Para eso utilizamos el siguiente comando:
msginit --input=cryptojka.pot --output=es.po --locale=es
De esta manera generamos el fichero .po que traduciremos. Esto podemos hacerlo con un editor cualquiera.
Una vez hecha la traducción tenemos que generar el fichero mo que estará compilado. Para hacer eso ejecutamos un comando muy parecido al enterior.
msgfmt es.po --output-file=es.mo
Así ya tenemos el fichero compilado. Ahora para poder utilizarlo solo hay que ponerlo en la carpeta especificada con anterioridad. Cambiarle el nombre anterior (se hace de esta manera en la compilación para no solaparse) por el nombre de la aplicación, en este caso cryptojka y guardarlo en la ruta correcta. Y así ya tendrás tu programa escrito en C con internacionalización de textos.
Si quieres añadir algo no te olvides de dejar tus comentarios.