Garde i18n : comparer les variables d'interpolation {{…}} entre fr.json et en.json #480
Labels
No labels
autopilot:pending-human
source:analyste
source:defenseur
source:human
source:medic
status:approved
status:blocked
status:in-progress
status:needs-clarification
status:needs-fix
status:ready
status:review
status:triage
type:bug
type:feature
type:infra
type:refactor
type:schema
type:security
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: maximus/Simpl-Resultat#480
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Contexte
Suivi proposé par la revue indépendante de la PR #468 (#453, commentaire 25409), hors du périmètre de #453. Décision de Max (2026-10-19) : issue de suivi.
La garde
src/i18n/locales.keys.test.ts(#453) compare les clés des deux langues, pas leurs valeurs. Une clé oùfr.jsonécrit{{count}}eten.json{{n}}passe la garde et affiche la variable brute dans une langue. Mesuré par le relecteur sur la tête de #468 : aucun écart de variables sur les 1712 clés, donc une telle garde serait verte d'emblée. Aujourd'hui, seuls des tests ciblés vérifient les variables de leurs propres phrases (onboardingPath.locales.test.ts,csvAutoDetect.test.ts,bankSignatures.test.ts,importFormat.test.ts).Travail
{{nom}}est le même en FR et en EN ; le message d'échec nomme la clé et les variables en écart._onequi écrit le nombre en toutes lettres, par exemple) décidées sur la base réelle, sans liste ouverte.Liens : #453, PR #468 (commentaire 25409).
Analyse (
/analyze, 2026-10-20,main45d8493, #453 mergée)Mesure sur
mainFeuilles communes aux deux fichiers : 1689 (aucune clé dans une seule langue, garde #453 verte) ; 117 feuilles avec au moins une variable ; 22 formes plurielles (
_one/_other) ; une seule clé avec option de format,onboarding.card.transactions.uncategorized({{filter, lowercase}}, identique dans les deux langues) ; aucune forme{{- …}}ni$t(…). Zéro écart de variables : la garde sera verte d'emblée et aucune exception n'est nécessaire (les formes_oneécrivent{{count}}dans les deux langues).Conception
src/i18n/locales.keys.test.ts(même parcours des feuilles que #453, undescribe« locale values: interpolation variables (#480) ») : pour chaque chemin feuille présent dans les deux fichiers, l'ensemble des jetons{{…}}normalisés (contenu sans blancs superflus, option de format comprise :filter, lowercase≠filter) est le même ; message d'échec par clé,clé: {{a}}, {{b}} in fr.json ; {{a}}, {{c}} in en.json, sur la liste complète des écarts et non le premier.Dépensesau lieu dedépenses).import.rootFiles.message_oneportecount,folderetnamesdes deux côtés, etonboarding.card.transactions.uncategorizedportefilter, lowercase; une lecture vide ferait passer la comparaison sur rien.Travail à faire
variablesOf(text)(ensemble des jetons normalisés) etvariableGaps(fr, en)à côté demissingKeysetkindGaps.describesur les vrais fichiers, avec le canari.{{folder}}en{{dir}}dansen.jsonseul, et retirer, lowercased'un côté : la garde rougit et nomme la clé.docs/architecture.mdsi la section des gardes de test listelocales.keys.test.ts.Fichiers concernés
src/i18n/locales.keys.test.ts— seul fichier.Surface de test
locales.keys.test.ts(#453),src/__integration__/i18n-mock-guard.test.ts, et les tests ciblés nommés dans le corps.Complexité
Simple. Niveau de revue : normal. Prochaine étape :
/fix-issue 480.