aboutsummaryrefslogtreecommitdiff
path: root/modules/ECMQmLoader.cpp.in
diff options
context:
space:
mode:
authorAlex Merry <alex.merry@kde.org>2015-10-14 12:18:40 +0100
committerAlex Merry <alex.merry@kde.org>2015-11-03 10:22:34 +0000
commit009c480413910e8c1a18f4d1420f4a517ea606e6 (patch)
treec8a41523992eac3cadcfe18c11b956d84b397c5b /modules/ECMQmLoader.cpp.in
parentfb7b8eea7d91772f989d5b060c86df20f2ebdb66 (diff)
downloadextra-cmake-modules-009c480413910e8c1a18f4d1420f4a517ea606e6.tar.gz
extra-cmake-modules-009c480413910e8c1a18f4d1420f4a517ea606e6.tar.bz2
Make sure we load translations on the main thread.
BUG: 346188 REVIEW: 123726
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"