Home Log À propos RSS

Traduction de script Shell

Il est aisé d'internationaliser un script shell, le pré-requis étant de disposer d'un système d'exploitation sur lequel est installée la bibliothèque GNU d'internationalisation (i18n) gettext

Modification du script shell original

Nous prendrons ici exemple du script keyboardsetup faisant parti des outils d'administration de Salix, les SalixTools.

Ajout des lignes suivantes après l'introduction habituelle (nom, license,…) mais avant le début du code :

# Gettext internationalization
export TEXTDOMAIN="nom_du_programme"
export TEXTDOMAINDIR="/chemin/vers/la/traduction/compilée"
. gettext.sh

# Version 4.3 - 28/07/2009
#* replaced xorg.conf by fdi policy rule
# Take a look at "Xdialog" and use it instead of "dialog" in case X is running if [[ "$DISPLAY"\&\&"$(which Xdialog 2\>\&1 | grep -v "which: no")" ]]; then

Après modification :

# Version 4.3 - 28/07/2009
#* replaced xorg.conf by fdi policy rule
# Gettext internationalization
export TEXTDOMAIN="keyboardconfig"
export TEXTDOMAINDIR="/usr/share/locale"
. gettext.sh
# Take a look at "Xdialog" and use it instead of "dialog" in case X is runningif [[ "$DISPLAY"\&\&"$(which Xdialog 2\>\&1 | grep -v "which: no")" ]]; then

Mettez les tags suivants autour de la chaîne de caractères qui nécessite d'être traduite :

`eval_gettext 'chaîne_de_caractères_à_traduire'`

Exemple avant modification :

if [ "$xflag" = "yes" ] ; then
answer="$(eval $dialog \--stdout \--title \"Keyboard configuration\" \--default-item \"$currentpathkeymap\" \--cancel-label \"Exit\" \--icon \"keyboardconfig\" \--check \"numlock\" \"on\" \--menu \\"\\n Please select your prefered keyboard map:\" 20 75 11 "$list" )"else

Après Modification :

if [ "$xflag" = "yes" ] ; then
answer="$(eval $dialog \--stdout \--title \"`eval_gettext 'Keyboard configuration'`\" \--default-item \"$currentpathkeymap\" \--cancel-label \"`eval_gettext 'Exit'`\" \--icon \"keyboardconfig\" \--check \"numlock\" \"on\" \--menu \\"\\n `eval_gettext 'Please select your prefered keyboard map:'`\" 20 75 11 "$list" )"else

Processus de traduction

Il est tout d'abors nécessaire d'extraire les différents mots/phrases du script shell qui devront être traduits et de les mettre dans un fichier type qui sera distribué aux traducteurs. Pour réaliser ceci, lancez la commande suivante à partir du répertoire où se situe votre script :

xgettext --from-code=utf-8 -L shell -o nom_du_script_shell.pot nom_du_script_shell

Exemple :

xgettext --from-code=utf-8 -L shell -o keyboardsetup.pot keyboardsetup

Chaque traducteur utilisera le fichier "modèle" pour générer son propre fichier de travail de traduction en lançant la commande suivante à partir du dossier dans lequel se trouve le fichier .pot (notre fichier "modèle").

Nous assumerons que la locale de l'environnement de travail est identique à la locale à laquelle vous souhaitez aboutir (sinon il peut être nécessaire de lire la page man de msginit ;) ) :

msginit -i nom_du_script_shell.pot -o nom_du_script_shell-nom_de_la_locale.po

Exemple :

msginit -i keyboardsetup.pot -o keyboardsetup-fr.po

Traduction en utilisant PoEdit

La façon la plus simple de traduire un logiciel "gettext" est d'utiliser le logiciel PoEdit. S'il y a déjà un fichier .po pour votre langage et que vous ne souhaitez que le mettre à jour, vous pouvez ouvrir le fichier .po directement avec poedit. Si le fichier .po pour votre langue n'existe pas encore, vous pouvez en créer un facilement avec poedit. Sélectionnez simplement Nouveau catalogue depuis un fichier .pot depuis le menu fichier, ajoutez vos détails et commencez à traduire.

