PyQt5 QTranslator translate не работает с файлом констант - PullRequest
0 голосов
/ 16 марта 2020

Я пытаюсь выучить pyqt и некоторые mvc паттерны. Я также хотел бы иметь некоторый перевод для моего приложения. Базовые c эксперименты отлично работали, поэтому я попытался реализовать их в своем приложении, но здесь я сейчас борюсь.

Здесь я инициализирую QTranslator:

import sys

from PyQt5.QtCore import QTranslator
from PyQt5.QtWidgets import QApplication

from controller.main_controller import MainController


if __name__ == '__main__':
    KodiDBEditor = QApplication(sys.argv)
    translator = QTranslator(KodiDBEditor)
    translator.load("translate/de_DE.qm")
    KodiDBEditor.installTranslator(translator)
    main = MainController()
    sys.exit(KodiDBEditor.exec_())

Мой контроллер инициализирует представление, собирающее данные из модели:

**snip**
    def init_ui(self):
        self.view.setWindowTitle(self.model.get_title())
        self.view.setGeometry(self.model.get_geometry())
        self.view.create_menus(self.model.get_menu())

В моем представлении у меня есть функция, которая создает меню из словаря, который сам является константой из файла constants.py

**snip**
    def create_menus(self, menu):
        for i in menu:
            fm = self.menuBar().addMenu(i['label'])
            for j in i['action']:
                if j == '---':
                    fm.addSeparator()
                else:
                    action = QAction()
                    action.setParent(self)
                    action.setText(j['label'])
                    action.setIcon(QIcon.fromTheme(j['icon']))
                    action.setShortcut(j['shortcut'])
                    action.setStatusTip(j['statustip'])
                    fm.addAction(action)

constants.py:

from PyQt5.QtCore import QCoreApplication
translate = QCoreApplication.translate

MENU = (
    {'label': translate('MainModel', '&File'), 'action': (
        {'label': translate('MainModel','Export'), 'icon': '', 'shortcut': 'Ctrl+B', 'statustip': translate('MainModel','Export Database')},
        '---',
        {'label': 'E&xit', 'icon': 'application-exit', 'shortcut': 'Ctrl+Q', 'statustip': 'Exit Application'}
    )},
    {'label': '&Settings', 'action': (
        {'label': 'KodiDBEditor', 'icon': '', 'shortcut': '', 'statustip': 'Einstellungen für KodiDBEditor'},
    )},
    {'label': '&Hilfe', 'action': (
        {'label': 'Sub1', 'icon': '', 'shortcut': '', 'statustip': 'Sub1'},
        {'label': 'Sub2', 'icon': '', 'shortcut': '', 'statustip': 'Sub2'},
        {'label': 'Sub3', 'icon': '', 'shortcut': '', 'statustip': 'Sub3'}
    )}

)

Однако эти части не будут переведены. (Я создал файл ts, отредактировал его в QT linguist и собрал файл qm)

Если я поместил какой-нибудь отдельный код, например:

print(translate('MainModel', '&File'))

где-нибудь в моем коде, эта строка будет переведена Также правильно, если поместить константу МЕНЮ прямо в мою модель, все в порядке. Тем не менее, я предпочитаю использовать метод отдельных констант (поскольку их будет больше)

Итак, вопрос в том, почему мой код не переводится как есть?

Согласно запросу, простой рабочий пример (minimal.py):

import sys

from PyQt5.QtCore import QCoreApplication
from PyQt5.QtCore import QTranslator
from PyQt5.QtWidgets import QApplication

from other import Main

translate = QCoreApplication.translate

if __name__ == '__main__':
    KodiDBEditor = QApplication(sys.argv)
    translator = QTranslator(KodiDBEditor)
    translator.load("translate/de_DE.qm")
    KodiDBEditor.installTranslator(translator)
    main = Main()
    sys.exit(KodiDBEditor.exec_())

(other.py):

from PyQt5.QtCore import QCoreApplication
from PyQt5.QtWidgets import QMainWindow

from misc.constants import MENU


class Main(QMainWindow):
    def __init__(self):
        super().__init__()
        self.printstuff()
        self.show()

    def printstuff(self):
        translate = QCoreApplication.translate
        MENU2 = (
            {'label': translate('MainModel', '&File'), 'action': (
                {'label': translate('MainModel', 'Export'), 'icon': '', 'shortcut': 'Ctrl+B',
                 'statustip': translate('MainModel', 'Export Database')},
                '---',
                {'label': 'E&xit', 'icon': 'application-exit', 'shortcut': 'Ctrl+Q', 'statustip': 'Exit Application'}
            )},
            {'label': '&Settings', 'action': (
                {'label': 'KodiDBEditor', 'icon': '', 'shortcut': '', 'statustip': 'Einstellungen für KodiDBEditor'},
            )},
            {'label': '&Hilfe', 'action': (
                {'label': 'Sub1', 'icon': '', 'shortcut': '', 'statustip': 'Sub1'},
                {'label': 'Sub2', 'icon': '', 'shortcut': '', 'statustip': 'Sub2'},
                {'label': 'Sub3', 'icon': '', 'shortcut': '', 'statustip': 'Sub3'}
            )})
        print(MENU)  # tuple holding the menu dicts. strings are not translated, &File = &File
        print(translate('MainModel', '&File'))  # this is working &File = &Datei
        print(MENU2) #this is working as well

constants.py, как указано выше

1 Ответ

0 голосов
/ 16 марта 2020

ОК, похоже, проблема с импортом. Если я импортирую Main (который сам импортирует MENU) после инициализации Qtranslator, все работает. Похоже, что translate () выполняется при импорте. Есть ли способ избежать этого? Прямо сейчас мой обходной путь - вызвать перевод во второй раз, когда текст действия установлен. Выглядит немного странно, но, кажется, работает.

...