有些軟體需要開發多語言界面版本,如中文版和英文版,并且在軟體裡可以友善地切換界面語言。Qt為多語言界面提供了很好的支援,使用Qt的一些規則和工具,可以很友善地為應用程式開發提供多語言界面支援。
多語言界面開發步驟
用Qt開發多語言界面應用程式,主要包括以下幾個步驟。
- (1)在程式設計階段,程式代碼中每一個使用者可見的字元串都用函數封裝,以便Qt提取界面字元串用于生成翻譯資源檔案。用UI設計器可視化設計窗體時統一用一種語言,如漢語。
- (2)在項目配置檔案(.pro檔案)中設定需要導出的翻譯檔案(.ts檔案)名稱,使用lupdate工具掃描項目檔案中需要翻譯的字元串,并生成翻譯檔案。
- (3)使用Qt的Linguist程式打開生成的翻譯檔案,将程式中的字元串翻譯為需要的語言,如将所有中文字元串翻譯為英文。
- (4)使用lrelease工具編譯翻譯好的翻譯檔案,生成更為緊湊的“.qm”檔案。
- (5)在應用程式中用Translator調用不同的“.qm”檔案,實作不同的語言界面。
tr()函數的使用
為了讓Qt能自動提取程式中使用者可見的字元串,對于每個字元串都需要使用tr()函數封裝。tr()是QObject的一個靜态函數,在使用了Q_OBJECT宏定義的類或QObject的子類中,都可以直接使用tr()函數,否則需要使用QObject::tr()進行調用。或者在類定義中用Q_DECLARE_TR_ FUNCTIONS宏把tr()函數添加到類中之後,再直接調用tr()函數。tr()函數的定義是:
QString QObject::tr(const char *sourceText, const char *disambiguation = Q_NULLPTR, int n = -1)
其中,sourceText是源字元串,disambiguation是為翻譯者提供額外資訊的字元串,用于對一些容易混淆的地方作說明,内容如下:
LabCellPos = new QLabel (tr("目前單元格:"),this);
QMessageBox::information(this, tr("資訊"),tr("資訊提示?"),QMessageBox::Yes);
QString strl=tr("左右","大約的意思");
QString str2=tr("左右","掌握、控制的意思");
使用tr()函數,需要注意以下一些事項。
- 盡量使用常量字元串,不要使用字元串變量。在tr()函數中應直接傳遞字元串常量,而不是用變量傳遞字元串,如下面的代碼使用了字元串變量,使用lupdate工具提取項目中的字元串時,将不能提取“不能删除記錄”這個字元串。
char *errorStr="不能删除記錄";
QString str2=tr(errorStr);
- 使用字元串變量時需要用Qt_TR_NOOP()宏進行标記。若要在tr()函數中使用字元串變量,需要在定義字元串的地方用Qt_TR_NOOP()宏進行标記,這在使用字元串數組時比較有用,例如:
const char *cities[4]={Qt_TR_NOOP("Beijing"),
Qt_TR_NOOP("Shanghai"),
Qt_TR_NOOP("Qingdao"),
Qt_TR_NOOP("Wuhan") };
for (int i=0; i<4; i++)
comboBox->addItem(tr(cities[i]));
- tr()不能使用拼接的動态字元串。tr()不能使用拼接的動态字元串,例如,下面的用法是錯誤的:
LabCellPos->setText(tr("第"+QString::number(current.row())+"行");
正确的方式如下。
LabCellPos->setText(tr("第%1行").arg(current.row()));
翻譯的字元串是"第%1行",然後再用QString的arg()去替換占位符“%1”的内容。
- Qt_NO_CAST_FROM_ASCII的作用。在一個需要翻譯為多語言的應用程式中,如果編寫程式時忘了對某個字元串使用tr()函數,lupdate生成的翻譯資源檔案就會遺漏這個字元串。為了避免這種疏忽錯誤,可以在項目配置檔案(.pro檔案)中添加如下的定義:
DEFINES += Qt_NO_CAST_FROM_ASCII
這樣在編譯時,會禁止從const char*到QString的隐式轉換,強制每個字元串都必須使用tr()或QLatinlString()封裝,避免出現遺漏未翻譯的字元串。
下一篇文章給出示例程式。
————————————————
覺得有用的話請關注點贊,謝謝您的支援!
對于本系列文章相關示例完整代碼有需要的朋友,可關注并在評論區留言!