Introduite par l'issue #50, sur le modèle de Gcm4 (mêmes 29 langues).
- Langue source : le français. Les chaînes destinées à l'utilisateur
(aide de la CLI, messages de journal
info/warning/error, messages d'exception) sont écrites en français et passent par_()deoxo_hep_bridge.i18n(ngettext()pour les pluriels). - Comportement par défaut inchangé : sans catalogue pour la langue
demandée, ou sans traduction d'une chaîne, le texte français d'origine
est affiché (
gettext.translation(..., fallback=True)). - Choix de la langue : variables standard
LANGUAGE,LC_ALL,LC_MESSAGES,LANG(ex.LANGUAGE=de_DE oxo-hep-bridge --help). - Paramètres nommés : une chaîne avec variables s'écrit
_("Longueur de chunk invalide : {length}").format(length=n)(jamais une f-string, que xgettext ne sait pas extraire), afin que le traducteur puisse déplacer les variables. Les messages de journal gardent les{}positionnels de loguru. - Les messages
debug()ne sont pas traduits (diagnostic développeur). tests/test_i18n.pyéchoue si une chaîne utilisateur littérale n'est pas enveloppée dans_().
| Fichier | Rôle |
|---|---|
lang/LINGUAS |
Seule liste des langues maintenues (une par ligne) |
lang/messages.pot |
Modèle extrait des sources par xgettext |
lang/<langue>.po |
Catalogue d'une langue (édité par les traducteurs) |
src/oxo_hep_bridge/locale/<langue>/LC_MESSAGES/oxo-hep-bridge.mo |
Catalogue compilé, embarqué dans le paquet ([tool.setuptools.package-data]) |
tools/i18n.py |
Outillage : extract, update, compile, check, report |
.github/workflows/i18n.yml |
Vérification en CI, rapport, PR de mise à jour optionnelle |
Aucune liste de langues n'est codée dans le paquet : il charge ce que
contient locale/, et tools/i18n.py lit lang/LINGUAS.
Les outils GNU gettext sont nécessaires (apt-get install gettext).
make i18n-update # extrait les chaînes, fusionne chaque .po, compile les .mo
make i18n-check # échoue si .pot/.po/.mo ne sont pas à jour ou invalides
make i18n-report # taux de traductionAprès avoir ajouté ou modifié une chaîne utilisateur dans le code :
lancer make i18n-update et committer lang/ et
src/oxo_hep_bridge/locale/. Les nouvelles chaînes arrivent avec
msgstr "" dans toutes les langues : aucune traduction automatique,
une chaîne reste en français tant qu'une personne ne l'a pas traduite.
update ne réécrit pas un fichier dont les messages n'ont pas changé
(les dates d'en-tête sont ignorées), donc pas de diff parasite.
make i18n-check (lancé par la CI) signale :
- un
.poinvalide (msgfmt --check: syntaxe, formats incohérents) ; - un
messages.potqui ne correspond plus aux sources (chaîne ajoutée, modifiée ou supprimée) ; - un
.ponon synchronisé avec les sources, ou qui référence un fichier supprimé ; - une langue déclarée dans
LINGUASsans.po, ou un.poabsent deLINGUAS; - un
.moabsent ou périmé par rapport à son.po.
- Ajouter son code (ex.
es_ES) sur une ligne delang/LINGUAS. make i18n-update: créelang/es_ES.po(en-tête etPlural-Formsremplis par msginit, tous lesmsgstrvides) et son.mo.- Traduire les
msgstrdelang/es_ES.po(Poedit, Lokalize ou un éditeur de texte), puis relancermake i18n-update. - Committer
lang/LINGUAS,lang/es_ES.poetsrc/oxo_hep_bridge/locale/es_ES/.
Éditer lang/<langue>.po, remplir les msgstr, conserver les variables
({length}, {}) telles quelles, puis make i18n-update et
make i18n-check. Retirer la marque #, fuzzy d'une entrée après l'avoir
vérifiée.
.github/workflows/i18n.yml tourne sur les push et PR vers dev et
main :
- publie le rapport (langues, messages, traduits, non traduits, fuzzy, catalogues valides) dans le résumé du run ;
- échoue si
tools/i18n.py checksignale un problème.
En déclenchement manuel (workflow_dispatch, case « Ouvrir une PR »), un
second job lance update + compile sur dev et ouvre une PR vers dev
si les catalogues ont changé.