import json import os.path from functools import reduce from cpl_translation.translation_service_abc import TranslationServiceABC from cpl_translation.translation_settings import TranslationSettings class TranslationService(TranslationServiceABC): def __init__(self): self._translation = {} self._language = "" self._default_language = "" TranslationServiceABC.__init__(self) def set_default_lang(self, lang: str): if lang not in self._translation: raise KeyError() self._default_language = lang self.set_lang(lang) def set_lang(self, lang: str): if lang not in self._translation: raise KeyError() self._language = lang def load(self, lang: str): if not os.path.exists(f"translation/{lang}.json"): raise FileNotFoundError() file_dict = {} with open(f"translation/{lang}.json", "r", encoding="utf-8") as file: file_dict = json.load(file) file.close() self._translation[lang] = file_dict def load_by_settings(self, settings: TranslationSettings): if settings is None: raise Exception(f"{TranslationSettings.__name__} not loaded") self._language = settings.default_language self._default_language = settings.default_language for lang in settings.languages: self.load(lang) def translate(self, key: str) -> str: value = reduce( lambda d, key: d.get(key) if isinstance(d, dict) else None, key.split("."), self._translation[self._language], ) if value is None: raise KeyError(f"Translation {key} not found") return value