summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOswald Buddenhagen <oswald.buddenhagen@digia.com>2013-08-01 14:41:08 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-08-06 09:30:39 +0200
commit20ce1bdb3dd7b1b8868145bf8aec6a9bb788903b (patch)
tree067ea47e0cc53568eafaf3ad1354855cfeda570b
parenta4e8dca0c3665a26ff5e7dffada97aeab86dd1a5 (diff)
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 <hjk121@nokiamail.com> Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@digia.com>
-rw-r--r--src/linguist/lupdate/cpp.cpp2
-rw-r--r--src/linguist/lupdate/java.cpp12
-rw-r--r--src/linguist/lupdate/qdeclarative.cpp12
-rw-r--r--src/linguist/lupdate/ui.cpp2
-rw-r--r--src/linguist/shared/translator.cpp31
-rw-r--r--src/linguist/shared/translator.h2
-rw-r--r--tests/auto/linguist/lupdate/testdata/good/multiple_locations/main.cpp17
-rw-r--r--tests/auto/linguist/lupdate/testdata/good/multiple_locations/project.ts.result23
8 files changed, 86 insertions, 15 deletions
diff --git a/src/linguist/lupdate/cpp.cpp b/src/linguist/lupdate/cpp.cpp
index eb19c0d23..2ed6be54d 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 210b85458..48055c996 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 41ef6980e..9a5e70c05 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 537f0a92b..b796ca2e9 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 e3295e8bf..43d37f4b5 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 e0820b047..3d521ac83 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 d06e8b2ca..fa01f9d16 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 a7ae15520..b0a171757 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 @@
<!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"/>