Qt國際化屬於Qt高級中的一部分,本想著放到後面來說,上節剛好介紹了Qt Linguist,趁熱打鐵就一起了解下。
對於絕大多數的應用程序,在剛啟動時,需要加載默認的語言(或最後一次設置的語言)。在使用的過程中,我們也不需要重啟應用程序而實現語言的動態切換。這樣的話,易用性就非常好了。
簡介 多語言切換 源碼分析 添加翻譯源 翻譯 發布翻譯 加載翻譯文件 源碼下載
要進行多語言的切換,需要執行以下步驟:
對用戶可見的文本信息全部使用tr()進行封裝
提供用戶可以用來切換語言的一種方法。
對於每一個窗口部件或者對話框,重寫changeEvent事件,當事件類型為QEvent::LanguageChange時,翻譯文本進行重新調用(為了簡單我把它放在一個單獨的函數translateUI()中)。
我們來看一個簡單的示例:主界面、設置界面,設置界面可根據選擇不同語言下拉選項實現語言的動態切換!
為了簡單起見,這裡只給出關鍵代碼(源碼下載請參考最下面下載地址):
設置界面:setting_dialog.h
typedef enum{
UI_ZH,
UI_EN
}LANGUAGE;
Q_DECLARE_METATYPE(LANGUAGE)
設置界面:setting_dialog.cpp
language_combo_box->addItem("chinese", QVariant::fromValue(UI_ZH));
language_combo_box->addItem("english", QVariant::fromValue(UI_EN));
qRegisterMetaType("LANGUAGE");
connect(language_combo_box, static_cast(&QComboBox::currentIndexChanged), this, &SettingDialog::onIndexChanged);
void SettingDialog::changeEvent(QEvent *event)
{
switch (event->type())
{
case QEvent::LanguageChange:
translateUI();
break;
default:
QDialog::changeEvent(event);
}
}
void SettingDialog::translateUI()
{
this->setWindowTitle(tr("setting dialog"));
info_label->setText(tr("no brothers no programming"));
language_label->setText(tr("language"));
language_combo_box->setItemText(UI_ZH, tr("chinese"));
language_combo_box->setItemText(UI_EN, tr("english"));
}
void SettingDialog::onIndexChanged()
{
LANGUAGE language = language_combo_box->currentData().value();
emit switchLanguage(language);
}
主界面:MainWidget.cpp
connect(setting_dialog, &SettingDialog::switchLanguage, this, &MainWidget::switchLanguage);
void MainWidget::translateUI()
{
this->setWindowTitle(tr("main widget"));
welcome_label->setText(tr("welcome to Qt") + QString("26197884/26188347"));
setting_button->setText(tr("setting"));
ok_button->setText(tr("ok"));
cancel_button->setText(tr("cancel"));
}
void MainWidget::setLanguage(LANGUAGE current_language)
{
this->current_language = current_language;
}
void MainWidget::setTranslator(QTranslator* translator)
{
this->translator = translator;
}
void MainWidget::changeEvent(QEvent *event)
{
switch (event->type())
{
case QEvent::LanguageChange:
translateUI();
break;
default:
QWidget::changeEvent(event);
}
}
void MainWidget::switchLanguage(LANGUAGE language)
{
QString language_qm;
switch(language)
{
case UI_ZH:
language = UI_ZH;
language_qm = QString(":/qm/main_widget_zh");
break;
case UI_EN:
language = UI_EN;
language_qm = QString(":/qm/main_widget_en");
break;
default:
language = UI_ZH;
language_qm = QString(":/qm/main_widget_zh");
}
if(current_language != language)
{
current_language = language;
translator->load(language_qm);
Util::writeInit(QString("./user.ini"), QString("language"), QString::number(language, 10));
}
}
main.cpp
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QString language_value;
QString language_suffix = QString("zh");
LANGUAGE language = UI_ZH;
bool is_read = Util::readInit(QString("./user.ini"), QString("language"), language_value);
if(is_read)
{
language = (LANGUAGE)language_value.toInt();
if(language == UI_EN)
{
language_suffix = QString("en");
}
}
QTranslator translator;
translator.load(QString(":/qm/main_widget_") + language_suffix);
app.installTranslator(&translator);
MainWidget main_widget;
main_widget.setTranslator(&translator);
main_widget.setLanguage(language);
main_widget.show();
return app.exec();
}
流程:
進入main(),首先加載默認的語言(或最後一次設置的語言),然後顯示主界面。
當打開設置界面後,首先加載當前選擇的語言,然後通過下拉設置語言選項來進行語言切換(設置界面的switchLanguage信號關聯到主界面的switchLanguage槽中),然後將當前的語言進行保存。
語言切換後,首先會進入changeEvent函數,判斷當事件類型為QEvent::LanguageChange時,就會執行translateUI函數進行文本重新顯示。
注:
Q_DECLARE_METATYPE:如果要使自定義類型或其他非QMetaType內置類型在QVariant中使用,必須使用該宏 。
qRegisterMetaType:如果非QMetaType內置類型要在信號與槽中使用。
為了方便,這裡只介紹中、英文之間的切換。
在pro中添加:
TRANSLATIONS = Resource/main_widget_zh.ts \
Resource/main_widget_en.ts
選擇:工具->外部->Qt語言家->更新翻譯,則會生成對應的ts文件。
使用Qt Linguist打開要翻譯的ts文件,對翻譯源進行相應語言的翻譯。
選擇:文件->發布,就會生成對應的qm文件。
使用QTranslator來加載生成的qm文件,就可以讓程序顯示指定的語言。
QTranslator translator;
translator.load(":/qm/main_widget_zh");
app.installTranslator(&translator);