135 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			135 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
| #!/usr/bin/env python
 | |
| 
 | |
| import asyncio
 | |
| import json
 | |
| import re
 | |
| import sys
 | |
| from pathlib import Path
 | |
| 
 | |
| from pyhon import HonAPI
 | |
| 
 | |
| 
 | |
| if __name__ == "__main__":
 | |
|     sys.path.insert(0, str(Path(__file__).parent.parent))
 | |
| 
 | |
| from scripts.translation_keys import SENSOR, SELECT, PROGRAMS, NAMES, CLIMATE
 | |
| from custom_components.hon import const
 | |
| 
 | |
| 
 | |
| async def check_translation_files(translations):
 | |
|     for language in const.LANGUAGES:
 | |
|         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:
 | |
|         json_file.write(json.dumps(keys, indent=4, ensure_ascii=False))
 | |
| 
 | |
| 
 | |
| def load_key(full_key, json_data, fallback=None):
 | |
|     if isinstance(full_key, list):
 | |
|         return " ".join(
 | |
|             [load_key(item, json_data, fallback).strip() for item in full_key]
 | |
|         )
 | |
|     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
 | |
| 
 | |
| 
 | |
| def load_keys(full_key, json_data):
 | |
|     blacklist = ["description", "desctiption", "_recipe_", "_guided_"]
 | |
|     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)
 | |
|         and re.findall("^[a-z0-9-_]+$", key.lower())
 | |
|     }
 | |
| 
 | |
| 
 | |
| 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
 | |
| 
 | |
| 
 | |
| 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)
 | |
| 
 | |
| 
 | |
| 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:
 | |
|         original = load_json(hon.get(language, ""))
 | |
|         old = load_json(hass.get(language, ""))
 | |
|         for name, data in SENSOR.items():
 | |
|             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)
 | |
|         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)
 | |
|         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
 | |
|                 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)
 | |
| 
 | |
|         translate_login(old, original, fallback)
 | |
|         save_json(base_path / f"{language}.json", old)
 | |
| 
 | |
| 
 | |
| if __name__ == "__main__":
 | |
|     main()
 |