最近项目使用的qt版本升级,导致了界面乱码问题,因此最后决定利用qt的多语化机制,来解决乱码问题,首先感谢这两篇文字的帮助,在此加上作者链接:Qt之多语化和Qt多国语言的实现与切换(国际化)
在项目多语化的文章开始编写之前,我说下qt多语化的思路,很简单,就3步,首先,从项目中获取字符串,然后编辑*.ts文件,填写需要翻译的字符串和对应的翻译后字符串,最后就是更新到项目中
接下来,我详细介绍vs2013+qt5多语化的每一个步骤
View Code
在项目多语化的文章开始编写之前,我说下qt多语化的思路,很简单,就3步,首先,从项目中获取字符串,然后编辑*.ts文件,填写需要翻译的字符串和对应的翻译后字符串,最后就是更新到项目中
接下来,我详细介绍vs2013+qt5多语化的每一个步骤
1、创建语言文件,如下图,然后translate_zh.hs文件执行lupdate操作,获取工程字符串到该ts文件
2、编辑翻译文件
启动Linguist(Qt语言家),打开cn.ts,然后进行编辑,主要是将源文对应的译文填写上,最后保存
3、部署翻译文件
工具->外部->Qt语言家->部署翻译,将生成语言文件qm
注:随时可以重复“2”~“3”步骤以便更新翻译
下面是qt多语化的一个简单事例,效果如下:
上图中英文显示的时候,有部分中文的原因是,qm文件在配置英文ts文件时的原因,为了演示,故意设置了部分翻译,部分没有翻译,下面贴上程序代码.
main.cpp
int main(int argc, char *argv[])
{
QApplication
a(argc, argv);
QTranslator
translator;
bool b =
false;
b =
translator.load(":/translate/translate_zh.qm");
a.installTranslator(&translator);
translate
w;
w.SetCurrentTranslate(&translator);
w.show();
return
a.exec();
}
translate .h
1 class translate : public QWidget 2 { 3 Q_OBJECT 4 5 public: 6 translate(QWidget *parent = 0); 7 ~translate(); 8 9 public: 10 void SetCurrentTranslate(QTranslator * translator); 11 12 private slots: 13 void CurrentLanguageChanged(int); 14 15 private: 16 void Translate(); 17 18 private: 19 Ui::translateClass ui; 20 QTranslator * translator; 21 };
translate.cpp
View Code
1 translate::translate(QWidget *parent) 2 : QWidget(parent) 3 { 4 ui.setupUi(this); 5 6 ui.comboBox_langugeType->addItem(tr("chinese")); 7 ui.comboBox_langugeType->addItem(tr("english")); 8 9 connect(ui.comboBox_langugeType, static_cast(&QComboBox::currentIndexChanged) 10 , this, &translate::CurrentLanguageChanged); 11 } 12 13 translate::~translate() 14 { 15 16 } 17 18 void translate::SetCurrentTranslate(QTranslator * translator) 19 { 20 this->translator = translator; 21 this->Translate(); 22 } 23 24 void translate::CurrentLanguageChanged(int index) 25 { 26 switch (index) 27 { 28 case 0: 29 { 30 translator->load(":/translate/translate_zh.qm"); 31 } 32 break; 33 case 1: 34 { 35 translator->load(":/translate/translate_en.qm"); 36 } 37 break; 38 } 39 this->Translate(); 40 } 41 42 void translate::Translate() 43 { 44 ui.comboBox_langugeType->setItemText(0, tr("chinese")); 45 ui.comboBox_langugeType->setItemText(1, tr("english")); 46 ui.label_tip->setText(tr("label")); 47 ui.label->setText(tr("language:")); 48 ui.pushButton_ok->setText(tr("ok")); 49 ui.pushButton_quit->setText(tr("quit")); 50 }
经此一用,中文到控件上乱码的问题也顺带完美解决了,享受了一次轻松多国语实现的过程。