update all data of existing messages in extend()
authorOswald Buddenhagen <oswald.buddenhagen@digia.com>
Thu, 1 Aug 2013 12:41:08 +0000 (14:41 +0200)
committerThe Qt Project <gerrit-noreply@qt-project.org>
Tue, 6 Aug 2013 07:30:39 +0000 (09:30 +0200)
when the message identifier (msgid or context/source/disambiguation)
appears in multiple places, the remaining meta data may be inconsistent
between the occurrences. we need to handle partial data on one hand, and
contradicting data on the other.

Task-number: QTBUG-29131
Task-number: QTBUG-32725
Change-Id: I1ed08e42e266b0b5f014400c137abbcec9ffb93d
Reviewed-by: hjk <hjk121@nokiamail.com>
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@digia.com>
src/linguist/lupdate/cpp.cpp
src/linguist/lupdate/java.cpp
src/linguist/lupdate/qdeclarative.cpp
src/linguist/lupdate/ui.cpp
src/linguist/shared/translator.cpp
src/linguist/shared/translator.h
tests/auto/linguist/lupdate/testdata/good/multiple_locations/main.cpp
tests/auto/linguist/lupdate/testdata/good/multiple_locations/project.ts.result

index eb19c0d..2ed6be5 100644 (file)
@@ -2301,7 +2301,7 @@ void loadCPP(Translator &translator, const QStringList &filenames, ConversionDat
         if (!CppFiles::isBlacklisted(filename))
             if (const Translator *tor = CppFiles::getTranslator(filename))
                 foreach (const TranslatorMessage &msg, tor->messages())
-                    translator.extend(msg);
+                    translator.extend(msg, cd);
 }
 
 QT_END_NAMESPACE
index 210b854..48055c9 100644 (file)
@@ -456,17 +456,17 @@ static const QString context()
 
 static void recordMessage(
     Translator *tor, const QString &context, const QString &text, const QString &comment,
-    const QString &extracomment, bool plural)
+    const QString &extracomment, bool plural, ConversionData &cd)
 {
     TranslatorMessage msg(
         context, text, comment, QString(),
         yyFileName, yyLineNo, QStringList(),
         TranslatorMessage::Unfinished, plural);
     msg.setExtraComment(extracomment.simplified());
-    tor->extend(msg);
+    tor->extend(msg, cd);
 }
 
-static void parse( Translator *tor )
+static void parse(Translator *tor, ConversionData &cd)
 {
     QString text;
     QString com;
@@ -507,7 +507,7 @@ static void parse( Translator *tor )
                     }
                 }
                 if (!text.isEmpty())
-                    recordMessage(tor, context(), text, com, extracomment, plural);
+                    recordMessage(tor, context(), text, com, extracomment, plural, cd);
             }
             break;
         case Tok_translate:
@@ -536,7 +536,7 @@ static void parse( Translator *tor )
                         }
                     }
                     if (!text.isEmpty())
-                        recordMessage(tor, contextOverride, text, com, extracomment, plural);
+                        recordMessage(tor, contextOverride, text, com, extracomment, plural, cd);
                 }
             }
             break;
@@ -630,7 +630,7 @@ bool loadJava(Translator &translator, const QString &filename, ConversionData &c
     yyCurLineNo = 1;
     yyParenLineNo = 1;
 
-    parse(&translator);
+    parse(&translator, cd);
     return true;
 }
 
index 41ef698..9a5e70c 100644 (file)
@@ -76,8 +76,9 @@ static QString MagicComment(QLatin1String("TRANSLATOR"));
 class FindTrCalls: protected AST::Visitor
 {
 public:
-    FindTrCalls(Engine *engine)
+    FindTrCalls(Engine *engine, ConversionData &cd)
         : engine(engine)
+        , m_cd(cd)
     {
     }
 
@@ -140,7 +141,7 @@ protected:
                 msg.setExtraComment(extracomment.simplified());
                 msg.setId(msgid);
                 msg.setExtras(extra);
-                m_translator->extend(msg);
+                m_translator->extend(msg, m_cd);
                 consumeComment();
             } else if (name == QLatin1String("qsTranslate") ||
                        name == QLatin1String("QT_TRANSLATE_NOOP")) {
@@ -184,7 +185,7 @@ protected:
                 msg.setExtraComment(extracomment.simplified());
                 msg.setId(msgid);
                 msg.setExtras(extra);
-                m_translator->extend(msg);
+                m_translator->extend(msg, m_cd);
                 consumeComment();
             } else if (name == QLatin1String("qsTrId") ||
                        name == QLatin1String("QT_TRID_NOOP")) {
@@ -213,7 +214,7 @@ protected:
                 msg.setExtraComment(extracomment.simplified());
                 msg.setId(id);
                 msg.setExtras(extra);
-                m_translator->extend(msg);
+                m_translator->extend(msg, m_cd);
                 consumeComment();
             }
         }
@@ -248,6 +249,7 @@ private:
 
     Engine *engine;
     Translator *m_translator;
