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