1 #include "translations.h"
2 #include "sqlitestudio.h"
3 #include <QTranslator>
4 #include <QCoreApplication>
5 #include <QDir>
6 #include <QDebug>
7 #include <QRegularExpression>
8 
9 QHash<QString,QTranslator*> SQLITESTUDIO_TRANSLATIONS;
10 QStringList SQLITESTUDIO_TRANSLATION_DIRS = QStringList({"msg", "translations", ":/msg", ":/msg/translations"});
11 
loadTranslation(const QString & baseName)12 void loadTranslation(const QString& baseName)
13 {
14     if (SQLITESTUDIO_TRANSLATIONS.contains(baseName))
15         return;
16 
17     QTranslator* translator = new QTranslator();
18 
19     QString fName;
20     bool res = false;
21     QString lang = SQLITESTUDIO->getCurrentLang();
22     QStringList filters = QStringList({baseName+"_"+lang+".qm"});
23     QDir dir;
24 
25     for (const QString& dirPath : SQLITESTUDIO_TRANSLATION_DIRS)
26     {
27         dir.setPath(dirPath);
28         for (const QString& f : dir.entryList(filters))
29         {
30             res = translator->load(f, dirPath);
31             if (res)
32             {
33                 fName = dirPath + "/" + f;
34                 break;
35             }
36         }
37 
38         if (res)
39             break;
40     }
41 
42     if (!res)
43         return;
44 
45     qApp->installTranslator(translator);
46     SQLITESTUDIO_TRANSLATIONS[baseName] = translator;
47     qDebug() << "Loaded:" << fName;
48 }
49 
unloadTranslation(const QString & baseName)50 void unloadTranslation(const QString& baseName)
51 {
52     if (!SQLITESTUDIO_TRANSLATIONS.contains(baseName))
53         return;
54 
55     QTranslator* trans = SQLITESTUDIO_TRANSLATIONS[baseName];
56     SQLITESTUDIO_TRANSLATIONS.remove(baseName);
57     qApp->removeTranslator(trans);
58     delete trans;
59 }
60 
loadTranslations(const QStringList & baseNames)61 void loadTranslations(const QStringList& baseNames)
62 {
63     for (const QString& name : baseNames)
64         loadTranslation(name);
65 }
66 
getAvailableTranslations()67 QStringList getAvailableTranslations()
68 {
69     QSet<QString> locales;
70     QRegularExpression re("[^\\_]+\\_(\\w+)\\.qm");
71     QRegularExpressionMatch match;
72     QDir dir;
73     QStringList filters = QStringList({"*_*.qm"});
74     for (const QString& dirPath : SQLITESTUDIO_TRANSLATION_DIRS)
75     {
76         dir.setPath(dirPath);
77         for (const QString& f : dir.entryList(filters))
78         {
79             match = re.match(f);
80             if (!match.isValid())
81                 continue;
82 
83             locales << match.captured(1).toLower();
84         }
85     }
86     locales << "en";
87 
88     return locales.values();
89 }
90 
getAvailableLanguages()91 QMap<QString,QString> getAvailableLanguages()
92 {
93     QMap<QString,QString> langs;
94     QStringList translations = getAvailableTranslations();
95     QLocale locale;
96     QString langName;
97     for (const QString& trans : translations)
98     {
99         locale = QLocale(trans);
100         langName = locale.nativeLanguageName();
101         if (langName.isEmpty())
102             langName = trans;
103 
104         langs[langName] = trans;
105     }
106 
107     return langs;
108 }
109 
setDefaultLanguage(const QString & lang)110 void setDefaultLanguage(const QString& lang)
111 {
112     CFG_CORE.General.Language.set(lang);
113 }
114 
getConfigLanguageDefault()115 QString getConfigLanguageDefault()
116 {
117     return CFG_CORE.General.Language.getDefultValue().toString();
118 }
119