• Qt动态多语言的实现(VS2012开发)


    Qt对于多语言提供了QTranslator的接口,只要在程序启动时进行安装,然后动态改变QTranslator的加载即可。下面是效果图(英文/简体/繁体)。


    选择不同的语言,界面会随着切换。这要如何实现呢?QTranslator会加载*.qm的语言档,而该文件是从*.ts转换而来的。所以我们首先要做的是制作*.ts档。步骤如下

    1.在项目的Resource Files的位置右击,添加新建项,选择.cpp类型的文件,然后将名字命名为ts的后缀,比如simplify.ts。

    2.双击simplify.ts,在里面添加ts必要的内容。

    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE TS>
    <TS version="2.0">
        
    </TS>
    
    3.右击ts档,选择lupdate,更新ts档。如下图。


    4.查看ts档。右击ts档->打开方式->XML(文本)编译器->双击或确定。(ts档是xml格式,选用xml编译器,便于编辑)。内容如下

    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE TS>
    <TS version="2.0">
    <context>
        <name>LanguagesDialog</name>
        <message>
            <source>Languages</source>
            <translation type="unfinished"></translation>
        </message>
        <message>
            <source>English</source>
            <translation type="unfinished"></translation>
        </message>
        <message>
            <source>Simplify</source>
            <translation type="unfinished"></translation>
        </message>
        <message>
            <source>Traditional</source>
            <translation type="unfinished"></translation>
        </message>
    </context>
    </TS>
    
    5.编译ts档。代码中使用tr转换的字段都被提取了出来,并且存在了message字段下。message字段下的source是代码中的源字段,translation就是转换的内容。我们将type="unfinished"删除,然后添加内容。编译后的内容如下。

    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE TS>
    <TS version="2.0">
        <context>
            <name>LanguagesDialog</name>
            <message>
                <source>Languages</source>
                <translation >多语言</translation>
            </message>
            <message>
                <source>English</source>
                <translation >英文</translation>
            </message>
            <message>
                <source>Simplify</source>
                <translation >简体</translation>
            </message>
            <message>
                <source>Traditional</source>
                <translation >繁体</translation>
            </message>
        </context>
    </TS>
    

    6.繁体档(traditional.ts)和英文档(english.ts)按同样的方法制作。也可直接将simpify.ts复制,然后改名。

    7.生成qm档。选中ts->右击->lrelease.如下图


    8.查看qm档是否生成成功。也就是说,生成了对应的english.qm、simplify.qm、traditional.qm。如下图


    注:对于ts和qm档的制作也可以直接使用qt的Qt Linguist工具来制作。

    qm制作完成后,在代码中要实现相应的切换和调用。下面是实现代码。

    main.cpp

    #include <QtWidgets/QApplication>
    #include "LanguagesDialog.h"
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        LanguagesDialog languagesDialog;
        a.installTranslator(languagesDialog.qTranslator);//注意:一定要加上这一句,才能将转换器安装到程序中,否则语言切换会失败。
        languagesDialog.show();
        return a.exec();
    }
    

    LanguagesDialog.h

    #include <QtWidgets>
    
    class LanguagesDialog:public QDialog
    {
        Q_OBJECT
    public:
        LanguagesDialog();
        QTranslator *qTranslator;
    protected:
        void changeEvent(QEvent *);
    
        private slots:
            void languageChanged();
    
    private:
        void translateUi();
        QGroupBox *languages;
    
        QRadioButton *english;
        QRadioButton *simplify;
        QRadioButton *traditional;
    
    };


    LanguagesDialog.cpp

    #include "LanguagesDialog.h"
    
    LanguagesDialog::LanguagesDialog():QDialog()
    {
        languages=new QGroupBox(this);
        english=new QRadioButton(this);
        simplify=new QRadioButton(this);
        traditional=new QRadioButton(this);
        qTranslator=new QTranslator();
    
        english->setChecked(true);
        qTranslator->load("english");
    
        QVBoxLayout *baselayout=new QVBoxLayout(this);
        baselayout->addWidget(languages);
    
        QVBoxLayout *radioLayout=new QVBoxLayout(languages);
        radioLayout->addWidget(english);
        radioLayout->addWidget(simplify);
        radioLayout->addWidget(traditional);
    
        connect(english,SIGNAL(toggled(bool)),this,SLOT(languageChanged()));
        connect(simplify,SIGNAL(toggled(bool)),this,SLOT(languageChanged()));
        connect(traditional,SIGNAL(toggled(bool)),this,SLOT(languageChanged()));
    
        translateUi();
    }
    
    void LanguagesDialog::translateUi()
    {
        languages->setTitle(tr("Languages"));//用tr转换的字段,会被自动抽取出来,将利用QTranslator来转换。
    
        english->setText(tr("English"));
        simplify->setText(tr("Simplify"));
        traditional->setText(tr("Traditional"));
    }
    
    void LanguagesDialog::changeEvent(QEvent *event)
    {    
        if (event->type()==QEvent::LanguageChange)
        {
            translateUi();//更新界面
        }
        else
        {
            QDialog::changeEvent(event);
        }
    }
    
    ////////////////////////////////////////////////////////////
    ///slots
    void LanguagesDialog::languageChanged()
    {
        if (english->isChecked())
        {
            qTranslator->load("english");//加载英文
        }
        else if(simplify->isChecked())
        {
            qTranslator->load("simplify");//加载简体
        }  
        else if(traditional->isChecked())
        {
            qTranslator->load("traditional");//加载繁体
        }  
    }

    如果需要与操作系统的语言相匹配,那么可以利用QLocale::system().name()获取系统的语言信息,然后载入对应的语言档。简易代码如下

    int main(int argc, char *argv[])
    {
    	QApplication a(argc, argv);  
    	QTranslator translator;
    	translator.load(QLocale::system().name());
    	a.installTranslator(&translator);
    	//other thing.
    	return a.exec();
    }

    注意:QLocale::system().name()获取的语言信息是依据ISO_639-1和ISO_3166-1生成的,一般是语言_区域的形式,比如中文代号是zh,中国的代号是CN,所以组合出来的结果就是zh_CN。所以这就要求我们在制作i18n(国际化)和l10n(本地化)的文言档时,最好是依照这种规范生成相应的ts和qm档。比如刚刚可以是zh_CN.ts和zh_CN.qm。当然可以适当的加入前缀,以便于区分不同的程序(LanguageDialog_zh_ch)。前缀可以用translator.load(QString("LanguageDialog_")+QLocale::system().name())组合而成。


    以上就是简单的实现。


  • 相关阅读:
    EntityFramework
    在项目中整合log4net日志模块
    java Socket编程
    java动态代理
    多项式计算的Horner法则(秦九韶法则)
    1.6打印字符串排列
    1.5 输出整数N的二进制1的个数(递归)
    1.3输出任意实数
    Java super关键字调用父类的方法疑惑
    vs2010配置MPI
  • 原文地址:https://www.cnblogs.com/sparkleDai/p/7605053.html
Copyright © 2020-2023  润新知