Files
stalwart-webui-ru/i18n-work/merge.py
T
viktor 61ff14915b Русский перевод интерфейса и схемы, падежи, выкладка через релиз
Словарь схемы 0.16.25 (7250 строк), ru.json, ручные правки падежей,
перевод ключа name только в меню, release.sh для выкладки в релиз current.

Claude-Session: https://claude.ai/code/session_01BFaqS6mH9sa99RWghq2j46
2026-10-06 01:37:19 +09:00

48 строки
2.0 KiB
Python
Исполняемый файл

#!/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)}")