一、國際化
國際化的英文表述為Internationalization,通常簡寫為I18N(首尾字母加中間的字符數),一個應用程序的國際化就是使該應用程序可以讓其他國家的用戶使用的過程。 Qt支持現在使用的大多數語言,特別是:
- 所有東亞語言(漢語、日語和朝鮮語);
- 所有西方語言(使用拉丁字母);
- 阿拉伯語;
- 西里爾語言(俄語和烏克蘭語等);
- 希臘語;
- 希伯來語;
- 泰語和老撾語;
- 所有在Unicode5. 1中不需要特殊處理的腳本。
在Qt中,所有的輸入部件和文本繪制方式對Qt所支持的所有語言都提供了內置的支持。Qt內置的字體引擎可以在同一時間正確而且精細地繪制不同的文本,這些文本可以包含來自眾多不同書寫系統的字符。相關知識可以在幫助中査看Internationalization with Qt關鍵字。
Qt對把應用程序翻譯為本地語言提供了很好的支持,可以使用Qt Linguist工具很容易地完成應用程序的翻譯工作,下面進行介紹。
1.1 使用Qt Linguist翻譯應用程序
這一小節中先通過一個簡單的例子介紹Qt中翻譯應用程序的整個過程,然后再介紹其中需要注意的方面,對應這部分內容可以查看Qt Linguist Manual關鍵字。在 Qt中編寫代碼時要對需要顯示的字符串調用tr()函數,完成代碼編寫后對這個應用程序的翻譯主要包含3步:
- ①運行lupdate工具從C++源代碼中提取要翻譯的文本,這時會生成一個.ts文 件,這個文件是XML格式的。
- ②在Qt Linguist中打開.ts文件,並完成翻譯工作。
- ③運行lrelease工具從.ts文件中獲得.qm文件,它是一個二進制文件。這里的.ts文件是供翻譯人員使用的,而在程序運行時只需要使用.qm文件,這兩個文件都是與平台無關的。
下面通過一個簡單的例子來介紹整個翻譯過程,該例子實現了將一個英文版本的應用程序翻譯為簡體中文版本。
第一步,編寫源碼。新建Qt Gui應用,項目名稱為myI18N,類名為MamWindow, 基類保持QMainWindow不變。建立完項目后,單擊mainwindow.ui文件進入設計模式,先添加一個菜單,再為其添加一個“&New”子菜單並設置快捷鍵為Ctrl + N,然后往界面上拖入一個Push Button。再使用代碼添加幾個標簽,打開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 = "linux";
label3->setText(tr("ID is %1,Name is %2").arg(id).arg(name));
label3->resize(150, 12);
label3->move(100, 120);
這里向界面上添加了3個標簽,因為這3個標簽中的內容都是用戶可見的,所以需要調用tr()函數。
第二步,更改項目文件。要在項目文件中指定生成的.ts文件,每一種翻譯語言對應一個.ts文件。打開myI18N.pro文件,在最后面添加如下一行代碼:
TRANSLATIONS = myI18N_zh_CN.ts
這表明后面生成的.ts文件的文件名為“myI18N_zh_CN. ts”,對於.ts的名稱可以隨意編寫,不過一般是以區域代碼來結尾,這樣可以更好地區分,例如這里使用了“zh_CN”來表示簡體中文。最后按下Ctrl + S保存該文件。
第三步,使用lupdate生成.ts文件。要進行翻譯工作時,先要使用lupdate工具來提取源代碼中的翻譯文本,生成.ts文件。在項目文件列表的myI18N.pro文件上右擊,在彈出的菜單中選擇“在此彈出命令行提示”。這時打開的命令行控制台中已經自動切換到了項目目錄下,這時輸人下面一行代碼,並按下回車鍵:
lupdate myI18N.pro
注意,這里要確保已經將Qt安裝目錄的bin目錄的路徑添加到了系統PATH環境變量中(筆者這里是D:\software\Technology\Qt\Qt5.11.2\Tools\mingw530_32\bin)。如果還沒有設置PATH環境變量,可以按照2. 2. 1小節的方法設置,然后重啟QtCreator,再進行該步驟。最后的結果表明更新了“myI18N_zh_CN. ts”文件,發現了8個源文本,其中有8條新的翻譯和0條已經存在的翻譯,如下圖所示。這就是說可以對程序代碼進行更改,然后多次運行lupdate,而只需要翻譯新添加的內容。可以在項目目錄中使用寫字板打開這個.ts文件,可以看到它是XML格式的,其中記錄了字符串的位置和是否已經被翻譯等信息。
第四步,使用Qt Linguist完成翻譯。這一步一般是翻譯人員來做的,就是在Qt Linguist中打開 .ts文件,然后對字符串逐個進行翻譯。在系統的開始菜單中啟動liguist(也可以直接在命令行輸入linguist或者在Qt安裝目錄的tools目錄下找到並啟動它),然后單擊界面左上角的open圖標,在彈出的文件對話框中進入項目目錄,打開myI18N_zh_CN文件,這時整個界面如下圖所示。Qt Linguist窗口的具體介紹請去原書看,這里由於篇幅限制不再介紹。
下面來翻譯程序。在翻譯區域可以看到現在已經是要翻譯成中文Chinese translation,這是因為.ts文件名中包含了中文的區域代碼。如果這里沒有正確顯示要翻譯成的語言,那么可以使用Edit→Translation File Settings菜單項來更改。
下面首先對MainWindow進行翻譯,這里翻譯為“應用程序主窗口 ”,然后按下即回車鍵完成翻譯並開始翻譯第二個字符串。按照這種方法完成所有字符串的翻譯工作, 如下圖所示。翻譯完成后按下Ctrl + S保存更改,然后退出Qt Linguist。這里對Qt Linguist只是進行了簡單介紹,詳細可以查看Qt Linguist Manual: Translators關鍵字。
第五步,使用lrelease工具生成.qm文件。可以使用 工具→外部→Qt語言家→lrelease(發布翻譯) 生成.qm文件,或者在工程文件對應命令行輸人如下一行代碼,並按下回車鍵:
lrelease myI18N. pro
輸出信息如下圖所示,這表明已經生成了.qm文件。另外在Qt Linguist中也可以使用File→Reelase和File→Release As這兩個菜單項來生成當前已打開的.ts文件對應的.qm文件。這三種方式都能生成.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對象安裝了翻譯。這里還要說明一點,有時可能因為部件的大小問題使得翻譯后的文本無法完全顯示,較好地解決方法就是使用布局管理器。
1.2 程序翻譯中的相關問題
由於篇幅原因,這里不再介紹
二、幫助系統
一個完善的應用程序應該提供盡可能豐富的幫助信息。在Qt中可以使用工具提 示、狀態提示以及“What's This”等簡單的幫助提示,也可以使用Qt Assistant來提供強大的在線幫助。
2.1 簡單的幫助提示
由於篇幅原因,這里不再進行說明。
2.2 簡單的幫助提示
由於篇幅原因,這里不再進行說明。
三、創建Qt插件
由於篇幅原因,這里不再進行說明。