Gettext izar en "Bash scripting"
Contenido
Gettext_izar un “script en bash"
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... xeraranos 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...