2013-08-21 65 views
2

「動態」的字符串要允許一個Python插件的國際化的QGIS,我使用QCoreApplication.translate()這樣的:請告訴我正確的方式來翻譯PyQt的

message = QCoreApplication.translate('Multipart split',"No multipart features selected.") 

我如何可以準備一個動態字符串,像下面,

message = "Splited " + str(n_of_splitted_features) + " multipart feature(s)" 

翻譯,而不需要打破每個子字符串,這樣

message = QCoreApplication.translate('Multipart split','Splited ') + str(n_of_splitted_features) + QCoreApplication.translate('Multipart split', 'multipart feature(s)') 

這似乎不是最好的選擇。

我發現,在C++中使用tr().arg(),一個能做到這一點:

statusBar()->showMessage(tr("Host %1 found").arg(hostName)) 

但我無法用Python複製。

回答

2

嘗試在tr方法的結果format命令:

statusBar().showMessage(tr("Host {0} found").format(hostName)) 

ts文件翻譯也應該包含{0}字符串。

編輯:在Python 2.7中,只需鍵入{}而不需要0

+0

感謝您的回答。不幸的是tr方法不被認可這就是爲什麼我使用QCoreApplication.translate()。我會嘗試使用{}並在其中格式化。 –

+0

「...你可以簡單地輸入'{}'而不用0」。 **沒有。絕對不要這樣做。**用於國際化的參數應該總是顯式編號(例如,「{0}」而不是「{}」)。爲什麼?因爲非英語語言可能會以不同的順序插入參數,在這種情況下,隱式編號的「{}」樣式參數將不可翻譯。有關演示兩個英語和挪威語句子之間差異的現實示例,請參見[*「使用編號參數」。*](https://doc.qt.io/qt-5/i18n-source-translation.html#使用數字參數) –

1

我自己找到了解決方案,也許對別人有用。

message = QCoreApplication.translate('Multipart split', "Splited %d multipart feature(s)") %(n_of_splitted_features) 
+1

有些年份遲了 - 您的答案几乎是*弗羅頓所建議的,應該已被接受。事實上,如果你遵循[編碼風格](https://www.python.org/dev/peps/pep-3101/),你應該使用他的建議,如下所示:'message = QCoreApplication.translate('Multipart分割','分割{0}多部分特徵',格式(n_of_splitted_features))'。 – iled

+2

確實。多年以後,我的蟒蛇技能有所提高,現在我能夠識別你說的話。謝謝。正義已經完成。 –

+0

其實,這個答案可以說是最好的解決方案。爲什麼?因爲'QObject.tr()'被設計破壞了,而'QCoreApplication.translate()'是* not *。 Riverbank自己[強烈建議](http://pyqt.sourceforge.net/Docs/PyQt5/i18n.html#differences-between-pyqt5-and-qt)使用後者:「PyQt5的行爲不令人滿意,可能會改變**建議'translate()'優先於'tr()'使用**。這可以保證與當前和未來的PyQt5版本一起工作,並且可以更容易地共享消息文件Python和C++代碼「。 –

相關問題