QT 多語言動態切換設計說明
背景說明
專案使用visual studio 2008 + qt 4.7.3 開發,所有的ts檔案都同時存放在指定資料夾,通過批命令生成一個.qm檔案。1 概述
軟體需要支援中文、英文切換。當軟體切換到不同語言時,軟體介面對應的文字說明、提示資訊等都需要切換到對應的語言。
2 設計說明
QT提供自帶的類Qtranslator支援輸出文字的國際化。這個類物件包含一系列的翻譯檔案。Qtranslator提供功能翻譯檔案中查詢對應的目標文字。這些翻譯檔案需要使用Qt 自帶的工具QT Linguist進行建立、編輯、編譯等。
需要通過Translator::load(translatorFileName
QT Linguist可以自動地幫我們提取出檔案中需要翻譯的詞條,這些詞條必須使用tr()或Qobject::tr()顯示的標識出來。
整個過程如下:
3 翻譯
3.1 建立
1. 右鍵單擊要翻譯的工程,出現如下選單:,
選擇“Create newTranslation file…”。
2. 在彈出的對話方塊中,選擇對應的語言。這樣就生成了對應的.TS檔案。位於對應的專案檔案下面。
3.2 編輯
.ts的檔案,需要使用QTLinguist進行編輯。有兩種方式開啟檔案。
一種是,啟動QT Linguist工具,然後,工具中選擇需要進行編輯的檔案。另一種是,在專案工程下,直接單擊.ts的翻譯檔案。
開啟檔案後,QT Linguist工具會顯示從程式碼中提取的tr()詞條(注:若翻譯的詞條有更新,需要手動先更新檔案。詳見下文)。如圖所示:
在上圖中的engilishtranslation裡面輸入“SC”翻譯後的字串。完成該詞條後,點選詞條前的問號圖示,則變成。此時”SC”已經翻譯很好了。
逐條翻譯其他條目後,儲存。
3.3 編譯
首先,將翻譯的.ts檔案剪下到\LanguageTS資料夾下。然後在專案中,刪除對應的.TS檔案(因為該檔案已找不到了)。刪除完成後,還需要將轉移到\LanguageTS資料夾下的.TS檔案,重新新增到專案中。
然後,編寫bat檔案。將ts檔案加入到bat檔案中,使用lrelease.exe工具編譯ts檔案。
D:\Qt\4.7.3\bin\為qt安裝的目錄,請自行修改:(^為windows命令的換行)
D:\Qt\4.7.3\bin\lrelease.exe apppublic_en.ts^
controller_en.ts^
。。。(這裡繼續填寫專案中的ts檔案)
最後,執行bat檔案。執行bat檔案後,會生成對應的.qm檔案,這個檔案即是可供程式使用的翻譯後的檔案。把這個檔案拷貝到LocalDebug\Languages裡,即可。
3.4 載入
軟體啟動時,需要根據配置檔案中設定的語言,自動載入相應的翻譯檔案。並且,載入過程需要在顯示對話方塊前完成。所以,在main()函式中實現。
具體過程如下:
1.先讀取配置檔案中的引數;
2.根據使用者的設定,判斷需要載入的檔案的路徑以及檔名稱;
3.載入翻譯檔案Translator::load(translatorFileName);
4.載入成功,則使用QCoreApplication::installTranslator(translator)安裝翻譯檔案。
3.5 更新
當程式中增加了新的詞條後,需要更新翻譯檔案。
首先,更新詞條的提取。在專案工程下,選擇對應原.TS檔案。單擊該檔案,在彈出的列表下選擇lupdate;
其次,翻譯新的詞條。更新完成後,選擇該檔案,並開啟。對未翻譯的詞條進行翻譯,並儲存;
最後,編譯成新的.qm檔案並將其拷貝到LocalDebug\Languages的檔案下。
4 動態切換
為實現多視窗的動態切換,主要包括以下兩點:
1. 當用戶更改了語言設定,使用 qApp->installTranslator(translator)安裝使用者選擇的翻譯檔案。
2. 對於當前已建立的視窗,需要更新重新整理當前的文字顯示。當使用QcoreApplication::installTranslator()安裝一個新的翻譯檔案時,程式會自動傳送一個QEvent::LanguageChange的事件通知。所以,可通過重寫函式void QWidget::changeEvent(QEvent*event)捕捉到該通知,然後重新整理對應的UI文字顯示。程式碼如下:
void QWidget::changeEvent(QEvent*event)
{
if (event->type() == QEvent::LanguageChange)
{
ui->retranslateUi(this);
}else
QWidget::changeEvent(event);
}
注:通過QT設計器,建立的UI,其介面的重新整理可以使用retranslateUi()函式;但如果是通過程式碼建立的,則需要另外再寫一個類似於retranslateUi函式的重新整理的文字的函式。
5 注意事項
需要注意的是,使用QT的多語言翻譯機制時,QT僅提取程式碼中所有有“QObject::tr(“ssss”)”的標識的語句。而對未使用tr標識的語句,無法提取。所以,在編寫程式碼時,對需要翻譯的詞條,均需要新增tr()。
目前,軟體中需要使用多語言的地方有以下幾個方面:
1. 按鈕等控制元件的文字說明
2. 展示給使用者的提示資訊
5.1 按鈕等控制元件文字說明
在建立UI控制元件時,非QT Creator設計器生成的按鈕文字說明、標題等,需要手動新增tr。如:
原來程式碼:
修改後程式碼:
5.2 展示給使用者的提示資訊
5.2.1 資訊提示框顯示的提示資訊
原來程式碼:
sAlarm = _T("#Assay beingused by reagent,you can not delete. ");
修改後程式碼:
sAlarm = QStringTTStr(QObject::tr("#Assay being used by reagent,you can not delete.."));
5.2.2 報警資訊
原來程式碼:
AddAlarm(eAlarmLevel_Warn, _T("WorkListhas no test"),_T("test requestmanager"));
修改後程式碼:
AddAlarm(eAlarmLevel_Warn,QStringTTStr(QObject::tr("WorkList has no test"), QStringTTStr(QObject::tr("test request manager"));
綜上所述,在UI層,建立按鈕等控制元件時,其文字說明前都需要使用tr();而在業務層建立的字串等需要翻譯的詞條時,需要先使用QOBject::tr(),然後再將該字串轉化為TString。