#!/usr/bin/env python3 """Склейка переводов: i18n-work/part*.ru.json -> src/i18n/schema-ru.json и src/i18n/ru.json. schema-ru.json - плоский словарь «английская строка -> русская» для схемы сервера. ru.json - тот же формат, что en.json (вложенные ключи), значения взяты из словаря; если перевода нет, остаётся английский текст. Правки руками, которые должны пережить пересборку, класть в overrides.ru.json. """ import glob import json import os import re HERE = os.path.dirname(os.path.abspath(__file__)) ROOT = os.path.dirname(HERE) d = {} for f in sorted(glob.glob(os.path.join(HERE, "part[0-9].ru.json"))): d.update(json.load(open(f, encoding="utf-8"))) ov = os.path.join(HERE, "overrides.ru.json") if os.path.exists(ov): d.update(json.load(open(ov, encoding="utf-8"))) # страховка: длинные тире в интерфейсе не нужны d = {k: v.replace("—", "-").replace("–", "-") for k, v in d.items()} # подстановки обязаны совпадать, иначе берём оригинал PH = re.compile(r"\{\{[^}]+\}\}|%\{[^}]+\}|\{[a-z][^{}]*\}") bad = [k for k, v in d.items() if sorted(PH.findall(k)) != sorted(PH.findall(v))] for k in bad: d[k] = k json.dump(d, open(os.path.join(ROOT, "src/i18n/schema-ru.json"), "w", encoding="utf-8"), ensure_ascii=False, indent=0, sort_keys=True) en = json.load(open(os.path.join(ROOT, "src/i18n/en.json"), encoding="utf-8")) def tr(o): if isinstance(o, dict): return {k: tr(v) for k, v in o.items()} if isinstance(o, str): return d.get(o, o) return o json.dump(tr(en), open(os.path.join(ROOT, "src/i18n/ru.json"), "w", encoding="utf-8"), ensure_ascii=False, indent=2) print(f"словарь: {len(d)} строк, отброшено из-за подстановок: {len(bad)}")