程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> Qt國際化

Qt國際化

編輯:關於C語言

Qt國際化


簡介

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); 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved