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

2014-11-24 07:32:17 · 作者: · 浏览: 0

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

\

选择不同的语言,界面会随着切换。这要如何实现呢?QTranslator会加载*.qm的语言档,而该文件是从*.ts转换而来的。所以我们首先要做的是制作*.ts档。步骤如下< http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+MS7U2s/uxL+1xFJlc291cmNlIEZpbGVztcTOu9bD09K796OszO2809DCvajP7qOs0aHU8S5jcHDA4NDNtcTOxLz+o6zIu7rzvavD+9fWw/zD+86qdHO1xLrz17qjrLHIyOdzaW1wbGlmeS50c6GjPC9wPgo8cD4yLsuru/dzaW1wbGlmeS50c6Os1NrA78PmzO2803RzsdjSqrXExNrI3aGjPC9wPgo8cD48cHJlIGNsYXNzPQ=="brush:java;"> 3.右击ts档,选择lupdate,更新ts档。如下图。
\


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

  


  

    
    
     LanguagesDialog
     
     
     Languages 
      
     
     
     English 
      
     
     
     Simplify 
      
     
     
     Traditional 
      
     
   

  
5.编译ts档。代码中使用tr转换的字段都被提取了出来,并且存在了message字段下。message字段下的source是代码中的源字段,translation就是转换的内容。我们将type="unfinished"删除,然后添加内容。编译后的内容如下。

  


  
    
    
    
     LanguagesDialog
     
     
     Languages 
     
      多语言
      
     
     
     English 
     
      英文
      
     
     
     Simplify 
     
      简体
      
     
     
     Traditional 
     
      繁体
      
     
   

  

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 
  
   
#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 
  
   

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())组合而成。


以上就是简单的实现。