SoFunction
Updated on 2025-04-24

A complete guide to implementing language switching for Qt

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!