localizate patch

This commit is contained in:
unknown 2025-09-09 12:06:01 +03:00
parent 8d923d6a6a
commit 8f251dcf91
2 changed files with 41 additions and 18 deletions

View File

@ -11,20 +11,34 @@ class Localizer:
self.locales_path = os.path.join("app/locales") self.locales_path = os.path.join("app/locales")
self.translations = {} self.translations = {}
self.lang = self.settings.value("language", "ru") self.lang = self.settings.value("language", ('ru', 'Русский'))
available_langs = self.get_available_languages() available_langs = self.get_available_languages()
if self.lang not in available_langs: if self.lang not in available_langs:
self.lang = available_langs[0] if available_langs else "ru" self.lang = available_langs[0] if available_langs else ('ru', 'Русский')
self.load_language(self.lang) self.load_language(self.lang[0])
def get_available_languages(self): def get_available_languages(self):
"""Возвращает список доступных языков по файлам в папке locales""" """
Возвращает список доступных языков как список кортежей:
(код_языка, отображаемое_имя)
"""
langs = [] langs = []
if os.path.exists(self.locales_path): if os.path.exists(self.locales_path):
for file in os.listdir(self.locales_path): for file in os.listdir(self.locales_path):
if file.endswith(".json"): if file.endswith(".json"):
langs.append(os.path.splitext(file)[0]) 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 return langs
def load_language(self, lang): def load_language(self, lang):
@ -34,7 +48,7 @@ class Localizer:
with open(lang_file, "r", encoding="utf-8") as file: with open(lang_file, "r", encoding="utf-8") as file:
self.translations = json.load(file) self.translations = json.load(file)
self.lang = lang self.lang = lang
self.settings.setValue("language", lang) self.settings.setValue("language", lang[0])
if config.DEBUG: print(f"[Localizer.load_language] ✅ Язык загружен: {lang}") if config.DEBUG: print(f"[Localizer.load_language] ✅ Язык загружен: {lang}")
else: else:
if config.DEBUG: print(f"[Localizer.load_language] ❌ Файл локализации не найден: {lang_file}") if config.DEBUG: print(f"[Localizer.load_language] ❌ Файл локализации не найден: {lang_file}")
@ -48,10 +62,15 @@ class Localizer:
def switch_language(self, lang): def switch_language(self, lang):
"""Переключает языки, если язык доступен""" """Переключает языки, если язык доступен"""
if lang in self.get_available_languages(): 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) self.load_language(lang)
else: else:
if config.DEBUG: print(f"[Localizer.switch_language] ❌ Язык не найден: {lang}") if config.DEBUG:
print(f"[Localizer.switch_language] ❌ Язык не найден: {lang}")
# Глобальный экземпляр # Глобальный экземпляр
localizer = Localizer() localizer = Localizer()

View File

@ -72,19 +72,23 @@ class LoginView(QWidget):
self.theme_button.setFixedWidth(50) self.theme_button.setFixedWidth(50)
self.theme_button.clicked.connect(self.toggle_theme) self.theme_button.clicked.connect(self.toggle_theme)
self.lang_combo = QComboBox() self.lang_combo = QComboBox()
self.lang_combo.setFixedWidth(100) self.lang_combo.setFixedWidth(100)
self.lang_map = {} # lang_code: display_name self.lang_map = {} # display_name: lang_code
for lang in localizer.get_available_languages():
# Попробуем достать из локализации display name (если есть) for lang_code, lang_name in localizer.get_available_languages():
lang_name = localizer.translations.get("__name__", lang) self.lang_map[lang_name] = lang_code
self.lang_map[lang_name] = lang
self.lang_combo.addItem(lang_name) self.lang_combo.addItem(lang_name)
# Устанавливаем текущий язык
current_lang_name = [k for k, v in self.lang_map.items() if v == localizer.lang] # ✅ Устанавливаем текущий язык по индексу
if current_lang_name: for i in range(self.lang_combo.count()):
self.lang_combo.setCurrentText(current_lang_name[0]) item_text = self.lang_combo.itemText(i)
if self.lang_map.get(item_text) == localizer.lang:
self.lang_combo.setCurrentIndex(i)
break
print("localizer.lang", localizer.lang)
self.lang_combo.currentTextChanged.connect(self.change_language) self.lang_combo.currentTextChanged.connect(self.change_language)
theme_layout.addSpacerItem(QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)) theme_layout.addSpacerItem(QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum))