免费资源网 – https://freexyz.cn/
目录
- 背景
- .h
- .cpp
- 使用
背景
多个子项目,分别翻译生成的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();
免费资源网 – https://freexyz.cn/
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

评论(0)