Qt Utilities  6.0.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 
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;
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, path = QLibraryInfo::location(QLibraryInfo::TranslationsPath))
125  || qtTranslator->load(fileName, path = QStringLiteral("../share/qt/translations"))
126  || qtTranslator->load(fileName, path = QStringLiteral(":/translations"))) {
127  QCoreApplication::installTranslator(qtTranslator);
128  if (debugTranslations) {
129  cerr << "Loading translation file for Qt repository \"" << repoName.toLocal8Bit().data() << "\" and the locale \""
130  << localeName.toLocal8Bit().data() << "\" from \"" << path.toLocal8Bit().data() << "\"." << endl;
131  }
132  } else {
133  delete qtTranslator;
134  if (localeName.startsWith(QLatin1String("en"))) {
135  // the translation file is probably just empty (English is built-in and usually only used for plural forms)
136  continue;
137  }
138  cerr << "Unable to load translation file for Qt repository \"" << repoName.toLocal8Bit().data() << "\" and locale "
139  << localeName.toLocal8Bit().data() << "." << endl;
140  }
141  }
142 }
143 
163 void loadApplicationTranslationFile(const QString &configName, const QString &applicationName)
164 {
165  // load English translation files as fallback
166  loadApplicationTranslationFile(configName, applicationName, QStringLiteral("en_US"));
167  // load translation files for current locale
168  const auto defaultLocale(QLocale().name());
169  if (defaultLocale != QLatin1String("en_US")) {
170  loadApplicationTranslationFile(configName, applicationName, defaultLocale);
171  }
172 }
173 
175 void logTranslationEvent(
176  const char *event, const QString &configName, const QString &applicationName, const QString &localeName, const QString &path = QString())
177 {
178  cerr << event << " translation file for \"" << applicationName.toLocal8Bit().data() << "\"";
179  if (!configName.isEmpty()) {
180  cerr << " (config \"" << configName.toLocal8Bit().data() << "\")";
181  }
182  cerr << " and locale \"" << localeName.toLocal8Bit().data() << '\"';
183  if (!path.isEmpty()) {
184  cerr << " from \"" << path.toLocal8Bit().data() << '\"';
185  }
186  cerr << '.' << endl;
187 }
189 
210 void loadApplicationTranslationFile(const QString &configName, const QString &applicationName, const QString &localeName)
211 {
212  auto *const appTranslator = new QTranslator;
213  const auto fileName = QString(applicationName % QChar('_') % localeName);
214  const auto directoryName = configName.isEmpty() ? applicationName : QString(applicationName % QChar('-') % configName);
215 
216  QString path;
217  if ((!additionalTranslationFilePath().isEmpty() && appTranslator->load(fileName, path = additionalTranslationFilePath()))
218  || appTranslator->load(fileName, path = QStringLiteral(".")) || appTranslator->load(fileName, path = QStringLiteral("../") % directoryName)
219  || appTranslator->load(fileName, path = QStringLiteral("../") % directoryName)
220  || appTranslator->load(fileName, path = QStringLiteral("../../") % directoryName)
221  || appTranslator->load(fileName, path = QStringLiteral("./translations"))
222  || appTranslator->load(fileName, path = QStringLiteral("../share/") % directoryName % QStringLiteral("/translations"))
223  || appTranslator->load(fileName, path = QStringLiteral(APP_INSTALL_PREFIX "/share/") % directoryName % QStringLiteral("/translations"))
224  || appTranslator->load(fileName, path = QStringLiteral(":/translations"))) {
225  QCoreApplication::installTranslator(appTranslator);
226  if (qEnvironmentVariableIsSet("QT_DEBUG_TRANSLATIONS")) {
227  logTranslationEvent("Loading", configName, applicationName, localeName, path);
228  }
229  } else {
230  delete appTranslator;
231  if (localeName.startsWith(QLatin1String("en"))) {
232  // the translation file is probably just empty (English is built-in and usually only used for plural forms)
233  return;
234  }
235  logTranslationEvent("Unable to load", configName, applicationName, localeName);
236  }
237 }
238 
244 void loadApplicationTranslationFile(const QString &configName, const std::initializer_list<QString> &applicationNames)
245 {
246  for (const QString &applicationName : applicationNames) {
247  loadApplicationTranslationFile(configName, applicationName);
248  }
249 }
250 
257 void loadApplicationTranslationFile(const QString &configName, const std::initializer_list<QString> &applicationNames, const QString &localeName)
258 {
259  for (const QString &applicationName : applicationNames) {
260  loadApplicationTranslationFile(configName, applicationName, localeName);
261  }
262 }
263 } // namespace TranslationFiles
264 
270 namespace ApplicationInstances {
271 
272 #if defined(QT_UTILITIES_GUI_QTWIDGETS)
273 
276 bool hasWidgetsApp()
277 {
278  return qobject_cast<QApplication *>(QCoreApplication::instance()) != nullptr;
279 }
280 #endif
281 
282 #if defined(QT_UTILITIES_GUI_QTWIDGETS) || defined(QT_UTILITIES_GUI_QTQUICK)
283 
286 bool hasGuiApp()
287 {
288  return qobject_cast<QGuiApplication *>(QCoreApplication::instance()) != nullptr;
289 }
290 #endif
291 
296 {
297  return qobject_cast<QCoreApplication *>(QCoreApplication::instance()) != nullptr;
298 }
299 } // namespace ApplicationInstances
300 
301 } // namespace QtUtilities
QtUtilities::ApplicationInstances::hasCoreApp
QT_UTILITIES_EXPORT bool hasCoreApp()
Returns whether a QCoreApplication has been instantiated yet.
Definition: resources.cpp:295
QtUtilities::TranslationFiles::additionalTranslationFilePath
QT_UTILITIES_EXPORT QString & additionalTranslationFilePath()
Allows to set an additional search path for translation files.
Definition: resources.cpp:75
QtUtilities::TranslationFiles::loadQtTranslationFile
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
QtUtilities
!
Definition: trylocker.h:8
QtUtilities::TranslationFiles::loadApplicationTranslationFile
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:163
resources.h
QtUtilities::QtUtilitiesResources::cleanup
QT_UTILITIES_EXPORT void cleanup()
Frees the resources used and provided by this library.
Definition: resources.cpp:60
QtUtilities::QtUtilitiesResources::init
QT_UTILITIES_EXPORT void init()
Initiates the resources used and provided by this library.
Definition: resources.cpp:51