From 20ce1bdb3dd7b1b8868145bf8aec6a9bb788903b Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Thu, 1 Aug 2013 14:41:08 +0200 Subject: [PATCH] update all data of existing messages in extend() 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 Reviewed-by: Oswald Buddenhagen --- src/linguist/lupdate/cpp.cpp | 2 +- src/linguist/lupdate/java.cpp | 12 ++++----- src/linguist/lupdate/qdeclarative.cpp | 12 +++++---- src/linguist/lupdate/ui.cpp | 2 +- src/linguist/shared/translator.cpp | 31 +++++++++++++++++++++- src/linguist/shared/translator.h | 2 +- .../testdata/good/multiple_locations/main.cpp | 17 ++++++++++++ .../good/multiple_locations/project.ts.result | 23 ++++++++++++++++ 8 files changed, 86 insertions(+), 15 deletions(-) diff --git a/src/linguist/lupdate/cpp.cpp b/src/linguist/lupdate/cpp.cpp index eb19c0d..2ed6be5 100644 --- a/src/linguist/lupdate/cpp.cpp +++ b/src/linguist/lupdate/cpp.cpp @@ -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 diff --git a/src/linguist/lupdate/java.cpp b/src/linguist/lupdate/java.cpp index 210b854..48055c9 100644 --- a/src/linguist/lupdate/java.cpp +++ b/src/linguist/lupdate/java.cpp @@ -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; } diff --git a/src/linguist/lupdate/qdeclarative.cpp b/src/linguist/lupdate/qdeclarative.cpp index 41ef698..9a5e70c 100644 --- a/src/linguist/lupdate/qdeclarative.cpp +++ b/src/linguist/lupdate/qdeclarative.cpp @@ -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()); diff --git a/src/linguist/lupdate/ui.cpp b/src/linguist/lupdate/ui.cpp index 537f0a9..b796ca2 100644 --- a/src/linguist/lupdate/ui.cpp +++ b/src/linguist/lupdate/ui.cpp @@ -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) { diff --git a/src/linguist/shared/translator.cpp b/src/linguist/shared/translator.cpp index e3295e8..43d37f4 100644 --- a/src/linguist/shared/translator.cpp +++ b/src/linguist/shared/translator.cpp @@ -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(); diff --git a/src/linguist/shared/translator.h b/src/linguist/shared/translator.h index e0820b0..3d521ac 100644 --- a/src/linguist/shared/translator.h +++ b/src/linguist/shared/translator.h @@ -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); diff --git a/tests/auto/linguist/lupdate/testdata/good/multiple_locations/main.cpp b/tests/auto/linguist/lupdate/testdata/good/multiple_locations/main.cpp index d06e8b2..fa01f9d 100644 --- a/tests/auto/linguist/lupdate/testdata/good/multiple_locations/main.cpp +++ b/tests/auto/linguist/lupdate/testdata/good/multiple_locations/main.cpp @@ -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"); diff --git a/tests/auto/linguist/lupdate/testdata/good/multiple_locations/project.ts.result b/tests/auto/linguist/lupdate/testdata/good/multiple_locations/project.ts.result index a7ae155..b0a1717 100644 --- a/tests/auto/linguist/lupdate/testdata/good/multiple_locations/project.ts.result +++ b/tests/auto/linguist/lupdate/testdata/good/multiple_locations/project.ts.result @@ -2,6 +2,29 @@ + + + + + this is the source text + commented +---------- +even more commented + + so-meta + + + + QObject + + + another message + here with a lot of noise in the comment so it is long enough + + so-meta + + + context -- 2.7.4