qt在設計的時候就考慮到了多國語言應該如何處理, 原理以及使用方法很簡單. 如下:
第一步: 寫代碼的時候, 對於需要翻譯的詞語, 用tr()包起來, 比如:
QPushButton hello(QPushButton::tr("Hello world!"));
這樣qt就知道這些詞語是需要翻譯的了. 然後qt需要把這些詞語取出來, 放到一個檔案裡面去, 好進行下一步的翻譯工作.
在你的pro檔案裡面說明這個檔案的名稱:
TRANSLATIONS = clabel_zh_CN.ts
這樣就可以利用lupdate這個工具來把需要翻譯的詞語取出來:
lupdate-qt4 clabel.pro
然後, 我們就可以開始翻譯工作了. qt提供了一個配套的翻譯工具: linguist:
linguist-qt4 clabel_zh_CN.ts
其實ts檔案是xml的格式, 你想直接編輯文本也是可以的.
當做完翻譯工作之後, 我們需要把ts檔案編譯一下, 方便程式使用:
lrelease-qt4 clabel_zh_CN.ts
這樣就會產生clabel_zh_CN.qm. 最後, 在代碼裡面加上選擇語言的代碼:
QTranslator trans;trans.load("clabel_zh_CN");app.installTranslator(&trans);QPushButton hello(QPushButton::tr("Hello world!"));hello.show();app.exec();
qt多國語言更詳細的介紹在: http://doc.qt.nokia.com/4.6/i18n-source-translation.html pyqt下面如何?多國語言
pyqt裡面實現的過程和qt裡面的類似, 只是因為第一步需要掃描的不是c++代碼, 所以需要利用一個pyqt的工具: pylupdate4, 用法和lupdate一樣.
首先寫程式
trans = QTranslator()trans.load('plabel_zh_CN')app.installTranslator(trans)button = QPushButton(tr("hello world!"))button.show()
等等, 裡面的tr是什麼?
def tr(msg): return QCoreApplication.translate("@default", msg)
qt翻譯是根據類的名稱來走的, 調用了什麼類的tr, 就取這個類裡面設定的翻譯.
qt裡面是可以利用QObject::tr來翻譯, 但是pyqt裡面不能,pylupdate4隻是做字串尋找, 看有什麼字串是在tr後面的, 然後根據tr調用者來把這個詞語歸類, 如果沒有調用者, 就把它歸類到 "@default" 裡面. 於是我就只好利用上面的方法來做一個規避..有點噁心, 看看以後是否會有更好的方法來處理.
對於類裡面的翻譯, 不需要那麼麻煩:
class Input(QWidget): def __init__(self): super(Input, self).__init__() label = QLabel(self.tr("input:"))
這裡面的tr, 就可以被正確翻譯出來.
然後運行pylupdate, 因為我們是python程式, 沒有pro, 就只能手動指定檔案了
pylupdate4 main.py -ts plabel_zh_CN.ts
好了, 下面的步驟和c++的方法一樣
linguist-qt4 clabel_zh_CN.tslrelease-qt4 plabel_zh_CN.ts
然後執行代碼, 程式按照我們期望的方式翻譯過來了, 是不是很簡單?