Qt 实现多国语言功能 — 01
Qt实现多国语言的过程需要有以下几点:
- 代码中需要翻译的内容需要用
QObject::tr()
函数来包住。 - UI上的字串只要让可翻译的选项被选中即可。
- 翻译时需要创建
.ts
文件,该文件实际上为xml文本,可以直接打开。 - 用
Qt Linguist
来打开以上的.ts
文件并对需要的字串进行翻译。 - 翻译完成后需要发布成
.qm
文件,该文件实际上为.ts
文件的二进制样式,所占空间会小很多。 - 然后在代码里通过
QTranslator
的对象来加载以上生成的.qm
文件,即可显示当前语言的内容。
1. 设置需要显示的字串内容。
将需要翻译的字串内容设置在UI上或者通过tr()
来在代码中设置
- UI上需要设置具体的字串内容并保持可翻译的被选中。
- 代码中的需要翻译的内容需要用
QObject::tr()
来设置
ui.btn02->setText(tr("Test button 02"));
// 需要带参数进行格式化的字符串,可以使用如下的 arg()来进行操作
ui.lb02->setText(tr("My Label02, val=%1, name=%2").arg(106).arg("City"));
2. 生成 .ts
文件
如果直接点击 Create New Translation File 可能会生成对应语言的 .ts
文件,但是该文件却无法打开,且项目目录里面也没有该.ts
文件。

需要在项目属性中的 Qt Transtation > Run Translation Tool During Build 处选择 lupdate 选项,表示在编译的时候会更新对应的.ts
文件。保存该设置后,重新编译该项目,既可以在目录下生成对应的.ts
文件。

3. 通过 Qt Linguist
来翻译 .ts
文件中的字串为对应的内容
-
通过如下方式来启动
Qt Linguist
-
在
Qt Linguist
中打开需要进行翻译的所有.ts
文件
-
对打开的文件进行翻译成对应的语言,带有参数的字串需要保持
%1
等占位符不变。翻译过的字串点击工具栏中的绿色对勾,表示已经翻译完,对应的字串前会显示绿色的对勾。
-
翻译完所有的字串后点击 发布 即可生成对应的
.qm
文件,该文件即为需要被加载的对应语言的字串包。一般将生成的所有.qm
文件放到对应的程序执行目录下,便于加载。
4. 在代码中加载需要显示的语言所对应的.qm
文件
.h
文件如下:
#pragma once
#include <QtWidgets/QMainWindow>
#include "ui_QtApp03_SimpleChangeLang.h"
/// <summary>
/// 枚举需要显示的语言
/// </summary>
enum Language
{
zh_cn,
en_us,
undefined
};
class QtApp03_SimpleChangeLang : public QMainWindow
{
Q_OBJECT
public:
QtApp03_SimpleChangeLang(QWidget *parent = Q_NULLPTR);
/// <summary>
/// 根据当前要显示的语言,来加载对应的 qm 文件。
/// 该函数在构造函数中执行,所以只是在程序启动时设置一次,不可以进行动态切换语言。
/// </summary>
void LoadSetLanguage();
/// <summary>
/// 设置控件的字符串内容,用tr包住
/// </summary>
void SetDynamicText();
private:
Ui::QtApp03_SimpleChangeLangClass ui;
};
.cpp
文件如下 :
#include "QtApp03_SimpleChangeLang.h"
#include <qtranslator.h> //QTranslator 的头文件
QtApp03_SimpleChangeLang::QtApp03_SimpleChangeLang(QWidget *parent)
: QMainWindow(parent)
{
// 需要先加载对应的语言包,后面再设置对应的字串内容时会进行替换,否则无法生效。
LoadSetLanguage();
ui.setupUi(this);
SetDynamicText();
}
void QtApp03_SimpleChangeLang::SetDynamicText()
{
ui.btn02->setText(tr("Test button 02"));
ui.lb02->setText(tr("My Label02, val=%1, name=%2").arg(106).arg("City"));
}
void QtApp03_SimpleChangeLang::LoadSetLanguage()
{
// 设置当前要显示的语言
Language curLan = Language::zh_cn;
bool ret = false;
// 创建QTranslator的对象
QTranslator* trans = new QTranslator();
// 根据语言的来加载对应的语言包
if (curLan == Language::en_us)
{
ret = trans->load("qtapp03_simplechangelang_en.qm");
}
else if (curLan == Language::zh_cn)
{
ret = trans->load("qtapp03_simplechangelang_zh.qm");
}
// 加载成功后执行 installTranslator
if (ret)
{
qApp->installTranslator(trans);
}
}
【注意】
LoadSetLanguage()
:函数应该在设置字串之前被加载,因为tr()
函数相当于在当前加载的语言包中进行搜索替代,如果找到有对应的翻译就会用翻译的内容进行替代显示。如果没有找到就以代码中的字串进行显示。- 该方法只是在构造函数运行时,设置一次语言包,因此不能进行动态热切换字串。

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具