900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > QT in VS 多语言实现(中英文切换)

QT in VS 多语言实现(中英文切换)

时间:2019-03-18 10:31:52

相关推荐

QT in VS 多语言实现(中英文切换)

最近项目需要软件具有中英文双语切换功能,而QT又自带此功能,现将实现方式记录下来。

说到中英文切换,少不了要了解QT的内部编码方式。在此就不详述QT编码方式了,具体可参考 彻底弄懂Qt的编码。只需要记住QT采用utf-8编码!window操作系统采用ansi编码,简体中文操作系统的ansi代表gbk。

1. 生成.ts文件

前置步骤:所有需要翻译的内容用QObject::tr()包起来。具体自行了解一下QObject::tr()的功能。

先创建一个factory类:

// factory.cppfactory::factory(){QString str = QObject::tr("我是中国人");}

打开项目 =>【QT VS TOOLS】=> 【Create New Translation File】=> 【选择语言】=> 【ok】创建ts文件,默认在项目根目录。

2. 打开linguis,打开ts文件,翻译,生成qm文件

【QT VS TOOLS】=> 【Launch Qt Linguist】=> 等待打开linguist工具 =>【linguist打开ts文件】

打开ts文件后看到乱码:

导致的原因是源码文件采用的非utf-8编码格式,要将源码文件改为utf-8格式。

解决方式:【在vs中打开源码文件】=> 【文件】=> 【高级保存选项】=> 【编码:Unicode(utf-8 带签名)】=> 像上述一样再次创建ts文件

再打开linguist看一下:

翻译,然后生成qm文件 【文件】 => 【发布】即可在项目根目录下生成一个与ts同名的qm文件。

3. 中英文切换

这里是重点了,就不使用之前的代码了。实现一个登陆页面语言切换功能。

新建一个CLinguist类,用于语言管理:

// Linguist.h#pragma once/*语言家,配置当前系统的语言*/#include <QObject>#include <qtranslator.h>enum Language{zh_cn,en_us,undefined};class CLinguist :public QObject{Q_OBJECTprivate:CLinguist();public:// 当前语言 简体中文、英文、未定义Language m_CurrentLanguage = Language::undefined;// 切换语言void ChangeLanguage(Language lan);static CLinguist * GetLinguistInstance();private:static CLinguist * linguist;QTranslator * m_trans;signals:// 语言切换信号,通知当前系统语言已经被切换void LanguageChaned();};//Linguist.cpp#include "Linguist.h"#include <qcoreapplication.h>CLinguist * CLinguist::linguist = nullptr;CLinguist::CLinguist(){m_trans = new QTranslator;}CLinguist * CLinguist::GetLinguistInstance(){if (nullptr == linguist){linguist = new CLinguist;}return linguist;}void CLinguist::ChangeLanguage(Language lan){if (lan == this->m_CurrentLanguage || lan == Language::undefined) return;bool ret;switch (lan){case zh_cn:if (nullptr != m_trans){qApp->removeTranslator(m_trans);}ret = m_trans->load("snirisaccesssys_zh.qm");if (ret){qApp->installTranslator(m_trans);}break;case en_us:if (nullptr != m_trans){qApp->removeTranslator(m_trans);}ret = m_trans->load("snirisaccesssys_en.qm");if (ret){qApp->installTranslator(m_trans);}break;default:break;}if(ret){this->m_CurrentLanguage = lan;// 发出语言被切换的信号emit LanguageChaned();}}

在main函数中设置默认的语言:

int main(int argc, char *argv[]){QApplication a(argc, argv);/**......*/CLinguist* lin = CLinguist::GetLinguistInstance();lin->ChangeLanguage(Language::zh_cn);/**......*/}

登陆类CLogin:

// Login.h#pragma once#if _MSC_VER >= 1600#pragma execution_character_set("utf-8")#endif#include <QObject>#include <qwidget.h>#include <qpushbutton.h>#include <qlineedit.h>#include <qgridlayout.h>#include <qlabel.h>#include <qboxlayout.h>#include <qmessagebox.h>#include <qcombobox.h>#include <qtranslator.h>class CLogin : public QDialog{Q_OBJECTpublic:CLogin(QWidget *parent = 0);~CLogin();/**... 省略了部分内容,包括布局控件和登陆取消按钮...*/QPushButton * m_btnChangeLanguage;QLineEdit * m_leUserName;QLineEdit * m_lePwd;QTranslator* m_translator;QLabel * m_lblUserName;QLabel * m_lblPwd;void on_btnChangeLanguage_clicked();// 刷新ui界面的文字void RetranslateUI();// 这句比较重要,连接信号槽,因为是单例,所以想买中所有需要切换语言的地方都需要连接CLinguist::LanguageChaned信号CLinguist* lin = CLinguist::GetLinguistInstance();connect(lin, &CLinguist::LanguageChaned, this, &CBaseForm::RetranslateUI);};// Login.cpp#include "Login.h"#include "Linguist.h"CLogin::CLogin(QWidget *parent, int id): CBaseForm(id, parent){/**...省略各种控件初始化及布局操作*/m_btnChangeLanguage = new QPushButton;connect(m_btnChangeLanguage, &QPushButton::clicked, this, &CLogin::on_btnChangeLanguage_clicked);RetranslateUI();}CLogin::~CLogin(){}void CLogin::RetranslateUI(){m_lblUserName->setText(tr("用户名:"));m_lblPwd->setText(tr("密 码:"));m_btnChangeLanguage->setText(tr("中文"));}void CLogin::on_btnChangeLanguage_clicked(){CLinguist* lin = CLinguist::GetLinguistInstance();if (lin->m_CurrentLanguage == Language::en_us){lin->ChangeLanguage(Language::zh_cn);}else{lin->ChangeLanguage(Language::en_us);}}

还有一点想说一下,如何实现中英文切换按钮在设置为中文的时候显示【English】,设置为英文的时候显示【中文】,看下面的图你就懂了:

就是翻译的时候English译文为【中文】,汉语译文为【English】即可!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。