• QT学习:使用JSON/XML等非ts文件实现多语言国际化


    注意:如果不是CSDN网站显示本篇文章,请于底部点击“阅读原文”来阅读本篇文章!

    QT学习:使用JSON/XML等非ts文件实现多语言国际化


    qt默认的国际化是使用 Linguist + .ts,来实现国际化的。但一般公司内部可能存在翻译部门使用其他格式的语言文件,或者自己搭建了一个翻译网站,你能下载到的肯定不会是ts文件,而是比较常见的文件格式,比如xml/json等等。
    现在我们使用JSON文件来存放翻译的key和翻译后的值value,但项目源码内部还是使用qt提供的 QObject::tr("key")以及qml使用的 qsTr("key")方法来使用翻译。

    主要的方法也比较简单:

    • 1、使用一个map类型,存储JSON解析后的key-value值
    • 2、新建一个类MyTranslator继承自QTranslator,然后重载QTranslator::translate方法
    • 3、使用QApplication::instance()->installTranslator注册MyTranslator的实例
    • 4、代码内部使用QObject::tr("key")方式实现国际化

    下面说下MyTranslator的实现

    解析Json

    主要是将JSON文件中的key-value,解析后存放在map表中,供后面的translate使用

    void MyTranslator::LoadLocalCachedInfo(QString langCode)
    {
        QString fileName = (QApplication::applicationDirPath() +
                            TRANS_DIR  + "/" + LOCAL_TRANS_FILE_NAME).arg(langCode);
        QFile langFile(fileName);
        if(!langFile.exists()) {
            return;
        }
    
        langFile.open(QIODevice::ReadOnly);
        QByteArray byteInfo = langFile.readAll();
        if (!LoadJsonTransInfo(byteInfo)) {
            return;
        }
    
        emit LanguageChanged();
    }
    
    bool MyTranslator::LoadJsonTransInfo(QByteArray& byteinfo)
    {
        QJsonObject jsonObj;
        QJsonParseError error;
        QJsonDocument jsonDoc(QJsonDocument::fromJson(byteinfo, &error));
    
        if (jsonDoc.isEmpty() || jsonDoc.isNull()) {
            QString errorStr = error.errorString();
            return false;
        }
    
        m_loadedTransInfo.clear();
        for(auto& transKey : jsonDoc.object().keys()) {
            m_loadedTransInfo[transKey.toStdString()] =
                    jsonDoc.object()[transKey].toString().toStdString();
        }
    
        return true;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    重载translate

    按照[virtual] QString QTranslator::translate(const char *context, const char *sourceText, const char *disambiguation = nullptr, int n = -1) const的原型,重载一个即可。主要是通过传入的sourceText,在前面的map表中找到对应的value,即翻译字符串,返回即可。

    QString MyTranslator::translate(const char *context, 
                                    const char *sourceText, 
                                    const char *disambiguation, int n) const
    {
        // if no result return original
        if(m_loadedTransInfo.count(sourceText) <= 0) {
            return sourceText;
        }
    
        // from loaded value
        return QString::fromStdString(m_loadedTransInfo.at(std::string(sourceText)));
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    注册MyTranslator实例

    注册实例,一定要在主线程,另一个是要在使用QObject::tr("key")之前注册。

    QApplication::instance()->installTranslator(&MyTranslator::getInstance());
    
    • 1

    运行结果

    在这里插入图片描述
    中文JSON文件:

    {
        "button_name": "按钮名字",
    	"window_name": "主窗口名字"
    }
    
    • 1
    • 2
    • 3
    • 4

    完整实现可以微信搜索公众号:“上官宏竹”,关注并回复:“qt_language”,获取资源链接。有任何疑问也可以公众号里留言咨询。


    微信公众号搜索:“上官宏竹”,关注并留言咨询,可接各类需求。

  • 相关阅读:
    蓝桥杯(3.3)
    被妖魔化的奥数,到底该怎么学?
    深度学习:使用UNet做图像语义分割,训练自己制作的数据集,详细教程
    Bean的生命周期
    Flink Catalog解读
    【typescript】Typescript tsconfig.json全解析
    【面试题】原型与原型链 进一步理解~
    网站文章生成技术-网站文章生成工具免费
    网络卡顿怎么办?快来试试华为云CDN
    Panda3d 外部硬件接口介绍
  • 原文地址:https://blog.csdn.net/tanxuan231/article/details/125442789