Garde des clés i18n : une clé présente dans une seule langue fait échouer npm test #453

Open
opened 2026-10-17 00:13:24 +00:00 by maximus · 1 comment
Owner

Refs #446

Aucun test ne compare les arbres de clés de src/i18n/locales/fr.json et src/i18n/locales/en.json. Les deux ont 1412 feuilles identiques au 2026-10-16, sans garde : une clé ajoutée dans une seule langue passe la CI et s'affiche brute dans l'autre langue. Ce point est sorti de #446 et placé en tête de la pile lot-v018, pour que les maillons suivants (#449, #372, #429, #393, #437, #384, #446) soient couverts dès leur PR.

Garde existantes, qui ne couvrent pas ce cas : DocsContent.locales.test.ts (seulement docs.*, longueurs et ids), onboardingPath.locales.test.ts (interpolations de trois phrases), entitlements.test.ts:134-153 (clés upsell.features), src/__integration__/i18n-mock-guard.test.ts (faux t).

Fichiers concernés

  • src/i18n/locales.keys.test.ts (nouveau)
  • src/i18n/locales/fr.json, src/i18n/locales/en.json (seulement si la garde révèle un écart sur la base du maillon)

Travail à faire

  • Test qui importe les deux JSON en statique (comme DocsContent.locales.test.ts:13-14), aplatit les feuilles en chemins pointés (les indices de tableau comptent : docs.dashboard.features.6), puis compare les deux ensembles triés. Le message d'échec liste les clés manquantes dans chaque langue, séparément.
  • Un tableau d'un côté et un objet de l'autre, ou une feuille d'un côté et un objet de l'autre, est un écart.
  • Les valeurs ne sont pas comparées, seulement les clés.
  • Lancer la garde sur la base du maillon. Si elle révèle un écart (une clé ajoutée par #369, #419 ou #421 dans une seule langue), ajouter la traduction manquante dans cette même PR et l'indiquer dans le corps de la PR.

Critères d'acceptation

  • npm test vert sur le tip.
  • Mutation 1 : retirer import.config.sourceNameHint de en.json → la garde rougit et nomme cette clé comme manquante en anglais.
  • Mutation 2 : ajouter une clé zz.only.fr dans fr.json seulement → rouge, clé nommée comme manquante en anglais.
  • Mutation 3 : remplacer un tableau de docs.* par une chaîne dans une langue → rouge.
  • Aucun changement de comportement : pas d'entrée CHANGELOG.

Décisions prises en planification

  • 2026-10-16 (Max, /plan-run) : la garde sort de #446 pour passer en tête de pile, afin qu'un oubli de clé dans un maillon soit vu dans sa propre PR et non à la fin.

Spec source

spec-plan-lot-v018.md

Note du 2026-10-18 : REVIEW.md est mergé

Reprise du commentaire 24477, écrit avant le merge de REVIEW.md (PR #460, main 24da72b). Dans « Pièges de revue », l'entrée « Faux t » écrit : « Jusqu'à #453, aucune garde ne détecte une clé présente dans une seule langue : comparer fr.json et en.json. » La PR de cette issue remplace cette phrase par la garde qu'elle ajoute, avec le nom du test (src/i18n/locales.keys.test.ts). REVIEW.md s'ajoute aux fichiers concernés.

Refs #446 Aucun test ne compare les arbres de clés de `src/i18n/locales/fr.json` et `src/i18n/locales/en.json`. Les deux ont 1412 feuilles identiques au 2026-10-16, sans garde : une clé ajoutée dans une seule langue passe la CI et s'affiche brute dans l'autre langue. Ce point est sorti de #446 et placé en tête de la pile `lot-v018`, pour que les maillons suivants (#449, #372, #429, #393, #437, #384, #446) soient couverts dès leur PR. Garde existantes, qui ne couvrent pas ce cas : `DocsContent.locales.test.ts` (seulement `docs.*`, longueurs et ids), `onboardingPath.locales.test.ts` (interpolations de trois phrases), `entitlements.test.ts:134-153` (clés `upsell.features`), `src/__integration__/i18n-mock-guard.test.ts` (faux `t`). ## Fichiers concernés - `src/i18n/locales.keys.test.ts` (nouveau) - `src/i18n/locales/fr.json`, `src/i18n/locales/en.json` (seulement si la garde révèle un écart sur la base du maillon) ## Travail à faire - [ ] Test qui importe les deux JSON en statique (comme `DocsContent.locales.test.ts:13-14`), aplatit les feuilles en chemins pointés (les indices de tableau comptent : `docs.dashboard.features.6`), puis compare les deux ensembles triés. Le message d'échec liste les clés manquantes dans chaque langue, séparément. - [ ] Un tableau d'un côté et un objet de l'autre, ou une feuille d'un côté et un objet de l'autre, est un écart. - [ ] Les valeurs ne sont pas comparées, seulement les clés. - [ ] Lancer la garde sur la base du maillon. Si elle révèle un écart (une clé ajoutée par #369, #419 ou #421 dans une seule langue), ajouter la traduction manquante dans cette même PR et l'indiquer dans le corps de la PR. ## Critères d'acceptation - [ ] `npm test` vert sur le tip. - [ ] Mutation 1 : retirer `import.config.sourceNameHint` de `en.json` → la garde rougit et nomme cette clé comme manquante en anglais. - [ ] Mutation 2 : ajouter une clé `zz.only.fr` dans `fr.json` seulement → rouge, clé nommée comme manquante en anglais. - [ ] Mutation 3 : remplacer un tableau de `docs.*` par une chaîne dans une langue → rouge. - [ ] Aucun changement de comportement : pas d'entrée CHANGELOG. ## Décisions prises en planification - 2026-10-16 (Max, `/plan-run`) : la garde sort de #446 pour passer en tête de pile, afin qu'un oubli de clé dans un maillon soit vu dans sa propre PR et non à la fin. ## Spec source spec-plan-lot-v018.md ## Note du 2026-10-18 : `REVIEW.md` est mergé Reprise du commentaire 24477, écrit avant le merge de `REVIEW.md` (PR #460, `main` `24da72b`). Dans « Pièges de revue », l'entrée « Faux `t` » écrit : « Jusqu'à #453, aucune garde ne détecte une clé présente dans une seule langue : comparer `fr.json` et `en.json`. » La PR de cette issue remplace cette phrase par la garde qu'elle ajoute, avec le nom du test (`src/i18n/locales.keys.test.ts`). `REVIEW.md` s'ajoute aux fichiers concernés.
maximus added this to the planned-2026-10-16-lot-v018 milestone 2026-10-17 00:13:24 +00:00
maximus added the
status:ready
type:refactor
source:human
labels 2026-10-17 00:13:24 +00:00
Author
Owner

Note pour la PR de cette issue. REVIEW.md (PR #460, pas encore mergée) porte, dans « Pièges de revue », l'entrée « Faux t » : « Jusqu'à #453, aucune garde ne détecte une clé présente dans une seule langue : comparer fr.json et en.json. »

Si #460 est mergée avant, la PR de #453 remplace cette phrase par la garde qu'elle ajoute, avec le nom du test.

Note pour la PR de cette issue. `REVIEW.md` (PR #460, pas encore mergée) porte, dans « Pièges de revue », l'entrée « Faux `t` » : « Jusqu'à #453, aucune garde ne détecte une clé présente dans une seule langue : comparer `fr.json` et `en.json`. » Si #460 est mergée avant, la PR de #453 remplace cette phrase par la garde qu'elle ajoute, avec le nom du test.
maximus added
status:in-progress
and removed
status:ready
labels 2026-10-18 21:05:27 +00:00
maximus added
status:review
and removed
status:in-progress
labels 2026-10-18 21:19:05 +00:00
maximus added
status:approved
and removed
status:review
labels 2026-10-19 01:40:16 +00:00
Sign in to join this conversation.
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: maximus/Simpl-Resultat#453
No description provided.