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
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
`----
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
`----
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)
`----
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"
`----
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/nom_de_la_locale/LC /MESSAGES//
Exemple : //usr/share/locale/fr/LC_MESSAGES//
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.
salix-main chez SourceForge pour Salix OS
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/nom_de_la_locale/LC_MESSAGES//
Exemple : //usr/share/locale/fr/LC_MESSAGES//
Et voilà, c'est tout !
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])