Repository: vacanza/holidays (python)

Issue:
Add Tokelau holidays
URLs:
 - https://en.wikipedia.org/wiki/Public_holidays_in_Tokelau
 - https://publicholidays.asia/tokelau/
 - https://www.qppstudio.net/public-holidays/tokelau.htm
 - https://holidayapi.com/countries/tk/2058

Pull request description:
Add Tokelau holidays
<!--
  Thanks for contributing to holidays!
-->

## Proposed change

<!--
  Describe the big picture of your changes.
  Don't forget to link your PR to an existing issue if any.
-->

Resolves #2432.

## Type of change

<!--
  Type of change you want to introduce. Please, check one (1) box only!
  If your PR requires multiple boxes to be checked, most likely it needs to
  be split into multiple PRs.
-->

- [x] New country/market holidays support (thank you!)
- [ ] Supported country/market holidays update (calendar discrepancy fix, localization)
- [ ] Existing code/documentation/test/process quality improvement (best practice, cleanup, refactoring, optimization)
- [ ] Dependency update (version deprecation/pin/upgrade)
- [ ] Bugfix (non-breaking change which fixes an issue)
- [ ] Breaking change (a code change causing existing functionality to break)
- [ ] New feature (new `holidays` functionality in general)

## Checklist

<!--
  Put an `x` in the boxes that apply. You can change them after PR is created.
-->

- [x] I've followed the [contributing guidelines][contributing-guidelines]
- [x] I've successfully run `make check`, all checks and tests are green

<!--
  Thanks again for your contribution!
-->

[contributing-guidelines]: https://github.com/vacanza/holidays/blob/dev/CONTRIBUTING.md
[docs]: https://github.com/vacanza/holidays/tree/dev/docs/source


Patch:
diff --git a/README.md b/README.md
index 0dcfeffe..19b71bfa 100644
--- a/README.md
+++ b/README.md
@@ -105,7 +105,7 @@ and detailed information.
 
 ## Available Countries
 
