45 lines
1.7 KiB
Python
45 lines
1.7 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""Injecte les clés guide105.* de scripts/guide_content.py dans les locales.
|
|
|
|
Insertion TEXTUELLE avant la dernière accolade (préserve le formatage exact
|
|
des fichiers existants). Idempotent : remplace un bloc guide105.* déjà
|
|
présent. Écriture LF (comme les blobs git).
|
|
"""
|
|
import json
|
|
import re
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
ROOT = Path("C:/dev/git/python/ObsiGate")
|
|
sys.path.insert(0, str(ROOT / "scripts"))
|
|
from guide_content import CONTENT # noqa: E402
|
|
|
|
KEY_RE = re.compile(r'^\s*"guide105\.[a-z0-9_]+"\s*:', re.M)
|
|
|
|
|
|
def merge(locale_file: Path, idx: int) -> None:
|
|
raw = locale_file.read_text(encoding="utf-8")
|
|
# retire un éventuel ancien bloc (idempotence)
|
|
raw = "".join(l for l in raw.splitlines(keepends=True) if not KEY_RE.match(l))
|
|
data = json.loads(raw)
|
|
|
|
entries = [' "guide105.%s": %s' % (k, json.dumps(v[idx], ensure_ascii=False)) for k, v in CONTENT.items()]
|
|
block = ",\n".join(entries) + "\n"
|
|
|
|
i = raw.rstrip().rfind("}")
|
|
head = raw[:i].rstrip() # dernière clé existante (sans virgule finale)
|
|
new = head + ",\n" + block + "}\n"
|
|
parsed = json.loads(new) # doit rester valide
|
|
assert len(parsed) == len(data) + len(CONTENT)
|
|
locale_file.write_bytes(new.encode("utf-8"))
|
|
print(locale_file.name, "->", len(parsed), "keys (+%d guide105)" % len(CONTENT))
|
|
|
|
|
|
merge(ROOT / "frontend/locales/fr.json", 0)
|
|
merge(ROOT / "frontend/locales/en.json", 1)
|
|
|
|
en = json.loads((ROOT / "frontend/locales/en.json").read_bytes().decode("utf-8"))
|
|
fr = json.loads((ROOT / "frontend/locales/fr.json").read_bytes().decode("utf-8"))
|
|
assert set(en) == set(fr), sorted(set(en) ^ set(fr))[:5]
|
|
print("parity OK:", len(en), "keys")
|