From c97ce05b09416400bc50d619acbccbddca9691f2 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Tue, 28 Apr 2020 10:35:38 -0700 Subject: [PATCH] Add script to copy backend translations to frontend (#34706) --- script/translations/download.py | 23 +++-------------- script/translations/frontend.py | 46 +++++++++++++++++++++++++++++++++ script/translations/migrate.py | 32 ++++++++--------------- script/translations/util.py | 2 +- 4 files changed, 61 insertions(+), 42 deletions(-) create mode 100644 script/translations/frontend.py diff --git a/script/translations/download.py b/script/translations/download.py index 0e8c0664ecb..364f309b644 100755 --- a/script/translations/download.py +++ b/script/translations/download.py @@ -1,6 +1,5 @@ #!/usr/bin/env python3 """Merge all translation sources into a single JSON file.""" -import glob import json import os import pathlib @@ -47,16 +46,6 @@ def run_download_docker(): raise ExitApp("Failed to download translations") -def load_json(filename: str) -> Union[List, Dict]: - """Load JSON data from a file and return as dict or list. - - Defaults to returning empty dict if file is not found. - """ - with open(filename, encoding="utf-8") as fdesc: - return json.loads(fdesc.read()) - return {} - - def save_json(filename: str, data: Union[List, Dict]): """Save JSON data to a file. @@ -69,11 +58,6 @@ def save_json(filename: str, data: Union[List, Dict]): return False -def get_language(path): - """Get the language code for the given file path.""" - return os.path.splitext(os.path.basename(path))[0] - - def get_component_path(lang, component): """Get the component translation path.""" if os.path.isdir(os.path.join("homeassistant", "components", component)): @@ -132,10 +116,9 @@ def save_language_translations(lang, translations): def write_integration_translations(): """Write integration translations.""" - paths = glob.iglob("build/translations-download/*.json") - for path in paths: - lang = get_language(path) - translations = load_json(path) + for lang_file in DOWNLOAD_DIR.glob("*.json"): + lang = lang_file.stem + translations = json.loads(lang_file.read_text()) save_language_translations(lang, translations) diff --git a/script/translations/frontend.py b/script/translations/frontend.py new file mode 100644 index 00000000000..c955c240478 --- /dev/null +++ b/script/translations/frontend.py @@ -0,0 +1,46 @@ +"""Write updated translations to the frontend.""" +import argparse +import json + +from .const import FRONTEND_DIR +from .download import DOWNLOAD_DIR, run_download_docker +from .util import get_base_arg_parser + +FRONTEND_BACKEND_TRANSLATIONS = FRONTEND_DIR / "translations/backend" + + +def get_arguments() -> argparse.Namespace: + """Get parsed passed in arguments.""" + parser = get_base_arg_parser() + parser.add_argument( + "--skip-download", action="store_true", help="Skip downloading translations." + ) + return parser.parse_args() + + +def run(): + """Update frontend translations with backend data. + + We use the downloaded Docker files because it gives us each language in 1 file. + """ + args = get_arguments() + + if not args.skip_download: + run_download_docker() + + for lang_file in DOWNLOAD_DIR.glob("*.json"): + translations = json.loads(lang_file.read_text()) + + to_write_translations = {"component": {}} + + for domain, domain_translations in translations["component"].items(): + if "state" not in domain_translations: + continue + + to_write_translations["component"][domain] = { + "state": domain_translations["state"] + } + + (FRONTEND_BACKEND_TRANSLATIONS / lang_file.name).write_text( + json.dumps(to_write_translations, indent=2) + ) diff --git a/script/translations/migrate.py b/script/translations/migrate.py index fcf44e3dece..8081a442955 100644 --- a/script/translations/migrate.py +++ b/script/translations/migrate.py @@ -327,27 +327,17 @@ def find_frontend_states(): def run(): """Migrate translations.""" # Import new common keys - # migrate_project_keys_translations( - # FRONTEND_PROJECT_ID, - # CORE_PROJECT_ID, - # { - # "state::default::off": "common::state::off", - # "state::default::on": "common::state::on", - # "state::cover::open": "common::state::open", - # "state::cover::closed": "common::state::closed", - # "state::binary_sensor::connectivity::on": "common::state::connected", - # "state::binary_sensor::connectivity::off": "common::state::disconnected", - # "state::lock::locked": "common::state::locked", - # "state::lock::unlocked": "common::state::unlocked", - # "state::timer::active": "common::state::active", - # "state::camera::idle": "common::state::idle", - # "state::media_player::standby": "common::state::standby", - # "state::media_player::paused": "common::state::paused", - # "state::device_tracker::home": "common::state::home", - # "state::device_tracker::not_home": "common::state::not_home", - # }, - # ) + migrate_project_keys_translations( + CORE_PROJECT_ID, + FRONTEND_PROJECT_ID, + { + "common::state::off": "state::default::off", + "common::state::on": "state::default::on", + }, + ) - find_frontend_states() + # find_frontend_states() + + # find_different_languages() return 0 diff --git a/script/translations/util.py b/script/translations/util.py index 2cc7dfff689..9839fefd9d5 100644 --- a/script/translations/util.py +++ b/script/translations/util.py @@ -13,7 +13,7 @@ def get_base_arg_parser() -> argparse.ArgumentParser: parser.add_argument( "action", type=str, - choices=["clean", "develop", "download", "migrate", "upload"], + choices=["clean", "develop", "download", "frontend", "migrate", "upload"], ) parser.add_argument("--debug", action="store_true", help="Enable log output") return parser