Qt如何翻译JSON内容

🌐 Qt如何翻译JSON内容


目录

    • [✨ 功能特点](#✨ 功能特点)
    • [🔑 关键实现点](#🔑 关键实现点)
      • [1️⃣ JSON内容翻译的实现](#1️⃣ JSON内容翻译的实现)
      • [2️⃣ 翻译文件加载](#2️⃣ 翻译文件加载)
      • [3️⃣ 动态切换语言](#3️⃣ 动态切换语言)
      • [4️⃣ CMake配置](#4️⃣ CMake配置)
    • [📦 必要组件](#📦 必要组件)
    • [🔧 优化建议](#🔧 优化建议)
    • [⚠️ 注意事项](#⚠️ 注意事项)
    • [💡 为什么选择这种方法?](#💡 为什么选择这种方法?)
    • [🔗 相关链接](#🔗 相关链接)

✨ 功能特点

  • 📊 支持JSON数据的多语言翻译
  • 🔄 实时语言切换而无需重启应用
  • 🛠️ 与Qt标准翻译机制完全集成
  • 📱 在QML界面中简单使用

🔑 关键实现点

1️⃣ JSON内容翻译的实现

在QML中使用qsTranslate函数翻译JSON内容:

qml 复制代码
// 翻译静态文本
text: qsTranslate("HULU", "高达")

// 动态翻译JSON内容 
text: "GD:" + qsTranslate("HULU", test.ts.GD)
text: "JW:" + qsTranslate("HULU", test.ts.JW)
text: "EFSF:" + qsTranslate("HULU", test.ts.EFSF)

关键点

  • "HULU"是翻译上下文(context)
  • test.ts.GD是从JSON加载的文本内容
  • 此方法将JSON内容作为翻译的源文本提供给翻译系统

2️⃣ 翻译文件加载

必须要在代码里实现qm文件的加载!使用engine.setUiLanguage和qApp->installTranslator

cpp 复制代码
// 加载翻译文件
QMap<QString, QTranslator*> translators;
auto path = QString("%1/translations").arg(QCoreApplication::applicationDirPath());
QDir dir(path);
for (const auto& info : dir.entryInfoList({"*.qm"}, QDir::Files, QDir::Size)) {
    if (auto translator = new QTranslator(qApp);
        translator->load(info.absoluteFilePath())) {
            translators.insert(translator->language(), translator);
        }
}
// 中文是源语言,所以需要插入一个空翻译器
translators.insert("zh_CN", nullptr);

// 语言切换实现
auto currentLanguage = test.isChinese() ? "zh_CN" : "en_US";
engine.setUiLanguage(currentLanguage);
qApp->installTranslator(translators[currentLanguage]);

3️⃣ 动态切换语言

cpp 复制代码
QObject::connect(&test, &Test::isChineseChanged, &engine, [&]() {
    // 先清除所有现有翻译器
    const auto translator = translators[currentLanguage];
    qApp->removeTranslator(translator);
    
    // 重新加载翻译文件
    currentLanguage = test.isChinese() ? "zh_CN" : "en_US";
    qApp->installTranslator(translators[currentLanguage]);
    
    // 设置新的UI语言
    engine.setUiLanguage(currentLanguage);
    qDebug() << "更新翻译:" << (test.isChinese() ? "zh_CN" : "en_US");
});

4️⃣ CMake配置

这里需要重点解释一下:

  1. qt5_add_translation: 是Qt5.15版本新增的函数,用于将.ts文件转换为.qm文件
  2. add_custom_target: 是CMake的函数,用于添加一个自定义目标,这里使用的目的就是为了生成.qm文件
  3. add_custom_command: 是CMake的函数,用于添加一个自定义命令,这里使用的目的就是为了将.qm文件复制到翻译目录
  4. add_dependencies: 是CMake的函数,用于添加一个依赖,这里使用的目的就是为了在编译时,先生成.qm文件,再编译项目
cmake 复制代码
# 翻译文件处理
set(TS_FILE ${CMAKE_SOURCE_DIR}/Info_en_US.ts)
qt5_add_translation(QM_FILES ${TS_FILE})
add_custom_target(qmfiles ALL DEPENDS ${QM_FILES})
add_custom_command(TARGET QtCppDemo DEPENDS qmfiles
    COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_CURRENT_BINARY_DIR}/translations"
    COMMAND ${CMAKE_COMMAND} -E copy_if_different ${QM_FILES} "${CMAKE_CURRENT_BINARY_DIR}/translations"
    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
)
add_dependencies(QtCppDemo qmfiles)

📦 必要组件

  1. 翻译文件(.ts)

    • 包含所有需翻译的字符串(包括JSON中的内容)
    • 使用lupdate工具从源代码提取字符串(本实例用的是JSON文件,使用lupdate应该无法生成,所以需要手动创建ts文件并手动填入内容
    • 使用linguist工具编辑翻译
  2. 编译后的翻译文件(.qm)

    • 从.ts文件通过lrelease工具生成
    • 在CMake中使用qt5_add_translation(推荐使用)
  3. 翻译安装

    • 创建QTranslator对象
    • 加载.qm文件
    • 使用qApp->installTranslator()安装翻译器
  4. 在QML中使用翻译

    • 使用qsTranslate("上下文", "源文本")翻译JSON内容

🔧 优化建议

  1. 更灵活的语言选择 🌍:

    • 当前实现只支持中英文切换,可扩展为支持更多语言
    • 可添加语言选择菜单而不仅是开关
  2. 自动检测系统语言 🔍:

    cpp 复制代码
    // 获取系统区域设置
    QString locale = QLocale::system().name();
    // 根据系统语言设置初始语言
  3. 使用资源系统管理翻译文件 📁:

    • 将.qm文件嵌入到资源系统,避免依赖外部文件
    cmake 复制代码
    qt5_add_translation(QM_FILES ${TS_FILES})
    # 将生成的qm文件添加到资源文件中
    qt5_add_resources(QRC_FILES translations.qrc)
  4. 分离翻译上下文 🧩:

    • 对界面文本和JSON内容使用不同的翻译上下文,便于管理
  5. 缓存翻译结果 ⚡:

    • 对于频繁使用的JSON键值对,可以考虑缓存翻译结果以提高性能

⚠️ 注意事项

  1. JSON内容必须作为源文本在.ts文件中存在
  2. 更新JSON内容后需要手动更新翻译文件
  3. 需确保翻译目录存在并且包含所有必要的翻译文件

💡 为什么选择这种方法?

这种方法的优点是统一了翻译机制,无需为JSON内容单独实现翻译逻辑。它使用Qt内置的翻译系统,维护成本低,且与Qt的其他部分集成良好。


🔗 相关链接

相关推荐
xcyxiner17 小时前
DicomViewer (目录调整) 2
qt
xcyxiner19 小时前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
桥田智能3 天前
桥田智能 QT-650S:面向白车身焊装的 800kg 重载快换解决方案
开发语言·qt·系统架构
森G3 天前
75、服务器源码解析---------云视频服务项目
linux·服务器·网络·c++·qt
森G3 天前
77、线程池原理和实现------服务器源码解析----云视频服务项目
服务器·c++·qt
森G3 天前
71、打包发布---------打包发布
c++·qt
初圣魔门首席弟子3 天前
Node.js 详细介绍(知识库版)
windows·qt·node.js·知识库
C++ 老炮儿的技术栈3 天前
Qt工控实战:自研机器人TCP长连接客户端(粘包处理+心跳保活+自动重连完整源码解析)
qt·tcp/ip·机器人
郝学胜-神的一滴3 天前
CMake 019:程序生成与清理全解析
开发语言·c++·qt·程序人生·软件构建·cmake
森G3 天前
76、仿ASIO实现的Linux c++服务器------服务器源码解析----云视频服务项目
c++·qt