Как можно переключать язык программы “на лету”? Читал, что после смены надо обновлять элементы и тексты, это так? И их обновлять все? В чем тогда пользу файлов перевода?
import os import sys from PyQt5.QtWidgets import QMainWindow, QFileDialog, QMessageBox, QApplication, QMenu, QAction, QWidget, QLabel from PyQt5.QtCore import Qt, QPoint, QCoreApplication, QTimer, QEvent, QSize, pyqtSignal, QLocale, QTranslator from PyQt5.QtGui import QIcon, QKeySequence from .mainwindow_ui import Ui_MainWindow import config _t = QCoreApplication.translate class MainWindow (QMainWindow, Ui_MainWindow): language_changed = pyqtSignal(str) def __init__(self): super().__init__() self.setupUi(self) self.app_translator = QTranslator() self.qt_translator = QTranslator() self.load_language_on_start() # Создаем меню для выбора языка self.language_menu = QMenu(_t('MainWindow', 'Change language'), self) # Добавляем действие для выбора английского языка self.english_action = QAction("English", self) self.language_menu.addSeparator() self.english_action.triggered.connect(self.set_english_language) self.language_menu.addAction(self.english_action) # Вставляем меню с выбором языка перед определенным пунктом меню self.menuFile.insertMenu(self.menuSelect_theme.menuAction(), self.language_menu) # Обновляем список файлов перевода self.update_language_menu() # Меняем язык интерфейса self.language_changed.connect(self.on_language_changed) def load_language_on_start(self): # Читаем языковой код из файла JSON language_code = settings.language app_path = os.path.dirname(os.path.abspath(sys.argv[0])) # Загружаем переводчик один раз при инициализации app_locale = os.path.join(app_path, 'locale', f'Fb2Tool_{language_code}.qm') qt_locale = os.path.join(app_path, 'locale', f'qtbase_{language_code}.qm') self.app_translator.load(app_locale) self.qt_translator.load(qt_locale) QApplication.installTranslator(self.app_translator) QApplication.installTranslator(self.qt_translator) def update_language_menu(self): # Получаем путь к папке программы в зависимости от систему # app_path = os.path.dirname(os.path.abspath(sys.argv[0])) app_path = 'd:/test' # Очистим меню перед обновлением, чтобы удалить все существующие пункты self.language_menu.clear() # Добавляем действие для выбора английского языка всегда, даже если перевода нет self.english_action = QAction("English", self) self.english_action.triggered.connect(self.set_english_language) self.language_menu.addAction(self.english_action) # Проверяем наличие файлов перевода для других языков и добавляем соответствующие пункты меню available_languages = ['ru_RU'] # Здесь добавьте языковые коды для доступных переводов for lang_code in available_languages: # Проверяем наличие файла перевода для данного языка app_locale = os.path.join(app_path, 'locale', lang_code}.qm') if os.path.exists(app_locale): action = QAction(QLocale(lang_code).nativeLanguageName(), self) action.triggered.connect(lambda _, lang=lang_code: self.set_language(lang)) self.language_menu.addAction(action) def set_language(self, language_code): self.save_language_to_json(language_code) self.language_changed.emit(language_code) def set_english_language(self): self.set_language('en_US') self.save_language_to_json('en_US') def on_language_changed(self, language_code): # Обновляем переводы приложения self.language_changed.emit(language_code) def save_language_to_json(self, language_code): settings.language = language_code config.save()
Оставил в коде только то, что вписывал по язык, найденное везде.
Подскажите, как правильно допилить