欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 建筑 > Qt实现语言切换的完整方案

Qt实现语言切换的完整方案

2025/4/26 17:07:34 来源:https://blog.csdn.net/byxdaz/article/details/147466210  浏览:    关键词:Qt实现语言切换的完整方案

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

一、准备工作

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

    cpp

    button->setText(tr("Submit"));
  2. 创建翻译文件

    • 在.pro文件中添加:

      qmake

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

二、核心实现类

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

cpp

#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)

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. 主窗口实现

cpp

// MainWindow.h
#include <QMainWindow>
#include "LanguageManager.h"namespace Ui {
class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECTpublic: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. 主函数初始化

cpp

#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. 翻译文件生成流程

    bash

    lupdate myproject.pro  # 生成.ts文件
    linguist translations/myapp_zh_CN.ts  # 使用Qt Linguist翻译
    lrelease myproject.pro  # 生成.qm文件
  2. 资源文件(.qrc)配置

    xml

    <RCC><qresource prefix="/"><file>translations/myapp_zh_CN.qm</file><file>translations/myapp_en_US.qm</file></qresource>
    </RCC>
  3. 注意事项

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

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

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

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词