Repository: vacanza/holidays
Pull request #2617 (2025-06-10 10:38:25)

Refactor Trinidad and Tobago 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.
-->

Remove the unnecessary `dts_observed.add( ... )` assignments for Good Friday and Easter Monday as discovered during a code review discussion with @Roshan-1024 for #2609 .

## 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.
-->

- [ ] New country/market holidays support (thank you!)
- [ ] Supported country/market holidays update (calendar discrepancy fix, localization)
- [x] 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


sonarqubecloud[bot]: ## [![Quality Gate Passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-passed-20px.png 'Quality Gate Passed')](https://sonarcloud.io/dashboard?id=vacanza_python-holidays&pullRequest=2617) **Quality Gate passed**  
Issues  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 New issues](https://sonarcloud.io/project/issues?id=vacanza_python-holidays&pullRequest=2617&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/accepted-16px.png '') [0 Accepted issues](https://sonarcloud.io/project/issues?id=vacanza_python-holidays&pullRequest=2617&issueStatuses=ACCEPTED)

Measures  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=vacanza_python-holidays&pullRequest=2617&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Coverage on New Code](https://sonarcloud.io/component_measures?id=vacanza_python-holidays&pullRequest=2617&metric=new_coverage&view=list)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Duplication on New Code](https://sonarcloud.io/component_measures?id=vacanza_python-holidays&pullRequest=2617&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=vacanza_python-holidays&pullRequest=2617)


codecov[bot]: ## [Codecov](https://app.codecov.io/gh/vacanza/holidays/pull/2617?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=vacanza) Report
All modified and coverable lines are covered by tests :white_check_mark:
> Project coverage is 100.00%. Comparing base [(`8b4f02b`)](https://app.codecov.io/gh/vacanza/holidays/commit/8b4f02b1582e639f04dd3789af0f73a9a0399848?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=vacanza) to head [(`30c1ee7`)](https://app.codecov.io/gh/vacanza/holidays/commit/30c1ee730762f1289f6b42f461f154954d59edd1?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=vacanza).

<details><summary>Additional details and impacted files</summary>


```diff
@@            Coverage Diff            @@
##               dev     #2617   +/-   ##
=========================================
  Coverage   100.00%   100.00%           
=========================================
  Files          229       229           
  Lines        14571     14571           
  Branches      2039      2039           
=========================================
  Hits         14571     14571           
```

</details>

[:umbrella: View full report in Codecov by Sentry](https://app.codecov.io/gh/vacanza/holidays/pull/2617?dropdown=coverage&src=pr&el=continue&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=vacanza).   
:loudspeaker: Have feedback on the report? [Share it here](https://about.codecov.io/codecov-pr-comment-feedback/?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=vacanza).

<details><summary> :rocket: New features to boost your workflow: </summary>

- :snowflake: [Test Analytics](https://docs.codecov.com/docs/test-analytics): Detect flaky tests, report on failures, and find test suite problems.
</details>

Patch:
diff --git a/CONTRIBUTORS b/CONTRIBUTORS
index 780484fd..763531ca 100644
--- a/CONTRIBUTORS
+++ b/CONTRIBUTORS
@@ -152,6 +152,7 @@ Tudor Văran
 Victor Luna
 Victor Miti
 Ville Skyttä
+Vilmos Prokaj
 Vu Nhat Chuong
 Wasif Shahzad
 Youhei Sakurai
diff --git a/holidays/countries/afghanistan.py b/holidays/countries/afghanistan.py
index b0075733..6af54636 100644
--- a/holidays/countries/afghanistan.py
+++ b/holidays/countries/afghanistan.py
@@ -50,7 +50,7 @@ class Afghanistan(HolidayBase, InternationalHolidays, IslamicHolidays, PersianCa
     start_year = 1919
     weekend = {FRI, SAT}
 
-    def __init__(self, islamic_show_estimated: bool = True, *args, **kwargs):
+    def __init__(self, *args, islamic_show_estimated: bool = True, **kwargs):
         """
         Args:
             islamic_show_estimated:
diff --git a/holidays/countries/albania.py b/holidays/countries/albania.py
index 408897b1..9b9c8b2f 100644
--- a/holidays/countries/albania.py
+++ b/holidays/countries/albania.py
@@ -47,7 +47,7 @@ class Albania(
     # Law No. 7651 from 21.12.1992.
     start_year = 1993
 
-    def __init__(self, islamic_show_estimated: bool = True, *args, **kwargs):
+    def __init__(self, *args, islamic_show_estimated: bool = True, **kwargs):
         """
         Args:
             islamic_show_estimated:
diff --git a/holidays/countries/algeria.py b/holidays/countries/algeria.py
index 6a0f9d53..f6bf0ba6 100644
--- a/holidays/countries/algeria.py
+++ b/holidays/countries/algeria.py
@@ -32,7 +32,7 @@ class Algeria(HolidayBase, InternationalHolidays, IslamicHolidays):
     estimated_label = tr("(تقدير) %s")
     supported_languages = ("ar", "en_US", "fr")
 
-    def __init__(self, islamic_show_estimated: bool = True, *args, **kwargs):
+    def __init__(self, *args, islamic_show_estimated: bool = True, **kwargs):
         """
         Args:
             islamic_show_estimated:
diff --git a/holidays/countries/argentina.py b/holidays/countries/argentina.py
index 8ae1a52a..2a5480ee 100644
--- a/holidays/countries/argentina.py
+++ b/holidays/countries/argentina.py
@@ -206,7 +206,7 @@ class Argentina(
     supported_languages = ("en_US", "es", "uk")
     supported_categories = (ARMENIAN, BANK, GOVERNMENT, HEBREW, ISLAMIC, PUBLIC)
 
-    def __init__(self, islamic_show_estimated: bool = True, *args, **kwargs):
+    def __init__(self, *args, islamic_show_estimated: bool = True, **kwargs):
         """
         Args:
             islamic_show_estimated:
diff --git a/holidays/countries/azerbaijan.py b/holidays/countries/azerbaijan.py
index 9c935dfb..49d126b2 100644
--- a/holidays/countries/azerbaijan.py
+++ b/holidays/countries/azerbaijan.py
@@ -45,7 +45,7 @@ class Azerbaijan(ObservedHolidayBase, InternationalHolidays, IslamicHolidays, St
     supported_languages = ("az", "en_US", "uk")
     start_year = 1990
 
-    def __init__(self, islamic_show_estimated: bool = True, *args, **kwargs):
+    def __init__(self, *args, islamic_show_estimated: bool = True, **kwargs):
         """
         Args:
             islamic_show_estimated:
diff --git a/holidays/countries/bahrain.py b/holidays/countries/bahrain.py
index aebaf018..177d6677 100644
--- a/holidays/countries/bahrain.py
+++ b/holidays/countries/bahrain.py
@@ -33,7 +33,7 @@ class Bahrain(HolidayBase, InternationalHolidays, IslamicHolidays):
     supported_languages = ("ar", "en_US")
     weekend = {FRI, SAT}
 
-    def __init__(self, islamic_show_estimated: bool = True, *args, **kwargs):
+    def __init__(self, *args, islamic_show_estimated: bool = True, **kwargs):
         """
         Args:
             islamic_show_estimated:
diff --git a/holidays/countries/benin.py b/holidays/countries/benin.py
index 815de2d3..6edc3788 100644
--- a/holidays/countries/benin.py
+++ b/holidays/countries/benin.py
@@ -75,7 +75,7 @@ class Benin(HolidayBase, ChristianHolidays, InternationalHolidays, IslamicHolida
     supported_categories = (PUBLIC, WORKDAY)
     supported_languages = ("en_US", "fr_BJ")
 
-    def __init__(self, islamic_show_estimated: bool = True, *args, **kwargs):
+    def __init__(self, *args, islamic_show_estimated: bool = True, **kwargs):
         """
         Args:
             islamic_show_estimated:
diff --git a/holidays/countries/bosnia_and_herzegovina.py b/holidays/countries/bosnia_and_herzegovina.py
index 21fb8c33..0750069e 100644
--- a/holidays/countries/bosnia_and_herzegovina.py
+++ b/holidays/countries/bosnia_and_herzegovina.py
@@ -75,7 +75,7 @@ class BosniaAndHerzegovina(
     }
     supported_languages = ("bs", "en_US", "sr", "uk")
 
-    def __init__(self, islamic_show_estimated: bool = True, *args, **kwargs):
+    def __init__(self, *args, islamic_show_estimated: bool = True, **kwargs):
         """
         Args:
             islamic_show_estimated:
diff --git a/holidays/countries/brunei.py b/holidays/countries/brunei.py
index c6f5417b..0c1d5e69 100644
--- a/holidays/countries/brunei.py
+++ b/holidays/countries/brunei.py
@@ -116,7 +116,7 @@ class Brunei(
     # Available post-Independence from 1984 afterwards
     start_year = 1984
 
-    def __init__(self, islamic_show_estimated: bool = True, *args, **kwargs):
+    def __init__(self, *args, islamic_show_estimated: bool = True, **kwargs):
         """
         Args:
             islamic_show_estimated:
diff --git a/holidays/countries/burkina_faso.py b/holidays/countries/burkina_faso.py
index 177ba723..8faf867f 100644
--- a/holidays/countries/burkina_faso.py
+++ b/holidays/countries/burkina_faso.py
@@ -29,7 +29,7 @@ class BurkinaFaso(ObservedHolidayBase, ChristianHolidays, InternationalHolidays,
     # gained independence from France.
     start_year = 1961
 
-    def __init__(self, islamic_show_estimated: bool = True, *args, **kwargs):
+    def __init__(self, *args, islamic_show_estimated: bool = True, **kwargs):
         """
         Args:
             islamic_show_estimated:
diff --git a/holidays/countries/burundi.py b/holidays/countries/burundi.py
index 02dded82..1093b258 100644
--- a/holidays/countries/burundi.py
+++ b/holidays/countries/burundi.py
@@ -29,7 +29,7 @@ class Burundi(ObservedHolidayBase, ChristianHolidays, InternationalHolidays, Isl
     observed_label = "%s (observed)"
     start_year = 1962
 
-    def __init__(self, islamic_show_estimated: bool = True, *args, **kwargs):
+    def __init__(self, *args, islamic_show_estimated: bool = True, **kwargs):
         """
         Args:
             islamic_show_estimated:
diff --git a/holidays/countries/cameroon.py b/holidays/countries/cameroon.py
index 81489b6f..08e42860 100644
--- a/holidays/countries/cameroon.py
+++ b/holidays/countries/cameroon.py
@@ -37,7 +37,7 @@ class Cameroon(
     # On 1 January 1960, French Cameroun gained independence from France.
     start_year = 1960
 
-    def __init__(self, islamic_show_estimated: bool = True, *args, **kwargs):
+    def __init__(self, *args, islamic_show_estimated: bool = True, **kwargs):
         """
         Args:
             islamic_show_estimated:
diff --git a/holidays/countries/chad.py b/holidays/countries/chad.py
index c0472365..05298786 100644
--- a/holidays/countries/chad.py
+++ b/holidays/countries/chad.py
@@ -36,7 +36,7 @@ class Chad(
     # On 11 August 1960, Chad gained independence from France.
     start_year = 1961
 
-    def __init__(self, islamic_show_estimated: bool = True, *args, **kwargs):
+    def __init__(self, *args, islamic_show_estimated: bool = True, **kwargs):
         """
         Args:
             islamic_show_estimated:
diff --git a/holidays/countries/cocos_islands.py b/holidays/countries/cocos_islands.py
index d39a482b..d415f228 100644
--- a/holidays/countries/cocos_islands.py
+++ b/holidays/countries/cocos_islands.py
@@ -72,7 +72,7 @@ class CocosIslands(
     # Act of Self Determination 1984.
     start_year = 1985
 
-    def __init__(self, islamic_show_estimated: bool = True, *args, **kwargs):
+    def __init__(self, *args, islamic_show_estimated: bool = True, **kwargs):
         """
         Args:
             islamic_show_estimated:
diff --git a/holidays/countries/djibouti.py b/holidays/countries/djibouti.py
index 28772518..bbf12f04 100644
--- a/holidays/countries/djibouti.py
+++ b/holidays/countries/djibouti.py
@@ -29,7 +29,7 @@ class Djibouti(HolidayBase, ChristianHolidays, IslamicHolidays, InternationalHol
     # On 27 June 1977, Djibouti gained independence from France.
     start_year = 1978
 
-    def __init__(self, islamic_show_estimated: bool = True, *args, **kwargs):
+    def __init__(self, *args, islamic_show_estimated: bool = True, **kwargs):
         """
         Args:
             islamic_show_estimated:
diff --git a/holidays/countries/egypt.py b/holidays/countries/egypt.py
index c89b760f..f1151fc1 100644
--- a/holidays/countries/egypt.py
+++ b/holidays/countries/egypt.py
@@ -28,7 +28,7 @@ class Egypt(HolidayBase, ChristianHolidays, IslamicHolidays, InternationalHolida
     supported_languages = ("ar", "en_US")
     weekend = {FRI, SAT}
 
-    def __init__(self, islamic_show_estimated: bool = True, *args, **kwargs):
+    def __init__(self, *args, islamic_show_estimated: bool = True, **kwargs):
         """
         Args:
             islamic_show_estimated:
diff --git a/holidays/countries/ethiopia.py b/holidays/countries/ethiopia.py
index a50bcf99..29d30fa6 100644
--- a/holidays/countries/ethiopia.py
+++ b/holidays/countries/ethiopia.py
@@ -58,7 +58,7 @@ class Ethiopia(HolidayBase, ChristianHolidays, InternationalHolidays, IslamicHol
 
         return isleap(self._year + 1)
 
-    def __init__(self, islamic_show_estimated: bool = True, *args, **kwargs):
+    def __init__(self, *args, islamic_show_estimated: bool = True, **kwargs):
         """
         Args:
             islamic_show_estimated:
diff --git a/holidays/countries/fiji.py b/holidays/countries/fiji.py
index 94ff0c7e..80f47153 100644
--- a/holidays/countries/fiji.py
+++ b/holidays/countries/fiji.py
@@ -70,7 +70,7 @@ class Fiji(
     # Act No. 13 of 2015
     start_year = 2016
 
-    def __init__(self, islamic_show_estimated: bool = True, *args, **kwargs):
+    def __init__(self, *args, islamic_show_estimated: bool = True, **kwargs):
         """
         Args:
             islamic_show_estimated:
diff --git a/holidays/countries/gabon.py b/holidays/countries/gabon.py
index 09ee54fa..039097ea 100644
--- a/holidays/countries/gabon.py
+++ b/holidays/countries/gabon.py
@@ -30,7 +30,7 @@ class Gabon(HolidayBase, ChristianHolidays, InternationalHolidays, IslamicHolida
     # On 17 August 1960, Gabon gained independence from France.
     start_year = 1961
 
-    def __init__(self, islamic_show_estimated: bool = True, *args, **kwargs):
+    def __init__(self, *args, islamic_show_estimated: bool = True, **kwargs):
         """
         Args:
             islamic_show_estimated:
diff --git a/holidays/countries/ghana.py b/holidays/countries/ghana.py
index 066bc677..e2008ff8 100644
--- a/holidays/countries/ghana.py
+++ b/holidays/countries/ghana.py
@@ -32,7 +32,7 @@ class Ghana(ObservedHolidayBase, ChristianHolidays, InternationalHolidays, Islam
     observed_estimated_label = "%s (observed, estimated)"
     start_year = 1957
 
-    def __init__(self, islamic_show_estimated: bool = True, *args, **kwargs):
+    def __init__(self, *args, islamic_show_estimated: bool = True, **kwargs):
         """
         Args:
             islamic_show_estimated:
diff --git a/holidays/countries/guinea.py b/holidays/countries/guinea.py
index 3f9cad41..389862ca 100644
--- a/holidays/countries/guinea.py
+++ b/holidays/countries/guinea.py
@@ -48,7 +48,7 @@ class Guinea(ObservedHolidayBase, ChristianHolidays, InternationalHolidays, Isla
     # Guinea gained independence from France on October 2, 1958.
     start_year = 1959
 
-    def __init__(self, islamic_show_estimated: bool = True, *args, **kwargs):
+    def __init__(self, *args, islamic_show_estimated: bool = True, **kwargs):
         """
         Args:
             islamic_show_estimated:
diff --git a/holidays/countries/hungary.py b/holidays/countries/hungary.py
index d9e37472..18d7b901 100644
--- a/holidays/countries/hungary.py
+++ b/holidays/countries/hungary.py
@@ -117,6 +117,21 @@ class HungaryStaticHolidays:
     """Hungary special holidays.
 
     References:
+        * [1991](https://archive.org/details/7-1990-xii-27-mum-rendelet)
+        * [1992](https://web.archive.org/web/20250526085935/https://jogkodex.hu/jsz/1992_3_mum_rendelet_5937748)
+        * [1993](https://web.archive.org/web/20250526090343/https://jogkodex.hu/jsz/1992_7_mum_rendelet_7815697)
+        * [1994](https://web.archive.org/web/20250526090541/https://jogkodex.hu/jsz/1993_3_mum_rendelet_3120363)
+        * [1997](https://web.archive.org/web/20250526090817/https://jogkodex.hu/jsz/1996_11_mum_rendelet_3554324)
+        * [1998](https://web.archive.org/web/20250526091318/https://jogkodex.hu/jsz/1997_18_mum_rendelet_7493439)
+        * [1999](https://web.archive.org/web/20250526093916/https://jogkodex.hu/jsz/1998_3_szcsm_rendelet_7336830)
+        * [2001](https://archive.org/details/43-2000-xii-18-gm-rendelet)
+        * [2002](https://web.archive.org/web/20250526071659/https://jogkodex.hu/jsz/2001_25_gm_rendelet_9200619)
+        * [2003](https://web.archive.org/web/20250526071517/https://jogkodex.hu/jsz/2002_2_fmm_rendelet_1831209)
+        * [2004](https://web.archive.org/web/20250526071310/https://jogkodex.hu/jsz/2003_9_fmm_rendelet_8666269)
+        * [2005](https://web.archive.org/web/20250526071135/https://jogkodex.hu/jsz/2004_25_fmm_rendelet_4309634)
+        * [2007](https://web.archive.org/web/20250526064108/https://jogkodex.hu/jsz/2006_4_szmm_rendelet_8628960)
+        * [2008](https://web.archive.org/web/20250526051643/https://jogkodex.hu/jsz/2007_27_szmm_rendelet_3904252)
+        * [2009](https://web.archive.org/web/20250526051816/https://jogkodex.hu/jsz/2008_16_szmm_rendelet_7668376)
         * [2010](https://web.archive.org/web/20250428204804/https://njt.hu/jogszabaly/2009-20-20-1X)
         * [2011](https://web.archive.org/web/20250428204915/https://njt.hu/jogszabaly/2010-7-20-2X)
         * [2012](https://web.archive.org/web/20250428204812/https://njt.hu/jogszabaly/2011-39-20-2X)
@@ -131,6 +146,7 @@ class HungaryStaticHolidays:
         * [2022](https://web.archive.org/web/20241107133627/https://njt.hu/jogszabaly/2021-23-20-7Q)
         * [2024](https://web.archive.org/web/20241105131832/https://njt.hu/jogszabaly/2023-15-20-8P)
         * [2025](https://web.archive.org/web/20241219165144/https://njt.hu/jogszabaly/2024-11-20-2X)
+        * [2026](https://web.archive.org/web/20250526083742/https://jogkodex.hu/jsz/2025_10_ngm_rendelet_5591314)
     """
 
     # Substituted date format.
@@ -138,6 +154,67 @@ class HungaryStaticHolidays:
     # Day off (substituted from %s).
     substituted_label = tr("Pihenőnap (%s-től helyettesítve)")
     special_public_holidays = {
+        1991: (AUG, 19, AUG, 17),
+        1992: (
+            (AUG, 21, AUG, 29),
+            (DEC, 24, DEC, 19),
+        ),
+        1993: (DEC, 24, DEC, 18),
+        1994: (MAR, 14, MAR, 12),
+        1997: (
+            (MAY, 2, APR, 26),
+            (OCT, 24, OCT, 18),
+            (DEC, 24, DEC, 20),
+        ),
+        1998: (
+            (JAN, 2, JAN, 10),
+            (AUG, 21, AUG, 15),
+            (DEC, 24, DEC, 19),
+        ),
+        1999: (DEC, 24, DEC, 18),
+        2001: (
+            (MAR, 16, MAR, 10),
+            (APR, 30, APR, 28),
+            (OCT, 22, OCT, 20),
+            (NOV, 2, OCT, 27),
+            (DEC, 24, DEC, 22),
+            (DEC, 31, DEC, 29),
+        ),
+        2002: (
+            (AUG, 19, AUG, 10),
+            (DEC, 24, DEC, 28),
+        ),
+        2003: (
+            (MAY, 2, APR, 26),
+            (OCT, 24, OCT, 18),
+            (DEC, 24, DEC, 13),
+        ),
+        2004: (
+            (JAN, 2, JAN, 10),
+            (DEC, 24, DEC, 18),
+        ),
+        2005: (
+            (MAR, 14, MAR, 19),
+            (OCT, 31, NOV, 5),
+        ),
+        2007: (
+            (MAR, 16, MAR, 10),
+            (APR, 30, APR, 21),
+            (OCT, 22, OCT, 20),
+            (NOV, 2, OCT, 27),
+            (DEC, 24, DEC, 22),
+            (DEC, 31, DEC, 29),
+        ),
+        2008: (
+            (MAY, 2, APR, 26),
+            (OCT, 24, OCT, 18),
+            (DEC, 24, DEC, 20),
+        ),
+        2009: (
+            (JAN, 2, MAR, 28),
+            (AUG, 21, AUG, 29),
+            (DEC, 24, DEC, 19),
+        ),
         2010: (DEC, 24, DEC, 11),
         2011: (
             (MAR, 14, MAR, 19),
@@ -202,4 +279,9 @@ class HungaryStaticHolidays:
             (OCT, 24, OCT, 18),
             (DEC, 24, DEC, 13),
         ),
+        2026: (
+            (JAN, 2, JAN, 10),
+            (AUG, 21, AUG, 8),
+            (DEC, 24, DEC, 12),
+        ),
     }
diff --git a/holidays/countries/india.py b/holidays/countries/india.py
index 69dfbbea..45875d4c 100644
--- a/holidays/countries/india.py
+++ b/holidays/countries/india.py
@@ -150,7 +150,7 @@ class India(
         "OR",  # Orissa.
     )
 
-    def __init__(self, islamic_show_estimated: bool = True, *args, **kwargs):
+    def __init__(self, *args, islamic_show_estimated: bool = True, **kwargs):
         """
         Args:
             islamic_show_estimated:
diff --git a/holidays/countries/indonesia.py b/holidays/countries/indonesia.py
index 8f4e750d..2b9e556c 100644
--- a/holidays/countries/indonesia.py
+++ b/holidays/countries/indonesia.py
@@ -63,7 +63,7 @@ class Indonesia(
     supported_categories = (GOVERNMENT, PUBLIC)
     start_year = 1946
 
-    def __init__(self, islamic_show_estimated: bool = True, *args, **kwargs):
+    def __init__(self, *args, islamic_show_estimated: bool = True, **kwargs):
         """
         Args:
             islamic_show_estimated:
diff --git a/holidays/countries/iran.py b/holidays/countries/iran.py
index eb845028..0334937b 100644
--- a/holidays/countries/iran.py
+++ b/holidays/countries/iran.py
@@ -51,7 +51,7 @@ class Iran(HolidayBase, IslamicHolidays, PersianCalendarHolidays):
     start_year = 1980
     weekend = {FRI}
 
-    def __init__(self, islamic_show_estimated: bool = True, *args, **kwargs):
+    def __init__(self, *args, islamic_show_estimated: bool = True, **kwargs):
         """
         Args:
             islamic_show_estimated:
diff --git a/holidays/countries/ivory_coast.py b/holidays/countries/ivory_coast.py
index ab6bbe55..e3d6d09d 100644
--- a/holidays/countries/ivory_coast.py
+++ b/holidays/countries/ivory_coast.py
@@ -60,7 +60,7 @@ class IvoryCoast(
     start_year = 1997
     supported_languages = ("en_CI", "en_US", "fr")
 
-    def __init__(self, islamic_show_estimated: bool = False, *args, **kwargs):
+    def __init__(self, *args, islamic_show_estimated: bool = False, **kwargs):
         """
         Args:
             islamic_show_estimated:
diff --git a/holidays/countries/jordan.py b/holidays/countries/jordan.py
index bb6d57a6..d25cbc50 100644
--- a/holidays/countries/jordan.py
+++ b/holidays/countries/jordan.py
@@ -31,7 +31,7 @@ class Jordan(HolidayBase, ChristianHolidays, InternationalHolidays, IslamicHolid
     estimated_label = tr("(تقدير) %s")
     supported_languages = ("ar", "en_US")
 
-    def __init__(self, islamic_show_estimated: bool = True, *args, **kwargs):
+    def __init__(self, *args, islamic_show_estimated: bool = True, **kwargs):
         """
         Args:
             islamic_show_estimated:
diff --git a/holidays/countries/kazakhstan.py b/holidays/countries/kazakhstan.py
index 498b18ec..1b771fcd 100644
--- a/holidays/countries/kazakhstan.py
+++ b/holidays/countries/kazakhstan.py
@@ -51,7 +51,7 @@ class Kazakhstan(
     # Kazakhstan declared its sovereignty on 25 October 1990.
     start_year = 1991
 
-    def __init__(self, islamic_show_estimated: bool = True, *args, **kwargs):
+    def __init__(self, *args, islamic_show_estimated: bool = True, **kwargs):
         """
         Args:
             islamic_show_estimated:
diff --git a/holidays/countries/kenya.py b/holidays/countries/kenya.py
index c30846ce..ad1aa44a 100644
--- a/holidays/countries/kenya.py
+++ b/holidays/countries/kenya.py
@@ -54,7 +54,7 @@ class Kenya(
     # Kenya gained independence on December 12, 1963.
     start_year = 1964
 
-    def __init__(self, islamic_show_estimated: bool = True, *args, **kwargs):
+    def __init__(self, *args, islamic_show_estimated: bool = True, **kwargs):
         """
         Args:
             islamic_show_estimated:
diff --git a/holidays/countries/kuwait.py b/holidays/countries/kuwait.py
index 8a3431a6..d0611f22 100644
--- a/holidays/countries/kuwait.py
+++ b/holidays/countries/kuwait.py
@@ -32,7 +32,7 @@ class Kuwait(HolidayBase, InternationalHolidays, IslamicHolidays):
     estimated_label = tr("(تقدير) %s")
     supported_languages = ("ar", "en_US")
 
-    def __init__(self, islamic_show_estimated: bool = True, *args, **kwargs):
+    def __init__(self, *args, islamic_show_estimated: bool = True, **kwargs):
         """
         Args:
             islamic_show_estimated:
diff --git a/holidays/countries/kyrgyzstan.py b/holidays/countries/kyrgyzstan.py
index a1ae4f8c..87bc5604 100644
--- a/holidays/countries/kyrgyzstan.py
+++ b/holidays/countries/kyrgyzstan.py
@@ -24,7 +24,7 @@ class Kyrgyzstan(HolidayBase, ChristianHolidays, InternationalHolidays, IslamicH
 
     country = "KG"
 
-    def __init__(self, islamic_show_estimated: bool = True, *args, **kwargs):
+    def __init__(self, *args, islamic_show_estimated: bool = True, **kwargs):
         """
         Args:
             islamic_show_estimated:
diff --git a/holidays/countries/malaysia.py b/holidays/countries/malaysia.py
index 96f2c61b..8d2d196b 100644
--- a/holidays/countries/malaysia.py
+++ b/holidays/countries/malaysia.py
@@ -144,7 +144,7 @@ class Malaysia(
     }
     supported_languages = ("en_US", "ms_MY", "th")
 
-    def __init__(self, islamic_show_estimated: bool = True, *args, **kwargs):
+    def __init__(self, *args, islamic_show_estimated: bool = True, **kwargs):
         """
         Args:
             islamic_show_estimated:
diff --git a/holidays/countries/maldives.py b/holidays/countries/maldives.py
index 964559d6..6b31a08a 100644
--- a/holidays/countries/maldives.py
+++ b/holidays/countries/maldives.py
@@ -27,7 +27,7 @@ class Maldives(HolidayBase, InternationalHolidays, IslamicHolidays):
     country = "MV"
     weekend = {FRI, SAT}
 
-    def __init__(self, islamic_show_estimated: bool = True, *args, **kwargs):
+    def __init__(self, *args, islamic_show_estimated: bool = True, **kwargs):
         """
         Args:
             islamic_show_estimated:
diff --git a/holidays/countries/mauritania.py b/holidays/countries/mauritania.py
index 97e1a772..fdc76bc5 100644
--- a/holidays/countries/mauritania.py
+++ b/holidays/countries/mauritania.py
@@ -26,7 +26,7 @@ class Mauritania(HolidayBase, InternationalHolidays, IslamicHolidays):
     country = "MR"
     weekend = {FRI, SAT}
 
-    def __init__(self, islamic_show_estimated: bool = True, *args, **kwargs):
+    def __init__(self, *args, islamic_show_estimated: bool = True, **kwargs):
         """
         Args:
             islamic_show_estimated:
diff --git a/holidays/countries/montenegro.py b/holidays/countries/montenegro.py
index cb949ec2..251135b2 100644
--- a/holidays/countries/montenegro.py
+++ b/holidays/countries/montenegro.py
@@ -54,7 +54,7 @@ class Montenegro(
     supported_categories = (CATHOLIC, ISLAMIC, HEBREW, ORTHODOX, PUBLIC, WORKDAY)
     start_year = 2007
 
-    def __init__(self, islamic_show_estimated: bool = True, *args, **kwargs):
+    def __init__(self, *args, islamic_show_estimated: bool = True, **kwargs):
         """
         Args:
             islamic_show_estimated:
diff --git a/holidays/countries/morocco.py b/holidays/countries/morocco.py
index fa5210fe..f4a26262 100644
--- a/holidays/countries/morocco.py
+++ b/holidays/countries/morocco.py
@@ -30,7 +30,7 @@ class Morocco(HolidayBase, InternationalHolidays, IslamicHolidays):
     estimated_label = tr("(تقدير) %s")
     supported_languages = ("ar", "en_US", "fr")
 
-    def __init__(self, islamic_show_estimated: bool = True, *args, **kwargs):
+    def __init__(self, *args, islamic_show_estimated: bool = True, **kwargs):
         """
         Args:
             islamic_show_estimated:
diff --git a/holidays/countries/nepal.py b/holidays/countries/nepal.py
index 24736a7a..23c57fcd 100644
--- a/holidays/countries/nepal.py
+++ b/holidays/countries/nepal.py
@@ -52,7 +52,7 @@ class Nepal(
     start_year = 2010
     supported_categories = (PUBLIC, WORKDAY)
 
-    def __init__(self, islamic_show_estimated: bool = True, *args, **kwargs):
+    def __init__(self, *args, islamic_show_estimated: bool = True, **kwargs):
         """
         Args:
             islamic_show_estimated:
diff --git a/holidays/countries/niger.py b/holidays/countries/niger.py
index 2f07095b..46db78bb 100644
--- a/holidays/countries/niger.py
+++ b/holidays/countries/niger.py
@@ -69,7 +69,7 @@ class Niger(ObservedHolidayBase, ChristianHolidays, InternationalHolidays, Islam
     start_year = 1960
     weekend = {SUN}
 
-    def __init__(self, islamic_show_estimated: bool = True, *args, **kwargs):
+    def __init__(self, *args, islamic_show_estimated: bool = True, **kwargs):
         """
         Args:
             islamic_show_estimated:
diff --git a/holidays/countries/nigeria.py b/holidays/countries/nigeria.py
index 3521932e..4541a872 100644
--- a/holidays/countries/nigeria.py
+++ b/holidays/countries/nigeria.py
@@ -33,7 +33,7 @@ class Nigeria(
     observed_label = "%s (observed)"
     start_year = 1979
 
-    def __init__(self, islamic_show_estimated: bool = True, *args, **kwargs):
+    def __init__(self, *args, islamic_show_estimated: bool = True, **kwargs):
         """
         Args:
             islamic_show_estimated:
diff --git a/holidays/countries/north_macedonia.py b/holidays/countries/north_macedonia.py
index a7f83c32..7956cca9 100644
--- a/holidays/countries/north_macedonia.py
+++ b/holidays/countries/north_macedonia.py
@@ -108,7 +108,7 @@ class NorthMacedonia(
     )
     supported_languages = ("en_US", "mk", "uk")
 
-    def __init__(self, islamic_show_estimated: bool = True, *args, **kwargs):
+    def __init__(self, *args, islamic_show_estimated: bool = True, **kwargs):
         """
         Args:
             islamic_show_estimated:
diff --git a/holidays/countries/oman.py b/holidays/countries/oman.py
index a243aefd..4401d54b 100644
--- a/holidays/countries/oman.py
+++ b/holidays/countries/oman.py
@@ -53,7 +53,7 @@ class Oman(HolidayBase, IslamicHolidays):
     start_year = 1970
     supported_languages = ("ar", "en_US")
 
-    def __init__(self, islamic_show_estimated: bool = True, *args, **kwargs):
+    def __init__(self, *args, islamic_show_estimated: bool = True, **kwargs):
         """
         Args:
             islamic_show_estimated:
diff --git a/holidays/countries/pakistan.py b/holidays/countries/pakistan.py
index 1a0eaef9..554bf722 100644
--- a/holidays/countries/pakistan.py
+++ b/holidays/countries/pakistan.py
@@ -35,7 +35,7 @@ class Pakistan(HolidayBase, InternationalHolidays, IslamicHolidays):
     start_year = 1948
     supported_languages = ("en_PK", "en_US", "ur_PK")
 
-    def __init__(self, islamic_show_estimated: bool = True, *args, **kwargs):
+    def __init__(self, *args, islamic_show_estimated: bool = True, **kwargs):
         """
         Args:
             islamic_show_estimated:
diff --git a/holidays/countries/philippines.py b/holidays/countries/philippines.py
index bd2df610..eb5097a5 100644
--- a/holidays/countries/philippines.py
+++ b/holidays/countries/philippines.py
@@ -63,7 +63,7 @@ class Philippines(
     supported_languages = ("en_PH", "en_US", "fil", "th")
     start_year = 1988
 
-    def __init__(self, islamic_show_estimated: bool = True, *args, **kwargs):
+    def __init__(self, *args, islamic_show_estimated: bool = True, **kwargs):
         """
         Args:
             islamic_show_estimated:
diff --git a/holidays/countries/qatar.py b/holidays/countries/qatar.py
index fbb0c476..d276bff9 100644
--- a/holidays/countries/qatar.py
+++ b/holidays/countries/qatar.py
@@ -52,7 +52,7 @@ class Qatar(HolidayBase, InternationalHolidays, IslamicHolidays, StaticHolidays)
     supported_categories = (BANK, PUBLIC)
     supported_languages = ("ar_QA", "en_US")
 
-    def __init__(self, islamic_show_estimated: bool = True, *args, **kwargs):
+    def __init__(self, *args, islamic_show_estimated: bool = True, **kwargs):
         """
         Args:
             islamic_show_estimated:
diff --git a/holidays/countries/saudi_arabia.py b/holidays/countries/saudi_arabia.py
index f2cd7da9..64559073 100644
--- a/holidays/countries/saudi_arabia.py
+++ b/holidays/countries/saudi_arabia.py
@@ -45,7 +45,7 @@ class SaudiArabia(ObservedHolidayBase, IslamicHolidays, StaticHolidays):
     observed_estimated_label = tr("(تقدير ملاحظة) %s")
     supported_languages = ("ar", "en_US")
 
-    def __init__(self, islamic_show_estimated: bool = True, *args, **kwargs):
+    def __init__(self, *args, islamic_show_estimated: bool = True, **kwargs):
         """
         Args:
             islamic_show_estimated:
diff --git a/holidays/countries/sierra_leone.py b/holidays/countries/sierra_leone.py
index 51db25ac..5724fd0a 100644
--- a/holidays/countries/sierra_leone.py
+++ b/holidays/countries/sierra_leone.py
@@ -40,7 +40,7 @@ class SierraLeone(ObservedHolidayBase, ChristianHolidays, InternationalHolidays,
     # Sierra Leone gained independence on April 27, 1961.
     start_year = 1962
 
-    def __init__(self, islamic_show_estimated: bool = True, *args, **kwargs):
+    def __init__(self, *args, islamic_show_estimated: bool = True, **kwargs):
         """
         Args:
             islamic_show_estimated:
diff --git a/holidays/countries/singapore.py b/holidays/countries/singapore.py
index d302fbf4..2971f006 100644
--- a/holidays/countries/singapore.py
+++ b/holidays/countries/singapore.py
@@ -65,7 +65,7 @@ class Singapore(
     observed_label = tr("%s (observed)")
     supported_languages = ("en_SG", "en_US", "th")
 
-    def __init__(self, islamic_show_estimated: bool = True, *args, **kwargs):
+    def __init__(self, *args, islamic_show_estimated: bool = True, **kwargs):
         """
         Args:
             islamic_show_estimated:
diff --git a/holidays/countries/spain.py b/holidays/countries/spain.py
index 1899dc10..d78aa5dc 100644
--- a/holidays/countries/spain.py
+++ b/holidays/countries/spain.py
@@ -100,7 +100,7 @@ class Spain(
     }
     supported_languages = ("en_US", "es", "uk")
 
-    def __init__(self, islamic_show_estimated: bool = True, *args, **kwargs):
+    def __init__(self, *args, islamic_show_estimated: bool = True, **kwargs):
         """
         Args:
             islamic_show_estimated:
diff --git a/holidays/countries/sri_lanka.py b/holidays/countries/sri_lanka.py
index cc7125e8..9dd66a31 100644
--- a/holidays/countries/sri_lanka.py
+++ b/holidays/countries/sri_lanka.py
@@ -88,7 +88,7 @@ class SriLanka(
     start_year = 1972
     end_year = 2025
 
-    def __init__(self, islamic_show_estimated: bool = True, *args, **kwargs):
+    def __init__(self, *args, islamic_show_estimated: bool = True, **kwargs):
         """
         Args:
             islamic_show_estimated:
diff --git a/holidays/countries/suriname.py b/holidays/countries/suriname.py
index 1a4dfdc9..01b4c85b 100644
--- a/holidays/countries/suriname.py
+++ b/holidays/countries/suriname.py
@@ -57,7 +57,7 @@ class Suriname(
     start_year = 1972
     supported_languages = ("en_US", "nl")
 
-    def __init__(self, islamic_show_estimated: bool = True, *args, **kwargs):
+    def __init__(self, *args, islamic_show_estimated: bool = True, **kwargs):
         """
         Args:
             islamic_show_estimated:
diff --git a/holidays/countries/tanzania.py b/holidays/countries/tanzania.py
index 321eb2dc..4d48d911 100644
--- a/holidays/countries/tanzania.py
+++ b/holidays/countries/tanzania.py
@@ -66,7 +66,7 @@ class Tanzania(
     # Written Law (Miscellaneous Amendments) (No. 2) Act, 1994.
     start_year = 1994
 
-    def __init__(self, islamic_show_estimated: bool = True, *args, **kwargs):
+    def __init__(self, *args, islamic_show_estimated: bool = True, **kwargs):
         """
         Args:
             islamic_show_estimated:
diff --git a/holidays/countries/timor_leste.py b/holidays/countries/timor_leste.py
index 6dc14ee3..618b4d93 100644
--- a/holidays/countries/timor_leste.py
+++ b/holidays/countries/timor_leste.py
@@ -52,7 +52,7 @@ class TimorLeste(
     # Law No. 10/2005 Of 10 August, Public Holidays and Official Commemorative Dates.
     start_year = 2006
 
-    def __init__(self, islamic_show_estimated: bool = True, *args, **kwargs):
+    def __init__(self, *args, islamic_show_estimated: bool = True, **kwargs):
         """
         Args:
             islamic_show_estimated:
diff --git a/holidays/countries/togo.py b/holidays/countries/togo.py
index 23b8956e..466d2c22 100644
--- a/holidays/countries/togo.py
+++ b/holidays/countries/togo.py
@@ -56,7 +56,7 @@ class Togo(HolidayBase, ChristianHolidays, InternationalHolidays, IslamicHoliday
     # Togo gained independence on April 27, 1960.
     start_year = 1961
 
-    def __init__(self, islamic_show_estimated: bool = True, *args, **kwargs):
+    def __init__(self, *args, islamic_show_estimated: bool = True, **kwargs):
         """
         Args:
             islamic_show_estimated:
diff --git a/holidays/countries/trinidad_and_tobago.py b/holidays/countries/trinidad_and_tobago.py
index 8b144441..026b8987 100644
--- a/holidays/countries/trinidad_and_tobago.py
+++ b/holidays/countries/trinidad_and_tobago.py
@@ -67,7 +67,7 @@ class TrinidadAndTobago(
     # Trinidad and Tobago gained independence on August 31, 1962.
     start_year = 1963
 
-    def __init__(self, islamic_show_estimated: bool = True, *args, **kwargs):
+    def __init__(self, *args, islamic_show_estimated: bool = True, **kwargs):
         """
         Args:
             islamic_show_estimated:
@@ -98,10 +98,10 @@ class TrinidadAndTobago(
         dts_observed.add(self._add_new_years_day(tr("New Year's Day")))
 
         # Good Friday.
-        dts_observed.add(self._add_good_friday(tr("Good Friday")))
+        self._add_good_friday(tr("Good Friday"))
 
         # Easter Monday.
-        dts_observed.add(self._add_easter_monday(tr("Easter Monday")))
+        self._add_easter_monday(tr("Easter Monday"))
 
         if self._year >= 1996:
             # Spiritual Baptist Liberation Day.
diff --git a/holidays/countries/tunisia.py b/holidays/countries/tunisia.py
index 18f6e903..32d9ee9e 100644
--- a/holidays/countries/tunisia.py
+++ b/holidays/countries/tunisia.py
@@ -25,7 +25,7 @@ class Tunisia(HolidayBase, InternationalHolidays, IslamicHolidays):
     estimated_label = tr("(تقدير) %s")
     supported_languages = ("ar", "en_US")
 
-    def __init__(self, islamic_show_estimated: bool = True, *args, **kwargs):
+    def __init__(self, *args, islamic_show_estimated: bool = True, **kwargs):
         """
         Args:
             islamic_show_estimated:
diff --git a/holidays/countries/turkey.py b/holidays/countries/turkey.py
index ae1607d1..b9b9a043 100644
--- a/holidays/countries/turkey.py
+++ b/holidays/countries/turkey.py
@@ -38,7 +38,7 @@ class Turkey(HolidayBase, InternationalHolidays, IslamicHolidays, StaticHolidays
     # Law 2739 of 27 May 1935.
     start_year = 1936
 
-    def __init__(self, islamic_show_estimated: bool = True, *args, **kwargs):
+    def __init__(self, *args, islamic_show_estimated: bool = True, **kwargs):
         """
         Args:
             islamic_show_estimated:
diff --git a/holidays/countries/united_arab_emirates.py b/holidays/countries/united_arab_emirates.py
index 8fc29c62..a9956692 100644
--- a/holidays/countries/united_arab_emirates.py
+++ b/holidays/countries/united_arab_emirates.py
@@ -66,7 +66,7 @@ class UnitedArabEmirates(HolidayBase, InternationalHolidays, IslamicHolidays, St
     # Founded on DEC 2, 1971.
     start_year = 1972
 
-    def __init__(self, islamic_show_estimated: bool = True, *args, **kwargs):
+    def __init__(self, *args, islamic_show_estimated: bool = True, **kwargs):
         """
         Args:
             islamic_show_estimated:
diff --git a/holidays/countries/uzbekistan.py b/holidays/countries/uzbekistan.py
index 85385cb1..988d5887 100644
--- a/holidays/countries/uzbekistan.py
+++ b/holidays/countries/uzbekistan.py
@@ -39,7 +39,7 @@ class Uzbekistan(ObservedHolidayBase, InternationalHolidays, IslamicHolidays, St
     supported_languages = ("en_US", "uk", "uz")
     start_year = 1992
 
-    def __init__(self, islamic_show_estimated: bool = True, *args, **kwargs):
+    def __init__(self, *args, islamic_show_estimated: bool = True, **kwargs):
         """
         Args:
             islamic_show_estimated:
diff --git a/holidays/countries/yemen.py b/holidays/countries/yemen.py
index 1f7eec21..1c762f90 100644
--- a/holidays/countries/yemen.py
+++ b/holidays/countries/yemen.py
@@ -61,7 +61,7 @@ class Yemen(ObservedHolidayBase, InternationalHolidays, IslamicHolidays):
     supported_categories = (PUBLIC, SCHOOL, WORKDAY)
     supported_languages = ("ar", "en_US")
 
-    def __init__(self, islamic_show_estimated: bool = True, *args, **kwargs):
+    def __init__(self, *args, islamic_show_estimated: bool = True, **kwargs):
         """
         Args:
             islamic_show_estimated:
diff --git a/requirements/dev.txt b/requirements/dev.txt
index 135c8feb..aab83f0a 100644
--- a/requirements/dev.txt
+++ b/requirements/dev.txt
@@ -7,7 +7,7 @@ hijridate==2.5.0
 lingva==5.0.6
 pre-commit==4.2.0
 pygithub==2.6.1
-requests==2.32.3
+requests==2.32.4
 ruff==0.11.12
 tox==4.26.0
 urllib3>=2.2.2 # not directly required, pinned by Snyk to avoid a vulnerability
diff --git a/scripts/l10n/l10n_helper.py b/scripts/l10n/l10n_helper.py
new file mode 100644
index 00000000..940163b1
--- /dev/null
+++ b/scripts/l10n/l10n_helper.py
@@ -0,0 +1,235 @@
+#!/usr/bin/env python3
+
+
+#  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)
+
+# ruff: noqa: T201
+
+import argparse
+import csv
+import importlib
+import sys
+from collections import defaultdict
+from pathlib import Path
+
+from polib import pofile
+
+WRAP_WIDTH = 99
+
+
+class LocalizationHelper:
+    def __init__(self) -> None:
+        arg_parser = argparse.ArgumentParser()
+        arg_parser.add_argument("country_code", help="Country code", type=str)
+        arg_parser.add_argument("--create-po", action="store_true", help="Create .po files")
+        arg_parser.add_argument("--export-csv", action="store_true", help="Export to .csv")
+        arg_parser.add_argument("--import-csv", action="store_true", help="Import from .csv")
+        arg_parser.add_argument(
+            "--fill-missing",
+            action="store_true",
+            help="Fill missing translations from other countries",
+        )
+        arg_parser.add_argument(
+            "--bom",
+            action=argparse.BooleanOptionalAction,
+            default=False,
+            help="Use files with BOM on export/import",
+        )
+        arg_parser.add_argument(
+            "--overwrite",
+            action=argparse.BooleanOptionalAction,
+            default=False,
+            help="Overwrite existing files",
+        )
+        self.args = arg_parser.parse_args()
+        if not any(
+            getattr(self.args, action.dest)
+            for action in arg_parser._actions
+            if isinstance(action, argparse._StoreTrueAction)
+        ):
+            print("No action specified.\n")
+            arg_parser.print_help()
+            sys.exit(1)
+
+        self.country_code = self.args.country_code
+        self.encoding = "utf-8-sig" if self.args.bom else "utf-8"
+        self.csv_file_path = Path(f"holidays/locale/csv/{self.country_code}.csv")
+
+    def create_po_files(self):
+        sys.path.append(str(Path.cwd()))  # Make holidays visible.
+        from holidays.registry import COUNTRIES
+
+        class_name = None
+        for module_name, entity_data in COUNTRIES.items():
+            if entity_data[1] == self.country_code:
+                class_name = entity_data[0]
+                break
+        if not class_name:
+            print(f"Class for country code {self.country_code} not found!")
+            sys.exit(1)
+
+        cls = getattr(importlib.import_module(f"holidays.countries.{module_name}"), class_name)
+        docstring = cls.__doc__
+
+        header = [
+            f"# {line}" if line else "#"
+            for line in Path("docs/file_header.txt").read_text(encoding="utf-8").split("\n")
+        ]
+        country_name = "COUNTRY"
+        if (title := docstring.split("\n")[0]) and title.endswith(" holidays."):
+            country_name = title.split("holidays")[0].strip()
+
+        locale_directory = Path("holidays/locale")
+        pot_file_path = locale_directory / "pot" / f"{self.country_code}.pot"
+        pot_file = pofile(pot_file_path, wrapwidth=WRAP_WIDTH)
+
+        for language in cls.supported_languages:
+            po_directory = locale_directory / language / "LC_MESSAGES"
+            po_directory.mkdir(parents=True, exist_ok=True)
+            po_file_path = po_directory / f"{self.country_code}.po"
+            if not self.args.overwrite and po_file_path.exists():
+                continue
+            pot_file.metadata["Language"] = language
+            pot_file.save(po_file_path, newline="\n")
+
+            file_content = po_file_path.read_text(encoding="utf-8").split("\n")
+            if file_content[0] != "# SOME DESCRIPTIVE TITLE":
+                continue
+            l10n_suffix = f" {language} localization" if language != cls.default_language else ""
+            title = f"# {country_name} holidays{l10n_suffix}."
+            file_content = header + [title, "#"] + file_content[4:]
+            po_file_path.write_text("\n".join(file_content), encoding="utf-8", newline="\n")
+
+        en_us_po_path = locale_directory / "en_us/LC_MESSAGES" / f"{self.country_code}.po"
+        po_file = pofile(en_us_po_path, wrapwidth=WRAP_WIDTH)
+        for po_entry in po_file:
+            if po_entry.comment:
+                po_entry.msgstr = po_entry.comment.removesuffix(".")
+        po_file.save(en_us_po_path, newline="\n")
+
+    def export_to_csv(self):
+        if not self.args.overwrite and self.csv_file_path.exists():
+            print(f"File {self.csv_file_path} exists and no --overwrite option!")
+            sys.exit(1)
+
+        comments = {}
+        languages = []
+        po_data = defaultdict(dict)
+        for po_path in Path("holidays/locale").rglob(f"{self.country_code}.po"):
+            po_file = pofile(po_path, wrapwidth=WRAP_WIDTH)
+            language = po_file.metadata["Language"]
+            default_language = po_file.metadata["X-Source-Language"]
+            if language != default_language:
+                languages.append(language)
+                for po_entry in po_file:
+                    po_data[po_entry.msgid][language] = po_entry.msgstr
+            else:
+                for po_entry in po_file:
+                    comments[po_entry.msgid] = po_entry.comment
+
+        languages = sorted(languages)
+        headers = ["msgid", "msgcomment", *languages]
+        rows = [
+            [msgid, comments[msgid]] + [po_data[msgid][language] for language in languages]
+            for msgid in po_data
+        ]
+        self.write_csv(headers, rows)
+
+    def read_csv(self) -> tuple[list[str], list[list[str]]]:
+        if not self.csv_file_path.exists():
+            print(f"File {self.csv_file_path} not found!")
+            sys.exit(1)
+
+        with self.csv_file_path.open("r", encoding=self.encoding) as f:
+            reader = csv.reader(f, delimiter=";")
+            headers, *rows = reader
+        return headers, rows
+
+    def write_csv(self, headers: list[str], rows: list[list[str]]):
+        self.csv_file_path.parent.mkdir(parents=True, exist_ok=True)
+        with self.csv_file_path.open("w", newline="", encoding=self.encoding) as f:
+            writer = csv.writer(f, delimiter=";")
+            writer.writerow(headers)
+            writer.writerows(rows)
+
+    def import_from_csv(self):
+        headers, rows = self.read_csv()
+        languages = headers[2:]
+        entries = [(msgid, dict(zip(languages, msgstrs))) for msgid, _, *msgstrs in rows]
+
+        for language in languages:
+            po_path = Path(f"holidays/locale/{language}/LC_MESSAGES/{self.country_code}.po")
+            po_file = pofile(po_path, wrapwidth=WRAP_WIDTH)
+
+            changed = False
+            for msgid, msg_mapping in entries:
+                entry = po_file.find(msgid)
+                if not entry:
+                    continue
+                msgstr = msg_mapping[language]
+                if entry.msgstr != msgstr:
+                    entry.msgstr = msgstr
+                    changed = True
+
+            if changed:
+                po_file.save(po_path, newline="\n")
+
+    def fill_missing_translations(self):
+        headers, rows = self.read_csv()
+        languages = headers[2:]
+
+        untranslated_languages = set()
+        for row in rows:
+            msgstrs = row[2:]
+            for lang, msgstr in zip(languages, msgstrs):
+                if not msgstr.strip():
+                    untranslated_languages.add(lang)
+
+        translations = defaultdict(lambda: defaultdict(set))
+        for language in untranslated_languages:
+            for po_path in Path(f"holidays/locale/{language}/LC_MESSAGES/").glob("*.po"):
+                if po_path.stem == self.country_code:
+                    continue
+                po_file = pofile(po_path, wrapwidth=WRAP_WIDTH)
+                for entry in po_file:
+                    if entry.comment and entry.msgstr:
+                        translations[language][entry.comment].add(entry.msgstr)
+
+        updated_rows = []
+        for msgid, msgcomment, *msgstrs in rows:
+            new_msgstrs = []
+            for lang, msgstr in zip(languages, msgstrs):
+                if msgstr.strip():
+                    new_msgstrs.append(msgstr)
+                elif msgcomment in translations[lang]:
+                    new_msgstrs.append("/".join(sorted(translations[lang][msgcomment])))
+                else:
+                    new_msgstrs.append("")
+
+            updated_rows.append([msgid, msgcomment, *new_msgstrs])
+
+        self.write_csv(headers, updated_rows)
+
+    def run(self):
+        if self.args.create_po:
+            self.create_po_files()
+        elif self.args.export_csv:
+            self.export_to_csv()
+        elif self.args.import_csv:
+            self.import_from_csv()
+        elif self.args.fill_missing:
+            self.fill_missing_translations()
+
+
+if __name__ == "__main__":
+    LocalizationHelper().run()
diff --git a/snapshots/countries/HU_COMMON.json b/snapshots/countries/HU_COMMON.json
index 7006136f..71498d5f 100644
--- a/snapshots/countries/HU_COMMON.json
+++ b/snapshots/countries/HU_COMMON.json
@@ -457,6 +457,7 @@
     "1991-04-01": "Easter Monday",
     "1991-05-01": "Labor Day",
     "1991-05-19": "Whit Sunday",
+    "1991-08-19": "Day off (substituted from 08/17/1991)",
     "1991-08-20": "State Foundation Day",
     "1991-10-23": "National Day",
     "1991-12-25": "Christmas Day",
@@ -469,7 +470,9 @@
     "1992-06-07": "Whit Sunday",
     "1992-06-08": "Whit Monday",
     "1992-08-20": "State Foundation Day",
+    "1992-08-21": "Day off (substituted from 08/29/1992)",
     "1992-10-23": "National Day",
+    "1992-12-24": "Day off (substituted from 12/19/1992)",
     "1992-12-25": "Christmas Day",
     "1992-12-26": "Second Day of Christmas",
     "1993-01-01": "New Year's Day",
@@ -481,9 +484,11 @@
     "1993-05-31": "Whit Monday",
     "1993-08-20": "State Foundation Day",
     "1993-10-23": "National Day",
+    "1993-12-24": "Day off (substituted from 12/18/1993)",
     "1993-12-25": "Christmas Day",
     "1993-12-26": "Second Day of Christmas",
     "1994-01-01": "New Year's Day",
+    "1994-03-14": "Day off (substituted from 03/12/1994)",
     "1994-03-15": "National Day",
     "1994-04-03": "Easter",
     "1994-04-04": "Easter Monday",
@@ -521,13 +526,17 @@
     "1997-03-30": "Easter",
     "1997-03-31": "Easter Monday",
     "1997-05-01": "Labor Day",
+    "1997-05-02": "Day off (substituted from 04/26/1997)",
     "1997-05-18": "Whit Sunday",
     "1997-05-19": "Whit Monday",
     "1997-08-20": "State Foundation Day",
     "1997-10-23": "National Day",
+    "1997-10-24": "Day off (substituted from 10/18/1997)",
+    "1997-12-24": "Day off (substituted from 12/20/1997)",
     "1997-12-25": "Christmas Day",
     "1997-12-26": "Second Day of Christmas",
     "1998-01-01": "New Year's Day",
+    "1998-01-02": "Day off (substituted from 01/10/1998)",
     "1998-03-15": "National Day",
     "1998-04-12": "Easter",
     "1998-04-13": "Easter Monday",
@@ -535,7 +544,9 @@
     "1998-05-31": "Whit Sunday",
     "1998-06-01": "Whit Monday",
     "1998-08-20": "State Foundation Day",
+    "1998-08-21": "Day off (substituted from 08/15/1998)",
     "1998-10-23": "National Day",
+    "1998-12-24": "Day off (substituted from 12/19/1998)",
     "1998-12-25": "Christmas Day",
     "1998-12-26": "Second Day of Christmas",
     "1999-01-01": "New Year's Day",
@@ -548,6 +559,7 @@
     "1999-08-20": "State Foundation Day",
     "1999-10-23": "National Day",
     "1999-11-01": "All Saints' Day",
+    "1999-12-24": "Day off (substituted from 12/18/1999)",
     "1999-12-25": "Christmas Day",
     "1999-12-26": "Second Day of Christmas",
     "2000-01-01": "New Year's Day",
@@ -564,16 +576,22 @@
     "2000-12-26": "Second Day of Christmas",
     "2001-01-01": "New Year's Day",
     "2001-03-15": "National Day",
+    "2001-03-16": "Day off (substituted from 03/10/2001)",
     "2001-04-15": "Easter",
     "2001-04-16": "Easter Monday",
+    "2001-04-30": "Day off (substituted from 04/28/2001)",
     "2001-05-01": "Labor Day",
     "2001-06-03": "Whit Sunday",
     "2001-06-04": "Whit Monday",
     "2001-08-20": "State Foundation Day",
+    "2001-10-22": "Day off (substituted from 10/20/2001)",
     "2001-10-23": "National Day",
     "2001-11-01": "All Saints' Day",
+    "2001-11-02": "Day off (substituted from 10/27/2001)",
+    "2001-12-24": "Day off (substituted from 12/22/2001)",
     "2001-12-25": "Christmas Day",
     "2001-12-26": "Second Day of Christmas",
+    "2001-12-31": "Day off (substituted from 12/29/2001)",
     "2002-01-01": "New Year's Day",
     "2002-03-15": "National Day",
     "2002-03-31": "Easter",
@@ -581,9 +599,11 @@
     "2002-05-01": "Labor Day",
     "2002-05-19": "Whit Sunday",
     "2002-05-20": "Whit Monday",
+    "2002-08-19": "Day off (substituted from 08/10/2002)",
     "2002-08-20": "State Foundation Day",
     "2002-10-23": "National Day",
     "2002-11-01": "All Saints' Day",
+    "2002-12-24": "Day off (substituted from 12/28/2002)",
     "2002-12-25": "Christmas Day",
     "2002-12-26": "Second Day of Christmas",
     "2003-01-01": "New Year's Day",
@@ -591,14 +611,18 @@
     "2003-04-20": "Easter",
     "2003-04-21": "Easter Monday",
     "2003-05-01": "Labor Day",
+    "2003-05-02": "Day off (substituted from 04/26/2003)",
     "2003-06-08": "Whit Sunday",
     "2003-06-09": "Whit Monday",
     "2003-08-20": "State Foundation Day",
     "2003-10-23": "National Day",
+    "2003-10-24": "Day off (substituted from 10/18/2003)",
     "2003-11-01": "All Saints' Day",
+    "2003-12-24": "Day off (substituted from 12/13/2003)",
     "2003-12-25": "Christmas Day",
     "2003-12-26": "Second Day of Christmas",
     "2004-01-01": "New Year's Day",
+    "2004-01-02": "Day off (substituted from 01/10/2004)",
     "2004-03-15": "National Day",
     "2004-04-11": "Easter",
     "2004-04-12": "Easter Monday",
@@ -608,9 +632,11 @@
     "2004-08-20": "State Foundation Day",
     "2004-10-23": "National Day",
     "2004-11-01": "All Saints' Day",
+    "2004-12-24": "Day off (substituted from 12/18/2004)",
     "2004-12-25": "Christmas Day",
     "2004-12-26": "Second Day of Christmas",
     "2005-01-01": "New Year's Day",
+    "2005-03-14": "Day off (substituted from 03/19/2005)",
     "2005-03-15": "National Day",
     "2005-03-27": "Easter",
     "2005-03-28": "Easter Monday",
@@ -619,6 +645,7 @@
     "2005-05-16": "Whit Monday",
     "2005-08-20": "State Foundation Day",
     "2005-10-23": "National Day",
+    "2005-10-31": "Day off (substituted from 11/05/2005)",
     "2005-11-01": "All Saints' Day",
     "2005-12-25": "Christmas Day",
     "2005-12-26": "Second Day of Christmas",
@@ -636,29 +663,39 @@
     "2006-12-26": "Second Day of Christmas",
     "2007-01-01": "New Year's Day",
     "2007-03-15": "National Day",
+    "2007-03-16": "Day off (substituted from 03/10/2007)",
     "2007-04-08": "Easter",
     "2007-04-09": "Easter Monday",
+    "2007-04-30": "Day off (substituted from 04/21/2007)",
     "2007-05-01": "Labor Day",
     "2007-05-27": "Whit Sunday",
     "2007-05-28": "Whit Monday",
     "2007-08-20": "State Foundation Day",
+    "2007-10-22": "Day off (substituted from 10/20/2007)",
     "2007-10-23": "National Day",
     "2007-11-01": "All Saints' Day",
+    "2007-11-02": "Day off (substituted from 10/27/2007)",
+    "2007-12-24": "Day off (substituted from 12/22/2007)",
     "2007-12-25": "Christmas Day",
     "2007-12-26": "Second Day of Christmas",
+    "2007-12-31": "Day off (substituted from 12/29/2007)",
     "2008-01-01": "New Year's Day",
     "2008-03-15": "National Day",
     "2008-03-23": "Easter",
     "2008-03-24": "Easter Monday",
     "2008-05-01": "Labor Day",
+    "2008-05-02": "Day off (substituted from 04/26/2008)",
     "2008-05-11": "Whit Sunday",
     "2008-05-12": "Whit Monday",
     "2008-08-20": "State Foundation Day",
     "2008-10-23": "National Day",
+    "2008-10-24": "Day off (substituted from 10/18/2008)",
     "2008-11-01": "All Saints' Day",
+    "2008-12-24": "Day off (substituted from 12/20/2008)",
     "2008-12-25": "Christmas Day",
     "2008-12-26": "Second Day of Christmas",
     "2009-01-01": "New Year's Day",
+    "2009-01-02": "Day off (substituted from 03/28/2009)",
     "2009-03-15": "National Day",
     "2009-04-12": "Easter",
     "2009-04-13": "Easter Monday",
@@ -666,8 +703,10 @@
     "2009-05-31": "Whit Sunday",
     "2009-06-01": "Whit Monday",
     "2009-08-20": "State Foundation Day",
+    "2009-08-21": "Day off (substituted from 08/29/2009)",
     "2009-10-23": "National Day",
     "2009-11-01": "All Saints' Day",
+    "2009-12-24": "Day off (substituted from 12/19/2009)",
     "2009-12-25": "Christmas Day",
     "2009-12-26": "Second Day of Christmas",
     "2010-01-01": "New Year's Day",
@@ -912,6 +951,7 @@
     "2025-12-25": "Christmas Day",
     "2025-12-26": "Second Day of Christmas",
     "2026-01-01": "New Year's Day",
+    "2026-01-02": "Day off (substituted from 01/10/2026)",
     "2026-03-15": "National Day",
     "2026-04-03": "Good Friday",
     "2026-04-05": "Easter",
@@ -920,8 +960,10 @@
     "2026-05-24": "Whit Sunday",
     "2026-05-25": "Whit Monday",
     "2026-08-20": "State Foundation Day",
+    "2026-08-21": "Day off (substituted from 08/08/2026)",
     "2026-10-23": "National Day",
     "2026-11-01": "All Saints' Day",
+    "2026-12-24": "Day off (substituted from 12/12/2026)",
     "2026-12-25": "Christmas Day",
     "2026-12-26": "Second Day of Christmas",
     "2027-01-01": "New Year's Day",


Test patch:
diff --git a/tests/countries/test_hungary.py b/tests/countries/test_hungary.py
index 0f924288..22429d1c 100644
--- a/tests/countries/test_hungary.py
+++ b/tests/countries/test_hungary.py
@@ -184,6 +184,45 @@ class TestHungary(CommonCountryTests, TestCase):
 
     def test_substituted(self):
         dt = (
+            "1991-08-19",
+            "1992-08-21",
+            "1992-12-24",
+            "1993-12-24",
+            "1994-03-14",
+            "1997-05-02",
+            "1997-10-24",
+            "1997-12-24",
+            "1998-01-02",
+            "1998-08-21",
+            "1998-12-24",
+            "1999-12-24",
+            "2001-03-16",
+            "2001-04-30",
+            "2001-10-22",
+            "2001-11-02",
+            "2001-12-24",
+            "2001-12-31",
+            "2002-08-19",
+            "2002-12-24",
+            "2003-05-02",
+            "2003-10-24",
+            "2003-12-24",
+            "2004-01-02",
+            "2004-12-24",
+            "2005-03-14",
+            "2005-10-31",
+            "2007-03-16",
+            "2007-04-30",
+            "2007-10-22",
+            "2007-11-02",
+            "2007-12-24",
+            "2007-12-31",
+            "2008-05-02",
+            "2008-10-24",
+            "2008-12-24",
+            "2009-01-02",
+            "2009-08-21",
+            "2009-12-24",
             "2010-12-24",
             "2011-03-14",
             "2011-10-31",
@@ -224,6 +263,9 @@ class TestHungary(CommonCountryTests, TestCase):
             "2025-05-02",
             "2025-10-24",
             "2025-12-24",
+            "2026-01-02",
+            "2026-08-21",
+            "2026-12-24",
         )
         self.assertHoliday(dt)