introduce new message type "vanished"
authorOswald Buddenhagen <oswald.buddenhagen@digia.com>
Mon, 5 Aug 2013 14:58:39 +0000 (16:58 +0200)
committerThe Qt Project <gerrit-noreply@qt-project.org>
Wed, 7 Aug 2013 16:05:24 +0000 (18:05 +0200)
this state is equivalent to "previously finished, but now obsolete", or
in gettext terms "not fuzzy and obsolete".

this bumps the ts format version to 2.1.

Task-number: QTBUG-12948
Change-Id: I6c89bbfb9b16053b4e1219ec7611cb7a34189d95
Reviewed-by: hjk <hjk121@nokiamail.com>
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@digia.com>
73 files changed:
src/linguist/linguist/mainwindow.cpp
src/linguist/linguist/messageeditor.cpp
src/linguist/linguist/messagemodel.cpp
src/linguist/linguist/messagemodel.h
src/linguist/lupdate/merge.cpp
src/linguist/shared/po.cpp
src/linguist/shared/qm.cpp
src/linguist/shared/translator.cpp
src/linguist/shared/translatormessage.h
src/linguist/shared/ts.cpp
src/linguist/shared/ts.dtd
src/linguist/shared/xliff.cpp
tests/auto/linguist/lconvert/data/codec-utf8.ts
tests/auto/linguist/lconvert/data/endless-po-loop.ts
tests/auto/linguist/lconvert/data/msgid.ts
tests/auto/linguist/lconvert/data/plurals-cn.ts
tests/auto/linguist/lconvert/data/plurals-de.ts
tests/auto/linguist/lconvert/data/relative.ts
tests/auto/linguist/lconvert/data/test-kde-fuzzy.po
tests/auto/linguist/lconvert/data/test20.ts
tests/auto/linguist/lconvert/data/variants.ts
tests/auto/linguist/lconvert/tst_lconvert.cpp
tests/auto/linguist/lupdate/testdata/good/backslashes/ts/project.ts.result
tests/auto/linguist/lupdate/testdata/good/cmdline_deeppath/project.ts.result
tests/auto/linguist/lupdate/testdata/good/cmdline_order/project.ts.result
tests/auto/linguist/lupdate/testdata/good/cmdline_recurse/project.ts.result
tests/auto/linguist/lupdate/testdata/good/codecforsrc/project.ts.result
tests/auto/linguist/lupdate/testdata/good/from_subdir/project.ts.result
tests/auto/linguist/lupdate/testdata/good/heuristics/project.ts.result
tests/auto/linguist/lupdate/testdata/good/lacksqobject/project.ts.result
tests/auto/linguist/lupdate/testdata/good/merge_ordering/project.ts.result
tests/auto/linguist/lupdate/testdata/good/merge_versions/project.ts.result
tests/auto/linguist/lupdate/testdata/good/merge_whitespace/project.ts.result
tests/auto/linguist/lupdate/testdata/good/mergecpp/project.ts.before
tests/auto/linguist/lupdate/testdata/good/mergecpp/project.ts.result
tests/auto/linguist/lupdate/testdata/good/mergecpp_noobsolete/project.ts.result
tests/auto/linguist/lupdate/testdata/good/mergecpp_obsolete/project.ts.before
tests/auto/linguist/lupdate/testdata/good/mergecpp_obsolete/project.ts.result
tests/auto/linguist/lupdate/testdata/good/mergeui/project.ts.result
tests/auto/linguist/lupdate/testdata/good/mergeui_obsolete/project.ts.result
tests/auto/linguist/lupdate/testdata/good/multiple_locations/project.ts.result
tests/auto/linguist/lupdate/testdata/good/namespaces/project.ts.result
tests/auto/linguist/lupdate/testdata/good/parse_special_chars/project.ts.result
tests/auto/linguist/lupdate/testdata/good/parsecontexts/project.ts.result
tests/auto/linguist/lupdate/testdata/good/parsecpp/project.ts.result
tests/auto/linguist/lupdate/testdata/good/parsecpp2/project.ts.result
tests/auto/linguist/lupdate/testdata/good/parsejava/project.ts.result
tests/auto/linguist/lupdate/testdata/good/parsejs/project.ts.result
tests/auto/linguist/lupdate/testdata/good/parsejs2/project.ts.result
tests/auto/linguist/lupdate/testdata/good/parsejs3/project.ts.result
tests/auto/linguist/lupdate/testdata/good/parsejs4/project.ts.result
tests/auto/linguist/lupdate/testdata/good/parsejscontexts/project.ts.result
tests/auto/linguist/lupdate/testdata/good/parseqml/project.ts.result
tests/auto/linguist/lupdate/testdata/good/parseqml2/project.ts.result
tests/auto/linguist/lupdate/testdata/good/parseui/project.ts.result
tests/auto/linguist/lupdate/testdata/good/prefix/project.ts.result
tests/auto/linguist/lupdate/testdata/good/preprocess/project.ts.result
tests/auto/linguist/lupdate/testdata/good/proparsing/project.ts.result
tests/auto/linguist/lupdate/testdata/good/proparsing2/project.ts.result
tests/auto/linguist/lupdate/testdata/good/proparsingpaths/project.ts.result
tests/auto/linguist/lupdate/testdata/good/proparsingpri/project.ts.result
tests/auto/linguist/lupdate/testdata/good/proparsingsubdirs/project.ts.result
tests/auto/linguist/lupdate/testdata/good/proparsingsubs/project.ts.result
tests/auto/linguist/lupdate/testdata/good/recurse_full/project.ts.result
tests/auto/linguist/lupdate/testdata/good/recurse_full/project_sub.ts.result
tests/auto/linguist/lupdate/testdata/good/recurse_full_ts/project.ts.result
tests/auto/linguist/lupdate/testdata/good/recurse_full_ts_join/project.ts.result
tests/auto/linguist/lupdate/testdata/good/recurse_part/project_sub.ts.result
tests/auto/linguist/lupdate/testdata/good/recurse_part_ts/project.ts.result
tests/auto/linguist/lupdate/testdata/good/reloutput/translations/project.ts.result
tests/auto/linguist/lupdate/testdata/good/respfile/project.ts.result
tests/auto/linguist/lupdate/testdata/good/textsimilarity/project.ts.result
tests/auto/linguist/lupdate/testdata/good/tr_function_alias/project.ts.result

