zoukankan      html  css  js  c++  java
  • Qt之国际化

    简单介绍

    Qt国际化属于Qt高级中的一部分。本想着放到后面来说,上节刚好介绍了Qt Linguist,趁热打铁就一起了解下。

    对于绝大多数的应用程序。在刚启动时。须要载入默认的语言(或最后一次设置的语言)。在使用的过程中。我们也不须要重新启动应用程序而实现语言的动态切换。

    这种话,易用性就很好了。

    多语言切换

    这里写图片描写叙述

    要进行多语言的切换,须要运行以下步骤:

    1. 对用户可见的文本信息所有使用tr()进行封装

    2. 提供用户能够用来切换语言的一种方法。

    3. 对于每个窗体部件或者对话框。重写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>("LANGUAGE");
    
    connect(language_combo_box, static_cast<void (QComboBox::*)(int)>(&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<LANGUAGE>();
    
        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();
    }

    流程:

    1. 进入main(),首先载入默认的语言(或最后一次设置的语言)。然后显示主界面。

    2. 当打开设置界面后。首先载入当前选择的语言。然后通过下拉设置语言选项来进行语言切换(设置界面的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文件,对翻译源进行相应语言的翻译。

    可參考:Qt Linguist介绍

    公布翻译

    选择:文件->公布,就会生成相应的qm文件。

    这里写图片描写叙述

    载入翻译文件

    使用QTranslator来载入生成的qm文件,就能够让程序显示指定的语言。

    QTranslator translator;  
    translator.load(":/qm/main_widget_zh");  
    app.installTranslator(&translator); 

    源代码下载

  • 相关阅读:
    leetcode Super Ugly Number
    leetcode Find Median from Data Stream
    leetcode Remove Invalid Parentheses
    leetcode Range Sum Query
    leetcode Range Sum Query
    leetcode Minimum Height Trees
    hdu 3836 Equivalent Sets
    hdu 1269 迷宫城堡
    hud 2586 How far away ?
    poj 1330 Nearest Common Ancestors
  • 原文地址:https://www.cnblogs.com/brucemengbm/p/7205258.html
Copyright © 2011-2022 走看看