最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Qt使用Qt Linguist 實(shí)現(xiàn)多語(yǔ)言切換

 更新時(shí)間:2026年07月09日 08:59:58   作者:小徐不徐說  
本文主要介紹了Qt使用Qt Linguist 實(shí)現(xiàn)多語(yǔ)言切換,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

在開發(fā)跨國(guó)應(yīng)用時(shí),國(guó)際化(i18n)是必不可少的功能。Qt 提供了強(qiáng)大的國(guó)際化支持,通過 Qt Linguist 工具可以輕松實(shí)現(xiàn)多語(yǔ)言切換。本文將詳細(xì)介紹如何使用 Qt Linguist,并提供完整的代碼示例。

一、Qt 國(guó)際化工作流程

1. 代碼中使用 tr() 標(biāo)記需要翻譯的文本
2. 使用 lupdate 生成 .ts 翻譯文件
3. 使用 Qt Linguist 進(jìn)行翻譯
4. 使用 lrelease 編譯為 .qm 文件
5. 在程序中動(dòng)態(tài)加載翻譯文件

二、項(xiàng)目配置

1. .pro 文件配置

QT += core gui widgets

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = MultiLanguageApp
TEMPLATE = app

CONFIG += c++11

SOURCES += \
    main.cpp \
    mainwindow.cpp

HEADERS += \
    mainwindow.h

FORMS += \
    mainwindow.ui

# ========== 國(guó)際化配置 ==========
TRANSLATIONS += \
    translations/app_zh_CN.ts \
    translations/app_en_US.ts

# 編譯時(shí)自動(dòng)生成 .qm 文件
CONFIG += lrelease

# 將 .qm 文件嵌入到資源中
CONFIG += embed_translations

# 資源文件
RESOURCES += resources.qrc

2. 創(chuàng)建資源文件 resources.qrc

<!DOCTYPE RCC>
<RCC version="1.0">
    <qresource prefix="/translations">
        <file>translations/app_zh_CN.qm</file>
        <file>translations/app_en_US.qm</file>
    </qresource>
</RCC>

三、界面設(shè)計(jì)

mainwindow.ui

在 Qt Designer 中創(chuàng)建界面:

┌─────────────────────────────────────┐
│  Multi-Language Application         │
├─────────────────────────────────────┤
│                                     │
│  ┌─────────────────────────────┐   │
│  │   Welcome to Qt Application │   │
│  └─────────────────────────────┘   │
│                                     │
│  ┌──────────┐  ┌──────────┐       │
│  │ Chinese  │  │ English  │       │
│  └──────────┘  └──────────┘       │
│                                     │
└─────────────────────────────────────┘

控件對(duì)象名

  • QPushButton → Chinese
  • QPushButton → English
  • QLabel → label_welcome

四、頭文件 mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTranslator>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    // 語(yǔ)言切換槽函數(shù)
    void on_Chinese_clicked();
    void on_English_clicked();

protected:
    // 重寫事件處理函數(shù),用于動(dòng)態(tài)更新界面文本
    void changeEvent(QEvent *event) override;

private:
    void retranslateCustomUI();  // 手動(dòng)更新界面文本

private:
    Ui::MainWindow *ui;
    QTranslator m_translator;  // 翻譯器對(duì)象
};

#endif // MAINWINDOW_H

五、源文件 mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QApplication>
#include <QMessageBox>
#include <QDebug>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    
    // 設(shè)置窗口標(biāo)題
    setWindowTitle(tr("多語(yǔ)言應(yīng)用程序"));
    
    // 初始化界面文本
    retranslateCustomUI();
}

MainWindow::~MainWindow()
{
    delete ui;
}

// ========== 切換到中文 ==========
void MainWindow::on_Chinese_clicked()
{
    qDebug() << "[MainWindow] 切換到中文";
    
    // 移除舊的翻譯器
    qApp->removeTranslator(&m_translator);
    
    // 加載中文翻譯文件
    if (m_translator.load(":/translations/app_zh_CN.qm")) {
        qApp->installTranslator(&m_translator);
        qDebug() << "[MainWindow] 中文翻譯文件加載成功";
        
        QMessageBox::information(this, tr("提示"), tr("已切換到中文"));
    } else {
        qWarning() << "[MainWindow] 中文翻譯文件加載失敗";
        QMessageBox::warning(this, tr("警告"), tr("中文翻譯文件加載失敗"));
    }
}

