Найти - Пользователи
Полная версия: Как реализовать переключение языка интерфейса в pyqt5
Начало » GUI » Как реализовать переключение языка интерфейса в pyqt5
1
Novator
Доброго времени суток.
Как можно переключать язык программы “на лету”? Читал, что после смены надо обновлять элементы и тексты, это так? И их обновлять все? В чем тогда пользу файлов перевода?
 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()

Оставил в коде только то, что вписывал по язык, найденное везде.
Подскажите, как правильно допилить
Rodegast
 self.retranslateUi(self)
Novator
Rodegast
да, это вроде вписал.
А каким образом реализовать обновление текстов, которые не привязаны к элементам управления?
Например, заголовки таблицы
 _t = QCoreApplication.translate
 self.headers = [
            'Id',
            _t('table', 'Type'),
            _t('table', 'File'),
            _t('table', 'Created'),
            _t('table', 'Modified'),
        ]
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB