Added L10N YAML flattening, Removed trash
Update .gitignore, sidebar.yml, and 6 more files...
This commit is contained in:
@@ -1,72 +1,10 @@
|
||||
import copy
|
||||
from typing import Optional
|
||||
|
||||
from locked_dict.locked_dict import LockedDict
|
||||
|
||||
|
||||
class Localizer:
|
||||
_langs_data: LockedDict[LockedDict[str, str]]
|
||||
_default_lang: str
|
||||
_allowed_langs: list[str]
|
||||
|
||||
def __init__(self, default_lang: str, allowed_langs: Optional[list[str]]):
|
||||
self._langs_data = LockedDict()
|
||||
self._default_lang = default_lang
|
||||
|
||||
self._allowed_langs = allowed_langs
|
||||
if self._allowed_langs is None:
|
||||
self._allowed_langs = list()
|
||||
self._allowed_langs.append(self._default_lang)
|
||||
|
||||
def add_lang(self, lang: str):
|
||||
if lang not in self._langs_data.keys():
|
||||
self._langs_data[lang] = LockedDict()
|
||||
|
||||
def add_domain(self, lang: str, domain: str, domain_data: Optional[dict[str, str]], strip_prefix: bool = False):
|
||||
if domain not in self._langs_data[lang].keys():
|
||||
self._langs_data[lang][domain] = LockedDict()
|
||||
|
||||
if strip_prefix:
|
||||
new_domain_data = dict()
|
||||
for key, value in domain_data.items():
|
||||
if key.startswith(f"{domain}."):
|
||||
new_domain_data[key[len(f"{domain}."):]] = value
|
||||
domain_data = new_domain_data
|
||||
|
||||
self._langs_data[lang][domain].update(domain_data)
|
||||
|
||||
def _localize_internal(self, lang: str, domain: str, key: str, args: list[str] = None) -> Optional[str]:
|
||||
if lang not in self._allowed_langs:
|
||||
return None
|
||||
|
||||
if lang not in self._langs_data.keys():
|
||||
return None
|
||||
|
||||
lang_data = self._langs_data[lang]
|
||||
if domain not in lang_data.keys():
|
||||
return None
|
||||
|
||||
domain_data = lang_data[domain]
|
||||
if key not in domain_data.keys():
|
||||
return None
|
||||
|
||||
localized_text = domain_data[key]
|
||||
if args is not None:
|
||||
for arg_index, arg_value in enumerate(args):
|
||||
localized_text = localized_text.replace(f"%{arg_index}", arg_value)
|
||||
|
||||
return localized_text
|
||||
|
||||
def localize(self, lang: str, domain: str, key: str, args: list[str] = None) -> str:
|
||||
localized_string = None
|
||||
|
||||
if localized_string is None:
|
||||
localized_string = self._localize_internal(lang, domain, key, args)
|
||||
|
||||
if localized_string is None and lang != self._default_lang:
|
||||
localized_string = self._localize_internal(self._default_lang, domain, key, args)
|
||||
|
||||
if localized_string is None:
|
||||
return domain + "." + key
|
||||
|
||||
return localized_string
|
||||
def flatten_dict(d, parent_key='', separator='.'):
|
||||
items = []
|
||||
for key, value in d.items():
|
||||
new_key = f"{parent_key}{separator}{key}" if parent_key else str(key)
|
||||
if isinstance(value, dict):
|
||||
items.extend(flatten_dict(value, new_key, separator).items())
|
||||
else:
|
||||
items.append((new_key, value))
|
||||
return dict(items)
|
||||
|
76
website/l10n/localizer.py
Normal file
76
website/l10n/localizer.py
Normal file
@@ -0,0 +1,76 @@
|
||||
from typing import Optional
|
||||
|
||||
from locked_dict.locked_dict import LockedDict
|
||||
|
||||
from website.l10n import flatten_dict
|
||||
|
||||
|
||||
class Localizer:
|
||||
_langs_data: LockedDict[LockedDict[str, str]]
|
||||
_default_lang: str
|
||||
_allowed_langs: list[str]
|
||||
|
||||
def __init__(self, default_lang: str, allowed_langs: Optional[list[str]]):
|
||||
self._langs_data = LockedDict()
|
||||
self._default_lang = default_lang
|
||||
|
||||
self._allowed_langs = allowed_langs
|
||||
if self._allowed_langs is None:
|
||||
self._allowed_langs = list()
|
||||
self._allowed_langs.append(self._default_lang)
|
||||
|
||||
def add_lang(self, lang: str):
|
||||
if lang not in self._langs_data.keys():
|
||||
self._langs_data[lang] = LockedDict()
|
||||
|
||||
def add_domain(self, lang: str, domain: str, domain_data: Optional[dict[str, str]], strip_prefix: bool = False):
|
||||
if domain not in self._langs_data[lang].keys():
|
||||
self._langs_data[lang][domain] = LockedDict()
|
||||
|
||||
if domain_data is not None:
|
||||
domain_data = flatten_dict(domain_data)
|
||||
|
||||
if strip_prefix:
|
||||
new_domain_data = dict()
|
||||
for key, value in domain_data.items():
|
||||
if key.startswith(f"{domain}."):
|
||||
new_domain_data[key[len(f"{domain}."):]] = value
|
||||
domain_data = new_domain_data
|
||||
|
||||
self._langs_data[lang][domain].update(domain_data)
|
||||
|
||||
def _localize_internal(self, lang: str, domain: str, key: str, args: list[str] = None) -> Optional[str]:
|
||||
if lang not in self._allowed_langs:
|
||||
return None
|
||||
|
||||
if lang not in self._langs_data.keys():
|
||||
return None
|
||||
|
||||
lang_data = self._langs_data[lang]
|
||||
if domain not in lang_data.keys():
|
||||
return None
|
||||
|
||||
domain_data = lang_data[domain]
|
||||
if key not in domain_data.keys():
|
||||
return None
|
||||
|
||||
localized_text = domain_data[key]
|
||||
if args is not None:
|
||||
for arg_index, arg_value in enumerate(args):
|
||||
localized_text = localized_text.replace(f"%{arg_index}", arg_value)
|
||||
|
||||
return localized_text
|
||||
|
||||
def localize(self, lang: str, domain: str, key: str, args: list[str] = None) -> str:
|
||||
localized_string = None
|
||||
|
||||
if localized_string is None:
|
||||
localized_string = self._localize_internal(lang, domain, key, args)
|
||||
|
||||
if localized_string is None and lang != self._default_lang:
|
||||
localized_string = self._localize_internal(self._default_lang, domain, key, args)
|
||||
|
||||
if localized_string is None:
|
||||
return domain + "." + key
|
||||
|
||||
return localized_string
|
@@ -5,7 +5,7 @@ from typing import Optional
|
||||
|
||||
import yaml
|
||||
|
||||
from . import Localizer
|
||||
from .localizer import Localizer
|
||||
|
||||
DEFAULT_LANG = "en"
|
||||
ALLOWED_LANGS = ["en", "fr"]
|
||||
@@ -123,46 +123,3 @@ def l10n_url_switch(url: str, new_lang: Optional[str] = None) -> str:
|
||||
url = "/" + new_lang + url
|
||||
|
||||
return url.replace("//", "/")
|
||||
|
||||
|
||||
# STRINGS = dict()
|
||||
# STRINGS[DEFAULT_LANG] = dict()
|
||||
# STRINGS["_compile_date"] = "1970-01-01T00:00:00.000000+00:00Z"
|
||||
#
|
||||
#
|
||||
# def reload_strings(strings_file: str) -> None:
|
||||
# global STRINGS
|
||||
# STRINGS = dict()
|
||||
# STRINGS[DEFAULT_LANG] = dict()
|
||||
# STRINGS["_compile_date"] = "1970-01-01T00:00:00.000000+00:00Z"
|
||||
# STRINGS = json.loads(open(strings_file, "r").read())
|
||||
#
|
||||
#
|
||||
# def localize_internal(string_key: str, language: str, lang_data: dict, fallback: Optional[str]) -> Optional[str]:
|
||||
# if language not in ALLOWED_LANGS:
|
||||
# return fallback
|
||||
#
|
||||
# if language not in lang_data.keys():
|
||||
# language = DEFAULT_LANG
|
||||
#
|
||||
# localized_string = lang_data[language].get(string_key)
|
||||
# if localized_string is None and language != DEFAULT_LANG:
|
||||
# localized_string = lang_data[DEFAULT_LANG].get(string_key)
|
||||
#
|
||||
# if localized_string is None:
|
||||
# return fallback
|
||||
# return localized_string
|
||||
#
|
||||
#
|
||||
# def localize(strings_key: str, language: str, extra_lang_data: Optional[dict] = None) -> str:
|
||||
# localized_string = None
|
||||
#
|
||||
# if extra_lang_data is not None:
|
||||
# localized_string = localize_internal(strings_key, language, extra_lang_data, None)
|
||||
#
|
||||
# if localized_string is None:
|
||||
# localized_string = localize_internal(strings_key, language, STRINGS, None)
|
||||
#
|
||||
# if localized_string is None:
|
||||
# return f"${strings_key}"
|
||||
# return localized_string
|
||||
|
Reference in New Issue
Block a user