Source code for libbot.i18n.classes.bot_locale

from os import listdir
from pathlib import Path
from typing import Any, Dict, List

from ...utils.config import config_get
from ...utils.json import json_read


[docs] class BotLocale: """Small addon that can be used by bot clients' classes in order to minimize I/O""" def __init__( self, default_locale: str | None = "en", locales_root: str | Path = Path("locale"), ) -> None: """ Args: default_locale (str | None): Default bot's locale. Defaults to `"en"` locales_root (str | Path): Folder where locales are located. Defaults to `Path("locale")` """ if isinstance(locales_root, str): locales_root = Path(locales_root) elif not isinstance(locales_root, Path): raise TypeError("'locales_root' must be a valid path or path-like object") files_locales: List[str] = listdir(locales_root) valid_locales: List[str] = [".".join(entry.split(".")[:-1]) for entry in files_locales] self.default: str = config_get("locale") if default_locale is None else default_locale self.locales: Dict[str, Any] = {} for locale in valid_locales: self.locales[locale] = json_read(Path(f"{locales_root}/{locale}.json")) def _(self, key: str, *args: str, locale: str | None = None) -> Any: """Get value of locale string. Args: key (str): The last key of the locale's keys path *args (str): Path to key like: `dict[args][key]` locale (str | None, optional): Locale to be looked up in. Defaults to config's `"locale"` value Returns: Any: Value of provided locale key. Is usually `str`, `Dict[str, Any]` or `List[Any]` """ if locale is None: locale: str = self.default try: this_dict: Dict[str, Any] = self.locales[locale] except KeyError: try: this_dict: Dict[str, Any] = self.locales[self.default] except KeyError: return ( f'⚠️ Locale in config is invalid: could not get "{key}" in {args} from locale "{locale}"' ) this_key: Dict[str, Any] = this_dict for dict_key in args: this_key = this_key[dict_key] try: return this_key[key] except KeyError: return f'⚠️ Locale in config is invalid: could not get "{key}" in {args} from locale "{locale}"'
[docs] def in_all_locales(self, key: str, *args: str) -> List[Any]: """Get value of the provided key and path in all available locales. Args: key (str): The last key of the locale's keys path *args (str): Path to key like: `dict[args][key]` Returns: List[Any]: List of values in all locales """ output: List[Any] = [] for name, locale in self.locales.items(): try: this_dict: Dict[str, Any] = locale except KeyError: continue this_key: Dict[str, Any] = this_dict for dict_key in args: this_key = this_key[dict_key] try: output.append(this_key[key]) except KeyError: continue return output
[docs] def in_every_locale(self, key: str, *args: str) -> Dict[str, Any]: """Get value of the provided key and path in every available locale with locale tag. Args: key (str): The last key of the locale's keys path *args (str): Path to key like: `dict[args][key]` Returns: Dict[str, Any]: Locale is a key, and it's value from locale file is a value """ output: Dict[str, Any] = {} for name, locale in self.locales.items(): try: this_dict: Dict[str, Any] = locale except KeyError: continue this_key: Dict[str, Any] = this_dict for dict_key in args: this_key = this_key[dict_key] try: output[name] = this_key[key] except KeyError: continue return output