Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » Как реализовать переключение языка интерфейса в pyqt5 [RSS Feed]

#1 Июль 23, 2023 06:50:25

Novator
Зарегистрирован: 2021-03-22
Сообщения: 45
Репутация: +  0  -
Профиль   Отправить e-mail  

Как реализовать переключение языка интерфейса в pyqt5

Доброго времени суток.
Как можно переключать язык программы “на лету”? Читал, что после смены надо обновлять элементы и тексты, это так? И их обновлять все? В чем тогда пользу файлов перевода?

 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()

Оставил в коде только то, что вписывал по язык, найденное везде.
Подскажите, как правильно допилить

Отредактировано Novator (Июль 23, 2023 14:52:30)

Офлайн

#2 Июль 23, 2023 19:07:07

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2679
Репутация: +  182  -
Профиль   Отправить e-mail  

Как реализовать переключение языка интерфейса в pyqt5

 self.retranslateUi(self)



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#3 Июль 23, 2023 20:55:03

Novator
Зарегистрирован: 2021-03-22
Сообщения: 45
Репутация: +  0  -
Профиль   Отправить e-mail  

Как реализовать переключение языка интерфейса в pyqt5

Rodegast
да, это вроде вписал.
А каким образом реализовать обновление текстов, которые не привязаны к элементам управления?
Например, заголовки таблицы
 _t = QCoreApplication.translate
 self.headers = [
            'Id',
            _t('table', 'Type'),
            _t('table', 'File'),
            _t('table', 'Created'),
            _t('table', 'Modified'),
        ]

Офлайн

  • Начало
  • » GUI
  • » Как реализовать переключение языка интерфейса в pyqt5[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version