Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix the Holidays in French speaking Switzerland #217

Merged
merged 9 commits into from
Apr 2, 2024
9 changes: 8 additions & 1 deletion lang/switzerland/fr/holidays.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
{
"Neujahr": "Nouvel An",
"Neujahrs nächster tag": "Lendemain du Nouvel An",
"Berchtoldstag": "Saint-Berthold",
"Heilige Drei Könige": "Épiphanie",
"Neuenburger Republik tag": "Instauration de la République de Neuchâtel",
"Josefstag": "Saint-Joseph",
"Karfreitag": "Vendredi saint",
"Ostermontag": "Lundi de Pâques",
Expand All @@ -10,10 +12,15 @@
"Pfingstmontag": "Lundi de Pentecôte",
"Fronleichnam": "Fête-Dieu",
"Bundesfeier": "Fête nationale",
"Bundesfeier nächster tag": "Lendemain de la Fête nationale",
"Maria Himmelfahrt": "Assomption",
"Genfer Fasten": "Jeûne genevois",
"Buss- und Bettag": "Jeûne fédéral",
"Buss- und Bettag Montag": "Lundi du Jeûne fédéral",
"Allerheiligen": "Toussaint",
"Maria Empfängnis": "Immaculée Conception",
"Weihnachtstag": "Noël",
"Stephanstag": "Saint-Étienne"
"Weihnachtsnächstertag": "Lendemain de Noël",
"Stephanstag": "Saint-Étienne",
"Genf Republik tag": "Instauration de la République de Genève"
}
9 changes: 8 additions & 1 deletion lang/switzerland/it/holidays.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
{
"Neujahr": "Capodanno",
"Neujahrs nächster tag": "Il giorno dopo Capodanno",
"Berchtoldstag": "San Silvestro",
"Heilige Drei Könige": "Epifania",
"Neuenburger Republik tag": "Istituzione della Repubblica di Neuchâtel",
"Josefstag": "San Giuseppe",
"Karfreitag": "Venerdì Santo",
"Ostermontag": "Lunedì di Pasqua",
Expand All @@ -10,10 +12,15 @@
"Pfingstmontag": "Lunedì di Pentecoste",
"Fronleichnam": "Corpus Domini",
"Bundesfeier": "Festa nazionale",
"Bundesfeier nächster tag": "Il giorno dopo la festa nazionale",
"Maria Himmelfahrt": "Assunzione",
"Genfer Fasten": "Jeûne genevois",
"Buss- und Bettag": "Digiuno federale",
"Buss- und Bettag Montag": "Digiuno federale Lunedì",
"Allerheiligen": "Ognissanti",
"Maria Empfängnis": "Immacolata Concezione",
"Weihnachtstag": "Natale",
"Stephanstag": "Santo Stefano"
"Weihnachtsnächstertag": "Il giorno dopo la festa di Natale",
"Stephanstag": "Santo Stefano",
"Genf Republik tag": "Istituzione della Repubblica di Ginevra"
}
56 changes: 55 additions & 1 deletion src/Countries/Switzerland.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ class Switzerland extends Country implements HasTranslations
'ch-bs',
'ch-be',
'ch-fr',
'ch-fr-c',
'ch-fr-r',
'ch-ge',
'ch-gl',
'ch-gr',
Expand All @@ -42,10 +44,14 @@ class Switzerland extends Country implements HasTranslations

private const NEW_YEARS_DAY = 'Neujahr';

private const NEW_YEARS_NEXT_DAY = 'Neujahrs nächster tag';

private const BERCHTOLDS_DAY = 'Berchtoldstag';

private const THREE_KINGS_DAY = 'Heilige Drei Könige';

private const NEUCHATEL_REPUBLIC_DAY = 'Neuenburger Republik tag';

private const SAINT_JOSEPHS_DAY = 'Josefstag';

private const GOOD_FRIDAY = 'Karfreitag';
Expand All @@ -62,18 +68,28 @@ class Switzerland extends Country implements HasTranslations

private const SWISS_NATIONAL_HOLIDAY = 'Bundesfeier';

private const SWISS_NATIONAL_HOLIDAY_NEXT_DAY = 'Bundesfeier nächster tag';

private const ASSUMPTION_DAY = 'Maria Himmelfahrt';

private const GENEVA_DAY_OF_FASTING = 'Genfer Fasten';

private const FEDERAL_DAY_OF_THANKSGIVING_REPENTANCE_AND_PRAYER = 'Buss- und Bettag';

private const FEDERAL_DAY_OF_THANKSGIVING_REPENTANCE_AND_PRAYER_MONDAY = 'Buss- und Bettag Montag';

private const ALL_SAINTS_DAY = 'Allerheiligen';

private const IMMACULATE_CONCEPTION = 'Maria Empfängnis';

private const CHRISTMAS_DAY = 'Weihnachtstag';

private const CHRISTMAS_NEXT_DAY = 'Weihnachtsnächstertag';

private const SAINT_STEPHENS_DAY = 'Stephanstag';

