Fix qsTr() in .js context
authorJ-P Nurmi <jpnurmi@digia.com>
Mon, 2 Dec 2013 16:25:23 +0000 (17:25 +0100)
committerThe Qt Project <gerrit-noreply@qt-project.org>
Tue, 3 Dec 2013 23:37:29 +0000 (00:37 +0100)
Don't assume a four characters long file name suffix (.qml)

Task-number: QTBUG-32850
Change-Id: I522c06b71bf1b38f32f2947a6c06017f83eb50be
Reviewed-by: Michael Brasser <michael.brasser@live.com>
Reviewed-by: Alan Alpert <aalpert@blackberry.com>
src/qml/qml/v8/qqmlbuiltinfunctions.cpp
tests/auto/qml/qqmltranslation/data/jstranslation.qml [new file with mode: 0644]
tests/auto/qml/qqmltranslation/data/translation.js [new file with mode: 0644]
tests/auto/qml/qqmltranslation/tst_qqmltranslation.cpp

index c80a742..bbb07cf 100644 (file)
@@ -1726,7 +1726,9 @@ ReturnedValue GlobalExtensions::method_qsTr(CallContext *ctx)
 
     QString path = ctxt->url.toString();
     int lastSlash = path.lastIndexOf(QLatin1Char('/'));
-    QString context = (lastSlash > -1) ? path.mid(lastSlash + 1, path.length()-lastSlash-5) : QString();
+    int lastDot = path.lastIndexOf(QLatin1Char('.'));
+    int length = lastDot - (lastSlash + 1);
+    QString context = (lastSlash > -1) ? path.mid(lastSlash + 1, (length > -1) ? length : -1) : QString();
 
     QString text = ctx->callData->args[0].toQStringNoThrow();
     QString comment;
diff --git a/tests/auto/qml/qqmltranslation/data/jstranslation.qml b/tests/auto/qml/qqmltranslation/data/jstranslation.qml
new file mode 100644 (file)
index 0000000..7adde01
--- /dev/null
@@ -0,0 +1,20 @@
+import QtQuick 2.0
+import "translation.js" as Js
+
+QtObject {
+    property string basic: Js.basic()
+    property string basic2: Js.basic2()
+    property string basic3: Js.basic3()
+
+    property string disambiguation: Js.disambiguation()
+    property string disambiguation2: Js.disambiguation2()
+    property string disambiguation3: Js.disambiguation3()
+
+    property string noop: Js.noop()
+    property string noop2: Js.noop2()
+
+    property string singular: Js.singular()
+    property string singular2: Js.singular2()
+    property string plural: Js.plural()
+    property string plural2: Js.plural2()
+}
diff --git a/tests/auto/qml/qqmltranslation/data/translation.js b/tests/auto/qml/qqmltranslation/data/translation.js
new file mode 100644 (file)
index 0000000..c1e25dc
--- /dev/null
@@ -0,0 +1,98 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+function basic() {
+    return qsTr("hello")
+}
+
+function basic2() {
+    return qsTranslate("CustomContext", "goodbye")
+}
+
+function basic3() {
+    if (1)
+        return qsTr("hello")
+    return "";
+}
+
+function disambiguation() {
+    return qsTr("hi", "informal 'hello'")
+}
+
+function disambiguation2() {
+    return qsTranslate("CustomContext", "see ya", "informal 'goodbye'")
+}
+
+function disambiguation3() {
+    if (1)
+        return qsTr("hi", "informal 'hello'")
+    return "";
+}
+
+function noop() {
+    var _noop = QT_TR_NOOP("hello")
+    return qsTr(_noop)
+}
+
+function noop2() {
+    var _noop2 = QT_TRANSLATE_NOOP("CustomContext", "goodbye")
+    return qsTranslate("CustomContext", _noop2)
+}
+
+function singular() {
+    return qsTr("%n duck(s)", "", 1)
+}
+
+function singular2() {
+    if (1)
+        return qsTr("%n duck(s)", "", 1)
+    return "";
+}
+
+function plural() {
+    return qsTr("%n duck(s)", "", 2)
+}
+
+function plural2() {
+    if (1)
+        return qsTr("%n duck(s)", "", 2)
+    return "";
+}
index 0e22d3c..01e1cf8 100644 (file)
@@ -52,19 +52,32 @@ public:
     tst_qqmltranslation() {}
 
 private slots:
+    void translation_data();
     void translation();
     void idTranslation();
-    void translationInQrc();
 };
 
+void tst_qqmltranslation::translation_data()
+{
+    QTest::addColumn<QString>("translation");
+    QTest::addColumn<QUrl>("testFile");
+
+    QTest::newRow("qml") << QStringLiteral("qml_fr") << testFileUrl("translation.qml");
+    QTest::newRow("qrc") << QStringLiteral(":/qml_fr.qm") << QUrl("qrc:/translation.qml");
+    QTest::newRow("js") << QStringLiteral("qml_fr") << testFileUrl("jstranslation.qml");
+}
+
 void tst_qqmltranslation::translation()
 {
+    QFETCH(QString, translation);
+    QFETCH(QUrl, testFile);
+
     QTranslator translator;
-    translator.load(QLatin1String("qml_fr"), dataDirectory());
+    translator.load(translation, dataDirectory());
     QCoreApplication::installTranslator(&translator);
 
     QQmlEngine engine;
-    QQmlComponent component(&engine, testFileUrl("translation.qml"));
+    QQmlComponent component(&engine, testFile);
     QObject *object = component.create();
     QVERIFY(object != 0);
 
@@ -104,34 +117,6 @@ void tst_qqmltranslation::idTranslation()
     delete object;
 }
 
-void tst_qqmltranslation::translationInQrc()
-{
-    QTranslator translator;
-    translator.load(":/qml_fr.qm");
-    QCoreApplication::installTranslator(&translator);
-
-    QQmlEngine engine;
-    QQmlComponent component(&engine, QUrl("qrc:/translation.qml"));
-    QObject *object = component.create();
-    QVERIFY(object != 0);
-
-    QCOMPARE(object->property("basic").toString(), QLatin1String("bonjour"));
-    QCOMPARE(object->property("basic2").toString(), QLatin1String("au revoir"));
-    QCOMPARE(object->property("basic3").toString(), QLatin1String("bonjour"));
-    QCOMPARE(object->property("disambiguation").toString(), QLatin1String("salut"));
-    QCOMPARE(object->property("disambiguation2").toString(), QString::fromUtf8("\xc3\xa0 plus tard"));
-    QCOMPARE(object->property("disambiguation3").toString(), QLatin1String("salut"));
-    QCOMPARE(object->property("noop").toString(), QLatin1String("bonjour"));
-    QCOMPARE(object->property("noop2").toString(), QLatin1String("au revoir"));
-    QCOMPARE(object->property("singular").toString(), QLatin1String("1 canard"));
-    QCOMPARE(object->property("singular2").toString(), QLatin1String("1 canard"));
-    QCOMPARE(object->property("plural").toString(), QLatin1String("2 canards"));
-    QCOMPARE(object->property("plural2").toString(), QLatin1String("2 canards"));
-
-    QCoreApplication::removeTranslator(&translator);
-    delete object;
-}
-
 QTEST_MAIN(tst_qqmltranslation)
 
 #include "tst_qqmltranslation.moc"