2013-02-05 278 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