Gettext izar en "Bash scripting"

From Proxecto Trasno

Gettext_izar un "script en bash"

Este COMO en castellano

Ficheiro orixinal
#!/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
Ficheiro "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 á edición:

NOTA IMPORTANTE: o script deberá levar a extensión .sh no seu nome para que poida ser recoñecido por gettext.

Ao principio do ficheiro engadimos as instrucións que van definir o uso de "gettext"

Esta primeira liña define o nome do ficheiro “.mo” a buscar

export TEXTDOMAIN="script"

Esta segunda liña define onde buscalo

export TEXTDOMAINDIR="./locale"

Respecto da localización do ficheiro ".mo" temos dúas opcións.

Unha que segue as rutas predeterminadas "/usr/share/locale/código_idioma/LC_MESSAGES/script.mo", nese caso podemos omitir a liña export TEXTDOMAINDIR="./locale" ou indicar a ruta predeterminada como:

 export TEXTDOMAINDIR="/usr/share/locale"

E a outra que consiste en manter "solidarios" todos os ficheiros (neste caso recomendo que se faga nun cartafol) segundo a árbore 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

Seguindo este esquema é como imos ver as ordes de creación e compilación. Este esquema necesita que se defina a liña:

export TEXTDOMAINDIR="./locale"

Formato das cadeas de texto:

As ordes con cadea de texto básicas como

echo "voume á miña casa"

ou

printf "voume á miña casa"

simplemente substitúese a cadea de texto

"voume á miña casa"

por

$(gettext "voume á miña casa")

Quedandonos así

echo $(gettext "voume á miña casa")
printf $(gettext "voume á miña casa")


Comiñas ou delimitadores

Neste script de exemplo veredes que hai dúas formas de tratar as comiñas como delimitadores

$(gettext "MAC Change")
"$(gettext "Change mode")"

Este uso de delimitadores está definido por Xdialog, non por gettext, En radiolist sobre Xdialog é necesario "delimitar" o campo.

Ao final do ficheiro volve ser necesario o seu uso

"$(gettext "MAC ") $disp $(gettext " changed ")"

Neste caso para indicarlle a Xdialog que os tres compoñentes

$(gettext "MAC ")
$disp
$(gettext " changed ")

Configuran unha mesma liña de mensaxe

Se traballamos cun script moi complexo con Xdialog (e supoño que con Zenity e similares) podemos optar por utilizar os delimitadores exteriores de comiñas en todas as frases xa que funciona correctamente.


Usar "comiñas" como parte do texto

Nos idiomas romances ou latinos, o correcto é utilizar as comiñas latinas « » tambien chamadas comiñas españolas ou comiñas francesas, pero se optamos por usar a dobre comiña inglesa " " no interior dun texto, deberemos «escapalas» para que non funcionen como delimitadores, antepoñendolles a \ (barra invertida) debendo quedar así \"

"$(gettext "MAC ") \"$disp\" $(gettext " changed ")"

Que na saída daranos isto:

MAC "eth0" cambiada

NOTA: as comiñas latinas, no teclado "es" témolas en AltGr+Z → « e en AltGr+X → »

Isto pódese complicar

cando o texto non é constante. Por exemplo o seguinte NON é correcto:

 boto $(gettext "olá $NOME")

$NOME avalíase antes de executar gettext, co que "ola $NOME" é un identificador diferente cada vez. No seu lugar pódese utilizar:

 printf $(gettext "olá ") $NOME

Construír os ficheiros de tradución

Se non o fixemos antes é o momento de crear os cartafois

mkdir -p locale/es/LC_MESSAGES
mkdir -p locale/gl/LC_MESSAGES

etc..


Xerar a plantilla ou ficheiro .pot

xgettext script.sh -o locale/script.pot --from-code=utf-8

Xeramos o ficheiro de tradución .po

msginit -o locale/es.po -i locale/script.pot

Creamos/compilamos o binario de tradución .mo

Despois de realizar as traducións sobre o ficheiro ".po", é o momento de obter un ficheiro binario que o script poida interpretar.

msgfmt -o locale/es/LC_MESSAGES/script.mo locale/es.po

ou

msgfmt -o locale/gl/LC_MESSAGES/script.mo locale/gl.po

Se para a tradución utilizamos algún aplicativo como "Poedit", "Gtranslator", "Kbabel", "lokalize", etc... xerarános un ficheiro idioma.mo (es.mo, gl.mo, ...) en ./locale, deberemos movelo a locale/es/LC_MESSAGES/ e renomealo conforme a «TEXTDOMAIN="script"»

mv locale/es.mo locale/es/LC_MESSAGES/script.mo

ou

mv locale/gl.mo locale/gl/LC_MESSAGES/script.mo

etc...

se decidimos utilizar as traducións desde a ruta predeterminada deberemos movelo a /usr/share/locale/es/LC_MESSAGES/

mv locale/es.mo /usr/share/locale/es/LC_MESSAGES/script.mo

ou

mv locale/gl.mo /usr/share/locale/gl/LC_MESSAGES/script.mo

etc...