1. 程式人生 > >QT in VS 多語言實現(中英文切換)

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】即可!