在Qt開發(fā)時泉粉,如何實(shí)現(xiàn)多語言翻譯功能连霉?

文檔聲明:
以下資料均屬于本人在學(xué)習(xí)過程中產(chǎn)出的學(xué)習(xí)筆記,如果錯誤或者遺漏之處搀继,請多多指正窘面。并且該文檔在后期會隨著學(xué)習(xí)的深入不斷補(bǔ)充完善翠语。感謝各位的參考查看叽躯。


筆記資料僅供學(xué)習(xí)交流使用,轉(zhuǎn)載請標(biāo)明出處肌括,謝謝配合点骑。
如果存在相關(guān)知識點(diǎn)的遺漏,可以在評論區(qū)留言谍夭,看到后將在第一時間更新黑滴。
作者:Aliven888

如何配置開發(fā)環(huán)境,可以參考這邊文章《VS2015 配置 Qt 開發(fā)編譯環(huán)境》紧索。

創(chuàng)建一個Qt 工程

? 首先袁辈,我們創(chuàng)建一個Qt的項(xiàng)目工程。這里我選擇的是Qt GUI Application珠漂,對話框繼承 QMainWindows 類型(因?yàn)閭€人覺得菜單欄切換語言語言比較方便)晚缩。

【創(chuàng)建工程】
繼承QMainWindow類

添加多語言翻譯文件

? 創(chuàng)建兩個多語言文件 Aliven_zh.ts(中文) 和 Aliven_en.ts(英文)。


添加多語言翻譯文件

編輯翻譯文件

? 編輯多語言文件媳危,并且發(fā)布荞彼,生成 Aliven_xx.qm 文件。


編輯多語言文件

發(fā)布多語言文件

實(shí)現(xiàn)源碼

QtGuiApplication.h

#pragma once

#include <QtWidgets/QMainWindow>
#include "ui_QtGuiApplication.h"
#include <QTranslator>
#include <QCoreApplication>
#include <QMenu>
#include <QAction>
#include <QDir>
#include <QString>
#include <QMap>

class QtGuiApplication : public QMainWindow
{
    Q_OBJECT

public:
    QtGuiApplication(QWidget *parent = Q_NULLPTR);
    ~QtGuiApplication();
    void init();
    void Uninit();
    
private:
    bool loadSysConfigFile();  //加載系統(tǒng)配置文件
    bool saveSysConfigFile();  //保存系統(tǒng)配置文件
    
private:
    //多語言翻譯
    QTranslator *m_Translation;  //加載翻譯文件對象
    QString m_strLanguageType;   //翻譯文件的類型待笑,zh:中文   en:英文

    //菜單
    QMenu *m_LanguageMenu;
    QAction *m_LanguageEnAction;  //英文
    QAction *m_LanguageZhAction;  //中文

private:
    Ui::QtGuiApplicationClass ui;
};

QtGuiApplication.cpp

#include "QtGuiApplication.h"

//多語言文本字符串對象
static const char *c_strQtGuiApplication = "QtGuiApplication";
static const char *c_strTitle = QT_TRANSLATE_NOOP("QtGuiApplication", "Aliven.QtGuiApplication.title"); 
static const char *c_strCaption = QT_TRANSLATE_NOOP("QtGuiApplication", "Aliven.QtGuiApplication.caption");
static const char *c_strLanguage = QT_TRANSLATE_NOOP("QtGuiApplication", "Aliven.QtGuiApplication.language");
static const char *c_strChinese = QT_TRANSLATE_NOOP("QtGuiApplication", "Aliven.QtGuiApplication.chinese");
static const char *c_strEnglish = QT_TRANSLATE_NOOP("QtGuiApplication", "Aliven.QtGuiApplication.english");


QtGuiApplication::QtGuiApplication(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);
    m_strLanguageType = "zh";   //默認(rèn)值
}
QtGuiApplication::~QtGuiApplication()
{
    Uninit();
}

void QtGuiApplication::init()
{
    //加載配置文件
    if(!loadSysConfigFile())
    {
        qDebug() << "read config file err.";
    }

    //加載多語言文件
    m_Translation = new QTranslator(this);
    QString strPath = QDir::currentPath() + "/TranslationFile/Aliven_" + m_strLanguageType + ".qm";
    m_Translation->load(strPath);
    qApp->installTranslator(m_Translation);
    
    //初始化菜單 - 綁定信號與槽
    m_LanguageMenu = new QMenu(qApp->translate(c_strQtGuiApplication, c_strLanguage), this);
    m_LanguageEnAction = new QAction(qApp->translate(c_strQtGuiApplication, c_strEnglish), this);
    m_LanguageZhAction = new QAction(qApp->translate(c_strQtGuiApplication, c_strChinese), this);
    m_LanguageMenu->addAction(m_LanguageEnAction);
    m_LanguageMenu->addAction(m_LanguageZhAction);
    ui.menuBar->addMenu(m_LanguageMenu);

    //設(shè)置屬性為可選中
    m_LanguageEnAction->setCheckable(true);
    m_LanguageZhAction->setCheckable(true);
    if ("zh" != m_strLanguageType) //設(shè)置當(dāng)前選中狀態(tài)
    {
        m_LanguageEnAction->setChecked(true);
    }
    else
    {
        m_LanguageZhAction->setChecked(true);
    }

    connect(m_LanguageZhAction, &QAction::triggered, this, [=] {
        m_strLanguageType = "zh";
        m_LanguageEnAction->setChecked(false);
    });
    connect(m_LanguageEnAction, &QAction::triggered, this, [=] {
        m_strLanguageType = "en";
        m_LanguageZhAction->setChecked(false);
    });

}

