CXCV/Python/Managers/I18NManager.py

82 lines
2.6 KiB
Python

#!/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