diff --git a/src/catalog/catalog.h b/src/catalog/catalog.h --- a/src/catalog/catalog.h +++ b/src/catalog/catalog.h @@ -84,6 +84,8 @@ QString msgid(const DocPosition&) const; virtual QString msgstr(const DocPosition&) const; + QString msgidWithPlurals(const DocPosition&) const; + QString msgstrWithPlurals(const DocPosition&) const; static QStringList supportedExtensions(); static bool extIsSupported(const QString& path); diff --git a/src/catalog/catalog.cpp b/src/catalog/catalog.cpp --- a/src/catalog/catalog.cpp +++ b/src/catalog/catalog.cpp @@ -202,14 +202,30 @@ return m_storage->source(alterForSinglePlural(this, pos)); } +QString Catalog::msgidWithPlurals(const DocPosition& pos) const +{ + if (Q_UNLIKELY(!m_storage)) + return QString(); + return m_storage->sourceWithPlurals(pos); +} + QString Catalog::msgstr(const DocPosition& pos) const { if (Q_UNLIKELY(!m_storage)) return QString(); return m_storage->target(pos); } +QString Catalog::msgstrWithPlurals(const DocPosition& pos) const +{ + if (Q_UNLIKELY(!m_storage)) + return QString(); + + return m_storage->targetWithPlurals(pos); +} + + CatalogString Catalog::sourceWithTags(const DocPosition& pos) const { if (Q_UNLIKELY(!m_storage)) diff --git a/src/catalog/catalogstorage.h b/src/catalog/catalogstorage.h --- a/src/catalog/catalogstorage.h +++ b/src/catalog/catalogstorage.h @@ -69,6 +69,8 @@ **/ virtual QString source(const DocPosition& pos) const = 0; virtual QString target(const DocPosition& pos) const = 0; + virtual QString sourceWithPlurals(const DocPosition& pos) const = 0; + virtual QString targetWithPlurals(const DocPosition& pos) const = 0; virtual CatalogString sourceWithTags(DocPosition pos) const = 0; virtual CatalogString targetWithTags(DocPosition pos) const = 0; virtual CatalogString catalogString(const DocPosition& pos) const = 0; diff --git a/src/catalog/gettext/catalogitem.h b/src/catalog/gettext/catalogitem.h --- a/src/catalog/gettext/catalogitem.h +++ b/src/catalog/gettext/catalogitem.h @@ -104,6 +104,7 @@ } const QString& msgstr(const int form = 0) const; const QVector& msgstrPlural() const; + const QVector& msgidPlural() const; enum Part {Source, Target}; QStringList allPluralForms(CatalogItem::Part, bool stripNewLines = false) const; bool prependEmptyForMsgid(const int form = 0) const; diff --git a/src/catalog/gettext/catalogitem.cpp b/src/catalog/gettext/catalogitem.cpp --- a/src/catalog/gettext/catalogitem.cpp +++ b/src/catalog/gettext/catalogitem.cpp @@ -72,6 +72,10 @@ { return d._msgstrPlural; } +const QVector& CatalogItem::msgidPlural() const +{ + return d._msgidPlural; +} QStringList CatalogItem::allPluralForms(CatalogItem::Part part, bool stripNewLines) const { diff --git a/src/catalog/gettext/gettextstorage.h b/src/catalog/gettext/gettextstorage.h --- a/src/catalog/gettext/gettextstorage.h +++ b/src/catalog/gettext/gettextstorage.h @@ -56,6 +56,8 @@ //flat-model interface (ignores XLIFF grouping) QString source(const DocPosition& pos) const; QString target(const DocPosition& pos) const; + QString sourceWithPlurals(const DocPosition& pos) const; + QString targetWithPlurals(const DocPosition& pos) const; CatalogString sourceWithTags(DocPosition pos) const; CatalogString targetWithTags(DocPosition pos) const; CatalogString catalogString(const DocPosition& pos) const diff --git a/src/catalog/gettext/gettextstorage.cpp b/src/catalog/gettext/gettextstorage.cpp --- a/src/catalog/gettext/gettextstorage.cpp +++ b/src/catalog/gettext/gettextstorage.cpp @@ -177,6 +177,38 @@ { return m_entries.at(pos.entry).msgstr(pos.form); } +QString GettextStorage::sourceWithPlurals(const DocPosition& pos) const +{ + if (m_entries.at(pos.entry).isPlural()) { + const QVector plurals = m_entries.at(pos.entry).msgidPlural(); + QString pluralString = QString(); + for (int i = 0; i < plurals.size(); i++) { + pluralString += plurals.at(i); + if (i != plurals.size() - 1) { + pluralString += "|"; + } + } + return pluralString; + } else { + return m_entries.at(pos.entry).msgid(pos.form); + } +} +QString GettextStorage::targetWithPlurals(const DocPosition& pos) const +{ + if (m_entries.at(pos.entry).isPlural()) { + const QVector plurals = m_entries.at(pos.entry).msgstrPlural(); + QString pluralString = QString(); + for (int i = 0; i < plurals.size(); i++) { + pluralString += plurals.at(i); + if (i != plurals.size() - 1) { + pluralString += "|"; + } + } + return pluralString; + } else { + return m_entries.at(pos.entry).msgstr(pos.form); + } +} void GettextStorage::targetDelete(const DocPosition& pos, int count) { diff --git a/src/catalog/ts/tsstorage.h b/src/catalog/ts/tsstorage.h --- a/src/catalog/ts/tsstorage.h +++ b/src/catalog/ts/tsstorage.h @@ -46,6 +46,8 @@ //flat-model interface (ignores TS grouping) QString source(const DocPosition& pos) const; QString target(const DocPosition& pos) const; + QString sourceWithPlurals(const DocPosition& pos) const; + QString targetWithPlurals(const DocPosition& pos) const; CatalogString targetWithTags(DocPosition pos) const; CatalogString sourceWithTags(DocPosition pos) const; CatalogString catalogString(const DocPosition& pos) const; diff --git a/src/catalog/ts/tsstorage.cpp b/src/catalog/ts/tsstorage.cpp --- a/src/catalog/ts/tsstorage.cpp +++ b/src/catalog/ts/tsstorage.cpp @@ -278,6 +278,15 @@ return content(targetForPos(pos)); } +QString TsStorage::sourceWithPlurals(const DocPosition& pos) const +{ + return source(pos); +} +QString TsStorage::targetWithPlurals(const DocPosition& pos) const +{ + return target(pos); +} + void TsStorage::targetDelete(const DocPosition& pos, int count) { diff --git a/src/catalog/xliff/xliffstorage.h b/src/catalog/xliff/xliffstorage.h --- a/src/catalog/xliff/xliffstorage.h +++ b/src/catalog/xliff/xliffstorage.h @@ -47,6 +47,8 @@ //flat-model interface (ignores XLIFF grouping) QString source(const DocPosition& pos) const; QString target(const DocPosition& pos) const; + QString sourceWithPlurals(const DocPosition& pos) const; + QString targetWithPlurals(const DocPosition& pos) const; CatalogString targetWithTags(DocPosition pos) const; CatalogString sourceWithTags(DocPosition pos) const; CatalogString catalogString(const DocPosition& pos) const; diff --git a/src/catalog/xliff/xliffstorage.cpp b/src/catalog/xliff/xliffstorage.cpp --- a/src/catalog/xliff/xliffstorage.cpp +++ b/src/catalog/xliff/xliffstorage.cpp @@ -509,6 +509,14 @@ { return genericContent(targetForPos(pos.entry), pos.entry < size()); } +QString XliffStorage::sourceWithPlurals(const DocPosition& pos) const +{ + return source(pos); +} +QString XliffStorage::targetWithPlurals(const DocPosition& pos) const +{ + return target(pos); +} void XliffStorage::targetDelete(const DocPosition& pos, int count) diff --git a/src/cataloglistview/catalogmodel.cpp b/src/cataloglistview/catalogmodel.cpp --- a/src/cataloglistview/catalogmodel.cpp +++ b/src/cataloglistview/catalogmodel.cpp @@ -170,8 +170,7 @@ if (index.column() >= TranslationStatus) return QVariant(); else if (index.column() == Source || index.column() == Target) { - static const DocPosition::Part parts[] = {DocPosition::Source, DocPosition::Target}; - QString str = m_catalog->catalogString(DocPosition(index.row(), parts[index.column() == Target])).string; + QString str = index.column() == Source ? m_catalog->msgidWithPlurals(index.row()) : m_catalog->msgstrWithPlurals(index.row()); return m_ignoreAccel ? str.remove(Project::instance()->accel()) : str; } role = Qt::DisplayRole; @@ -183,8 +182,10 @@ switch (index.column()) { case Key: return index.row() + 1; - case Source: return m_catalog->msgid(index.row()); - case Target: return m_catalog->msgstr(index.row()); + case Source: + return m_catalog->msgidWithPlurals(index.row()); + case Target: + return m_catalog->msgstrWithPlurals(index.row()); case Notes: { QString result; foreach (const Note ¬e, m_catalog->notes(index.row())) diff --git a/src/tm/jobs.cpp b/src/tm/jobs.cpp --- a/src/tm/jobs.cpp +++ b/src/tm/jobs.cpp @@ -588,8 +588,7 @@ bool ok = query1.exec(); //note the RETURN!!!! if (!ok) qCWarning(LOKALIZE_LOG) << "doInsertEntry: target update failed" << query1.lastError().text(); - else - { + else { ok = query1.exec(QStringLiteral("UPDATE main SET change_date=CURRENT_DATE WHERE target=") % QString::number(targetId)); if (!ok) qCWarning(LOKALIZE_LOG) << "doInsertEntry: main update failed" << query1.lastError().text(); @@ -1714,8 +1713,8 @@ QSqlQuery queryBegin(QStringLiteral("BEGIN"), db); qlonglong priorId = -1; doInsertEntry(m_english, m_newTarget, - m_ctxt, //TODO QStringList -- after XLIFF - m_approved, fileId, db, rxClean1, c.accel, priorId, priorId); + m_ctxt, //TODO QStringList -- after XLIFF + m_approved, fileId, db, rxClean1, c.accel, priorId, priorId); QSqlQuery queryEnd(QStringLiteral("END"), db); }