void QtGuiApplication::Uninit()
{
    //退出前鸣皂,保存配置參數(shù)到文件中
    SaveSysConfigFile();

    //釋放資源
    delete m_LanguageZhAction;
    m_LanguageZhAction = nullptr;

    delete m_LanguageEnAction;
    m_LanguageEnAction = nullptr;

    delete m_LanguageMenu;
    m_LanguageMenu = nullptr;

    delete m_Translation;
    m_Translation = nullptr;
}

//加載系統(tǒng)配置文件
bool QtGuiApplication::loadSysConfigFile()  
{
    QString strPath = QDir::currentPath() + "/systemConfig.Aliven";
    QMap<QString, QString> mapData;
    QString strLine = "";
    QString strKey = "";
    QString strValue = "";
    QStringList strList;

    QFile file(strPath);
    if (!file.open(QIODevice::ReadOnly))
    {
        return false;
    }
    QTextStream in(&file);
    while (!in.atEnd())
    {
        strLine = in.readLine();
        strList.clear();
        strList = strLine.split("=");
        mapData.insert(strList.value(0), strList.value(1));
    }

    file.close();

    //獲取配置參數(shù)
    if (!mapData.isEmpty())
    {
        m_strLanguageType = mapData.value("languageType");
    }
    return true;
}

//保存系統(tǒng)配置文件
bool QtGuiApplication::saveSysConfigFile()  
{
    QString strPath = QDir::currentPath() + "/systemConfig.Aliven";
    QMap<QString, QString> mapData;
    mapData.insert("languageType", m_strLanguageType);

    QFile file(strPath);
    if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate))
    {
        return false;
    }

    QTextStream out(&file);
    QMapIterator<QString, QString> it(mapData);
    while (it.hasNext())
    {
        it.next();
        out << it.key() << "=" << it.value() << "\n";
    }
    file.close();
    return true;
}

多語言配置文件

systemConfig.Aliven

languageType=zh

效果圖

? 初次打開,默認(rèn)的是中文


選中中文語言

? 選擇英文暮蹂,關(guān)閉后軟件后寞缝,再次打開,系統(tǒng)語言就成功切換成英文了仰泻。


選中英文語言
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末荆陆,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子我纪,更是在濱河造成了極大的恐慌慎宾,老刑警劉巖丐吓,帶你破解...
    沈念sama閱讀 212,029評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異趟据,居然都是意外死亡券犁,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評論 3 385
  • 文/潘曉璐 我一進(jìn)店門汹碱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來粘衬,“玉大人,你說我怎么就攤上這事咳促≈尚拢” “怎么了?”我有些...
    開封第一講書人閱讀 157,570評論 0 348
  • 文/不壞的土叔 我叫張陵跪腹,是天一觀的道長褂删。 經(jīng)常有香客問我,道長冲茸,這世上最難降的妖魔是什么屯阀? 我笑而不...
    開封第一講書人閱讀 56,535評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮轴术,結(jié)果婚禮上难衰,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,650評論 6 386
  • 文/花漫 我一把揭開白布蛋褥。 她就那樣靜靜地躺著,像睡著了一般鳄虱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上兵志,一...
    開封第一講書人閱讀 49,850評論 1 290
  • 那天醇蝴,我揣著相機(jī)與錄音,去河邊找鬼想罕。 笑死悠栓,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的按价。 我是一名探鬼主播惭适,決...
    沈念sama閱讀 39,006評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼楼镐!你這毒婦竟也來了癞志?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,747評論 0 268
  • 序言:老撾萬榮一對情侶失蹤框产,失蹤者是張志新(化名)和其女友劉穎凄杯,沒想到半個月后错洁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,207評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡戒突,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,536評論 2 327
  • 正文 我和宋清朗相戀三年屯碴,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片膊存。...
    茶點(diǎn)故事閱讀 38,683評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡导而,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出隔崎,到底是詐尸還是另有隱情今艺,我是刑警寧澤,帶...
    沈念sama閱讀 34,342評論 4 330
  • 正文 年R本政府宣布爵卒,位于F島的核電站虚缎,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏技潘。R本人自食惡果不足惜遥巴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,964評論 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望享幽。 院中可真熱鬧,春花似錦拾弃、人聲如沸值桩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,772評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽奔坟。三九已至,卻和暖如春搭盾,著一層夾襖步出監(jiān)牢的瞬間咳秉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,004評論 1 266
  • 我被黑心中介騙來泰國打工鸯隅, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留澜建,地道東北人。 一個月前我還...
    沈念sama閱讀 46,401評論 2 360
  • 正文 我出身青樓蝌以,卻偏偏與公主長得像炕舵,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子跟畅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,566評論 2 349

推薦閱讀更多精彩內(nèi)容