#!/usr/bin/env python3 # -*- coding: utf-8 -*- from typing import Any, Optional, Self from Interfaces.Application.CXCVInterface import CXCVInterface from Utils.Utils import Utils class I18NManager: def __init__(self:Self, cxcv:CXCVInterface) -> None: key:str self.cxcv:CXCVInterface = cxcv self.__sentences:dict[str, dict[str, str|list[str]|tuple[str, ...]]] = {} self.__language:str = "english" for key in ("default_i18n_files", "default_i18n", "i18n_files", "i18n"): self.add(self.cxcv.settings.get(key), True) def __get(self:Self, texts:str|list[str]|tuple[str, ...], inputs:Optional[dict[str, Any|None]|list[Any|None]|tuple[Any|None, ...]] = None, default:str = "" ) -> Any|None: keys:list[str] = Utils.get_keys(texts) if len(keys): language:str done:tuple[str, ...] = () for language in (self.__language, *tuple(self.__sentences.keys())): if language in done: continue done += (language,) if language in self.__sentences: for key in keys: if key in self.__sentences[language]: return self.__sentences[language][key] if len(texts := Utils.get_strings(texts)): return texts[0] return default def get(self:Self, texts:str|list[str]|tuple[str, ...], inputs:Optional[dict[str, Any|None]|list[Any|None]|tuple[Any|None, ...]] = None, default:str = "" ) -> str: text:str|list[str]|tuple[str, ...] = self.__get(texts, inputs, default) return Utils.string_variables(( text if isinstance(text, str) else " ".join(text) if isinstance(text, (list, tuple)) else str(text)), inputs) def add(self:Self, inputs:Any|None, overwrite:bool = False) -> None: dictionary:dict[str, Any|None] for dictionary in self.cxcv.files.load_json(inputs): language:str sentences:Any|None for language, sentences in dictionary.items(): if not isinstance(sentences, dict): continue if language not in self.__sentences: self.__sentences[language] = {} key:str value:Any|None for key, value in sentences.items(): if overwrite or key not in self.__sentences[language]: self.__sentences[language][key] = value