linguist: Fix loading of multiple identical source texts
authorTobias Koenig <tobias.koenig@kdab.com>
Mon, 13 Apr 2015 07:16:16 +0000 (09:16 +0200)
committerTobias Koenig <tokoe@codereview.qt-project.org>
Tue, 14 Apr 2015 06:15:25 +0000 (06:15 +0000)
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>
src/linguist/linguist/messagemodel.cpp
src/linguist/linguist/messagemodel.h

index c701211..69729fd 100644 (file)
@@ -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
index 0bdcbc6..5e3a51a 100644 (file)
@@ -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; }