File indexing completed on 2024-04-21 03:54:19

0001 /*
0002     This file is part of the kholidays library.
0003 
0004     SPDX-FileCopyrightText: 2001 Cornelius Schumacher <schumacher@kde.org>
0005     SPDX-FileCopyrightText: 2004-2020 Allen Winter <winter@kde.org>
0006     SPDX-FileCopyrightText: 2008 David Jarvie <djarvie@kde.org>
0007     SPDX-FileCopyrightText: 2010 John Layt <john@layt.net>
0008 
0009     SPDX-License-Identifier: LGPL-2.0-or-later
0010 */
0011 
0012 #include "holidayregion.h"
0013 
0014 #include <QCoreApplication>
0015 #include <QDirIterator>
0016 #include <QFile>
0017 #include <QFileInfo>
0018 #include <QLocale>
0019 #include <QSharedData>
0020 #include <QStandardPaths>
0021 
0022 #include "holiday_p.h"
0023 #include "parsers/plan2/holidayparserdriverplan_p.h"
0024 
0025 using namespace KHolidays;
0026 
0027 static void initResources()
0028 {
0029     static bool initDone = false;
0030     if (!initDone) {
0031         Q_INIT_RESOURCE(holidays);
0032         initDone = true;
0033     }
0034 }
0035 
0036 static QStringList allHolidayFiles(const QString &location = QString())
0037 {
0038     initResources();
0039     QStringList dirs{QStringLiteral(":/org.kde.kholidays/plan2")};
0040     dirs += QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, //
0041                                       QStringLiteral("kf5/libkholidays/plan2"),
0042                                       QStandardPaths::LocateDirectory);
0043     QStringList files;
0044     for (const QString &dir : std::as_const(dirs)) {
0045         QDirIterator it(dir, QStringList() << QStringLiteral("holiday_") + location + '*');
0046         while (it.hasNext()) {
0047             files.push_back(it.next());
0048         }
0049     }
0050     return files;
0051 }
0052 
0053 namespace KHolidays
0054 {
0055 class HolidayRegionPrivate : public QSharedData
0056 {
0057 public:
0058     explicit HolidayRegionPrivate(const QString &regionCode)
0059         : mDriver(nullptr)
0060         , mRegionCode(regionCode)
0061     {
0062         if (!mRegionCode.isEmpty()) {
0063             auto file = QStandardPaths::locate(QStandardPaths::GenericDataLocation, //
0064                                                QLatin1String("kf5/libkholidays/plan2/holiday_") + mRegionCode);
0065             if (!file.isEmpty()) {
0066                 mHolidayFile.setFile(file);
0067             } else {
0068                 initResources();
0069                 file = QStringLiteral(":/org.kde.kholidays/plan2/holiday_") + mRegionCode;
0070                 if (QFile::exists(file)) {
0071                     mHolidayFile.setFile(file);
0072                 }
0073             }
0074         }
0075 
0076         init();
0077     }
0078 
0079     explicit HolidayRegionPrivate(const QFileInfo &regionFile)
0080         : mDriver(nullptr)
0081         , mHolidayFile(regionFile)
0082     {
0083         init();
0084     }
0085 
0086     ~HolidayRegionPrivate()
0087     {
0088         delete mDriver;
0089     }
0090 
0091     void init()
0092     {
0093         if (mHolidayFile.exists()) {
0094             mDriver = new HolidayParserDriverPlan(mHolidayFile.absoluteFilePath());
0095             if (mDriver) {
0096                 if (mRegionCode.isEmpty()) {
0097                     if (mHolidayFile.fileName().startsWith(QLatin1String("holiday_"))) {
0098                         mRegionCode = mHolidayFile.fileName().mid(8);
0099                     } else {
0100                         mRegionCode = mHolidayFile.fileName();
0101                     }
0102                 }
0103 
0104             } else {
0105                 mRegionCode.clear();
0106             }
0107         } else {
0108             mRegionCode.clear();
0109         }
0110     }
0111 
0112     HolidayParserDriver *mDriver; // The parser driver for the holiday file
0113     QString mRegionCode; // region code of holiday region
0114     QFileInfo mHolidayFile; // file containing holiday data, or null
0115 };
0116 }
0117 
0118 HolidayRegion::HolidayRegion(const QString &regionCode)
0119     : d(new HolidayRegionPrivate(regionCode))
0120 {
0121 }
0122 
0123 HolidayRegion::HolidayRegion(const QFileInfo &regionFile)
0124     : d(new HolidayRegionPrivate(regionFile))
0125 {
0126 }
0127 
0128 HolidayRegion::HolidayRegion(const HolidayRegion &) = default;
0129 HolidayRegion::HolidayRegion(HolidayRegion &&) = default;
0130 HolidayRegion::~HolidayRegion() = default;
0131 
0132 HolidayRegion &HolidayRegion::operator=(const HolidayRegion &) = default;
0133 HolidayRegion &HolidayRegion::operator=(HolidayRegion &&) = default;
0134 
0135 QStringList HolidayRegion::regionCodes()
0136 {
0137     const QStringList files = allHolidayFiles();
0138 
0139     QStringList regionCodesList;
0140     regionCodesList.reserve(files.count());
0141     for (const QString &filename : files) {
0142         regionCodesList.append(filename.mid(filename.lastIndexOf(QLatin1String("holiday_")) + 8));
0143     }
0144 
0145     std::sort(regionCodesList.begin(), regionCodesList.end());
0146     return regionCodesList;
0147 }
0148 
0149 QString HolidayRegion::regionCode() const
0150 {
0151     return d->mRegionCode;
0152 }
0153 
0154 QString HolidayRegion::countryCode() const
0155 {
0156     return d->mDriver->fileCountryCode();
0157 }
0158 
0159 QString HolidayRegion::countryCode(const QString &regionCode)
0160 {
0161     HolidayRegion temp(regionCode);
0162     if (temp.isValid()) {
0163         return temp.countryCode();
0164     } else {
0165         return QString();
0166     }
0167 }
0168 
0169 QString HolidayRegion::languageCode() const
0170 {
0171     return d->mDriver->fileLanguageCode();
0172 }
0173 
0174 QString HolidayRegion::languageCode(const QString &regionCode)
0175 {
0176     HolidayRegion temp(regionCode);
0177     if (temp.isValid()) {
0178         return temp.languageCode();
0179     } else {
0180         return QString();
0181     }
0182 }
0183 
0184 QString HolidayRegion::name() const
0185 {
0186     QString tempName = d->mDriver->fileName();
0187 
0188     if (tempName.isEmpty()) {
0189         QStringList countryParts = countryCode().toLower().split(QLatin1Char('-'));
0190         const QString &country = countryParts.at(0);
0191         QString regionName;
0192         QString typeName;
0193 
0194         if (country != QLatin1String("xx")) {
0195             if (countryParts.count() == 2) {
0196                 // Temporary measure to get regions translated, only those files that already exist
0197                 // In 4.6 hope to have isocodes project integration for translations via KLocale
0198                 const QString &subdivision = countryParts.at(1);
0199                 if (country == QLatin1String("ca") && subdivision == QLatin1String("qc")) {
0200                     regionName = QCoreApplication::translate("HolidayRegion", "Quebec", "Canadian region");
0201                 } else if (country == QLatin1String("de")) {
0202                     if (subdivision == QLatin1String("by")) {
0203                         regionName = QCoreApplication::translate("HolidayRegion", "Germany, Bavaria", "German region");
0204                     } else if (subdivision == QLatin1String("bb")) {
0205                         regionName = QCoreApplication::translate("HolidayRegion", "Germany, Brandenburg", "German region");
0206                     } else if (subdivision == QLatin1String("be")) {
0207                         regionName = QCoreApplication::translate("HolidayRegion", "Germany, Berlin", "German region");
0208                     } else if (subdivision == QLatin1String("bw")) {
0209                         regionName = QCoreApplication::translate("HolidayRegion", "Germany, Baden-Wuerttemberg", "German region");
0210                     } else if (subdivision == QLatin1String("he")) {
0211                         regionName = QCoreApplication::translate("HolidayRegion", "Germany, Hesse", "German region");
0212                     } else if (subdivision == QLatin1String("mv")) {
0213                         regionName = QCoreApplication::translate("HolidayRegion", "Germany, Mecklenburg-Hither Pomerania", "German region");
0214                     } else if (subdivision == QLatin1String("ni")) {
0215                         regionName = QCoreApplication::translate("HolidayRegion", "Germany, Lower Saxony", "German region");
0216                     } else if (subdivision == QLatin1String("nw")) {
0217                         regionName = QCoreApplication::translate("HolidayRegion", "Germany, North Rhine-Westphalia", "German region");
0218                     } else if (subdivision == QLatin1String("rp")) {
0219                         regionName = QCoreApplication::translate("HolidayRegion", "Germany, Rhineland-Palatinate", "German region");
0220                     } else if (subdivision == QLatin1String("sh")) {
0221                         regionName = QCoreApplication::translate("HolidayRegion", "Germany, Schleswig-Holstein", "German region");
0222                     } else if (subdivision == QLatin1String("sl")) {
0223                         regionName = QCoreApplication::translate("HolidayRegion", "Germany, Saarland", "German region");
0224                     } else if (subdivision == QLatin1String("sn")) {
0225                         regionName = QCoreApplication::translate("HolidayRegion", "Germany, Saxony", "German region");
0226                     } else if (subdivision == QLatin1String("st")) {
0227                         regionName = QCoreApplication::translate("HolidayRegion", "Germany, Saxony-Anhalt", "German region");
0228                     } else if (subdivision == QLatin1String("th")) {
0229                         regionName = QCoreApplication::translate("HolidayRegion", "Germany, Thuringia", "German region");
0230                     }
0231                 } else if (country == QLatin1String("es") && subdivision == QLatin1String("ct")) {
0232                     regionName = QCoreApplication::translate("HolidayRegion", "Catalonia", "Spanish region");
0233                 } else if (country == QLatin1String("gb") && subdivision == QLatin1String("eaw")) {
0234                     regionName = QCoreApplication::translate("HolidayRegion", "England and Wales", "UK Region");
0235                 } else if (country == QLatin1String("gb") && subdivision == QLatin1String("eng")) {
0236                     regionName = QCoreApplication::translate("HolidayRegion", "England", "UK Region");
0237                 } else if (country == QLatin1String("gb") && subdivision == QLatin1String("wls")) {
0238                     regionName = QCoreApplication::translate("HolidayRegion", "Wales", "UK Region");
0239                 } else if (country == QLatin1String("gb") && subdivision == QLatin1String("sct")) {
0240                     regionName = QCoreApplication::translate("HolidayRegion", "Scotland", "UK Region");
0241                 } else if (country == QLatin1String("gb") && subdivision == QLatin1String("nir")) {
0242                     regionName = QCoreApplication::translate("HolidayRegion", "Northern Ireland", "UK Region");
0243                 } else if (country == QLatin1String("it") && subdivision == QLatin1String("bz")) {
0244                     regionName = QCoreApplication::translate("HolidayRegion", "South Tyrol", "Italian Region");
0245                 } else if (country == QLatin1String("au") && subdivision == QLatin1String("nsw")) {
0246                     regionName = QCoreApplication::translate("HolidayRegion", "New South Wales");
0247                 } else if (country == QLatin1String("au") && subdivision == QLatin1String("qld")) {
0248                     regionName = QCoreApplication::translate("HolidayRegion", "Queensland", "Australian Region");
0249                 } else if (country == QLatin1String("au") && subdivision == QLatin1String("vic")) {
0250                     regionName = QCoreApplication::translate("HolidayRegion", "Victoria", "Australian Region");
0251                 } else if (country == QLatin1String("au") && subdivision == QLatin1String("sa")) {
0252                     regionName = QCoreApplication::translate("HolidayRegion", "South Australia", "Australian Region");
0253                 } else if (country == QLatin1String("au") && subdivision == QLatin1String("nt")) {
0254                     regionName = QCoreApplication::translate("HolidayRegion", "Northern Territory", "Australian Region");
0255                 } else if (country == QLatin1String("au") && subdivision == QLatin1String("act")) {
0256                     regionName = QCoreApplication::translate("HolidayRegion", "Australian Capital Territory", "Australian Region");
0257                 } else if (country == QLatin1String("au") && subdivision == QLatin1String("wa")) {
0258                     regionName = QCoreApplication::translate("HolidayRegion", "Western Australia", "Australian Region");
0259                 } else if (country == QLatin1String("au") && subdivision == QLatin1String("tas")) {
0260                     regionName = QCoreApplication::translate("HolidayRegion", "Tasmania", "Australian Region");
0261                 } else if (country == QLatin1String("ba") && subdivision == QLatin1String("srp")) {
0262                     regionName = QCoreApplication::translate("HolidayRegion", "Republic of Srpska", "Bosnian and Herzegovinian Region");
0263                 } else {
0264                     // TODO Note this does not give the current QLocale translation!
0265                     regionName = QLocale::territoryToString(QLocale::codeToTerritory(country)) + QLatin1String(" (") + subdivision + QLatin1Char(')');
0266                 }
0267             } else {
0268                 // TODO Note this does not give the current QLocale translation!
0269                 regionName = QLocale::territoryToString(QLocale::codeToTerritory(country));
0270             }
0271         }
0272 
0273         // Cheat on type for now,take direct from region code until API is introduced in SC 4.6
0274         QStringList regionParts = regionCode().toLower().split(QLatin1Char('_'));
0275         if (regionParts.count() == 3) {
0276             const QString &type = regionParts.at(2);
0277             // Will create lots more in 4.6
0278             // Religious types, just simple for now
0279             if (type == QLatin1String("public")) {
0280                 typeName = QCoreApplication::translate("HolidayRegion", "Public", "Holiday type");
0281             } else if (type == QLatin1String("civil")) {
0282                 typeName = QCoreApplication::translate("HolidayRegion", "Civil", "Holiday type");
0283             } else if (type == QLatin1String("religious")) {
0284                 typeName = QCoreApplication::translate("HolidayRegion", "Religious", "Holiday type");
0285             } else if (type == QLatin1String("government")) {
0286                 typeName = QCoreApplication::translate("HolidayRegion", "Government", "Holiday type");
0287             } else if (type == QLatin1String("financial")) {
0288                 typeName = QCoreApplication::translate("HolidayRegion", "Financial", "Holiday type");
0289             } else if (type == QLatin1String("cultural")) {
0290                 typeName = QCoreApplication::translate("HolidayRegion", "Cultural", "Holiday type");
0291             } else if (type == QLatin1String("commemorative")) {
0292                 typeName = QCoreApplication::translate("HolidayRegion", "Commemorative", "Holiday type");
0293             } else if (type == QLatin1String("historical")) {
0294                 typeName = QCoreApplication::translate("HolidayRegion", "Historical", "Holiday type");
0295             } else if (type == QLatin1String("school")) {
0296                 typeName = QCoreApplication::translate("HolidayRegion", "School", "Holiday type");
0297             } else if (type == QLatin1String("seasonal")) {
0298                 typeName = QCoreApplication::translate("HolidayRegion", "Seasonal", "Holiday type");
0299             } else if (type == QLatin1String("nameday")) {
0300                 typeName = QCoreApplication::translate("HolidayRegion", "Name Days", "Holiday type");
0301             } else if (type == QLatin1String("personal")) {
0302                 typeName = QCoreApplication::translate("HolidayRegion", "Personal", "Holiday type");
0303             } else if (type == QLatin1String("christian")) {
0304                 typeName = QCoreApplication::translate("HolidayRegion", "Christian", "Holiday type");
0305             } else if (type == QLatin1String("anglican")) {
0306                 typeName = QCoreApplication::translate("HolidayRegion", "Anglican", "Holiday type");
0307             } else if (type == QLatin1String("catholic")) {
0308                 typeName = QCoreApplication::translate("HolidayRegion", "Catholic", "Holiday type");
0309             } else if (type == QLatin1String("protestant")) {
0310                 typeName = QCoreApplication::translate("HolidayRegion", "Protestant", "Holiday type");
0311             } else if (type == QLatin1String("orthodox")) {
0312                 typeName = QCoreApplication::translate("HolidayRegion", "Orthodox", "Holiday type");
0313             } else if (type == QLatin1String("jewish")) {
0314                 typeName = QCoreApplication::translate("HolidayRegion", "Jewish", "Holiday type");
0315             } else if (type == QLatin1String("jewish-orthodox")) {
0316                 typeName = QCoreApplication::translate("HolidayRegion", "Jewish Orthodox", "Holiday type");
0317             } else if (type == QLatin1String("jewish-conservative")) {
0318                 typeName = QCoreApplication::translate("HolidayRegion", "Jewish Conservative", "Holiday type");
0319             } else if (type == QLatin1String("jewish-reform")) {
0320                 typeName = QCoreApplication::translate("HolidayRegion", "Jewish Reform", "Holiday type");
0321             } else if (type == QLatin1String("islamic")) {
0322                 typeName = QCoreApplication::translate("HolidayRegion", "Islamic", "Holiday type");
0323             } else if (type == QLatin1String("islamic-sunni")) {
0324                 typeName = QCoreApplication::translate("HolidayRegion", "Islamic Sunni", "Holiday type");
0325             } else if (type == QLatin1String("islamic-shia")) {
0326                 typeName = QCoreApplication::translate("HolidayRegion", "Islamic Shia", "Holiday type");
0327             } else if (type == QLatin1String("islamic-sufi")) {
0328                 typeName = QCoreApplication::translate("HolidayRegion", "Islamic Sufi", "Holiday type");
0329             }
0330         }
0331 
0332         if (!regionName.isEmpty()) {
0333             if (!typeName.isEmpty()) {
0334                 tempName = QCoreApplication::translate("HolidayRegion", "%1 - %2", "Holiday file display name, %1 = region name, %2 = holiday type")
0335                                .arg(regionName, typeName);
0336             } else {
0337                 tempName = regionName;
0338             }
0339         } else if (!typeName.isEmpty()) {
0340             tempName = typeName;
0341         } else {
0342             tempName = QCoreApplication::translate("HolidayRegion", "Unknown", "Unknown holiday region");
0343         }
0344     }
0345     return tempName;
0346 }
0347 
0348 QString HolidayRegion::name(const QString &regionCode)
0349 {
0350     HolidayRegion temp(regionCode);
0351     if (temp.isValid()) {
0352         return temp.name();
0353     } else {
0354         return QString();
0355     }
0356 }
0357 
0358 QString HolidayRegion::description() const
0359 {
0360     return d->mDriver->fileDescription();
0361 }
0362 
0363 QString HolidayRegion::description(const QString &regionCode)
0364 {
0365     HolidayRegion temp(regionCode);
0366     if (temp.isValid()) {
0367         return temp.description();
0368     } else {
0369         return QString();
0370     }
0371 }
0372 
0373 bool HolidayRegion::isValid() const
0374 {
0375     return d->mHolidayFile.exists() && d->mDriver;
0376 }
0377 
0378 bool HolidayRegion::isValid(const QString &regionCode)
0379 {
0380     HolidayRegion temp(regionCode);
0381     return temp.isValid();
0382 }
0383 
0384 Holiday::List HolidayRegion::rawHolidays(const QDate &startDate, const QDate &endDate, const QString &category) const
0385 {
0386     if (isValid()) {
0387         return d->mDriver->parseHolidays(startDate, endDate, category);
0388     } else {
0389         return Holiday::List();
0390     }
0391 }
0392 
0393 Holiday::List HolidayRegion::rawHolidays(const QDate &startDate, const QDate &endDate) const
0394 {
0395     if (isValid()) {
0396         return d->mDriver->parseRawHolidays(startDate, endDate);
0397     } else {
0398         return Holiday::List();
0399     }
0400 }
0401 
0402 Holiday::List HolidayRegion::rawHolidaysWithAstroSeasons(const QDate &startDate, const QDate &endDate) const
0403 {
0404     if (isValid()) {
0405         return d->mDriver->parseHolidays(startDate, endDate);
0406     } else {
0407         return Holiday::List();
0408     }
0409 }
0410 
0411 Holiday::List HolidayRegion::rawHolidaysWithAstroSeasons(const QDate &date) const
0412 {
0413     if (isValid()) {
0414         return d->mDriver->parseHolidays(date);
0415     } else {
0416         return Holiday::List();
0417     }
0418 }
0419 
0420 Holiday::List HolidayRegion::rawHolidaysWithAstroSeasons(int calendarYear) const
0421 {
0422     if (isValid()) {
0423         return d->mDriver->parseHolidays(calendarYear);
0424     } else {
0425         return Holiday::List();
0426     }
0427 }
0428 
0429 bool HolidayRegion::isHoliday(const QDate &date) const
0430 {
0431     const Holiday::List holidayList = rawHolidaysWithAstroSeasons(date);
0432     if (!holidayList.isEmpty()) {
0433         for (const KHolidays::Holiday &holiday : holidayList) {
0434             if (holiday.dayType() == Holiday::NonWorkday) {
0435                 return true;
0436             }
0437         }
0438     }
0439     return false;
0440 }
0441 
0442 static bool maybeCountry(QStringView holidayId, QStringView country)
0443 {
0444     if (country.isEmpty()) {
0445         return false;
0446     }
0447     if (holidayId.size() < 2 || country.size() < 2 || (country.size() > 2 && country[2] != QLatin1Char('-'))) {
0448         return true; // not the format we expect, check the content
0449     }
0450     return holidayId.startsWith(country.left(2));
0451 }
0452 
0453 QString HolidayRegion::defaultRegionCode(const QString &country, const QString &language)
0454 {
0455     // Try to match against the users country and language, or failing that the language country.
0456     // Scan through all the regions finding the first match for each possible default
0457     // Holiday Region Country Code can be a country subdivision or the country itself,
0458     // e.g. US or US-CA for California, so we can try match on both but an exact match has priority
0459     // The Holiday Region file is in one language only, so give priority to any file in the
0460     // users language, e.g. bilingual countries with a separate file for each language
0461     // Locale language can have a country code embedded in it e.g. en_GB, which we can try use if
0462     // no country set, but a lot of countries use en_GB so it's a lower priority option
0463 
0464     QString localeCountry;
0465     QString localeSubdivision;
0466     QString localeLanguage;
0467     QString localeLanguageCountry;
0468 
0469     if (country.isEmpty()) {
0470         localeCountry = QLocale::territoryToCode(QLocale().territory()).toLower();
0471     } else {
0472         localeCountry = country.toLower();
0473         const auto idx = localeCountry.indexOf(QLatin1Char('-'));
0474         localeSubdivision = idx > 0 ? localeCountry.left(idx) : localeCountry;
0475     }
0476 
0477     if (language.isEmpty()) {
0478         localeLanguage = QLocale().languageToCode(QLocale().language()).toLower();
0479     } else {
0480         localeLanguage = language.toLower();
0481     }
0482 
0483     if (localeLanguage.split(QLatin1Char('_')).count() > 1) {
0484         localeLanguageCountry = localeLanguage.split(QLatin1Char('_')).at(1);
0485     }
0486 
0487     QString countryAndLanguageMatch;
0488     QString countryOnlyMatch;
0489     QString subdivisionAndLanguageMatch;
0490     QString subdivisionOnlyMatch;
0491     QString languageCountryAndLanguageMatch;
0492     QString languageCountryOnlyMatch;
0493     QString languageSubdivisionAndLanguageMatch;
0494     QString languageSubdivisionOnlyMatch;
0495 
0496     const QStringList regionList = KHolidays::HolidayRegion::regionCodes();
0497     for (const QString &aRegionCode : regionList) {
0498         // avoid expensive parsing in most cases by leveraging the country being in the file name
0499         if (!maybeCountry(aRegionCode, localeCountry) && !maybeCountry(aRegionCode, localeLanguageCountry)) {
0500             continue;
0501         }
0502 
0503         const auto hr = KHolidays::HolidayRegion(aRegionCode);
0504         QString regionCountry = hr.countryCode().toLower();
0505         QString regionSubdivisionCountry;
0506         if (regionCountry.split(QLatin1Char('-')).count() > 1) {
0507             regionSubdivisionCountry = regionCountry.split(QLatin1Char('-')).at(0);
0508         } else {
0509             regionSubdivisionCountry = regionCountry;
0510         }
0511         QString regionLanguage = hr.languageCode().toLower();
0512 
0513         if (regionCountry == localeCountry && regionLanguage == localeLanguage) {
0514             // exact match so don't look further
0515             return aRegionCode;
0516         } else if (regionCountry == localeSubdivision && regionLanguage == localeLanguage) {
0517             countryAndLanguageMatch = aRegionCode;
0518         } else if (regionCountry == localeCountry) {
0519             if (countryOnlyMatch.isEmpty()) {
0520                 countryOnlyMatch = aRegionCode;
0521             }
0522         } else if (!regionSubdivisionCountry.isEmpty() && regionSubdivisionCountry == localeSubdivision && regionLanguage == localeLanguage) {
0523             if (subdivisionAndLanguageMatch.isEmpty()) {
0524                 subdivisionAndLanguageMatch = aRegionCode;
0525             }
0526         } else if (!regionSubdivisionCountry.isEmpty() && regionSubdivisionCountry == localeSubdivision) {
0527             if (subdivisionOnlyMatch.isEmpty()) {
0528                 subdivisionOnlyMatch = aRegionCode;
0529             }
0530         } else if (!localeLanguageCountry.isEmpty() && regionCountry == localeLanguageCountry && regionLanguage == localeLanguage) {
0531             if (languageCountryAndLanguageMatch.isEmpty()) {
0532                 languageCountryAndLanguageMatch = aRegionCode;
0533             }
0534         } else if (!localeLanguageCountry.isEmpty() && regionCountry == localeLanguageCountry) {
0535             if (languageCountryOnlyMatch.isEmpty()) {
0536                 languageCountryOnlyMatch = aRegionCode;
0537             }
0538         } else if (!regionSubdivisionCountry.isEmpty() && !localeLanguageCountry.isEmpty() && regionSubdivisionCountry == localeLanguageCountry
0539                    && regionLanguage == localeLanguage) {
0540             if (languageSubdivisionAndLanguageMatch.isEmpty()) {
0541                 languageSubdivisionAndLanguageMatch = aRegionCode;
0542             }
0543         } else if (!regionSubdivisionCountry.isEmpty() && !localeLanguageCountry.isEmpty() && regionSubdivisionCountry == localeLanguageCountry) {
0544             if (languageSubdivisionOnlyMatch.isEmpty()) {
0545                 languageSubdivisionOnlyMatch = aRegionCode;
0546             }
0547         }
0548     }
0549 
0550     QString defaultRegionCode;
0551 
0552     if (!countryAndLanguageMatch.isEmpty()) {
0553         defaultRegionCode = countryAndLanguageMatch;
0554     } else if (!countryOnlyMatch.isEmpty()) {
0555         defaultRegionCode = countryOnlyMatch;
0556     } else if (!subdivisionAndLanguageMatch.isEmpty()) {
0557         defaultRegionCode = subdivisionAndLanguageMatch;
0558     } else if (!subdivisionOnlyMatch.isEmpty()) {
0559         defaultRegionCode = subdivisionOnlyMatch;
0560     } else if (!languageCountryAndLanguageMatch.isEmpty()) {
0561         defaultRegionCode = languageCountryAndLanguageMatch;
0562     } else if (!languageCountryOnlyMatch.isEmpty()) {
0563         defaultRegionCode = languageCountryOnlyMatch;
0564     } else if (!languageSubdivisionAndLanguageMatch.isEmpty()) {
0565         defaultRegionCode = languageSubdivisionAndLanguageMatch;
0566     } else if (!languageSubdivisionOnlyMatch.isEmpty()) {
0567         defaultRegionCode = languageSubdivisionOnlyMatch;
0568     }
0569 
0570     return defaultRegionCode;
0571 }