summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTobias Koenig <tobias.koenig@kdab.com>2015-04-13 09:16:16 +0200
committerTobias Koenig <tokoe@codereview.qt-project.org>2015-04-14 06:15:25 +0000
commitcebd22acc7e3125fa1f033f844d2fb1ea99f1f6c (patch)
treeeff7c33e2ab44734b7a2faac82e327c2d922403d
parentad31b989bff4ef0c616b1beccd4b30933683dd98 (diff)
linguist: Fix loading of multiple identical source texts
Show all translations from all .ts files in case they provide the same source text and comment multiple times with different IDs. Previously, Qt Linguist showed the translations only for the first occurrence, because the merging code in MultiDataModel::append() compared only source text and comment, but not the message ID in case it was there. Task-number: QTBUG-45520 Change-Id: I3b527f0d9ce67a88e1c235f4b67d106cc0a49dc2 Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@theqtcompany.com>
-rw-r--r--src/linguist/linguist/messagemodel.cpp22
-rw-r--r--src/linguist/linguist/messagemodel.h4
2 files changed, 24 insertions, 2 deletions
diff --git a/src/linguist/linguist/messagemodel.cpp b/src/linguist/linguist/messagemodel.cpp
index c701211af..69729fd09 100644
--- a/src/linguist/linguist/messagemodel.cpp
+++ b/src/linguist/linguist/messagemodel.cpp
@@ -502,7 +502,8 @@ MessageItem *DataModelIterator::current() const
*****************************************************************************/
MultiMessageItem::MultiMessageItem(const MessageItem *m)
- : m_text(m->text()),
+ : m_id(m->id()),
+ m_text(m->text()),
m_pluralText(m->pluralText()),
m_comment(m->comment()),
m_nonnullCount(0),
@@ -618,6 +619,16 @@ int MultiContextItem::findMessage(const QString &sourcetext, const QString &comm
return -1;
}
+int MultiContextItem::findMessageById(const QString &id) const
+{
+ for (int i = 0, cnt = messageCount(); i < cnt; ++i) {
+ MultiMessageItem *m = multiMessageItem(i);
+ if (m->id() == id)
+ return i;
+ }
+ return -1;
+}
+
/******************************************************************************
*
* MultiDataModel
@@ -721,7 +732,14 @@ void MultiDataModel::append(DataModel *dm, bool readWrite)
QList<MessageItem *> appendItems;
for (int j = 0; j < c->messageCount(); ++j) {
MessageItem *m = c->messageItem(j);
- int msgIdx = mc->findMessage(m->text(), m->comment());
+
+ int msgIdx = -1;
+ if (!m->id().isEmpty()) // id based translation
+ msgIdx = mc->findMessageById(m->id());
+
+ if (msgIdx == -1)
+ msgIdx = mc->findMessage(m->text(), m->comment());
+
if (msgIdx >= 0)
mc->putMessageItem(msgIdx, m);
else
diff --git a/src/linguist/linguist/messagemodel.h b/src/linguist/linguist/messagemodel.h
index 0bdcbc6e8..5e3a51a82 100644
--- a/src/linguist/linguist/messagemodel.h
+++ b/src/linguist/linguist/messagemodel.h
@@ -61,6 +61,7 @@ public:
void setTranslation(const QString &translation)
{ m_message.setTranslation(translation); }
+ QString id() const { return m_message.id(); }
QString context() const { return m_message.context(); }
QString text() const { return m_message.sourceText(); }
QString pluralText() const { return m_message.extra(QLatin1String("po-msgid_plural")); }
@@ -263,6 +264,7 @@ struct MultiMessageItem
{
public:
MultiMessageItem(const MessageItem *m);
+ QString id() const { return m_id; }
QString text() const { return m_text; }
QString pluralText() const { return m_pluralText; }
QString comment() const { return m_comment; }
@@ -286,6 +288,7 @@ private:
void incrementUnfinishedCount() { ++m_unfinishedCount; }
void decrementUnfinishedCount() { --m_unfinishedCount; }
+ QString m_id;
QString m_text;
QString m_pluralText;
QString m_comment;
@@ -307,6 +310,7 @@ public:
MessageItem *messageItem(int model, int msgIdx) const { return m_messageLists[model][msgIdx]; }
int firstNonobsoleteMessageIndex(int msgIdx) const;
int findMessage(const QString &sourcetext, const QString &comment) const;
+ int findMessageById(const QString &id) const;
QString context() const { return m_context; }
QString comment() const { return m_comment; }