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...