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

    源代码下载

  • 相关阅读:
    软件可靠性与安全性设计与实现知识梳理(软件可靠性与安全性高级技术研讨会心得)
    SSM框架整合
    不注册Tomcat服务,运行Tomcat不弹出JAVA控制台窗口
    ExtJS表单之复选框CheckboxGroup展示与取值
    ExtJS获取父子、兄弟容器元素方法
    LabVIEW之生产者/消费者模式--队列操作 彭会锋
    ExtJS Grid导出excel文件
    jeesite部署到Tomcat后,无法访问,cannot be resolved in either web.xml or the jar files deployed with this application
    滚动轮播插件——jCarouselLite
    统计学基础之假设检验
  • 原文地址:https://www.cnblogs.com/brucemengbm/p/7205258.html
Copyright © 2011-2022 走看看