Qt Utilities  5.13.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 <QDir>
6 #include <QFile>
7 #include <QFont>
8 #include <QIcon>
9 #include <QLibraryInfo>
10 #include <QLocale>
11 #include <QSettings>
12 #include <QString>
13 #include <QStringBuilder>
14 #include <QTranslator>
15 #if defined(QT_UTILITIES_GUI_QTWIDGETS)
16 #include <QApplication>
17 #elif defined(QT_UTILITIES_GUI_QTQUICK)
18 #include <QGuiApplication>
19 #else
20 #include <QCoreApplication>
21 #endif
22 
23 #include <iostream>
24 
25 using namespace std;
26 
28 inline void initResources()
29 {
30  Q_INIT_RESOURCE(qtutilsicons);
31 }
32 
33 inline void cleanupResources()
34 {
35  Q_CLEANUP_RESOURCE(qtutilsicons);
36 }
38 
43 namespace QtUtilitiesResources {
44 
49 void init()
50 {
51  initResources();
52 }
53 
58 void cleanup()
59 {
60  cleanupResources();
61 }
62 } // namespace QtUtilitiesResources
63 
67 namespace TranslationFiles {
68 
74 {
75  static QString path;
76  return path;
77 }
78 
93 void loadQtTranslationFile(std::initializer_list<QString> repositoryNames)
94 {
95  loadQtTranslationFile(repositoryNames, QLocale().name());
96 }
97 
113 void loadQtTranslationFile(initializer_list<QString> repositoryNames, const QString &localeName)
114 {
115  for (const QString &repoName : repositoryNames) {
116  QTranslator *qtTranslator = new QTranslator;
117  const QString fileName(repoName % QChar('_') % localeName);
118  if (!additionalTranslationFilePath().isEmpty() && qtTranslator->load(fileName, additionalTranslationFilePath())) {
119  QCoreApplication::installTranslator(qtTranslator);
120  } else if (qtTranslator->load(fileName, QLibraryInfo::location(QLibraryInfo::TranslationsPath))) {
121  QCoreApplication::installTranslator(qtTranslator);
122  } else if (qtTranslator->load(fileName, QStringLiteral("../share/qt/translations"))) {
123  QCoreApplication::installTranslator(qtTranslator);
124  } else if (qtTranslator->load(fileName, QStringLiteral(":/translations"))) {
125  QCoreApplication::installTranslator(qtTranslator);
126  } else {
127  delete qtTranslator;
128  if (localeName.startsWith(QLatin1String("en"))) {
129  // the translation file is probably just empty (English is built-in and usually only used for plural forms)
130  continue;
131  }
132  cerr << "Unable to load translation file for Qt repository \"" << repoName.toLocal8Bit().data() << "\" and locale "
133  << localeName.toLocal8Bit().data() << "." << endl;
134  }
135  }
136 }
137 
154 void loadApplicationTranslationFile(const QString &applicationName)
155 {
156  // load English translation files as fallback
157  loadApplicationTranslationFile(applicationName, QStringLiteral("en_US"));
158  // load translation files for current locale
159  if (QLocale().name() != QLatin1String("en_US")) {
160  loadApplicationTranslationFile(applicationName, QLocale().name());
161  }
162 }
163 
181 void loadApplicationTranslationFile(const QString &applicationName, const QString &localeName)
182 {
183  QTranslator *appTranslator = new QTranslator;
184  const QString fileName(applicationName % QChar('_') % localeName);
185  if (!additionalTranslationFilePath().isEmpty() && appTranslator->load(fileName, additionalTranslationFilePath())) {
186  QCoreApplication::installTranslator(appTranslator);
187  } else if (appTranslator->load(fileName, QStringLiteral("."))) {
188  QCoreApplication::installTranslator(appTranslator);
189  } else if (appTranslator->load(fileName, QStringLiteral("./translations"))) {
190  QCoreApplication::installTranslator(appTranslator);
191  } else if (appTranslator->load(fileName, QStringLiteral(APP_INSTALL_PREFIX "/share/") % applicationName % QStringLiteral("/translations"))) {
192  QCoreApplication::installTranslator(appTranslator);
193  } else if (appTranslator->load(fileName, QStringLiteral("../share/") % applicationName % QStringLiteral("/translations"))) {
194  QCoreApplication::installTranslator(appTranslator);
195  } else if (appTranslator->load(fileName, QStringLiteral(":/translations"))) {
196  QCoreApplication::installTranslator(appTranslator);
197  } else {
198  delete appTranslator;
199  if (localeName.startsWith(QLatin1String("en"))) {
200  // the translation file is probably just empty (English is built-in and usually only used for plural forms)
201  return;
202  }
203  cerr << "Unable to load translation file for \"" << applicationName.toLocal8Bit().data() << "\" and the locale \""
204  << localeName.toLocal8Bit().data() << "\"." << endl;
205  }
206 }
207 
213 void loadApplicationTranslationFile(const std::initializer_list<QString> &applicationNames)
214 {
215  for (const QString &applicationName : applicationNames) {
216  loadApplicationTranslationFile(applicationName);
217  }
218 }
219 
226 void loadApplicationTranslationFile(const std::initializer_list<QString> &applicationNames, const QString &localeName)
227 {
228  for (const QString &applicationName : applicationNames) {
229  loadApplicationTranslationFile(applicationName, localeName);
230  }
231 }
232 } // namespace TranslationFiles
233 
239 namespace ApplicationInstances {
240 
241 #if defined(QT_UTILITIES_GUI_QTWIDGETS)
242 
245 bool hasWidgetsApp()
246 {
247  return qobject_cast<QApplication *>(QCoreApplication::instance()) != nullptr;
248 }
249 #endif
250 
251 #if defined(QT_UTILITIES_GUI_QTWIDGETS) || defined(QT_UTILITIES_GUI_QTQUICK)
252 
255 bool hasGuiApp()
256 {
257  return qobject_cast<QGuiApplication *>(QCoreApplication::instance()) != nullptr;
258 }
259 #endif
260 
265 {
266  return qobject_cast<QCoreApplication *>(QCoreApplication::instance()) != nullptr;
267 }
268 } // namespace ApplicationInstances
269 
273 namespace ConfigFile {
274 
281 QString locateConfigFile(const QString &applicationName, const QString &fileName, const QSettings *settings)
282 {
283  // check whether the file is in the current working directory
284  if (QFile::exists(fileName)) {
285  return fileName;
286  } else {
287  // check whether the file is in the settings directory used by QSettings
288  QString path;
289  if (settings) {
290  path = QFileInfo(settings->fileName()).absoluteDir().absoluteFilePath(fileName);
291  if (QFile::exists(path)) {
292  return path;
293  }
294  }
295 // check whether there is a user created version of the file under /etc/app/
296 #ifdef Q_OS_WIN32
297  // use relative paths on Windows
298  path = QStringLiteral("../etc/") % applicationName % QChar('/') % fileName;
299  if (QFile::exists(path)) {
300  return path;
301  } else {
302  // check whether there is the default version of the file under
303  // /usr/share/app/
304  path = QStringLiteral("../share/") % applicationName % QChar('/') % fileName;
305  if (QFile::exists(path)) {
306  return path;
307  } else {
308  return QString(); // file is not present
309  }
310  }
311 #else
312  path = QStringLiteral("/etc/") % applicationName % QChar('/') % fileName;
313  if (QFile::exists(path)) {
314  return path;
315  } else {
316  // check whether there is the default version of the file under
317  // /usr/share/app/
318  path = QStringLiteral("/usr/share/") % applicationName % QChar('/') % fileName;
319  if (QFile::exists(path)) {
320  return path;
321  } else {
322  return QString(); // file is not present
323  }
324  }
325 #endif
326  }
327 }
328 } // namespace ConfigFile
QT_UTILITIES_EXPORT void cleanup()
Frees the resources used and provided by this library.
Definition: resources.cpp:58
QT_UTILITIES_EXPORT bool hasCoreApp()
Returns whether a QCoreApplication has been instantiated yet.
Definition: resources.cpp:264
Convenience functions to load translations for Qt and the application.
Definition: resources.h:37
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:281
QT_UTILITIES_EXPORT QString & additionalTranslationFilePath()
Allows to set an additional search path for translation files.
Definition: resources.cpp:73
QT_UTILITIES_EXPORT void init()
Initiates the resources used and provided by this library.
Definition: resources.cpp:49
Convenience functions to check whether a QCoreApplication/QGuiApplication/QApplication singleton has ...
Definition: resources.h:48
QT_UTILITIES_EXPORT void loadApplicationTranslationFile(const QString &applicationName)
Loads and installs the appropriate application translation file for the current locale.
Definition: resources.cpp:154
Provides convenience functions for handling config files.
Definition: resources.h:59
void loadQtTranslationFile(initializer_list< QString > repositoryNames, const QString &localeName)
Loads and installs the appropriate Qt translation file for the specified locale.
Definition: resources.cpp:113