[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    branches/KDE/4.3/kdelibs/kdecore/localization
From:       Chusslove Illich <caslav.ilic () gmx ! net>
Date:       2009-07-02 15:07:00
Message-ID: 1246547220.723782.14183.nullmailer () svn ! kde ! org
[Download RAW message or body]

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 <QtCore/QRegExp>
 #include <QtCore/QLocale>
 #include <QtCore/QHash>
+#include <QtCore/QMutexLocker>
 
 #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<QString> 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;
 }
 


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic