From e413cbc41fed6eb85c4fa8f8125b2976a41f4bda Mon Sep 17 00:00:00 2001 From: Ivailo Monev Date: Thu, 27 Jul 2023 07:05:34 +0300 Subject: [PATCH] kdecore: reimplement KLocale::formatDuration() much like the old (and now gone) KLocale::prettyFormatDuration() except with miliseconds precision instead of days Signed-off-by: Ivailo Monev --- kdecore/localization/klocale.cpp | 84 +++++++++++++++++++++++++------- kio/tests/jobtest.cpp | 4 +- 2 files changed, 69 insertions(+), 19 deletions(-) diff --git a/kdecore/localization/klocale.cpp b/kdecore/localization/klocale.cpp index efdc48ef..321f40ca 100644 --- a/kdecore/localization/klocale.cpp +++ b/kdecore/localization/klocale.cpp @@ -30,6 +30,14 @@ #include #include +enum KLocaleDuration +{ + KDurationMilisecond = 0, + KDurationSecond = 1, + KDurationMinute = 2, + KDurationHour = 3 +}; + static bool isDefaultLocale(const KLocale *locale) { return (locale->language() == KLocale::defaultLanguage()); @@ -44,6 +52,32 @@ static QStringList s_defaultCatalogs = QStringList() static const QLatin1String s_localenamec = QLatin1String("C"); +static QString getDuration(const KLocaleDuration which, const int duration) +{ + switch (which) { + case KLocaleDuration::KDurationHour: { + return i18ncp("@item:intext", "1 hour", "%1 hours", duration); + } + case KLocaleDuration::KDurationMinute: { + return i18ncp("@item:intext", "1 minute", "%1 minutes", duration); + } + case KLocaleDuration::KDurationSecond: { + return i18ncp("@item:intext", "1 second", "%1 seconds", duration); + } + case KLocaleDuration::KDurationMilisecond: { + return i18ncp("@item:intext", "1 milisecond", "%1 miliseconds", duration); + } + } + Q_ASSERT(false); + return QString(); +} + +static QString getMultiDuration(const KLocaleDuration which, const int duration, + const KLocaleDuration which2, const int duration2) +{ + return i18nc("@item:intext", "%1 and %2", getDuration(which, duration), getDuration(which2, duration2)); +} + class KLocalePrivate { public: @@ -379,28 +413,44 @@ QString KLocale::formatByteSize(double size) const QString KLocale::formatDuration(unsigned long mSec) const { - if (mSec >= 24*3600000) { - return i18nc( - "@item:intext %1 is a real number, e.g. 1.23 days", "%1 days", - formatNumber(mSec / (24 * 3600000.0), 2) + QTime durationtime; + durationtime = durationtime.addMSecs(mSec); + const int hours = durationtime.hour(); + const int minutes = durationtime.minute(); + const int seconds = durationtime.second(); + const int miliseconds = durationtime.msec(); + + if (hours && minutes) { + return getMultiDuration( + KLocaleDuration::KDurationHour, hours, + KLocaleDuration::KDurationMinute, minutes ); - } else if (mSec >= 3600000) { - return i18nc( - "@item:intext %1 is a real number, e.g. 1.23 hours", "%1 hours", - formatNumber(mSec / 3600000.0, 2) + } else if (hours) { + return getDuration( + KLocaleDuration::KDurationHour, hours ); - } else if (mSec >= 60000) { - return i18nc( - "@item:intext %1 is a real number, e.g. 1.23 minutes", "%1 minutes", - formatNumber(mSec / 60000.0, 2) + } else if (minutes && seconds) { + return getMultiDuration( + KLocaleDuration::KDurationMinute, minutes, + KLocaleDuration::KDurationSecond, seconds ); - } else if (mSec >= 1000) { - return i18nc( - "@item:intext %1 is a real number, e.g. 1.23 seconds", "%1 seconds", - formatNumber(mSec / 1000.0, 2) + } else if (minutes) { + return getDuration( + KLocaleDuration::KDurationMinute, minutes + ); + } else if (seconds && miliseconds) { + return getMultiDuration( + KLocaleDuration::KDurationSecond, seconds, + KLocaleDuration::KDurationMilisecond, miliseconds + ); + } else if (seconds) { + return getDuration( + KLocaleDuration::KDurationSecond, seconds ); } - return i18ncp("@item:intext", "%1 millisecond", "%1 milliseconds", mSec); + return getDuration( + KLocaleDuration::KDurationMilisecond, miliseconds + ); } QString KLocale::formatDate(const QDate &date, QLocale::FormatType format) const diff --git a/kio/tests/jobtest.cpp b/kio/tests/jobtest.cpp index 4659e2fd..1db04639 100644 --- a/kio/tests/jobtest.cpp +++ b/kio/tests/jobtest.cpp @@ -965,12 +965,12 @@ void JobTest::calculateRemainingSeconds() unsigned int seconds = KIO::calculateRemainingSeconds( 2 * 86400 - 60, 0, 1 ); QCOMPARE( seconds, static_cast( 2 * 86400 - 60 ) ); QString text = KIO::convertSeconds( seconds ); - QCOMPARE( text, i18n( "1 day 23:59:00" ) ); + QCOMPARE( text, i18n( "23 hours and 59 minutes" ) ); seconds = KIO::calculateRemainingSeconds( 520, 20, 10 ); QCOMPARE( seconds, static_cast( 50 ) ); text = KIO::convertSeconds( seconds ); - QCOMPARE( text, i18n( "00:00:50" ) ); + QCOMPARE( text, i18n( "50 seconds" ) ); } void JobTest::getInvalidUrl()