目 了 個 錄
- 寫在前面
- 基本步驟
- 修改GUI代碼
- 創建語言檔案
- 使用Qt語言家進行翻譯
- 修改程式
- 疑難雜癥解決
- 推薦閱讀
- 選讀
- 請求大佬補充、指出不足
- 歡迎愛好者/新手提問、指出不足
寫在前面
本文編纂于 2021年2月 ,由于大家很少會用到Pyqt的多語言,此時網上的資訊大部分比較陳舊,且對像我這樣的外行不友好,故有此文,
基本步驟
修改GUI代碼
在要被翻譯的字串上用tr()方法括起來:

需要注意以下幾點:
- 不需要翻譯的字串不需要使用tr()來包裹;
- 上圖self指的是包含需要翻譯文字的類(實體),我的是主視窗:

- 有關tr()的小知識:

tr()是PyQt5.QtCore.QObject的方法,很多東西都繼承自QObject,包括QWidget,可以參考官方檔案(官方檔案是個極好的東西), - 一般源程式代碼中的內容都使用英文為佳,能夠避免很多麻煩:

比如,tr()包裹的內容中如果出現中文,會出現這樣的問題:

“棒打鷓鴣”在Qt語言家里成了亂碼,并且最后制作出來的語言包這一句不會生效(語言包和程式匹配不成功):

Unicode代碼也有類似的問題:

好家伙,Qt語言家中特殊字符的斜杠直接消失(普通的轉義可以用):

程式效果:

所以在寫源程式的時候盡量避免這兩種東西吧,我突然覺得自己重新寫一遍可能比這好用,
創建語言檔案
在CMD或者PowerShell中使用類似命令即可安裝pyqt5-tools(記得給PIP換源或者科學上網):
pip install pyqt5-tools
在CMD或者PowerShell中使用類似命令生成翻譯的源檔案(*.ts):
pylupdate5 檔案名.py -ts zh_CN.ts
其中檔案名指的是剛剛使用了tr()的代碼檔案;zh_CN.ts是輸出的檔案,可以使用Qt語言家打開:

如圖,Qt語言家與Qt設計師在同一個目錄下,具體安裝位置不一定,請自行探索,
需要注意的不多,親測以下流程可以:

而這樣并不可以:

使用Qt語言家進行翻譯
有手就行,不多解釋:

記得時常保存:

點擊發布即可得到下一步需要的*.qm檔案:

修改程式
在實體化QApplication的那個檔案參考:
from PyQt4.QtCore import QTranslator
最簡單的用法可以這樣:
trans = QTranslator()
trans.load('zh_CN')
app.installTranslator(trans)
也可以這樣:
trans = QTranslator()
trans.load('./src/lang/zh_CN.qm')
app.installTranslator(trans)
使用很靈活(見官方檔案),
需要注意的是,(在最簡單的使用中)這三行代碼需要在app = QApplication(sys.argv)之后、翻譯的視窗實體化之前進行,
至此,翻譯的簡單使用到此為止了,
更多高級的用法可以參考推薦閱讀1中更詳細的內容,
疑難雜癥解決
- 實際上,trans.load()會回傳一個bool型別的資料,表示載入是否成功,如果載入不成功,可以嘗試換一下檔案的路徑,
- 如果載入成功了界面卻沒有翻譯成功,可能有以下幾個原因:
①忘記app.installTranslator()這種顯而易見的問題,可能性不大;
②有一個比較大的坑,就是翻譯的UI檔案里的類如果被繼承了才使用,需要對*.ts檔案進行一些手動修改,我的繼承關系如圖:

這個mainWindow類處在被翻譯的檔案里,也是包含被翻譯內容的類:

因此,生成的*.ts檔案里前幾行是這樣的:

其中標紅的就是類名;而我對它又繼承了一遍,以便于將業務邏輯層分開:

所以,.ts里的類名需要修改成最終被實體化的那個類名:


我使用了EmEditor對.ts檔案進行修改,防止中文被編成亂碼,
其實直接修改這個檔案也能很容易地實作多視窗的翻譯,
推薦閱讀
- Pyqt5在程式中動態修改多界面的語言(英語轉中文或者中文轉英語)
- 將pip源更換到國內鏡像
選讀
- Qt國際化(原始碼含中文時)的點滴分析
請求大佬補充、指出不足
歡迎愛好者/新手提問、指出不足
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/259977.html
標籤:AI
