From kde-commits Thu Jul 02 15:07:00 2009 From: Chusslove Illich Date: Thu, 02 Jul 2009 15:07:00 +0000 To: kde-commits Subject: branches/KDE/4.3/kdelibs/kdecore/localization Message-Id: <1246547220.723782.14183.nullmailer () svn ! kde ! org> X-MARC-Message: https://marc.info/?l=kde-commits&m=124654723004615 SVN commit 990514 by ilic: Optimization: cache translations in formatByteSize(). (bport: 990513) M +43 -27 klocale.cpp --- branches/KDE/4.3/kdelibs/kdecore/localization/klocale.cpp #990513:990514 @@ -42,6 +42,7 @@ #include #include #include +#include #include "kcatalog_p.h" #include "kglobal.h" @@ -67,6 +68,8 @@ KLocaleStaticData (); + QMutex mutex; + QString maincatalog; // FIXME: Temporary until full language-sensitivity implemented. @@ -74,6 +77,7 @@ }; KLocaleStaticData::KLocaleStaticData () +: mutex(QMutex::Recursive) { // Languages using non-Western Arabic digit sets. // FIXME: Temporary until full language-sensitivity implemented. @@ -261,6 +265,12 @@ #ifdef Q_WS_WIN char win32SystemEncoding[3+7]; //"cp " + lang ID #endif + + // Performance stuff. + enum ByteSizeFmt { + TiB, GiB, MiB, KiB, B + }; + QList byteSizeFmt; }; KLocalePrivate::KLocalePrivate(const QString& catalog, KConfig *config, const QString &language_, const QString &country_) @@ -1348,38 +1358,44 @@ //Mebi-byte MiB 2^20 1,048,576 bytes //Kibi-byte KiB 2^10 1,024 bytes + if (d->byteSizeFmt.size() == 0) { + QMutexLocker lock(&staticData->mutex); + // Pretranslated format strings for byte sizes. + #define CACHEBYTEFMT(x) { \ + QString s; \ + translateRaw(x, 0, &s); \ + d->byteSizeFmt.append(s); \ + } while(0) + // i18n: Dumb message, avoid any markup or scripting. + CACHEBYTEFMT(I18N_NOOP("%1 TiB")); + // i18n: Dumb message, avoid any markup or scripting. + CACHEBYTEFMT(I18N_NOOP("%1 GiB")); + // i18n: Dumb message, avoid any markup or scripting. + CACHEBYTEFMT(I18N_NOOP("%1 MiB")); + // i18n: Dumb message, avoid any markup or scripting. + CACHEBYTEFMT(I18N_NOOP("%1 KiB")); + // i18n: Dumb message, avoid any markup or scripting. + CACHEBYTEFMT(I18N_NOOP("%1 B")); + } + + #define BYTEFMT(unit, n) (d->byteSizeFmt[KLocalePrivate::unit].arg(n)) QString s; - // Gibi-byte - if ( size >= 1073741824.0 ) - { + if (size >= 1073741824.0) { size /= 1073741824.0; - if ( size > 1024 ) // Tebi-byte - s = i18n( "%1 TiB", formatNumber(size / 1024.0, 1)); - else - s = i18n( "%1 GiB", formatNumber(size, 1)); - } - // Mebi-byte - else if ( size >= 1048576.0 ) - { + if (size > 1024.0) { + s = BYTEFMT(TiB, formatNumber(size / 1024.0, 1)); + } else { + s = BYTEFMT(GiB, formatNumber(size, 1)); + } + } else if (size >= 1048576.0) { size /= 1048576.0; - s = i18n( "%1 MiB", formatNumber(size, 1)); - } - // Kibi-byte - else if ( size >= 1024.0 ) - { + s = BYTEFMT(MiB, formatNumber(size, 1)); + } else if (size >= 1024.0) { size /= 1024.0; - s = i18n( "%1 KiB", formatNumber(size, 1)); + s = BYTEFMT(KiB, formatNumber(size, 1)); + } else { + s = BYTEFMT(B, formatNumber(size, 0)); } - // Just byte - else if ( size > 0 ) - { - s = i18n( "%1 B", formatNumber(size, 0)); - } - // Nothing - else - { - s = i18n( "0 B" ); - } return s; }