// ========== 切換到英文 ==========
void MainWindow::on_English_clicked()
{
    qDebug() << "[MainWindow] 切換到英文";
    
    // 移除舊的翻譯器
    qApp->removeTranslator(&m_translator);
    
    // 加載英文翻譯文件
    if (m_translator.load(":/translations/app_en_US.qm")) {
        qApp->installTranslator(&m_translator);
        qDebug() << "[MainWindow] 英文翻譯文件加載成功";
        
        QMessageBox::information(this, tr("Tip"), tr("Switched to English"));
    } else {
        qWarning() << "[MainWindow] 英文翻譯文件加載失敗";
        QMessageBox::warning(this, tr("Warning"), tr("Failed to load English translation"));
    }
}

// ========== 事件處理:語(yǔ)言改變時(shí)更新界面 ==========
void MainWindow::changeEvent(QEvent *event)
{
    if (event->type() == QEvent::LanguageChange) {
        // 更新 UI 自動(dòng)生成的翻譯
        ui->retranslateUi(this);
        
        // 更新自定義的翻譯
        retranslateCustomUI();
        
        qDebug() << "[MainWindow] 界面語(yǔ)言已更新";
    }
    
    QMainWindow::changeEvent(event);
}

// ========== 手動(dòng)更新界面文本 ==========
void MainWindow::retranslateCustomUI()
{
    // 更新窗口標(biāo)題
    setWindowTitle(tr("多語(yǔ)言應(yīng)用程序"));
    
    // 更新標(biāo)簽文本(如果有動(dòng)態(tài)文本)
    ui->label_welcome->setText(tr("歡迎使用 Qt 多語(yǔ)言應(yīng)用!"));
    
    // 更新按鈕文本(也可以在 .ui 文件中直接用 tr())
    ui->Chinese->setText(tr("中文"));
    ui->English->setText(tr("English"));
    
    qDebug() << "[MainWindow] 自定義界面文本已更新";
}

六、主函數(shù) main.cpp

#include "mainwindow.h"
#include <QApplication>
#include <QTranslator>
#include <QLocale>
#include <QDebug>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    
    // 根據(jù)系統(tǒng)語(yǔ)言自動(dòng)加載翻譯
    QTranslator translator;
    QString locale = QLocale::system().name(); // 如:zh_CN、en_US
    
    qDebug() << "[main] 系統(tǒng)語(yǔ)言:" << locale;
    
    QString translationFile = QString(":/translations/app_%1.qm").arg(locale);
    
    if (translator.load(translationFile)) {
        a.installTranslator(&translator);
        qDebug() << "[main] 已自動(dòng)加載翻譯文件:" << translationFile;
    } else {
        qDebug() << "[main] 未找到翻譯文件,使用默認(rèn)語(yǔ)言(中文)";
        
        // 默認(rèn)加載中文
        if (translator.load(":/translations/app_zh_CN.qm")) {
            a.installTranslator(&translator);
            qDebug() << "[main] 已加載中文翻譯";
        }
    }
    
    MainWindow w;
    w.show();
    return a.exec();
}

七、生成翻譯文件

1. 創(chuàng)建 translations 目錄

mkdir translations 

2. 生成 .ts 文件

lupdate MultiLanguageApp.pro 

生成的文件

translations/
├── app_zh_CN.ts
└── app_en_US.ts

3. 查看 .ts 文件內(nèi)容(自動(dòng)生成)

app_zh_CN.ts

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="zh_CN">
<context>
    <name>MainWindow</name>
    <message>
        <location filename="mainwindow.cpp" line="15"/>
        <source>多語(yǔ)言應(yīng)用程序</source>
        <translation type="unfinished"></translation>
    </message>
    <message>
        <location filename="mainwindow.cpp" line="34"/>
        <source>提示</source>
        <translation type="unfinished"></translation>
    </message>
    <message>
        <location filename="mainwindow.cpp" line="34"/>
        <source>已切換到中文</source>
        <translation type="unfinished"></translation>
    </message>
    <!-- 更多條目... -->
</context>
</TS>

八、使用 Qt Linguist 翻譯

1. 打開 Qt Linguist

linguist translations/app_zh_CN.ts 

2. 翻譯界面

┌────────────────────────────────────────────────────┐
│ Context: MainWindow                                │
├────────────────────────────────────────────────────┤
│ Source text          │ Translation                 │
├──────────────────────┼─────────────────────────────┤
│ 多語(yǔ)言應(yīng)用程序          │ 多語(yǔ)言應(yīng)用程序                │
│ 提示                  │ 提示                        │
│ 已切換到中文           │ 已切換到中文                 │
│ 歡迎使用 Qt 多語(yǔ)言應(yīng)用!│ 歡迎使用 Qt 多語(yǔ)言應(yīng)用!      │
│ 中文                  │ 中文                        │
│ English               │ English                     │
└──────────────────────┴─────────────────────────────┘

3. 翻譯英文(app_en_US.ts)

linguist translations/app_en_US.ts 

翻譯示例

