diff options
8 files changed, 75 insertions, 2 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; diff --git a/src/qmldebug/qqmlpreviewclient.cpp b/src/qmldebug/qqmlpreviewclient.cpp index 33a2f53ca4..ba27457765 100644 --- a/src/qmldebug/qqmlpreviewclient.cpp +++ b/src/qmldebug/qqmlpreviewclient.cpp @@ -128,4 +128,11 @@ void QQmlPreviewClient::triggerZoom(float factor) sendMessage(packet.data()); } +void QQmlPreviewClient::triggerLanguage(const QUrl &url, const QString &locale) +{ + QPacket packet(connection()->currentDataStreamVersion()); + packet << static_cast<qint8>(Language) << url << locale; + sendMessage(packet.data()); +} + QT_END_NAMESPACE diff --git a/src/qmldebug/qqmlpreviewclient_p.h b/src/qmldebug/qqmlpreviewclient_p.h index d79ecefe32..67615cabb2 100644 --- a/src/qmldebug/qqmlpreviewclient_p.h +++ b/src/qmldebug/qqmlpreviewclient_p.h @@ -72,7 +72,8 @@ public: Directory, ClearCache, Zoom, - Fps + Fps, + Language }; QQmlPreviewClient(QQmlDebugConnection *parent); @@ -85,6 +86,7 @@ public: void triggerLoad(const QUrl &url); void triggerRerun(); void triggerZoom(float factor); + void triggerLanguage(const QUrl &url, const QString &locale); signals: void request(const QString &path); diff --git a/tests/auto/qml/debugger/qqmlpreview/data/i18n/qml_qt_QT.qm b/tests/auto/qml/debugger/qqmlpreview/data/i18n/qml_qt_QT.qm new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/tests/auto/qml/debugger/qqmlpreview/data/i18n/qml_qt_QT.qm diff --git a/tests/auto/qml/debugger/qqmlpreview/tst_qqmlpreview.cpp b/tests/auto/qml/debugger/qqmlpreview/tst_qqmlpreview.cpp index 9477603654..2bf11b6f36 100644 --- a/tests/auto/qml/debugger/qqmlpreview/tst_qqmlpreview.cpp +++ b/tests/auto/qml/debugger/qqmlpreview/tst_qqmlpreview.cpp @@ -69,6 +69,7 @@ private slots: void error(); void zoom(); void fps(); + void language(); }; QQmlDebugTest::ConnectResult tst_QQmlPreview::startQmlProcess(const QString &qmlFile) @@ -341,6 +342,14 @@ void tst_QQmlPreview::fps() QSKIP("offscreen rendering doesn't produce any frames"); } +void tst_QQmlPreview::language() +{ + QCOMPARE(startQmlProcess("window.qml"), ConnectSuccess); + QVERIFY(m_client); + m_client->triggerLanguage(dataDirectoryUrl(), "qt_QT"); + QTRY_VERIFY_WITH_TIMEOUT(m_files.contains(testFile("i18n/qml_qt_QT.qm")), 30000); +} + QTEST_MAIN(tst_QQmlPreview) #include "tst_qqmlpreview.moc" |