PyQt5 QTranslator translate无法使用常量文件



我正在尝试学习pyqt和一些mvc模式的东西。我还想为我的应用程序做一些翻译。基础实验效果很好,所以我试着在我的应用程序中实现它,但现在我很挣扎。

这是我初始化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语言编辑它,并构建了qm文件(

如果我放置一些单一代码,如:

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

在我的代码中的任何位置,该字符串都被正确翻译此外,如果将MENU常量直接放入我的模型中,一切都很好。然而,我更喜欢单独的常数方法(因为会有更多(

所以问题是,为什么我的代码不能按原样翻译?

根据请求,一个简单的工作示例(minimum.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与相同

好的,这似乎是一个导入问题。如果我在Qtranslator初始化后导入Main(它自己导入MENU(,一切都会正常。所以看起来translate((是在导入时执行的。有办法避免这种情况吗?现在,我的解决方法是在设置了操作文本后再次调用translate。看起来有点暴躁,但似乎有效。

最新更新