???????Source text ? ? ? ? ? ? → Translation
多語(yǔ)言應(yīng)用程序 ? ? ? ? ? ? → Multi-Language Application
提示 ? ? ? ? ? ? ? ? ? ?→ Tip
已切換到中文 ? ? ? ? ? ? → Switched to Chinese
歡迎使用 Qt 多語(yǔ)言應(yīng)用! ?→ Welcome to Qt Multi-Language App!
中文 ? ? ? ? ? ? ? ? ? ?→ Chinese
English ? ? ? ? ? ? ? ? → English

4. 保存并標(biāo)記為完成

  • 翻譯完成后點(diǎn)擊 "File" → "Save"
  • 標(biāo)記為完成:右鍵 → "Mark as finished"

九、編譯翻譯文件

方法一:自動(dòng)編譯(推薦)

如果 .pro 文件中配置了:

CONFIG += lrelease 
CONFIG += embed_translations 

直接編譯項(xiàng)目即可:

qmake
make

方法二:手動(dòng)編譯

lrelease MultiLanguageApp.pro 

生成的文件

translations/
├── app_zh_CN.ts
├── app_zh_CN.qm  ← 編譯后的二進(jìn)制文件
├── app_en_US.ts
└── app_en_US.qm  ← 編譯后的二進(jìn)制文件

十、運(yùn)行效果

初始狀態(tài)(中文)

┌─────────────────────────────────────┐
│  多語(yǔ)言應(yīng)用程序                        │
├─────────────────────────────────────┤
│  歡迎使用 Qt 多語(yǔ)言應(yīng)用!              │
│                                     │
│  ┌──────────┐  ┌──────────┐       │
│  │   中文    │  │ English  │       │
│  └──────────┘  └──────────┘       │
└─────────────────────────────────────┘

點(diǎn)擊 "English" 后

┌─────────────────────────────────────┐
│  Multi-Language Application         │
├─────────────────────────────────────┤
│  Welcome to Qt Multi-Language App!  │
│                                     │
│  ┌──────────┐  ┌──────────┐       │
│  │ Chinese  │  │ English  │       │
│  └──────────┘  └──────────┘       │
└─────────────────────────────────────┘

十一、高級(jí)技巧

1. 帶參數(shù)的翻譯

QString filename = "test.txt";
QString message = tr("文件 %1 加載成功").arg(filename);
// 中文:文件 test.txt 加載成功
// 英文:File test.txt loaded successfully

在 Linguist 中翻譯:

Source: 文件 %1 加載成功
Translation: File %1 loaded successfully

2. 復(fù)數(shù)形式

int n = 5;
QString message = tr("You have %n unread message(s)", "", n);

在 Linguist 中翻譯:

<message numerus="yes">
    <source>You have %n unread message(s)</source>
    <translation>
        <numerusform>You have %n unread message</numerusform>
        <numerusform>You have %n unread messages</numerusform>
    </translation>
</message>

3. 上下文翻譯(避免歧義)

// 不同上下文中的相同單詞
QString text1 = tr("File");  // 文件(名詞)
QString text2 = tr("File", "verb");  // 歸檔(動(dòng)詞)

十二、常見問題

Q1: 翻譯不生效?

檢查清單

  1. 是否調(diào)用了 qApp->installTranslator(&translator)
  2. .qm 文件是否存在于資源路徑中
  3. 是否調(diào)用了 ui->retranslateUi(this)
  4. 是否重寫了 changeEvent() 函數(shù)

Q2: 動(dòng)態(tài)文本不更新?

解決方案

void MainWindow::changeEvent(QEvent *event)
{
    if (event->type() == QEvent::LanguageChange) {
        ui->retranslateUi(this);  // 更新 UI 自動(dòng)生成的文本
        retranslateCustomUI();     // 更新自定義文本
    }
    QMainWindow::changeEvent(event);
}

Q3: 如何調(diào)試翻譯?

qDebug() << "當(dāng)前翻譯:" << tr("測(cè)試文本");
qDebug() << "系統(tǒng)語(yǔ)言:" << QLocale::system().name();

十三、完整項(xiàng)目結(jié)構(gòu)

MultiLanguageApp/
├── main.cpp
├── mainwindow.h
├── mainwindow.cpp
├── mainwindow.ui
├── MultiLanguageApp.pro
├── resources.qrc
└── translations/
    ├── app_zh_CN.ts
    ├── app_zh_CN.qm
    ├── app_en_US.ts
    └── app_en_US.qm

總結(jié)

通過本文,您應(yīng)該已經(jīng)掌握了:

  1. ? 如何配置 Qt 國(guó)際化項(xiàng)目
  2. ? 如何使用 tr() 標(biāo)記需要翻譯的文本
  3. ? 如何使用 Qt Linguist 翻譯
  4. ? 如何實(shí)現(xiàn)語(yǔ)言動(dòng)態(tài)切換
  5. ? 如何處理帶參數(shù)和復(fù)數(shù)形式的翻譯

