Qt实现语言切换的完整指南

 更新时间:2025年04月24日 09:26:14   作者:byxdaz  
这篇文章主要为大家详细介绍了如何在Qt中实现语言切换的完整指南,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

在Qt中实现语言动态切换需要以下几个关键步骤,我将提供一个完整的实现方案:

一、准备工作

1.在代码中使用tr()标记所有需要翻译的字符串

button->setText(tr("Submit"));

2.创建翻译文件

在.pro文件中添加:

TRANSLATIONS = translations/myapp_zh_CN.ts \
              translations/myapp_en_US.ts

二、核心实现类

1. 语言管理器头文件 (LanguageManager.h)

#ifndef LANGUAGEMANAGER_H
#define LANGUAGEMANAGER_H
 
#include <QObject>
#include <QTranslator>
#include <QMap>
 
class LanguageManager : public QObject
{
    Q_OBJECT
public:
    static LanguageManager* instance();
    
    // 可用语言列表
    QMap<QString, QString> availableLanguages() const;
    
    // 设置当前语言
    void setCurrentLanguage(const QString& languageCode);
    
    // 获取当前语言
    QString currentLanguage() const;
 
signals:
    // 语言改变信号
    void languageChanged();
 
protected:
    explicit LanguageManager(QObject *parent = nullptr);
 
private:
    void loadTranslations();
    
    static LanguageManager* m_instance;
    QTranslator* m_appTranslator;
    QTranslator* m_qtTranslator;
    QString m_currentLanguage;
    QMap<QString, QString> m_languages; // <code, displayName>
};
 
#endif // LANGUAGEMANAGER_H

2. 语言管理器实现 (LanguageManager.cpp)

#include "LanguageManager.h"
#include <QApplication>
#include <QDir>
#include <QDebug>
#include <QLibraryInfo>
#include <QSettings>
 
LanguageManager* LanguageManager::m_instance = nullptr;
 
LanguageManager::LanguageManager(QObject *parent) : QObject(parent)
{
    m_appTranslator = new QTranslator(this);
    m_qtTranslator = new QTranslator(this);
    
    // 初始化可用语言
    m_languages = {
        {"en_US", "English"},
        {"zh_CN", "简体中文"},
        {"ja_JP", "日本語"}
    };
    
    loadTranslations();
}
 
LanguageManager* LanguageManager::instance()
{
    if (!m_instance) {
        m_instance = new LanguageManager(qApp);
    }
    return m_instance;
}
 
QMap<QString, QString> LanguageManager::availableLanguages() const
{
    return m_languages;
}
 
void LanguageManager::setCurrentLanguage(const QString &languageCode)
{
    if (!m_languages.contains(languageCode) || m_currentLanguage == languageCode) {
        return;
    }
    
    // 加载应用程序翻译
    bool loadSuccess = m_appTranslator->load(QString(":/translations/myapp_%1.qm").arg(languageCode));
    
    if (loadSuccess) {
        QApplication::installTranslator(m_appTranslator);
        
        // 加载Qt基础库翻译
        if (m_qtTranslator->load(QString("qt_%1").arg(languageCode), 
                               QLibraryInfo::location(QLibraryInfo::TranslationsPath))) {
            QApplication::installTranslator(m_qtTranslator);
        }
        
        m_currentLanguage = languageCode;
        
        // 保存到设置
        QSettings settings;
        settings.setValue("Language", languageCode);
        
        emit languageChanged();
    } else {
        qWarning() << "Failed to load translation for" << languageCode;
    }
}
 
QString LanguageManager::currentLanguage() const
{
    return m_currentLanguage;
}
 
void LanguageManager::loadTranslations()
{
    QSettings settings;
    QString lang = settings.value("Language", QLocale::system().name()).toString();
    
    // 如果设置的语言不可用,则使用系统语言或默认英语
    if (!m_languages.contains(lang)) {
        lang = m_languages.contains(QLocale::system().name()) ? 
               QLocale::system().name() : "en_US";
    }
    
    setCurrentLanguage(lang);
}

三、使用示例

1. 主窗口实现

// MainWindow.h
#include <QMainWindow>
#include "LanguageManager.h"
 
namespace Ui {
class MainWindow;
}
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
 
protected:
    void changeEvent(QEvent *e) override;
 
private slots:
    void onLanguageChanged();
    void on_actionChinese_triggered();
    void on_actionEnglish_triggered();
 
private:
    Ui::MainWindow *ui;
    void updateUI();
};
 
// MainWindow.cpp
#include "MainWindow.h"
#include "ui_MainWindow.h"
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    
    // 连接语言改变信号
    connect(LanguageManager::instance(), &LanguageManager::languageChanged,
            this, &MainWindow::onLanguageChanged);
    
    updateUI();
}
 
