src/hbcore/i18n/hblanguageutil.cpp
changeset 1 f7ac710697a9
child 2 06ff229162e9
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/hbcore/i18n/hblanguageutil.cpp	Mon May 03 12:48:33 2010 +0300
@@ -0,0 +1,275 @@
+/****************************************************************************
+**
+** 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 <QFile>
+#include <QLocale>
+#include <QTimer>
+#include <QHash>
+#include <QHashIterator>
+#include <QTextStream>
+#include <QTranslator>
+#include <QTextCodec>
+#include <QCoreApplication>
+
+#if defined(Q_OS_SYMBIAN)
+#include <e32lang.h>
+#include <e32property.h>
+#include <centralrepository.h> 
+#include <hal.h>
+#include <syslangutil.h>
+#include <CommonEngineDomainCRKeys.h> //Ui language
+#endif // Q_OS_SYMBIAN
+
+#include "hblanguageutil.h"
+#include "hbfeaturemanager_p.h"
+
+#if defined(Q_OS_SYMBIAN)
+#define LANGUAGE_LIST_FILE "/resource/hbi18n/translations/language_list.txt"
+#define LANGUAGE_ID_PREFIX "language_"
+#define TRANSLATOR_PATH "/resource/hbi18n/translations/languages"
+#endif // Q_OS_SYMBIAN
+
+/*!
+    @beta
+    @hbcore
+    \class HbLanguageUtil
+    \brief HbLanguageUtil provides functions for quering supported languages and switching the system language.
+*/
+
+#if defined(Q_OS_SYMBIAN)
+/*!
+    \brief Returns identifiers and localized names of all known languages.
+      
+    \return Localized names and integer identifiers of languages supported in a device  
+*/
+QHash<int, QString> readLanguageList()
+{
+    QHash<int, QString> hashLanguages;
+    QString path = "c:";
+    path += QString(LANGUAGE_LIST_FILE);
+    QFile* file = new QFile(path);
+    if (!file->exists() ) {
+        path = "z:";
+        path += QString(LANGUAGE_LIST_FILE);
+        delete file;
+        file = new QFile(path);
+    }
+    if (!file->open(QIODevice::ReadOnly | QIODevice::Text)) {
+        delete file;
+        return hashLanguages;
+    }
+    QTextStream in(file);
+    while (!in.atEnd()) {
+        QString line = in.readLine(256);
+        if (!line.isEmpty()) {
+            int sep = line.indexOf(',');
+            QString strCode = line.left(sep);
+            QString name = line.mid(sep+1);
+
+            bool ok;
+            int code = strCode.toUInt(&ok);
+            if (!ok) {
+                continue;
+            }
+            hashLanguages.insert(code, name);
+        }
+    }
+    delete file;
+    return hashLanguages;
+}
+#endif // Q_OS_SYMBIAN
+
+#if defined(Q_OS_SYMBIAN)
+
+/*!
+    \brief Changes the system UI language.
+      
+    \param language identifier of the language  
+*/
+bool setLocale( int language )
+{
+    TExtendedLocale dummy;
+    QString no;
+    no = QString( "%1" ).arg( language, 2, 10, QLatin1Char( '0' ) );
+    QString name = QString( "elocl." ).append( no );
+    TPtrC nameptr(name.utf16());
+    
+    TInt err = dummy.LoadLocale( nameptr );
+    if( err != KErrNone )
+        return false;
+    dummy.SaveSystemSettings();
+    // cause localeprivate update on next qlocale object( glp->m_language_id = 0 )
+    QSystemLocale dummy2;
+    return true;
+}
+#endif // Q_OS_SYMBIAN
+
+
+/*!
+    \brief Returns names and identifiers of supported languages in a phone.
+ 
+    Language names are localized according the language's native presentation.
+    Language ID's returned by this functions may be used as language parameter for changeLanguage(int language) function.
+    Language IDs and names are OS specific and may vary across the platforms and releases.
+     
+    \return Localized names and integer identifiers of languages supported in a device  
+*/
+QHash<int, QString> HbLanguageUtil::supportedLanguages()
+{
+#if defined(Q_OS_SYMBIAN)   
+    QHash<int, QString> languages; 
+    
+    QTranslator translator;
+    if (!translator.load(TRANSLATOR_PATH)) {
+        return languages;
+    } 
+    QCoreApplication::installTranslator(&translator);
+    QHash<int, QString> hashLanguageNames = readLanguageList();
+ 
+    CArrayFixFlat<TInt>* systemEpocLanguageCodes = 0;
+    TInt error = SysLangUtil::GetInstalledLanguages( systemEpocLanguageCodes );
+    if ( error != KErrNone ) {
+        delete systemEpocLanguageCodes;
+        return languages;
+    }
+    
+    for (int i = 0; i < systemEpocLanguageCodes->Count(); ++i) {
+        int code = systemEpocLanguageCodes->At(i);
+        QString id = QString(LANGUAGE_ID_PREFIX);
+        id += QString::number(code);
+        QString locName = hbTrId(id.toAscii().constData());
+        if (locName.isEmpty() || locName == id) {
+            locName = hashLanguageNames.value(code);
+        }
+        languages.insert(code, locName);
+    }
+    
+    delete systemEpocLanguageCodes;
+    return languages;
+#else 
+    QHash<int, QString> dummy;
+    return dummy;
+#endif
+}
+
+/*!
+    \brief Returns names and identifiers of all known languages.
+ 
+    Language names are localized according the language's native presentation.
+    Language ID's returned by this functions may be used as language parameter for changeLanguage(int language) function.
+    Language IDs and names are OS specific and may vary across the platforms and releases.
+     
+    \return Localized names and integer identifiers of known languages 
+*/
+QHash<int, QString> HbLanguageUtil::allLanguages()
+{
+#if defined(Q_OS_SYMBIAN)  
+    QHash<int, QString> langs; 
+    
+    QTranslator translator;
+    if (!translator.load(TRANSLATOR_PATH)) {
+        return langs;
+    } 
+    QCoreApplication::installTranslator(&translator);
+    
+    QHash<int, QString> languageNameList = readLanguageList();
+    QHashIterator<int, QString> i(languageNameList);
+    while (i.hasNext()) {
+        i.next();
+        int code = i.key();
+        QString id = QString(LANGUAGE_ID_PREFIX);
+        id += QString::number(code);
+        QString locName = hbTrId(id.toAscii().constData());
+        if (locName.isEmpty()) {
+            locName = i.value();
+        }
+        langs.insert(code, locName);
+    }
+    return langs;
+#else 
+    QHash<int, QString> dummy;
+    return dummy;
+#endif
+}
+
+/*!
+    \brief Changes the device system language.  
+  
+    \param identifier of language to set active
+    \return true if language change was successful
+*/ 
+bool HbLanguageUtil::changeLanguage( int language )
+{
+#if defined(Q_OS_SYMBIAN)
+    if ( !HbFeatureManager::instance()->featureStatus(HbFeatureManager::LanguageSwitch) ) {
+        return false;
+    }
+    
+    CRepository* commonEngineRepository = 0;
+    TRAPD( err1, commonEngineRepository = CRepository::NewL( KCRUidCommonEngineKeys ) );    
+    if ( err1 != KErrNone ) { 
+        return false;
+    }
+    
+    if (!setLocale(language)) {
+    		delete commonEngineRepository;
+        return false;
+    }
+        
+    // Never set Language code 0 to HAL
+    if ( language !=0 ) {
+        if ( HAL::Set( HAL::ELanguageIndex, language ) != KErrNone ) {
+            delete commonEngineRepository;
+            return false;
+        }
+    }
+    if ( commonEngineRepository->Set( KGSDisplayTxtLang, language ) != KErrNone ) {
+        delete commonEngineRepository;
+        return false;
+    }
+    delete commonEngineRepository;
+    return true;
+
+#else
+    Q_UNUSED(language);
+    return false;
+#endif
+}
+
+/*!
+    \brief Returns ID of current language. Localized name 
+  
+    \return identifier of current system language
+*/ 
+int HbLanguageUtil::currentLanguage()
+{
+    #if defined(Q_OS_SYMBIAN)
+        TLanguage l = User::Language();
+        return l;
+    #else 
+        return 0;
+    #endif
+}
+