aboutsummaryrefslogtreecommitdiff
path: root/modules/ECMQmLoader.cpp.in
diff options
context:
space:
mode:
Diffstat (limited to 'modules/ECMQmLoader.cpp.in')
-rw-r--r--modules/ECMQmLoader.cpp.in90
1 files changed, 63 insertions, 27 deletions
diff --git a/modules/ECMQmLoader.cpp.in b/modules/ECMQmLoader.cpp.in
index bc01bf98..f6b98e7b 100644
--- a/modules/ECMQmLoader.cpp.in
+++ b/modules/ECMQmLoader.cpp.in
@@ -5,41 +5,77 @@
*/
#include <QCoreApplication>
#include <QLocale>
+#include <QMetaObject>
#include <QStandardPaths>
+#include <QThread>
#include <QTranslator>
-#include <QDebug>
+namespace {
-static bool loadTranslation(const QString &localeDirName)
-{
- QString subPath = QStringLiteral("locale/") + localeDirName + QStringLiteral("/LC_MESSAGES/@catalog_name@.qm");
- QString fullPath = QStandardPaths::locate(QStandardPaths::GenericDataLocation, subPath);
- if (fullPath.isEmpty()) {
- return false;
+ bool loadTranslation(const QString &localeDirName)
+ {
+ QString subPath = QStringLiteral("locale/") + localeDirName + QStringLiteral("/LC_MESSAGES/@catalog_name@.qm");
+ QString fullPath = QStandardPaths::locate(QStandardPaths::GenericDataLocation, subPath);
+ if (fullPath.isEmpty()) {
+ return false;
+ }
+ QTranslator *translator = new QTranslator(QCoreApplication::instance());
+ if (!translator->load(fullPath)) {
+ delete translator;
+ return false;
+ }
+ QCoreApplication::instance()->installTranslator(translator);
+ return true;
}
- QTranslator *translator = new QTranslator(QCoreApplication::instance());
- if (!translator->load(fullPath)) {
- delete translator;
- return false;
+
+ void load()
+ {
+ // The way Qt translation system handles plural forms makes it necessary to
+ // have a translation file which contains only plural forms for `en`. That's
+ // why we load the `en` translation unconditionally, then load the
+ // translation for the current locale to overload it.
+ loadTranslation(QStringLiteral("en"));
+
+ QLocale locale = QLocale::system();
+ if (locale.name() != QStringLiteral("en")) {
+ if (!loadTranslation(locale.name())) {
+ loadTranslation(locale.bcp47Name());
+ }
+ }
}
- QCoreApplication::instance()->installTranslator(translator);
- return true;
-}
-static void load()
-{
- // The way Qt translation system handles plural forms makes it necessary to
- // have a translation file which contains only plural forms for `en`. That's
- // why we load the `en` translation unconditionally, then load the
- // translation for the current locale to overload it.
- loadTranslation(QStringLiteral("en"));
-
- QLocale locale = QLocale::system();
- if (locale.name() != QStringLiteral("en")) {
- if (!loadTranslation(locale.name())) {
- loadTranslation(locale.bcp47Name());
+ // helper to call load() on the correct thread
+ class Loader : public QObject
+ {
+ Q_OBJECT
+
+ public Q_SLOTS:
+ void callLoadAndDeleteSelf()
+ {
+ load();
+ this->deleteLater();
+ }
+ };
+
+ void loadOnMainThread()
+ {
+ // If this library is loaded after the QCoreApplication instance is created
+ // (eg: because it is brought in by a plugin), there is no guarantee this
+ // function will be called on the main thread.
+ // QCoreApplication::installTranslator needs to be called on the main
+ // thread, because it uses QCoreApplication::sendEvent.
+ if (QThread::currentThread() == QCoreApplication::instance()->thread()) {
+ load();
+ } else {
+ // QObjects inherit their parent object's thread
+ Loader *loader = new Loader();
+ loader->moveToThread(QCoreApplication::instance()->thread());
+ QMetaObject::invokeMethod(loader, "callLoadAndDeleteSelf", Qt::AutoConnection);
}
}
+
}
-Q_COREAPP_STARTUP_FUNCTION(load)
+Q_COREAPP_STARTUP_FUNCTION(loadOnMainThread)
+
+#include "ECMQmLoader.moc"