diff options
author | Ulf Hermann <ulf.hermann@qt.io> | 2018-07-10 16:23:06 +0200 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@qt.io> | 2018-07-20 15:55:10 +0000 |
commit | c298fd7eb0c0c262ee2d03768e7d86bb7a5276a0 (patch) | |
tree | 1b92dcfcd03a0912d8391d017ddd980b54c4281e /src/plugins | |
parent | e2d52543aaf600ce88df457008a0ba88444e18fc (diff) |
Tooling: Allow QML preview to change the language
Change-Id: I9afc5a0e1c7807f19dfcca1270267bbf7f718903
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Diffstat (limited to 'src/plugins')
4 files changed, 56 insertions, 1 deletions
diff --git a/src/plugins/qmltooling/qmldbg_preview/qqmlpreviewhandler.cpp b/src/plugins/qmltooling/qmldbg_preview/qqmlpreviewhandler.cpp index c6b28316ac..af0a2bacdc 100644 --- a/src/plugins/qmltooling/qmldbg_preview/qqmlpreviewhandler.cpp +++ b/src/plugins/qmltooling/qmldbg_preview/qqmlpreviewhandler.cpp @@ -30,6 +30,9 @@ #include <QtCore/qtimer.h> #include <QtCore/qsettings.h> +#include <QtCore/qlibraryinfo.h> +#include <QtCore/qtranslator.h> + #include <QtGui/qwindow.h> #include <QtGui/qguiapplication.h> #include <QtQuick/qquickwindow.h> @@ -79,6 +82,7 @@ QQmlPreviewHandler::QQmlPreviewHandler(QObject *parent) : QObject(parent) QQmlPreviewHandler::~QQmlPreviewHandler() { + removeTranslators(); clear(); } @@ -226,6 +230,39 @@ void QQmlPreviewHandler::zoom(qreal newFactor) } } +void QQmlPreviewHandler::removeTranslators() +{ + if (!m_qtTranslator.isNull()) { + QCoreApplication::removeTranslator(m_qtTranslator.get()); + m_qtTranslator.reset(); + } + + if (m_qmlTranslator.isNull()) { + QCoreApplication::removeTranslator(m_qmlTranslator.get()); + m_qmlTranslator.reset(); + } +} + +void QQmlPreviewHandler::language(const QUrl &context, const QString &locale) +{ + removeTranslators(); + + m_qtTranslator.reset(new QTranslator(this)); + if (m_qtTranslator->load(QLatin1String("qt_") + locale, + QLibraryInfo::location(QLibraryInfo::TranslationsPath))) { + QCoreApplication::installTranslator(m_qtTranslator.get()); + } + + m_qmlTranslator.reset(new QTranslator(this)); + if (m_qmlTranslator->load(QLatin1String("qml_" ) + locale, + context.toLocalFile() + QLatin1String("/i18n"))) { + QCoreApplication::installTranslator(m_qmlTranslator.get()); + } + + for (QQmlEngine *engine : qAsConst(m_engines)) + engine->retranslate(); +} + void QQmlPreviewHandler::clear() { qDeleteAll(m_createdObjects); diff --git a/src/plugins/qmltooling/qmldbg_preview/qqmlpreviewhandler.h b/src/plugins/qmltooling/qmldbg_preview/qqmlpreviewhandler.h index 53855b0f62..6d2a77cf0b 100644 --- a/src/plugins/qmltooling/qmldbg_preview/qqmlpreviewhandler.h +++ b/src/plugins/qmltooling/qmldbg_preview/qqmlpreviewhandler.h @@ -54,6 +54,8 @@ class QQmlEngine; class QQuickItem; class QQmlPreviewUrlInterceptor; class QQuickWindow; +class QTranslator; + class QQmlPreviewHandler : public QObject { Q_OBJECT @@ -67,6 +69,7 @@ public: void loadUrl(const QUrl &url); void rerun(); void zoom(qreal newFactor); + void language(const QUrl &context, const QString &locale); void clear(); @@ -82,6 +85,7 @@ private: void setCurrentWindow(QQuickWindow *window); void frameSwapped(); void fpsTimerHit(); + void removeTranslators(); QScopedPointer<QQuickItem> m_dummyItem; QList<QQmlEngine *> m_engines; @@ -93,6 +97,9 @@ private: QTimer m_fpsTimer; quint16 m_frames = 0; + + QScopedPointer<QTranslator> m_qtTranslator; + QScopedPointer<QTranslator> m_qmlTranslator; }; QT_END_NAMESPACE diff --git a/src/plugins/qmltooling/qmldbg_preview/qqmlpreviewservice.cpp b/src/plugins/qmltooling/qmldbg_preview/qqmlpreviewservice.cpp index 5f78ce7752..b06e8e9008 100644 --- a/src/plugins/qmltooling/qmldbg_preview/qqmlpreviewservice.cpp +++ b/src/plugins/qmltooling/qmldbg_preview/qqmlpreviewservice.cpp @@ -53,6 +53,7 @@ QQmlPreviewServiceImpl::QQmlPreviewServiceImpl(QObject *parent) : connect(this, &QQmlPreviewServiceImpl::load, &m_handler, &QQmlPreviewHandler::loadUrl); connect(this, &QQmlPreviewServiceImpl::rerun, &m_handler, &QQmlPreviewHandler::rerun); connect(this, &QQmlPreviewServiceImpl::zoom, &m_handler, &QQmlPreviewHandler::zoom); + connect(this, &QQmlPreviewServiceImpl::language, &m_handler, &QQmlPreviewHandler::language); connect(&m_handler, &QQmlPreviewHandler::error, this, &QQmlPreviewServiceImpl::forwardError, Qt::DirectConnection); connect(&m_handler, &QQmlPreviewHandler::fps, this, &QQmlPreviewServiceImpl::forwardFps, @@ -123,6 +124,14 @@ void QQmlPreviewServiceImpl::messageReceived(const QByteArray &data) emit zoom(static_cast<qreal>(factor)); break; } + case Language: { + QUrl context; + QString locale; + packet >> context >> locale; + emit language(context.isEmpty() ? m_currentUrl : context, + locale.isEmpty() ? QLocale::system().name() : locale); + break; + } default: forwardError(QString::fromLatin1("Invalid command: %1").arg(command)); break; diff --git a/src/plugins/qmltooling/qmldbg_preview/qqmlpreviewservice.h b/src/plugins/qmltooling/qmldbg_preview/qqmlpreviewservice.h index e439b8ae69..ee59f4f3af 100644 --- a/src/plugins/qmltooling/qmldbg_preview/qqmlpreviewservice.h +++ b/src/plugins/qmltooling/qmldbg_preview/qqmlpreviewservice.h @@ -62,7 +62,8 @@ public: Directory, ClearCache, Zoom, - Fps + Fps, + Language }; static const QString s_key; @@ -87,6 +88,7 @@ signals: void rerun(); void clearCache(); void zoom(qreal factor); + void language(const QUrl &context, const QString &locale); private: QScopedPointer<QQmlPreviewFileEngineHandler> m_fileEngine; |