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 <xakepa10@gmail.com>
This commit is contained in:
Ivailo Monev 2023-07-27 07:05:34 +03:00
parent aa9e5b7066
commit e413cbc41f
2 changed files with 69 additions and 19 deletions

View file

@ -30,6 +30,14 @@
#include <QCoreApplication>
#include <qmath.h>
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

View file

@ -965,12 +965,12 @@ void JobTest::calculateRemainingSeconds()
unsigned int seconds = KIO::calculateRemainingSeconds( 2 * 86400 - 60, 0, 1 );
QCOMPARE( seconds, static_cast<unsigned int>( 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<unsigned int>( 50 ) );
text = KIO::convertSeconds( seconds );
QCOMPARE( text, i18n( "00:00:50" ) );
QCOMPARE( text, i18n( "50 seconds" ) );
}
void JobTest::getInvalidUrl()