2013-02-05 211 views
2

我可以翻译来自QtDesigner的文本,但我无法翻译任何在其外部定义的文本。PyQt国际化

在示例的代码:

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

根据documentation第一个参数是上下文和第二是sourceText。但是当我在QtLinguist中打开我的.ts文件时,它显示上下文是我的sourceTextsourceText是一条评论。不管怎样,在QtLinguist中翻译它之后,我发布了.qm文件,然后运行我的应用程序,但文本不会更改。我只看到通过sourceText,所以在这个例子中它仍然是'True'而不是我翻译的。

我在做什么错?

回答

1

您需要在翻译功能起作用之前加载翻译器。你这样做有如下代码如下:

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

a是“应用程序”对象,你的代码,如创建其中:

a = QtGui.qApp.instance() 

这在的if __name__ == '__main__':块一般都做你的主要的Python文件。

+0

我其实写道,从QtDesigner字符串的翻译作品,他们不会如果我不会加载翻译文件。所以我当然装了它。无论如何,感谢您的努力。 –

+0

我认为可能发生的事情是pylupdate被tr()的重新分配所困惑。我怀疑它认为tr(...)引用QObject.tr(),其中参数与QCoreApplication.translate()中的参数相反。我自己尝试过,发现如果我使用QtCore.QCoreApplication.translate()而不是tr(),它就可以工作。此外,在这种情况下,u'...'符号上的pylupdate扼流圈。我发现只使用'...'就行得通。 – piccy

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

这是聊胜于无。

+0

我不能评论下piccy的评论(没有足够的代表)。关于'u'...''问题,我用编码挣扎了一下,并且我得到了这里的答案(http://stackoverflow.com/questions/28962869/pyqt4-non-ascii-character-detected- in-trutf8-string)相当有帮助。现在我一直使用'tr()'(我不使用'trUtf8()'),我不用'u'前缀字符串,我只是在.pro文件中用'CODECFORTR = UTF-8'。 –

+0

对你来说可能很明显,但值得一提的是,在你的简化例子中,你也可以有'Flag'从'QObject'继承并且有'tr()'方法。 –

+1

只要您使用最新版本的pyqt,就可以使用'u',因为解析器会忽略所有的python字符串前缀。还要注意,你可以通过命令行选项指定'tr','trUtf8'和'translate'的别名(做'pylupdate -help'来查看确切的语法)。 – ekhumoro