from __future__ import annotations from pathlib import Path import collections import json import click from cli import TranslationsDir from trezorlib._internal import translations from trezorlib.debuglink import LayoutType HERE = Path(__file__).parent # staging directory for layout-specific translation JSON files CROWDIN_DIR = HERE / "crowdin" # layouts with translation support ALL_LAYOUTS = frozenset(LayoutType) - {LayoutType.T1} @click.group() def cli() -> None: pass @cli.command() def split() -> None: """Split translation files for Crowdin upload. Create a separate JSON file for each language and layout. """ tdir = TranslationsDir() for lang in tdir.all_languages(): blob_json = tdir.load_lang(lang) for layout_type in ALL_LAYOUTS: # extract translations specific to this layout layout_specific_translations = { key: translations.get_translation(blob_json, key, layout_type) for key in blob_json["translations"].keys() } # create a JSON file with only the "translations" item result = {"translations": layout_specific_translations} with open(CROWDIN_DIR / f"{lang}_{layout_type.name}.json", "w") as f: json.dump(result, f, indent=2, ensure_ascii=False) click.echo(f"Successfully generated layout-specific translation files in '{CROWDIN_DIR}'") @cli.command() def merge() -> None: """Merge back translation files downloaded from Crowdin.""" tdir = TranslationsDir() for lang in sorted(tdir.all_languages()): merged_translations: dict[str, str | dict[str, str]] = collections.defaultdict(dict) for layout_type in ALL_LAYOUTS: with open(CROWDIN_DIR / f"{lang}_{layout_type.name}.json", "r") as f: blob_json = json.load(f) # mapping string name to its translation (for the current layout) layout_specific_translations: dict[str, str] = blob_json["translations"] for key, value in layout_specific_translations.items(): merged_translations[key][layout_type.name] = value for key in merged_translations.keys(): # deduplicate entries if all translations are the same unique_translations = set(merged_translations[key].values()) if len(unique_translations) == 1: merged_translations[key] = unique_translations.pop() blob_json = tdir.load_lang(lang) blob_json["translations"] = merged_translations tdir.save_lang(lang, blob_json) click.echo(f"Updated {lang}") click.echo(f"Successfully merged back layout-specific translation files from '{CROWDIN_DIR}'") if __name__ == "__main__": cli()