index a2aac7e..def4586 100644 (file)
@@ -936,6 +936,7 @@ void MainWindow::print()
                             type = m->danger() ? tr("unresolved") : QLatin1String("unfinished");
                             break;
                         case TranslatorMessage::Obsolete:
+                        case TranslatorMessage::Vanished:
                             type = tr("obsolete");
                             break;
                         }
@@ -1620,7 +1621,8 @@ void MainWindow::toggleFinished(const QModelIndex &index)
     MultiDataIndex dataIndex = m_messageModel->dataIndex(item);
     MessageItem *m = m_dataModel->messageItem(dataIndex);
 
-    if (!m || m->message().type() == TranslatorMessage::Obsolete)
+    if (!m || m->message().type() == TranslatorMessage::Obsolete
+           || m->message().type() == TranslatorMessage::Vanished)
         return;
 
     m_dataModel->setFinished(dataIndex, !m->isFinished());
index 2dae9bb..58eff7e 100644 (file)
@@ -660,7 +660,8 @@ void MessageEditor::showMessage(const MultiDataIndex &index)
         }
 
         setEditingEnabled(j, m_dataModel->isModelWritable(j)
-                             && item->message().type() != TranslatorMessage::Obsolete);
+                             && item->message().type() != TranslatorMessage::Obsolete
+                             && item->message().type() != TranslatorMessage::Vanished);
 
         // Translation label
         ed.pluralEditMode = item->translations().count() > 1;
