src/hbcore/devicedialogbase/hbtextresolversymbian.cpp
changeset 0 16d8024aca5e
child 1 f7ac710697a9
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/hbcore/devicedialogbase/hbtextresolversymbian.cpp	Mon Apr 19 14:02:13 2010 +0300
@@ -0,0 +1,530 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (developer.feedback@nokia.com)
+**
+** This file is part of the HbCore module of the UI Extensions for Mobile.
+**
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this file.
+** Please review the following information to ensure the GNU Lesser General
+** Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at developer.feedback@nokia.com.
+**
+****************************************************************************/
+
+#include "hbtextresolversymbian.h"
+#include <hbsymbianvariant.h>
+#include <e32des16.h>
+#include <QByteArray>
+#include <QTranslator>
+#include <QString>
+#include <QDebug>
+#include <QFile>
+#include <QTextStream>
+
+class HbTextResolverSymbianPrivate: public CBase
+    {
+public:
+    HbTextResolverSymbianPrivate();    
+    virtual ~HbTextResolverSymbianPrivate();
+    static HbTextResolverSymbianPrivate* Instance();
+    TBool LoadTranslationFile();
+    TBool Initialize(const TDesC& aFilename, const TDesC& aPath);
+    HBufC* LoadLC(const TDesC& aMessageId, TInt aPlural); // Simple string. + %n message(s). Plural and replaces all occurances of %n in the string.
+    HBufC* LoadLC(const TDesC& aMessageId, const TDesC& aString, TInt aPlural); // One and %1. %n and %1. Plural and replaces all occurances of %n in the string.
+    HBufC* LoadLC(const TDesC& aMessageId, const MDesCArray& aStrings, TInt aPlural);
+    HBufC* LoadLC(const TDesC& aMessageId, TInt aInt, TInt aPlural);
+    HBufC* LoadLC(const TDesC& aMessageId, const RArray<TInt>& aInts, TInt aPlural);    
+        
+    QString ConvertToQString(const TDesC& aMessageId, TInt aPlural = -1);
+    QTranslator iTranslator;
+    QByteArray iByteArray;
+    TBool iLoaded; 
+    QString fileName;
+    QString path;        	      
+    };
+
+Q_GLOBAL_STATIC(HbTextResolverSymbianPrivate, hbTextResolverSymbianPrivate)
+
+HbTextResolverSymbianPrivate* HbTextResolverSymbianPrivate::Instance()
+    {
+    HbTextResolverSymbianPrivate* resolver = hbTextResolverSymbianPrivate();
+    return resolver;         
+    }
+    
+static void replacePercentN(QString *result, int n)
+{
+    if (n >= 0) {
+        int percentPos = 0;
+        int len = 0;
+        while ((percentPos = result->indexOf(QLatin1Char('%'), percentPos + len)) != -1) {
+            len = 1;
+            QString fmt;
+            if (result->at(percentPos + len) == QLatin1Char('L')) {
+                ++len;
+                fmt = QLatin1String("%L1");
+            } else {
+                fmt = QLatin1String("%1");
+            }
+            if (result->at(percentPos + len) == QLatin1Char('n')) {
+                fmt = fmt.arg(n);
+                ++len;
+                result->replace(percentPos, len, fmt);
+                len = fmt.length();
+            }
+        }
+    }
+}
+
+HbTextResolverSymbianPrivate::HbTextResolverSymbianPrivate()
+    {        
+    }
+    
+HbTextResolverSymbianPrivate::~HbTextResolverSymbianPrivate()
+    {
+    }
+
+TBool HbTextResolverSymbianPrivate::LoadTranslationFile()
+    {
+    QString locale = QLocale::system().name();        
+    return iTranslator.load(fileName + locale, path);                
+    }     
+
+TBool HbTextResolverSymbianPrivate::Initialize(const TDesC& aFilename, const TDesC& aPath)
+    {
+    fileName = QString::fromUtf16(aFilename.Ptr(), aFilename.Length());
+    path = QString::fromUtf16(aPath.Ptr(), aPath.Length());
+    return LoadTranslationFile();  
+    }
+       
+HBufC* HbTextResolverSymbianPrivate::LoadLC(const TDesC& aMessageId, TInt aPlural)
+    {
+    QString string = ConvertToQString(aMessageId, aPlural);
+        
+    TPtrC descriptor(static_cast<const TUint16*>(string.utf16()),
+                    string.length());
+    return descriptor.AllocLC();
+    }
+ 
+HBufC* HbTextResolverSymbianPrivate::LoadLC(const TDesC& aMessageId, const TDesC& aString, TInt aPlural)
+    {
+    QString string = ConvertToQString(aMessageId, aPlural);
+    QString result = ConvertToQString(aString);
+    
+    if (result.isEmpty())
+        {
+        result = QString::fromUtf16(aString.Ptr(), aString.Length());
+        }
+    string = string.arg(result);     
+    TPtrC descriptor(static_cast<const TUint16*>(string.utf16()),
+                    string.length());
+    return descriptor.AllocLC();       
+    }
+
+HBufC* HbTextResolverSymbianPrivate::LoadLC(const TDesC& aMessageId, const MDesCArray& aStrings, TInt aPlural)
+    {
+    QString string = ConvertToQString(aMessageId, aPlural);
+    
+    QString tmp;
+    for (int i(0); i < aStrings.MdcaCount(); i++)
+        {
+        TPtrC ptr = aStrings.MdcaPoint(i);
+        tmp = ConvertToQString(ptr);
+        
+        if (tmp.isEmpty() == 0)
+            {
+            tmp = QString::fromUtf16(ptr.Ptr(), ptr.Length());
+            }
+        
+        bool ok(false);
+        int conv = tmp.toInt(&ok); 
+
+        if (ok) 
+            {   
+            string = string.arg(conv);	
+            } 
+        else
+            {
+            string = string.arg(tmp);
+            }
+        }            
+    TPtrC descriptor(static_cast<const TUint16*>(string.utf16()),
+                    string.length());
+    return descriptor.AllocLC();
+    }
+       
+HBufC* HbTextResolverSymbianPrivate::LoadLC(const TDesC& aMessageId, TInt aInt, TInt aPlural)
+    {
+    QString string = ConvertToQString(aMessageId, aPlural);       
+    string = string.arg(aInt); 
+    
+    TPtrC descriptor(static_cast<const TUint16*>(string.utf16()),
+                    string.length());
+    return descriptor.AllocLC(); 
+    }    
+        
+HBufC* HbTextResolverSymbianPrivate::LoadLC(const TDesC& aMessageId, const RArray<TInt>& aInts, TInt aPlural)
+    {
+    QString string = ConvertToQString(aMessageId, aPlural);
+    
+    for (int i(0); i < aInts.Count(); i++)
+        {                              
+        string = string.arg(aInts[i]);
+        }            
+             
+    TPtrC descriptor(static_cast<const TUint16*>(string.utf16()),
+                    string.length());
+    return descriptor.AllocLC();
+    }
+        
+QString HbTextResolverSymbianPrivate::ConvertToQString(const TDesC& aMessageId, TInt aPlural)
+    {        
+    QString result = QString::fromUtf16(aMessageId.Ptr(), aMessageId.Length());
+    iByteArray = result.toLatin1();
+    const char* tmp = iByteArray.data();        
+
+    QString string;
+    if (aPlural == -1)
+        {        
+        string = iTranslator.translate(0, tmp, 0);           
+        }
+    else
+        {
+        string = iTranslator.translate(0, tmp, 0, aPlural);
+        }
+
+    if (string.isEmpty()) 
+        {
+        string = result;
+        }
+    replacePercentN(&string, aPlural);
+    return string;
+    }
+
+/*!
+    \class HbTextResolverSymbian
+    \brief HbTextResolverSymbian implements translation support for Symbian OS applications.
+    
+    HbTextResolverSymbian is class that provides convinience API for translation support and
+    is meant to be used only by pure Symbian OS applications. Dynamic strings and plurals are
+    also supported. 
+    
+    Before using the translation support HbTextResolverSymbian must be initialized. Note that 
+    the filename must not have language specific suffix, because that is handled internally by
+    HbTextResolverSymbian.
+    
+    \code
+    _LIT(KSomeFile, "somefile_");
+    _LIT(KPath, "c:\\resource");
+    
+    TBool result = HbTextResolverSymbian::Init(KSomeFile, KPath);
+    \endcode
+    
+    Translating a string given the snippet from a translation file (.ts) below:
+    ...
+    \code
+    <message id="text_test">
+        <source>Test</source>
+        <translation>Text test</translation>
+    </message>
+    
+
+    _LIT(KTextTest, "text_test");
+    // returns the string "Text test"
+    HBufC* tmp = HbTextResolverSymbian::LoadL(KTextTest);
+    \endcode
+    
+    Translating a string with replacement string given the snippet from a translation
+    file below:
+    
+    \code
+    <message id="text_test2">
+        <source>Test2</source>
+        <translation>Test2 %1</translation>
+    </message>
+    
+    
+    _LIT(KTextTest2, "text_test2");
+    _LIT(KTextTestReplace,"passed.");
+    // returns the string "Test2 passed." 
+    HBufC* tmp = HbTextResolverSymbian::LoadL(KTextTest2, KTextTestReplace);
+    \endcode
+   
+    Translating a string with replacement strings given the snippet from a translation
+    file below:
+    
+    \code
+    <message id="text_test3">
+        <source>Test3</source>
+        <translation>Test3 %1 %2</translation>
+    </message>
+    
+    
+    _LIT(KTextTest3, "text_test3");
+    _LIT(KTextTest3Replace1,"is");
+    _LIT(KTextTest3Replace2,"passed.");
+    
+    CDesC16ArrayFlat* array = new CDesC16ArrayFlat(8);
+    TBufC<20> buffer;
+    buffer = KTextTest3Replace1;
+    array->AppendL(buffer);
+    buffer = KTextTest3Replace2;
+    array->AppendL(buffer);
+    // returns the string "Test3 is passed."
+    HBufC* tmp = HbTextResolverSymbian::LoadL(KTextTest3, *array);
+   \endcode       
+   
+   Note: String e.g. "Moving %1 files of %2 from %3" where place markers %1 and %2 are
+   for integer values and the %3 is for a string, requires that the integers are converted
+   to descriptors and appended to MDesArray. Those are converted back to integers during 
+   replacement.
+   
+   Translating a string with replacement integer given the snippet from a translation
+   file below:
+   \code
+    </message>
+        <message id="text_test4" numerus="yes">
+        <source>Test4</source>
+        <translation>
+        <numerusform>%n message of %1</numerusform>
+        <numerusform>%n messages of %1</numerusform>
+        </translation>
+    </message>
+    
+    
+    _LIT(KTextTest4, "text_test4");
+    // returns the string "1 message of 5"
+    HBufC* tmp = HbTextResolverSymbian::LoadL(KTextTest4, 5, 1);
+    // // returns the string "2 messages of 5"
+    tmp = HbTextResolverSymbian::LoadL(KTextTest4, 5, 2);
+    \endcode
+    
+    Translating a string with replacement integers given the snippet from a translation
+    file below:
+    \code
+    <message id="text_test3">
+        <source>Test3</source>
+        <translation>Test3 %1 %2</translation>
+    </message>
+    
+    
+    RArray<TInt> intarray;
+    intarray.Append(20);
+    intarray.Append(30);
+    
+    HBufC* tmp = HbTextResolverSymbian::LoadL(KTextTest3, intarray, 1);
+    \endcode
+    
+*/
+
+/*!
+    Initializes the translator. 
+        
+    \param aFilename specifies the used translation file. 
+    \param aPath specifies path to translation file.
+    
+    Returns ETrue if initialization was succesful.     
+*/
+EXPORT_C TBool HbTextResolverSymbian::Init(const TDesC& aFilename, const TDesC& aPath)
+    {
+    HbTextResolverSymbianPrivate* resolver = HbTextResolverSymbianPrivate::Instance();
+    return resolver->Initialize(aFilename, aPath);
+    }    
+
+/*!
+    Translates the string. 
+    If aPlural is equal to zero or greater, then the translation depending on the 
+    value is returned. Returns a pointer to a heap descriptor containing the translated
+    string.  
+    If the string for passed \a aMessageId is not found from the translation file then 
+    the source string is returned. 
+        
+    \param aMessageId Identifier of the string to be translated.
+    \param aPlural Specifies the plural format of the translation.    
+*/
+EXPORT_C HBufC* HbTextResolverSymbian::LoadL(const TDesC& aMessageId, TInt aPlural)
+    {
+    HbTextResolverSymbianPrivate* resolver = HbTextResolverSymbianPrivate::Instance();    
+    HBufC* buf = resolver->LoadLC(aMessageId, aPlural);
+    CleanupStack::Pop(buf);        
+    return buf;
+    }
+
+/*!
+    Translates the string and replaces the lowest place marker with the replacement string. 
+    If \a aPlural is equal to zero or greater, then translation depending on the value
+    is returned. Returns a pointer to a heap descriptor containing the formatted string.
+    If the string for passed \a aMessageId or \a aString is not found from the translation
+    file then the source string is used. 
+        
+    \param aMessageId Identifier of the string to be translated.
+    \param aString Replacement string for the lowest %N.
+    \param aPlural Specifies the plural format of the translation.   
+*/       
+EXPORT_C HBufC* HbTextResolverSymbian::LoadL(const TDesC& aMessageId, const TDesC& aString, TInt aPlural)
+    {
+    HbTextResolverSymbianPrivate* resolver = HbTextResolverSymbianPrivate::Instance();
+    HBufC* buf = resolver->LoadLC(aMessageId, aString, aPlural);
+    CleanupStack::Pop(buf);    
+    return buf;    
+    } 
+
+/*!
+    Translates the string and replaces place markers from the lowest place marker with the 
+    replacement strings provided in the array. 
+    If \a aPlural is equal to zero or greater, then translation depending on the value
+    is returned. Returns a pointer to a heap descriptor containing the formatted string.
+    If the string for passed \a aMessageId or \a aStrings are not found from the translation
+    file then the source string is used.      
+        
+    \param aMessageId Identifier of the string to be translated.
+    \param aStrings Replacement strings for the place markers.
+    \param aPlural Specifies the plural format of the translation.   
+*/          
+EXPORT_C HBufC* HbTextResolverSymbian::LoadL(const TDesC& aMessageId, const MDesCArray& aStrings, TInt aPlural)
+    {
+    HbTextResolverSymbianPrivate* resolver = HbTextResolverSymbianPrivate::Instance();
+    HBufC* buf = resolver->LoadLC(aMessageId, aStrings, aPlural);
+    CleanupStack::Pop(buf);
+    return buf; 
+    }
+
+/*!
+    Translates the string and replaces the lowest place marker with the replacement integer. 
+    If \a aPlural is equal to zero or greater, then translation depending on the value
+    is returned. Returns a pointer to a heap descriptor containing the formatted string.
+    If the string for passed \a aMessageId is not found from the translation
+    file then the source string is used. 
+        
+    \param aMessageId Identifier of the string to be translated.
+    \param aInt Replacement integer for the lowest place marker %(index).
+    \param aPlural Specifies the plural format of the translation.   
+*/    
+EXPORT_C HBufC* HbTextResolverSymbian::LoadL(const TDesC& aMessageId, TInt aInt, TInt aPlural)
+    {
+    HbTextResolverSymbianPrivate* resolver = HbTextResolverSymbianPrivate::Instance();
+    HBufC* buf = resolver->LoadLC(aMessageId, aInt, aPlural);      
+    CleanupStack::Pop(buf);
+    return buf;     
+    } 
+
+/*!
+    Translates the string and replaces place markers from the lowest place marker with the 
+    replacement integers provided in the array. 
+    If \a aPlural is equal to zero or greater, then translation depending on the value
+    is returned. Returns a pointer to a heap descriptor containing the formatted string.
+    If the string for passed \a aMessageId is not found from the translation
+    file then the source string is used.
+           
+    \param aMessageId Identifier of the string to be translated.
+    \param aInts Replacement integers for the place markers.
+    \param aPlural Specifies the plural format of the translation.   
+*/         
+EXPORT_C HBufC* HbTextResolverSymbian::LoadL(const TDesC& aMessageId, const RArray<TInt>& aInts, TInt aPlural)
+    {
+    HbTextResolverSymbianPrivate* resolver = HbTextResolverSymbianPrivate::Instance();
+    HBufC* buf = resolver->LoadLC(aMessageId, aInts, aPlural);
+    CleanupStack::Pop(buf);    
+    return buf;
+    }
+
+/*!
+    Translates the string. 
+    If aPlural is equal to zero or greater, then the translation depending on the 
+    value is returned. Returns a pointer to a heap descriptor containing the translated
+    string. Pointer is pushed to cleanup stack.  
+    If the string for passed \a aMessageId is not found from the translation file then 
+    the source string is returned. 
+        
+    \param aMessageId Identifier of the string to be translated.
+    \param aPlural Specifies the plural format of the translation.    
+*/     
+EXPORT_C HBufC* HbTextResolverSymbian::LoadLC(const TDesC& aMessageId, TInt aPlural)
+    {
+    HbTextResolverSymbianPrivate* resolver = HbTextResolverSymbianPrivate::Instance();
+    return resolver->LoadLC(aMessageId, aPlural);       
+    }
+
+/*!
+    Translates the string and replaces the lowest place marker with the replacement string. 
+    If \a aPlural is equal to zero or greater, then translation depending on the value
+    is returned. Returns a pointer to a heap descriptor containing the formatted string. 
+    Pointer is pushed to cleanup stack.
+    If the string for passed \a aMessageId or \a aString is not found from the translation
+    file then the source string is used. 
+        
+    \param aMessageId Identifier of the string to be translated.
+    \param aString Replacement string for the lowest %N.
+    \param aPlural Specifies the plural format of the translation.   
+*/         
+EXPORT_C HBufC* HbTextResolverSymbian::LoadLC(const TDesC& aMessageId, const TDesC& aString, TInt aPlural)
+    {
+    HbTextResolverSymbianPrivate* resolver = HbTextResolverSymbianPrivate::Instance();
+    return resolver->LoadLC(aMessageId, aString, aPlural);
+    }
+
+/*!
+    Translates the string and replaces place markers from the lowest place marker with the 
+    replacement strings provided in the array. 
+    If \a aPlural is equal to zero or greater, then translation depending on the value
+    is returned. Returns a pointer to a heap descriptor containing the formatted string.
+    Pointer is pushed to cleanup stack.
+    If the string for passed \a aMessageId or \a aStrings are not found from the translation
+    file then the source string is used.
+        
+    \param aMessageId Identifier of the string to be translated.
+    \param aStrings Replacement strings for the place markers.
+    \param aPlural Specifies the plural format of the translation.   
+*/
+EXPORT_C HBufC* HbTextResolverSymbian::LoadLC(const TDesC& aMessageId, const MDesCArray& aStrings, TInt aPlural)
+    {
+    HbTextResolverSymbianPrivate* resolver = HbTextResolverSymbianPrivate::Instance();
+    return resolver->LoadLC(aMessageId, aStrings, aPlural);
+    }
+
+/*!
+    Translates the string and replaces the lowest place marker with the replacement integer. 
+    If \a aPlural is equal to zero or greater, then translation depending on the value
+    is returned. Returns a pointer to a heap descriptor containing the formatted string.
+    If the string for passed \a aMessageId is not found from the translation
+    file then the source string is used. 
+        
+    \param aMessageId Identifier of the string to be translated.
+    \param aInt Replacement integer for the lowest place marker %(index).
+    \param aPlural Specifies the plural format of the translation.   
+*/ 
+EXPORT_C HBufC* HbTextResolverSymbian::LoadLC(const TDesC& aMessageId, TInt aInt, TInt aPlural)
+    {
+    HbTextResolverSymbianPrivate* resolver = HbTextResolverSymbianPrivate::Instance();   
+    return resolver->LoadLC(aMessageId, aInt, aPlural);
+    }
+
+/*!
+    Translates the string and replaces place markers from the lowest place marker with the 
+    replacement integers provided in the array. 
+    If \a aPlural is equal to zero or greater, then translation depending on the value
+    is returned. Returns a pointer to a heap descriptor containing the formatted string.
+    If the string for passed \a aMessageId is not found from the translation
+    file then the source string is used.
+           
+    \param aMessageId Identifier of the string to be translated.
+    \param aInts Replacement integers for the place markers.
+    \param aPlural Specifies the plural format of the translation.   
+*/            
+EXPORT_C HBufC* HbTextResolverSymbian::LoadLC(const TDesC& aMessageId, const RArray<TInt>& aInts, TInt aPlural)
+    {
+    HbTextResolverSymbianPrivate* resolver = HbTextResolverSymbianPrivate::Instance();
+    return resolver->LoadLC(aMessageId, aInts, aPlural);
+    }
+