PyQt:在运行时翻译模块字符串

PyQt: translate module strings at runtime

QObject 中的字符串在 运行 时翻译。如果翻译器发生变化,所有这些字符串都会被刷新。但是,在模块级别甚至静态 class 属性声明的字符串在导入时被翻译。

我可以看到 3 种允许翻译模块字符串的方法,none 我似乎完全满意:

有没有一种干净的方法可以做到这一点?

我想你要找的是 QT_TR_NOOP (or 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 可以作为 python 中名称 tr 的别名(或者您可以定义自己的虚拟 tr 函数),因为 pyludate 只做静态分析:

from PyQt4.QtCore import QT_TR_NOOP as tr

some_string = tr('Hello World')

您还可以使用相应的 pylupdate 选项来使用真正的别名(即 trtranslate__tr 等以外的别名:

pylupdate -tr-function FOO file.pro