localizate patch
This commit is contained in:
parent
8d923d6a6a
commit
8f251dcf91
@ -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()
|
||||||
|
|||||||
@ -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))
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user