Qt 国际化 #

国际化概述 #

text
┌─────────────────────────────────────────────────────────────┐
│                    Qt 国际化流程                             │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   1. 代码中使用 tr() 包裹可翻译字符串                        │
│         │                                                   │
│         ▼                                                   │
│   2. 使用 lupdate 提取字符串到 .ts 文件                     │
│         │                                                   │
│         ▼                                                   │
│   3. 使用 Qt Linguist 翻译字符串                            │
│         │                                                   │
│         ▼                                                   │
│   4. 使用 lrelease 生成 .qm 文件                            │
│         │                                                   │
│         ▼                                                   │
│   5. 运行时加载翻译文件                                     │
│                                                             │
└─────────────────────────────────────────────────────────────┘

代码中的国际化 #

使用 tr() 函数 #

cpp
class MyWidget : public QWidget
{
    Q_OBJECT  // 必须有 Q_OBJECT 宏

public:
    MyWidget(QWidget *parent = nullptr) : QWidget(parent)
    {
        // 使用 tr() 包裹可翻译字符串
        QLabel *label = new QLabel(tr("Hello World"));
        
        QPushButton *button = new QPushButton(tr("Click Me"));
        
        // 带参数的翻译
        QString msg = tr("Welcome, %1!").arg(userName);
        
        // 复数形式
        QString files = tr("%n file(s) found", nullptr, count);
    }
};

非类成员函数中使用 #

cpp
// 使用 QCoreApplication::translate()
QString message = QCoreApplication::translate("MyContext", "Hello");

// 或使用 QT_TR_NOOP 宏标记
static const char * const messages[] = {
    QT_TR_NOOP("Message 1"),
    QT_TR_NOOP("Message 2")
};

// 然后翻译
QString translated = tr(messages[0]);

提取和翻译 #

项目配置 (.pro) #

qmake
# 指定翻译文件
TRANSLATIONS += \
    translations/app_zh_CN.ts \
    translations/app_en.ts \
    translations/app_ja.ts

提取字符串 #

bash
# 提取可翻译字符串
lupdate myproject.pro

# 或指定源文件和输出文件
lupdate src/*.cpp src/*.h -ts translations/app_zh_CN.ts

使用 Qt Linguist #

bash
# 打开翻译文件
linguist translations/app_zh_CN.ts

生成二进制翻译文件 #

bash
# 生成 .qm 文件
lrelease translations/app_zh_CN.ts

加载翻译文件 #

基本加载 #

cpp
#include <QTranslator>
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    
    QTranslator translator;
    
    // 加载翻译文件
    if (translator.load(":/translations/app_zh_CN.qm")) {
        app.installTranslator(&translator);
    }
    
    MainWindow w;
    w.show();
    
    return app.exec();
}

动态切换语言 #

cpp
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    MainWindow(QWidget *parent = nullptr) : QMainWindow(parent)
    {
        // 创建语言菜单
        QMenu *languageMenu = menuBar()->addMenu(tr("Language"));
        
        QAction *englishAction = languageMenu->addAction("English");
        QAction *chineseAction = languageMenu->addAction("中文");
        
        connect(englishAction, &QAction::triggered, [this]() {
            switchLanguage("en");
        });
        
        connect(chineseAction, &QAction::triggered, [this]() {
            switchLanguage("zh_CN");
        });
    }
    
    void switchLanguage(const QString &locale)
    {
        // 移除旧翻译器
        if (translator) {
            qApp->removeTranslator(translator);
            delete translator;
        }
        
        // 加载新翻译
        translator = new QTranslator(this);
        QString file = QString(":/translations/app_%1.qm").arg(locale);
        
        if (translator->load(file)) {
            qApp->installTranslator(translator);
        }
        
        // 刷新界面
        retranslateUi();
    }
    
    void changeEvent(QEvent *event) override
    {
        if (event->type() == QEvent::LanguageChange) {
            retranslateUi();
        }
        QMainWindow::changeEvent(event);
    }
    
    void retranslateUi()
    {
        // 更新所有界面文本
        setWindowTitle(tr("My Application"));
        // ... 更新其他控件
    }

private:
    QTranslator *translator = nullptr;
};

下一步 #

现在你已经掌握了国际化,接下来学习 跨平台开发,了解 Qt 的跨平台特性!

最后更新:2026-03-29