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:

  • Open is 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'].
  • Start is 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.
  • Starts is 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.

Merge request reports

Loading