Qt Utilities 6.7.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
25using namespace std;
26
28inline void initResources()
29{
30 Q_INIT_RESOURCE(qtutilsicons);
31}
32
33inline void cleanupResources()
34{
35 Q_CLEANUP_RESOURCE(qtutilsicons);
36}
38
39namespace QtUtilities {
40
45namespace QtUtilitiesResources {
46
51void init()
52{
53 initResources();
54}
55
60void cleanup()
61{
62 cleanupResources();
63}
64} // namespace QtUtilitiesResources
65
69namespace TranslationFiles {
70
76{
77 static QString path;
78 return path;
79}
80
95void loadQtTranslationFile(std::initializer_list<QString> repositoryNames)
96{
97 loadQtTranslationFile(repositoryNames, QLocale().name());
98}
99
115void 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
170void 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
182void 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
217void 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
251void loadApplicationTranslationFile(const QString &configName, const std::initializer_list<QString> &applicationNames)
252{
253 for (const QString &applicationName : applicationNames) {
254 loadApplicationTranslationFile(configName, applicationName);
255 }
256}
257
264void 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
277namespace ApplicationInstances {
278
279#if defined(QT_UTILITIES_GUI_QTWIDGETS)
283bool 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)
293bool 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#ifdef QT_FEATURE_fontdialog
317 if (!qEnvironmentVariableIsSet("FONTCONFIG_PATH") && QDir(QStringLiteral("/etc/fonts")).exists()) {
318 qputenv("FONTCONFIG_PATH", "/etc/fonts");
319 }
320#endif
321#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
322 if (!QCoreApplication::instance()) {
323 QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling, true);
324 }
325 QCoreApplication::setAttribute(Qt::AA_UseHighDpiPixmaps, true);
326#endif
327}
328
329// namespace ApplicationInstances
330
331} // 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 loadQtTranslationFile(std::initializer_list< QString > repositoryNames)
Loads and installs the appropriate Qt translation file for the current locale.
Definition: resources.cpp:95
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
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