Implementing dynamic language switching in Qt requires the following key steps, and I will provide a complete implementation solution:
1. Preparation
1. Use tr() in the code to mark all strings that need to be translated
button->setText(tr("Submit"));
2. Create a translation file
Add in the .pro file:
TRANSLATIONS = translations/myapp_zh_CN.ts \ translations/myapp_en_US.ts
2. Core implementation category
1. Language Manager header file ()
#ifndef LANGUAGEMANAGER_H #define LANGUAGEMANAGER_H #include <QObject> #include <QTranslator> #include <QMap> class LanguageManager : public QObject { Q_OBJECT public: static LanguageManager* instance(); // List of available languages QMap<QString, QString> availableLanguages() const; // Set the current language void setCurrentLanguage(const QString& languageCode); // Get the current language QString currentLanguage() const; signals: // Language changes signal 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. Language Manager Implementation ()
#include "" #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); // Initialize available languages m_languages = { {"en_US", "English"}, {"zh_CN", "Simplified Chinese"}, {"ja_JP", "Japanese"} }; 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; } // Load the application translation bool loadSuccess = m_appTranslator->load(QString(":/translations/myapp_%").arg(languageCode)); if (loadSuccess) { QApplication::installTranslator(m_appTranslator); // Load the Qt basic library translation if (m_qtTranslator->load(QString("qt_%1").arg(languageCode), QLibraryInfo::location(QLibraryInfo::TranslationsPath))) { QApplication::installTranslator(m_qtTranslator); } m_currentLanguage = languageCode; // Save to settings QSettings settings; ("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 = ("Language", QLocale::system().name()).toString(); // If the set language is not available, use the system language or default English if (!m_languages.contains(lang)) { lang = m_languages.contains(QLocale::system().name()) ? QLocale::system().name() : "en_US"; } setCurrentLanguage(lang); }
3. Use examples
1. Main window implementation
// #include <QMainWindow> #include "" 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(); }; // #include "" #include "ui_MainWindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); // Connect language to change signal 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() { // Handling after language changes updateUI(); } void MainWindow::updateUI() { // Update text in non-UI files 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. Main function initialization
#include <QApplication> #include "" #include "" int main(int argc, char *argv[]) { QApplication a(argc, argv); // Initialize the language manager LanguageManager::instance()->>setCurrentLanguage("zh_CN"); MainWindow w; (); return (); }
4. Explanation
1. Translation file generation process:
lupdate # Generate .ts filelinguist translations/myapp_zh_CN.ts # Use Qt Linguist to translatelrelease # Generate .qm file
Resource file (.qrc) configuration:
<RCC> <qresource prefix="/"> <file>translations/myapp_zh_CN.qm</file> <file>translations/myapp_en_US.qm</file> </qresource> </RCC>
3. Notes:
All strings that need to be translated must be wrapped in tr()
After the language switch, the dynamically generated text needs to be manually updated.
RetranslateUi() will automatically process text in UI files
Consider the impact of text lengths on layout in different languages
This is the article about this complete guide to implementing Qt language switching. For more related Qt language switching content, please search for my previous articles or continue browsing the related articles below. I hope everyone will support me in the future!