shadow-over-bishkek001/dialogue_translations_to_xlsx.py
2026-07-05 21:52:37 +03:00

67 lines
2.0 KiB
Python

#!/usr/bin/env python3
"""
dialogue_translations_to_xlsx.py - Export dialogue_translations.json to an XLSX
spreadsheet for translators.
Reads a translation file shaped as {"dialogue_translations": [{"key":..., "ru":...,
"en":...}, ...]}, and writes one row per entry with a "key" column followed by one
column per language found in the file (order: ru, en, then any others found,
alphabetically). Missing values are written as empty cells.
Usage:
python dialogue_translations_to_xlsx.py <translations.json> <output.xlsx>
"""
import json
import sys
try:
from openpyxl import Workbook
from openpyxl.utils import get_column_letter
except ImportError:
raise SystemExit("openpyxl is required: pip install openpyxl")
PREFERRED_LANGUAGE_ORDER = ("ru", "en")
def collect_languages(entries: list[dict]) -> list[str]:
found = set()
for entry in entries:
found.update(k for k in entry.keys() if k != "key")
ordered = [lang for lang in PREFERRED_LANGUAGE_ORDER if lang in found]
ordered += sorted(found - set(ordered))
return ordered
def export_to_xlsx(json_path: str, xlsx_path: str) -> None:
with open(json_path, 'r', encoding='utf-8') as f:
data = json.load(f)
entries = data.get("dialogue_translations", [])
languages = collect_languages(entries)
wb = Workbook()
ws = wb.active
ws.title = "dialogue_translations"
ws.append(["key"] + languages)
for entry in entries:
ws.append([entry.get("key", "")] + [entry.get(lang, "") for lang in languages])
ws.freeze_panes = "A2"
ws.column_dimensions["A"].width = 50
for col_index in range(len(languages)):
ws.column_dimensions[get_column_letter(col_index + 2)].width = 50
wb.save(xlsx_path)
print(f"Saved: {xlsx_path} ({len(entries)} row(s), languages: {', '.join(languages)})")
if __name__ == '__main__':
if len(sys.argv) != 3:
print(f"Usage: {sys.argv[0]} <translations.json> <output.xlsx>")
sys.exit(1)
export_to_xlsx(sys.argv[1], sys.argv[2])