diff options
author | Tobias Koenig <tobias.koenig@kdab.com> | 2015-04-13 09:16:16 +0200 |
---|---|---|
committer | Tobias Koenig <tokoe@codereview.qt-project.org> | 2015-04-14 06:15:25 +0000 |
commit | cebd22acc7e3125fa1f033f844d2fb1ea99f1f6c (patch) | |
tree | eff7c33e2ab44734b7a2faac82e327c2d922403d | |
parent | ad31b989bff4ef0c616b1beccd4b30933683dd98 (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.cpp | 22 | ||||
-rw-r--r-- | src/linguist/linguist/messagemodel.h | 4 |
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; } |