Compare commits

..

2 Commits

Author SHA1 Message Date
SantaSpeen 5148818aff [!] Ready 2025-03-23 02:17:42 +03:00
SantaSpeen b6ca2f7d7a base structure 2025-03-23 01:40:02 +03:00
5 changed files with 156 additions and 1 deletions
+23 -1
View File
@@ -1,3 +1,25 @@
# I18N-Module # I18N-Module
Internationalization (i18n) module Internationalization (i18n) module
i18n инжектися в builtins:
```python
from internationalization import I18N
I18N("localization_dir", "en")
print(i18n['key'])
print(i18n('key', some=123))
print(i18n.get_phrase('key', some=123))
```
!!! luguru настроен под формат:
```python
fmt = "<green>{elapsed} -- {time:YYYY-MM-DD HH:mm:ss.SSS}</green> | <level>{level:<8}</level> | {extra[module]:^12} | {extra[prefix]:<12} | {message}"
```
Добавление в проект:
```bash
git submodule add ssh://git@git.anidev.ru:222/andiev-soft/I18N-Module src/modules/i18n
```
+36
View File
@@ -0,0 +1,36 @@
class i18n:
@staticmethod
def set_lang(lang, encoding=None) -> None:
"""
Set the language and encoding for the locale file.
:param lang: Use the language file with the given language.
:param encoding: Encoding of the language file.
:return: None
"""
@staticmethod
def get_phrase(key: str, **kwargs) -> str:
"""
Get the phrase from the locale file. If the phrase is not found, return the key in uppercase.
:param key: Key to search in the locale file.
:param kwargs: Arguments to format the phrase.
:return: The phrase from the locale file.
"""
@staticmethod
def __call__(key: str, **kwargs) -> str:
"""
Get the phrase from the locale file. If the phrase is not found, return the key in uppercase.
:param key: Key to search in the locale file.
:param kwargs: Arguments to format the phrase.
:return: The phrase from the locale file.
"""
@staticmethod
def __getitem__(key: str) -> str:
"""
Get the phrase from the locale file. If the phrase is not found, return the key in uppercase.
:param key: Key to search in the locale file.
:return: The phrase from the locale file.
"""
class i10n(i18n): ...
+1
View File
@@ -0,0 +1 @@
from .i18n import I18N
+73
View File
@@ -0,0 +1,73 @@
import builtins
from collections import defaultdict
import json5
from loguru import logger
from . import utils
log = logger.bind(module="i18n", prefix="init")
log_load = logger.bind(module="i18n", prefix="load")
class I18N:
def __init__(self, locale_dir, load_lang, encoding):
"""
Load the language file and set the locale directory. Use JSON5 format for the language file.
:param locale_dir: {BASE_DIR}/resources/{locale_dir}
:param load_lang: some.lang
"""
self._locale_dir = utils.get_file(locale_dir) # {BASE_DIR}/resources/{locale_dir}
self._lang = load_lang
self._encoding = encoding
self._locale = {}
log.debug("Injecting to builtins")
builtins.i18n = self
builtins.i10n = self
log.debug("Ready")
self._load()
def _load(self):
if not self._locale_dir:
raise FileNotFoundError(f"Locale directory not found: {self._locale_dir}")
if (locale_file:=self._locale_dir / f"{self._lang}.json5").exists():
log_load.debug(f"Loading locale file: {locale_file}")
with open(locale_file, "r", encoding=self._encoding) as f:
data = json5.load(f)
self._locale = utils.flatten_dict(data)
log_load.debug("Loaded and flattened.")
else:
raise FileNotFoundError(f"Locale file not found: {locale_file}")
def set_lang(self, lang, encoding=None):
"""
Set the language and encoding for the locale file.
:param lang: Use the language file with the given language.
:param encoding: Encoding of the language file.
:return: None
"""
self._lang = lang
self._encoding = encoding or self._encoding
self._load()
def get_phrase(self, key: str, **kwargs) -> str:
"""
Get the phrase from the locale file. If the phrase is not found, return the key in uppercase.
:param key: Key to search in the locale file.
:param kwargs: Arguments to format the phrase.
:return: The phrase from the locale file.
"""
# key: some.key.here
phrase = self._locale.get(key)
if not phrase:
return key.upper()
return phrase.format_map(defaultdict(lambda: '???', kwargs))
def __call__(self, key: str, **kwargs):
return self.get_phrase(key, **kwargs)
def __getitem__(self, key: str):
return self.get_phrase(key)
+23
View File
@@ -0,0 +1,23 @@
import sys
from pathlib import Path
def base_path():
# PyInstaller creates a temp folder and stores path in _MEIPASS
try:
# noinspection PyUnresolvedReferences,PyProtectedMember
return Path(sys._MEIPASS).resolve()
except AttributeError:
return Path().resolve()
def get_file(filename):
return base_path() / "resources" / filename
def flatten_dict(d, parent_key='', sep='.'):
items = []
for k, v in d.items():
new_key = f"{parent_key}{sep}{k}" if parent_key else k
if isinstance(v, dict):
items.extend(flatten_dict(v, new_key, sep=sep).items())
else:
items.append((new_key, v))
return dict(items)