Qt 的國(guó)際化支持非常強(qiáng)大,合理使用可以讓您的應(yīng)用輕松走向全球!

到此這篇關(guān)于Qt使用Qt Linguist 實(shí)現(xiàn)多語(yǔ)言切換的文章就介紹到這了,更多相關(guān)Qt Linguist 多語(yǔ)言切換內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語(yǔ)言中printf()緩沖問題詳解

    C語(yǔ)言中printf()緩沖問題詳解

    這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中printf()緩沖問題的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-11-11
  • 利用C++實(shí)現(xiàn)計(jì)算機(jī)輔助教學(xué)系統(tǒng)

    利用C++實(shí)現(xiàn)計(jì)算機(jī)輔助教學(xué)系統(tǒng)

    我們都知道計(jì)算機(jī)在教育中起的作用越來越大。這篇文章主要為大家詳細(xì)介紹了如何利用C++編寫一個(gè)計(jì)算機(jī)輔助教學(xué)系統(tǒng),感興趣的可以了解一下
    2023-05-05
  • C語(yǔ)言中傳值與傳指針的介紹與區(qū)別

    C語(yǔ)言中傳值與傳指針的介紹與區(qū)別

    這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中傳值與傳指針的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C語(yǔ)言具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • Matlab實(shí)現(xiàn)遺傳算法的示例詳解

    Matlab實(shí)現(xiàn)遺傳算法的示例詳解

    這篇文章主要為大家詳細(xì)介紹了什么是遺傳算法,以及如何利用Matlab從零開始自己寫一個(gè)遺傳算法函數(shù),文中的代碼對(duì)我們學(xué)習(xí)有一定幫助,需要的可以參考一下
    2022-03-03
  • 全面解析設(shè)計(jì)模式中的建造者模式及相關(guān)C++實(shí)現(xiàn)

    全面解析設(shè)計(jì)模式中的建造者模式及相關(guān)C++實(shí)現(xiàn)

    這篇文章主要介紹了設(shè)計(jì)模式中的建造者模式及相關(guān)C++實(shí)現(xiàn),需要的朋友可以參考下
    2016-03-03
  • 在C++中使用HOOK修改sleep函數(shù)的方法

    在C++中使用HOOK修改sleep函數(shù)的方法

    Hook(鉤子)是一種編程機(jī)制,它允許開發(fā)者在程序執(zhí)行的特定點(diǎn)插入自定義代碼,從而攔截、處理或修改原有的函數(shù)調(diào)用、消息傳遞或系統(tǒng)事件,本篇文章將以sleep函數(shù)為例子介紹如何在c++中使用hook修改系統(tǒng)函數(shù),需要的朋友可以參考下
    2025-12-12
  • C語(yǔ)言實(shí)現(xiàn)四窗口聊天

    C語(yǔ)言實(shí)現(xiàn)四窗口聊天

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)四窗口聊天,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C語(yǔ)言編程時(shí)常犯十八個(gè)錯(cuò)誤小結(jié)

    C語(yǔ)言編程時(shí)常犯十八個(gè)錯(cuò)誤小結(jié)

    C語(yǔ)言的最大特點(diǎn)是:功能強(qiáng)、使用方便靈活。C編譯的程序?qū)φZ(yǔ)法檢查并不象其它高級(jí)語(yǔ)言那么嚴(yán)格,這就給編程人員留下“靈活的余地”,但還是由于這個(gè)靈活給程序的調(diào)試帶來了許多不便,尤其對(duì)初學(xué)C語(yǔ)言的人來說,經(jīng)常會(huì)出一些連自己都不知道錯(cuò)在哪里的錯(cuò)誤
    2013-07-07
  • C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單通訊錄功能

    C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單通訊錄功能

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單通訊錄功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • C++ odr用法案例詳解

    C++ odr用法案例詳解

    這篇文章主要介紹了C++ odr用法案例詳解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09

最新評(píng)論

清丰县| 龙胜| 蒙城县| 东乡县| 高雄市| 多伦县| 舞钢市| 三明市| 邵武市| 鲁山县| 海宁市| 龙川县| 合阳县| 县级市| 莱州市| 铁岭市| 奉贤区| 哈尔滨市| 晴隆县| 盈江县| 芦山县| 邓州市| 平山县| 黔西县| 盐城市| 永平县| 台东县| 桂林市| 冀州市| 福建省| 光山县| 金沙县| 平邑县| 班玛县| 保定市| 探索| 林甸县| 宣恩县| 县级市| 新昌县| 双峰县|