pyqt多國語言

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.ts
lrelease-qt4 plabel_zh_CN.ts

然後執行代碼, 程序按照我們期望的方式翻譯過來了, 是不是很簡單?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章