private const GENEVA_REPUBLIC_DAY = 'Genf Republik tag';

public function __construct(protected ?string $region = null)
{
if ($region !== null && ! in_array($region, self::REGIONS)) {
Expand Down Expand Up @@ -110,19 +126,26 @@ public function regionalHolidays(int $year): array
];

$regionallyDifferentHolidays = [
self::NEW_YEARS_NEXT_DAY => '01-02',
self::BERCHTOLDS_DAY => '01-02',
self::THREE_KINGS_DAY => '01-06',
self::NEUCHATEL_REPUBLIC_DAY => '03-01',
self::SAINT_JOSEPHS_DAY => '03-19',
self::GOOD_FRIDAY => $easter->subDays(2),
self::EASTER_MONDAY => $easter->addDay(),
self::LABOUR_DAY => '05-01',
self::WHIT_MONDAY => $easter->addDays(50),
self::CORPUS_CHRISTI => $easter->addDays(60),
self::SWISS_NATIONAL_HOLIDAY_NEXT_DAY => '08-02',
self::ASSUMPTION_DAY => '08-15',
self::GENEVA_DAY_OF_FASTING => (new CarbonImmutable('first sunday of September '.$year, 'Europe/Zurich'))->addDays(4), // Thursday after the first Sunday of September
self::FEDERAL_DAY_OF_THANKSGIVING_REPENTANCE_AND_PRAYER => new CarbonImmutable('third sunday of September '.$year, 'Europe/Zurich'),
self::FEDERAL_DAY_OF_THANKSGIVING_REPENTANCE_AND_PRAYER_MONDAY => (new CarbonImmutable('third sunday of September '.$year, 'Europe/Zurich'))->addDay(),
self::ALL_SAINTS_DAY => '11-01',
self::IMMACULATE_CONCEPTION => '12-08',
self::SAINT_STEPHENS_DAY => '12-26',
self::CHRISTMAS_NEXT_DAY => '12-26',
self::GENEVA_REPUBLIC_DAY => '12-31',
];

$currentRegion = match ($this->region) {
Expand Down Expand Up @@ -163,13 +186,26 @@ public function regionalHolidays(int $year): array
self::WHIT_MONDAY,
self::SAINT_STEPHENS_DAY,
],
'ch-fr' => [
'ch-fr', 'ch-fr-c' => [ // Catholic part of the canton is the default
self::GOOD_FRIDAY,
self::CORPUS_CHRISTI,
self::ASSUMPTION_DAY,
self::ALL_SAINTS_DAY,
self::IMMACULATE_CONCEPTION,
],
'ch-fr-r' => [ // Reformed part of the canton has special legislation for holidays
self::NEW_YEARS_NEXT_DAY,
self::GOOD_FRIDAY,
self::EASTER_MONDAY,
self::WHIT_MONDAY,
self::SAINT_STEPHENS_DAY,
],
'ch-ge' => [
self::GOOD_FRIDAY,
self::EASTER_MONDAY,
self::WHIT_MONDAY,
self::GENEVA_DAY_OF_FASTING,
self::GENEVA_REPUBLIC_DAY,
],
'ch-gl' => [
self::GOOD_FRIDAY,
Expand Down Expand Up @@ -198,6 +234,7 @@ public function regionalHolidays(int $year): array
self::SAINT_STEPHENS_DAY,
],
'ch-ne' => [
self::NEUCHATEL_REPUBLIC_DAY,
self::GOOD_FRIDAY,
self::LABOUR_DAY,
],
Expand Down Expand Up @@ -269,6 +306,7 @@ public function regionalHolidays(int $year): array
self::GOOD_FRIDAY,
self::EASTER_MONDAY,
self::WHIT_MONDAY,
self::FEDERAL_DAY_OF_THANKSGIVING_REPENTANCE_AND_PRAYER_MONDAY,
],
'ch-vs' => [
self::SAINT_JOSEPHS_DAY,
Expand Down Expand Up @@ -301,6 +339,22 @@ public function regionalHolidays(int $year): array
ARRAY_FILTER_USE_KEY
);

// Some holidays only happen in some years in some regions
if (in_array($this->region, ['ch-ge', 'ch-ne']) &&
(new CarbonImmutable("{$year}-01-01", 'Europe/Zurich'))->isSunday()) {
$regionalHolidays[self::NEW_YEARS_NEXT_DAY] = '01-02';
}

if (in_array($this->region, ['ch-ge']) &&
(new CarbonImmutable("{$year}-08-01", 'Europe/Zurich'))->isSunday()) {
$regionalHolidays[self::SWISS_NATIONAL_HOLIDAY_NEXT_DAY] = '08-02';
}

if (in_array($this->region, ['ch-ge', 'ch-ne']) &&
(new CarbonImmutable("{$year}-12-25", 'Europe/Zurich'))->isSunday()) {
$regionalHolidays[self::CHRISTMAS_NEXT_DAY] = '12-26';
}

return array_merge($regionalHolidays, $sharedHolidays);
}

Expand Down