Issue #3620840: The same string has a different French in different catalogs, and the last import wins
Implements #3620840. Stacked on !431 (merged) (#3620839), whose one-parser refactor this builds the new question on; merge that first.
The problem, restated
locale keeps one string table for the whole site, so a source string has exactly one translation whatever module shipped it. Twenty-two source strings were translated differently in two or more of this project's catalogs, and that does not mean each got its way: one of them lost at import time, and which one depended on the order the modules happened to be installed. Enabling a submodule could change a word elsewhere in the interface.
Nineteen were drift
Settled on one French: the base module's where it had one, the majority's otherwise.
| String | Kept | Dropped |
|---|---|---|
Tenant |
Tenant | Locataire |
Tenant scope |
Périmètre du tenant | Portée par tenant |
Outcome |
Issue | Résultat |
Operations |
Opérations | Actions |
Remove |
Retirer | Supprimer |
Failed |
En échec | Échoué |
Reject |
Rejeter | Refuser |
Complete task |
Terminer la tâche | Traiter la tâche |
Current step |
Étape en cours | Étape courante |
My requests |
Mes demandes | Mes démarches |
- None - |
- Aucun - | - Aucune - |
Canceled, Completed |
Annulé, Terminé | the plural and feminine forms |
plus Instance (shared with the whole process), Name of the instance ID token, Workflow ID, You have no requests yet. |
the clearer of the two |
Where two catalogs differed only in gender or number, the singular masculine
wins, because nothing else can be right for every subject the same word
describes. The base module's existing contextual Completed under
"Work item status", "Traitée", is untouched: it is the pattern the rest of
these now follow.
Two were the same English doing two jobs
No single French can serve those, so they become two source strings with a context:
Openis a work item's state in the base module, "Ouverte", and the link that opens one in orchestra_ui, "Ouvrir". The link takes['context' => 'Operation'].Startis the start node everywhere, including three shipped workflows that cannot carry a context at all, "Début", and the operation that starts a run in orchestra_ui, "Démarrer". That link takes the same context.Startsis the plural of the start component in the modeler and a delegation's start date in orchestra_delegation, so the component takes['context' => 'Workflow component'].
Three were the English being wrong, not the French
Two views columns and three orchestra_ui labels read Created while their
French read "Créé le" — the English had lost the "on". They now read
Created on, and their French is "Date de création", which says what the
column holds and has no gender to disagree about. The same reasoning retired
the gendered "Terminée"/"Terminé" split on Ended in favour of "Fin". And
the modeler called the start component "Démarrage" while every workflow calls
that node "Début".
The check gains the question
None of its directions could ask it: each reads a catalog against the files of its own project, and every one of these entries was filed exactly where its source string lives. The disagreement existed only between catalogs.
It compares them with each other, keyed by context so two meanings deliberately kept apart are not reported, and counts a plural whose singular agrees and whose plural does not. Reintroducing one entry makes it name the string, both catalogs and both translations, and exit 1 — verified.
The .po reading is now one parser with three folds rather than three
readers: orchestra_entries() returns a record per entry, and asking whether a
string is translated, what it is translated to, and what a catalog carries are
each a few lines over it. A second parser beside the first is how the first
one's bugs survive, which this file has already demonstrated once.
Result
0 msgids in >=2 catalogs disagree on the French, from 22. The check is clean,
every linter is green, msgfmt --check passes on all 34 catalogs, and the unit
and affected kernel classes pass.
Wording is a judgement call and cheap to change: say the word on any of the choices above and I will swap it.
This merge request was prepared with the assistance of an AI agent (Claude). The analysis and the wording were reviewed by me before posting, and accountability for the content is mine.