meta données pour cette page
Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
envrac:bash-international [2012/02/24 00:38] ztrulphcs [Téléchargement bonus] |
envrac:bash-international [2022/10/30 06:55] (Version actuelle) ztrulphcs [Il ne peut y en avoir qu'un] |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
====== Script bash internationalisé ====== | ====== Script bash internationalisé ====== | ||
+ | |||
+ | Ou comment traduire un script bash. | ||
+ | ------------------ | ||
Bash possède un mécanisme interne d' | Bash possède un mécanisme interne d' | ||
Ligne 5: | Ligne 8: | ||
En fait, la base est simple; Les chaines entre '' | En fait, la base est simple; Les chaines entre '' | ||
- | | + | <code bash essai-001> |
+ | echo $" | ||
+ | </ | ||
Et si on a fait tout ce qui est nécessaire pour la traduction, on aura : | Et si on a fait tout ce qui est nécessaire pour la traduction, on aura : | ||
Ligne 39: | Ligne 44: | ||
- | Notez au passage que bash se donne vraiment beaucoup de mal pour trouver le catalogue de chaines traduites. Si on fait exprès de le taquiner un peu et qu'on regarde avec '' | + | Notez au passage que bash se donne vraiment beaucoup de mal pour trouver le catalogue de chaines traduites. Si on fait exprès de le taquiner un peu et qu'on regarde avec '' |
<code txt> | <code txt> | ||
open(" | open(" | ||
Ligne 74: | Ligne 79: | ||
Demandons à bash de nous donner les chaines à traduire qui sont dans notre script, et plaçons les dans un fichier '' | Demandons à bash de nous donner les chaines à traduire qui sont dans notre script, et plaçons les dans un fichier '' | ||
- | | + | <code bash> |
- | mkdir -p locale/ | + | langue=fr_FR |
- | bash --dump-po-strings multilingue > | + | mkdir -p locale/ |
- | editor multilingue.po | + | bash --dump-po-strings multilingue > |
- | msgfmt -o locale/ | + | editor multilingue.po |
+ | msgfmt -o locale/ | ||
+ | </ | ||
- | traduire le fichier '' | + | traduire le fichier '' |
<code po multilingue.po> | <code po multilingue.po> | ||
Ligne 109: | Ligne 116: | ||
==== Traduire plus sérieusement ==== | ==== Traduire plus sérieusement ==== | ||
- | Ben pourquoi c' | + | Ben pourquoi, c' |
La meilleure méthode est donc | La meilleure méthode est donc | ||
Ligne 122: | Ligne 129: | ||
Voilà les commandes : | Voilà les commandes : | ||
- | | + | <code bash> |
- | mkdir -p locale/ | + | langue=fr_FR |
- | bash --dump-po-strings multilingue | xgettext -L PO -o multilingue.pot - | + | mkdir -p locale/ |
- | msginit -l $langue -i multilingue.pot -o locale/ | + | bash --dump-po-strings multilingue | xgettext -L PO -o multilingue.pot - |
- | poedit locale/ | + | msginit -l $langue -i multilingue.pot -o locale/ |
- | # ca crée le fichier locale/ | + | poedit locale/ |
+ | # ca crée le fichier locale/ | ||
+ | </ | ||
| | ||
Après modification du script il faudra passer les commandes suivantes : | Après modification du script il faudra passer les commandes suivantes : | ||
- | | + | <code bash> |
- | bash --dump-po-strings multilingue | xgettext -L PO -o multilingue.pot - | + | langue=fr_FR |
- | msgmerge -U locale/ | + | bash --dump-po-strings multilingue | xgettext -L PO -o multilingue.pot - |
- | poedit locale/ | + | msgmerge -U locale/ |
+ | poedit locale/ | ||
+ | </ | ||
===== Il ne peut y en avoir qu'un ===== | ===== Il ne peut y en avoir qu'un ===== | ||
Ligne 142: | Ligne 153: | ||
Non, un quoi j'ai dit. | Non, un quoi j'ai dit. | ||
- | Ok, voilà un exemple | + | Ok, voilà un exemple. La chaine contient des variables mais ne cela n'a pas d' |
- | | + | <code bash essai-002> |
- | secondname=' | + | firstname=toto |
- | echo $" | + | secondname=' |
+ | echo $" | ||
+ | </ | ||
- | Maintenant, un peu plus compliqué, on a plein de chaine | + | Maintenant, un peu plus compliqué, on a plein de chaines |
- | | + | <code bash essai-003> |
- | $" | + | status=( |
- | $" | + | $" |
- | $" | + | $" |
- | $"all wrong" | + | $" |
- | ) | + | $"all wrong" |
- | name=toto | + | ) |
- | result=3 | + | name=toto |
- | echo "$name ${status[$result]}" | + | result=3 |
+ | echo "$name ${status[$result]}" | ||
+ | </ | ||
Jusque là, on n'a qu'un niveau de variable dans la chaine à afficher. '' | Jusque là, on n'a qu'un niveau de variable dans la chaine à afficher. '' | ||
Ligne 164: | Ligne 179: | ||
Imaginons maintenant qu'on veuille faire rentrer '' | Imaginons maintenant qu'on veuille faire rentrer '' | ||
- | | + | <code bash essai-004> |
- | $" | + | status=( |
- | $" | + | $" |
- | $" | + | $" |
- | $" | + | $" |
- | ) | + | $" |
- | name=toto | + | ) |
- | result=3 | + | name=toto |
- | echo " | + | result=3 |
+ | echo " | ||
+ | </ | ||
Et là, cata ! Rien ne va plus. '' | Et là, cata ! Rien ne va plus. '' | ||
- | Ben oui quoi. Si on prend pas à pas ce qui se passe lors de l' | + | Ben oui, mais normal |
- | * bash voit une chaine '' | + | * bash voit une chaine '' |
- | * procède à l' | + | * procède à l' |
- | * et s' | + | * et il s' |
'' | '' | ||
Ligne 188: | Ligne 205: | ||
* recherche un équivalent dans le catalogue, | * recherche un équivalent dans le catalogue, | ||
* il trouve des chaines du genre '' | * il trouve des chaines du genre '' | ||
- | * fait le remplacement de variable '' | + | * remplace les chaines d' |
- | * range ce résultat dans la tableau et passe à la suite | + | * puis, au moment où il exécute la commande, c'est à dire l' |
+ | * range ce résultat dans la tableau et passe à la suite. | ||
Si on essaie frénétiquement ceci : | Si on essaie frénétiquement ceci : | ||
- | | + | <code bash> |
+ | echo $" | ||
+ | </ | ||
- | on a le même résultat, mais pour plus cher : bash voit une chaine à traduire : '' | + | on a le même résultat, mais pour plus cher : bash voit une chaine à traduire : '' |
Si on essaie alors ceci : | Si on essaie alors ceci : | ||
- | | + | <code bash essai-005> |
- | "$name Perfect", | + | status=( |
- | "$name almost correct", | + | "$name Perfect", |
- | "$name could be better", | + | "$name almost correct", |
- | "$name all wrong" | + | "$name could be better", |
- | ) | + | "$name all wrong" |
- | name=toto | + | ) |
- | result=3 | + | name=toto |
- | echo $" | + | result=3 |
+ | echo $" | ||
+ | </ | ||
C'est pas mieux. Voir l' | C'est pas mieux. Voir l' | ||
- | Il n'y a pas de solution alors ? ben si. Y'a [[http://linuxmanpages.com/man1/printf.1.php|printf]]. Au passage, il se trouve, que '' | + | Il n'y a pas de solution alors ? ben si. Y'a [[https://www.gnu.org/software/bash/ |
- | | + | <code bash essai-006> |
- | $"%s Perfect", | + | #! /bin/bash |
- | $"%s almost correct", | + | |
- | $"%s could be better", | + | TEXTDOMAIN=${0## |
- | $"%s all wrong" | + | TEXTDOMAINDIR=" |
- | ) | + | |
- | name=toto | + | status=( |
- | result=3 | + | |
- | printf " | + | |
- | dialog --msgbox "$( printf " | + | |
- | zenity --info --text=" | + | |
+ | ) | ||
+ | name=toto | ||
+ | result=$(( $RANDOM % 4 )) | ||
+ | printf " | ||
+ | read -p $" | ||
+ | # ou alors, si on fait des boites de dialogue, on peut utiliser ceci : | ||
+ | result=$(( $RANDOM % 4 )) | ||
+ | dialog --msgbox "$( printf " | ||
+ | result=$(( $RANDOM % 4 )) | ||
+ | zenity --info --text=" | ||
+ | </ | ||
Les traducteurs pourront mettre les noms aux endroits où ils le veulent. Sauf qu'ils peuvent éventuellement ne même pas vraiment savoir à quoi correspond le '' | Les traducteurs pourront mettre les noms aux endroits où ils le veulent. Sauf qu'ils peuvent éventuellement ne même pas vraiment savoir à quoi correspond le '' | ||
+ | Notez l' | ||
+ | |||
+ | Voilà le fichier .po pour ceux qui voudraient essayer : | ||
+ | <code po essai-006.po> | ||
+ | #: essai-007:7 | ||
+ | msgid "%s Perfect\\\\n" | ||
+ | msgstr "%s, C'est parfait !\\\\n" | ||
+ | #: essai-006:8 | ||
+ | msgid "%s almost correct\\\\n" | ||
+ | msgstr " | ||
+ | #: essai-006:9 | ||
+ | msgid "%s could be better\\\\n" | ||
+ | msgstr "%s : Peut mieux faire\\\\n" | ||
+ | #: essai-006: | ||
+ | msgid "%s all wrong\\\\n" | ||
+ | msgstr "%s a tout faux !\\\\n" | ||
+ | #: essai-006: | ||
+ | msgid "press the return key" | ||
+ | msgstr " | ||
+ | </ | ||
+ | |||
+ | et voilà aussi les commandes à passer : | ||
+ | <code bash> | ||
+ | langue=fr_FR | ||
+ | mkdir -p locale/ | ||
+ | msgfmt -o locale/ | ||
+ | bash essai-006 | ||
+ | </ | ||
===== Téléchargement bonus ===== | ===== Téléchargement bonus ===== | ||
Ligne 231: | Ligne 293: | ||
{{: | {{: | ||
+ |