【问题标题】:PyQt: translate module strings at runtimePyQt:在运行时翻译模块字符串
【发布时间】:2015-03-13 14:48:51
【问题描述】:

QObjects 中的字符串在运行时进行翻译。如果更改了翻译器,所有这些字符串都会被刷新。但是,在模块级别声明的字符串甚至是静态类属性,都会在导入时进行翻译。

我可以看到 3 种允许翻译模块字符串的方法,但没有一种方法让我完全满意:

  • 安装翻译器后导入模块(见here(段落尽早安装翻译器))。这可能不方便,但可行,只要不需要在运行时更改语言。

  • 使字符串类实例属性。嗯……是的,很明显。但这破坏了设计。

  • 将字符串保留在模块级别。使用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() 将尝试翻译一个已翻译的字符串,该字符串不太可能存在于原始语言字符串集中,它会默默地返回字符串本身。

    但是,例如,如果一个英语字符串恰好翻译成一个法语字符串,该字符串等于另一个出现在同一类中的英语字符串,那么将显示该字符串的法语翻译。

有没有一种干净的方法?

【问题讨论】:

    标签: qt4 pyqt4 translation


    【解决方案1】:

    我认为您正在寻找的是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 在 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
    

    【讨论】:

    • 谢谢(再次),ekhumoro。我现在无法测试,但你是对的。这就是方法。我已经为此苦苦挣扎了一段时间,并且陷入了死胡同。很高兴我问了。
    • 当我使用QT_TR_NOOP 时,字符串出现在.ts 文件中的上下文@default 中,我不知道如何在运行时使用它。所以我使用ST_TRANSLATE_NOOP,指定一个上下文(任何字符串),然后在我调用runtime QtCore.QCoreApplication.translate,指定与上下文相同的字符串。
    猜你喜欢
    • 2017-07-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-07
    • 1970-01-01
    • 1970-01-01
    • 2013-05-01
    • 1970-01-01
    • 2010-10-23
    相关资源
    最近更新 更多