+    ConversionData &m_cd;
     QString m_fileName;
     QString m_component;
 
@@ -496,7 +498,7 @@ static bool load(Translator &translator, const QString &filename, ConversionData
     driver.setLexer(&lexer);
 
     if (qmlMode ? parser.parse() : parser.parseProgram()) {
-        FindTrCalls trCalls(&driver);
+        FindTrCalls trCalls(&driver, cd);
 
         //find all tr calls in the code
         trCalls(&translator, filename, parser.rootNode());
index 537f0a9..b796ca2 100644 (file)
@@ -160,7 +160,7 @@ void UiReader::flush()
            m_comment, QString(), m_cd.m_sourceFileName,
            m_lineNumber, QStringList());
         msg.setExtraComment(m_extracomment);
-        m_translator.extend(msg);
+        m_translator.extend(msg, m_cd);
     }
     m_source.clear();
     if (!m_insideStringList) {
index e3295e8..43d37f4 100644 (file)
@@ -137,13 +137,42 @@ void Translator::replaceSorted(const TranslatorMessage &msg)
     }
 }
 
-void Translator::extend(const TranslatorMessage &msg)
+static QString elidedId(const QString &id, int len)
+{
+    return id.length() <= len ? id : id.left(len - 5) + QLatin1String("[...]");
+}
+
+static QString makeMsgId(const TranslatorMessage &msg)
+{
+    QString id = msg.context() + QLatin1String("//") + elidedId(msg.sourceText(), 100);
+    if (!msg.comment().isEmpty())
+        id += QLatin1String("//") + elidedId(msg.comment(), 30);
+    return id;
+}
+
+void Translator::extend(const TranslatorMessage &msg, ConversionData &cd)
 {
     int index = find(msg);
     if (index == -1) {
         append(msg);
     } else {
         TranslatorMessage &emsg = m_messages[index];
+        if (emsg.sourceText().isEmpty()) {
+            emsg.setSourceText(msg.sourceText());
+        } else if (!msg.sourceText().isEmpty() && emsg.sourceText() != msg.sourceText()) {
+            cd.appendError(QString::fromLatin1("Contradicting source strings for message with id '%1'.")
+                           .arg(emsg.id()));
+            return;
+        }
+        if (emsg.extras().isEmpty()) {
+            emsg.setExtras(msg.extras());
+        } else if (!msg.extras().isEmpty() && emsg.extras() != msg.extras()) {
+            cd.appendError(QString::fromLatin1("Contradicting meta data for for %1.")
+                           .arg(!emsg.id().isEmpty()
+                                ? QString::fromLatin1("message with id '%1'").arg(emsg.id())
+                                : QString::fromLatin1("message '%1'").arg(makeMsgId(msg))));
+            return;
+        }
         emsg.addReferenceUniq(msg.fileName(), msg.lineNumber());
         if (!msg.extraComment().isEmpty()) {
             QString cmt = emsg.extraComment();
index e0820b0..3d521ac 100644 (file)
@@ -134,7 +134,7 @@ public:
     int find(const QString &context) const;
 
     void replaceSorted(const TranslatorMessage &msg);
-    void extend(const TranslatorMessage &msg); // Only for single-location messages
+    void extend(const TranslatorMessage &msg, ConversionData &cd); // Only for single-location messages
     void append(const TranslatorMessage &msg);
     void appendSorted(const TranslatorMessage &msg);
 
index d06e8b2..fa01f9d 100644 (file)
@@ -47,7 +47,24 @@ QT_TRANSLATE_NOOP("context", "just a message");
 
 
 
+//: commented
+qtTrId("lollipop");
 
+//% "this is the source text"
+//~ meta so-meta
+//: even more commented
+qtTrId("lollipop");
 
+//% "this is contradicting source text"
+qtTrId("lollipop");
 
+//~ meta too-much-meta
+qtTrId("lollipop");
 
+
+
+//~ meta so-meta
+QObject::tr("another message", "here with a lot of noise in the comment so it is long enough");
+
+//~ meta too-much-meta
+QObject::tr("another message", "here with a lot of noise in the comment so it is long enough");
index a7ae155..b0a1717 100644 (file)
@@ -2,6 +2,29 @@
 <!DOCTYPE TS>
 <TS version="2.0">
 <context>
+    <name></name>
+    <message id="lollipop">
+        <location filename="main.cpp" line="51"/>
+        <location filename="main.cpp" line="56"/>
+        <source>this is the source text</source>
+        <extracomment>commented
+----------
+even more commented</extracomment>
+        <translation type="unfinished"></translation>
+        <extra-meta>so-meta</extra-meta>
+    </message>
+</context>
+<context>
+    <name>QObject</name>
+    <message>
+        <location filename="main.cpp" line="67"/>
+        <source>another message</source>
+        <comment>here with a lot of noise in the comment so it is long enough</comment>
+        <translation type="unfinished"></translation>
+        <extra-meta>so-meta</extra-meta>
+    </message>
+</context>
+<context>
     <name>context</name>
     <message>
         <location filename="finddialog.cpp" line="42"/>