-We currently support 216 country codes. The standard way to refer to a country is by using its [ISO
+We currently support 217 country codes. The standard way to refer to a country is by using its [ISO
 3166-1 alpha-2 code](https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes), the same used
 for domain names, and for a subdivision its [ISO 3166-2
 code](https://en.wikipedia.org/wiki/ISO_3166-2). Some countries have common or foreign names or
@@ -1505,6 +1505,13 @@ any) in brackets, available languages and additional holiday categories. All cou
 <td>WORKDAY</td>
 </tr>
 <tr>
+<td>Tokelau</td>
+<td>TK</td>
+<td></td>
+<td><strong>en_TK</strong>, en_US, tkl</td>
+<td></td>
+</tr>
+<tr>
 <td>Tonga</td>
 <td>TO</td>
 <td></td>
diff --git a/holidays/countries/__init__.py b/holidays/countries/__init__.py
index 9ac3d027..8e491c56 100644
--- a/holidays/countries/__init__.py
+++ b/holidays/countries/__init__.py
@@ -220,6 +220,7 @@ from holidays.countries.tanzania import Tanzania, TZ, TZA
 from holidays.countries.thailand import Thailand, TH, THA
 from holidays.countries.timor_leste import TimorLeste, TL, TLS
 from holidays.countries.togo import Togo, TG, TGO
+from holidays.countries.tokelau import Tokelau, TK, TKL
 from holidays.countries.tonga import Tonga, TO, TON
 from holidays.countries.trinidad_and_tobago import TrinidadAndTobago, TT, TTO
 from holidays.countries.tunisia import Tunisia, TN, TUN
diff --git a/holidays/countries/tokelau.py b/holidays/countries/tokelau.py
new file mode 100644
index 00000000..2bef7614
--- /dev/null
+++ b/holidays/countries/tokelau.py
@@ -0,0 +1,66 @@
+#  holidays
+#  --------
+#  A fast, efficient Python library for generating country, province and state
+#  specific sets of holidays on the fly. It aims to make determining whether a
+#  specific date is a holiday as fast and flexible as possible.
+#
+#  Authors: Vacanza Team and individual contributors (see CONTRIBUTORS file)
+#           dr-prodigy <dr.prodigy.github@gmail.com> (c) 2017-2023
+#           ryanss <ryanssdev@icloud.com> (c) 2014-2017
+#  Website: https://github.com/vacanza/holidays
+#  License: MIT (see LICENSE file)
+
+from gettext import gettext as tr
+
+from holidays.calendars.gregorian import SUN
+from holidays.groups import ChristianHolidays, InternationalHolidays
+from holidays.holiday_base import HolidayBase
+
+
+class Tokelau(HolidayBase, ChristianHolidays, InternationalHolidays):
+    """Tokelau holidays.
+
+    References:
+        * <https://en.wikipedia.org/wiki/Public_holidays_in_Tokelau>
+        * <https://web.archive.org/web/20250715060109/https://www.tokelau.org.nz/About+Us/Culture.html>
+        * [Interpretation Rules 2003](https://web.archive.org/web/20250715065528/https://paclii.org/tk/legis/consol_act_2016/ir2003240.pdf)
+    """
+
+    country = "TK"
+    default_language = "en_TK"
+    supported_languages = ("en_TK", "en_US", "tkl")
+    # Interpretation Rules 2003.
+    start_year = 2003
+    weekend = {SUN}
+
+    def __init__(self, *args, **kwargs):
+        ChristianHolidays.__init__(self)
+        InternationalHolidays.__init__(self)
+        super().__init__(*args, **kwargs)
+
+    def _populate_public_holidays(self):
+        # New Year's Day.
+        self._add_new_years_day(tr("New Year's Day"))
+
+        # Good Friday.
+        self._add_good_friday(tr("Good Friday"))
+
+        # Easter Monday.
+        self._add_easter_monday(tr("Easter Monday"))
+
+        # Tokehega Day.
+        self._add_holiday_sep_3(tr("Tokehega Day"))
+
+        # Christmas Day.
+        self._add_christmas_day(tr("Christmas Day"))
+
+        # Boxing Day.
+        self._add_christmas_day_two(tr("Boxing Day"))
+
+
+class TK(Tokelau):
+    pass
+
+
+class TKL(Tokelau):
+    pass
diff --git a/holidays/locale/en_TK/LC_MESSAGES/TK.po b/holidays/locale/en_TK/LC_MESSAGES/TK.po
new file mode 100644
index 00000000..38d4d833
--- /dev/null
+++ b/holidays/locale/en_TK/LC_MESSAGES/TK.po
@@ -0,0 +1,51 @@
+#  holidays
+#  --------
+#  A fast, efficient Python library for generating country, province and state
+#  specific sets of holidays on the fly. It aims to make determining whether a
+#  specific date is a holiday as fast and flexible as possible.
+#
+#  Authors: Vacanza Team and individual contributors (see CONTRIBUTORS file)
+#           dr-prodigy <dr.prodigy.github@gmail.com> (c) 2017-2023
+#           ryanss <ryanssdev@icloud.com> (c) 2014-2017
+#  Website: https://github.com/vacanza/holidays
+#  License: MIT (see LICENSE file)
+#
+# Tokelau holidays.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Holidays 0.77\n"
+"POT-Creation-Date: 2025-07-12 01:31+0530\n"
+"PO-Revision-Date: 2025-07-12 01:31+0530\n"
+"Last-Translator: Ansh Anand <ansh.a.3112@gmail.com>\n"
+"Language-Team: Holidays Localization Team\n"
+"Language: en_TK\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Lingva 5.0.6\n"
+"X-Source-Language: en_TK\n"
+
+#. New Year's Day.
+msgid "New Year's Day"
+msgstr ""
+
+#. Good Friday.
+msgid "Good Friday"
+msgstr ""
+
+#. Easter Monday.
+msgid "Easter Monday"
+msgstr ""
+
+#. Tokehega Day.
+msgid "Tokehega Day"
+msgstr ""
+
+#. Christmas Day.
+msgid "Christmas Day"
+msgstr ""
+
+#. Boxing Day.
+msgid "Boxing Day"
+msgstr ""
diff --git a/holidays/locale/en_US/LC_MESSAGES/TK.po b/holidays/locale/en_US/LC_MESSAGES/TK.po
new file mode 100644
index 00000000..3f0523a0
--- /dev/null
+++ b/holidays/locale/en_US/LC_MESSAGES/TK.po
@@ -0,0 +1,51 @@
+#  holidays
+#  --------
+#  A fast, efficient Python library for generating country, province and state
+#  specific sets of holidays on the fly. It aims to make determining whether a
+#  specific date is a holiday as fast and flexible as possible.
+#
+#  Authors: Vacanza Team and individual contributors (see CONTRIBUTORS file)
+#           dr-prodigy <dr.prodigy.github@gmail.com> (c) 2017-2023
+#           ryanss <ryanssdev@icloud.com> (c) 2014-2017
+#  Website: https://github.com/vacanza/holidays
+#  License: MIT (see LICENSE file)
+#
+# Tokelau holidays en_US localization.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Holidays 0.77\n"
+"POT-Creation-Date: 2025-07-12 01:31+0530\n"
+"PO-Revision-Date: 2025-07-12 01:31+0530\n"
+"Last-Translator: Ansh Anand <ansh.a.3112@gmail.com>\n"
+"Language-Team: Holidays Localization Team\n"
+"Language: en_US\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Lingva 5.0.6\n"
+"X-Source-Language: en_TK\n"
+
+#. New Year's Day.
+msgid "New Year's Day"
+msgstr "New Year's Day"
+
+#. Good Friday.
+msgid "Good Friday"
+msgstr "Good Friday"
+
+#. Easter Monday.
+msgid "Easter Monday"
+msgstr "Easter Monday"
+
+#. Tokehega Day.
+msgid "Tokehega Day"
+msgstr "Tokehega Day"
+
+#. Christmas Day.
+msgid "Christmas Day"
+msgstr "Christmas Day"
+
+#. Boxing Day.
+msgid "Boxing Day"
+msgstr "Boxing Day"
diff --git a/holidays/locale/tkl/LC_MESSAGES/TK.po b/holidays/locale/tkl/LC_MESSAGES/TK.po
new file mode 100644
index 00000000..4c304e6c
--- /dev/null
+++ b/holidays/locale/tkl/LC_MESSAGES/TK.po
@@ -0,0 +1,51 @@
+#  holidays
+#  --------
+#  A fast, efficient Python library for generating country, province and state
+#  specific sets of holidays on the fly. It aims to make determining whether a
+#  specific date is a holiday as fast and flexible as possible.
+#
+#  Authors: Vacanza Team and individual contributors (see CONTRIBUTORS file)
+#           dr-prodigy <dr.prodigy.github@gmail.com> (c) 2017-2023
+#           ryanss <ryanssdev@icloud.com> (c) 2014-2017
+#  Website: https://github.com/vacanza/holidays
+#  License: MIT (see LICENSE file)
+#
+# Tokelau holidays tkl localization.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Holidays 0.77\n"
+"POT-Creation-Date: 2025-07-12 01:31+0530\n"
+"PO-Revision-Date: 2025-07-12 01:31+0530\n"
+"Last-Translator: Ansh Anand <ansh.a.3112@gmail.com>\n"
+"Language-Team: Holidays Localization Team\n"
+"Language: tkl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Lingva 5.0.6\n"
+"X-Source-Language: en_TK\n"
+
+#. New Year's Day.
+msgid "New Year's Day"
+msgstr "Aho Tauhaga Fou"
+
+#. Good Friday.
+msgid "Good Friday"
+msgstr "Ahofalaile Lelei"
+
+#. Easter Monday.
+msgid "Easter Monday"
+msgstr "Ahogafua o te Eheta"
+
+#. Tokehega Day.
+msgid "Tokehega Day"
+msgstr "Aho o te Tokehega"
+
+#. Christmas Day.
+msgid "Christmas Day"
+msgstr "Aho Kilihimahi"
+
+#. Boxing Day.
+msgid "Boxing Day"
+msgstr "Tua-aho Kilihimahi"
diff --git a/holidays/registry.py b/holidays/registry.py
index 00d93677..18196608 100644
--- a/holidays/registry.py
+++ b/holidays/registry.py
@@ -214,6 +214,7 @@ COUNTRIES: RegistryDict = {
     "thailand": ("Thailand", "TH", "THA"),
     "timor_leste": ("TimorLeste", "TL", "TLS"),
     "togo": ("Togo", "TG", "TGO"),
+    "tokelau": ("Tokelau", "TK", "TKL"),
     "tonga": ("Tonga", "TO", "TON"),
     "trinidad_and_tobago": ("TrinidadAndTobago", "TT", "TTO"),
     "tunisia": ("Tunisia", "TN", "TUN"),


Test patch:
diff --git a/tests/countries/test_tokelau.py b/tests/countries/test_tokelau.py
new file mode 100644
index 00000000..f5e9788d
--- /dev/null
+++ b/tests/countries/test_tokelau.py
@@ -0,0 +1,95 @@
+#  holidays
+#  --------
+#  A fast, efficient Python library for generating country, province and state
+#  specific sets of holidays on the fly. It aims to make determining whether a
+#  specific date is a holiday as fast and flexible as possible.
+#
+#  Authors: Vacanza Team and individual contributors (see CONTRIBUTORS file)
+#           dr-prodigy <dr.prodigy.github@gmail.com> (c) 2017-2023
+#           ryanss <ryanssdev@icloud.com> (c) 2014-2017
+#  Website: https://github.com/vacanza/holidays
+#  License: MIT (see LICENSE file)
+
+from unittest import TestCase
+
+from holidays.countries.tokelau import Tokelau, TK, TKL
+from tests.common import CommonCountryTests
+
+
+class TestTokelau(CommonCountryTests, TestCase):
+    @classmethod
+    def setUpClass(cls):
+        super().setUpClass(Tokelau, years=range(2003, 2050))
+
+    def test_country_aliases(self):
+        self.assertAliases(Tokelau, TK, TKL)
+
+    def test_new_years(self):
+        self.assertHolidayName("New Year's Day", (f"{year}-01-01" for year in range(2003, 2050)))
+
+    def test_good_friday(self):
+        name = "Good Friday"
+        self.assertHolidayName(
+            name,
+            "2020-04-10",
+            "2021-04-02",
+            "2022-04-15",
+            "2023-04-07",
+            "2024-03-29",
+            "2025-04-18",
+        )
+        self.assertHolidayName(name, range(2003, 2050))
+
+    def test_easter_monday(self):
+        name = "Easter Monday"
+        self.assertHolidayName(
+            name,
+            "2020-04-13",
+            "2021-04-05",
+            "2022-04-18",
+            "2023-04-10",
+            "2024-04-01",
+            "2025-04-21",
+        )
+        self.assertHolidayName(name, range(2003, 2050))
+
+    def test_tokehega_day(self):
+        self.assertHolidayName("Tokehega Day", (f"{year}-09-03" for year in range(2003, 2050)))
+
+    def test_christmas_day(self):
+        self.assertHolidayName("Christmas Day", (f"{year}-12-25" for year in range(2003, 2050)))
+
+    def test_boxing_day(self):
+        self.assertHolidayName("Boxing Day", (f"{year}-12-26" for year in range(2003, 2050)))
+
+    def test_l10n_default(self):
+        self.assertLocalizedHolidays(
+            ("2022-01-01", "New Year's Day"),
+            ("2022-04-15", "Good Friday"),
+            ("2022-04-18", "Easter Monday"),
+            ("2022-09-03", "Tokehega Day"),
+            ("2022-12-25", "Christmas Day"),
+            ("2022-12-26", "Boxing Day"),
+        )
+
+    def test_l10n_en_us(self):
+        self.assertLocalizedHolidays(
+            "en_US",
+            ("2022-01-01", "New Year's Day"),
+            ("2022-04-15", "Good Friday"),
+            ("2022-04-18", "Easter Monday"),
+            ("2022-09-03", "Tokehega Day"),
+            ("2022-12-25", "Christmas Day"),
+            ("2022-12-26", "Boxing Day"),
+        )
+
+    def test_l10n_tkl(self):
+        self.assertLocalizedHolidays(
+            "tkl",
+            ("2022-01-01", "Aho Tauhaga Fou"),
+            ("2022-04-15", "Ahofalaile Lelei"),
+            ("2022-04-18", "Ahogafua o te Eheta"),
+            ("2022-09-03", "Aho o te Tokehega"),
+            ("2022-12-25", "Aho Kilihimahi"),
+            ("2022-12-26", "Tua-aho Kilihimahi"),
+        )