Skip to content

Commit a1ccfe3

Browse files
committed
Update Denmark holidays: add th l10n support, refactor test cases
1 parent 81da7b7 commit a1ccfe3

File tree

4 files changed

+269
-48
lines changed

4 files changed

+269
-48
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -557,7 +557,7 @@ any) in brackets, available languages and additional holiday categories. All cou
557557
<td>Denmark</td>
558558
<td>DK</td>
559559
<td></td>
560-
<td><strong>da</strong>, en_US, uk</td>
560+
<td><strong>da</strong>, en_US, th, uk</td>
561561
<td>OPTIONAL</td>
562562
</tr>
563563
<tr>

holidays/countries/denmark.py

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,21 @@ class Denmark(HolidayBase, ChristianHolidays, InternationalHolidays):
2222
2323
References:
2424
* <https://en.wikipedia.org/wiki/Public_holidays_in_Denmark>
25+
* <https://da.wikipedia.org/wiki/Danske_helligdage>
26+
* <https://da.wikipedia.org/wiki/Helligdagsreformen_af_1770>
2527
* <https://web.archive.org/web/20250422010005/https://www.norden.org/en/info-norden/public-holidays-denmark>
2628
* <https://web.archive.org/web/20231219155820/http://www.ft.dk/samling/20222/lovforslag/l13/index.htm>
29+
* <https://web.archive.org/web/20250119084025/https://www.retsinformation.dk/eli/lta/2023/214>
30+
* <https://web.archive.org/web/20251016080453/https://cphpost.dk/2025-05-01/life-in-denmark/what-happens-on-the-1st-of-may/>
31+
* <https://web.archive.org/web/20140202200655/https://bibliotek.kk.dk/biblioteker/blog/grundlovsdag-dens-traditioner>
2732
"""
2833

2934
country = "DK"
3035
default_language = "da"
36+
# The Helligdagsreformen af 1770 was in effect from October 16th, 1770 onwards.
37+
start_year = 1771
3138
supported_categories = (OPTIONAL, PUBLIC)
32-
supported_languages = ("da", "en_US", "uk")
39+
supported_languages = ("da", "en_US", "th", "uk")
3340

3441
def __init__(self, *args, **kwargs):
3542
ChristianHolidays.__init__(self)
@@ -52,6 +59,7 @@ def _populate_public_holidays(self):
5259
# Easter Monday.
5360
self._add_easter_monday(tr("Anden påskedag"))
5461

62+
# Removed via Act no. 214 of 06/03/2023, in effect January 1st, 2024.
5563
if self._year <= 2023:
5664
# Great Day of Prayers.
5765
self._add_holiday_26_days_past_easter(tr("Store bededag"))
@@ -72,11 +80,15 @@ def _populate_public_holidays(self):
7280
self._add_christmas_day_two(tr("Anden juledag"))
7381

7482
def _populate_optional_holidays(self):
75-
# Workers' Day.
76-
self._add_labor_day(tr("Arbejdernes kampdag"))
77-
78-
# Constitution Day.
79-
self._add_holiday_jun_5(tr("Grundlovsdag"))
83+
# First observance in 1890.
84+
if self._year >= 1890:
85+
# Workers' Day.
86+
self._add_labor_day(tr("Arbejdernes kampdag"))
87+
88+
# Gained its statutory day-off status in 1891.
89+
if self._year >= 1891:
90+
# Constitution Day.
91+
self._add_holiday_jun_5(tr("Grundlovsdag"))
8092

8193
# Christmas Eve.
8294
self._add_christmas_eve(tr("Juleaftensdag"))
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
# holidays
2+
# --------
3+
# A fast, efficient Python library for generating country, province and state
4+
# specific sets of holidays on the fly. It aims to make determining whether a
5+
# specific date is a holiday as fast and flexible as possible.
6+
#
7+
# Authors: Vacanza Team and individual contributors (see CONTRIBUTORS file)
8+
# dr-prodigy <[email protected]> (c) 2017-2023
9+
# ryanss <[email protected]> (c) 2014-2017
10+
# Website: https://github.com/vacanza/holidays
11+
# License: MIT (see LICENSE file)
12+
#
13+
# Denmark holidays th localization.
14+
#
15+
msgid ""
16+
msgstr ""
17+
"Project-Id-Version: Holidays 0.83\n"
18+
"POT-Creation-Date: 2025-10-16 17:02+0700\n"
19+
"PO-Revision-Date: 2025-10-16 17:44+0700\n"
20+
"Last-Translator: PPsyrius <[email protected]>\n"
21+
"Language-Team: Holidays Localization Team\n"
22+
"Language: th\n"
23+
"MIME-Version: 1.0\n"
24+
"Content-Type: text/plain; charset=UTF-8\n"
25+
"Content-Transfer-Encoding: 8bit\n"
26+
"Generated-By: Lingva 5.0.6\n"
27+
"X-Generator: Poedit 3.8\n"
28+
"X-Source-Language: da\n"
29+
30+
#. New Year's Day.
31+
msgid "Nytårsdag"
32+
msgstr "วันขึ้นปีใหม่"
33+
34+
#. Maundy Thursday.
35+
msgid "Skærtorsdag"
36+
msgstr "วันพฤหัสศักดิสิทธิ์"
37+
38+
#. Good Friday.
39+
msgid "Langfredag"
40+
msgstr "วันศุกร์ประเสริฐ"
41+
42+
#. Easter Sunday.
43+
msgid "Påskedag"
44+
msgstr "วันอาทิตย์อีสเตอร์"
45+
46+
#. Easter Monday.
47+
msgid "Anden påskedag"
48+
msgstr "วันจันทร์อีสเตอร์"
49+
50+
#. Great Day of Prayers.
51+
msgid "Store bededag"
52+
msgstr "วันแห่งการอธิษฐานใหญ่"
53+
54+
#. Ascension Day.
55+
msgid "Kristi himmelfartsdag"
56+
msgstr "วันสมโภชพระเยซูเจ้าเสด็จขึ้นสวรรค์"
57+
58+
#. Whit Sunday.
59+
msgid "Pinsedag"
60+
msgstr "วันสมโภชพระจิตเจ้า"
61+
62+
#. Whit Monday.
63+
msgid "Anden pinsedag"
64+
msgstr "วันจันทร์หลังวันสมโภชพระจิตเจ้า"
65+
66+
#. Christmas Day.
67+
msgid "Juledag"
68+
msgstr "วันคริสต์มาส"
69+
70+
#. Second Day of Christmas.
71+
msgid "Anden juledag"
72+
msgstr "วันคริสต์มาสวันที่สอง"
73+
74+
#. Workers' Day.
75+
msgid "Arbejdernes kampdag"
76+
msgstr "วันแรงงาน"
77+
78+
#. Constitution Day.
79+
msgid "Grundlovsdag"
80+
msgstr "วันรัฐธรรมนูญ"
81+
82+
#. Christmas Eve.
83+
msgid "Juleaftensdag"
84+
msgstr "วันคริสต์มาสอีฟ"
85+
86+
#. New Year's Eve.
87+
msgid "Nytårsaften"
88+
msgstr "วันสิ้นปี"

tests/countries/test_denmark.py

Lines changed: 162 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -20,55 +20,157 @@
2020
class TestDenmark(CommonCountryTests, TestCase):
2121
@classmethod
2222
def setUpClass(cls):
23-
super().setUpClass(Denmark)
23+
cls.full_range = range(1771, 2050)
24+
super().setUpClass(Denmark, years=cls.full_range)
25+
cls.optional_holidays = Denmark(categories=OPTIONAL, years=cls.full_range)
2426

2527
def test_country_aliases(self):
2628
self.assertAliases(Denmark, DK, DNK)
2729

28-
def test_2016(self):
29-
# http://www.officeholidays.com/countries/denmark/2016.php
30-
self.assertHolidays(
31-
("2016-01-01", "Nytårsdag"),
32-
("2016-03-24", "Skærtorsdag"),
33-
("2016-03-25", "Langfredag"),
34-
("2016-03-27", "Påskedag"),
35-
("2016-03-28", "Anden påskedag"),
36-
("2016-04-22", "Store bededag"),
37-
("2016-05-05", "Kristi himmelfartsdag"),
38-
("2016-05-15", "Pinsedag"),
39-
("2016-05-16", "Anden pinsedag"),
40-
("2016-12-25", "Juledag"),
41-
("2016-12-26", "Anden juledag"),
42-
)
43-
44-
def test_2022(self):
45-
self.assertHolidays(
46-
("2022-01-01", "Nytårsdag"),
47-
("2022-04-14", "Skærtorsdag"),
48-
("2022-04-15", "Langfredag"),
49-
("2022-04-17", "Påskedag"),
50-
("2022-04-18", "Anden påskedag"),
51-
("2022-05-13", "Store bededag"),
52-
("2022-05-26", "Kristi himmelfartsdag"),
53-
("2022-06-05", "Pinsedag"),
54-
("2022-06-06", "Anden pinsedag"),
55-
("2022-12-25", "Juledag"),
56-
("2022-12-26", "Anden juledag"),
30+
def test_no_holidays(self):
31+
self.assertNoHolidays(Denmark(categories=Denmark.supported_categories, years=1770))
32+
33+
def test_new_years_day(self):
34+
self.assertHolidayName("Nytårsdag", (f"{year}-01-01" for year in self.full_range))
35+
36+
def test_holy_thursday(self):
37+
name = "Skærtorsdag"
38+
self.assertHolidayName(
39+
name,
40+
"2020-04-09",
41+
"2021-04-01",
42+
"2022-04-14",
43+
"2023-04-06",
44+
"2024-03-28",
45+
"2025-04-17",
5746
)
47+
self.assertHolidayName(name, self.full_range)
5848

59-
def test_2022_optional(self):
60-
self.assertHolidays(
61-
Denmark(categories=OPTIONAL, years=2022),
62-
("2022-05-01", "Arbejdernes kampdag"),
63-
("2022-06-05", "Grundlovsdag"),
64-
("2022-12-24", "Juleaftensdag"),
65-
("2022-12-31", "Nytårsaften"),
49+
def test_good_friday(self):
50+
name = "Langfredag"
51+
self.assertHolidayName(
52+
name,
53+
"2020-04-10",
54+
"2021-04-02",
55+
"2022-04-15",
56+
"2023-04-07",
57+
"2024-03-29",
58+
"2025-04-18",
6659
)
60+
self.assertHolidayName(name, self.full_range)
6761

68-
def test_2024(self):
69-
# https://www.officeholidays.com/countries/denmark/2024
70-
self.assertNoHoliday("2024-04-26")
71-
self.assertNoHolidayName("Store bededag", Denmark(years=2024))
62+
def test_easter_sunday(self):
63+
name = "Påskedag"
64+
self.assertHolidayName(
65+
name,
66+
"2020-04-12",
67+
"2021-04-04",
68+
"2022-04-17",
69+
"2023-04-09",
70+
"2024-03-31",
71+
"2025-04-20",
72+
)
73+
self.assertHolidayName(name, self.full_range)
74+
75+
def test_easter_monday(self):
76+
name = "Anden påskedag"
77+
self.assertHolidayName(
78+
name,
79+
"2020-04-13",
80+
"2021-04-05",
81+
"2022-04-18",
82+
"2023-04-10",
83+
"2024-04-01",
84+
"2025-04-21",
85+
)
86+
self.assertHolidayName(name, self.full_range)
87+
88+
def test_workers_day(self):
89+
name = "Arbejdernes kampdag"
90+
self.assertNoHolidayName(name)
91+
self.assertHolidayName(
92+
name, self.optional_holidays, (f"{year}-05-01" for year in range(1890, 2050))
93+
)
94+
self.assertNoHolidayName(name, self.optional_holidays, range(1771, 1890))
95+
96+
def test_great_day_of_prayers(self):
97+
name = "Store bededag"
98+
self.assertHolidayName(
99+
name,
100+
"2020-05-08",
101+
"2021-04-30",
102+
"2022-05-13",
103+
"2023-05-05",
104+
)
105+
self.assertHolidayName(name, range(1771, 2024))
106+
self.assertNoHolidayName(name, range(2024, 2050))
107+
108+
def test_ascension_day(self):
109+
name = "Kristi himmelfartsdag"
110+
self.assertHolidayName(
111+
name,
112+
"2020-05-21",
113+
"2021-05-13",
114+
"2022-05-26",
115+
"2023-05-18",
116+
"2024-05-09",
117+
"2025-05-29",
118+
)
119+
self.assertHolidayName(name, self.full_range)
120+
121+
def test_whit_sunday(self):
122+
name = "Pinsedag"
123+
self.assertHolidayName(
124+
name,
125+
"2020-05-31",
126+
"2021-05-23",
127+
"2022-06-05",
128+
"2023-05-28",
129+
"2024-05-19",
130+
"2025-06-08",
131+
)
132+
self.assertHolidayName(name, self.full_range)
133+
134+
def test_whit_monday(self):
135+
name = "Anden pinsedag"
136+
self.assertHolidayName(
137+
name,
138+
"2020-06-01",
139+
"2021-05-24",
140+
"2022-06-06",
141+
"2023-05-29",
142+
"2024-05-20",
143+
"2025-06-09",
144+
)
145+
self.assertHolidayName(name, self.full_range)
146+
147+
def test_constitution_day(self):
148+
name = "Grundlovsdag"
149+
self.assertNoHolidayName(name)
150+
self.assertHolidayName(
151+
name, self.optional_holidays, (f"{year}-06-05" for year in range(1891, 2050))
152+
)
153+
self.assertNoHolidayName(name, self.optional_holidays, range(1771, 1891))
154+
155+
def test_christmas_eve(self):
156+
name = "Juleaftensdag"
157+
self.assertNoHolidayName(name)
158+
self.assertHolidayName(
159+
name, self.optional_holidays, (f"{year}-12-24" for year in self.full_range)
160+
)
161+
162+
def test_christmas_day(self):
163+
self.assertHolidayName("Juledag", (f"{year}-12-25" for year in self.full_range))
164+
165+
def test_second_day_of_christmas(self):
166+
self.assertHolidayName("Anden juledag", (f"{year}-12-26" for year in self.full_range))
167+
168+
def test_new_years_eve(self):
169+
name = "Nytårsaften"
170+
self.assertNoHolidayName(name)
171+
self.assertHolidayName(
172+
name, self.optional_holidays, (f"{year}-12-31" for year in self.full_range)
173+
)
72174

73175
def test_l10n_default(self):
74176
self.assertLocalizedHolidays(
@@ -107,6 +209,25 @@ def test_l10n_en_us(self):
107209
("2022-12-31", "New Year's Eve"),
108210
)
109211

212+
def test_l10n_th(self):
213+
self.assertLocalizedHolidays(
214+
"th",
215+
("2022-01-01", "วันขึ้นปีใหม่"),
216+
("2022-04-14", "วันพฤหัสศักดิสิทธิ์"),
217+
("2022-04-15", "วันศุกร์ประเสริฐ"),
218+
("2022-04-17", "วันอาทิตย์อีสเตอร์"),
219+
("2022-04-18", "วันจันทร์อีสเตอร์"),
220+
("2022-05-01", "วันแรงงาน"),
221+
("2022-05-13", "วันแห่งการอธิษฐานใหญ่"),
222+
("2022-05-26", "วันสมโภชพระเยซูเจ้าเสด็จขึ้นสวรรค์"),
223+
("2022-06-05", "วันรัฐธรรมนูญ; วันสมโภชพระจิตเจ้า"),
224+
("2022-06-06", "วันจันทร์หลังวันสมโภชพระจิตเจ้า"),
225+
("2022-12-24", "วันคริสต์มาสอีฟ"),
226+
("2022-12-25", "วันคริสต์มาส"),
227+
("2022-12-26", "วันคริสต์มาสวันที่สอง"),
228+
("2022-12-31", "วันสิ้นปี"),
229+
)
230+
110231
def test_l10n_uk(self):
111232
self.assertLocalizedHolidays(
112233
"uk",

0 commit comments

Comments
 (0)