Traduction¶
Le jeu Squirrel Battle est entièrement traduit en anglais, en français et en allement. La langue se choisit dans les paramètres.
Utitisation¶
Les traductions sont gérées grâce au module natif gettext
. Le module
squirrelbattle.translations
s’occupe d’installer les traductions, et de
donner les chaînes traduites.
Pour choisir la langue, il faut appeler Translator.setlocale(language: str)
,
où language
correspond au code à 2 lettres de la langue.
Enfin, le module expose une fonction gettext(str) -> str
qui permet de
traduire les chaînes.
Il est courant et recommandé d’importer cette fonction sous l’alias _
,
afin de limiter la verbositer et de permettre de rendre facilement une chaîne
traduisible.
from squirrelbattle.translations import gettext as _, Translator
Translator.setlocale("fr")
print(_("I am a translatable string"))
print("I am not translatable")
Si les traductions sont bien faites (voir ci-dessous), cela donnera :
Je suis une chaîne traduisible
I am not translatable
À noter que si la chaîne n’est pas traduite, alors par défaut on renvoie la chaîne elle-même.
Extraction des chaînes à traduire¶
L’appel à gettext
ne fait pas que traduire les chaînes : il est possible
également d’extraire toutes les chaînes à traduire.
Il est nécessaire d’installer le paquet Linux gettext
pour cela.
L’utilitaire xgettext
s’occupe de cette extraction. Il s’utilise de la façon
suivante :
xgettext --from-code utf-8 -o output_file.po source_1.py ... source_n.py
Afin de ne pas avoir à sélectionner manuellement chaque fichier, il est possible
d’appeler directement python3 main.py --makemessages
. Cela a pour effet
d’exécuter pour chaque langue <LANG>
:
find squirrelbattle -iname '*.py' | xargs xgettext --from-code utf-8
--add-comments
--package-name=squirrelbattle
--package-version=23.14
"--copyright-holder=ÿnérant, eichhornchen, nicomarg, charlse"
--msgid-bugs-address=squirrel-battle@crans.org
-o squirrelbattle/locale/<LANG>/LC_MESSAGES/squirrelbattle.po
Les fichiers de traductions se trouvent alors dans
squirrelbattle/locale/<LANG>/LC_MESSAGES/squirrelbattle.po
.
Traduire les chaînes¶
Après extraction des chaînes, les chaînes à traduire se trouvent dans
squirrelbattle/locale/<LANG>/LC_MESSAGES/squirrelbattle.po
, comme indiqué
ci-dessus.
Ce fichier peut-être édité avec un utilitaire tel que poedit
, sur
l’interface Web sur https://translate.ynerant.fr/squirrel-battle/squirrel-battle,
mais surtout manuellement avec un éditeur de texte.
Dans ce fichier, on obtient pour chaque chaîne à traduire un paragraphe de la forme :
#: main.py:4
msgid "I am a translatable string"
msgstr "Je suis une chaîne traduisible"
Il sufift de remplir les champs msgstr
.
Compilation des chaînes¶
Pour gagner en efficacité, les chaînes sont compilées dans un fichier avec
l’extension .mo
. Ce sont ces fichiers qui sont lus par le module de traduction.
Pour compiler les traductions, c’est l’utilitaire msgfmt
fourni toujours par
le paquet Linux gettext
que nous utilisons. Il s’utilise assez simplement :
msgfmt po_file.po -o mo_file.mo
À nouveau, il est possible de compiler automatiquement les messages en exécutant
python3 main.py --compilemessages
.
Avertissement
On ne partagera pas dans le dépôt Git les fichiers compilé. En développement, on compilera soi-même les messages, et en production, la construction des paquets se charge de compiler automatiquement les traductions.