精选南昌网站建设公司,wordpress增加标签,深圳公明网站建设公司,易企秀+旗下+网站建设目录
1.简介
2.QTranslator说明
3.语言文件制作
3.1.前置条件
3.2.完整制作流程
4.多语言示例
5.关键注意事项
5.1.tr()的正确使用
5.2.将 .qm 嵌入资源文件#xff08;避免外置#xff09;
5.3.翻译 Qt 内置控件文本#xff08;如 QMessageBox#xff09;
5.4.…目录1.简介2.QTranslator说明3.语言文件制作3.1.前置条件3.2.完整制作流程4.多语言示例5.关键注意事项5.1.tr()的正确使用5.2.将 .qm 嵌入资源文件避免外置5.3.翻译 Qt 内置控件文本如 QMessageBox5.4.批量处理多语言文件脚本化6.总结1.简介在 Qt 中QTranslator是实现多语言切换的核心类它通过加载预编译的翻译文件.qm将程序中标记的字符串替换为目标语言。实现原理1.关键类与工具QTranslator加载.qm翻译文件提供字符串翻译映射。QCoreApplication::installTranslator()为应用安装翻译器使tr()标记的字符串被翻译。lupdate从代码中提取待翻译字符串生成.tsXML 格式源文件。Qt Linguist可视化翻译工具编辑.ts文件并保存。lrelease将翻译完成的.ts编译为二进制.qm文件程序运行时加载。2.核心逻辑用tr()包裹所有需要翻译的字符串tr()会关联当前类的 “上下文”确保翻译准确。通过工具链生成并编译翻译文件。程序启动 / 切换语言时加载对应语言的.qm文件安装到应用中并刷新界面文本。2.QTranslator说明1.load()load()是QTranslator最核心的接口用于加载.qm文件返回booltrue表示加载成功。所有重载均支持本地路径、资源路径:/xxx.qm。重载签名功能说明参数解析典型场景bool load(const QString fileName, const QString directory QString(), const QString searchDelimiters QString(), const QString suffix QString())加载指定路径的.qm文件-fileName文件名可含后缀如zh_CN.qm-directory文件所在目录可选为空则使用当前工作目录-searchDelimiters搜索分隔符极少用默认空-suffix文件后缀默认.qm加载本地 / 资源文件系统中的自定义.qm最常用bool load(const QLocale locale, const QString baseName, const QString prefix QString(), const QString directory QString(), const QString suffix QString())按区域设置自动匹配翻译文件-locale目标区域如QLocale::Chinese/QLocale(en_US)-baseName文件名前缀如app- 其他参数同上自动匹配系统 / 指定区域的翻译文件如baseNameapplocalezh_CN→ 加载app_zh_CN.qmbool load(const QByteArray data, const QString fileName QString())从内存字节数组加载翻译数据-data.qm文件的二进制数据-fileName标识名仅用于日志无实际加载作用加载网络下载 / 内存缓存的.qm数据bool load(QLibraryInfo::LibraryLocation location, const QString fileName, const QString prefix QString(), const QString suffix QString())加载 Qt 内置翻译文件Qt6 新增-locationQt 库路径如QLibraryInfo::TranslationsPath指向 Qt 内置翻译文件目录- 其他参数同上加载 Qt 自带控件的翻译文件如qt_zh_CN.qm关键说明加载失败原因文件不存在、路径错误、.qm损坏、Qt 版本不兼容如 Qt5 编译的.qm无法在 Qt6 加载资源文件加载路径以:/开头如translator.load(:/translations/zh_CN.qm)。示例QTranslator trans; // 方式1加载本地文件 trans.load(translations/zh_CN.qm); // 方式2加载资源文件 trans.load(:/translations/en_US.qm); // 方式3按QLocale加载自动匹配zh_CN trans.load(QLocale::Chinese, app, _, translations); // 加载 translations/app_zh_CN.qm // 方式4加载Qt内置翻译文件Qt6 QTranslator qtTrans; qtTrans.load(QLibraryInfo::TranslationsPath, qt, _, zh_CN); // 加载 qt_zh_CN.qm2.翻译字符串核心translate()系列translate()是翻译的核心接口QObject::tr()底层会调用当前安装的翻译器的translate()方法。返回翻译后的字符串无匹配时返回源文本。重载签名功能说明参数解析QString translate(const char *context, const char *sourceText, const char *disambiguation nullptr, int n -1) const核心翻译接口支持普通 / 消歧 / 复数翻译-context上下文tr()默认为当前类名如MainWindow-sourceText待翻译的源文本-disambiguation消歧符区分相同源文本的不同含义如 “Close” 可指 “关闭窗口”/“关闭文件”-n复数计数-1 表示非复数≥0 时处理复数形式QString translate(const char *context, const char *sourceText, const char *disambiguation, int n, const QString locale) constQt6指定区域的翻译极少用新增locale目标区域编码如zh_CN关键说明上下文一致性context必须与lupdate提取的上下文.ts中的上下文一致否则翻译失效复数处理n为计数时需配合.ts中复数规则如%n file(s)翻译为 “1 个文件”/“5 个文件”消歧符同一源文本在不同场景有不同翻译时使用如tr(Close, Window)vstr(Close, File)。示例QTranslator trans; trans.load(translations/zh_CN.qm); // 普通翻译上下文Global源文本OK QString okText trans.translate(Global, OK); // 输出“确定” // 带消歧符的翻译 QString closeWin trans.translate(Global, Close, Window); // “关闭窗口” QString closeFile trans.translate(Global, Close, File); // “关闭文件” // 复数翻译 QString file1 trans.translate(Global, %n file(s), nullptr, 1); // “1个文件” QString file5 trans.translate(Global, %n file(s), nullptr, 5); // “5个文件”3.翻译器管理接口父翻译器支持设置 “父翻译器”当前翻译器无匹配的翻译时自动回退到父翻译器查找实现翻译兜底。接口签名功能说明使用场景void setParentTranslator(QTranslator *parent)设置父翻译器主翻译器 兜底翻译器如 Qt 内置翻译器作为父翻译器QTranslator *parentTranslator() const获取当前父翻译器检查 / 修改父翻译器配置示例// 自定义应用翻译器业务文本 QTranslator appTrans; appTrans.load(app_zh_CN.qm); // Qt内置翻译器Qt控件文本如QMessageBox的Cancel QTranslator qtTrans; qtTrans.load(qt_zh_CN.qm, QLibraryInfo::path(QLibraryInfo::TranslationsPath)); // 设置父翻译器appTrans查不到时自动用qtTrans翻译 appTrans.setParentTranslator(qtTrans); // 仅安装appTrans即可自动兜底到qtTrans qApp-installTranslator(appTrans);4.辅助功能接口接口签名功能说明适用版本使用场景bool isEmpty() const判断翻译器是否加载了有效翻译数据Qt5检查.qm是否加载成功补充load()返回值void clear()清空翻译器中所有已加载的翻译数据Qt5切换语言前清空旧翻译数据QString language() const返回翻译文件的目标语言编码如zh_CN/en_USQt6.2识别当前翻译器的语言Qt5 需自行解析.qm文件名QStringList translations() const返回所有已加载的翻译条目源文本列表Qt6调试翻译数据确认是否包含目标字符串示例QTranslator trans; trans.load(zh_CN.qm); if (trans.isEmpty()) { qDebug() 翻译文件加载为空; } else { qDebug() 当前翻译语言 trans.language(); // Qt6输出zh_CN qDebug() 翻译条目数 trans.translations().size(); // Qt6 } // 清空翻译数据 trans.clear();3.语言文件制作Qt 语言文件制作是实现多语言的核心环节核心产物是.ts翻译源文件XML 格式和.qm编译后的二进制文件程序运行加载。3.1.前置条件安装 Qt 开发环境含lupdate、lrelease工具和Qt Linguist可视化翻译工具代码中已用tr()/QCoreApplication::translate()标记所有待翻译字符串需确保类继承QObject并添加Q_OBJECT宏。3.2.完整制作流程1.项目配置.pro 文件在项目的.pro文件中声明TRANSLATIONS变量指定要生成的.ts文件路径关键lupdate会根据此列表生成 / 更新.ts。QT core gui widgets # 源码/头文件示例 SOURCES main.cpp mainwindow.cpp HEADERS mainwindow.h # 声明翻译文件建议放在translations子目录需手动创建 TRANSLATIONS translations/zh_CN.ts \ translations/en_US.ts \ translations/ja_JP.ts # 可选配置Qt5.11 CONFIG lrelease # 构建项目时自动编译.ts为.qm CONFIG embed_translations # 将.qm嵌入程序无需外置文件注意若未加CONFIG lrelease需手动执行lrelease编译.qm。2.提取字符串生成 .ts 文件lupdate工具会扫描代码中tr()标记的字符串生成 / 更新.ts文件XML 格式可直接用文本编辑器打开但推荐用 Qt Linguist 编辑。1)Qt 语言家 → 更新翻译 (lupdate) 界面进行操作。2)命令行操作推荐批量 / 自动化需先配置 Qt 环境变量如Qt6.5.0\mingw_64\bin加入系统 PATH然后执行# 进入项目根目录 cd /path/to/your/project # 基础用法根据.pro文件生成/更新.ts lupdate your_project.pro # 进阶用法指定编码、忽略文件 lupdate your_project.pro -encoding utf-8 -exclude third_party/*lupdate 常用参数参数说明-encoding 编码指定源码编码如 utf-8默认自动识别-exclude 路径忽略指定目录 / 文件如第三方库代码-ts 文件列表手动指定要生成的.ts 文件覆盖.pro 中的 TRANSLATIONS-no-obsolete移除.ts 中已不存在的字符串清理无效翻译3.使用 Qt Linguist 翻译 .ts 文件Qt Linguist是 Qt 官方可视化翻译工具支持普通字符串、复数、消歧符翻译是处理.ts的核心工具。操作比较简单就不在这里赘述了。4.编译 .ts 为 .qm 文件1)界面执行发布翻译 (lrelease)执行后translations目录下会生成对应的.qm文件。2)命令行操作# 基础用法编译单个.ts为.qm lrelease translations/zh_CN.ts -qm translations/zh_CN.qm # 进阶用法批量编译所有.ts lrelease your_project.pro # 可选参数压缩qm、移除未翻译条目 lrelease translations/zh_CN.ts -qm translations/zh_CN.qm -compress -remove-untranslatedlrelease 常用参数参数说明-compress压缩.qm文件减小体积-remove-untranslated移除未翻译的字符串减小 qm 体积-threshold 百分比仅保留翻译完成率≥指定百分比的条目4.多语言示例在main.cpp中加载指定语言的.qm文件并安装到应用中。#include QApplication #include QTranslator #include QLocale #include QDir #include mainwindow.h int main(int argc, char *argv[]) { QApplication a(argc, argv); // 1. 创建翻译器对象 QTranslator translator; // 2. 加载qm文件优先加载系统语言或指定语言 QLocale locale QLocale::system(); // 获取系统语言如zh_CN、en_US // 拼接qm文件路径需确保路径正确 QString qmPath QString(translations/%1.qm).arg(locale.name()); // 加载指定语言测试用如强制加载英文 // QString qmPath translations/en_US.qm; if (translator.load(qmPath)) { // 3. 安装翻译器到应用核心步骤 a.installTranslator(translator); qDebug() 加载翻译文件成功 qmPath; } else { qDebug() 加载翻译文件失败 qmPath; // 加载失败时加载默认英文可选 translator.load(translations/en_US.qm); a.installTranslator(translator); } MainWindow w; w.show(); return a.exec(); }实际项目中需支持运行时切换语言如按钮切换中英核心逻辑卸载旧翻译器 → 加载新.qm→ 重新安装翻译器。刷新所有界面控件的文本tr()需重新触发。实现示例mainwindow.h#ifndef MAINWINDOW_H #define MAINWINDOW_H #include QMainWindow #include QTranslator QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACE class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent nullptr); ~MainWindow(); // 切换语言的公共接口 void switchLanguage(const QString languageCode); // 如zh_CN、en_US private slots: // 按钮点击槽函数切换中文/英文 void on_btnZhCn_clicked(); void on_btnEnUs_clicked(); private: Ui::MainWindow *ui; QTranslator *m_translator; // 翻译器对象需全局避免析构 // 刷新界面文本核心重新设置所有控件的tr()文本 void refreshUI(); }; #endif // MAINWINDOW_Hmainwindow.cpp#include mainwindow.h #include ui_mainwindow.h #include QApplication #include QDebug MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) , m_translator(new QTranslator(this)) // 创建翻译器父对象管理内存 { ui-setupUi(this); // 初始化界面文本用tr()包裹 refreshUI(); } MainWindow::~MainWindow() { delete ui; } // 切换语言核心逻辑 void MainWindow::switchLanguage(const QString languageCode) { // 1. 卸载旧翻译器 qApp-removeTranslator(m_translator); // 2. 加载新语言的qm文件 QString qmPath QString(translations/%1.qm).arg(languageCode); bool loadOk m_translator-load(qmPath); if (loadOk) { // 3. 安装新翻译器 qApp-installTranslator(m_translator); qDebug() 切换语言成功 languageCode; } else { qDebug() 切换语言失败加载默认英文 qmPath; m_translator-load(translations/en_US.qm); qApp-installTranslator(m_translator); } // 4. 刷新界面文本 refreshUI(); } // 刷新所有控件的文本必须手动重新设置因为tr()仅在初始化时生效 void MainWindow::refreshUI() { // 窗口标题 this-setWindowTitle(tr(多语言示例)); // 按钮文本 ui-btnZhCn-setText(tr(切换为中文)); ui-btnEnUs-setText(tr(切换为英文)); // 标签文本 ui-label-setText(tr(欢迎使用Qt多语言功能)); } // 切换中文按钮 void MainWindow::on_btnZhCn_clicked() { switchLanguage(zh_CN); } // 切换英文按钮 void MainWindow::on_btnEnUs_clicked() { switchLanguage(en_US); }5.关键注意事项5.1.tr()的正确使用必须继承 QObject Q_OBJECT 宏tr()是QObject的成员函数自定义类需继承QObject并添加Q_OBJECT宏否则lupdate无法提取字符串。class MyWidget : public QWidget { Q_OBJECT // 必须加 public: MyWidget() { setWindowTitle(tr(我的窗口)); // 正确 } };上下文一致性tr()的上下文默认是当前类名若需跨类共享翻译可使用QCoreApplication::translate()指定上下文// 上下文为Global所有地方用此上下文可共享翻译 QString text QCoreApplication::translate(Global, 确定);避免动态拼接字符串tr()无法识别拼接的字符串需拆分后翻译// 错误tr无法提取共 num 条 ui-label-setText(tr(共 QString::number(num) 条)); // 正确用arg()占位符 ui-label-setText(tr(共%1条).arg(num));5.2.将 .qm 嵌入资源文件避免外置将.qm文件加入qrc资源文件程序无需依赖外置文件1.创建translations.qrc文件RCC qresource prefix/translations filetranslations/zh_CN.qm/file filetranslations/en_US.qm/file /qresource /RCC2.在.pro文件中添加RESOURCES translations.qrc3.代码中加载资源文件中的.qmtranslator.load(:/translations/zh_CN.qm); // 路径以:/开头5.3.翻译 Qt 内置控件文本如 QMessageBoxQt 自带控件如QMessageBox、QFileDialog的默认文本“OK”、“取消”需加载 Qt 官方翻译文件找到 Qt 安装目录下的内置翻译文件如Qt6.5.0\translations\qt_zh_CN.qm复制到项目translations目录或直接加载QTranslator qtTrans; // Qt6通过QLibraryInfo获取内置翻译路径 qtTrans.load(qt_zh_CN.qm, QLibraryInfo::path(QLibraryInfo::TranslationsPath)); qApp-installTranslator(qtTrans); // Qt5手动拼接路径 // qtTrans.load(qt_zh_CN.qm, QCoreApplication::applicationDirPath() /translations);5.4.批量处理多语言文件脚本化若项目有大量语言文件可编写批处理脚本.bat/.sh自动化:: batch.batWindows echo off cd /d %~dp0 # 进入脚本所在目录 :: 更新ts lupdate your_project.pro :: 编译所有ts为qm lrelease your_project.pro echo 语言文件编译完成 pause6.总结Qt 语言文件制作的核心流程是项目配置(.pro)→lupdate提取.ts→Qt Linguist翻译.ts→lrelease编译.qmQt 多语言实现的核心是用tr()标记待翻译字符串。通过lupdate/Qt Linguist/lrelease生成.qm文件。代码中加载.qm并安装翻译器切换语言时刷新界面。掌握这些后可灵活实现静态加载系统语言、运行时动态切换语言、翻译兜底等多语言场景需求。