From: Elvis Angelaccio Date: Sun, 17 Feb 2019 11:26:52 +0000 (+0100) Subject: Fix context for QDateTime::toString() translations X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/commitdiff_plain/1a325946174258186b6b8dfeae6dd096d90483f2 Fix context for QDateTime::toString() translations Summary: The documentation of QDateTime::toString() says that: Any sequence of characters that are enclosed in single quotes will be treated as text and not be used as an expression. This means that translators cannot replace single quotes with other characters such as «...». This is now described in the context of the affected strings. We also check that the translated string contains exactly 2 single quotes, and we use the untraslated string otherwise. BUG: 401382 Reviewers: lueck, aacid, cfeck Subscribers: ltoscano, kfm-devel Tags: #dolphin Differential Revision: https://phabricator.kde.org/D18769 --- diff --git a/src/kitemviews/kfileitemmodel.cpp b/src/kitemviews/kfileitemmodel.cpp index 61bedfaca..a6d74a77b 100644 --- a/src/kitemviews/kfileitemmodel.cpp +++ b/src/kitemviews/kfileitemmodel.cpp @@ -2046,12 +2046,20 @@ QList > KFileItemModel::timeRoleGroups(const std::function< lastMonthDate.month() == fileDate.month()) { if (daysDistance == 1) { - newGroupValue = fileTime.toString(i18nc("@title:group Date: " - "MMMM is full month name in current locale, and yyyy is " - "full year number", "'Yesterday' (MMMM, yyyy)")); - newGroupValue = i18nc("Can be used to script translation of " - "\"'Yesterday' (MMMM, yyyy)\" with context @title:group Date", - "%1", newGroupValue); + const KLocalizedString format = ki18nc("@title:group Date: " + "MMMM is full month name in current locale, and yyyy is " + "full year number", "'Yesterday' (MMMM, yyyy)"); + const QString translatedFormat = format.toString(); + if (translatedFormat.count(QLatin1Char('\'')) == 2) { + newGroupValue = fileTime.toString(translatedFormat); + newGroupValue = i18nc("Can be used to script translation of " + "\"'Yesterday' (MMMM, yyyy)\" with context @title:group Date", + "%1", newGroupValue); + } else { + qCWarning(DolphinDebug).nospace() << "A wrong translation was found: " << translatedFormat << ". Please file a bug report at bugs.kde.org"; + const QString untranslatedFormat = format.toString({ QLatin1String("en_US") }); + newGroupValue = fileTime.toString(untranslatedFormat); + } } else if (daysDistance <= 7) { newGroupValue = fileTime.toString(i18nc("@title:group Date: " "The week day name: dddd, MMMM is full month name " @@ -2061,33 +2069,65 @@ QList > KFileItemModel::timeRoleGroups(const std::function< "\"dddd (MMMM, yyyy)\" with context @title:group Date", "%1", newGroupValue); } else if (daysDistance <= 7 * 2) { - newGroupValue = fileTime.toString(i18nc("@title:group Date: " - "MMMM is full month name in current locale, and yyyy is " - "full year number", "'One Week Ago' (MMMM, yyyy)")); - newGroupValue = i18nc("Can be used to script translation of " - "\"'One Week Ago' (MMMM, yyyy)\" with context @title:group Date", - "%1", newGroupValue); + const KLocalizedString format = ki18nc("@title:group Date: " + "MMMM is full month name in current locale, and yyyy is " + "full year number", "'One Week Ago' (MMMM, yyyy)"); + const QString translatedFormat = format.toString(); + if (translatedFormat.count(QLatin1Char('\'')) == 2) { + newGroupValue = fileTime.toString(translatedFormat); + newGroupValue = i18nc("Can be used to script translation of " + "\"'One Week Ago' (MMMM, yyyy)\" with context @title:group Date", + "%1", newGroupValue); + } else { + qCWarning(DolphinDebug).nospace() << "A wrong translation was found: " << translatedFormat << ". Please file a bug report at bugs.kde.org"; + const QString untranslatedFormat = format.toString({ QLatin1String("en_US") }); + newGroupValue = fileTime.toString(untranslatedFormat); + } } else if (daysDistance <= 7 * 3) { - newGroupValue = fileTime.toString(i18nc("@title:group Date: " - "MMMM is full month name in current locale, and yyyy is " - "full year number", "'Two Weeks Ago' (MMMM, yyyy)")); - newGroupValue = i18nc("Can be used to script translation of " - "\"'Two Weeks Ago' (MMMM, yyyy)\" with context @title:group Date", - "%1", newGroupValue); + const KLocalizedString format = ki18nc("@title:group Date: " + "MMMM is full month name in current locale, and yyyy is " + "full year number", "'Two Weeks Ago' (MMMM, yyyy)"); + const QString translatedFormat = format.toString(); + if (translatedFormat.count(QLatin1Char('\'')) == 2) { + newGroupValue = fileTime.toString(translatedFormat); + newGroupValue = i18nc("Can be used to script translation of " + "\"'Two Weeks Ago' (MMMM, yyyy)\" with context @title:group Date", + "%1", newGroupValue); + } else { + qCWarning(DolphinDebug).nospace() << "A wrong translation was found: " << translatedFormat << ". Please file a bug report at bugs.kde.org"; + const QString untranslatedFormat = format.toString({ QLatin1String("en_US") }); + newGroupValue = fileTime.toString(untranslatedFormat); + } } else if (daysDistance <= 7 * 4) { - newGroupValue = fileTime.toString(i18nc("@title:group Date: " - "MMMM is full month name in current locale, and yyyy is " - "full year number", "'Three Weeks Ago' (MMMM, yyyy)")); - newGroupValue = i18nc("Can be used to script translation of " - "\"'Three Weeks Ago' (MMMM, yyyy)\" with context @title:group Date", - "%1", newGroupValue); + const KLocalizedString format = ki18nc("@title:group Date: " + "MMMM is full month name in current locale, and yyyy is " + "full year number", "'Three Weeks Ago' (MMMM, yyyy)"); + const QString translatedFormat = format.toString(); + if (translatedFormat.count(QLatin1Char('\'')) == 2) { + newGroupValue = fileTime.toString(translatedFormat); + newGroupValue = i18nc("Can be used to script translation of " + "\"'Three Weeks Ago' (MMMM, yyyy)\" with context @title:group Date", + "%1", newGroupValue); + } else { + qCWarning(DolphinDebug).nospace() << "A wrong translation was found: " << translatedFormat << ". Please file a bug report at bugs.kde.org"; + const QString untranslatedFormat = format.toString({ QLatin1String("en_US") }); + newGroupValue = fileTime.toString(untranslatedFormat); + } } else { - newGroupValue = fileTime.toString(i18nc("@title:group Date: " - "MMMM is full month name in current locale, and yyyy is " - "full year number", "'Earlier on' MMMM, yyyy")); - newGroupValue = i18nc("Can be used to script translation of " - "\"'Earlier on' MMMM, yyyy\" with context @title:group Date", - "%1", newGroupValue); + const KLocalizedString format = ki18nc("@title:group Date: " + "MMMM is full month name in current locale, and yyyy is " + "full year number", "'Earlier on' MMMM, yyyy"); + const QString translatedFormat = format.toString(); + if (translatedFormat.count(QLatin1Char('\'')) == 2) { + newGroupValue = fileTime.toString(translatedFormat); + newGroupValue = i18nc("Can be used to script translation of " + "\"'Earlier on' MMMM, yyyy\" with context @title:group Date", + "%1", newGroupValue); + } else { + qCWarning(DolphinDebug).nospace() << "A wrong translation was found: " << translatedFormat << ". Please file a bug report at bugs.kde.org"; + const QString untranslatedFormat = format.toString({ QLatin1String("en_US") }); + newGroupValue = fileTime.toString(untranslatedFormat); + } } } else { newGroupValue = fileTime.toString(i18nc("@title:group "