77 lines
3.2 KiB
Python
77 lines
3.2 KiB
Python
import json
|
||
import os
|
||
from PySide6.QtCore import QSettings
|
||
from app.core import config
|
||
|
||
class Localizer:
|
||
"""Класс для загрузки и работы с переводами"""
|
||
|
||
def __init__(self):
|
||
self.settings = QSettings("yobble_messenger", "Localization")
|
||
self.locales_path = os.path.join("app/locales")
|
||
self.translations = {}
|
||
|
||
self.lang = self.settings.value("language", ('ru', 'Русский'))
|
||
available_langs = self.get_available_languages()
|
||
if self.lang not in available_langs:
|
||
self.lang = available_langs[0] if available_langs else ('ru', 'Русский')
|
||
|
||
self.load_language(self.lang[0])
|
||
|
||
def get_available_languages(self):
|
||
"""
|
||
Возвращает список доступных языков как список кортежей:
|
||
(код_языка, отображаемое_имя)
|
||
"""
|
||
langs = []
|
||
if os.path.exists(self.locales_path):
|
||
for file in os.listdir(self.locales_path):
|
||
if file.endswith(".json"):
|
||
lang_code = os.path.splitext(file)[0]
|
||
lang_file = os.path.join(self.locales_path, file)
|
||
try:
|
||
with open(lang_file, "r", encoding="utf-8") as f:
|
||
data = json.load(f)
|
||
display_name = data.get("__name__", lang_code)
|
||
langs.append((lang_code, display_name))
|
||
except Exception as e:
|
||
if config.DEBUG:
|
||
print(f"[Localizer] Ошибка чтения {file}: {e}")
|
||
langs.append((lang_code, lang_code)) # fallback
|
||
if config.DEBUG: print("langs", langs)
|
||
return langs
|
||
|
||
def load_language(self, lang):
|
||
"""Загружает перевод из JSON-файла"""
|
||
lang_file = os.path.join(self.locales_path, f"{lang}.json")
|
||
if os.path.exists(lang_file):
|
||
with open(lang_file, "r", encoding="utf-8") as file:
|
||
self.translations = json.load(file)
|
||
self.lang = lang
|
||
self.settings.setValue("language", lang[0])
|
||
if config.DEBUG: print(f"[Localizer.load_language] ✅ Язык загружен: {lang}")
|
||
else:
|
||
if config.DEBUG: print(f"[Localizer.load_language] ❌ Файл локализации не найден: {lang_file}")
|
||
|
||
def translate(self, key, code=None):
|
||
"""Возвращает перевод слова"""
|
||
text = self.translations.get(key, key)
|
||
if code is not None:
|
||
text = f"{text} {code}"
|
||
return text
|
||
|
||
def switch_language(self, lang):
|
||
"""Переключает языки, если язык доступен"""
|
||
if isinstance(lang, (tuple, list)):
|
||
lang = lang[0]
|
||
|
||
available_langs = [code for code, _ in self.get_available_languages()]
|
||
if lang in available_langs:
|
||
self.load_language(lang)
|
||
else:
|
||
if config.DEBUG:
|
||
print(f"[Localizer.switch_language] ❌ Язык не найден: {lang}")
|
||
|
||
# Глобальный экземпляр
|
||
localizer = Localizer()
|