first step

This commit is contained in:
2026-04-05 12:18:33 +03:00
parent 4a03f3e3cf
commit 3992121397
17 changed files with 3367 additions and 0 deletions

91
locales/__init__.py Normal file
View 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()