MainWindow::~MainWindow()
{
    delete ui;
}
 
void MainWindow::changeEvent(QEvent *e)
{
    QMainWindow::changeEvent(e);
    if (e->type() == QEvent::LanguageChange) {
        ui->retranslateUi(this);
        updateUI();
    }
}
 
void MainWindow::onLanguageChanged()
{
    // 语言改变后的处理
    updateUI();
}
 
void MainWindow::updateUI()
{
    // 更新非UI文件中的文本
    setWindowTitle(tr("Multilingual Application"));
    statusBar()->showMessage(tr("Current language: %1")
                            .arg(LanguageManager::instance()->currentLanguage()));
}
 
void MainWindow::on_actionChinese_triggered()
{
    LanguageManager::instance()->setCurrentLanguage("zh_CN");
}
 
void MainWindow::on_actionEnglish_triggered()
{
    LanguageManager::instance()->setCurrentLanguage("en_US");
}

2. 主函数初始化

#include <QApplication>
#include "MainWindow.h"
#include "LanguageManager.h"
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    
    // 初始化语言管理器
    LanguageManager::instance()->>setCurrentLanguage("zh_CN");
    
    MainWindow w;
    w.show();
    
    return a.exec();
}

四、说明

1.翻译文件生成流程:

lupdate myproject.pro  # 生成.ts文件
linguist translations/myapp_zh_CN.ts  # 使用Qt Linguist翻译
lrelease myproject.pro  # 生成.qm文件

资源文件(.qrc)配置:

<RCC>
    <qresource prefix="/">
        <file>translations/myapp_zh_CN.qm</file>
        <file>translations/myapp_en_US.qm</file>
    </qresource>
</RCC>

3.注意事项:

所有需要翻译的字符串必须用tr()包裹

语言切换后,需要手动更新动态生成的文本

对于UI文件中的文本,retranslateUi()会自动处理

考虑不同语言文本长度对布局的影响

到此这篇关于Qt实现语言切换的完整指南的文章就介绍到这了,更多相关Qt语言切换内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++ STL容器详解之红黑树部分模拟实现

    C++ STL容器详解之红黑树部分模拟实现

    本文主要对红黑树进行了详细介绍,并对其核心功能进行了模拟实现。文中的代码对我们的学习或工作有一定的价值,感兴趣的小伙伴可以了解一下
    2021-12-12
  • C语言超详细文件操作基础上篇

    C语言超详细文件操作基础上篇

    这篇文章主要为大家详细介绍了C语言的文件操作,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • 解决 VSCode 编写 C++11 代码报红问题分析

    解决 VSCode 编写 C++11 代码报红问题分析

    今天在写 C++ 代码的时候用上 C++11 的特性,然后发现 VSCode 虽然可以编译通过,但是会在相应位置报红,这是怎么回事呢?下面小编给大家带来了解决方法,一起看看吧
    2021-09-09
  • C语言实现停车场管理系统

    C语言实现停车场管理系统

    这篇文章主要为大家详细介绍了C语言实现停车场管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-11-11
  • Unreal学习之简单三角形的绘制详解

    Unreal学习之简单三角形的绘制详解

    之所以写这个绘制简单三角形的实例其实是想知道如何在Unreal中通过代码绘制自定义Mesh,如果你会绘制一个三角形,那么自然就会绘制复杂的Mesh了。所以这是很多图形工作者的第一课,快跟随小编一起学习起来吧
    2023-02-02
  • C语言中形参和实参的区别小结

    C语言中形参和实参的区别小结

    本文介绍了C语言中形参和实参的区别小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-12-12
  • C++实现查询本机信息的示例代码

    C++实现查询本机信息的示例代码

    这篇文章主要为大家详细介绍了如何利用C++实现查询本机信息,并且进行上报,文中的示例代码讲解详细,具有一定的参考价值,感兴趣的可以了解一下
    2023-05-05
  • 一文详解C++17中的结构化绑定

    一文详解C++17中的结构化绑定

    C++17中的结构化绑定(structured binding)是指将指定名称绑定到初始化程序的子对象或元素,本文主要来和大家聊聊C++17中结构化绑定的实现,感兴趣的小伙伴可以了解下
    2023-12-12
  • c++ 让程序开机自动启动的方法

    c++ 让程序开机自动启动的方法

    这篇文章主要介绍了c++ 让程序开机自动启动的方法,需要的朋友可以参考下
    2017-09-09
  • C++中的状态模式全解析

    C++中的状态模式全解析

    这篇文章给大家介绍了C++中的状态模式,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2026-01-01

最新评论