天天看點

PyQt 語言國際化

PyQt4 語言國際化

使用

pylupdate4

将界面的py檔案轉成ts檔案。

進入py檔案所在目錄,執行轉換指令。

/d/python27/Lib/site-packages/PyQt4/pylupdate4 ui_main.py -ts zh_CN.ts           

複制

得到

zh_CN.ts

檔案。這個檔案本質上是xml檔案。

當界面的py檔案修改時,運作

pylupdate4

生成ts不會破壞原ts的翻譯。

用Qt語言家(Linguist)打開

zh_CN.ts

檔案。可以對相應的字元串進行翻譯。

點選“釋出”可獲得

zh_CN.qm

檔案。這就是qt的語言資源檔案,是一個二進制檔案。

建立app時,先加載語言資源檔案

zh_CN.qm

if __name__ == '__main__':
    configs.init_configs()  # 确定語言配置
    app = QApplication(sys.argv)
    trans = QTranslator()  # Setup locale, we need .qm files
    if configs.g_locale_type == configs.LOCALE_ZH_CH:
        trans.load("res/locale/zh_CN")  # No need suffix .qm
        app.installTranslator(trans)

    main_d = FAMainWindow()
    main_d.show()
    sys.exit(app.exec_())
           

複制

App運作中切換語言

在程式運作時,我們可以選擇目前顯示的語言。不需要重新啟動程式即可完成切換。

準備語言資源檔案

以英文和簡體中文為例,想要切換語言,需要這2種語言包

$ /d/python27/Lib/site-packages/PyQt4/pylupdate4 ui_main.py -ts zh_CN.ts
$ /d/python27/Lib/site-packages/PyQt4/pylupdate4 ui_main.py -ts en.ts           

複制

借助Qt語言家釋出得到

en.qm

zh_CN.qm

這2個檔案,放在

res/locale

目錄裡

在UI上設定觸發切換語言

界面上需要按鈕或菜單欄的action;需要持有

QTranslator

self.trans = QTranslator()  # 初始化時擷取 QTranslator
    self._init_trans()
    # 添加了action來觸發切換動作
    self.connect(self.ma.actionEnglish, SIGNAL("triggered()"), self._trigger_english)
    self.ma.action_ZhCN.triggered.connect(self._trigger_zh_cn)

def _init_trans(self):
    ctx.read_locale_config()  # 自定義的方法,用來讀取json檔案中的配置
    if ctx.g_locale_type == ctx.LOCALE_ZH_CH:
        self._trigger_zh_cn()
    elif ctx.g_locale_type == ctx.LOCALE_EN:
        self._trigger_english()

def _trigger_english(self):
    print "[MainWindow] Change to English"
    self.trans.load("res/locale/en")
    _app = QApplication.instance()  # 擷取app執行個體
    _app.installTranslator(self.trans)
    self.ma.retranslateUi(self)
    ctx.change_to_en()  # 将新的配置更新入json檔案中

def _trigger_zh_cn(self):
    print "[MainWindow] Change to zh_CN"
    self.trans.load("res/locale/zh_CN")
    _app = QApplication.instance()
    _app.installTranslator(self.trans)
    self.ma.retranslateUi(self)
    ctx.change_to_zh_cn()           

複制