2010-02-28 26 views
3

我正在使用pyqt設計師。我已經在我的self.tr()+ pylupdate4應用程序翻譯所有的字符串和lrelease,即可在QDialogBu​​ttonBox中翻譯standardButton

這裏的代碼片斷在我的main():

app = QtGui.QApplication(sys.argv) 
app.setApplicationName('Mental Calculation') 

# initialize locale and load translation files if available 
locale = QtCore.QLocale() 
LOCALENAME = str(locale.system().name()) 
translator = QtCore.QTranslator() 
translator.load("mentalcalculation_%s" % LOCALENAME) 
app.installTranslator(translator) 

我使用QDialogBu​​ttonBox了QDialogQtGui.QDialogBu​​ttonBox.CancelQtGui.QDialogBu​​ttonBox.Ok

並在這些按鈕的字符串沒有翻譯。因爲pylupdate4確實爲他們挑選了任何字符串。

我錯過了我的應用程序中的配置步驟,以便它們被翻譯? 我不明白如何爲標準按鈕的QDialogBu​​ttonBox字符串應該被翻譯,並找不到相關的文檔。

回答

8

使用下面的方法來設置按鈕的文字:

buttonBox->button(QDialogButtonBox::Ok)->setText(tr("Ok")); 
buttonBox->button(QDialogButtonBox::Cancel)->setText(tr("Cancel")); 

然後lupdate的.ts文件,用語言學家打開它,你會發現琴絃。

+1

+1這個小小的討厭的解決方法。謝謝。 – fmuecke 2011-01-02 17:26:14

+0

非常好。謝謝 – solsTiCe 2011-10-13 11:03:58

0

docs開始,您必須在應用程序小部件之前創建翻譯器對象。我不能確定這是你的問題,因爲你在創建你的小部件的地方省略了代碼,但要確保你不會在翻譯器之前創建它們。

-1

是的。就在我給出的片段下面,我創建了我的主對話框。

問題是Qtranslator無法翻譯那些QDialogBu​​ttonBox按鈕,因爲沒有要翻譯的字符串。所以它必須是內部完成這項工作的qt。或者我不知道的一些機制。

這裏被pyuic4

self.buttonBox = QtGui.QDialogButtonBox(Dialog) 
self.buttonBox.setOrientation(QtCore.Qt.Horizontal) 
self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok) 
self.buttonBox.setObjectName("buttonBox") 
self.gridLayout.addWidget(self.buttonBox, 8, 0, 1, 1) 

生成的代碼片段另一個時如何有代碼中沒有串QtGui.QDialogBu​​ttonBox.Cancel字符串可以轉化???

是因爲我沒有創建一個主窗口,只使用QDialog?

我不能評論swanson答案!

+0

啊,它看起來像你可以通過添加你自己的取消和確定按鈕來解決問題,而不是使用'setStandardButtons()' – swanson 2010-03-01 17:24:22

+0

是的。我拒絕使用該解決方法。因爲這些按鈕在平臺更改時是交換位置的。但它似乎是我唯一的選擇。 – solsTiCe 2010-03-01 21:03:22

2

我終於找到了做什麼: 從http://qt.nokia.com/developer/faqs/faq.2008-05-06.6265952148http://qt.nokia.com/developer/faqs/705

,所以我只需要拷貝,例如法國人,qt_fr.qm我QTDIR /譯(這裏的/ usr /股發現/ QT /譯)到我的應用程序的目錄,並添加

translator.load("qt_%s" % LOCALENAME) 

甚至複製所有的QT _ *。QM文件從QTDIR /譯真正支持最大的語言環境。

沒有這個工作。只有兩個文件中的一個正在加載。所以我不能有我的字符串翻譯或QDailogBu​​ttonBox。

該死的。這件事情讓我很緊張。

+0

所以我手動合併部分qt_fr.ts文件到我的ts文件中。嘆息... 這是怎麼可能的?沒有人使用這個或什麼?至少在Qt中。 – solsTiCe 2010-03-06 17:56:48

+2

填補這個http://bugreports.qt.nokia.com/browse/QTBUG-8798的錯誤報告後,我終於得到它應該的方式: 「一個QTranslator只是一個TS文件的表示。你需要在QApplication對象中安裝多個翻譯器,常見問題解答條目是錯誤的,並且會被修復。「 – solsTiCe 2010-03-08 20:52:32

2

你應該安裝2個不同譯者:

app = QtGui.QApplication(sys.argv) 

translator_my = QtCore.QTranslator() 
translator_my.load('i18n/i18n_' + QtCore.QLocale.system().name() + '.qm') 
#translator_my.load('i18n/i18n_ru_Ru.qm') 
app.installTranslator(translator_my) 

translator_qt = QtCore.QTranslator() 
translator_qt.load('i18n/qt_' + QtCore.QLocale.system().name()[:2] + '.qm') 
#translator_qt.load('i18n/qt_ru.qm') 
app.installTranslator(translator_qt) 

myApp = MyMainWindow() 
myApp.show() 
sys.exit(app.exec_()) 

其中的i18n/i18n_ru_Ru.qm是通向你的i18n文件,qt_ru.qm從USR /股/ QT4 /譯複製(在我的情況) 。

3

爲了加載從QT的本地轉譯在便攜式的方式,你可以使用下面的函數調用:

translator.load("qt_" + QLocale::system().name(),QLibraryInfo::location(QLibraryInfo::TranslationsPath)); 

兩個(或更多)的翻譯如前所述,是如果你的標準方法想避免解決方法。