82 lines
2.6 KiB
Python
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 |