1. 程式人生 > >QT 多語言動態切換設計說明

QT 多語言動態切換設計說明

背景說明

專案使用visual studio 2008 + qt 4.7.3 開發,所有的ts檔案都同時存放在指定資料夾,通過批命令生成一個.qm檔案。

1      概述

軟體需要支援中文、英文切換。當軟體切換到不同語言時,軟體介面對應的文字說明、提示資訊等都需要切換到對應的語言。

2      設計說明

QT提供自帶的類Qtranslator支援輸出文字的國際化。這個類物件包含一系列的翻譯檔案。Qtranslator提供功能翻譯檔案中查詢對應的目標文字。這些翻譯檔案需要使用Qt 自帶的工具QT Linguist進行建立、編輯、編譯等。

需要通過Translator::load(translatorFileName

)載入翻譯檔案,然後通過使用QcoreApplication::installTranslator()安裝檔案。

   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檔案)

         -qm en.qm

最後,執行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。