File indexing completed on 2025-01-19 03:40:32
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 ®ionCode) 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 ®ionFile) 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 ®ionCode) 0119 : d(new HolidayRegionPrivate(regionCode)) 0120 { 0121 } 0122 0123 HolidayRegion::HolidayRegion(const QFileInfo ®ionFile) 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 ®ionCode) 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 ®ionCode) 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 ®ionCode) 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 ®ionCode) 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 ®ionCode) 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 }