PyQt国际化

3

我可以翻译来自QtDesigner的文本,但无法翻译其定义之外的任何内容。

例如,此代码:

from PyQt4.QtCore import QCoreApplication
tr = QCoreApplication.translate


class Flag(object):

    def __init__(self, name):

        self._name = name
        self._setting_events = []
        self._clearing_events = []
        self._toggle_events = []
        self._true_name = tr("Flags", u'True')
        self._false_name = tr("Flags", u'False')

根据文档,第一个参数是上下文,第二个参数是源文本。但是当我在QtLinguist中打开我的.ts文件时,它显示上下文源文本,而源文本是注释。不管怎样,在QtLinguist中翻译后,我发布了.qm文件并运行我的应用程序,但文本没有变化。我只看到已传递的源文本,因此在这个例子中仍然是'True'而不是我翻译的内容。
我做错了什么?
2个回答

2

在使用翻译函数之前,您需要加载一个翻译器。您可以通过以下代码实现:

translationFile = "<langfile>.qm"
translator = QtCore.QTranslator()
translator.load(translationFile, "<filepath>")
a.installTranslator(translator)
a 是 "app" 对象,你可以通过以下代码创建它:
a = QtGui.qApp.instance()

通常这是在你的主要Python文件的if __name__ == '__main__':块中完成的。


1
我实际上写过QtDesigner中字符串的翻译,如果我不加载翻译文件,它们将不起作用。所以我当然会加载它。无论如何,感谢你的努力。 - Rafał Łużyński
我认为可能发生的情况是 pylupdate 被 tr() 的重新赋值所困惑了。我怀疑它认为 tr(...) 是指 QObject.tr(),其中参数与 QCoreApplication.translate() 中的相反。我自己尝试了一下,发现如果使用 QtCore.QCoreApplication.translate() 而不是 tr(),它就可以工作了。此外,在这种情况下,pylupdate 会对 u'...' 表示法产生错误。我发现只使用 '...' 就可以了。 - piccy

1

我刚刚也掉进了同样的陷阱。上面piccy的评论已经说明了一切。

pylupdate只是一个文件解析器。它会搜索字符串中的和。但是,它会忽略类似于这样的赋值语句。

如果你写

my_tr_func = translate
text = my_tr_func("Context", "Source text")

您的字符串将被忽略。

这里的诀窍是您使用了 tr() 作为别名,而不仅仅是任何字符串,并且 pylupdate 没有将其忽略,而是误认为它是 QObject tr() 方法并相应地解析其参数。

对此,除非您打补丁修补 pylupdate,否则没有太多可以做的。

请注意,显然您可以编写

translate = QtCore.QCoreApplication.translate
text = translate("Context", "Source text")

比起没有,这总比好些。


我不能在piccy的评论下发表评论(声望不够)。关于u'...'问题,我在编码方面遇到了一些困难,我在这里得到的答案非常有帮助。现在我一直使用tr()(不使用trUtf8()),我不会在我的字符串前加上u,我只是在.pro文件中全局指定编码为CODECFORTR = UTF-8 - Jérôme
对你来说可能很明显,但值得一提的是,在你的简化示例中,你也可以让Flag继承自QObject并拥有tr()方法。 - Jérôme
1
只要您使用的是pyqt的最新版本,使用u是可以的,因为解析器将忽略所有Python字符串前缀。还请注意,您可以通过命令行选项为trtrUtf8translate指定别名(执行pylupdate -help以查看确切的语法)。 - ekhumoro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接