Rappelez vous de sauvegarder le fichier .po selon ce schéma :

nom_du_script_shell-nom_de_la_locale.po

Exemple :

keyboardsetup-de.po (pour l'allemand)

Traduction sans PoEdit

S'il n'y a pas de fichier .po pour votre langue, vous pouvez en créer un à partir du fichier .pot avec cette commande :

msginit -i nom_du_script_shell.pot -o nom_du_script_shell-nom_de_la_locale.po

Exemple :

msginit -i keyboardsetup.pot -o keyboardsetup-fr.po

Lorsque vous créez un fichier .po, ou s'il y en a déjà un, vous pouvez commencer l'édition directement. Le fichier est très bien documenté et chaque traducteur pourra traduire les différentes chaînes de caractères se trouvant dans le fichier .po adéquat en utilisant uniquement son éditeur de texte favori.

Exemple avant :

#keyboardsetup:93 keyboardsetup:103#, sh-format
msgid "Keyboard configuration"
msgstr ""

Après :

#: keyboardsetup:93 keyboardsetup:103#, sh-format
msgid "Keyboard configuration"
msgstr "Configuration du clavier"

Testez vos traductions

Si vous souhaitez tester votre traduction, vous devez créer un fichier .mo à partir du fichier .po, comme ceci :

msgfmt nom_du_script_shell-nom_de_la_locale.po -o nom_du_script_shell.mo

Exemple :

msgfmt keyboardsetup-fr.po -o keyboardsetup.mo

Le fichier .mo doit être identique à celui que vous traduisez. Vous pouvez ensuite placer le fichier .mo que vous avez construit dans le répertoire du système dédié aux locales à savoir _/usr/share/locale/nomdelalocale/LC
MESSAGES/

Exemple : usr/share/locale/fr/LCMESSAGES

Envoyer vos traductions

Vous pouvez envoyer vos traductions sur la liste de diffusion du projet en question (salix-main chez SourceForge pour Salix OS) ou, directement au dévelopeur dont le nom et l'adresse email figurent sur le fichier source. Elles pourront ainsi être incluses dans la version future du logiciel/script.

Extension de la traduction du script shell

Lorsque le mainteneur du script shell reçoit un fichier .po complet de la part d'un traducteur, il doit d'abord le compiler en utilisant la commande qui suit à l'intérieur du dossier dans lequel le fichier traduit.po se trouve :

msgfmt nom_du_script_shell-nom_de_la_locale.po -o nom_du_script_shell.mo

Exemple :

msgfmt keyboardsetup-fr.po -o keyboardsetup.mo

Ensuite il place le fichier .mo créé dans le dossier approprié des locales usr /share/locale/nomdelalocale/LCMESSAGES

Exemple : usr/share/locale/fr/LCMESSAGES

Et voilà, c'est tout !

Maintenance

Maintenance du script shell et traductions futures. Si par la suite, le script est modifié, son développeur créera un nouveau fichier .pot qu'il pourra renvoyer aux traducteurs. Chaque traducteur devra lancer les commandes suivantes dans le but de créer un nouveau fichier .po pour leur langage qui incluera leurs traductions précédentes ainsi que les nouvelles chaînes de caractères à traduire. Les deux fichiers .pot et .po doivent se trouver dans le même dossier lorsque cette commande sera lancée :

msgmerge -U nom_du_script_shell-nom_de_la_locale.po nom_du_script_shell.pot

Exemple :

msgmerge -U keyboardsetup-fr.po keyboardsetup.pot

Et ensuite complétez les traductions manquantes. Voilà, ce genre de contributions, bien que semblant un peu anodines, sont en fait très importantes pour les équipes de développement.

(Source : Internationalize shell scripts)

Discussion via la liste de diffusion (Mailing-List)