欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

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

发布时间:2025/4/5 编程问答 41 豆豆
生活随笔 收集整理的这篇文章主要介绍了 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())组合而成。


以上就是简单的实现。


转载于:https://www.cnblogs.com/sparkleDai/p/7605053.html

总结

以上是生活随笔为你收集整理的Qt动态多语言的实现(VS2012开发)的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。