Qt Utilities  5.6.0
Common Qt related C++ classes and routines used by my applications such as dialogs, widgets and models
resources.cpp
Go to the documentation of this file.
1 #include "./resources.h"
2 
3 #include "resources/config.h"
4 
5 #include <QString>
6 #include <QLocale>
7 #include <QTranslator>
8 #include <QLibraryInfo>
9 #include <QFile>
10 #include <QDir>
11 #include <QStringBuilder>
12 #include <QSettings>
13 #if defined(GUI_QTWIDGETS)
14 # include <QApplication>
15 # include <QIcon>
16 # include <QFont>
17 # include <QStyleFactory>
18 #elif defined(GUI_QTQUICK)
19 # include <QGuiApplication>
20 # include <QIcon>
21 # include <QFont>
22 #else
23 # include <QCoreApplication>
24 #endif
25 
26 #include <iostream>
27 
28 using namespace std;
29 
31 inline void initResources() {
32  Q_INIT_RESOURCE(qtutilsicons);
33 }
34 
35 inline void cleanupResources() {
36  Q_CLEANUP_RESOURCE(qtutilsicons);
37 }
39 
44 namespace QtUtilitiesResources {
45 
50 void init()
51 {
52  initResources();
53 }
54 
59 void cleanup()
60 {
61  cleanupResources();
62 }
63 
64 }
65 
69 namespace TranslationFiles {
70 
76 {
77  static QString path;
78  return path;
79 }
80 
91 void loadQtTranslationFile(std::initializer_list<QString> repositoryNames)
92 {
93  loadQtTranslationFile(repositoryNames, QLocale().name());
94 }
95 
107 void loadQtTranslationFile(initializer_list<QString> repositoryNames, const QString &localeName)
108 {
109  for(const QString &repoName : repositoryNames) {
110  QTranslator *qtTranslator = new QTranslator;
111  const QString fileName(repoName % QChar('_') % localeName);
112  if(!additionalTranslationFilePath().isEmpty() && qtTranslator->load(fileName, additionalTranslationFilePath())) {
113  QCoreApplication::installTranslator(qtTranslator);
114  } else if(qtTranslator->load(fileName, QLibraryInfo::location(QLibraryInfo::TranslationsPath))) {
115  QCoreApplication::installTranslator(qtTranslator);
116  } else if(qtTranslator->load(fileName, QStringLiteral("../share/qt/translations"))) {
117  // used in Windows
118  QCoreApplication::installTranslator(qtTranslator);
119  } else if(qtTranslator->load(fileName, QStringLiteral(":/translations"))) {
120  QCoreApplication::installTranslator(qtTranslator);
121  } else {
122  delete qtTranslator;
123  cerr << "Unable to load translation file for Qt repository \"" << repoName.toLocal8Bit().data() << "\" and language " << localeName.toLocal8Bit().data() << "." << endl;
124  }
125  }
126 }
127 
141 void loadApplicationTranslationFile(const QString &applicationName)
142 {
143  // load English translation files as fallback
144  loadApplicationTranslationFile(applicationName, QStringLiteral("en_US"));
145  // load translation files for current locale
146  if(QLocale().name() != QLatin1String("en_US")) {
147  loadApplicationTranslationFile(applicationName, QLocale().name());
148  }
149 }
150 
165 void loadApplicationTranslationFile(const QString &applicationName, const QString &localeName)
166 {
167  QTranslator *appTranslator = new QTranslator;
168  const QString fileName(QStringLiteral("%1_%2").arg(applicationName, localeName));
169  if(!additionalTranslationFilePath().isEmpty() && appTranslator->load(fileName, additionalTranslationFilePath())) {
170  QCoreApplication::installTranslator(appTranslator);
171  } else if(appTranslator->load(fileName, QStringLiteral("."))) {
172  QCoreApplication::installTranslator(appTranslator);
173  } else if(appTranslator->load(fileName, QStringLiteral("./translations"))) {
174  QCoreApplication::installTranslator(appTranslator);
175  } else if(appTranslator->load(fileName, QStringLiteral(APP_INSTALL_PREFIX "/share/%1/translations").arg(applicationName))) {
176  QCoreApplication::installTranslator(appTranslator);
177  } else if(appTranslator->load(fileName, QStringLiteral("../share/%1/translations").arg(applicationName))) {
178  QCoreApplication::installTranslator(appTranslator);
179  } else if(appTranslator->load(fileName, QStringLiteral(":/translations"))) {
180  QCoreApplication::installTranslator(appTranslator);
181  } else {
182  delete appTranslator;
183  cerr << "Unable to load translation file for \"" << applicationName.toLocal8Bit().data() << "\" and the language \"" << localeName.toLocal8Bit().data() << "\"." << endl;
184  }
185 }
186 
191 void loadApplicationTranslationFile(const std::initializer_list<QString> &applicationNames)
192 {
193  for(const QString &applicationName : applicationNames) {
194  loadApplicationTranslationFile(applicationName);
195  }
196 }
197 
203 void loadApplicationTranslationFile(const std::initializer_list<QString> &applicationNames, const QString &localeName)
204 {
205  for(const QString &applicationName : applicationNames) {
206  loadApplicationTranslationFile(applicationName, localeName);
207  }
208 }
209 
210 }
211 
215 namespace ApplicationInstances {
216 
217 #if defined(GUI_QTWIDGETS)
218 
221 bool hasWidgetsApp()
222 {
223  return qobject_cast<QApplication *>(QCoreApplication::instance()) != nullptr;
224 }
225 #endif
226 
227 #if defined(GUI_QTWIDGETS) || defined(GUI_QTQUICK)
228 
231 bool hasGuiApp()
232 {
233  return qobject_cast<QGuiApplication *>(QCoreApplication::instance()) != nullptr;
234 }
235 #endif
236 
241 {
242  return qobject_cast<QCoreApplication *>(QCoreApplication::instance()) != nullptr;
243 }
244 
245 }
246 
250 namespace ConfigFile {
251 
256 QString locateConfigFile(const QString &applicationName, const QString &fileName, const QSettings *settings)
257 {
258  // check whether the file is in the current working directory
259  if(QFile::exists(fileName)) {
260  return fileName;
261  } else {
262  // check whether the file is in the settings directory used by QSettings
263  QString path;
264  if(settings) {
265  path = QFileInfo(settings->fileName()).absoluteDir().absoluteFilePath(fileName);
266  if(QFile::exists(path)) {
267  return path;
268  }
269  }
270  // check whether there is a user created version of the file under /etc/app/
271 #ifdef Q_OS_WIN32
272  // use relative paths on Windows
273  path = QStringLiteral("../etc/") % applicationName % QChar('/') % fileName;
274  if(QFile::exists(path)) {
275  return path;
276  } else {
277  // check whether there is the default version of the file under /usr/share/app/
278  path = QStringLiteral("../share/") % applicationName % QChar('/') % fileName;
279  if(QFile::exists(path)) {
280  return path;
281  } else {
282  return QString(); // file is not present
283  }
284  }
285 #else
286  path = QStringLiteral("/etc/") % applicationName % QChar('/') % fileName;
287  if(QFile::exists(path)) {
288  return path;
289  } else {
290  // check whether there is the default version of the file under /usr/share/app/
291  path = QStringLiteral("/usr/share/") % applicationName % QChar('/') % fileName;
292  if(QFile::exists(path)) {
293  return path;
294  } else {
295  return QString(); // file is not present
296  }
297  }
298 #endif
299  }
300 }
301 
302 }
QT_UTILITIES_EXPORT void cleanup()
Frees the resources used and provided by this library.
Definition: resources.cpp:59
QT_UTILITIES_EXPORT bool hasCoreApp()
Returns whether a QCoreApplication has been instantiated yet.
Definition: resources.cpp:240
Convenience functions to load translations for Qt and the application.
Definition: resources.h:38
QT_UTILITIES_EXPORT QString locateConfigFile(const QString &applicationName, const QString &fileName, const QSettings *settings=nullptr)
Locates the config file with the specified fileName for the application with the specified applicatio...
Definition: resources.cpp:256
STL namespace.
QT_UTILITIES_EXPORT QString & additionalTranslationFilePath()
Allows to set an additional search path for translation files.
Definition: resources.cpp:75
QT_UTILITIES_EXPORT void init()
Initiates the resources used and provided by this library.
Definition: resources.cpp:50
Convenience functions to check whether a QCoreApplication/QGuiApplication/QApplication singleton has ...
Definition: resources.h:50
QT_UTILITIES_EXPORT void loadApplicationTranslationFile(const QString &applicationName)
Loads and installs the appropriate application translation file for the current locale.
Definition: resources.cpp:141
Provides convenience functions for handling config files.
Definition: resources.h:62
void loadQtTranslationFile(initializer_list< QString > repositoryNames, const QString &localeName)
Loads and installs the appropriate Qt translation file for the specified locale.
Definition: resources.cpp:107