QObject
s中的字符串在运行时转换。如果更改了翻译器,则将刷新所有这些字符串。但是,在导入时会翻译在模块级别甚至静态类属性中声明的字符串。
我可以看到三种允许模块字符串被翻译的方法,但我似乎都不满意:
在安装翻译器之后导入模块(请参阅此处(请参见“早期安装翻译器”一节))。只要可能不需要在运行时更改语言,这可能并不方便,但却是可行的。
设置字符串类实例属性。好吧,是的,显然。但这破坏了设计。
将字符串保持在模块级别。使用QtCore.QCoreApplication.translate()
让他们通过pylupdate被拾起。然后在运行时通过调用self.tr()
或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(或QT_TRANSLATE_NOOP如果您需要提供上下文)。
这会将字符串文字标记为需要翻译(即,使之被拾取pylupdate
),但在运行时(也不导入时间)不进行任何翻译。
因此:
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))
在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
选项:
pylupdate -tr-function FOO file.pro
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句