first step
This commit is contained in:
91
locales/__init__.py
Normal file
91
locales/__init__.py
Normal file
@@ -0,0 +1,91 @@
|
||||
import json
|
||||
from pathlib import Path
|
||||
from typing import Optional
|
||||
|
||||
|
||||
class Localization:
|
||||
"""Класс для управления локализацией"""
|
||||
|
||||
_instance = None
|
||||
_locales = {}
|
||||
_default_locale = "ru"
|
||||
|
||||
def __new__(cls):
|
||||
if cls._instance is None:
|
||||
cls._instance = super().__new__(cls)
|
||||
return cls._instance
|
||||
|
||||
def __init__(self):
|
||||
if not self._locales:
|
||||
self.load_locales()
|
||||
|
||||
def load_locales(self):
|
||||
"""Загрузка всех файлов локализации"""
|
||||
locales_dir = Path(__file__).parent
|
||||
for locale_file in locales_dir.glob("*.json"):
|
||||
locale_code = locale_file.stem
|
||||
with open(locale_file, "r", encoding="utf-8") as f:
|
||||
self._locales[locale_code] = json.load(f)
|
||||
|
||||
def get(self, key: str, locale: str = None, **kwargs) -> str:
|
||||
"""
|
||||
Получение локализованной строки
|
||||
|
||||
Args:
|
||||
key: Ключ строки (например, "welcome", "buttons.buy_subscription")
|
||||
locale: Код языка (ru, en, kz)
|
||||
**kwargs: Параметры для форматирования строки
|
||||
"""
|
||||
if locale is None:
|
||||
locale = self._default_locale
|
||||
|
||||
if locale not in self._locales:
|
||||
locale = self._default_locale
|
||||
|
||||
keys = key.split(".")
|
||||
value = self._locales.get(locale, {})
|
||||
|
||||
for k in keys:
|
||||
if isinstance(value, dict):
|
||||
value = value.get(k)
|
||||
else:
|
||||
value = None
|
||||
break
|
||||
|
||||
if value is None:
|
||||
# Пытаемся найти в default locale
|
||||
value = self._locales.get(self._default_locale, {})
|
||||
for k in keys:
|
||||
if isinstance(value, dict):
|
||||
value = value.get(k)
|
||||
else:
|
||||
value = None
|
||||
break
|
||||
|
||||
if value is None:
|
||||
return key
|
||||
|
||||
if kwargs:
|
||||
try:
|
||||
value = value.format(**kwargs)
|
||||
except KeyError:
|
||||
pass
|
||||
|
||||
return value
|
||||
|
||||
def get_locale_name(self, locale: str) -> str:
|
||||
"""Получение названия языка на родном языке"""
|
||||
return self.get(f"languages.{locale}", locale)
|
||||
|
||||
def set_default_locale(self, locale: str):
|
||||
"""Установка языка по умолчанию"""
|
||||
if locale in self._locales:
|
||||
self._default_locale = locale
|
||||
|
||||
def get_available_locales(self) -> list:
|
||||
"""Получение списка доступных языков"""
|
||||
return list(self._locales.keys())
|
||||
|
||||
|
||||
# Глобальный экземпляр локализации
|
||||
localization = Localization()
|
||||
Reference in New Issue
Block a user