[Qt教程] 第46篇 進階(六) 國際化
樓主
發表於 2013-10-7 09:23:45 | 查看:
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章的相關內容。
涉及到的源碼: ![]() |
最後更新:2017-04-03 14:54:15
上一篇:
[Qt教程] 第37篇 網絡(七)TCP(一)
下一篇:
Java IO--Scanner
思科HyperFlex在超融合市場掀起熱潮
Java?????????????????????-??????-????????????-?????????
麵試中的二叉樹(附相關函數)
時間子係統13_clockevent周期觸發模式
iphone7被人鎖了密碼,怎麼辦?
萬物互聯時,關於安全的三個前沿思考
problem中Project'XX'is missing required library:'[路徑]\XXX.jar'解決方法
iBatis和Hibernate的對比
ssh配置連接
SVN版本管理係統的安裝 CentOS + Subversion + Apache + Jsvnadmin