35 lines
1.0 KiB
Python
35 lines
1.0 KiB
Python
"""Parité i18n FR/EN des locales du frontend (#87 T9).
|
|
|
|
`frontend/locales/fr.json` et `en.json` doivent exposer exactement les mêmes
|
|
clés (comparaison profonde) : toute clé manquante fait afficher la clé brute
|
|
dans l'UI au lieu du libellé.
|
|
"""
|
|
from __future__ import annotations
|
|
|
|
import json
|
|
from pathlib import Path
|
|
|
|
LOCALES = Path(__file__).resolve().parent.parent / "frontend" / "locales"
|
|
|
|
|
|
def _flat(d: dict, prefix: str = "") -> set[str]:
|
|
keys = set()
|
|
for k, v in d.items():
|
|
name = f"{prefix}.{k}" if prefix else str(k)
|
|
if isinstance(v, dict):
|
|
keys |= _flat(v, name)
|
|
else:
|
|
keys.add(name)
|
|
return keys
|
|
|
|
|
|
def _load(lang: str) -> set[str]:
|
|
return _flat(json.loads((LOCALES / f"{lang}.json").read_text(encoding="utf-8")))
|
|
|
|
|
|
class TestI18nParity:
|
|
def test_fr_en_same_keys(self):
|
|
fr, en = _load("fr"), _load("en")
|
|
assert not (fr - en), f"clés sans traduction EN : {sorted(fr - en)[:10]}"
|
|
assert not (en - fr), f"clés sans traduction FR : {sorted(en - fr)[:10]}"
|