您好,登錄后才能下訂單哦!
----------------------------------------------------------------
----------------------------------------------------------------
網頁版課程源碼 提取碼:1uy7
--------------------------------------------------------------
引言
----------------------------------------------------------------
??? 如果我們開發的產品是提供給國外用戶的,這就涉及到中英文問題。比如:如果需要把產品給國外用戶使用,就可能使用英文界面;如果提供給國內用戶,就需要使用中文界面。這就帶來一個問題,一套界面兩種語言。這該怎么辦呢?別急,Qt提供了國際化方案來解決這個問題。
?
正文
----------------------------------------------------------------
??? Qt的方案稱作國際化。其實也很簡單:把所有需要翻譯的文本放到類中,然后需要提供一個中英文對照的翻譯文件(.qm),最后在程序啟動時加載這個翻譯文件就可以了。
??? 我們看一下詳細步驟:
??? 1)? 在ui或代碼中使用英文。
??? 2)? 在提供翻譯的類中使Q_OBJECT。
??? 3)? pro中添加TRANSLATIONS
??? 4)? 使用lupdate命令,提取待翻譯內容到.ts文件。
??? 5)? 添加中英文對照翻譯,并用linguist導出為翻譯文件(.qm文件)。
??? 6)? 程序啟動時加載.qm文件。
?
??? 下面,我們分步驟詳細介紹。
Step 1, 在ui或代碼中使用英文
??? 首先,我們在繪制ui文件時或者是在編碼時使用英文。在編程時需要調用所在類的tr()接口。
1.??? | m_pLabel2->setText(tr(“this is translated ? by source code”)); |
??? tr()接口是QObject類提供的,所以這個類要從QObject派生。如果待翻譯的文本串所在的類不是從QObject派生,那么請使用從QObject派生的類來調用tr()接口。具體方法在后續章節介紹,這里我們先介紹最基本的用法。
?
Step 2, 在提供翻譯的類中使Q_OBJECT
??? 如果需要我們的類提供翻譯功能,除了讓他從QObject派生,還需要使用Q_OBJECT宏。
??? 假設我們的類名為CDialog,那么需要在類定義開頭添加Q_OBJECT宏:
?
代碼清單03-01-01
1.?? ? ? 2.?? ? ? 3.?? ? ? 4.?? ? ? 5.?? ? ? 6.?? ? ? 7.?? ? ? 8.?? ? ? | class CDialog : public QDialog{ ??? Q_OBJECT public: ??? CDialog(QWidget* ? pParent); ??? ~CDialog(); private: ?? ? Ui::CDialog ui; }; |
??? 如果不添加Q_OBJECT宏,使用lupdate命令抽取ts文件時將會報錯:
lupdate ks03_01.pro3_01 dialog.cpp:7: ? Class 'CDialog' lacks Q_OBJECT macro Updating 'ks03_01.ts'... |
??? 上述錯誤信息的含義是:類CDialog缺少Q_OBJECT宏。
?
Step 3, pro中添加TRANSLATTIONS
??? 在ks03_01.pro中添加如下內容:
1.?? ? ? | TRANSLATIONS ? += ks03_01.ts |
??? ks03_01.ts是利用lupdate命令抽取的ts文件名。當然也可以帶路徑:
1.?? ? ? | TRANSLATIONS += $$TRAIN_SRC_PATH /translations/ks03_01.ts |
??? 表示將抽取得到的ts文件放到項目的src/translations子目錄下,抽取的文件名為ks03_01.ts。
?
Step 4, 使用lupdate命令,提取待翻譯內容到.ts文件
??? 執行lupdate命令,讀取pro中的配置并且讀取源代碼文件,將待翻譯內容抽取到ts文件:
lupdate ? ks03_01.pro |
??? 請注意,務必在ks03_01.pro中配置TRANSLATIONS配置項,否則上述命令將執行失敗。而且待翻譯類必須使用Q_OBJECT宏。
?
Step 5,? 添加中英文對照翻譯,并用linguist導出為翻譯文件
??? 抽取完ts文件后,使用linguist界面打開ts文件,手工添加翻譯內容,然后導出為qm二進制文件。
??? 添加翻譯時,請將翻譯后的文本寫在:”Translation to 簡體中文(中國)”下面的文本編輯框內(如圖03_01_01)。
圖03_01_01
??? 請注意,對標點符號也要一一翻譯。
??? 完成一個翻譯項后,請將”源文”前面的問號(圖03_01_02中虛線位置)改為“√”(鼠標左鍵單擊)。
圖03_01_02
??? 您也可以查看左側“上下文”框中的內容,檢查是否還有未翻譯的項目(前面帶“?”,翻譯完成后的應該帶”√”)。
??? 完成所有翻譯后,請將ts文件發布為.qm文件。方法是選擇菜單中的“另外發布為”。然后選擇發布目錄即可。
??? 比如,我們可以將.qm文件發布到 $$(PRJROOT)/system/lang目錄下。
?
Step 6,? 程序啟動時加載.qm文件
??? 我們在main()函數或其他合適的位置加載qm文件。
1,包含所需的頭文件
1.?? ? ? 2.?? ? ? 3.?? ? ? | #include ? <QApplication> #include ? <QTranslator>? // 國際化 #include ? <QLibraryInfo> // 國際化 |
?
2,加載Qt自身的翻譯文件
Qt自身也提供了一個翻譯文件,用來實現Qt提供的類的翻譯功能。
代碼清單03-01-02
1.?? ? ? 2.?? ? ? 3.?? ? ? 4.?? ? ? 5.?? ? ? 6.?? ? ? 7.?? ? ? 8.?? ? ? 9.?? ? ? 10.? | // 安裝qt自帶的中文翻譯 const QString localSysName ????????????????????? = ? QLocale::system().name();// 獲取本機系統的語言環境 QScopedPointer<QTranslator> ? qtTranslator(new QTranslator(QCoreApplication::instance())); if ? (qtTranslator->load(QStringLiteral("qt_") + localSysName, ??? QLibraryInfo::location(QLibraryInfo::TranslationsPath))) { ??? ? QCoreApplication::installTranslator(qtTranslator.take()); } |
?
3,加載項目自己的翻譯文件
代碼清單03-01-03
1.?? ? ? 2.?? ? ? 3.?? ? ? 4.?? ? ? 5.?? ? ? 6.?? ? ? 7.?? ? ? 8.?? 9.? ?? 10.? | QString strPath = ? qgetenv("TRAINDEVHOME");? // 獲取環境變量所指向的路徑 strPath += "/system/lang";?????? // ? $TRAINDEVHOME/system/lang/ks03_01.qm QScopedPointer<QTranslator> ? gpTranslator(new QTranslator(QCoreApplication::instance())); if (gpTranslator->load("ks03_01.qm", ? strPath)) { ???? QCoreApplication::installTranslator(gpTranslator.take()); } |
?
請注意:
??? 我們可以在自己的ts文件中編寫Qt類的翻譯內容哦。比如QMessageBox的“OK”"Cancel"按鈕,我們都可以通過這種方式處理為顯示中文的按鈕。如果我們從designer種拖出QDialogButtonBox(帶OK、Cancel)按鈕,那么翻譯時需要注意,在ts文件中手工添加如下內容:
代碼清單03-01-04
1.?? ? ? 2.?? ? ? 3.?? ? ? 4.?? ? ? 5.?? ? ? 6.?? ? ? 7.?? ? ? 8.?? ? ? 9.?? ? ? 10.? ?? 11.? ?? 12.? ?? 13.? ?? 14.? ? 15.? | <context> ??? ? <name>QPlatformTheme</name> ??? ? <message> ??????? ? <location filename="../src/widgets/qdialogbuttonbox.cpp" ? line="+42"/> ??????? ? <location line="+18"/> ??????? ? <source>OK</source> ??????? ? <translation>確定</translation> ??? ? </message> ??? ? <message> ??????? ? <location line="+54"/> ??????? ? <source>Cancel</source> ??????? ? <translation>取消</translation> ??? ? </message> </context> |
??? 這時因為在Qt的源代碼里,為QDialogButtonBox的按鈕進行翻譯時,實際使用了QPlatformTheme,見Qt代碼:
QCoreApplication ::translate ("QPlatformTheme" , "OK" )
實際上,這可以作為Qt的補丁。所以,我們最好將其作為Qt自身的翻譯的一個補充,將上述ts文件的內容專門保存一個公共的ts文件,供各項目使用。
?
結語
----------------------------------------------------------------
??? 國際化在Qt軟件開發過程中是非常重要的組成部分。即使您目前的代碼沒有推向國外市場,我也建議您養成使用國際化方案進行編程的習慣。因為這樣使您對于國際化編程會比較熟練,而且會形成一種標準化的編程格局,相信對您今后的發展也是有利的。
----------------------------------------------------------------
《Qt入門與提高-GUI產品開發》目錄
上一節:KS02-06 一勞永逸:引入pri體系
下一節:
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。