Implementing Internationalization in Qt Applications

Creating Multilingual Qt Applications

When upgrading Qt versions in a project, character encoding issues may arise. Implementing Qt's internationalization mechanism provides a robust solution for handling multiple languages and character sets correctly.

The internationalization process in Qt follows a straightforward three-step approach:

  1. Extract translatable strings from the project
  2. Edit translation files (.ts) with source and target language strings
  3. Deploy translations to the application

Detailed Implementation Steps

1. Create Translation Files

First, generate a translation file for each target language. For example, create a zh_CN.ts file for Chinese. Use the lupdate tool to scan your project and extract all translatable strings into this file:

lupdate your_project.pro -ts zh_CN.ts

2. Edit Translations

Open the .ts file using Qt Linguist, the translation tool included with Qt. For each source string, enter the corresponding translation in your target language. Save the file when complete.

3. Deploy Translations

Use Qt Linguist's "Release Translations" feature to convert .ts files to .qm files, which are the binary format used by Qt applications at runtime.

Note: You can repeat steps 2 and 3 as needed to update translations when your source strings change.

Example Implementation

Below is a practical example demonstrating language switching in a Qt application:

main.cpp

#include <QApplication>
#include <QTranslator>
#include "mainwindow.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    
    QTranslator translator;
    MainWindow window;
    
    // Load default language
    if (translator.load(":/translations/zh_CN.qm")) {
        app.installTranslator(&translator);
        window.setTranslator(&translator);
    }
    
    window.show();
    return app.exec();
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTranslator>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    
    void setTranslator(QTranslator *translator);

private slots:
    void languageChanged(int index);

private:
    void updateTranslations();
    
    QTranslator *m_translator;
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , m_translator(nullptr)
{
    ui->setupUi(this);
    
    // Populate language selector
    ui->languageComboBox->addItem(tr("Chinese"), "zh_CN");
    ui->languageComboBox->addItem(tr("English"), "en_US");
    
    connect(ui->languageComboBox, QOverload<int>::of(&QComboBox::currentIndexChanged),
            this, &MainWindow::languageChanged);
}

MainWindow::~MainWindow()
{
}

void MainWindow::setTranslator(QTranslator *translator)
{
    m_translator = translator;
    updateTranslations();
}

void MainWindow::languageChanged(int index)
{
    QString locale = ui->languageComboBox->itemData(index).toString();
    
    if (m_translator->load(QString(":/translations/%1.qm").arg(locale))) {
        updateTranslations();
    }
}

void MainWindow::updateTranslations()
{
    if (!m_translator) return;
    
    // Update UI elements with translations
    ui->languageComboBox->setItemText(0, tr("Chinese"));
    ui->languageComboBox->setItemText(1, tr("English"));
    ui->statusLabel->setText(tr("Application Status"));
    ui->titleLabel->setText(tr("Internationalization Demo"));
    ui->acceptButton->setText(tr("Accept"));
    ui->rejectButton->setText(tr("Cancel"));
}

This implementation resolves character encoding issues while providing a seamless multilingual experience for users. The solution dynamically loads appropriate translation files based on user selection, ensuring all interface elements display correctly in the selected language.

Tags: Qt Internationalization i18n Localization multilingual

Posted on Wed, 23 Sep 2026 16:15:23 +0000 by martinco