Qt Utilities  6.4.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 <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 
39 namespace QtUtilities {
40 
45 namespace QtUtilitiesResources {
46 
51 void init()
52 {
53  initResources();
54 }
55 
60 void cleanup()
61 {
62  cleanupResources();
63 }
64 } // namespace QtUtilitiesResources
65 
69 namespace TranslationFiles {
70 
76 {
77  static QString path;
78  return path;
79 }
80 
95 void loadQtTranslationFile(std::initializer_list<QString> repositoryNames)
96 {
97  loadQtTranslationFile(repositoryNames, QLocale().name());
98 }
99 
115 void loadQtTranslationFile(initializer_list<QString> repositoryNames, const QString &localeName)
116 {
117  const auto debugTranslations = qEnvironmentVariableIsSet("QT_DEBUG_TRANSLATIONS");
118  for (const auto &repoName : repositoryNames) {
119  auto *const qtTranslator = new QTranslator(QCoreApplication::instance());
120  const auto fileName = QString(repoName % QChar('_') % localeName);
121 
122  QString path;
123  if ((!additionalTranslationFilePath().isEmpty() && qtTranslator->load(fileName, path = additionalTranslationFilePath()))
124  || qtTranslator->load(fileName,
125  path =
126 #if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
127  QLibraryInfo::location(QLibraryInfo::TranslationsPath)
128 #else
129  QLibraryInfo::path(QLibraryInfo::TranslationsPath)
130 #endif
131  )
132  || qtTranslator->load(fileName, path = QStringLiteral("../share/qt/translations"))
133  || qtTranslator->load(fileName, path = QStringLiteral(":/translations"))) {
134  QCoreApplication::installTranslator(qtTranslator);
135  if (debugTranslations) {
136  cerr << "Loading translation file for Qt repository \"" << repoName.toLocal8Bit().data() << "\" and the locale \""
137  << localeName.toLocal8Bit().data() << "\" from \"" << path.toLocal8Bit().data() << "\"." << endl;
138  }
139  } else {
140  delete qtTranslator;
141  if (localeName.startsWith(QLatin1String("en"))) {
142  // the translation file is probably just empty (English is built-in and usually only used for plural forms)
143  continue;
144  }
145  cerr << "Unable to load translation file for Qt repository \"" << repoName.toLocal8Bit().data() << "\" and locale "
146  << localeName.toLocal8Bit().data() << "." << endl;
147  }
148  }
149 }
150 
170 void loadApplicationTranslationFile(const QString &configName, const QString &applicationName)
171 {
172  // load English translation files as fallback
173  loadApplicationTranslationFile(configName, applicationName, QStringLiteral("en_US"));
174  // load translation files for current locale
175  const auto defaultLocale(QLocale().name());
176  if (defaultLocale != QLatin1String("en_US")) {
177  loadApplicationTranslationFile(configName, applicationName, defaultLocale);
178  }
179 }
180 
182 void logTranslationEvent(
183  const char *event, const QString &configName, const QString &applicationName, const QString &localeName, const QString &path = QString())
184 {
185  cerr << event << " translation file for \"" << applicationName.toLocal8Bit().data() << "\"";
186  if (!configName.isEmpty()) {
187  cerr << " (config \"" << configName.toLocal8Bit().data() << "\")";
188  }
189  cerr << " and locale \"" << localeName.toLocal8Bit().data() << '\"';
190  if (!path.isEmpty()) {
191  cerr << " from \"" << path.toLocal8Bit().data() << '\"';
192  }
193  cerr << '.' << endl;
194 }
196 
217 void loadApplicationTranslationFile(const QString &configName, const QString &applicationName, const QString &localeName)
218 {
219  auto *const appTranslator = new QTranslator(QCoreApplication::instance());
220  const auto fileName = QString(applicationName % QChar('_') % localeName);
221  const auto directoryName = configName.isEmpty() ? applicationName : QString(applicationName % QChar('-') % configName);
222 
223  QString path;
224  if ((!additionalTranslationFilePath().isEmpty() && appTranslator->load(fileName, path = additionalTranslationFilePath()))
225  || appTranslator->load(fileName, path = QStringLiteral(".")) || appTranslator->load(fileName, path = QStringLiteral("../") % directoryName)
226  || appTranslator->load(fileName, path = QStringLiteral("../") % directoryName)
227  || appTranslator->load(fileName, path = QStringLiteral("../../") % directoryName)
228  || appTranslator->load(fileName, path = QStringLiteral("./translations"))
229  || appTranslator->load(fileName, path = QStringLiteral("../share/") % directoryName % QStringLiteral("/translations"))
230  || appTranslator->load(fileName, path = QStringLiteral(APP_INSTALL_PREFIX "/share/") % directoryName % QStringLiteral("/translations"))
231  || appTranslator->load(fileName, path = QStringLiteral(":/translations"))) {
232  QCoreApplication::installTranslator(appTranslator);
233  if (qEnvironmentVariableIsSet("QT_DEBUG_TRANSLATIONS")) {
234  logTranslationEvent("Loading", configName, applicationName, localeName, path);
235  }
236  } else {
237  delete appTranslator;
238  if (localeName.startsWith(QLatin1String("en"))) {
239  // the translation file is probably just empty (English is built-in and usually only used for plural forms)
240  return;
241  }
242  logTranslationEvent("Unable to load", configName, applicationName, localeName);
243  }
244 }
245 
251 void loadApplicationTranslationFile(const QString &configName, const std::initializer_list<QString> &applicationNames)
252 {
253  for (const QString &applicationName : applicationNames) {
254  loadApplicationTranslationFile(configName, applicationName);
255  }
256 }
257 
264 void loadApplicationTranslationFile(const QString &configName, const std::initializer_list<QString> &applicationNames, const QString &localeName)
265 {
266  for (const QString &applicationName : applicationNames) {
267  loadApplicationTranslationFile(configName, applicationName, localeName);
268  }
269 }
270 } // namespace TranslationFiles
271 
277 namespace ApplicationInstances {
278 
279 #if defined(QT_UTILITIES_GUI_QTWIDGETS)
283 bool hasWidgetsApp()
284 {
285  return qobject_cast<QApplication *>(QCoreApplication::instance()) != nullptr;
286 }
287 #endif
288 
289 #if defined(QT_UTILITIES_GUI_QTWIDGETS) || defined(QT_UTILITIES_GUI_QTQUICK)
293 bool hasGuiApp()
294 {
295  return qobject_cast<QGuiApplication *>(QCoreApplication::instance()) != nullptr;
296 }
297 #endif
298 
303 {
304  return qobject_cast<QCoreApplication *>(QCoreApplication::instance()) != nullptr;
305 }
306 } // namespace ApplicationInstances
307 
315 {
316 #if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
317  QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling, true);
318  QCoreApplication::setAttribute(Qt::AA_UseHighDpiPixmaps, true);
319 #endif
320 }
321 
322 // namespace ApplicationInstances
323 
324 } // namespace QtUtilities
QT_UTILITIES_EXPORT bool hasCoreApp()
Returns whether a QCoreApplication has been instantiated yet.
Definition: resources.cpp:302
QT_UTILITIES_EXPORT void init()
Initiates the resources used and provided by this library.
Definition: resources.cpp:51
QT_UTILITIES_EXPORT void cleanup()
Frees the resources used and provided by this library.
Definition: resources.cpp:60
QT_UTILITIES_EXPORT void loadApplicationTranslationFile(const QString &configName, const QString &applicationName)
Loads and installs the appropriate application translation file for the current locale.
Definition: resources.cpp:170
void loadQtTranslationFile(initializer_list< QString > repositoryNames, const QString &localeName)
Loads and installs the appropriate Qt translation file for the specified locale.
Definition: resources.cpp:115
QT_UTILITIES_EXPORT QString & additionalTranslationFilePath()
Allows to set an additional search path for translation files.
Definition: resources.cpp:75
QT_UTILITIES_EXPORT void setupCommonQtApplicationAttributes()
Sets Qt application attributes which are commonly used within my Qt applications.
Definition: resources.cpp:314