diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/HelperWidgets/LineEdit.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/HelperWidgets/LineEdit.qml index a9d45c9ee83..42ff594d84a 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/HelperWidgets/LineEdit.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/HelperWidgets/LineEdit.qml @@ -50,6 +50,19 @@ Controls.TextField { signal commitData + property string context + + function setTranslateExpression() + { + if (translateFunction() === "qsTranslate") { + backendValue.expression = translateFunction() + + "(\"" + backendValue.getTranslationContext() + + "\", " + "\"" + trCheckbox.escapeString(text) + "\")" + } else { + backendValue.expression = translateFunction() + "(\"" + trCheckbox.escapeString(text) + "\")" + } + } + ExtendedFunctionButton { x: 2 anchors.verticalCenter: parent.verticalCenter @@ -96,7 +109,7 @@ Controls.TextField { return if (backendValue.isTranslated) { - backendValue.expression = translateFunction() + "(\"" + trCheckbox.escapeString(text) + "\")" + setTranslateExpression() } else { if (lineEdit.backendValue.value !== text) lineEdit.backendValue.value = text; @@ -142,7 +155,7 @@ Controls.TextField { onClicked: { if (trCheckbox.checked) { - lineEdit.backendValue.expression = translateFunction() + "(\"" + escapeString(lineEdit.text) + "\")" + setTranslateExpression() } else { var textValue = lineEdit.text lineEdit.backendValue.value = textValue diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorcontextobject.cpp b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorcontextobject.cpp index eb42a64de36..787f202b1fa 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorcontextobject.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorcontextobject.cpp @@ -111,9 +111,17 @@ QColor PropertyEditorContextObject::colorFromString(const QString &colorString) QString PropertyEditorContextObject::translateFunction() { if (QmlDesignerPlugin::instance()->settings().value( - DesignerSettingsKey::USE_QSTR_FUNCTION).toBool()) - return QStringLiteral("qsTr"); - return QStringLiteral("qsTrId"); + DesignerSettingsKey::TYPE_OF_QSTR_FUNCTION).toInt()) + + switch (QmlDesignerPlugin::instance()->settings().value( + DesignerSettingsKey::TYPE_OF_QSTR_FUNCTION).toInt()) { + case 0: return "qsTr"; + case 1: return "qsTrId"; + case 2: return "qsTranslate"; + default: + break; + } + return "qsTr"; } QStringList PropertyEditorContextObject::autoComplete(const QString &text, int pos, bool explicitComplete, bool filter) diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorvalue.cpp b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorvalue.cpp index 323dcbecf2c..00065ec6d59 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorvalue.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorvalue.cpp @@ -243,7 +243,7 @@ bool PropertyEditorValue::isTranslated() const if (modelNode().metaInfo().propertyTypeName(name()) == "QString" || modelNode().metaInfo().propertyTypeName(name()) == "string") { const QmlDesigner::QmlObjectNode objectNode(modelNode()); if (objectNode.isValid() && objectNode.hasBindingProperty(name())) { - QRegExp rx("qsTr(|Id)\\(\".*\"\\)"); + QRegExp rx("qsTr(|Id|anslate)\\(\".*\"\\)"); //qsTr() if (objectNode.propertyAffectedByCurrentState(name())) { return rx.exactMatch(expression()); @@ -328,6 +328,21 @@ void PropertyEditorValue::removeAliasExport() emit removeAliasExportRequested(nameAsQString()); } +QString PropertyEditorValue::getTranslationContext() const +{ + if (modelNode().isValid() && modelNode().metaInfo().isValid() && modelNode().metaInfo().hasProperty(name())) { + if (modelNode().metaInfo().propertyTypeName(name()) == "QString" || modelNode().metaInfo().propertyTypeName(name()) == "string") { + const QmlDesigner::QmlObjectNode objectNode(modelNode()); + if (objectNode.isValid() && objectNode.hasBindingProperty(name())) { + QRegExp rx("qsTranslate\\(\"(.*)\"\\s*,\\s*\".*\"\\s*\\)"); + if (rx.exactMatch(expression())) + return rx.cap(1); + } + } + } + return ""; +} + void PropertyEditorValue::registerDeclarativeTypes() { qmlRegisterType("HelperWidgets",2,0,"PropertyEditorValue"); diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorvalue.h b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorvalue.h index 556b7012d35..6d3980fab3b 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorvalue.h +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorvalue.h @@ -128,6 +128,8 @@ public: Q_INVOKABLE bool isAttachedProperty() const; Q_INVOKABLE void removeAliasExport(); + Q_INVOKABLE QString getTranslationContext() const; + public slots: void resetValue(); void setEnumeration(const QString &scope, const QString &name); diff --git a/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp b/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp index 72bfe1a78a5..d079c510721 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp @@ -466,11 +466,20 @@ QVariant QmlObjectNode::instanceValue(const ModelNode &modelNode, const Property QString QmlObjectNode::generateTranslatableText(const QString &text) { #ifndef QMLDESIGNER_TEST + if (QmlDesignerPlugin::instance()->settings().value( - DesignerSettingsKey::USE_QSTR_FUNCTION).toBool()) - return QString(QStringLiteral("qsTr(\"%1\")")).arg(text); - else - return QString(QStringLiteral("qsTrId(\"%1\")")).arg(text); + DesignerSettingsKey::TYPE_OF_QSTR_FUNCTION).toInt()) + + switch (QmlDesignerPlugin::instance()->settings().value( + DesignerSettingsKey::TYPE_OF_QSTR_FUNCTION).toInt()) { + case 0: return QString(QStringLiteral("qsTr(\"%1\")")).arg(text); + case 1: return QString(QStringLiteral("qsTrId(\"%1\")")).arg(text); + case 2: return QString(QStringLiteral("qsTranslate(\"\"\"%1\")")).arg(text); + default: + break; + + } + return QString(QStringLiteral("qsTr(\"%1\")")).arg(text); #else Q_UNUSED(text); return QString(); diff --git a/src/plugins/qmldesigner/designersettings.cpp b/src/plugins/qmldesigner/designersettings.cpp index 1502405dfbf..54548e09139 100644 --- a/src/plugins/qmldesigner/designersettings.cpp +++ b/src/plugins/qmldesigner/designersettings.cpp @@ -61,7 +61,7 @@ void DesignerSettings::fromSettings(QSettings *settings) restoreValue(settings, DesignerSettingsKey::ENABLE_DEBUGVIEW, false); restoreValue(settings, DesignerSettingsKey::ALWAYS_SAFE_IN_CRUMBLEBAR, false); restoreValue(settings, DesignerSettingsKey::USE_ONLY_FALLBACK_PUPPET, true); - restoreValue(settings, DesignerSettingsKey::USE_QSTR_FUNCTION, true); + restoreValue(settings, DesignerSettingsKey::TYPE_OF_QSTR_FUNCTION, 0); restoreValue(settings, DesignerSettingsKey::PUPPET_FALLBACK_DIRECTORY); restoreValue(settings, DesignerSettingsKey::PUPPET_TOPLEVEL_BUILD_DIRECTORY); restoreValue(settings, DesignerSettingsKey::CONTROLS_STYLE); diff --git a/src/plugins/qmldesigner/designersettings.h b/src/plugins/qmldesigner/designersettings.h index c5ffd5ea48b..37e835a41d3 100644 --- a/src/plugins/qmldesigner/designersettings.h +++ b/src/plugins/qmldesigner/designersettings.h @@ -51,7 +51,7 @@ const char USE_ONLY_FALLBACK_PUPPET[] = "UseOnlyFallbackPuppet"; const char PUPPET_TOPLEVEL_BUILD_DIRECTORY[] = "PuppetToplevelBuildDirectory"; const char PUPPET_FALLBACK_DIRECTORY[] = "PuppetFallbackDirectory"; const char CONTROLS_STYLE[] = "ControlsStyle"; -const char USE_QSTR_FUNCTION[] = "UseQsTrFunction"; +const char TYPE_OF_QSTR_FUNCTION[] = "TypeOfQsTrFunction"; const char SHOW_PROPERTYEDITOR_WARNINGS[] = "ShowPropertyEditorWarnings"; const char ENABLE_MODEL_EXCEPTION_OUTPUT[] = "WarnException"; const char PUPPET_KILL_TIMEOUT[] = "PuppetKillTimeout"; diff --git a/src/plugins/qmldesigner/settingspage.cpp b/src/plugins/qmldesigner/settingspage.cpp index bfe5884806c..5be651cecc5 100644 --- a/src/plugins/qmldesigner/settingspage.cpp +++ b/src/plugins/qmldesigner/settingspage.cpp @@ -106,8 +106,19 @@ DesignerSettings SettingsPageWidget::settings() const m_ui.designerEnableDebuggerCheckBox->isChecked()); settings.insert(DesignerSettingsKey::USE_ONLY_FALLBACK_PUPPET, m_ui.useDefaultPuppetRadioButton->isChecked()); - settings.insert(DesignerSettingsKey::USE_QSTR_FUNCTION, - m_ui.useQsTrFunctionRadioButton->isChecked()); + + int typeOfQsTrFunction; + + if (m_ui.useQsTrFunctionRadioButton->isChecked()) + typeOfQsTrFunction = 0; + else if (m_ui.useQsTrIdFunctionRadioButton->isChecked()) + typeOfQsTrFunction = 1; + else if (m_ui.useQsTranslateFunctionRadioButton->isChecked()) + typeOfQsTrFunction = 2; + else + typeOfQsTrFunction = 0; + + settings.insert(DesignerSettingsKey::TYPE_OF_QSTR_FUNCTION, typeOfQsTrFunction); settings.insert(DesignerSettingsKey::CONTROLS_STYLE, m_ui.styleLineEdit->text()); settings.insert(DesignerSettingsKey::FORWARD_PUPPET_OUTPUT, m_ui.forwardPuppetOutputComboBox->currentText()); @@ -160,9 +171,11 @@ void SettingsPageWidget::setSettings(const DesignerSettings &settings) m_ui.useQtRelatedPuppetRadioButton->setChecked(!settings.value( DesignerSettingsKey::USE_ONLY_FALLBACK_PUPPET).toBool()); m_ui.useQsTrFunctionRadioButton->setChecked(settings.value( - DesignerSettingsKey::USE_QSTR_FUNCTION).toBool()); - m_ui.useQsTrIdFunctionRadioButton->setChecked(!settings.value( - DesignerSettingsKey::USE_QSTR_FUNCTION).toBool()); + DesignerSettingsKey::TYPE_OF_QSTR_FUNCTION).toInt() == 0); + m_ui.useQsTrIdFunctionRadioButton->setChecked(settings.value( + DesignerSettingsKey::TYPE_OF_QSTR_FUNCTION).toInt() == 1); + m_ui.useQsTranslateFunctionRadioButton->setChecked(settings.value( + DesignerSettingsKey::TYPE_OF_QSTR_FUNCTION).toInt() == 2); m_ui.styleLineEdit->setText(settings.value( DesignerSettingsKey::CONTROLS_STYLE).toString()); diff --git a/src/plugins/qmldesigner/settingspage.ui b/src/plugins/qmldesigner/settingspage.ui index 5f79762b1e8..e9e8b898e8c 100644 --- a/src/plugins/qmldesigner/settingspage.ui +++ b/src/plugins/qmldesigner/settingspage.ui @@ -349,6 +349,13 @@ + + + + qsTranslate() + + +