PyQt国际化
我可以翻译来自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__':
这个部分进行的。