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

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

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

前言

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

一、Qt 國際化工作流程

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

二、項目配置

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

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

# 編譯時自動生成 .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è)計

mainwindow.ui

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

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

控件對象名

  • 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:
    // 語言切換槽函數(shù)
    void on_Chinese_clicked();
    void on_English_clicked();

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

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

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

#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è)置窗口標題
    setWindowTitle(tr("多語言應(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"));
    }
}

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

// ========== 手動更新界面文本 ==========
void MainWindow::retranslateCustomUI()
{
    // 更新窗口標題
    setWindowTitle(tr("多語言應(yīng)用程序"));
    
    // 更新標簽文本(如果有動態(tài)文本)
    ui->label_welcome->setText(tr("歡迎使用 Qt 多語言應(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)語言自動加載翻譯
    QTranslator translator;
    QString locale = QLocale::system().name(); // 如:zh_CN、en_US
    
    qDebug() << "[main] 系統(tǒng)語言:" << locale;
    
    QString translationFile = QString(":/translations/app_%1.qm").arg(locale);
    
    if (translator.load(translationFile)) {
        a.installTranslator(&translator);
        qDebug() << "[main] 已自動加載翻譯文件:" << translationFile;
    } else {
        qDebug() << "[main] 未找到翻譯文件,使用默認語言(中文)";
        
        // 默認加載中文
        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)容(自動生成)

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ī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īng)用程序          │ 多語言應(yīng)用程序                │
│ 提示                  │ 提示                        │
│ 已切換到中文           │ 已切換到中文                 │
│ 歡迎使用 Qt 多語言應(yīng)用!│ 歡迎使用 Qt 多語言應(yīng)用!      │
│ 中文                  │ 中文                        │
│ English               │ English                     │
└──────────────────────┴─────────────────────────────┘

3. 翻譯英文(app_en_US.ts)

linguist translations/app_en_US.ts 

翻譯示例

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

4. 保存并標記為完成

  • 翻譯完成后點擊 "File" → "Save"
  • 標記為完成:右鍵 → "Mark as finished"

九、編譯翻譯文件

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

如果 .pro 文件中配置了:

CONFIG += lrelease 
CONFIG += embed_translations 

直接編譯項目即可:

qmake
make

方法二:手動編譯

lrelease MultiLanguageApp.pro 

生成的文件

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

十、運行效果

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

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

點擊 "English" 后

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

十一、高級技巧

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. 復數(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");  // 歸檔(動詞)

十二、常見問題

Q1: 翻譯不生效?

檢查清單

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

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

解決方案

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

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

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

十三、完整項目結(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 國際化項目
  2. ? 如何使用 tr() 標記需要翻譯的文本
  3. ? 如何使用 Qt Linguist 翻譯
  4. ? 如何實現(xiàn)語言動態(tài)切換
  5. ? 如何處理帶參數(shù)和復數(shù)形式的翻譯

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

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

相關(guān)文章

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

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

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

    利用C++實現(xiàn)計算機輔助教學系統(tǒng)

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

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

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

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

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

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

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

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

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

    C語言實現(xiàn)四窗口聊天

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

    C語言編程時常犯十八個錯誤小結(jié)

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

    C語言實現(xiàn)簡單通訊錄功能

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

    C++ odr用法案例詳解

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

最新評論

临夏县| 安阳市| 会昌县| 六盘水市| 尼木县| 江都市| 绵竹市| 财经| 洛阳市| 丹阳市| 沙洋县| 阳朔县| 华亭县| 温州市| 娄底市| 贺州市| 汉中市| 中西区| 晋城| 嘉荫县| 建阳市| 仪陇县| 玛多县| 平乡县| 香河县| 麦盖提县| 江城| 称多县| 上思县| 庆云县| 望奎县| 浦城县| 镇宁| 莫力| 黄陵县| 蓬安县| 长泰县| 兴安盟| 嵩明县| 台安县| 白玉县|