在Qt中實現語言動態切換需要以下幾個關鍵步驟,我將提供一個完整的實現方案:
一、準備工作
-
在代碼中使用tr()標記所有需要翻譯的字符串
cpp
button->setText(tr("Submit"));
-
創建翻譯文件
-
在.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();
}
四、說明
-
翻譯文件生成流程:
bash
lupdate myproject.pro # 生成.ts文件 linguist translations/myapp_zh_CN.ts # 使用Qt Linguist翻譯 lrelease myproject.pro # 生成.qm文件
-
資源文件(.qrc)配置:
xml
<RCC><qresource prefix="/"><file>translations/myapp_zh_CN.qm</file><file>translations/myapp_en_US.qm</file></qresource> </RCC>
-
注意事項:
-
所有需要翻譯的字符串必須用tr()包裹
-
語言切換后,需要手動更新動態生成的文本
-
對于UI文件中的文本,retranslateUi()會自動處理
-
考慮不同語言文本長度對布局的影響
-