25 #include "holidayregion.h"
27 #include <QtCore/QDateTime>
28 #include <QtCore/QFile>
29 #include <QtCore/QSharedData>
30 #include <QtCore/QFileInfo>
32 #include <KStandardDirs>
37 #include "holiday_p.h"
38 #include "parsers/plan2/holidayparserdriverplan_p.h"
40 using namespace KHolidays;
42 class HolidayRegion::Private
45 Private(
const QString ®ionCode ) : mDriver( 0 ),
46 mRegionCode( regionCode )
48 if ( !mRegionCode.isEmpty() ) {
50 if ( mRegionCode.length() == 2 ) {
51 mLocation = mRegionCode;
52 QStringList locationFiles = KGlobal::dirs()->findAllResources(
"data",
53 "libkholidays/plan2/holiday_" + mLocation +
'*',
54 KStandardDirs::NoDuplicates );
55 if ( locationFiles.count() > 0 ) {
56 mRegionCode = locationFiles.at( 0 ).
57 mid( locationFiles.at( 0 ).lastIndexOf(
"holiday_" ) + 8 );
62 KStandardDirs::locate(
"data",
"libkholidays/plan2/holiday_" + mRegionCode ) );
68 Private(
const QFileInfo ®ionFile ) : mDriver( 0 ),
69 mHolidayFile( regionFile )
81 if ( mHolidayFile.exists() ) {
85 if ( mLocation.isEmpty() ) {
89 if ( mRegionCode.isEmpty() ) {
90 if ( mHolidayFile.fileName().startsWith( QLatin1String(
"holiday_" ) ) ) {
91 mRegionCode = mHolidayFile.fileName().mid( 8 );
93 mRegionCode = mHolidayFile.fileName();
110 QFileInfo mHolidayFile;
113 HolidayRegion::HolidayRegion(
const QString ®ionCode )
114 : d( new Private( regionCode ) )
118 HolidayRegion::HolidayRegion(
const QFileInfo ®ionFile )
119 : d( new Private( regionFile ) )
123 HolidayRegion::~HolidayRegion()
128 QStringList HolidayRegion::locations()
130 const QStringList files =
131 KGlobal::dirs()->findAllResources(
"data",
"libkholidays/plan2/holiday_*",
132 KStandardDirs::NoDuplicates );
134 QStringList locations;
135 foreach (
const QString &filename, files ) {
136 locations.append( filename.mid( filename.lastIndexOf(
"holiday_" ) + 8, 2 ) );
139 locations.removeDuplicates();
144 QString HolidayRegion::location()
const
149 QStringList HolidayRegion::regionCodes()
151 const QStringList files =
152 KGlobal::dirs()->findAllResources(
"data",
"libkholidays/plan2/holiday_*",
153 KStandardDirs::NoDuplicates );
155 QStringList regionCodesList;
156 foreach (
const QString &filename, files ) {
157 regionCodesList.append( filename.mid( filename.lastIndexOf(
"holiday_" ) + 8 ) );
160 qSort( regionCodesList );
161 return regionCodesList;
164 QString HolidayRegion::regionCode()
const
166 return d->mRegionCode;
169 QString HolidayRegion::countryCode()
const
171 return d->mDriver->fileCountryCode();
174 QString HolidayRegion::countryCode(
const QString ®ionCode )
176 HolidayRegion temp = HolidayRegion( regionCode );
177 if ( temp.isValid() ) {
178 return temp.countryCode();
184 QString HolidayRegion::languageCode()
const
186 return d->mDriver->fileLanguageCode();
189 QString HolidayRegion::languageCode(
const QString ®ionCode )
191 HolidayRegion temp = HolidayRegion( regionCode );
192 if ( temp.isValid() ) {
193 return temp.languageCode();
199 QString HolidayRegion::name()
const
201 QString tempName = d->mDriver->fileName();
203 if ( tempName.isEmpty() ) {
204 QStringList countryParts = countryCode().toLower().split(
'-' );
205 QString country = countryParts.at( 0 );
206 QString regionName, typeName;
208 if ( country !=
"xx" ) {
209 if ( countryParts.count() == 2 ) {
212 QString subdivision = countryParts.at( 1 );
213 if ( country ==
"ca" && subdivision ==
"qc" ) {
214 regionName = i18nc(
"Canadian region",
"Quebec" );
215 }
else if ( country ==
"de" && subdivision ==
"by" ) {
216 regionName = i18nc(
"German region",
"Bavaria" );
217 }
else if ( country ==
"es" && subdivision ==
"ct" ) {
218 regionName = i18nc(
"Spanish region",
"Catalonia" );
219 }
else if ( country ==
"gb" && subdivision ==
"eaw" ) {
220 regionName = i18nc(
"UK Region",
"England and Wales" );
221 }
else if ( country ==
"gb" && subdivision ==
"eng" ) {
222 regionName = i18nc(
"UK Region",
"England" );
223 }
else if ( country ==
"gb" && subdivision ==
"wls" ) {
224 regionName = i18nc(
"UK Region",
"Wales" );
225 }
else if ( country ==
"gb" && subdivision ==
"sct" ) {
226 regionName = i18nc(
"UK Region",
"Scotland" );
227 }
else if ( country ==
"gb" && subdivision ==
"nir" ) {
228 regionName = i18nc(
"UK Region",
"Northern Ireland" );
229 }
else if ( country ==
"it" && subdivision ==
"bz" ) {
230 regionName = i18nc(
"Italian Region",
"South Tyrol" );
231 }
else if ( country ==
"au" && subdivision ==
"nsw" ) {
232 regionName = i18nc(
"Australian Region",
"New South Wales" );
233 }
else if ( country ==
"au" && subdivision ==
"qld" ) {
234 regionName = i18nc(
"Australian Region",
"Queensland" );
235 }
else if ( country ==
"au" && subdivision ==
"vic" ) {
236 regionName = i18nc(
"Australian Region",
"Victoria" );
237 }
else if ( country ==
"au" && subdivision ==
"sa" ) {
238 regionName = i18nc(
"Australian Region",
"South Australia" );
239 }
else if ( country ==
"au" && subdivision ==
"nt" ) {
240 regionName = i18nc(
"Australian Region",
"Northern Territory" );
241 }
else if ( country ==
"au" && subdivision ==
"act" ) {
242 regionName = i18nc(
"Australian Region",
"Australian Capital Territory" );
243 }
else if ( country ==
"au" && subdivision ==
"wa" ) {
244 regionName = i18nc(
"Australian Region",
"Western Australia" );
245 }
else if ( country ==
"au" && subdivision ==
"tas" ) {
246 regionName = i18nc(
"Australian Region",
"Tasmania" );
247 }
else if ( country ==
"ba" && subdivision ==
"srp" ) {
248 regionName = i18nc(
"Bosnian and Herzegovinian Region",
"Republic of Srpska" );
250 regionName = KGlobal::locale()->countryCodeToName( country );
253 regionName = KGlobal::locale()->countryCodeToName( country );
258 QStringList regionParts = regionCode().toLower().split(
'_' );
259 if ( regionParts.count() == 3 ) {
260 QString type = regionParts.at( 2 );
263 if ( type ==
"public" ) {
264 typeName = i18nc(
"Holiday type",
"Public" );
265 }
else if ( type ==
"religious" ) {
266 typeName = i18nc(
"Holiday type",
"Religious" );
267 }
else if ( type ==
"financial" ) {
268 typeName = i18nc(
"Holiday type",
"Financial" );
269 }
else if ( type ==
"cultural" ) {
270 typeName = i18nc(
"Holiday type",
"Cultural" );
271 }
else if ( type ==
"school" ) {
272 typeName = i18nc(
"Holiday type",
"School" );
273 }
else if ( type ==
"seasons" ) {
274 typeName = i18nc(
"Holiday type",
"Seasons" );
275 }
else if ( type ==
"name" ) {
276 typeName = i18nc(
"Holiday type",
"Name Days" );
277 }
else if ( type ==
"personal" ) {
278 typeName = i18nc(
"Holiday type",
"Personal" );
279 }
else if ( type ==
"catholic" ) {
280 typeName = i18nc(
"Holiday type",
"Catholic" );
281 }
else if ( type ==
"protestant" ) {
282 typeName = i18nc(
"Holiday type",
"Protestant" );
283 }
else if ( type ==
"orthodox" ) {
284 typeName = i18nc(
"Holiday type",
"Orthodox" );
285 }
else if ( type ==
"jewish" ) {
286 typeName = i18nc(
"Holiday type",
"Jewish" );
287 }
else if ( type ==
"islamic" ) {
288 typeName = i18nc(
"Holiday type",
"Islamic" );
292 if ( !regionName.isEmpty() ) {
293 if ( !typeName.isEmpty() ) {
295 tempName = QString(
"%1 - %2" ).arg( regionName ).arg( typeName );
297 tempName = regionName;
299 }
else if ( !typeName.isEmpty() ) {
302 tempName = i18nc(
"Unknown holiday region",
"Unknown" );
308 QString HolidayRegion::name(
const QString ®ionCode )
310 HolidayRegion temp = HolidayRegion( regionCode );
311 if ( temp.isValid() ) {
318 QString HolidayRegion::description()
const
320 return d->mDriver->fileDescription();
323 QString HolidayRegion::description(
const QString ®ionCode )
325 HolidayRegion temp = HolidayRegion( regionCode );
326 if ( temp.isValid() ) {
327 return temp.description();
333 bool HolidayRegion::isValid()
const
335 return d->mHolidayFile.exists() && d->mDriver;
338 bool HolidayRegion::isValid(
const QString ®ionCode )
340 HolidayRegion temp = HolidayRegion( regionCode );
341 return temp.isValid();
344 Holiday::List HolidayRegion::holidays(
const QDate &startDate,
const QDate &endDate )
const
346 return holidays( startDate, endDate, Holiday::MultidayHolidaysAsMultipleEvents );
349 Holiday::List HolidayRegion::holidays(
const QDate &startDate,
const QDate &endDate,
350 Holiday::MultidayMode multidayMode )
const
353 return d->mDriver->parseHolidays( startDate, endDate, multidayMode );
355 return Holiday::List();
359 Holiday::List HolidayRegion::holidays(
const QDate &date )
const
361 return holidays( date, Holiday::MultidayHolidaysAsMultipleEvents );
364 Holiday::List HolidayRegion::holidays(
const QDate &date, Holiday::MultidayMode multidayMode )
const
367 return d->mDriver->parseHolidays( date, multidayMode );
369 return Holiday::List();
373 Holiday::List HolidayRegion::holidays(
int calendarYear,
const QString &calendarType )
const
375 return holidays( calendarYear, calendarType, Holiday::MultidayHolidaysAsMultipleEvents );
378 Holiday::List HolidayRegion::holidays(
int calendarYear,
const QString &calendarType,
379 Holiday::MultidayMode multidayMode )
const
382 return d->mDriver->parseHolidays( calendarYear, calendarType, multidayMode );
384 return Holiday::List();
388 bool HolidayRegion::isHoliday(
const QDate &date )
const
390 Holiday::List holidayList = holidays( date, Holiday::MultidayHolidaysAsMultipleEvents );
391 if ( holidayList.count() > 0 ) {
392 foreach (
const KHolidays::Holiday &holiday, holidayList ) {
393 if ( holiday.dayType() == Holiday::NonWorkday ) {
401 QString HolidayRegion::defaultRegionCode(
const QString &country,
const QString &language )
412 QString localeCountry, localeLanguage, localeLanguageCountry;
414 if ( country.isEmpty() ) {
415 localeCountry = KGlobal::locale()->country().toLower();
417 localeCountry = country.toLower();
420 if ( language.isEmpty() ) {
421 localeLanguage = KGlobal::locale()->language().toLower();
423 localeLanguage = language.toLower();
426 if ( localeLanguage.split(
'_' ).count() > 1 ) {
427 localeLanguageCountry = localeLanguage.split(
'_' ).at( 1 );
430 QStringList regionList = KHolidays::HolidayRegion::regionCodes();
432 QString countryAndLanguageMatch, countryOnlyMatch, subdivisionAndLanguageMatch,
433 subdivisionOnlyMatch, languageCountryAndLanguageMatch, languageCountryOnlyMatch,
434 languageSubdivisionAndLanguageMatch, languageSubdivisionOnlyMatch;
436 foreach (
const QString ®ionCode, regionList ) {
437 QString regionCountry = KHolidays::HolidayRegion::countryCode( regionCode ).toLower();
438 QString regionSubdivisionCountry;
439 if ( regionCountry.split(
'-' ).count() > 1 ) {
440 regionSubdivisionCountry = regionCountry.split(
'-' ).at( 0 );
442 QString regionLanguage = KHolidays::HolidayRegion::languageCode( regionCode ).toLower();
444 if ( regionCountry == localeCountry && regionLanguage == localeLanguage ) {
445 countryAndLanguageMatch = regionCode;
447 }
else if ( regionCountry == localeCountry ) {
448 if ( countryOnlyMatch.isEmpty() ) {
449 countryOnlyMatch = regionCode;
451 }
else if ( !regionSubdivisionCountry.isEmpty() &&
452 regionSubdivisionCountry == localeCountry &&
453 regionLanguage == localeLanguage ) {
454 if ( subdivisionAndLanguageMatch.isEmpty() ) {
455 subdivisionAndLanguageMatch = regionCode;
457 }
else if ( !regionSubdivisionCountry.isEmpty() && regionSubdivisionCountry == localeCountry ) {
458 if ( subdivisionOnlyMatch.isEmpty() ) {
459 subdivisionOnlyMatch = regionCode;
461 }
else if ( !localeLanguageCountry.isEmpty() &&
462 regionCountry == localeLanguageCountry &&
463 regionLanguage == localeLanguage ) {
464 if ( languageCountryAndLanguageMatch.isEmpty() ) {
465 languageCountryAndLanguageMatch = regionCode;
467 }
else if ( !localeLanguageCountry.isEmpty() && regionCountry == localeLanguageCountry ) {
468 if ( languageCountryOnlyMatch.isEmpty() ) {
469 languageCountryOnlyMatch = regionCode;
471 }
else if ( !regionSubdivisionCountry.isEmpty() &&
472 !localeLanguageCountry.isEmpty() &&
473 regionSubdivisionCountry == localeLanguageCountry &&
474 regionLanguage == localeLanguage ) {
475 if ( languageSubdivisionAndLanguageMatch.isEmpty() ) {
476 languageSubdivisionAndLanguageMatch = regionCode;
478 }
else if ( !regionSubdivisionCountry.isEmpty() &&
479 !localeLanguageCountry.isEmpty() &&
480 regionSubdivisionCountry == localeLanguageCountry ) {
481 if ( languageSubdivisionOnlyMatch.isEmpty() ) {
482 languageSubdivisionOnlyMatch = regionCode;
487 QString defaultRegionCode;
489 if ( !countryAndLanguageMatch.isEmpty() ) {
490 defaultRegionCode = countryAndLanguageMatch;
491 }
else if ( !countryOnlyMatch.isEmpty() ) {
492 defaultRegionCode = countryOnlyMatch;
493 }
else if ( !subdivisionAndLanguageMatch.isEmpty() ) {
494 defaultRegionCode = subdivisionAndLanguageMatch;
495 }
else if ( !subdivisionOnlyMatch.isEmpty() ) {
496 defaultRegionCode = subdivisionOnlyMatch;
497 }
else if ( !languageCountryAndLanguageMatch.isEmpty() ) {
498 defaultRegionCode = languageCountryAndLanguageMatch;
499 }
else if ( !languageCountryOnlyMatch.isEmpty() ) {
500 defaultRegionCode = languageCountryOnlyMatch;
501 }
else if ( !languageSubdivisionAndLanguageMatch.isEmpty() ) {
502 defaultRegionCode = languageSubdivisionAndLanguageMatch;
503 }
else if ( !languageSubdivisionOnlyMatch.isEmpty() ) {
504 defaultRegionCode = languageSubdivisionOnlyMatch;
507 return defaultRegionCode;