程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> Qt學習之路(33):國際化(上)

Qt學習之路(33):國際化(上)

編輯:關於C++

2D繪圖部分基本告一段落,還在想下面的部分要寫什麼,本來計劃先說下view-model的相關問題,但是前面看到有朋友問關於國際化的問題,所以現在先來說說Qt的國際化吧!

Qt中的國際化的方法有很多,常用的有使用QTextCodec類和使用tr()函數。前者將編碼名稱寫到代碼裡面,除非你使用Unicode 編碼,否則國際化依然是一個問題;後者就不會有這個問題,並且這也是Qt推薦的做法。因此,我們主要來說使用tr()函數的方法進行應用程序的國際化。

我們先來看一個很簡單的MainWindow。為了清楚起見,這裡只給出了cpp文件的內容:

#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."));
}
}

這是一個很簡單的類,運行結果想必大家也都非常清楚:就是一個主窗口,上面有一個菜單欄,一個File菜單,裡面有兩個菜單項:

之所以把運行圖貼出來,是為了大家能夠看清,在代碼中的&符號實際在界面中顯示成為一條下劃線,標記出這個菜單或者菜單項的快捷鍵。按照代碼,當我們點擊了Open時,會彈出一個打開文件的對話框:

這裡的slot裡面的代碼在前文中已經詳細介紹過。也許你會問,為什麼要用這種麻煩的寫法呢?因為我們曾經說過,使用static函數實際上是直接調用系統的對話框,而這種構造函數法是Qt自己繪制的。這對我們後面的國際化是有一定的影響的。

好了,都已經准備好了,下面開始進行國際化。所謂國際化,實際上不僅僅是把界面中的各種文字翻譯成另外的語言,還有一些工作是要進行書寫方式、貨幣等的轉換。比如,阿拉伯書寫時從右向左的,這些在國際化工作中必須完成。但是在這裡,我們只進行最簡單的工作,就是把界面的文字翻譯成中文。

首先,我們需要在pro文件中增加一行:

TRANSLATIONS += myapp.ts

myapp.ts是我們需要創建的翻譯文件。這個文件的名字是任意的,不過後綴名需要是ts。然後我們打開命令提示符,進入到工程所在目錄,比如我的是E:\My Documents\Workspace\Qt\MyApp,也就是pro文件所在的文件夾,然後輸入命令

lupdate MyApp.pro

,如果你出現的是命令不存在,請注意將Qt的bin目錄添加到環境變量中。此時,如果更新的數目,說明ts文件創建成功:

最後一行是說,找到7個需要翻譯的原文字,0個已經存在。也就是說,這個文件是新建的。這時你會在工程目錄下找到這個myapp.ts文件。也許你會奇怪,為什麼這裡還會說已存在的數目呢?因為Qt這個工具很智能的能夠識別出已經存在的文字和修改或新增的文字,這樣在以後的工作中就不需要一遍遍重復翻譯以前的文字了。這也就是為什麼這個工具的名字是“lupdate”的原因,因為它是“update”,而不僅僅是生成。

如果你有興趣的話,可以用記事本打開這個ts文件,這個文件實際上是一個XML文件,結構很清晰。不過,我們要使用專業的翻譯工具進行翻譯。 Qt提供了一個工具,Qt Linguist,你可以在開始菜單的Qt項下面的Tools中找到。用它可以打開我們的ts文件,然後進行我們的翻譯工作:

完全翻譯完成後保存文件,然後在文件菜單下有個“發布”。點擊這個按鈕,工程目錄下會有一個myapp.qm文件,這就是我們翻譯得到的文件。Qt的qm文件實際上是二進制格式的,因此它經過了高度的優化,體積很小。

下面我們要修改main()函數,使之加載這個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類實際是在QtCore下面的。代碼還是很清晰:創建一個QTranslator對象,然後加載qm文件,然後將這個對象安裝到QApplication類。好了,現在大功告成,重新編譯後運行下程序吧!

咦?怎麼還是英文的?哪裡有錯誤了呢?這裡往往令人疑惑,其實,這是由於我們使用load()函數加載qm文件時使用的是相對路徑,這樣直接 load(“myapp.qm”),其實會在當前編譯後的exe所在目錄下尋找這個qm文件,所以,只要我們把qm文件同exe放在同一目錄下,再次運行:

現在,這個界面已經是中文了吧!其實,這一小細節已經說明,qm文件其實是動態加載到exe文件中的,而不是直接編譯進去的。這一點為我們進行動態切換語言提供了基礎。

出處:http://devbean.blog.51cto.com/448512/244689

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved