Qt Utilities  5.8.2
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 <QLibraryInfo>
8 #include <QLocale>
9 #include <QSettings>
10 #include <QString>
11 #include <QStringBuilder>
12 #include <QTranslator>
13 #if defined(QT_UTILITIES_GUI_QTWIDGETS)
14 #include <QApplication>
15 #include <QFont>
16 #include <QIcon>
17 #include <QStyleFactory>
18 #elif defined(QT_UTILITIES_GUI_QTQUICK)
19 #include <QFont>
20 #include <QGuiApplication>
21 #include <QIcon>
22 #else
23 #include <QCoreApplication>
24 #endif
25 
26 #include <iostream>
27 
28 using namespace std;
29 
31 inline void initResources()
32 {
33  Q_INIT_RESOURCE(qtutilsicons);
34 }
35 
36 inline void cleanupResources()
37 {
38  Q_CLEANUP_RESOURCE(qtutilsicons);
39 }
41 
46 namespace QtUtilitiesResources {
47 
52 void init()
53 {
54  initResources();
55 }
56 
61 void cleanup()
62 {
63  cleanupResources();
64 }
65 } // namespace QtUtilitiesResources
66 
70 namespace TranslationFiles {
71 
77 {
78  static QString path;
79  return path;
80 }
81 
96 void loadQtTranslationFile(std::initializer_list<QString> repositoryNames)
97 {
98  loadQtTranslationFile(repositoryNames, QLocale().name());
99 }
100 
116 void loadQtTranslationFile(initializer_list<QString> repositoryNames, const QString &localeName)
117 {
118  for (const QString &repoName : repositoryNames) {
119  QTranslator *qtTranslator = new QTranslator;
120  const QString fileName(repoName % QChar('_') % localeName);
121  if (!additionalTranslationFilePath().isEmpty() && qtTranslator->load(fileName, additionalTranslationFilePath())) {
122  QCoreApplication::installTranslator(qtTranslator);
123  } else if (qtTranslator->load(fileName, QLibraryInfo::location(QLibraryInfo::TranslationsPath))) {
124  QCoreApplication::installTranslator(qtTranslator);
125  } else if (qtTranslator->load(fileName, QStringLiteral("../share/qt/translations"))) {
126  QCoreApplication::installTranslator(qtTranslator);
127  } else if (qtTranslator->load(fileName, QStringLiteral(":/translations"))) {
128  QCoreApplication::installTranslator(qtTranslator);
129  } else {
130  delete qtTranslator;
131  if (localeName.startsWith(QLatin1String("en"))) {
132  // the translation file is probably just empty (English is built-in and usually only used for plural forms)
133  continue;
134  }
135  cerr << "Unable to load translation file for Qt repository \"" << repoName.toLocal8Bit().data() << "\" and locale "
136  << localeName.toLocal8Bit().data() << "." << endl;
137  }
138  }
139 }
140 
157 void loadApplicationTranslationFile(const QString &applicationName)
158 {
159  // load English translation files as fallback
160  loadApplicationTranslationFile(applicationName, QStringLiteral("en_US"));
161  // load translation files for current locale
162  if (QLocale().name() != QLatin1String("en_US")) {
163  loadApplicationTranslationFile(applicationName, QLocale().name());
164  }
165 }
166 
184 void loadApplicationTranslationFile(const QString &applicationName, const QString &localeName)
185 {
186  QTranslator *appTranslator = new QTranslator;
187  const QString fileName(applicationName % QChar('_') % localeName);
188  if (!additionalTranslationFilePath().isEmpty() && appTranslator->load(fileName, additionalTranslationFilePath())) {
189  QCoreApplication::installTranslator(appTranslator);
190  } else if (appTranslator->load(fileName, QStringLiteral("."))) {
191  QCoreApplication::installTranslator(appTranslator);
192  } else if (appTranslator->load(fileName, QStringLiteral("./translations"))) {
193  QCoreApplication::installTranslator(appTranslator);
194  } else if (appTranslator->load(fileName, QStringLiteral(APP_INSTALL_PREFIX "/share/") % applicationName % QStringLiteral("/translations"))) {
195  QCoreApplication::installTranslator(appTranslator);
196  } else if (appTranslator->load(fileName, QStringLiteral("../share/") % applicationName % QStringLiteral("/translations"))) {
197  QCoreApplication::installTranslator(appTranslator);
198  } else if (appTranslator->load(fileName, QStringLiteral(":/translations"))) {
199  QCoreApplication::installTranslator(appTranslator);
200  } else {
201  delete appTranslator;
202  if (localeName.startsWith(QLatin1String("en"))) {
203  // the translation file is probably just empty (English is built-in and usually only used for plural forms)
204  return;
205  }
206  cerr << "Unable to load translation file for \"" << applicationName.toLocal8Bit().data() << "\" and the locale \""
207  << localeName.toLocal8Bit().data() << "\"." << endl;
208  }
209 }
210 
216 void loadApplicationTranslationFile(const std::initializer_list<QString> &applicationNames)
217 {
218  for (const QString &applicationName : applicationNames) {
219  loadApplicationTranslationFile(applicationName);
220  }
221 }
222 
229 void loadApplicationTranslationFile(const std::initializer_list<QString> &applicationNames, const QString &localeName)
230 {
231  for (const QString &applicationName : applicationNames) {
232  loadApplicationTranslationFile(applicationName, localeName);
233  }
234 }
235 } // namespace TranslationFiles
236 
242 namespace ApplicationInstances {
243 
244 #if defined(QT_UTILITIES_GUI_QTWIDGETS)
245 
248 bool hasWidgetsApp()
249 {
250  return qobject_cast<QApplication *>(QCoreApplication::instance()) != nullptr;
251 }
252 #endif
253 
254 #if defined(QT_UTILITIES_GUI_QTWIDGETS) || defined(QT_UTILITIES_GUI_QTQUICK)
255 
258 bool hasGuiApp()
259 {
260  return qobject_cast<QGuiApplication *>(QCoreApplication::instance()) != nullptr;
261 }
262 #endif
263 
268 {
269  return qobject_cast<QCoreApplication *>(QCoreApplication::instance()) != nullptr;
270 }
271 }
272 
276 namespace ConfigFile {
277 
284 QString locateConfigFile(const QString &applicationName, const QString &fileName, const QSettings *settings)
285 {
286  // check whether the file is in the current working directory
287  if (QFile::exists(fileName)) {
288  return fileName;
289  } else {
290  // check whether the file is in the settings directory used by QSettings
291  QString path;
292  if (settings) {
293  path = QFileInfo(settings->fileName()).absoluteDir().absoluteFilePath(fileName);
294  if (QFile::exists(path)) {
295  return path;
296  }
297  }
298 // check whether there is a user created version of the file under /etc/app/
299 #ifdef Q_OS_WIN32
300  // use relative paths on Windows
301  path = QStringLiteral("../etc/") % applicationName % QChar('/') % fileName;
302  if (QFile::exists(path)) {
303  return path;
304  } else {
305  // check whether there is the default version of the file under
306  // /usr/share/app/
307  path = QStringLiteral("../share/") % applicationName % QChar('/') % fileName;
308  if (QFile::exists(path)) {
309  return path;
310  } else {
311  return QString(); // file is not present
312  }
313  }
314 #else
315  path = QStringLiteral("/etc/") % applicationName % QChar('/') % fileName;
316  if (QFile::exists(path)) {
317  return path;
318  } else {
319  // check whether there is the default version of the file under
320  // /usr/share/app/
321  path = QStringLiteral("/usr/share/") % applicationName % QChar('/') % fileName;
322  if (QFile::exists(path)) {
323  return path;
324  } else {
325  return QString(); // file is not present
326  }
327  }
328 #endif
329  }
330 }
331 } // namespace ConfigFile
QT_UTILITIES_EXPORT void cleanup()
Frees the resources used and provided by this library.
Definition: resources.cpp:61
QT_UTILITIES_EXPORT bool hasCoreApp()
Returns whether a QCoreApplication has been instantiated yet.
Definition: resources.cpp:267
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:284
STL namespace.
QT_UTILITIES_EXPORT QString & additionalTranslationFilePath()
Allows to set an additional search path for translation files.
Definition: resources.cpp:76
QT_UTILITIES_EXPORT void init()
Initiates the resources used and provided by this library.
Definition: resources.cpp:52
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:157
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:116