92 lines
2.9 KiB
Python
92 lines
2.9 KiB
Python
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()
|