完全自定义Qt翻译功能,不使用Qt Linguist的.ts 和 .qm类型翻译

server/2025/1/13 2:28:56/

这篇文章展示了集成Qt Linguist 的功能。
但是有时候Qt的翻译功能比较繁琐,我们简单项目只需要使用本地化功能,将中文字符串导入到项目中,避免编码格式问题导致的乱码。
只需要使用一个简单的json或者其他格式的本地文件作为映射的key/value.

当完全需要自定义翻译文件,或者只是简单的避免将中文写入cpp文件导致显示在ui上乱码时可以使用

创建 派生类,并实现翻译方法。

class JBTranslator : public QTranslator {public://保存自己的翻译QHash<QString, QString> m_texts;//override 基类虚函数,当需要翻译的时候会自动调用QString translate(const char *context, const char *sourceText, const char *disambiguation = nullptr, int n = -1) const override{if (m_texts.contains(sourceText)) {return m_texts.value(sourceText);}return sourceText;}
};

在 app 初始化后立即注册调用

int main(int argc, char *argv[])
{QApplication a(argc, argv);// 申明自定义类的实例JBTranslator translator;//用自定义的翻译实例替换系统默认的QApplication::installTranslator(&translator);/* :/tran.json 文件的内容,该文件也可以放在其他位置或其他类型的文件,只需要最终读取出来放入translator.m_texts变量即可
{"Hello_key": "你好,这是value","Hello_key2": "中文测试文字2"
}
*/QFile file(":/tran.json");if (!file.open(QFile::ReadOnly)) {qWarning() << "Cannot open translation file for reading.";return -1;}QJsonDocument doc = QJsonDocument::fromJson(file.readAll(), nullptr);QJsonObject jsonObj = doc.object();for (auto it = jsonObj.begin(); it != jsonObj.end(); ++it) {//将自定义的json文件的翻译字段,加载到我们类的变量中translator.m_texts.insert(it.key(), it.value().toString());}//这里调用后,会在 JBTranslator::translate(...) 方法中查找,并返回翻译好的字符串//手动调用tr(), 或者ui文件中自动调用翻译功能QString t = QObject::tr("Hello_key");//localized string:  "你好,这是value"qDebug() << "localized string: " << t; MainWindow w;w.show();return a.exec();
}

验证结果

调用代码:

    QString t = QObject::tr("Hello_key");qDebug() << "localized string: " << t; 

打印结果: localized string: "你好,这是value"

全局代码

#include "mainwindow.h"#include <QApplication>
#include <QTranslator>
#include <QFile>
#include <QJsonDocument>
#include <QJsonObject>
#include <QTextStream>
#include <QHash>
#include <QDebug>class JBTranslator : public QTranslator {public://保存自己的翻译QHash<QString, QString> m_texts;//override 基类虚函数,当需要翻译的时候会自动调用QString translate(const char *context, const char *sourceText, const char *disambiguation = nullptr, int n = -1) const override{if (m_texts.contains(sourceText)) {return m_texts.value(sourceText);}return sourceText;}
};int main(int argc, char *argv[])
{QApplication a(argc, argv);// 申明自定义类的实例JBTranslator translator;//用自带的翻译实例替换系统默认的QApplication::installTranslator(&translator);/*
{"Hello_key": "你好,这是value","Hello_key2": "中文测试文字2"
}
*/QFile file(":/tran.json");if (!file.open(QFile::ReadOnly)) {qWarning() << "Cannot open translation file for reading.";return -1;}QJsonDocument doc = QJsonDocument::fromJson(file.readAll(), nullptr);QJsonObject jsonObj = doc.object();for (auto it = jsonObj.begin(); it != jsonObj.end(); ++it) {//将自定义的json文件的翻译字段,加载到我们类的变量中translator.m_texts.insert(it.key(), it.value().toString());}//这里调用后,会在 JBTranslator::translate(...) 方法中查找,并返回翻译好的字符串QString t = QObject::tr("Hello_key");//localized string:  "你好,这是value"qDebug() << "localized string: " << t; MainWindow w;w.show();return a.exec();
}

http://www.ppmy.cn/server/157907.html

相关文章

spring mvc源码学习笔记之八

本文说点儿简单的。 如果你想研究基于 XML 配置的 spring mvc 的话&#xff0c;可以简单扫一眼本文。 在基于 XML 配置的 spring mvc 开发中&#xff0c;我们主要就是通过 spring 提供的各种标签来配置。 但是&#xff0c;大家是不是都有个疑问&#xff0c;spring 到底给我们提…

基于Auto-Editor一键预处理音视频无声片段

在视频制作与后期处理中,长时间的无声片段往往会增加视频观看的乏味感,尤其在讲解类口播视频中,这种片段频繁出现。因此,自动识别并删除这些无声片段的需求逐渐增多。Auto-Editor是一款开源的自动化视频编辑工具,它通过自动检测音频信号,可以一键删除无声片段,大大提高视…

投机解码论文阅读:Falcon

题目&#xff1a;Falcon: Faster and Parallel Inference of Large Language Models through Enhanced Semi-Autoregressive Drafting and Custom-Designed Decoding Tree 地址&#xff1a;https://arxiv.org/pdf/2412.12639 一看它的架构图&#xff0c;可以发现它是基于EAGLE…

【Linux】4.Linux常见指令以及权限理解(2)

文章目录 3. Linux指令3.1 ls指令和rm指令补充3.2 man指令&#xff08;重要&#xff09;3.3cp指令&#xff08;重要&#xff09;输出重定向3.3.1ubuntu20.04如何安装tree 3.4 mv指令&#xff08;重要&#xff09;mv指令更改文件名mv指令更改目录名 如何看待指令指令的重命名3.5…

网络安全技术百科全书:术语与概念解析

Burp Suite 是一款信息安全从业人员必备的集成型的渗透测试工具&#xff0c;它采用自动测试和半自动测试的方式&#xff0c;通过拦截HTTP/HTTPS的Web数据包&#xff0c;充当浏览器和相关应用程序的中间人&#xff0c;进行拦截、修改、重放数据包进行测试&#xff0c;是Web安全人…

Wireshark TCP 分析标志位说明汇总

在 Wireshark 网络数据包分析中&#xff0c;比较常见的一些 TCP 分析标志位的说明和案例汇总如下&#xff1a; TCP Previous segment not capturedTCP Window FullTCP ACKed unseen segmentTCP Port numbers reusedTCP ZeroWindowTCP ZeroWindowProbeTCP Window UpdateTCP Kee…

《零基础Go语言算法实战》【题目 1-20】Go 语言类型转换

《零基础Go语言算法实战》 【题目 1-20】Go 语言类型转换 Go 语言支持哪种形式的类型转换&#xff1f;如何将浮点数类型转换为整数类型&#xff1f;举例说明。 【解答】 Go 语言支持满足其严格类型要求的显式类型转换&#xff0c;可以对浮点数类型变量使用 int() 函 数强制…

rknn环境搭建之docker篇

目录 1. rknn简介2. 环境搭建2.1 下载 RKNN-Toolkit2 仓库2.2 下载 RKNN Model Zoo 仓库2.3 下载交叉编译器2.4 下载Docker镜像2.5 下载ndk2.5 加载docker镜像2.6 docker run 命令创建并运行 RKNN Toolkit2 容器2.7 安装cmake 3. 模型转换3.1 下载模型3.2 模型转换 4. 编译cdem…