Словарь схемы 0.16.25 (7250 строк), ru.json, ручные правки падежей, перевод ключа name только в меню, release.sh для выкладки в релиз current. Claude-Session: https://claude.ai/code/session_01BFaqS6mH9sa99RWghq2j46
48 строки
2.0 KiB
Python
Исполняемый файл
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)}")
|