133 lines
3.5 KiB
C++
133 lines
3.5 KiB
C++
#include "qad_locations.h"
|
|
#include <QDir>
|
|
#include <QDirIterator>
|
|
#include <QTranslator>
|
|
#include <QApplication>
|
|
#include <QDebug>
|
|
#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
|
|
# include <QStandardPaths>
|
|
#else
|
|
# include <QDesktopServices>
|
|
#endif
|
|
|
|
#if defined(Q_OS_ANDROID) || defined(Q_OS_IOS)
|
|
# define MOBILE_VIEW
|
|
#endif
|
|
|
|
|
|
class __QADTranslators__ {
|
|
public:
|
|
static QList<QTranslator * > translators;
|
|
private:
|
|
};
|
|
|
|
QList<QTranslator * > __QADTranslators__::translators = QList<QTranslator * >();
|
|
|
|
|
|
QString QAD::userPath(QAD::LocationType loc, QString name) {
|
|
QString dir, ext;
|
|
switch (loc) {
|
|
case ltConfig: ext = ".conf"; break;
|
|
case ltCache : ext = ".cache"; break;
|
|
}
|
|
#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
|
|
QStandardPaths::StandardLocation l = QStandardPaths::AppConfigLocation;
|
|
switch (loc) {
|
|
case ltConfig: l = QStandardPaths::AppConfigLocation; break;
|
|
case ltCache : l = QStandardPaths::CacheLocation; break;
|
|
}
|
|
dir = QStandardPaths::writableLocation(l);
|
|
#else
|
|
QDesktopServices::StandardLocation l = QDesktopServices::DataLocation;
|
|
switch (loc) {
|
|
case ltConfig: l = QDesktopServices::DataLocation; break;
|
|
case ltCache : l = QDesktopServices::CacheLocation; break;
|
|
}
|
|
dir = QDesktopServices::storageLocation(l);
|
|
#endif
|
|
if (!QDir(dir).exists())
|
|
QDir().mkpath(dir);
|
|
return dir + "/" + name + ext;
|
|
}
|
|
|
|
|
|
QStringList QAD::resourcePaths(QString type) {
|
|
QStringList ret;
|
|
ret << (QApplication::applicationDirPath() + "/" + type);
|
|
#ifdef MOBILE_VIEW
|
|
ret << (":/" + type);
|
|
#elif defined(Q_OS_MACOS)
|
|
ret << (QApplication::applicationDirPath() + "/../Resources/" + type);
|
|
#elif defined(Q_OS_WINDOWS)
|
|
#else
|
|
ret << QString("/usr/share/%1/%2/%3").arg(QApplication::organizationName(), QApplication::applicationName(), type);
|
|
ret << QString("/usr/share/%1/%2").arg(QApplication::organizationName(), type);
|
|
#endif
|
|
return ret;
|
|
}
|
|
|
|
|
|
void QAD::loadTranslations(QString lang) {
|
|
foreach (QTranslator * t, __QADTranslators__::translators) {
|
|
qApp->removeTranslator(t);
|
|
delete t;
|
|
}
|
|
__QADTranslators__::translators.clear();
|
|
if (lang.isEmpty())
|
|
lang = QLocale().bcp47Name();
|
|
QString short_lang = lang.left(2);
|
|
QStringList dirs = resourcePaths("lang");
|
|
foreach (const QString & d, dirs) {
|
|
QDirIterator dit(d);
|
|
while (dit.hasNext()) {
|
|
dit.next();
|
|
if (!dit.filePath().endsWith(".qm")) continue;
|
|
if (!dit.fileInfo().baseName().endsWith(lang) &&
|
|
!dit.fileInfo().baseName().endsWith(short_lang)) continue;
|
|
QTranslator * tr = new QTranslator();
|
|
if (tr->load(dit.filePath())) {
|
|
qApp->installTranslator(tr);
|
|
__QADTranslators__::translators << tr;
|
|
//qDebug() << "Add tr" << dit.fileName();
|
|
} else {
|
|
qDebug() << "Can`t load translation" << dit.fileName();
|
|
delete tr;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
QStringList QAD::availableTranslations() {
|
|
QSet<QString> ret;
|
|
QStringList dirs = resourcePaths("lang");
|
|
foreach (const QString & d, dirs) {
|
|
QDirIterator dit(d);
|
|
while (dit.hasNext()) {
|
|
dit.next();
|
|
if (!dit.filePath().endsWith(".qm")) continue;
|
|
QTranslator * tr = new QTranslator();
|
|
if (tr->load(dit.filePath())) {
|
|
QString fn = dit.fileInfo().baseName(), lang[2];
|
|
if (fn.contains("_")) {
|
|
lang[0] = fn.right(fn.size() - fn.lastIndexOf("_") - 1);
|
|
fn.chop(lang[0].size() + 1);
|
|
if (fn.contains("_")) {
|
|
lang[1] = fn.right(fn.size() - fn.lastIndexOf("_") - 1);
|
|
fn.chop(lang[1].size() + 1);
|
|
lang[1].append("_" + lang[0]);
|
|
}
|
|
}
|
|
for (int i = 0; i < 2; ++i) {
|
|
QLocale loc(lang[i]);
|
|
if (loc.language() != QLocale::C)
|
|
ret << lang[i];
|
|
}
|
|
}
|
|
delete tr;
|
|
}
|
|
}
|
|
return ret.values();
|
|
}
|
|
|