1. 程式人生 > >QT in VS 多語言實現(中英文切換,每個步驟都有截圖,只有UTF8才能讓Qt語言家正確讀取。先qApp->removeTranslator,然後installTranslator,每個類都要寫上槽函數RetranslateUI)

QT in VS 多語言實現(中英文切換,每個步驟都有截圖,只有UTF8才能讓Qt語言家正確讀取。先qApp->removeTranslator,然後installTranslator,每個類都要寫上槽函數RetranslateUI)

har hang 刷新 編碼方式 enum utf 工具 orm 中英文切換

最近項目需要軟件具有中英文雙語切換功能,而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("我是中國人");

}
1
2
3
4
5
打開項目 =>【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();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
在main函數中設置默認的語言:

int main(int argc, char *argv[])
{
QApplication a(argc, argv);

/**
......
*/

CLinguist* lin = CLinguist::GetLinguistInstance();
lin->ChangeLanguage(Language::zh_cn);

/**
......
*/
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
登陸類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);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86


還有一點想說一下,如何實現中英文切換按鈕在設置為中文的時候顯示【English】,設置為英文的時候顯示【中文】,看下面的圖你就懂了:

就是翻譯的時候English譯文為【中文】,漢語譯文為【English】即可!
---------------------
作者:david大偉哥
來源:CSDN
原文:https://blog.csdn.net/lwwl12/article/details/80485123
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

QT in VS 多語言實現(中英文切換,每個步驟都有截圖,只有UTF8才能讓Qt語言家正確讀取。先qApp->removeTranslator,然後installTranslator,每個類都要寫上槽函數RetranslateUI)