[Qt教程] 第46篇 进阶(六) 国际化
生活随笔
收集整理的這篇文章主要介紹了
[Qt教程] 第46篇 进阶(六) 国际化
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
[Qt教程]?第46篇 進階(六) 國際化
??|?查看: 109|?回復: 0| 國際化 版權聲明 該文章原創于Qter開源社區 導語 在第2篇中講述如何顯示中文時,曾提到使用QTextCodec和tr()的方式直接顯示中文,其實這只是一種臨時的方法,方便我們快速完成程序,顯示效果。當真正要發布一個程序時,最好的方式是在程序中使用英文字符串,而后使用國際化工具進行翻譯。 國際化的英文表述為Internationalization,通常簡寫為I18N(首尾字母加中間的字符數),一個應用程序的國際化就是使該應用程序可以讓其他國家的用戶使用的過程。Qt支持現在使用的大多數語言,特別是: 1.所有東亞語言(漢語、日語和朝鮮語) 2.所有西方語言(使用拉丁字母) 3.阿拉伯語 4.西里爾語言(俄語和烏克蘭語等) 5.希臘語 6.希伯來語 7.泰語和老撾語 8.所有在Unicode5.1中不需要特殊處理的腳本 ? ?? ? 在Qt中,所有的輸入部件和文本繪制方式對Qt所支持的所有語言都提供了內置的支持。Qt內置的字體引擎可以在同一時間正確而且精細的繪制不同的文本,這些文本可以包含來自眾多不同書寫系統的字符。 ? ?? ? 在Qt中可以使用Qt Linguist工具來很容易的完成應用程序的翻譯工作,在Qt中編寫代碼時要對需要顯示的字符串調用tr()函數,完成代碼編寫后,對這個應用程序的翻譯主要包含三步: 1.運行lupdate工具從C++源代碼中提取要翻譯的文本,這時會生成一個.ts文件,這個文件是XML格式的; 2.在Qt Linguist中打開.ts文件,并完成翻譯工作; 3.運行lrelease工具從.ts文件中獲得.qm文件,它是一個二進制文件。這里的.ts文件是供翻譯人員使用的,而在程序運行時只需要使用.qm文件,這兩個文件都是與平臺無關的。 環境:Windows Xp + Qt 4.8.5+QtCreator2.8.0 目錄 一、編寫源碼 二、更改項目文件 三、使用lupdate生成.ts文件 四、使用QtLinguist完成翻譯 五、使用lrelease生成.qm文件 六、使用.qm文件 正文 一、編寫源碼 1.新建Qt Gui應用,項目名稱為“myI18N”,類名為“MainWindow”,基類保持QMainWindow不變。 2.建立完項目后,點擊mainwindow.ui文件進入設計模式,先添加一個“&File”菜單,再為其添加一個“&New”子菜單并設置快捷鍵為Ctrl+N(不會操作,查看這里),然后往界面上拖入一個Push Button。 3.下面我們再使用代碼添加幾個標簽,打開mainwindow.cpp文件,添加頭文件#include?<QLabel>,然后在構造函數中添加代碼: QLabel?*label = new QLabel(this); label->setText(tr("hello Qt!")); label->move(100,50); QLabel?*label2 = new QLabel(this); label2->setText(tr("password","mainwindow")); label2->move(100,80); QLabel?*label3 = new QLabel(this); int?id = 123; QString?name = "yafei"; label3->setText(tr("ID is %1,Name is %2").arg(id).arg(name)); label3->resize(150,12); label3->move(100,120); 這里向界面上添加了三個標簽,因為這三個標簽中的內容都是用戶可見的,所以需要調用tr()函數。在label2中調用tr()函數時,還使用了第二個參數,其實tr()函數一共有三個參數,它的原型如下: QString QObject::tr( const char * sourceText, const char * disambiguation = 0, int n = -1 )[static] 第一個參數sourceText就是要顯示的字符串,tr()函數會返回sourceText的譯文;第二個參數disambiguation是消除歧義字符串,比如這里的password,如果一個程序中需要輸入多個不同的密碼,那么在沒有上下文的情況下,就很難確定這個password到底指哪個密碼。這個參數一般使用類名或者部件名,比如這里使用了mainwindow,就說明這個password是在mainwindow上的;第三個參數n表明是否使用了復數,因為英文單詞中復數一般要在單詞末尾加“s”,比如“1 message”,復數時為“2 messages”。遇到這種情況,就可以使用這個參數,它可以根據數值來判斷是否需要添加“s”。 4.運行程序效果如下圖所示。 二、更改項目文件 我們要在項目文件中指定生成的.ts文件,每一種翻譯語言對應一個.ts文件。打開myI18N.pro文件,在最后面添加如下一行代碼: TRANSLATIONS?= myI18N_zh_CN.ts 這表明后面生成的.ts文件的文件名為“myI18N_zh_CN.ts”,對于.ts的名稱可以隨意編寫,不過一般是以區域代碼來結尾,這樣可以更好的區分,例如這里使用了“zh_CN”來表示簡體中文。最后需要先按下Ctrl+S保存該文件。 三、使用lupdate生成.ts文件 可以通過工具->外部->Qt語言家->更新翻譯lupdate菜單項來完成該操作。這時會在概要信息處顯示如下信息: 啟動外部工具'C:/Qt/4.8.5/bin/lupdate.exe'E:/myI18N/myI18N.pro C:/Qt/4.8.5/mkspecs/features/device_config.prf(13):Querying unknown property CROSS_COMPILE Updating 'myI18N_zh_CN.ts'... Found 8 source text(s) (8 new and 0 already existing) 'C:/Qt/4.8.5/bin/lupdate.exe'完成 完成后可以在源碼目錄看到生成的myI18N_zh_CN.ts文件。 四、使用Qt Linguist完成翻譯 這一步一般是翻譯人員來做的,就是在Qt Linguist中打開.ts文件,然后對字符串逐個進行翻譯。我們在系統的開始菜單中啟動Linguist(也可以直接在命令行輸入“linguist”啟動它;或者在Qt安裝目錄的tools目錄下找到并啟動它),然后點擊界面左上角的“打開”圖標,在彈出的文件對話框中進入項目目錄,打開“myI18N_zh_CN”文件,這時整個界面如下圖所示。 下面來翻譯程序。在翻譯區域可以看到現在已經是要翻譯成漢語,這是因為我們的.ts文件名中包含了中文的區域代碼。如果這里沒有正確顯示要翻譯成的語言,那么可以使用“編輯”→“翻譯文件設置”菜單來更改。下面首先對“MainWindow”進行翻譯,這里翻譯為“應用程序主窗口”,然后按下Ctrl+Return(即回車鍵)完成翻譯并開始翻譯第二個字符串。按照這種方法完成所有字符串的翻譯工作,如下表所示。 翻譯完成后按下Ctrl+S保存更改,然后退出Qt Linguist。 五、使用lrelease生成.qm文件 可以通過工具->外部->Qt語言家->發布翻譯lrelease菜單項來完成該操作。這時會在概要信息處顯示如下信息: 啟動外部工具'C:/Qt/4.8.5/bin/lrelease.exe'E:/myI18N/myI18N.pro Updating 'E:/myI18N/myI18N_zh_CN.qm'... Generated 8 translation(s) (8 finished and 0unfinished) C:/Qt/4.8.5/mkspecs/features/device_config.prf(13):Querying unknown property CROSS_COMPILE 'C:/Qt/4.8.5/bin/lrelease.exe'完成 這時在源碼目錄會看到myI18N_zh_CN.qm文件。 六、使用.qm文件 下面在項目中添加代碼使用.qm文件來更改界面的語言。進入main.cpp文件,添加頭文件#include <QTranslator>,然后在QApplication a(argc, argv);代碼下添加如下代碼: QTranslator?translator; translator.load("../myI18N/myI18N_zh_CN.qm"); a.installTranslator(&translator); 這里先加載了.qm文件(使用了相對路徑),然后為QApplication對象安裝了翻譯。運行程序,效果下圖所示。 結語 這一節簡單介紹了一個使用Qt語言家實現國際化的例子,可以看到翻譯一個程序其實是很簡單的。Qt中還可以設置自動判斷語言環境、動態進行語言更改等功能,詳細內容可以參考幫助文檔Internationalizationwith Qt或者參考《Qt Creator快速入門》第9章的相關內容。 涉及到的源碼:??myI18N.rar?? |
總結
以上是生活随笔為你收集整理的[Qt教程] 第46篇 进阶(六) 国际化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [Qt教程] 第45篇 进阶(五)Qt样
- 下一篇: [Qt教程] 第48篇 进阶(八) 3D