当前位置: 首页 > news >正文

在 Qt 中加载 .qm 翻译文件

在 Qt 中加载 .qm 翻译文件
Qt 使用 .qm 文件(由 .ts 文件编译生成)来实现应用程序的国际化(i18n)。以下是加载 .qm 文件到 Qt 程序的几种方法:

  1. 基本加载方法
cpp
#include <QApplication>
#include <QTranslator>int main(int argc, char *argv[])
{QApplication app(argc, argv);// 创建翻译器对象QTranslator translator;// 加载翻译文件if (translator.load(":/translations/myapp_zh_CN.qm")) {app.installTranslator(&translator);} else {qWarning() << "Failed to load translation file";}// 你的应用程序代码...return app.exec();
}
  1. 从文件系统加载
cpp
// 从应用程序目录加载
translator.load("translations/myapp_zh_CN.qm");// 或者使用绝对路径
translator.load("/path/to/translations/myapp_zh_CN.qm");
  1. 从资源文件加载(推荐)
    首先将 .qm 文件添加到 .qrc 资源文件中:
xml
<RCC><qresource prefix="/translations"><file>myapp_zh_CN.qm</file></qresource>
</RCC>
然后在代码中加载:cpp
translator.load(":/translations/myapp_zh_CN.qm");
  1. 动态切换语言
cpp
// 切换翻译的函数
void switchLanguage(const QString &language)
{QTranslator *translator = new QTranslator(qApp);if (translator->load(":/translations/myapp_" + language + ".qm")) {qApp->removeTranslator(currentTranslator); // 移除旧的qApp->installTranslator(translator);      // 安装新的currentTranslator = translator;} else {delete translator;}
}
  1. 自动检测系统语言
cpp
// 获取系统语言
QString locale = QLocale::system().name(); // 如 "zh_CN"QTranslator translator;
if (translator.load(":/translations/myapp_" + locale + ".qm")) {app.installTranslator(&translator);
}
注意事项
文件生成:确保 .qm 文件已通过 lrelease 工具从 .ts 文件生成:text
lrelease myapp_zh_CN.ts
翻译对象生命周期:QTranslator 对象必须在整个应用程序生命周期内保持存在字符串标记:源代码中所有需要翻译的字符串必须用 tr() 包裹:cpp
QString text = tr("Hello World");
UI 文件翻译:.ui 文件中的字符串会自动被 uic 工具处理,无需手动标记多翻译文件:可以同时加载多个翻译文件(如主程序翻译和库翻译)资源更新:如果修改了翻译文件,需要重新编译并运行程序才能看到效果

完整示例

cpp
#include <QApplication>
#include <QTranslator>
#include <QLabel>
#include <QPushButton>
#include <QVBoxLayout>
#include <QDebug>int main(int argc, char *argv[])
{QApplication app(argc, argv);// 加载翻译QTranslator translator;if (translator.load(":/translations/myapp_zh_CN.qm")) {app.installTranslator(&translator);}// 创建带翻译文本的UIQWidget window;QVBoxLayout *layout = new QVBoxLayout(&window);QLabel *label = new QLabel(tr("Hello World!"));QPushButton *button = new QPushButton(tr("Click Me"));layout->addWidget(label);layout->addWidget(button);window.show();return app.exec();
}
http://www.dtcms.com/a/361619.html

相关文章:

  • 基本问题解决--舵机
  • 选择图片转base64格式组件简单封装-Base64ImageInpu
  • nestjs 发起请求 axios
  • Onion-LO(已开源)——LIDAR里程计的统一框架
  • IO进程线程;标准io;文件IO;0901
  • PyTorch 实战(3)—— PyTorch vs. TensorFlow:深度学习框架的王者之争
  • 「日拱一码」075 机器学习——密度泛函理论DFT
  • 在 Unity 中调用腾讯云机器翻译
  • 命名空间级别应用 Pod 安全标准
  • 在 Ubuntu 24.04 LTS 上安装 SSH 并启用服务端实现远程连接
  • 别再刷屏console.log!JavaScript高级调试方法全攻略
  • Product Hunt 每日热榜 | 2025-08-30
  • C++“类吸血鬼幸存者”游戏制作的要点学习
  • IO_HW_9_1
  • 【零碎小知识点 】(二)Java基础与常用API编码实践
  • day2
  • 【STM32】中断软件分支处理( NVIC 和 GIC)
  • curl 介绍及使用教程
  • Kotlin 协程异步任务工具类:高效处理异步操作与超时控制
  • 构建共享新生态的智慧物流开源了
  • ClickHouse常见问题——ClickHouseKeeper配置listen_host后不生效
  • java设计模式一、单例模式
  • 查看LoRA 哪个适配器处于激活状态(67)
  • 【秋招笔试】2025.08.31小红书秋招笔试真题
  • 鸿蒙NEXT开发指南:Image、Video与Swiper组件全面解析
  • Mac idea 格式化代码快捷键
  • 用滑动窗口与线性回归将音频信号转换为“Token”序列:一种简单的音频特征编码方法
  • 若依vue自定义发布环境部署后所有菜单无法点击
  • Kubernetes一网络组件概述
  • 如何正确使用ChatGPT做数学建模比赛——数学建模AI使用技巧