Qt Utilities  5.7.1
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 }
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  // used in Windows
127  QCoreApplication::installTranslator(qtTranslator);
128  } else if (qtTranslator->load(fileName, QStringLiteral(":/translations"))) {
129  QCoreApplication::installTranslator(qtTranslator);
130  } else {
131  delete qtTranslator;
132  cerr << "Unable to load translation file for Qt repository \"" << repoName.toLocal8Bit().data() << "\" and language "
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(QStringLiteral("%1_%2").arg(applicationName, 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/%1/translations").arg(applicationName))) {
192  QCoreApplication::installTranslator(appTranslator);
193  } else if (appTranslator->load(fileName, QStringLiteral("../share/%1/translations").arg(applicationName))) {
194  QCoreApplication::installTranslator(appTranslator);
195  } else if (appTranslator->load(fileName, QStringLiteral(":/translations"))) {
196  QCoreApplication::installTranslator(appTranslator);
197  } else {
198  delete appTranslator;
199  cerr << "Unable to load translation file for \"" << applicationName.toLocal8Bit().data() << "\" and the language \""
200  << localeName.toLocal8Bit().data() << "\"." << endl;
201  }
202 }
203 
209 void loadApplicationTranslationFile(const std::initializer_list<QString> &applicationNames)
210 {
211  for (const QString &applicationName : applicationNames) {
212  loadApplicationTranslationFile(applicationName);
213  }
214 }
215 
222 void loadApplicationTranslationFile(const std::initializer_list<QString> &applicationNames, const QString &localeName)
223 {
224  for (const QString &applicationName : applicationNames) {
225  loadApplicationTranslationFile(applicationName, localeName);
226  }
227 }
228 }
229 
235 namespace ApplicationInstances {
236 
237 #if defined(QT_UTILITIES_GUI_QTWIDGETS)
238 
241 bool hasWidgetsApp()
242 {
243  return qobject_cast<QApplication *>(QCoreApplication::instance()) != nullptr;
244 }
245 #endif
246 
247 #if defined(QT_UTILITIES_GUI_QTWIDGETS) || defined(QT_UTILITIES_GUI_QTQUICK)
248 
251 bool hasGuiApp()
252 {
253  return qobject_cast<QGuiApplication *>(QCoreApplication::instance()) != nullptr;
254 }
255 #endif
256 
261 {
262  return qobject_cast<QCoreApplication *>(QCoreApplication::instance()) != nullptr;
263 }
264 }
265 
269 namespace ConfigFile {
270 
277 QString locateConfigFile(const QString &applicationName, const QString &fileName, const QSettings *settings)
278 {
279  // check whether the file is in the current working directory
280  if (QFile::exists(fileName)) {
281  return fileName;
282  } else {
283  // check whether the file is in the settings directory used by QSettings
284  QString path;
285  if (settings) {
286  path = QFileInfo(settings->fileName()).absoluteDir().absoluteFilePath(fileName);
287  if (QFile::exists(path)) {
288  return path;
289  }
290  }
291 // check whether there is a user created version of the file under /etc/app/
292 #ifdef Q_OS_WIN32
293  // use relative paths on Windows
294  path = QStringLiteral("../etc/") % applicationName % QChar('/') % fileName;
295  if (QFile::exists(path)) {
296  return path;
297  } else {
298  // check whether there is the default version of the file under
299  // /usr/share/app/
300  path = QStringLiteral("../share/") % applicationName % QChar('/') % fileName;
301  if (QFile::exists(path)) {
302  return path;
303  } else {
304  return QString(); // file is not present
305  }
306  }
307 #else
308  path = QStringLiteral("/etc/") % applicationName % QChar('/') % fileName;
309  if (QFile::exists(path)) {
310  return path;
311  } else {
312  // check whether there is the default version of the file under
313  // /usr/share/app/
314  path = QStringLiteral("/usr/share/") % applicationName % QChar('/') % fileName;
315  if (QFile::exists(path)) {
316  return path;
317  } else {
318  return QString(); // file is not present
319  }
320  }
321 #endif
322  }
323 }
324 }
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:260
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:277
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: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:116