]> cloud.milkyroute.net Git - dolphin.git/commitdiff
Fix context for QDateTime::toString() translations
authorElvis Angelaccio <elvis.angelaccio@kde.org>
Sun, 17 Feb 2019 11:26:52 +0000 (12:26 +0100)
committerElvis Angelaccio <elvis.angelaccio@kde.org>
Sat, 9 Mar 2019 11:34:36 +0000 (12:34 +0100)
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

src/kitemviews/kfileitemmodel.cpp

index 61bedfacace298160a07831bdc5d23c0e56c938a..a6d74a77b9fc7273d3f7bd94a167e6d22c016dfc 100644 (file)
@@ -2046,12 +2046,20 @@ QList<QPair<int, QVariant> > 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<QPair<int, QVariant> > 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 "