Gettext en scripts
21/09/2006
- Introducción
- Preparar el código
- Preparar la plantilla de traducciones
- Traducir
- Instalar una traducción
- Comprobar que todo funciona
1. Introducción
Gettext es una herramienta que nos permite tener aplicaciones en diversos idiomas. Con pequeñas modificaciones se internazionaliza el programa, y luego distintas personas pueden traducir los textos de la aplicación a su idioma. La aplicación utilizará el idioma especificado en la variable LANGUAGE.
Su funcionamiento (muy por encima) es el siguiente: Los textos que se van a enseñar al usuario se pasan a traves de la función gettext, que es la que se encarga de obtener la traducción correspondiente al idioma de el usuario. Posteriormente se genera una plantilla con todos los textos que haya que traducir, que los traductores utilizan como base para localizar la aplicación al idioma deseado. Las traducciones se realizan en ficheros .po, de texto plano, que luego se compilan para obtener ficheros .mo, múcho más rápidos para consultar. Estos ficheros .mo se colocan en una estructura de directorios establecida para que gettext pueda encontrarlos.
Para el resto del documento se utilizará como ejemplo el script hola_mundo.sh que se muestra más abajo. Se muestra tanto el contenido del script como los ficheros necesarios para generar la localización a euskara y la estructura de ficheros necesaria.
1.1. Estructura de directorios
./ |----holamundo.sh | |----locale/ | | | |----eu/ | | | | | |----LC_MESSAGES/ | | | | | | | |----holamundo.mo | | | |----eu_ES@euro.po | |----holamundo.pot
1.2. holamundo.sh
#!/bin/bashexport TEXTDOMAIN="holamundo" export TEXTDOMAINDIR="./locale" echo $(gettext "hola mundo!")
1.3. locale/holamundo.pot
# HolaMundo package # Copyright (C) 2006 Ales Zabala Alava # This file is distributed under the same license as the HolaMundo package. # Ales Zabala , 2006. # #, fuzzy msgid "" msgstr "Project-Id-Version: 1.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2006-09-13 19:00+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n"#: hola_mundo.sh:5 msgid "hola mundo!" msgstr ""
1.4. locale/eu_ES@euro.po
# Basque translations for HolaMundo package. # Copyright (C) 2006 Ales Zabala Alava # This file is distributed under the same license as the HolaMundo package. # Ales Zabala Alava , 2006. # msgid "" msgstr "" "Project-Id-Version: 1.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2006-09-13 19:00+0200\n" "PO-Revision-Date: 2006-09-13 19:00+0200\n" "Last-Translator: Shagi \n" "Language-Team: Basque \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n"#: hola_mundo.sh:5 msgid "hola mundo!" msgstr "Kaixo jende!"
2. Preparar el código
- Definir el nombre del programa, el archivo en el que van a estar las
traducciones.
export TEXTDOMAIN="holamundo"
- Definir la localizacion de las traducciones, el directorio en el que vamos a
tener todos los ficheros de traducciones. (No es necesario si los ponemos en
/usr/share/locale)
export TEXTDOMAINDIR="./locale"
- Utilizar gettext para obtener las traducciones de las frases.
En vez de:
echo "hola mundo!"
Hay que usar:echo $(gettext "hola mundo!")
Esto se puede complicar, cuando el texto no es constante. Por ejemplo lo siguente NO es correcto:echo $(gettext "hola $NOMBRE")
$NOMBRE se evalúa antes de ejecutar gettext, con lo que "hola $NOMBRE" es un identificador diferente cada vez.En su lugar se puede utilizar:printf $(gettext "hola %s") $NOMBRE
3. Preparar la plantilla de traducciones
- Crear directorio donde van a ir las traducciones:
mkdir locale
- Generar fichero plantilla:
xgettext holamundo.sh -o locale/holamundo.pot --from-code=utf-8 -i
Con -o se especifica el fichero donde generar la plantilla, --from-code la codificación de caracteres del script, y -i genera una plantilla con tabulaciones.
4. Traducir
- Generar el fichero para el idioma a traducir.
msginit -l eu_ES@euro
- Escribir las traducciones. Existen multitud de programas para ayudar en la
traducción: kbabel, poedit, gtranslator,... También se puede traducir con un
editor de textos, simplemente hay que escribir en el campo msgstr la traducción
del campo msgid:
msgid "hola mundo!" msgstr "Kaixo jende!"
- Modificar campos importantes: autor, correo de contacto, idioma, coficacion,
etc.
# Basque translations for holamundo package. # Copyright (C) 2006 Ales Zabala Alava # This file is distributed under the same license as the holamundo package. # Ales Zabala Alava , 2006. # msgid "" msgstr "" "Project-Id-Version: 1.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2006-09-13 19:00+0200\n" "PO-Revision-Date: 2006-09-13 19:00+0200\n" "Last-Translator: Shagi \n" "Language-Team: Basque \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n"
5. Instalar una traducción
- Crear la estructura de directorios necesaria en el directorio especificado
por TEXTDOMAINDIR. Cada idioma tiene que tener un directorio, con un
subdirectorio LC_MESSAGES donde irán las traducciones:
mkdir -p eu/LC_MESSAGES
- Compilar la traducción:
msgfmt -o eu/LC_MESSAGES/holamundo.mo
6. Comprobar que todo funciona
$ export LANGUAGE=eu_ES $ bash hola_mundo.sh Kaixo jende! $ export LANGUAGE=es_ES $ bash hola_mundo.sh hola mundo! $ export LANGUAGE=en_US $ bash hola_mundo.sh hola mundo!
Como puede verse, se puede controlar el idioma a utilizar con la variable LANGUAGE. En el caso de que el idioma elegido no esté traducido, se utiliza el idioma por defecto, en el que se escribió el programa.