详解Qt如何实现一键加载qm文件

 更新时间:2024年04月20日 16:24:06   作者:雲烟  
这篇文章主要为大家详细介绍了Qt实现一键加载qm文件的相关方法,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考下

背景

多个子项目,分别翻译生成的qm文件,如何一键加载?

.h

#include <QtCore/QObject>
#include <QtCore/QTranslator>
 
class LanguageSelector:public QObeject{
    Q_OBJECT
public:
    ~LanguageSelector() override = default;
    void setLanguage(const QString &l);
    QString getLanguage();
    void addLanguageFile(const QString &n);
    void removeLanguageFile(const QString &n);
    void reload();
    static LanguageSelector *getInstance();
signals:
    void languageChanged(const QString &l);
privite:
    LanguageSelector();
    static LanguageSelector* instance;
    static constexpr char CONFIGER_KEY[] = "system/language";
    QString baseDir;
    QList<QString> languageFiles;
    QList<QTranslator *> translations;
}

.cpp

#include "languageselector.h"
#include <QApplication>
#include <QCoreApplication>
#include <QDebug>
#include <QStringBuilder>
#include <QSettings>
 
LanguageSelector *LanguageSelector::instance = nullptr;
constexpr char LanguageSelector::CONFIGER_KEY[];
QString LanguageSelector::getLanguage()
{
    return QSettings::value( CONFIGER_KEY, defaultValue );
}
 
void LanguageSelector::setLanguage(const QString &language)
{
    QSettings qs;
    auto ov = QSettings::value( CONFIGER_KEY, defaultValue );
    qs::setValue( CONFIGER_KEY, language);
    if(ov != l){
        reload();
        emit languageChanged( language);
    }
}
 
LanguageSelector *LanguageSelector::getInstance()
{
    if(!instance){
        instance = new LanguageSelector;
    }
    return instance;
}
 
LanguageSelector::LanguageSelector()
    : baseDir( "i18n" ) {}
 
void LanguageSelector::addLanguageFile(const QString &name)
{
    if(name.isEmpty()){
        return;
    }
    languageFiles.append(name);
}
 
void LanguageSelector::removeLanguageFile(const QString &name)
{
    if(name.isEmpty()){
        return;
    }
    languageFiles.removeOne(name);
}
 
void LanguageSelector::reload()
{
    auto language = getLanguage();
    QString qmBase = QApplication::applicationDirPath() + "/" + baseDir;
    if(!qmBase.isEmpty() && !qmBase.endWith("/")){
        qmBase += "/";
    }
    if(!translations.isEmpty()){
        for(auto const t : translations){
            QCoreApplication::removeTranslator(t);
            t->deleteLater();
        }
    }
    for(auto const &qm :languageFiles){
    auto *t = new QTranslator(this);
    if(t->load(qmBase % qm % "_" % language ))
        translations.append(t);
        QCoreApplication::installTranslator(t);
    }else{
        qDebug() << "can not load lang file:" << qm << ", language" << language ;
    }
}

使用

main中,节目构造之前添加:

      auto ls = LanguageSelector::getInstance();
            ls->addLangFile( "test" );
            ls->addLangFile( "local" );
            ls->addLangFile( "remote" );
            ls->reload();

到此这篇关于详解Qt如何实现一键加载qm文件的文章就介绍到这了,更多相关Qt加载qm文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • gdb调试的简单操作总结

    gdb调试的简单操作总结

    gdb是一个命令行下的、功能强大的调试器,这篇文章主要为大家详细介绍了gdb 调试的一些简单操作,感兴趣的小伙伴可以跟随小编一起了解一下
    2023-08-08
  • C语言实现简单猜拳小游戏

    C语言实现简单猜拳小游戏

    这篇文章主要为大家详细介绍了C语言实现简单猜拳小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-03-03
  • C语言高级教程之变长数组详解

    C语言高级教程之变长数组详解

    这篇文章主要介绍了C语言中变长数组的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • C++中的几个特殊符号说明

    C++中的几个特殊符号说明

    这篇文章主要介绍了C++中的几个特殊符号说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • linux 匿名管道实例详解

    linux 匿名管道实例详解

    这篇文章主要介绍了linux 匿名管道实例详解的相关资料,需要的朋友可以参考下
    2017-06-06
  • 详解C++中的指针、数组指针与函数指针

    详解C++中的指针、数组指针与函数指针

    本文从初学者的角度,深入浅出地讲解C++中的指针、数组指针与函数指针,对最常混淆的引用传递、值传递和指针传递做了区处,需要的朋友可以参考下
    2015-07-07
  • C++设计模式之状态模式

    C++设计模式之状态模式

    这篇文章主要介绍了C++设计模式之状态模式,本文讲解了什么是状态模式、状态模式的使用场合、状态模式的实现代码等内容,需要的朋友可以参考下
    2014-10-10
  • C语言实现查询自动售货机中的商品价格【实例分享】

    C语言实现查询自动售货机中的商品价格【实例分享】

    本文主要介绍了C语言实现查询自动售货机中的商品价格的相关资料。具有很好的参考价值。下面跟着小编一起来看下吧
    2017-04-04
  • OpenCV外接USB摄像头的方法

    OpenCV外接USB摄像头的方法

    这篇文章主要为大家详细介绍了OpenCV外接USB摄像头的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-07-07
  • C++实践IP地址类项目参考

    C++实践IP地址类项目参考

    今天小编就为大家分享一篇关于C++实践IP地址类项目参考,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02

最新评论