diff -r 16d8024aca5e -r f7ac710697a9 src/hbcore/i18n/hblanguageutil.cpp --- /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 +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(Q_OS_SYMBIAN) +#include +#include +#include +#include +#include +#include //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 readLanguageList() +{ + QHash 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 HbLanguageUtil::supportedLanguages() +{ +#if defined(Q_OS_SYMBIAN) + QHash languages; + + QTranslator translator; + if (!translator.load(TRANSLATOR_PATH)) { + return languages; + } + QCoreApplication::installTranslator(&translator); + QHash hashLanguageNames = readLanguageList(); + + CArrayFixFlat* 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 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 HbLanguageUtil::allLanguages() +{ +#if defined(Q_OS_SYMBIAN) + QHash langs; + + QTranslator translator; + if (!translator.load(TRANSLATOR_PATH)) { + return langs; + } + QCoreApplication::installTranslator(&translator); + + QHash languageNameList = readLanguageList(); + QHashIterator 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 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 +} +