QT in VS 多語言實現(中英文切換)
最近專案需要軟體具有中英文雙語切換功能,而QT又自帶此功能,現將實現方式記錄下來。
說到中英文切換,少不了要了解QT的內部編碼方式。在此就不詳述QT編碼方式了,具體可參考 徹底弄懂Qt的編碼。只需要記住QT採用utf-8編碼!window作業系統採用ansi編碼,簡體中文作業系統的ansi代表gbk。
1. 生成.ts檔案
前置步驟:所有需要翻譯的內容用QObject::tr()包起來。具體自行了解一下QObject::tr()的功能。
先建立一個factory類:
// factory.cpp
factory::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_OBJECT
private:
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_OBJECT
public:
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】即可!