HowDoWeDoTraductions¶
On suit globalement ce qui a été défini dans l'équipe de tradution GNOME; documents utiles :
Notamment :- Mettre des espaces insécables avant les « : ».
- Mettre des « ab » au lieu des "ab" (avec espaces insécables là aussi).
- Mettre des apostrophes typographiques (’) à la place des single quotes (').
Publik, Django & Gettext¶
Django et Gettext¶
Django propose un ensemble d'outils, basés sur gettext, documenté ici : https://docs.djangoproject.com/en/dev/topics/i18n/translation/
S'il est conseillé de parcourir cette documentation, voici deux pièges dans lesquels on peut être tenté de tomber :
Gettext utilise la chaîne passée en paramètre pour identifier la traduction à renvoyer. C'est donc bien le format de la chaîne (et pas la chaîne formatée) qui doit être envoyé a gettext :
- pas ceci :
_('String format %s' % something) - mais ceci :
_('String format %s') % something
Lors de l'utilisation de substitution de variable il faut préférer les arguments nommés aux arguments positionnels (selon la langue de traduction les champs pourraient changer d'ordre, les nommer permet d'éviter des erreurs de traduction).
- pas ceci :
_('%s error for user %s') % (err_type, username) - mais ceci : @_('%(type)s error for user %(username)s') % {'username': username, 'type': err_type}
Pour mettre entre guillemets une valeur, il ne faut pas utiliser %r, qui produira selon les situations des apostrophes ou guillemets pas adaptés.
- pas ceci :
_('blah for user %r') - mais ceci :
_('blah for user "%s"')qui sera traduit en"blah pour l’usger « %s »"
Une fois le patch merge dans main¶
Pour éviter que la personne qui s'occupe de la release n'ait à faire toutes les traductions, la pratique est de pousser un commit de traduction une fois son patch/PR fusionné avec main.
Le fait de pousser un commit de traduction à part permet de ne pas avoir à gérer des conflits sur le catalogue de traduction django.po, conflits qui peuvent se révéler très laborieux à résoudre.
Mettre à jour les traductions¶
Pour mettre à jour le fichier des traductions françaises (en général PROJECT_NAME/locale/fr/LC_MESSAGES/django.po) il faut utiliser la commande makemessages du manage.py du projet concerné.
whatever-manage makemessages --all
Dans un cas concret, de mise à jour des traductions pour chrono (avec les chemins de publik-devinst) :
source ~/envs/publik-env-py3/bin/activate
cd src/chrono/chrono # Attention, il faut se mettre dans le bon dossier et pas à la racine du repo
chrono-manage makemessages --all
git diff # vérifier qu'il n'y a pas eu de problème et que les modifications de django.po sont celles attendues
editor locale/fr/LC_MESSAGES_django.po
Une fois le fichier édité, il convient de relancer une seconde fois le
makemessages --all qui s'occupera de découper les longues traductions en plusieurs lignes.
Éditer un .po avec vim¶
Utiliser ce script https://www.vim.org/scripts/script.php?script_id=695 (de 2005, mais fonctionne encore très bien en 2024).
Il permet de sauter entre les chaînes non traduites en tapant \m, et les chaînes marquées fuzzy en tapant \f.
Édition du catalogue des traductions¶
Différents cas peuvent se présenter. Le premier, le plus simple est quand un nouveau message à traduire a été ajouté. Dans ce cas, le nouveau message sera associé à une chaîne vide, par exemple :
#: agendas/models.py #, python-format msgid "New string to translate for %s" msgstr ""
Il peut arriver que gettext essaye de "deviner" une traduction à partir d'une traduction existante. Dans ce cas la ligne en dessous du path contiendra "
, fuzzy" et une traduction :#: agendas/models.py #, fuzzy, python-format msgid "New string to translate for %s" msgstr "Tentative %s de traduction"
Dans ce cas il faut retirer le "
, fuzzy" (en laissant l'éventuel , python-format) et indiquer la traduction correcte :#: agendas/models.py #, python-format msgid "New string to translate for %s" msgstr "Nouvelle chaîne à traduire pour %s"
Le commit de traduction¶
chrono-manage makemessages --all # pour découper les longues traductions en multi-lignes
git diff # vérifier ce qu'on a fait
git add locale/fr/LC_MESSAGES_django.po
git commit -m "translation update"