hOn/scripts/generate_translation.py

134 lines
4.7 KiB
Python
Raw Permalink Normal View History

2023-04-22 21:36:31 +00:00
#!/usr/bin/env python
2023-04-22 00:47:55 +00:00
import asyncio
import json
2023-04-22 19:42:16 +00:00
import re
2023-05-07 12:59:04 +00:00
import sys
2023-04-22 00:47:55 +00:00
from pathlib import Path
from pyhon import HonAPI
2023-05-07 12:59:04 +00:00
if __name__ == "__main__":
sys.path.insert(0, str(Path(__file__).parent.parent))
2023-06-11 20:34:32 +00:00
from scripts.translation_keys import SENSOR, SELECT, PROGRAMS, NAMES, CLIMATE
from custom_components.hon import const
2023-04-26 21:57:44 +00:00
2023-04-22 00:47:55 +00:00
async def check_translation_files(translations):
for language in const.LANGUAGES:
2023-04-22 00:47:55 +00:00
path = translations / f"{language}.json"
if not path.is_file():
async with HonAPI(anonymous=True) as hon:
keys = await hon.translation_keys(language)
save_json(path, keys)
def load_hon_translations():
translations = Path(__file__).parent / "translations"
translations.mkdir(exist_ok=True)
asyncio.run(check_translation_files(translations))
return {f.stem: f for f in translations.glob("*.json")}
def load_hass_translations():
translations = (
Path(__file__).parent.parent / "custom_components" / "hon" / "translations"
)
return {f.stem: f for f in translations.glob("*.json")}
def load_json(path):
if path:
with open(path, "r") as file:
return json.loads(file.read())
return {}
def save_json(path, keys):
with open(path, "w") as json_file:
2023-04-24 20:07:58 +00:00
json_file.write(json.dumps(keys, indent=4, ensure_ascii=False))
2023-04-22 00:47:55 +00:00
def load_key(full_key, json_data, fallback=None):
2023-04-24 19:38:05 +00:00
if isinstance(full_key, list):
return " ".join(
[load_key(item, json_data, fallback).strip() for item in full_key]
)
2023-04-22 00:47:55 +00:00
result = json_data.copy()
for key in full_key.split("."):
result = result.get(key, {})
if not result and fallback:
return load_key(full_key, fallback)
return result or full_key
2023-04-22 00:47:55 +00:00
2023-04-22 19:19:32 +00:00
def load_keys(full_key, json_data):
2023-04-24 20:07:58 +00:00
blacklist = ["description", "desctiption", "_recipe_", "_guided_"]
2023-04-22 19:19:32 +00:00
first, last = full_key.split(".")
data = json_data.get(first, {}).get(last, {})
return {
key.lower(): value
for key, value in data.items()
if not any(b in key.lower() for b in blacklist)
2023-04-22 19:42:16 +00:00
and re.findall("^[a-z0-9-_]+$", key.lower())
2023-04-22 19:19:32 +00:00
}
2023-04-22 21:09:57 +00:00
def add_data(old, original, fallback, data, name, entity="sensor"):
sensor = old.setdefault("entity", {}).setdefault(entity, {})
for number, phase in data.items():
state = sensor.setdefault(name, {}).setdefault("state", {})
if key := load_key(phase, original, fallback):
state[str(number)] = key
2023-04-24 20:40:20 +00:00
def translate_login(old, *args):
login = old.setdefault("config", {}).setdefault("step", {}).setdefault("user", {})
login["description"] = load_key("CUBE90_ALEXA.HAIER_SMART_SKILLS.STEP_2", *args)
login.setdefault("data", {})["email"] = load_key(
"PET.EDIT_PET_PROFESSIONALS.EMAIL", *args
)
login["data"]["password"] = load_key("CUBE90_GLOBAL.GENERAL.PASSWORD", *args)
2023-04-22 00:47:55 +00:00
def main():
hass = load_hass_translations()
hon = load_hon_translations()
base_path = Path(__file__).parent.parent / "custom_components/hon/translations"
fallback = load_json(hon.get("en", ""))
for language in const.LANGUAGES:
2023-04-22 00:47:55 +00:00
original = load_json(hon.get(language, ""))
old = load_json(hass.get(language, ""))
for name, data in SENSOR.items():
2023-04-22 21:09:57 +00:00
add_data(old, original, fallback, data, name)
for name, data in SELECT.items():
add_data(old, original, fallback, data, name, "select")
for entity, data in PROGRAMS.items():
for name, program in data.items():
select = old.setdefault("entity", {}).setdefault(entity, {})
select.setdefault(name, {})["state"] = load_keys(program, original)
2023-04-23 00:01:14 +00:00
for entity, data in NAMES.items():
for name, key in data.items():
select = old.setdefault("entity", {}).setdefault(entity, {})
select.setdefault(name, {})["name"] = load_key(key, original, fallback)
2023-05-28 05:50:59 +00:00
for name, modes in CLIMATE.items():
climate = old.setdefault("entity", {}).setdefault("climate", {})
attr = climate.setdefault(name, {}).setdefault("state_attributes", {})
for mode, data in modes.items():
mode_name = load_key(data["name"], original, fallback)
attr.setdefault(mode, {})["name"] = mode_name
2023-05-28 15:38:56 +00:00
if isinstance(data["state"], dict):
for state, key in data["state"].items():
mode_state = load_key(key, original, fallback)
attr[mode].setdefault("state", {})[state] = mode_state
else:
attr[mode]["state"] = load_keys(data["state"], original)
2023-04-24 20:40:20 +00:00
translate_login(old, original, fallback)
2023-04-22 00:47:55 +00:00
save_json(base_path / f"{language}.json", old)
if __name__ == "__main__":
main()