From: Tobias Koenig Date: Mon, 13 Apr 2015 07:16:16 +0000 (+0200) Subject: linguist: Fix loading of multiple identical source texts X-Git-Tag: v5.5.90+alpha1~21^2~7 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=cebd22acc7e3125fa1f033f844d2fb1ea99f1f6c;p=platform%2Fupstream%2Fqttools.git 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 --- diff --git a/src/linguist/linguist/messagemodel.cpp b/src/linguist/linguist/messagemodel.cpp index c701211..69729fd 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 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 0bdcbc6..5e3a51a 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; }