index bf45ea8..ae346ff 100644 (file)
@@ -266,7 +266,7 @@ bool DataModel::load(const QString &fileName, bool *langGuessed, QWidget *parent
             MessageItem tmp(msg);
             if (msg.type() == TranslatorMessage::Finished)
                 c->incrementFinishedCount();
-            if (msg.type() != TranslatorMessage::Obsolete) {
+            if (msg.type() == TranslatorMessage::Unfinished) {
                 doCharCounting(tmp.text(), m_srcWords, m_srcChars, m_srcCharsSpc);
                 doCharCounting(tmp.pluralText(), m_srcWords, m_srcChars, m_srcCharsSpc);
                 c->incrementNonobsoleteCount();
index 76dd2db..2acc114 100644 (file)
@@ -87,7 +87,8 @@ public:
     void setType(TranslatorMessage::Type type) { m_message.setType(type); }
 
     bool isFinished() const { return type() == TranslatorMessage::Finished; }
-    bool isObsolete() const { return type() == TranslatorMessage::Obsolete; }
+    bool isObsolete() const
+        { return type() == TranslatorMessage::Obsolete || type() == TranslatorMessage::Vanished; }
     const TranslatorMessage &message() const { return m_message; }
 
     bool compare(const QString &findText, bool matchSubstring,
index 3160f91..4130352 100644 (file)
@@ -356,9 +356,19 @@ Translator merge(
             if (mvi < 0) {
                 if (!(options & HeuristicSimilarText)) {
                   makeObsolete:
-                    newType = TranslatorMessage::Obsolete;
-                    if (m.type() != TranslatorMessage::Obsolete)
+                    switch (m.type()) {
+                    case TranslatorMessage::Finished:
+                        newType = TranslatorMessage::Vanished;
+                        obsoleted++;
+                        break;
+                    case TranslatorMessage::Unfinished:
+                        newType = TranslatorMessage::Obsolete;
                         obsoleted++;
+                        break;
+                    default:
+                        newType = m.type();
+                        break;
+                    }
                     m.clearReferences();
                 } else {
                     mvi = virginTor.find(m.context(), m.comment(), m.allReferences());
@@ -423,9 +433,14 @@ Translator merge(
                         newType = TranslatorMessage::Unfinished;
                         known++;
                         break;
+                    case TranslatorMessage::Vanished:
+                        newType = TranslatorMessage::Finished;
+                        neww++;
+                        break;
                     case TranslatorMessage::Obsolete:
                         newType = TranslatorMessage::Unfinished;
                         neww++;
+                        break;
                     }
                 }
 
@@ -499,7 +514,8 @@ Translator merge(
                  * will offer them as possible translations.
                  */
                 mv.clearReferences();
-                mv.setType(TranslatorMessage::Obsolete);
+                mv.setType(mv.type() == TranslatorMessage::Finished
+                           ? TranslatorMessage::Vanished : TranslatorMessage::Obsolete);
                 if (options & NoLocations)
                     outTor.append(mv);
                 else
index 3cf3a72..cfe10a8 100644 (file)
@@ -415,6 +415,7 @@ bool loadPO(Translator &translator, QIODevice &dev, ConversionData &cd)
     // #, flag...
     // #~ msgctxt, msgid*, msgstr - used for obsoleted messages
     // #| msgctxt, msgid* previous untranslated-string - for fuzzy message
+    // #~| msgctxt, msgid* previous untranslated-string - for fuzzy obsoleted messages
     // msgctx string-context
     // msgid untranslated-string
     // -- For singular:
@@ -587,9 +588,12 @@ bool loadPO(Translator &translator, QIODevice &dev, ConversionData &cd)
                 translations << str;
             }
             msg.setTranslations(translations);
-            if (isObsolete)
+            bool isFuzzy = item.isFuzzy || (!msg.sourceText().isEmpty() && !msg.isTranslated());
+            if (isObsolete && isFuzzy)
                 msg.setType(TranslatorMessage::Obsolete);
-            else if (item.isFuzzy || (!msg.sourceText().isEmpty() && !msg.isTranslated()))
+            else if (isObsolete)
+                msg.setType(TranslatorMessage::Vanished);
+            else if (isFuzzy)
                 msg.setType(TranslatorMessage::Unfinished);
             else
                 msg.setType(TranslatorMessage::Finished);
@@ -668,6 +672,17 @@ bool loadPO(Translator &translator, QIODevice &dev, ConversionData &cd)
                         item.tscomment = slurpEscapedString(lines, l, 11, "#~ ", cd);
                         if (qtContexts)
                             splitContext(&item.tscomment, &item.context);
+                    } else if (line.startsWith("#~| msgid ")) {
+                        item.oldMsgId = slurpEscapedString(lines, l, 10, "#~| ", cd);
+                    } else if (line.startsWith("#~| msgid_plural ")) {
+                        QByteArray extra = slurpEscapedString(lines, l, 17, "#~| ", cd);
+                        if (extra != item.oldMsgId)
+                            item.extra[QLatin1String("po-old_msgid_plural")] =
+                                    codec->toUnicode(extra);
+                    } else if (line.startsWith("#~| msgctxt ")) {
+                        item.oldTscomment = slurpEscapedString(lines, l, 12, "#~| ", cd);
+                        if (qtContexts)
+                            splitContext(&item.oldTscomment, &item.context);
                     } else {
                         cd.appendError(QString(QLatin1String("PO-format parse error in line %1: '%2'"))
                             .arg(l + 1).arg(codec->toUnicode(lines[l])));
@@ -795,7 +810,8 @@ bool savePO(const Translator &translator, QIODevice &dev, ConversionData &)
         bool noWrap = false;
         bool skipFormat = false;
         QStringList flags;
-        if (msg.type() == TranslatorMessage::Unfinished && msg.isTranslated())
+        if ((msg.type() == TranslatorMessage::Unfinished
+             || msg.type() == TranslatorMessage::Obsolete) && msg.isTranslated())
             flags.append(QLatin1String("fuzzy"));
         TranslatorMessage::ExtraData::const_iterator itr =
                 msg.extras().find(QLatin1String("po-flags"));
@@ -826,7 +842,9 @@ bool savePO(const Translator &translator, QIODevice &dev, ConversionData &)
         if (!flags.isEmpty())
             out << "#, " << flags.join(QLatin1String(", ")) << '\n';
 
-        QString prefix = QLatin1String("#| ");
+        bool isObsolete = (msg.type() == TranslatorMessage::Obsolete
+                           || msg.type() == TranslatorMessage::Vanished);
+        QString prefix = QLatin1String(isObsolete ? "#~| " : "#| ");
         if (!msg.oldComment().isEmpty())
             out << poEscapedString(prefix, QLatin1String("msgctxt"), noWrap,
                                    escapeComment(msg.oldComment(), qtContexts));
@@ -835,7 +853,7 @@ bool savePO(const Translator &translator, QIODevice &dev, ConversionData &)
         QString plural = msg.extra(QLatin1String("po-old_msgid_plural"));
         if (!plural.isEmpty())
             out << poEscapedString(prefix, QLatin1String("msgid_plural"), noWrap, plural);
-        prefix = QLatin1String((msg.type() == TranslatorMessage::Obsolete) ? "#~ " : "");
+        prefix = QLatin1String(isObsolete ? "#~ " : "");
         if (!msg.context().isEmpty())
             out << poEscapedString(prefix, QLatin1String("msgctxt"), noWrap,
                                    escapeComment(msg.context(), true) + QLatin1Char('|')
index 4b6cfdb..77d66aa 100644 (file)
@@ -661,7 +661,7 @@ bool saveQM(const Translator &translator, QIODevice &dev, ConversionData &cd)
     for (int i = 0; i != translator.messageCount(); ++i) {
         const TranslatorMessage &msg = translator.message(i);
         TranslatorMessage::Type typ = msg.type();
-        if (typ != TranslatorMessage::Obsolete) {
+        if (typ != TranslatorMessage::Obsolete && typ != TranslatorMessage::Vanished) {
             if (cd.m_idBased && msg.id().isEmpty()) {
                 ++missingIds;
                 continue;
index e3295e8..4bb8834 100644 (file)
@@ -395,7 +395,7 @@ int Translator::find(const QString &context) const
 void Translator::stripObsoleteMessages()
 {
     for (TMM::Iterator it = m_messages.begin(); it != m_messages.end(); )
-        if (it->type() == TranslatorMessage::Obsolete)
+        if (it->type() == TranslatorMessage::Obsolete || it->type() == TranslatorMessage::Vanished)
             it = m_messages.erase(it);
         else
             ++it;
index 4680b0e..7c6e04b 100644 (file)
@@ -54,7 +54,7 @@ enum TranslatorSaveMode { SaveEverything, SaveStripped };
 class TranslatorMessage
 {
 public:
-    enum Type { Unfinished, Finished, Obsolete };
+    enum Type { Unfinished, Finished, Vanished, Obsolete };
     typedef QHash<QString, QString> ExtraData;
     class Reference
     {
index 2c8840d..b2744c9 100644 (file)
@@ -227,6 +227,7 @@ bool TSReader::read(Translator &translator)
     STRING(unfinished);
     STRING(userdata);
     STRING(value);
+    STRING(vanished);
     //STRING(version);
     STRING(yes);
 
@@ -388,6 +389,8 @@ bool TSReader::read(Translator &translator)
                                     QStringRef type = atts.value(strtype);
                                     if (type == strunfinished)
                                         msg.setType(TranslatorMessage::Unfinished);
+                                    else if (type == strvanished)
+                                        msg.setType(TranslatorMessage::Vanished);
                                     else if (type == strobsolete)
                                         msg.setType(TranslatorMessage::Obsolete);
                                     if (msg.isPlural()) {
@@ -531,7 +534,7 @@ bool saveTS(const Translator &translator, QIODevice &dev, ConversionData &cd)
     // The xml prolog allows processors to easily detect the correct encoding
     t << "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n";
 
-    t << "<TS version=\"2.0\"";
+    t << "<TS version=\"2.1\"";
 
     QString languageCode = translator.languageCode();
     if (!languageCode.isEmpty() && languageCode != QLatin1String("C"))
@@ -557,8 +560,10 @@ bool saveTS(const Translator &translator, QIODevice &dev, ConversionData &cd)
     QList<QString> contextOrder;
     foreach (const TranslatorMessage &msg, translator.messages()) {
         // no need for such noise
-        if (msg.type() == TranslatorMessage::Obsolete && msg.translation().isEmpty())
+        if ((msg.type() == TranslatorMessage::Obsolete || msg.type() == TranslatorMessage::Vanished)
+            && msg.translation().isEmpty()) {
             continue;
+        }
 
         QList<TranslatorMessage> &context = messageOrder[msg.context()];
         if (context.isEmpty())
@@ -649,6 +654,8 @@ bool saveTS(const Translator &translator, QIODevice &dev, ConversionData &cd)
                 t << "        <translation";
                 if (msg.type() == TranslatorMessage::Unfinished)
                     t << " type=\"unfinished\"";
+                else if (msg.type() == TranslatorMessage::Vanished)
+                    t << " type=\"vanished\"";
                 else if (msg.type() == TranslatorMessage::Obsolete)
                     t << " type=\"obsolete\"";
                 if (msg.isPlural()) {
index d9df1d9..83ba0a2 100644 (file)
@@ -4,6 +4,7 @@
  !
  ! The location element is set as optional since it was introduced first in Qt 4.2.
  ! The userdata element is set as optional since it was introduced first in Qt 4.4.
+ ! The vanished message type was introduced first in Qt 5.2.
  !
   -->
 <!-- 
@@ -88,7 +89,7 @@
  ! variants may not be yes if the message has numerus yes.
   -->
 <!ATTLIST translation
-          type (unfinished|obsolete) #IMPLIED
+          type (unfinished|vanished|obsolete) #IMPLIED
           variants (yes|no) "no">
 <!-- Deprecated. Use extra-* -->
 <!ELEMENT userdata (#PCDATA)* >
index a29c7ba..68f2fc2 100644 (file)
@@ -281,12 +281,16 @@ static void writeTransUnits(QTextStream &ts, const TranslatorMessage &msg, const
     while (srcit != srcend || oldsrcit != oldsrcend || transit != transend) {
         QByteArray attribs;
         QByteArray state;
-        if (msg.type() == TranslatorMessage::Obsolete) {
-            if (!msg.isPlural())
-                attribs = " translate=\"no\"";
-        } else if (msg.type() == TranslatorMessage::Finished) {
-            attribs = " approved=\"yes\"";
-        } else if (transit != transend && !transit->isEmpty()) {
+        if ((msg.type() == TranslatorMessage::Obsolete
+             || msg.type() == TranslatorMessage::Vanished)
+            && !msg.isPlural()) {
+            attribs = " translate=\"no\"";
+        }
+        if (msg.type() == TranslatorMessage::Finished
+            || msg.type() == TranslatorMessage::Vanished) {
+            attribs += " approved=\"yes\"";
+        } else if (msg.type() == TranslatorMessage::Unfinished
+                   && transit != transend && !transit->isEmpty()) {
             state = " state=\"needs-review-translation\"";
         }
         writeIndent(ts, indent);
@@ -360,7 +364,7 @@ static void writeMessage(QTextStream &ts, const TranslatorMessage &msg, const QR
         ts << "<group restype=\"" << restypePlurals << "\"";
         if (!msg.id().isEmpty())
             ts << " id=\"" << msg.id() << "\"";
-        if (msg.type() == TranslatorMessage::Obsolete)
+        if (msg.type() == TranslatorMessage::Obsolete || msg.type() == TranslatorMessage::Vanished)
             ts << " translate=\"no\"";
         ts << ">\n";
         ++indent;
@@ -421,7 +425,6 @@ private:
 private:
     Translator &m_translator;
     ConversionData &m_cd;
-    TranslatorMessage::Type m_type;
     QString m_language;
     QString m_sourceLanguage;
     QString m_context;
@@ -432,6 +435,8 @@ private:
     QString m_oldComment;
     QString m_extraComment;
     QString m_translatorComment;
+    bool m_translate;
+    bool m_approved;
     bool m_isPlural;
     bool m_hadAlt;
     QStringList m_translations;
@@ -451,7 +456,8 @@ private:
 
 XLIFFHandler::XLIFFHandler(Translator &translator, ConversionData &cd)
   : m_translator(translator), m_cd(cd),
-    m_type(TranslatorMessage::Finished),
+    m_translate(true),
+    m_approved(true),
     m_lineNumber(-1),
     m_URITT(QLatin1String(TrollTsNamespaceURI)),
     m_URI(QLatin1String(XLIFF11namespaceURI)),
@@ -519,7 +525,7 @@ bool XLIFFHandler::startElement(const QString& namespaceURI,
                 pushContext(XC_restype_plurals);
                 m_id = atts.value(QLatin1String("id"));
                 if (atts.value(QLatin1String("translate")) == QLatin1String("no"))
-                    m_type = TranslatorMessage::Obsolete;
+                    m_translate = false;
             } else {
                 pushContext(XC_group);
             }
@@ -527,15 +533,14 @@ bool XLIFFHandler::startElement(const QString& namespaceURI,
     } else if (localName == QLatin1String("trans-unit")) {
         if (!hasContext(XC_restype_plurals) || m_sources.isEmpty() /* who knows ... */)
             if (atts.value(QLatin1String("translate")) == QLatin1String("no"))
-                m_type = TranslatorMessage::Obsolete;
+                m_translate = false;
         if (!hasContext(XC_restype_plurals)) {
             m_id = atts.value(QLatin1String("id"));
             if (m_id.startsWith(QLatin1String("_msg")))
                 m_id.clear();
         }
-        if (m_type != TranslatorMessage::Obsolete &&
-            atts.value(QLatin1String("approved")) != QLatin1String("yes"))
-            m_type = TranslatorMessage::Unfinished;
+        if (atts.value(QLatin1String("approved")) != QLatin1String("yes"))
+            m_approved = false;
         pushContext(XC_trans_unit);
         m_hadAlt = false;
     } else if (localName == QLatin1String("alt-trans")) {
@@ -697,12 +702,15 @@ bool XLIFFHandler::finalizeMessage(bool isPlural)
         m_cd.appendError(QLatin1String("XLIFF syntax error: Message without source string."));
         return false;
     }
-    if (m_type == TranslatorMessage::Obsolete && m_refs.size() == 1
+    if (!m_translate && m_refs.size() == 1
         && m_refs.at(0).fileName() == QLatin1String(MAGIC_OBSOLETE_REFERENCE))
         m_refs.clear();
+    TranslatorMessage::Type type
+            = m_translate ? (m_approved ? TranslatorMessage::Finished : TranslatorMessage::Unfinished)
+                          : (m_approved ? TranslatorMessage::Vanished : TranslatorMessage::Obsolete);
     TranslatorMessage msg(m_context, m_sources[0],
                           m_comment, QString(), QString(), -1,
-                          m_translations, m_type, isPlural);
+                          m_translations, type, isPlural);
     msg.setId(m_id);
     msg.setReferences(m_refs);
     msg.setOldComment(m_oldComment);
@@ -729,7 +737,8 @@ bool XLIFFHandler::finalizeMessage(bool isPlural)
     m_translatorComment.clear();
     m_extra.clear();
     m_refs.clear();
-    m_type = TranslatorMessage::Finished;
+    m_translate = true;
+    m_approved = true;
     return true;
 }
 
index 1a2b626..e6cc0c9 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE TS>
-<TS version="2.0">
+<TS version="2.1">
 <context>
     <name>FooBar</name>
     <message>
index 8aa7215..73d0299 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE TS>
-<TS version="2.0" language="de">
+<TS version="2.1" language="de">
 <context>
     <name>Assistant</name>
     <message>
index 39401d8..27d29b7 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE TS>
-<TS version="2.0">
+<TS version="2.1">
 <context>
     <name>Dialog2</name>
     <message numerus="yes">
index 966ec77..ed14ead 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE TS>
-<TS version="2.0" language="cn">
+<TS version="2.1" language="cn">
 <context>
     <name>Assistant</name>
     <message>
index 6cbadff..d69c5d5 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE TS>
-<TS version="2.0" language="de">
+<TS version="2.1" language="de">
 <context>
     <name>Assistant</name>
     <message>
index b8eaaca..0e8954a 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE TS>
-<TS version="2.0">
+<TS version="2.1">
 <context>
     <name>Foo</name>
     <message>
index fc9ae77..5ac2133 100644 (file)
@@ -29,3 +29,15 @@ msgid ""
 msgstr ""
 "%1 wird angemeldet ...\n"
 "\n"
+
+#: kgverify.cpp:460
+#, fuzzy, kde-format
+#~| msgid ""
+#~| "Logging out %1 ...\n"
+#~| "\n"
+#~ msgid ""
+#~ "Logging out %1...\n"
+#~ "\n"
+#~ msgstr ""
+#~ "%1 wird abgemeldet ...\n"
+#~ "\n"
index 0e38b4b..0233752 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE TS>
-<TS version="2.0">
+<TS version="2.1">
 <context>
     <name>Dialog2</name>
     <message numerus="yes">
         <location filename="main.cpp" line="41"/>
         <source>Plurals, QCoreApplication</source>
         <comment>%n car(s)</comment>
-        <translation type="unfinished">
-            <numerusform></numerusform>
+        <translation>
+            <numerusform>looks quite finished</numerusform>
         </translation>
     </message>
     <message numerus="yes">
         <location filename="main.cpp" line="42"/>
         <source>Plurals, QCoreApplication</source>
         <comment>%n horse(s)</comment>
-        <translation type="unfinished">
-            <numerusform></numerusform>
+        <translation type="vanished">
+            <numerusform>looks kinda vanished</numerusform>
         </translation>
     </message>
 </context>
         <location filename="main.cpp" line="120"/>
         <source>inline function 2</source>
         <comment>TestClass</comment>
-        <translation type="unfinished"></translation>
+        <translation type="vanished">just fine here</translation>
     </message>
     <message>
         <location filename="main.cpp" line="124"/>
         <source>static inline function</source>
         <comment>TestClass</comment>
-        <translation type="unfinished"></translation>
+        <translation type="obsolete">not quite fine here</translation>
     </message>
 </context>
 <context>
index 52bb2d4..91c2086 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE TS>
-<TS version="2.0" language="de">
+<TS version="2.1" language="de">
 <context>
     <name>Assistant</name>
     <message>
index b6608a8..ecf9135 100644 (file)
@@ -202,6 +202,7 @@ void tst_lconvert::readverifies_data()
     QTest::addColumn<QString>("fileName");
     QTest::addColumn<QString>("format");
 
+    QTest::newRow("ts") << "test20.ts" << "ts";
     QTest::newRow("empty comment") << "test-empty-comment.po" << "po";
     QTest::newRow("translator comment") << "test-translator-comment.po" << "po";
     QTest::newRow("developer comment") << "test-developer-comment.po" << "po";
index d3a5fdf..08a2406 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE TS>
-<TS version="2.0">
+<TS version="2.1">
 <context>
     <name>QApplication</name>
     <message>
index 5c3c21c..cb3714e 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE TS>
-<TS version="2.0">
+<TS version="2.1">
 <context>
     <name>FindDialog</name>
     <message>
index 6028cbb..f52b771 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE TS>
-<TS version="2.0">
+<TS version="2.1">
 <context>
     <name>aaa</name>
     <message>
index 95a34fa..7a64ac1 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE TS>
-<TS version="2.0">
+<TS version="2.1">
 <context>
     <name>FindDialog</name>
     <message>
index b1a40ad..4741f58 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE TS>
-<TS version="2.0">
+<TS version="2.1">
 <context>
     <name>QObject</name>
     <message>
index 7167cf3..16d91d7 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE TS>
-<TS version="2.0">
+<TS version="2.1">
 <context>
     <name>QApplication</name>
     <message>
index 402ad9a..08d2373 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE TS>
-<TS version="2.0">
+<TS version="2.1">
 <context>
     <name>A</name>
     <message>
index bc876cd..002c585 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE TS>
-<TS version="2.0">
+<TS version="2.1">
 <context>
     <name>B</name>
     <message>
index 5104860..c47a9a4 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE TS>
-<TS version="2.0">
+<TS version="2.1">
 <context>
     <name>Foo</name>
     <message>
index f9d26df..51a1568 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE TS>
-<TS version="2.0">
+<TS version="2.1">
 <context>
     <name>FindDialog</name>
     <message>
index 776238d..2ed4392 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE TS>
-<TS version="2.0">
+<TS version="2.1">
 <context>
     <name>QObject</name>
     <message>
index 379cce4..5ef7b23 100644 (file)
     <message>
         <location filename="finddialog.cpp" line="58"/>
         <source>Search reached start of the document</source>
-        <translation type="unfinished"></translation>
+        <translation type="obsolete"></translation>
     </message>
     <message>
         <location filename="finddialog.cpp" line="59"/>
         <source>Text not found</source>
-        <translation type="unfinished"></translation>
+        <translation type="vanished">text not found (in chinese)</translation>
     </message>
     <message numerus="yes">
         <location filename="finddialog.cpp" line="64"/>
index de43266..49e94ce 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE TS>
-<TS version="2.0" language="zh_CN">
+<TS version="2.1" language="zh_CN">
 <context>
     <name></name>
     <message id="xx_hello">
@@ -47,7 +47,7 @@
     <message>
         <location filename="finddialog.cpp" line="59"/>
         <source>Text not found</source>
-        <translation type="unfinished"></translation>
+        <translation>text not found (in chinese)</translation>
     </message>
     <message numerus="yes">
         <location filename="finddialog.cpp" line="64"/>
index ee3d0f6..e40b35f 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE TS>
-<TS version="2.0">
+<TS version="2.1">
 <context>
     <name></name>
     <message id="keep_id">
index 2bc6049..2af303b 100644 (file)
@@ -18,7 +18,7 @@
     <message>
         <location filename="finddialog.cpp" line="85"/>
         <source>Enter the text you are looking for.</source>
-        <translation type="unfinished">Skriv inn teksten du soker etter</translation>
+        <translation>Skriv inn teksten du soker etter</translation>
     </message>
     <message>
         <location filename="finddialog.cpp" line="135"/>
index f442cbc..cd1f2fa 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE TS>
-<TS version="2.0">
+<TS version="2.1">
 <context>
     <name></name>
     <message id="keep_id">
@@ -17,7 +17,7 @@
     <name>FindDialog</name>
     <message>
         <source>Enter the text you are looking for.</source>
-        <translation type="obsolete">Skriv inn teksten du soker etter</translation>
+        <translation type="vanished">Skriv inn teksten du soker etter</translation>
     </message>
     <message>
         <location filename="finddialog.cpp" line="88"/>
index 1a2244b..3c4e280 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE TS>
-<TS version="2.0">
+<TS version="2.1">
 <context>
     <name>FindDialog</name>
     <message>
index 6bc565c..2636ae0 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE TS>
-<TS version="2.0">
+<TS version="2.1">
 <context>
     <name>FindDialog</name>
     <message>
index 94df9d3..01f7325 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE TS>
-<TS version="2.0">
+<TS version="2.1">
 <context>
     <name>A1::B::Test</name>
     <message>
index 53d7a25..98e6e16 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE TS>
-<TS version="2.0">
+<TS version="2.1">
 <context>
     <name>A1::AB</name>
     <message>
index c8cca3f..cf472ff 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE TS>
-<TS version="2.0">
+<TS version="2.1">
 <context>
     <name></name>
     <message id="this_a_id">
index 3202f9d..f001d03 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE TS>
-<TS version="2.0">
+<TS version="2.1">
 <context>
     <name></name>
     <message id="no_source">
index 0ce600c..3de2fbf 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE TS>
-<TS version="2.0">
+<TS version="2.1">
 <context>
     <name>Plurals, QCoreApplication</name>
     <message numerus="yes">
index 5dcc30c..8df655f 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE TS>
-<TS version="2.0">
+<TS version="2.1">
 <context>
     <name></name>
     <message id="qtn_foo_bar">
index bfa1b3d..f7aa9a7 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE TS>
-<TS version="2.0">
+<TS version="2.1">
 <context>
     <name>FooContext</name>
     <message>
index ac36dbf..7c28edf 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE TS>
-<TS version="2.0">
+<TS version="2.1">
 <context>
     <name></name>
     <message id="qtn_foo_bar">
index 83c6d3f..c054657 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE TS>
-<TS version="2.0">
+<TS version="2.1">
 <context>
     <name>FooContext</name>
     <message>
index 475305d..ce57bd4 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE TS>
-<TS version="2.0">
+<TS version="2.1">
 <context>
     <name></name>
     <message id="qtn_foo_bar">
index fa4f418..0ab9081 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE TS>
-<TS version="2.0">
+<TS version="2.1">
 <context>
     <name>FooContext</name>
     <message>
index d53c6d8..38f4735 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE TS>
-<TS version="2.0">
+<TS version="2.1">
 <context>
     <name>FindDialog</name>
     <message>
index e356921..d1f96b2 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE TS>
-<TS version="2.0">
+<TS version="2.1">
 <context>
     <name>Foo</name>
     <message>
index 4d695e8..1bba59b 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE TS>
-<TS version="2.0">
+<TS version="2.1">
 <context>
     <name>QApplication</name>
     <message>
index 9b48d78..eb9119d 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE TS>
-<TS version="2.0">
+<TS version="2.1">
 <context>
     <name>QApplication</name>
     <message>
index 3714d9b..0a845e7 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE TS>
-<TS version="2.0">
+<TS version="2.1">
 <context>
     <name>QLineEdit</name>
     <message>
index edc2fcb..5646601 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE TS>
-<TS version="2.0">
+<TS version="2.1">
 <context>
     <name>QApplication</name>
     <message>
index e01c533..202fd08 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE TS>
-<TS version="2.0">
+<TS version="2.1">
 <context>
     <name>QApplication</name>
     <message>
index a6972bd..3940866 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE TS>
-<TS version="2.0">
+<TS version="2.1">
 <context>
     <name>QApplication</name>
     <message>
index 6621de9..fd30574 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE TS>
-<TS version="2.0">
+<TS version="2.1">
 <context>
     <name>QApplication</name>
     <message>
index 7d9a6f4..4ffa96f 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE TS>
-<TS version="2.0">
+<TS version="2.1">
 <context>
     <name>subdir1</name>
     <message>
index ca9504e..df878e4 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE TS>
-<TS version="2.0">
+<TS version="2.1">
 <context>
     <name>subsub2</name>
     <message>
index 7d9a6f4..4ffa96f 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE TS>
-<TS version="2.0">
+<TS version="2.1">
 <context>
     <name>subdir1</name>
     <message>
index ca9504e..df878e4 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE TS>
-<TS version="2.0">
+<TS version="2.1">
 <context>
     <name>subsub2</name>
     <message>
index 7d9a6f4..4ffa96f 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE TS>
-<TS version="2.0">
+<TS version="2.1">
 <context>
     <name>subdir1</name>
     <message>
index 3a864a2..5343277 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE TS>
-<TS version="2.0">
+<TS version="2.1">
 <context>
     <name>Dialog2</name>
     <message>
index 6bc565c..2636ae0 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE TS>
-<TS version="2.0">
+<TS version="2.1">
 <context>
     <name>FindDialog</name>
     <message>
index e05d01c..c168f85 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE TS>
-<TS version="2.0">
+<TS version="2.1">
 <context>
     <name></name>
     <message id="this_a_id">