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()