gpt4 book ai didi

qt4 - PyQt : translate module strings at runtime

转载 作者:行者123 更新时间:2023-12-04 16:13:55 27 4
gpt4 key购买 nike

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

我可以看到 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() 将尝试翻译一个已翻译的字符串,该字符串不太可能存在于原始语言字符串集中,它会默默地返回字符串本身。

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

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

    最佳答案

    我想你要找的是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__trpylupdate 等以外的别名)选项:
    pylupdate -tr-function FOO file.pro

    关于qt4 - PyQt : translate module strings at runtime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29035273/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com