2D繪圖部分基本告一段落,,還在想下面的部分要寫什么,,本來計(jì)劃先說下view-model的相關(guān)問題,但是前面看到有朋友問關(guān)于國際化的問題,,所以現(xiàn)在先來說說Qt的國際化吧,!
Qt中的國際化的方法有很多,,常用的有使用QTextCodec類和使用tr()函數(shù)。前者將編碼名稱寫到代碼里面,,除非你使用Unicode編碼,,否則國際化依然是一個(gè)問題;后者就不會有這個(gè)問題,,并且這也是Qt推薦的做法,。因此,我們主要來說使用tr()函數(shù)的方法進(jìn)行應(yīng)用程序的國際化,。
我們先來看一個(gè)很簡單的MainWindow,。為了清楚起見,這里只給出了cpp文件的內(nèi)容:
#include "mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { QMenuBar *menuBar = new QMenuBar(this); QMenu *fileMenu = new QMenu(tr("&File"), menuBar); QAction *newFile = new QAction(tr("&New..."), fileMenu); fileMenu->addAction(newFile); QAction *openFile = new QAction(tr("&Open..."), fileMenu); fileMenu->addAction(openFile); menuBar->addMenu(fileMenu); setMenuBar(menuBar); connect(openFile, SIGNAL(triggered()), this, SLOT(fileOpen())); } MainWindow::~MainWindow() { } void MainWindow::fileOpen() { QFileDialog *fileDialog = new QFileDialog(this); fileDialog->setWindowTitle(tr("Open File")); fileDialog->setDirectory("."); if(fileDialog->exec() == QDialog::Accepted) { QString path = fileDialog->selectedFiles()[0]; QMessageBox::information(NULL, tr("Path"), tr("You selected\n%1").arg(path)); } else { QMessageBox::information(NULL, tr("Path"), tr("You didn't select any files.")); } } 這是一個(gè)很簡單的類,,運(yùn)行結(jié)果想必大家也都非常清楚:就是一個(gè)主窗口,,上面有一個(gè)菜單欄,一個(gè)File菜單,,里面有兩個(gè)菜單項(xiàng):
之所以把運(yùn)行圖貼出來,,是為了大家能夠看清,在代碼中的&符號實(shí)際在界面中顯示成為一條下劃線,,標(biāo)記出這個(gè)菜單或者菜單項(xiàng)的快捷鍵,。按照代碼,當(dāng)我們點(diǎn)擊了Open時(shí),,會彈出一個(gè)打開文件的對話框:
這里的slot里面的代碼在前文中已經(jīng)詳細(xì)介紹過,。也許你會問,為什么要用這種麻煩的寫法呢,?因?yàn)槲覀冊?jīng)說過,,使用static函數(shù)實(shí)際上是直接調(diào)用系統(tǒng)的對話框,而這種構(gòu)造函數(shù)法是Qt自己繪制的,。這對我們后面的國際化是有一定的影響的,。
好了,都已經(jīng)準(zhǔn)備好了,,下面開始進(jìn)行國際化,。所謂國際化,實(shí)際上不僅僅是把界面中的各種文字翻譯成另外的語言,,還有一些工作是要進(jìn)行書寫方式,、貨幣等的轉(zhuǎn)換。比如,,阿拉伯書寫時(shí)從右向左的,,這些在國際化工作中必須完成。但是在這里,我們只進(jìn)行最簡單的工作,,就是把界面的文字翻譯成中文,。
首先,我們需要在pro文件中增加一行:
TRANSLATIONS += myapp.ts myapp.ts是我們需要?jiǎng)?chuàng)建的翻譯文件,。這個(gè)文件的名字是任意的,,不過后綴名需要是ts。然后我們打開命令提示符,,進(jìn)入到工程所在目錄,,比如我的是E:\My Documents\Workspace\Qt\MyApp,也就是pro文件所在的文件夾,,然后輸入命令
lupdate MyApp.pro ,,如果你出現(xiàn)的是命令不存在,請注意將Qt的bin目錄添加到環(huán)境變量中,。此時(shí),,如果更新的數(shù)目,說明ts文件創(chuàng)建成功:
最后一行是說,,找到7個(gè)需要翻譯的原文字,,0個(gè)已經(jīng)存在。也就是說,,這個(gè)文件是新建的,。這時(shí)你會在工程目錄下找到這個(gè)myapp.ts文件。也許你會奇怪,,為什么這里還會說已存在的數(shù)目呢,?因?yàn)镼t這個(gè)工具很智能的能夠識別出已經(jīng)存在的文字和修改或新增的文字,這樣在以后的工作中就不需要一遍遍重復(fù)翻譯以前的文字了,。這也就是為什么這個(gè)工具的名字是“l(fā)update”的原因,,因?yàn)樗恰皍pdate”,而不僅僅是生成,。
如果你有興趣的話,,可以用記事本打開這個(gè)ts文件,,這個(gè)文件實(shí)際上是一個(gè)XML文件,,結(jié)構(gòu)很清晰。不過,,我們要使用專業(yè)的翻譯工具進(jìn)行翻譯,。Qt提供了一個(gè)工具,Qt Linguist,,你可以在開始菜單的Qt項(xiàng)下面的Tools中找到,。用它可以打開我們的ts文件,然后進(jìn)行我們的翻譯工作:
完全翻譯完成后保存文件,然后在文件菜單下有個(gè)“發(fā)布”,。點(diǎn)擊這個(gè)按鈕,,工程目錄下會有一個(gè)myapp.qm文件,這就是我們翻譯得到的文件,。Qt的qm文件實(shí)際上是二進(jìn)制格式的,,因此它經(jīng)過了高度的優(yōu)化,體積很小,。
下面我們要修改main()函數(shù),,使之加載這個(gè)qm文件:
int main(int argc, char *argv[]) { QApplication a(argc, argv); QTranslator qtTranslator; qtTranslator.load("myapp.qm"); a.installTranslator(&qtTranslator); MainWindow w; w.resize(800, 600); w.show(); return a.exec(); } 注意,QTranslator類實(shí)際是在QtCore下面的,。代碼還是很清晰:創(chuàng)建一個(gè)QTranslator對象,,然后加載qm文件,然后將這個(gè)對象安裝到QApplication類,。好了,,現(xiàn)在大功告成,重新編譯后運(yùn)行下程序吧,!
咦,?怎么還是英文的?哪里有錯(cuò)誤了呢,?這里往往令人疑惑,,其實(shí),這是由于我們使用load()函數(shù)加載qm文件時(shí)使用的是相對路徑,,這樣直接load(“myapp.qm”),,其實(shí)會在當(dāng)前編譯后的exe所在目錄下尋找這個(gè)qm文件,所以,,只要我們把qm文件同exe放在同一目錄下,,再次運(yùn)行:
現(xiàn)在,這個(gè)界面已經(jīng)是中文了吧,!其實(shí),,這一小細(xì)節(jié)已經(jīng)說明,qm文件其實(shí)是動態(tài)加載到exe文件中的,,而不是直接編譯進(jìn)去的,。這一點(diǎn)為我們進(jìn)行動態(tài)切換語言提供了基礎(chǔ)。 本文出自 “豆子空間” 博客,,請務(wù)必保留此出處http://devbean.blog.51cto.com/448512/244689 |
|