字符串在QObject
s 在运行时翻译。如果翻译器发生变化,所有这些字符串都会刷新。但是,在模块级别声明的字符串甚至静态类属性都会在导入时进行翻译。
我可以看到 3 种允许翻译模块字符串的方法,但其中没有一种让我完全满意:
安装翻译器后导入模块(请参阅here https://plashless.wordpress.com/2014/02/01/internationalizing-python-pyqt-apps/(段落尽早安装翻译器))。这可能不太方便,但是是可行的,只要不需要在运行时更改语言即可。
制作字符串类实例属性。嗯...是的,显然。但这破坏了设计。
-
将字符串保留在模块级别。使用QtCore.QCoreApplication.translate()
让 pylupdate 获取它们。然后在运行时通过调用(再次)翻译它们self.tr()
or QtCore.QCoreApplication.translate()
在他们。例子 :
translate = QtCore.QCoreApplication.translate
strings = [translate('foo'), translate('bar')]
class my_class(QObject):
def __init__(self):
for s in strings:
print(self.tr(s))
执行此操作时,必须确保在模块导入之前不会安装翻译器,否则,模块字符串会在导入时(声明中的 translate())进行翻译,并在运行时(类实例中的 self.tr())重新翻译。在一般情况下,这不会被看到: self.tr() 将尝试翻译一个已经翻译的字符串,该字符串不可能存在于原始语言字符串集中,并且它将默默地返回字符串本身。
但是,如果英语字符串碰巧翻译成法语字符串,并且该法语字符串与同一类中出现的另一个英语字符串相同,则将显示该字符串的法语翻译。
有没有一种干净的方法可以做到这一点?
我想你正在寻找的是QT_TR_NOOP http://doc.qt.io/qt-4.8/qtglobal.html#QT_TR_NOOP (or QT_TRANSLATE_NOOP http://doc.qt.io/qt-4.8/qtglobal.html#QT_TRANSLATE_NOOP如果您需要提供上下文)。
这会将字符串文字标记为需要翻译(即,以便由pylupdate
),但它不会在运行时(也不导入时)进行任何翻译。
Thus:
from PyQt4.QtCore import QT_TR_NOOP
some_string = QT_TR_NOOP('Hello World')
class SomeClass(QObject):
def do_something(self):
print(self.tr(some_string))
The tr()
这里会翻译some_string
在运行时动态地运行,但它本身会被忽略pylupdate
因为它不包含字符串文字。
注意QT_TR_NOOP
可以是该名称的别名tr
在 python 中(或者你可以定义你自己的虚拟tr
函数),因为pyludate
只进行静态分析:
from PyQt4.QtCore import QT_TR_NOOP as tr
some_string = tr('Hello World')
您还可以使用真正的别名(即除tr
, translate
, __tr
等),通过使用相应的pylupdate
option:
pylupdate -tr-function FOO file.pro
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)