25#include "holidayregion.h"
27#include <QtCore/QDateTime>
28#include <QtCore/QFile>
29#include <QtCore/QSharedData>
30#include <QtCore/QFileInfo>
32#include <KStandardDirs>
35#include <KLocalizedString>
39#include "parsers/plan2/holidayparserdriverplan_p.h"
41using namespace KHolidays;
43class HolidayRegion::Private
46 Private(
const QString ®ionCode ) : mDriver( 0 ),
47 mRegionCode( regionCode )
49 if ( !mRegionCode.isEmpty() ) {
51 if ( mRegionCode.length() == 2 ) {
52 mLocation = mRegionCode;
53 QStringList locationFiles = KGlobal::dirs()->findAllResources(
"data",
54 QLatin1String(
"libkholidays/plan2/holiday_") + mLocation + QLatin1Char(
'*'),
55 KStandardDirs::NoDuplicates );
56 if ( locationFiles.count() > 0 ) {
57 mRegionCode = locationFiles.at( 0 ).
58 mid( locationFiles.at( 0 ).lastIndexOf( QLatin1String(
"holiday_") ) + 8 );
63 KStandardDirs::locate(
"data", QLatin1String(
"libkholidays/plan2/holiday_") + mRegionCode ) );
69 Private(
const QFileInfo ®ionFile ) : mDriver( 0 ),
70 mHolidayFile( regionFile )
82 if ( mHolidayFile.exists() ) {
86 if ( mLocation.isEmpty() ) {
87 mLocation = mDriver->fileCountryCode().left( 2 );
90 if ( mRegionCode.isEmpty() ) {
91 if ( mHolidayFile.fileName().startsWith( QLatin1String(
"holiday_" ) ) ) {
92 mRegionCode = mHolidayFile.fileName().mid( 8 );
94 mRegionCode = mHolidayFile.fileName();
111 QFileInfo mHolidayFile;
114HolidayRegion::HolidayRegion(
const QString ®ionCode )
115 : d( new Private( regionCode ) )
119HolidayRegion::HolidayRegion(
const QFileInfo ®ionFile )
120 : d( new Private( regionFile ) )
124HolidayRegion::~HolidayRegion()
129QStringList HolidayRegion::locations()
131 const QStringList files =
132 KGlobal::dirs()->findAllResources(
"data", QLatin1String(
"libkholidays/plan2/holiday_*"),
133 KStandardDirs::NoDuplicates );
135 QStringList locations;
136 foreach (
const QString &filename, files ) {
137 locations.append( filename.mid( filename.lastIndexOf( QLatin1String(
"holiday_") ) + 8, 2 ) );
140 locations.removeDuplicates();
145QString HolidayRegion::location()
const
150QStringList HolidayRegion::regionCodes()
152 const QStringList files =
153 KGlobal::dirs()->findAllResources(
"data", QLatin1String(
"libkholidays/plan2/holiday_*"),
154 KStandardDirs::NoDuplicates );
156 QStringList regionCodesList;
157 foreach (
const QString &filename, files ) {
158 regionCodesList.append( filename.mid( filename.lastIndexOf( QLatin1String(
"holiday_") ) + 8 ) );
161 qSort( regionCodesList );
162 return regionCodesList;
165QString HolidayRegion::regionCode()
const
167 return d->mRegionCode;
170QString HolidayRegion::countryCode()
const
172 return d->mDriver->fileCountryCode();
175QString HolidayRegion::countryCode(
const QString ®ionCode )
177 HolidayRegion temp = HolidayRegion( regionCode );
178 if ( temp.isValid() ) {
179 return temp.countryCode();
185QString HolidayRegion::languageCode()
const
187 return d->mDriver->fileLanguageCode();
190QString HolidayRegion::languageCode(
const QString ®ionCode )
192 HolidayRegion temp = HolidayRegion( regionCode );
193 if ( temp.isValid() ) {
194 return temp.languageCode();
200QString HolidayRegion::name()
const
202 QString tempName = d->mDriver->fileName();
204 if ( tempName.isEmpty() ) {
205 QStringList countryParts = countryCode().toLower().split( QLatin1Char(
'-') );
206 QString country = countryParts.at( 0 );
207 QString regionName, typeName;
209 if ( country != QLatin1String(
"xx") ) {
210 if ( countryParts.count() == 2 ) {
213 QString subdivision = countryParts.at( 1 );
214 if ( country == QLatin1String(
"ca") && subdivision == QLatin1String(
"qc") ) {
215 regionName = i18nc(
"Canadian region",
"Quebec" );
216 }
else if ( country == QLatin1String(
"de") && subdivision == QLatin1String(
"by") ) {
217 regionName = i18nc(
"German region",
"Bavaria" );
218 }
else if ( country == QLatin1String(
"es") && subdivision == QLatin1String(
"ct") ) {
219 regionName = i18nc(
"Spanish region",
"Catalonia" );
220 }
else if ( country == QLatin1String(
"gb") && subdivision == QLatin1String(
"eaw") ) {
221 regionName = i18nc(
"UK Region",
"England and Wales" );
222 }
else if ( country == QLatin1String(
"gb") && subdivision == QLatin1String(
"eng") ) {
223 regionName = i18nc(
"UK Region",
"England" );
224 }
else if ( country == QLatin1String(
"gb") && subdivision == QLatin1String(
"wls") ) {
225 regionName = i18nc(
"UK Region",
"Wales" );
226 }
else if ( country == QLatin1String(
"gb") && subdivision == QLatin1String(
"sct") ) {
227 regionName = i18nc(
"UK Region",
"Scotland" );
228 }
else if ( country == QLatin1String(
"gb") && subdivision == QLatin1String(
"nir") ) {
229 regionName = i18nc(
"UK Region",
"Northern Ireland" );
230 }
else if ( country == QLatin1String(
"it") && subdivision == QLatin1String(
"bz") ) {
231 regionName = i18nc(
"Italian Region",
"South Tyrol" );
232 }
else if ( country == QLatin1String(
"au") && subdivision == QLatin1String(
"nsw") ) {
233 regionName = i18nc(
"Australian Region",
"New South Wales" );
234 }
else if ( country == QLatin1String(
"au") && subdivision == QLatin1String(
"qld") ) {
235 regionName = i18nc(
"Australian Region",
"Queensland" );
236 }
else if ( country == QLatin1String(
"au") && subdivision == QLatin1String(
"vic") ) {
237 regionName = i18nc(
"Australian Region",
"Victoria" );
238 }
else if ( country == QLatin1String(
"au") && subdivision == QLatin1String(
"sa") ) {
239 regionName = i18nc(
"Australian Region",
"South Australia" );
240 }
else if ( country == QLatin1String(
"au") && subdivision == QLatin1String(
"nt") ) {
241 regionName = i18nc(
"Australian Region",
"Northern Territory" );
242 }
else if ( country == QLatin1String(
"au") && subdivision == QLatin1String(
"act") ) {
243 regionName = i18nc(
"Australian Region",
"Australian Capital Territory" );
244 }
else if ( country == QLatin1String(
"au") && subdivision == QLatin1String(
"wa") ) {
245 regionName = i18nc(
"Australian Region",
"Western Australia" );
246 }
else if ( country == QLatin1String(
"au") && subdivision == QLatin1String(
"tas") ) {
247 regionName = i18nc(
"Australian Region",
"Tasmania" );
248 }
else if ( country == QLatin1String(
"ba") && subdivision == QLatin1String(
"srp") ) {
249 regionName = i18nc(
"Bosnian and Herzegovinian Region",
"Republic of Srpska" );
251 regionName = KGlobal::locale()->countryCodeToName( country );
254 regionName = KGlobal::locale()->countryCodeToName( country );
259 QStringList regionParts = regionCode().toLower().split( QLatin1Char(
'_') );
260 if ( regionParts.count() == 3 ) {
261 QString type = regionParts.at( 2 );
264 if ( type == QLatin1String(
"public") ) {
265 typeName = i18nc(
"Holiday type",
"Public" );
266 }
else if ( type == QLatin1String(
"civil") ) {
267 typeName = i18nc(
"Holiday type",
"Civil" );
268 }
else if ( type == QLatin1String(
"religious") ) {
269 typeName = i18nc(
"Holiday type",
"Religious" );
270 }
else if ( type == QLatin1String(
"government") ) {
271 typeName = i18nc(
"Holiday type",
"Government" );
272 }
else if ( type == QLatin1String(
"financial") ) {
273 typeName = i18nc(
"Holiday type",
"Financial" );
274 }
else if ( type == QLatin1String(
"cultural") ) {
275 typeName = i18nc(
"Holiday type",
"Cultural" );
276 }
else if ( type == QLatin1String(
"commemorative") ) {
277 typeName = i18nc(
"Holiday type",
"Commemorative" );
278 }
else if ( type == QLatin1String(
"historical") ) {
279 typeName = i18nc(
"Holiday type",
"Historical" );
280 }
else if ( type == QLatin1String(
"school") ) {
281 typeName = i18nc(
"Holiday type",
"School" );
282 }
else if ( type == QLatin1String(
"seasonal") ) {
283 typeName = i18nc(
"Holiday type",
"Seasonal" );
284 }
else if ( type == QLatin1String(
"nameday") ) {
285 typeName = i18nc(
"Holiday type",
"Name Days" );
286 }
else if ( type == QLatin1String(
"personal") ) {
287 typeName = i18nc(
"Holiday type",
"Personal" );
288 }
else if ( type == QLatin1String(
"christian") ) {
289 typeName = i18nc(
"Holiday type",
"Christian" );
290 }
else if ( type == QLatin1String(
"anglican") ) {
291 typeName = i18nc(
"Holiday type",
"Anglican" );
292 }
else if ( type == QLatin1String(
"catholic") ) {
293 typeName = i18nc(
"Holiday type",
"Catholic" );
294 }
else if ( type == QLatin1String(
"protestant") ) {
295 typeName = i18nc(
"Holiday type",
"Protestant" );
296 }
else if ( type == QLatin1String(
"orthodox") ) {
297 typeName = i18nc(
"Holiday type",
"Orthodox" );
298 }
else if ( type == QLatin1String(
"jewish") ) {
299 typeName = i18nc(
"Holiday type",
"Jewish" );
300 }
else if ( type == QLatin1String(
"jewish-orthodox") ) {
301 typeName = i18nc(
"Holiday type",
"Jewish Orthodox" );
302 }
else if ( type == QLatin1String(
"jewish-conservative") ) {
303 typeName = i18nc(
"Holiday type",
"Jewish Conservative" );
304 }
else if ( type == QLatin1String(
"jewish-reform") ) {
305 typeName = i18nc(
"Holiday type",
"Jewish Reform" );
306 }
else if ( type == QLatin1String(
"islamic") ) {
307 typeName = i18nc(
"Holiday type",
"Islamic" );
308 }
else if ( type == QLatin1String(
"islamic-sunni") ) {
309 typeName = i18nc(
"Holiday type",
"Islamic Sunni" );
310 }
else if ( type == QLatin1String(
"islamic-shia") ) {
311 typeName = i18nc(
"Holiday type",
"Islamic Shia" );
312 }
else if ( type == QLatin1String(
"islamic-sufi") ) {
313 typeName = i18nc(
"Holiday type",
"Islamic Sufi" );
317 if ( !regionName.isEmpty() ) {
318 if ( !typeName.isEmpty() ) {
319 tempName = i18nc(
"Holiday file display name, %1 = region name, %2 = holiday type",
"%1 - %2" ).arg( regionName ).arg( typeName );
321 tempName = regionName;
323 }
else if ( !typeName.isEmpty() ) {
326 tempName = i18nc(
"Unknown holiday region",
"Unknown" );
332QString HolidayRegion::name(
const QString ®ionCode )
334 HolidayRegion temp = HolidayRegion( regionCode );
335 if ( temp.isValid() ) {
342QString HolidayRegion::description()
const
344 return d->mDriver->fileDescription();
347QString HolidayRegion::description(
const QString ®ionCode )
349 HolidayRegion temp = HolidayRegion( regionCode );
350 if ( temp.isValid() ) {
351 return temp.description();
357bool HolidayRegion::isValid()
const
359 return d->mHolidayFile.exists() && d->mDriver;
362bool HolidayRegion::isValid(
const QString ®ionCode )
364 HolidayRegion temp = HolidayRegion( regionCode );
365 return temp.isValid();
368Holiday::List HolidayRegion::holidays(
const QDate &startDate,
const QDate &endDate )
const
370 return holidays( startDate, endDate, Holiday::MultidayHolidaysAsMultipleEvents );
373Holiday::List HolidayRegion::holidays(
const QDate &startDate,
const QDate &endDate,
374 Holiday::MultidayMode multidayMode )
const
377 return d->mDriver->parseHolidays( startDate, endDate, multidayMode );
379 return Holiday::List();
383Holiday::List HolidayRegion::holidays(
const QDate &date )
const
385 return holidays( date, Holiday::MultidayHolidaysAsMultipleEvents );
388Holiday::List HolidayRegion::holidays(
const QDate &date, Holiday::MultidayMode multidayMode )
const
391 return d->mDriver->parseHolidays( date, multidayMode );
393 return Holiday::List();
397Holiday::List HolidayRegion::holidays(
int calendarYear,
const QString &calendarType )
const
399 return holidays( calendarYear, calendarType, Holiday::MultidayHolidaysAsMultipleEvents );
402Holiday::List HolidayRegion::holidays(
int calendarYear,
const QString &calendarType,
403 Holiday::MultidayMode multidayMode )
const
406 return d->mDriver->parseHolidays( calendarYear, calendarType, multidayMode );
408 return Holiday::List();
412bool HolidayRegion::isHoliday(
const QDate &date )
const
414 Holiday::List holidayList = holidays( date, Holiday::MultidayHolidaysAsMultipleEvents );
415 if ( holidayList.count() > 0 ) {
416 foreach (
const KHolidays::Holiday &holiday, holidayList ) {
417 if ( holiday.dayType() == Holiday::NonWorkday ) {
425QString HolidayRegion::defaultRegionCode(
const QString &country,
const QString &language )
436 QString localeCountry, localeLanguage, localeLanguageCountry;
438 if ( country.isEmpty() ) {
439 localeCountry = KGlobal::locale()->country().toLower();
441 localeCountry = country.toLower();
444 if ( language.isEmpty() ) {
445 localeLanguage = KGlobal::locale()->language().toLower();
447 localeLanguage = language.toLower();
450 if ( localeLanguage.split( QLatin1Char(
'_') ).count() > 1 ) {
451 localeLanguageCountry = localeLanguage.split( QLatin1Char(
'_') ).at( 1 );
454 QStringList regionList = KHolidays::HolidayRegion::regionCodes();
456 QString countryAndLanguageMatch, countryOnlyMatch, subdivisionAndLanguageMatch,
457 subdivisionOnlyMatch, languageCountryAndLanguageMatch, languageCountryOnlyMatch,
458 languageSubdivisionAndLanguageMatch, languageSubdivisionOnlyMatch;
460 foreach (
const QString ®ionCode, regionList ) {
461 QString regionCountry = KHolidays::HolidayRegion::countryCode( regionCode ).toLower();
462 QString regionSubdivisionCountry;
463 if ( regionCountry.split( QLatin1Char(
'-') ).count() > 1 ) {
464 regionSubdivisionCountry = regionCountry.split( QLatin1Char(
'-') ).at( 0 );
466 QString regionLanguage = KHolidays::HolidayRegion::languageCode( regionCode ).toLower();
468 if ( regionCountry == localeCountry && regionLanguage == localeLanguage ) {
469 countryAndLanguageMatch = regionCode;
471 }
else if ( regionCountry == localeCountry ) {
472 if ( countryOnlyMatch.isEmpty() ) {
473 countryOnlyMatch = regionCode;
475 }
else if ( !regionSubdivisionCountry.isEmpty() &&
476 regionSubdivisionCountry == localeCountry &&
477 regionLanguage == localeLanguage ) {
478 if ( subdivisionAndLanguageMatch.isEmpty() ) {
479 subdivisionAndLanguageMatch = regionCode;
481 }
else if ( !regionSubdivisionCountry.isEmpty() && regionSubdivisionCountry == localeCountry ) {
482 if ( subdivisionOnlyMatch.isEmpty() ) {
483 subdivisionOnlyMatch = regionCode;
485 }
else if ( !localeLanguageCountry.isEmpty() &&
486 regionCountry == localeLanguageCountry &&
487 regionLanguage == localeLanguage ) {
488 if ( languageCountryAndLanguageMatch.isEmpty() ) {
489 languageCountryAndLanguageMatch = regionCode;
491 }
else if ( !localeLanguageCountry.isEmpty() && regionCountry == localeLanguageCountry ) {
492 if ( languageCountryOnlyMatch.isEmpty() ) {
493 languageCountryOnlyMatch = regionCode;
495 }
else if ( !regionSubdivisionCountry.isEmpty() &&
496 !localeLanguageCountry.isEmpty() &&
497 regionSubdivisionCountry == localeLanguageCountry &&
498 regionLanguage == localeLanguage ) {
499 if ( languageSubdivisionAndLanguageMatch.isEmpty() ) {
500 languageSubdivisionAndLanguageMatch = regionCode;
502 }
else if ( !regionSubdivisionCountry.isEmpty() &&
503 !localeLanguageCountry.isEmpty() &&
504 regionSubdivisionCountry == localeLanguageCountry ) {
505 if ( languageSubdivisionOnlyMatch.isEmpty() ) {
506 languageSubdivisionOnlyMatch = regionCode;
511 QString defaultRegionCode;
513 if ( !countryAndLanguageMatch.isEmpty() ) {
514 defaultRegionCode = countryAndLanguageMatch;
515 }
else if ( !countryOnlyMatch.isEmpty() ) {
516 defaultRegionCode = countryOnlyMatch;
517 }
else if ( !subdivisionAndLanguageMatch.isEmpty() ) {
518 defaultRegionCode = subdivisionAndLanguageMatch;
519 }
else if ( !subdivisionOnlyMatch.isEmpty() ) {
520 defaultRegionCode = subdivisionOnlyMatch;
521 }
else if ( !languageCountryAndLanguageMatch.isEmpty() ) {
522 defaultRegionCode = languageCountryAndLanguageMatch;
523 }
else if ( !languageCountryOnlyMatch.isEmpty() ) {
524 defaultRegionCode = languageCountryOnlyMatch;
525 }
else if ( !languageSubdivisionAndLanguageMatch.isEmpty() ) {
526 defaultRegionCode = languageSubdivisionAndLanguageMatch;
527 }
else if ( !languageSubdivisionOnlyMatch.isEmpty() ) {
528 defaultRegionCode = languageSubdivisionOnlyMatch;
531 return defaultRegionCode;
HolidayParserDriverPlan implementation class.
HolidayParserDriver abstract base class.