Gettext izar en "Bash scripting"
De Gruvi
Tabla de contenidos |
Gettext_izar un script en "bash"
Fichero original
#!/bin/bash
mode=$(Xdialog --title "MAC Change" --no-tags \
--item-help \
--icon $HOME/.icewm/icons/sysinfo.xpm \
--radiolist "Change mode" 0 0 3 \
"-r" "Set fully random MAC." on "1" \
"-e" "Dont change the vendor bytes." off "2" 2>&1)
case $? in
0)
disp=$(Xdialog --title "Device" \
--ok-label "Changer" \
--icon $HOME/.icewm/icons/sysinfo.xpm \
--inputbox "eth1, wlan0, ath0, ra0 etc..." 0 0 2>&1);
sudo macchanger $mode $disp |
Xdialog --title "MAC Change" --no-cancel \
--icon $HOME/.icewm/icons/sysinfo.xpm \
--infobox "MAC $disp changed" 0 0 1500
;;
1)
exit
;;
255)
exit
;;
esac
Fichero "adaptado" a Gettext
#!/bin/bash
export TEXTDOMAIN="minino_cambiamac"
export TEXTDOMAINDIR="./locale"
mode=$(Xdialog --title $(gettext "MAC Change") --no-tags \
--item-help \
--icon $HOME/.icewm/icons/sysinfo.xpm \
--radiolist "$(gettext "Change mode")" 0 0 3 \
"-r" "$(gettext "Set fully random MAC.")" on "1" \
"-e" "$(gettext "Dont change the vendor bytes.")" off "2" 2>&1)
case $? in
0)
disp=$(Xdialog --title $(gettext "Device") \
--ok-label $(gettext "Changer") \
--icon $HOME/.icewm/icons/sysinfo.xpm \
--inputbox "eth1, wlan0, ath0, ra0 etc..." 0 0 2>&1);
sudo macchanger $mode $disp |
Xdialog --title $(gettext "MAC Change") --no-cancel \
--icon $HOME/.icewm/icons/sysinfo.xpm \
--infobox "$(gettext "MAC ") $disp $(gettext " changed ")" 0 0 1500
;;
1)
exit
;;
255)
exit
;;
esac
Comentarios a la edición:
NOTA IMPORTANTE: el script deberá llevar la extensión .sh en su nombre para que pueda ser reconocido por gettext.
Al principio del fichero añadimos las instrucciones que van a definir el uso de "gettext"
Esta primera línea define el nombre del fichero ".mo" a buscar
export TEXTDOMAIN="script"
Esta segunda línea define donde buscarlo
export TEXTDOMAINDIR="./locale"
Respecto a la ubicación del fichero .mo tenemos dos opciones.
Una que sigue las rutas predeterminadas "/usr/share/locale/código_idioma/LC_MESSAGES/script.mo", en cuyo caso podemos omitir la línea export TEXTDOMAINDIR="./locale" o indicar la ruta predeterminada como:
export TEXTDOMAINDIR="/usr/share/locale"
Y la otra que consiste en mantener "solidarios" todos los ficheros (en este caso recomiendo que se haga en una carpeta) según el arbol que se ve a continuación.
./script |----script.sh | |----locale/ | | | |----es/ | | | | | |----LC_MESSAGES/ | | | | | | | |----script.mo | |----gl/ | | | | | |----LC_MESSAGES/ | | | | | | | |----script.mo | | | |----script.pot | |----es.po | |----gl.po
Siguiendo este esquema es como vamos a ver las ordenes de creación y compilación. Este esquema necesita que se defina la línea:
export TEXTDOMAINDIR="./locale"
Formato de las cadenas de texto:
Las ordenes con cadena de texto básicas como
echo "me voy a mi casa"
ó
printf "me voy a mi casa"
simplemente se sustituye la cadena de texto
"me voy a mi casa"
por
$(gettext "me voy a mi casa")
Quedandonos así
echo $(gettext "me voy a mi casa") printf $(gettext "me voy a mi casa")
Comillas ó delimitadores
En este script de ejemplo vereis que hay dos formas de tratar las comillas como delimitadores
$(gettext "MAC Change") "$(gettext "Change mode")"
Este uso de delimitadores está definido por Xdialog, no por gettext, En radiolist sobre Xdialog es necesario "delimitar" el campo.
Al final del fichero vuelve a ser necesario su uso
"$(gettext "MAC ") $disp $(gettext " changed ")"
En este caso para indicarle a Xdialog que los tres componentes
$(gettext "MAC ") $disp $(gettext " changed ")
Configuran una misma línea de mensaje
Si trabajamos con un script muy complejo con Xdialog (y supongo que con Zenity y similares) podemos optar por utilizar los delimitadores exteriores de comillas en todas las frases ya que funciona correctamente.
Usar "comillas" como parte del texto
En los idiomas romances ó latinos, lo correcto es utilizar las comillas latinas « » tambien llamadas comillas españolas o comillas francesas, pero si optamos por usar la doble comilla inglesa " " en el interior de un texto, deberemos «escaparlas» para que no funcionen como delimitadores, anteponiendoles la \ (barra invertida) debiendo quedar así \"
"$(gettext "MAC ") \"$disp\" $(gettext " changed ")"
Que en la salida nos dará esto:
MAC "eth0" cambiada
NOTA: las comillas latinas, en el teclado "es" las tenemos en AltGr+Z → « y en AltGr+X → »
Esto se puede complicar
cuando el texto no es constante. Por ejemplo lo siguiente 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 ") $NOMBRE
Construir los ficheros de traducción
Si no lo hicimos antes es el momento de crear las carpetas
mkdir -p locale/es/LC_MESSAGES mkdir -p locale/gl/LC_MESSAGES etc..
Generar la plantilla o fichero .pot
xgettext script.sh -o locale/script.pot --from-code=utf-8
Generamos el fichero de traducción .po
msginit -o locale/es.po -i locale/script.pot
Creamos/compilamos el binario de traducción .mo
Despues de realizar las traducciones sobre el fichero .po (pofile), es el momento de obtener un fichero binario que el script pueda interpretar.
msgfmt -o locale/es/LC_MESSAGES/script.mo locale/es.po
ó
msgfmt -o locale/gl/LC_MESSAGES/script.mo locale/gl.po
Si para la traducción utilizamos alguna aplicación como "Poedit", "Gtranslator", "Kbabel", "lokalize", etc... nos generará un fichero idioma.mo (es.mo, gl.mo, ...) en ./locale, deberemos moverlo a locale/es/LC_MESSAGES/ y renombrarlo conforme a «TEXTDOMAIN="script"»
mv locale/es.mo locale/es/LC_MESSAGES/script.mo
ó
mv locale/gl.mo locale/gl/LC_MESSAGES/script.mo
etc...
si decidimos utilizar las traducciones desde la ruta predeterminada deberemos moverlo a /usr/share/locale/es/LC_MESSAGES/
mv locale/es.mo /usr/share/locale/es/LC_MESSAGES/script.mo
ó
mv locale/gl.mo /usr/share/locale/gl/LC_MESSAGES/script.mo
etc...

