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

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

这篇文章展示了集成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.kler.cn/a/501460.html

相关文章:

  • 量子计算:从薛定谔的猫到你的生活
  • vscode vue 自动格式化
  • 【前端】【CSS3】基础入门知识
  • HTML中meta的用法
  • VScode python 远程调试
  • 【Python】Python与C的区别
  • Flask-SQLAlchemy 基础用法
  • 如何使用CSS让页面文本两行显示,超出省略号表示
  • 【k8s】scc权限 restricted、anyuid、privileged
  • 微软发布AIOpsLab:一个开源的全面AI框架,用于AIOps代理
  • 【Linux系列】Curl 参数详解与实践应用
  • ASRPRO核心板一款针对低成本离线语音识别开发板
  • C语言初阶习题【23】输出数组的前5项之和
  • springboot 默认的 mysql 驱动版本
  • PHP语言的语法
  • 物联网无线芯片模组方案,设备智能化交互升级,ESP32-C3控制应用
  • 从CentOS到龙蜥:企业级Linux迁移实践记录(龙蜥开局)
  • 如何使用 PHP 操作亚马逊 S3 对象云存储
  • C++实现设计模式---单例模式 (Singleton)
  • 【深度学习 】训练过程中loss出现nan
  • android进入fastboot
  • 神卓异地监控组网
  • OpenCV核心库模块说明
  • 依据正则表达式拦截文本
  • 【学习笔记】数据结构(十一)
  • 虚拟机防火墙管理