PyQt国际化

3 投票
2 回答
3367 浏览
提问于 2025-04-17 14:51

我可以翻译来自QtDesigner的文本,但对于那些在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 个回答

1

我也刚刚踩了同样的坑。piccy的评论说得很到位。

pylupdate其实就是一个文件解析器。它会查找代码中的tr()translate()这两个字符串。它不会考虑像my_tr_func = translate这样的赋值。

如果你写了

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")

这总比什么都不写要好。

2

在你使用翻译功能之前,需要先加载一个翻译器。你可以用下面这样的代码来做到这一点:

translationFile = "<langfile>.qm"
translator = QtCore.QTranslator()
translator.load(translationFile, "<filepath>")
a.installTranslator(translator)

这里的 a 是“应用程序”对象,你可以用类似下面的代码来创建它:

a = QtGui.qApp.instance()

通常,这个操作是在你的主Python文件中的 if __name__ == '__main__': 这个部分进行的。

撰写回答