src/hbcore/i18n/hbtranslator.cpp
changeset 7 923ff622b8b9
parent 6 c3690ec91ef8
child 21 4633027730f5
child 34 ed14f46c0e55
--- a/src/hbcore/i18n/hbtranslator.cpp	Wed Jun 23 18:33:25 2010 +0300
+++ b/src/hbcore/i18n/hbtranslator.cpp	Tue Jul 06 14:36:53 2010 +0300
@@ -33,12 +33,20 @@
 #include <hbtranslator.h>
 #include <hbtranslator_p.h>
 
+#if defined(Q_OS_SYMBIAN)
+    #define PLATFORM_WITH_DRIVES
+#elif defined(Q_OS_WIN32)
+    #define PLATFORM_WITH_DRIVES
+#else
+    #undef PLATFORM_WITH_DRIVES
+#endif
+
 #ifdef Q_OS_SYMBIAN
 const char* defaultPath   = "/resource/qt/translations/";
 const char* defaultDrive  = "Z:";
 const char* defaultCommon = "common_";
 #else
-const QString defaultPath = "";
+const char* defaultPath = "";
 const char* defaultDrive  = "";
 const char* defaultCommon = "common_";
 
@@ -89,12 +97,10 @@
                return false;
            }        
            // else continue
-        } 
-        else {
+        } else {
             if (err != KErrNone ) { // if some other error return error, don't look anymore
                 return false;
-            }
-            else {
+            } else {
                 break; // file was found
             }
         }
@@ -104,8 +110,7 @@
         err= fl.Open(fs, ptrFName, EFileShareReadersOrWriters | EFileRead | EFileStream );
         if (err == KErrNone) {
             break;
-        }
-        else {
+        } else {
             if (err != KErrNotFound) {
                 return false;
             }
@@ -119,7 +124,6 @@
             }    
         }
 
-        // no truncations? fail
         if (rightmost==0) {
             return false;
         }
@@ -151,15 +155,24 @@
 }
 
 /*!
-    @beta
+    @stable
     @hbcore
     \class HbTranslator
     \brief HbTranslator installs QTranslator(s) automatically needed in localisation
     and loads translation files into QTranslator.
+
+    Note: file name should be given without language and .qm postfix.
+    Eg. if English qm file name is testapp_en.qm
+    \code
+    HbTranslator trans("testapp");
+    \endcode
+    which loads correct testapp_xx.qm file from default location, where xx is postfix for current system locale, eg "en".
+
+    \sa hbTrId
 */
 
 /*!
-    Default case: searches translation file from default location (/resource/qt/translations/) with default name, which is EXECUTABLENAME.qm
+    Default case: searches translation file from default location (/resource/qt/translations/) with default name, which is EXECUTABLENAME_xx.qm
     
     \attention Cross-Platform API
 */
@@ -167,6 +180,8 @@
 {
     QFileInfo info(qApp->applicationFilePath());
     QString defaultName = info.baseName();  // defaultname = <executablename>
+    d->translatorPath=defaultPath;
+    d->translatorFile=defaultName;
     d->installTranslator(defaultPath, defaultName);
 }
 
@@ -177,6 +192,8 @@
 */
 HbTranslator::HbTranslator(const QString &file): d(new HbTranslatorPrivate())
 {
+    d->translatorPath=defaultPath;
+    d->translatorFile=file;    
     d->installTranslator(defaultPath, file);
 }
 
@@ -191,28 +208,71 @@
 */
 HbTranslator::HbTranslator(const QString &path, const QString &file): d(new HbTranslatorPrivate())
 {
+    d->translatorPath=defaultPath;
+    d->translatorFile=file;    
     d->installTranslator(path, file);
 }
 
+/*!
+    Destructor  
+*/ 
 HbTranslator::~HbTranslator()
 {
     delete d;
 }
 
+static bool commonTr = false;
+#include <QMutex>
+#include <QMutexLocker>
+Q_GLOBAL_STATIC_WITH_ARGS(QMutex, gs_CommonTrMutex, (QMutex::Recursive) )
+
 /*!
     Loads common.ts translations from default location.
     
     \attention Cross-Platform API
 */
 void HbTranslator::loadCommon()
-{    
-    QString lang = QLocale::system().name();
-    QString commonts = QString(defaultDrive) + QString(defaultPath) + QString(defaultCommon) + lang;
-    bool loaded;
-    loaded = loadTranslatorData(d->common, commonts, d->commonData);
-    if (loaded) {
-        qApp->installTranslator(&d->common);    
+{   
+    QMutexLocker ml(gs_CommonTrMutex());
+    if (!commonTr) {
+        QString lang = QLocale::system().name();
+        d->languageDowngrade(lang);    
+        QString commonts;
+        commonts += QString(defaultDrive);
+        commonts += QString(defaultPath);
+        commonts += QString(defaultCommon);
+        commonts += lang;
+#ifdef Q_OS_SYMBIAN        
+        toSymbianPath(commonts);
+#endif    
+        bool loaded;
+        uchar *commonData=0;
+        loaded = loadTranslatorData(d->common, commonts, d->commonData);
+        if (loaded) {
+            d->commonData = commonData;
+            d->commonTr=true;
+            qApp->installTranslator(&d->common);    
+            commonTr=true;
+        }
+    }    
+}
+
+/*!
+    Destructor  
+*/ 
+HbTranslatorPrivate::~HbTranslatorPrivate()
+{
+    qApp->removeTranslator(&translator);    
+    if (translatorData) {
+        delete [] translatorData;
     }
+    qApp->removeTranslator(&common);    
+    if (commonData) {        
+        delete [] commonData;
+    }
+    if (commonTr) {
+       ::commonTr=false;
+    }    
 }
 
 /*!
@@ -227,12 +287,18 @@
     QString lang2 = lang;
     languageDowngrade(lang);
     QString path(pth);
+    if (path.isNull() || path.isEmpty()) {
+        return;
+    }
     if (path.at(0) == ':') {
         QString tsfile = path + name + QString("_") + lang;
-        translator.load(tsfile);
-        qApp->installTranslator(&translator);
+        if ( translator.load(tsfile) ) {
+            qApp->installTranslator(&translator);
+        }
         return;
     }
+    
+#ifdef PLATFORM_WITH_DRIVES
 #ifdef Q_OS_SYMBIAN        
     toSymbianPath(path);
 #endif    
@@ -277,6 +343,12 @@
     if (loaded) {
         qApp->installTranslator(&translator);
     }
+#else    
+    QString tsfile2 = path + name + QString("_") + lang;
+    if ( translator.load(tsfile2) ) {
+        qApp->installTranslator(&translator);
+    }
+#endif    
 }
 
 /*!
@@ -288,6 +360,9 @@
     LanguageHash();    
 };
 
+/*!
+    Table for downgrade.  
+*/ 
 LanguageHash::LanguageHash(){
     (*this)["en_GB"] = "en";
     (*this)["fr_FR"] = "fr";
@@ -333,7 +408,7 @@
     (*this)["pt_BR"] = "pt_BR";
     (*this)["ro_RO"] = "ro";
     (*this)["sr_YU"] = "sr";
-    (*this)["es_MX"] = "es_MX"; //!!
+    (*this)["es_MX"] = "es_MX";
     (*this)["uk_UA"] = "uk";
     (*this)["ur_PK"] = "ur";
     (*this)["vi_VN"] = "vi";