aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@qt.io>2018-02-21 13:50:05 +0100
committerSimon Hausmann <simon.hausmann@qt.io>2018-02-26 14:35:21 +0000
commitdb15c3455971f47b86078a44a30e0f0a13b54204 (patch)
tree8bab583a6800074dad8116d74fec29a1f88409c0
parent3aa73dc00b25aa0c1b85b8b7809a0fd8ad3617a7 (diff)
Fix QQmlEngine::retranslate() with PropertyChanges
When changing the language, we need to re-apply the state of items and re-run the translations if present. Task-number: QTBUG-66541 Change-Id: I83a542af033990ef9a0f92801c5f52d3a5ec722c Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
-rw-r--r--src/quick/util/qquickpropertychanges.cpp25
-rw-r--r--tests/auto/qml/qqmltranslation/data/TranslationChangeBase.qml4
-rw-r--r--tests/auto/qml/qqmltranslation/data/translationChange.qml16
-rw-r--r--tests/auto/qml/qqmltranslation/tst_qqmltranslation.cpp2
4 files changed, 36 insertions, 11 deletions
diff --git a/src/quick/util/qquickpropertychanges.cpp b/src/quick/util/qquickpropertychanges.cpp
index f79dbf35a0..a3a598621f 100644
--- a/src/quick/util/qquickpropertychanges.cpp
+++ b/src/quick/util/qquickpropertychanges.cpp
@@ -213,13 +213,15 @@ public:
class ExpressionChange {
public:
ExpressionChange(const QString &_name,
+ const QV4::CompiledData::Binding *_binding,
QQmlBinding::Identifier _id,
const QString& _expr,
const QUrl &_url,
int _line,
int _column)
- : name(_name), id(_id), expression(_expr), url(_url), line(_line), column(_column) {}
+ : name(_name), binding(_binding), id(_id), expression(_expr), url(_url), line(_line), column(_column) {}
QString name;
+ const QV4::CompiledData::Binding *binding;
QQmlBinding::Identifier id;
QString expression;
QUrl url;
@@ -296,8 +298,7 @@ void QQuickPropertyChangesPrivate::decodeBinding(const QString &propertyPrefix,
}
}
- if (binding->type == QV4::CompiledData::Binding::Type_Script) {
- QString expression = binding->valueAsString(qmlUnit);
+ if (binding->type == QV4::CompiledData::Binding::Type_Script || binding->containsTranslations()) {
QUrl url = QUrl();
int line = -1;
int column = -1;
@@ -309,16 +310,23 @@ void QQuickPropertyChangesPrivate::decodeBinding(const QString &propertyPrefix,
column = ddata->columnNumber;
}
- expressions << ExpressionChange(propertyName, binding->value.compiledScriptIndex, expression, url, line, column);
+ QString expression;
+ QQmlBinding::Identifier id = QQmlBinding::Invalid;
+
+ if (!binding->containsTranslations()) {
+ expression = binding->valueAsString(qmlUnit);
+ id = binding->value.compiledScriptIndex;
+ }
+ expressions << ExpressionChange(propertyName, binding, id, expression, url, line, column);
return;
}
QVariant var;
switch (binding->type) {
case QV4::CompiledData::Binding::Type_Script:
- Q_UNREACHABLE();
case QV4::CompiledData::Binding::Type_Translation:
case QV4::CompiledData::Binding::Type_TranslationById:
+ Q_UNREACHABLE();
case QV4::CompiledData::Binding::Type_String:
var = binding->valueAsString(qmlUnit);
break;
@@ -460,13 +468,14 @@ QQuickPropertyChanges::ActionList QQuickPropertyChanges::actions()
QQmlContextData *context = QQmlContextData::get(qmlContext(this));
QQmlBinding *newBinding = nullptr;
- if (e.id != QQmlBinding::Invalid) {
+ if (e.binding && e.binding->containsTranslations()) {
+ newBinding = QQmlBinding::createTranslationBinding(d->compilationUnit, e.binding, object(), context);
+ } else if (e.id != QQmlBinding::Invalid) {
QV4::Scope scope(qmlEngine(this)->handle());
QV4::Scoped<QV4::QmlContext> qmlContext(scope, QV4::QmlContext::create(scope.engine->rootContext(), context, object()));
newBinding = QQmlBinding::create(&QQmlPropertyPrivate::get(prop)->core,
d->compilationUnit->runtimeFunctions.at(e.id), object(), context, qmlContext);
}
-// QQmlBinding *newBinding = e.id != QQmlBinding::Invalid ? QQmlBinding::createBinding(e.id, object(), qmlContext(this)) : 0;
if (!newBinding)
newBinding = QQmlBinding::create(&QQmlPropertyPrivate::get(prop)->core,
e.expression, object(), context, e.url.toString(), e.line);
@@ -645,7 +654,7 @@ void QQuickPropertyChanges::changeExpression(const QString &name, const QString
}
// adding a new expression.
- expressionIterator.insert(ExpressionEntry(name, QQmlBinding::Invalid, expression, QUrl(), -1, -1));
+ expressionIterator.insert(ExpressionEntry(name, nullptr, QQmlBinding::Invalid, expression, QUrl(), -1, -1));
if (state() && state()->isStateActive()) {
if (hadValue) {
diff --git a/tests/auto/qml/qqmltranslation/data/TranslationChangeBase.qml b/tests/auto/qml/qqmltranslation/data/TranslationChangeBase.qml
index c447c84987..294fff3284 100644
--- a/tests/auto/qml/qqmltranslation/data/TranslationChangeBase.qml
+++ b/tests/auto/qml/qqmltranslation/data/TranslationChangeBase.qml
@@ -1,5 +1,5 @@
-import QtQml 2.0
+import QtQuick 2.0
-QtObject {
+Item {
property string baseProperty: qsTr("translate me");
}
diff --git a/tests/auto/qml/qqmltranslation/data/translationChange.qml b/tests/auto/qml/qqmltranslation/data/translationChange.qml
index 23b87c2493..c48a482138 100644
--- a/tests/auto/qml/qqmltranslation/data/translationChange.qml
+++ b/tests/auto/qml/qqmltranslation/data/translationChange.qml
@@ -1,10 +1,24 @@
-import QtQml 2.0
+import QtQuick 2.0
TranslationChangeBase {
+ id: root
+
baseProperty: "do not translate"
property string text1: qsTr("translate me")
function weDoTranslations() {
return qsTr("translate me")
}
property string text2: weDoTranslations()
+ property string text3
+
+ states: [
+ State {
+ name: "default"
+ when: 1 == 1
+ PropertyChanges {
+ target: root
+ text3: qsTr("translate me")
+ }
+ }
+ ]
}
diff --git a/tests/auto/qml/qqmltranslation/tst_qqmltranslation.cpp b/tests/auto/qml/qqmltranslation/tst_qqmltranslation.cpp
index fc736cde1a..1c67ba5541 100644
--- a/tests/auto/qml/qqmltranslation/tst_qqmltranslation.cpp
+++ b/tests/auto/qml/qqmltranslation/tst_qqmltranslation.cpp
@@ -194,6 +194,7 @@ void tst_qqmltranslation::translationChange()
QCOMPARE(object->property("baseProperty").toString(), QString::fromUtf8("do not translate"));
QCOMPARE(object->property("text1").toString(), QString::fromUtf8("translate me"));
QCOMPARE(object->property("text2").toString(), QString::fromUtf8("translate me"));
+ QCOMPARE(object->property("text3").toString(), QString::fromUtf8("translate me"));
DummyTranslator translator;
QCoreApplication::installTranslator(&translator);
@@ -204,6 +205,7 @@ void tst_qqmltranslation::translationChange()
QCOMPARE(object->property("baseProperty").toString(), QString::fromUtf8("do not translate"));
QCOMPARE(object->property("text1").toString(), QString::fromUtf8("xxx"));
QCOMPARE(object->property("text2").toString(), QString::fromUtf8("xxx"));
+ QCOMPARE(object->property("text3").toString(), QString::fromUtf8("xxx"));
QCoreApplication::removeTranslator(&translator);
}