diff options
Diffstat (limited to 'src/corelib/tools/qlocale_symbian.cpp')
-rw-r--r-- | src/corelib/tools/qlocale_symbian.cpp | 173 |
1 files changed, 111 insertions, 62 deletions
diff --git a/src/corelib/tools/qlocale_symbian.cpp b/src/corelib/tools/qlocale_symbian.cpp index 01f56cc20f..458bb2af85 100644 --- a/src/corelib/tools/qlocale_symbian.cpp +++ b/src/corelib/tools/qlocale_symbian.cpp @@ -46,8 +46,14 @@ #include <QThread> #include <e32std.h> +#include <e32const.h> +#include <e32base.h> +#include <e32property.h> +#include <bacntf.h> #include "private/qcore_symbian_p.h" - +#include "private/qcoreapplication_p.h" +#include "private/qlocale_p.h" +#include <qdebug.h> QT_BEGIN_NAMESPACE @@ -87,71 +93,75 @@ struct symbianToISO { /* - Mapping from Symbian to ISO locale + Mapping from Symbian to ISO locale. + NOTE: This array should be sorted by the first column! */ static const symbianToISO symbian_to_iso_list[] = { - { ELangEnglish, "en_GB" }, - { ELangFrench, "fr_FR" }, - { ELangGerman, "de_DE" }, - { ELangSpanish, "es_ES" }, - { ELangItalian, "it_IT" }, - { ELangSwedish, "sv_SE" }, - { ELangDanish, "da_DK" }, - { ELangNorwegian, "no_NO" }, - { ELangFinnish, "fi_FI" }, - { ELangAmerican, "en_US" }, - { ELangPortuguese, "pt_PT" }, - { ELangTurkish, "tr_TR" }, - { ELangIcelandic, "is_IS" }, - { ELangRussian, "ru_RU" }, - { ELangHungarian, "hu_HU" }, - { ELangDutch, "nl_NL" }, - { ELangBelgianFlemish, "nl_BE" }, - { ELangCzech, "cs_CZ" }, - { ELangSlovak, "sk_SK" }, - { ELangPolish, "pl_PL" }, - { ELangSlovenian, "sl_SI" }, - { ELangTaiwanChinese, "zh_TW" }, - { ELangHongKongChinese, "zh_HK" }, - { ELangPrcChinese, "zh_CN" }, - { ELangJapanese, "ja_JP" }, - { ELangThai, "th_TH" }, - { ELangArabic, "ar_AE" }, - { ELangTagalog, "tl_PH" }, - { ELangBulgarian, "bg_BG" }, - { ELangCatalan, "ca_ES" }, - { ELangCroatian, "hr_HR" }, - { ELangEstonian, "et_EE" }, - { ELangFarsi, "fa_IR" }, - { ELangCanadianFrench, "fr_CA" }, - { ELangGreek, "el_GR" }, - { ELangHebrew, "he_IL" }, - { ELangHindi, "hi_IN" }, - { ELangIndonesian, "id_ID" }, - { ELangLatvian, "lv_LV" }, - { ELangLithuanian, "lt_LT" }, - { ELangMalay, "ms_MY" }, - { ELangBrazilianPortuguese, "pt_BR" }, - { ELangRomanian, "ro_RO" }, - { ELangSerbian, "sr_RS" }, - { ELangLatinAmericanSpanish, "es" }, - { ELangUkrainian, "uk_UA" }, - { ELangUrdu, "ur_PK" }, // India/Pakistan - { ELangVietnamese, "vi_VN" }, + { ELangEnglish, "en_GB" }, // 1 + { ELangFrench, "fr_FR" }, // 2 + { ELangGerman, "de_DE" }, // 3 + { ELangSpanish, "es_ES" }, // 4 + { ELangItalian, "it_IT" }, // 5 + { ELangSwedish, "sv_SE" }, // 6 + { ELangDanish, "da_DK" }, // 7 + { ELangNorwegian, "no_NO" }, // 8 + { ELangFinnish, "fi_FI" }, // 9 + { ELangAmerican, "en_US" }, // 10 + { ELangPortuguese, "pt_PT" }, // 13 + { ELangTurkish, "tr_TR" }, // 14 + { ELangIcelandic, "is_IS" }, // 15 + { ELangRussian, "ru_RU" }, // 16 + { ELangHungarian, "hu_HU" }, // 17 + { ELangDutch, "nl_NL" }, // 18 + { ELangBelgianFlemish, "nl_BE" }, // 19 + { ELangCzech, "cs_CZ" }, // 25 + { ELangSlovak, "sk_SK" }, // 26 + { ELangPolish, "pl_PL" }, // 27 + { ELangSlovenian, "sl_SI" }, // 28 + { ELangTaiwanChinese, "zh_TW" }, // 29 + { ELangHongKongChinese, "zh_HK" }, // 30 + { ELangPrcChinese, "zh_CN" }, // 31 + { ELangJapanese, "ja_JP" }, // 32 + { ELangThai, "th_TH" }, // 33 + { ELangArabic, "ar_AE" }, // 37 + { ELangTagalog, "tl_PH" }, // 39 + { ELangBulgarian, "bg_BG" }, // 42 + { ELangCatalan, "ca_ES" }, // 44 + { ELangCroatian, "hr_HR" }, // 45 + { ELangEstonian, "et_EE" }, // 49 + { ELangFarsi, "fa_IR" }, // 50 + { ELangCanadianFrench, "fr_CA" }, // 51 + { ELangGreek, "el_GR" }, // 54 + { ELangHebrew, "he_IL" }, // 57 + { ELangHindi, "hi_IN" }, // 58 + { ELangIndonesian, "id_ID" }, // 59 + { ELangKorean, "ko_KO" }, // 65 + { ELangLatvian, "lv_LV" }, // 67 + { ELangLithuanian, "lt_LT" }, // 68 + { ELangMalay, "ms_MY" }, // 70 + { ELangNorwegianNynorsk, "nn_NO" }, // 75 + { ELangBrazilianPortuguese, "pt_BR" }, // 76 + { ELangRomanian, "ro_RO" }, // 78 + { ELangSerbian, "sr_RS" }, // 79 + { ELangLatinAmericanSpanish,"es_419" }, // 83 + { ELangUkrainian, "uk_UA" }, // 93 + { ELangUrdu, "ur_PK" }, // 94 - India/Pakistan + { ELangVietnamese, "vi_VN" }, // 96 #ifdef __E32LANG_H__ // 5.0 - { ELangBasque, "eu_ES" }, - { ELangGalician, "gl_ES" }, + { ELangBasque, "eu_ES" }, // 102 + { ELangGalician, "gl_ES" }, // 103 #endif #if !defined(__SERIES60_31__) - { ELangEnglish_Apac, "en" }, - { ELangEnglish_Taiwan, "en_TW" }, - { ELangEnglish_HongKong, "en_HK" }, - { ELangEnglish_Prc, "en_CN" }, - { ELangEnglish_Japan, "en_JP"}, - { ELangEnglish_Thailand, "en_TH" }, - { ELangMalay_Apac, "ms" } + { ELangEnglish_Apac, "en" }, // 129 + { ELangEnglish_Taiwan, "en_TW" }, // 157 ### Not supported by CLDR + { ELangEnglish_HongKong, "en_HK" }, // 158 + { ELangEnglish_Prc, "en_CN" }, // 159 ### Not supported by CLDR + { ELangEnglish_Japan, "en_JP"}, // 160 ### Not supported by CLDR + { ELangEnglish_Thailand, "en_TH" }, // 161 ### Not supported by CLDR + { ELangMalay_Apac, "ms" }, // 326 #endif + { 327/*ELangIndonesian_Apac*/,"id_ID" } // 327 - appeared in Symbian^3 }; /*! @@ -771,13 +781,18 @@ static QLocale::MeasurementSystem symbianMeasurementSystem() return QLocale::MetricSystem; } -QLocale QSystemLocale::fallbackLocale() const +void qt_symbianUpdateSystemPrivate() { // load system data before query calls + _s60Locale.LoadSystemSettings(); +} + +void qt_symbianInitSystemLocale() +{ static QBasicAtomicInt initDone = Q_BASIC_ATOMIC_INITIALIZER(0); + if (initDone == 2) + return; if (initDone.testAndSetRelaxed(0, 1)) { - _s60Locale.LoadSystemSettings(); - // Initialize platform version dependent function pointers ptrTimeFormatL = reinterpret_cast<FormatFunc> (qt_resolveS60PluginFunc(S60Plugin_TimeFormatL)); @@ -801,7 +816,10 @@ QLocale QSystemLocale::fallbackLocale() const } while(initDone != 2) QThread::yieldCurrentThread(); +} +QLocale QSystemLocale::fallbackLocale() const +{ TLanguage lang = User::Language(); QString locale = QLatin1String(qt_symbianLocaleName(lang)); return QLocale(locale); @@ -884,4 +902,35 @@ QVariant QSystemLocale::query(QueryType type, QVariant in = QVariant()) const return QVariant(); } +#if !defined(QT_NO_SYSTEMLOCALE) +QEnvironmentChangeNotifier::QEnvironmentChangeNotifier() +{ + // Create the change notifier and install the callback function + const TCallBack callback(&QEnvironmentChangeNotifier::localeChanged, this); + QT_TRAP_THROWING(iChangeNotifier = CEnvironmentChangeNotifier::NewL(CActive::EPriorityStandard, callback)); + iChangeNotifier->Start(); +} + +TInt QEnvironmentChangeNotifier::localeChanged(TAny *data) +{ + QEnvironmentChangeNotifier *that = reinterpret_cast<QEnvironmentChangeNotifier *>(data); + + TInt flag = that->iChangeNotifier->Change(); + if (flag & EChangesLocale) { + static bool first = true; + if (!first) { // skip the first notification on app startup + QT_TRYCATCH_LEAVING(QLocalePrivate::updateSystemPrivate()); + QT_TRYCATCH_LEAVING(QCoreApplication::postEvent(qApp, new QEvent(QEvent::LocaleChange))); + } + first = false; + } + return KErrNone; +} + +QEnvironmentChangeNotifier::~QEnvironmentChangeNotifier() +{ + delete iChangeNotifier; +} +#endif + QT_END_NAMESPACE |