Repository: vacanza/holidays (python)

Issue:
Missing "Tag der Befreiung" 2025-05-08:  One-Time Holiday in Berlin, Germany (DE-BE)
## Bug Report

The public holiday 'Tag der Befreiung' on 2025-05-08 is missing in Berlin, Germany.

### Expected Behavior

I expect it to be present, because it's a public holiday.

### Actual Behavior

It's not included in the library.

Source: https://www.berlin.de/aktuelles/9188766-958090-einmaliger-feiertag-am-8-mai-2025.html

Pull request:
Update Germany holidays: add Liberation from Nazi Regime Day 2025 in Berlin
source: https://www.berlin.de/aktuelles/9188766-958090-einmaliger-feiertag-am-8-mai-2025.html

fixes #2051

Sorry, didn't get my setup ready to generate the snapshots.

Patch:
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index e60438f9..69d4f506 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -54,7 +54,7 @@ repos:
         exclude: ^(docs)
 
   - repo: https://github.com/pre-commit/mirrors-mypy
-    rev: v1.11.2
+    rev: v1.12.0
     hooks:
       - id: mypy
         additional_dependencies:
diff --git a/README.rst b/README.rst
index 19960d78..9a04d173 100644
--- a/README.rst
+++ b/README.rst
@@ -938,7 +938,7 @@ All other default values are highlighted with bold:
    * - Vietnam
      - VN
      -
-     - en_US, **vi**
+     - en_US, th, **vi**
      -
    * - Virgin Islands (U.S.)
      - VI
diff --git a/holidays/countries/germany.py b/holidays/countries/germany.py
index 771e2ca6..5f00cc03 100644
--- a/holidays/countries/germany.py
+++ b/holidays/countries/germany.py
@@ -319,4 +319,14 @@ class GermanyStaticHolidays:
                 "und der Beendigung des Zweiten Weltkriegs in Europa"
             ),
         ),
+        2025: (
+            MAY,
+            8,
+            # 80th anniversary of the liberation from Nazism and
+            # the end of the Second World War in Europe.
+            tr(
+                "80. Jahrestag der Befreiung vom Nationalsozialismus "
+                "und der Beendigung des Zweiten Weltkriegs in Europa"
+            ),
+        ),
     }
diff --git a/holidays/countries/vietnam.py b/holidays/countries/vietnam.py
index 7ddd842a..347d36cf 100644
--- a/holidays/countries/vietnam.py
+++ b/holidays/countries/vietnam.py
@@ -59,7 +59,7 @@ class Vietnam(ObservedHolidayBase, ChineseCalendarHolidays, InternationalHoliday
     # %s (observed).
     observed_label = tr("%s (nghỉ bù)")
     default_language = "vi"
-    supported_languages = ("en_US", "vi")
+    supported_languages = ("en_US", "th", "vi")
 
     def __init__(self, *args, **kwargs):
         ChineseCalendarHolidays.__init__(self)
diff --git a/holidays/groups/buddhist.py b/holidays/groups/buddhist.py
index c537d0de..271aa399 100644
--- a/holidays/groups/buddhist.py
+++ b/holidays/groups/buddhist.py
@@ -26,7 +26,7 @@ class BuddhistCalendarHolidays:
         self._buddhist_calendar_show_estimated = show_estimated
 
     def _add_buddhist_calendar_holiday(
-        self, name: str, dt_estimated: tuple[date, bool]
+        self, name: str, dt_estimated: tuple[Optional[date], bool]
     ) -> Optional[date]:
         """
         Add Buddhist calendar holiday.
@@ -37,11 +37,15 @@ class BuddhistCalendarHolidays:
         estimated_label = getattr(self, "estimated_label", "%s (estimated)")
         dt, is_estimated = dt_estimated
 
-        return self._add_holiday(
-            self.tr(estimated_label) % self.tr(name)
-            if is_estimated and self._buddhist_calendar_show_estimated
-            else name,
-            dt,
+        return (
+            self._add_holiday(
+                self.tr(estimated_label) % self.tr(name)
+                if is_estimated and self._buddhist_calendar_show_estimated
+                else name,
+                dt,
+            )
+            if dt
+            else None
         )
 
     def _add_vesak(self, name) -> Optional[date]:
diff --git a/holidays/groups/chinese.py b/holidays/groups/chinese.py
index e2f78af6..95ec1a90 100644
--- a/holidays/groups/chinese.py
+++ b/holidays/groups/chinese.py
@@ -48,7 +48,7 @@ class ChineseCalendarHolidays:
         return self._chinese_calendar.mid_autumn_date(self._year)[0]
 
     def _add_chinese_calendar_holiday(
-        self, name: str, dt_estimated: tuple[date, bool], days_delta: int = 0
+        self, name: str, dt_estimated: tuple[Optional[date], bool], days_delta: int = 0
     ) -> Optional[date]:
         """
         Add Chinese calendar holiday.
@@ -59,14 +59,18 @@ class ChineseCalendarHolidays:
         estimated_label = getattr(self, "estimated_label", "%s (estimated)")
         dt, is_estimated = dt_estimated
 
-        if days_delta != 0:
+        if days_delta and dt:
             dt = _timedelta(dt, days_delta)
 
-        return self._add_holiday(
-            self.tr(estimated_label) % self.tr(name)
-            if is_estimated and self._chinese_calendar_show_estimated
-            else name,
-            dt,
+        return (
+            self._add_holiday(
+                self.tr(estimated_label) % self.tr(name)
+                if is_estimated and self._chinese_calendar_show_estimated
+                else name,
+                dt,
+            )
+            if dt
+            else None
         )
 
     def _add_chinese_birthday_of_buddha(self, name) -> Optional[date]:
diff --git a/holidays/groups/hindu.py b/holidays/groups/hindu.py
index 933b397e..c5f8c2f0 100644
--- a/holidays/groups/hindu.py
+++ b/holidays/groups/hindu.py
@@ -26,7 +26,7 @@ class HinduCalendarHolidays:
         self._hindu_calendar_show_estimated = show_estimated
 
     def _add_hindu_calendar_holiday(
-        self, name: str, dt_estimated: tuple[date, bool]
+        self, name: str, dt_estimated: tuple[Optional[date], bool]
     ) -> Optional[date]:
         """
         Add Hindu calendar holiday.
@@ -37,11 +37,15 @@ class HinduCalendarHolidays:
         estimated_label = getattr(self, "estimated_label", "%s (estimated)")
         dt, is_estimated = dt_estimated
 
-        return self._add_holiday(
-            self.tr(estimated_label) % self.tr(name)
-            if is_estimated and self._hindu_calendar_show_estimated
-            else name,
-            dt,
+        return (
+            self._add_holiday(
+                self.tr(estimated_label) % self.tr(name)
+                if is_estimated and self._hindu_calendar_show_estimated
+                else name,
+                dt,
+            )
+            if dt
+            else None
         )
 
     def _add_diwali(self, name) -> Optional[date]:
diff --git a/holidays/locale/de/LC_MESSAGES/DE.po b/holidays/locale/de/LC_MESSAGES/DE.po
index 5e75fd8d..81b4e6bf 100644
--- a/holidays/locale/de/LC_MESSAGES/DE.po
+++ b/holidays/locale/de/LC_MESSAGES/DE.po
@@ -13,10 +13,10 @@
 # Germany holidays.
 msgid ""
 msgstr ""
-"Project-Id-Version: Holidays 0.23\n"
+"Project-Id-Version: Holidays 0.59\n"
 "POT-Creation-Date: 2023-04-04 16:13+0300\n"
-"PO-Revision-Date: 2023-04-09 18:41+0300\n"
-"Last-Translator: ~Jhellico <jhellico@gmail.com>\n"
+"PO-Revision-Date: 2024-10-17 11:43+0700\n"
+"Last-Translator: PPsyrius <ppsyrius@ppsyrius.dev>\n"
 "Language-Team: Holidays localization team\n"
 "Language: de\n"
 "MIME-Version: 1.0\n"
@@ -24,7 +24,7 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "Generated-By: pygettext.py 1.5\n"
-"X-Generator: Poedit 3.2.2\n"
+"X-Generator: Poedit 3.5\n"
 
 #. New Year's Day.
 msgid "Neujahr"
@@ -89,6 +89,13 @@ msgid ""
 "Zweiten Weltkriegs in Europa"
 msgstr ""
 
+#. 80th anniversary of the liberation from Nazism and the end of the Second
+#. World War in Europe.
+msgid ""
+"80. Jahrestag der Befreiung vom Nationalsozialismus und der Beendigung des "
+"Zweiten Weltkriegs in Europa"
+msgstr ""
+
 #. Epiphany.
 msgid "Heilige Drei Könige"
 msgstr ""
diff --git a/holidays/locale/en_US/LC_MESSAGES/DE.po b/holidays/locale/en_US/LC_MESSAGES/DE.po
index 9cef7b14..6020e2d0 100644
--- a/holidays/locale/en_US/LC_MESSAGES/DE.po
+++ b/holidays/locale/en_US/LC_MESSAGES/DE.po
@@ -14,10 +14,10 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: Holidays 0.23\n"
+"Project-Id-Version: Holidays 0.59\n"
 "POT-Creation-Date: 2023-04-04 16:13+0300\n"
-"PO-Revision-Date: 2023-04-09 18:42+0300\n"
-"Last-Translator: ~Jhellico <jhellico@gmail.com>\n"
+"PO-Revision-Date: 2024-10-17 11:43+0700\n"
+"Last-Translator: PPsyrius <ppsyrius@ppsyrius.dev>\n"
 "Language-Team: Holidays localization team\n"
 "Language: en_US\n"
 "MIME-Version: 1.0\n"
@@ -25,7 +25,7 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "Generated-By: pygettext.py 1.5\n"
-"X-Generator: Poedit 3.2.2\n"
+"X-Generator: Poedit 3.5\n"
 
 #. New Year's Day.
 msgid "Neujahr"
@@ -92,6 +92,15 @@ msgstr ""
 "75th anniversary of the liberation from Nazism and the end of the Second "
 "World War in Europe"
 
+#. 80th anniversary of the liberation from Nazism and the end of the Second
+#. World War in Europe.
+msgid ""
+"80. Jahrestag der Befreiung vom Nationalsozialismus und der Beendigung des "
+"Zweiten Weltkriegs in Europa"
+msgstr ""
+"80th anniversary of the liberation from Nazism and the end of the Second "
+"World War in Europe"
+
 #. Epiphany.
 msgid "Heilige Drei Könige"
 msgstr "Epiphany"
diff --git a/holidays/locale/th/LC_MESSAGES/DE.po b/holidays/locale/th/LC_MESSAGES/DE.po
index 2cd20feb..601c4954 100644
--- a/holidays/locale/th/LC_MESSAGES/DE.po
+++ b/holidays/locale/th/LC_MESSAGES/DE.po
@@ -14,9 +14,9 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: Holidays 0.57\n"
+"Project-Id-Version: Holidays 0.59\n"
 "POT-Creation-Date: 2024-09-05 23:21+0700\n"
-"PO-Revision-Date: 2024-09-05 23:23+0700\n"
+"PO-Revision-Date: 2024-10-17 11:44+0700\n"
 "Last-Translator: PPsyrius <ppsyrius@ppsyrius.dev>\n"
 "Language-Team: Holidays Localization Team\n"
 "Language: th\n"
@@ -92,6 +92,15 @@ msgstr ""
 "วันครบรอบ 75 "
 "ปีของการปลดปล่อยจากระบอบชาติสังคมนิยมและการสิ้นสุดสงครามโลกครั้งที่สองในยุโรป"
 
+#. 80th anniversary of the liberation from Nazism and the end of the Second
+#. World War in Europe.
+msgid ""
+"80. Jahrestag der Befreiung vom Nationalsozialismus und der Beendigung des "
+"Zweiten Weltkriegs in Europa"
+msgstr ""
+"วันครบรอบ 80 "
+"ปีของการปลดปล่อยจากระบอบชาติสังคมนิยมและการสิ้นสุดสงครามโลกครั้งที่สองในยุโรป"
+
 #. Epiphany.
 msgid "Heilige Drei Könige"
 msgstr "วันสมโภชพระคริสต์แสดงองค์"
diff --git a/holidays/locale/th/LC_MESSAGES/VN.po b/holidays/locale/th/LC_MESSAGES/VN.po
new file mode 100644
index 00000000..a4a848fb
--- /dev/null
+++ b/holidays/locale/th/LC_MESSAGES/VN.po
@@ -0,0 +1,93 @@
+#  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 AUTHORS 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)
+#
+# Vietnam holidays th localization.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Holidays 0.59\n"
+"POT-Creation-Date: 2024-09-27 15:50+0700\n"
+"PO-Revision-Date: 2024-10-09 20:58+0300\n"
+"Last-Translator: PPsyrius <ppsyrius@ppsyrius.dev>\n"
+"Language-Team: Holidays Localization Team\n"
+"Language: th\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Lingva 5.0.4\n"
+"X-Generator: Poedit 3.5\n"
+
+#. %s (observed).
+#, c-format
+msgid "%s (nghỉ bù)"
+msgstr "ชดเชย%s"
+
+#. New Year's Day.
+msgid "Tết Dương lịch"
+msgstr "วันปีใหม่สากล"
+
+#. 29 of Lunar New Year.
+msgid "29 Tết"
+msgstr "วันที่ 29 เดือน 12 ตามปฏิทินจันทรคติ"
+
+#. Lunar New Year's Eve.
+msgid "Giao thừa Tết Nguyên Đán"
+msgstr "วันก่อนวันตรุษเต๊ต"
+
+#. Lunar New Year.
+msgid "Tết Nguyên Đán"
+msgstr "วันตรุษเต๊ต"
+
+#. Second Day of Lunar New Year.
+msgid "Mùng hai Tết Nguyên Đán"
+msgstr "วันตรุษเต๊ตวันที่สอง"
+
+#. Third Day of Lunar New Year.
+msgid "Mùng ba Tết Nguyên Đán"
+msgstr "วันตรุษเต๊ตวันที่สาม"
+
+#. Fourth Day of Lunar New Year.
+msgid "Mùng bốn Tết Nguyên Đán"
+msgstr "วันตรุษเต๊ตวันที่สี่"
+
+#. Fifth Day of Lunar New Year.
+msgid "Mùng năm Tết Nguyên Đán"
+msgstr "วันตรุษเต๊ตวันที่ห้า"
+
+#. Sixth Day of Lunar New Year.
+msgid "Mùng sáu Tết Nguyên Đán"
+msgstr "วันตรุษเต๊ตวันที่หก"
+
+#. Hung Kings' Commemoration Day.
+msgid "Ngày Giỗ Tổ Hùng Vương"
+msgstr "วันสักการะบูชาบรรพกษัตริย์หุ่ง"
+
+#. Liberation Day/Reunification Day.
+msgid "Ngày Chiến thắng"
+msgstr "วันปลดปล่อยภาคใต้เพื่อรวมชาติ"
+
+#. International Labor Day.
+msgid "Ngày Quốc tế Lao động"
+msgstr "วันแรงงานสากล"
+
+#. National Day.
+msgid "Quốc khánh"
+msgstr "วันชาติเวียตนาม"
+
+#. Date format (see strftime() Format Codes).
+msgid "%d/%m/%Y"
+msgstr "%d/%m/%Y"
+
+#. Day off (substituted from %s).
+#, c-format
+msgid "Ngày nghỉ (thay cho ngày %s)"
+msgstr "วันหยุด (แทน %s)"
diff --git a/holidays/locale/uk/LC_MESSAGES/DE.po b/holidays/locale/uk/LC_MESSAGES/DE.po
index a19313a8..b31b024e 100644
--- a/holidays/locale/uk/LC_MESSAGES/DE.po
+++ b/holidays/locale/uk/LC_MESSAGES/DE.po
@@ -14,10 +14,10 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: Holidays 0.23\n"
+"Project-Id-Version: Holidays 0.59\n"
 "POT-Creation-Date: 2023-04-04 16:13+0300\n"
-"PO-Revision-Date: 2023-04-09 18:42+0300\n"
-"Last-Translator: ~Jhellico <jhellico@gmail.com>\n"
+"PO-Revision-Date: 2024-10-17 11:44+0700\n"
+"Last-Translator: PPsyrius <ppsyrius@ppsyrius.dev>\n"
 "Language-Team: Holidays localization team\n"
 "Language: uk\n"
 "MIME-Version: 1.0\n"
@@ -25,7 +25,7 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n"
 "Generated-By: pygettext.py 1.5\n"
-"X-Generator: Poedit 3.2.2\n"
+"X-Generator: Poedit 3.5\n"
 
 #. New Year's Day.
 msgid "Neujahr"
@@ -92,6 +92,15 @@ msgstr ""
 "75-та річниця визволення від націонал-соціалізму та завершення Другої "
 "світової війни в Європі"
 
+#. 80th anniversary of the liberation from Nazism and the end of the Second
+#. World War in Europe.
+msgid ""
+"80. Jahrestag der Befreiung vom Nationalsozialismus und der Beendigung des "
+"Zweiten Weltkriegs in Europa"
+msgstr ""
+"80-та річниця визволення від націонал-соціалізму та завершення Другої "
+"світової війни в Європі"
+
 #. Epiphany.
 msgid "Heilige Drei Könige"
 msgstr "Богоявлення"
diff --git a/snapshots/countries/DE_BE.json b/snapshots/countries/DE_BE.json
index 59189e58..fec5b8d1 100644
--- a/snapshots/countries/DE_BE.json
+++ b/snapshots/countries/DE_BE.json
@@ -325,6 +325,7 @@
     "2025-04-18": "Good Friday",
     "2025-04-21": "Easter Monday",
     "2025-05-01": "Labor Day",
+    "2025-05-08": "80th anniversary of the liberation from Nazism and the end of the Second World War in Europe",
     "2025-05-29": "Ascension Day",
     "2025-06-09": "Whit Monday",
     "2025-10-03": "German Unity Day",


Test patch:
diff --git a/tests/countries/test_germany.py b/tests/countries/test_germany.py
index 7363aa95..e35b3d5a 100644
--- a/tests/countries/test_germany.py
+++ b/tests/countries/test_germany.py
@@ -197,6 +197,15 @@ class TestDE(CommonCountryTests, TestCase):
         for subdiv in subdivs_that_dont:
             self.assertNoHoliday(self.subdiv_holidays[subdiv], "2020-05-08")
 
+    def test_80_jahrestag_beendigung_zweiter_weltkrieg(self):
+        subdivs_that_have = {"BE"}
+        subdivs_that_dont = set(DE.subdivisions) - subdivs_that_have
+
+        for subdiv in subdivs_that_have:
+            self.assertHoliday(self.subdiv_holidays[subdiv], "2025-05-08")
+        for subdiv in subdivs_that_dont:
+            self.assertNoHoliday(self.subdiv_holidays[subdiv], "2025-05-08")
+
     def test_christi_himmelfahrt(self):
         known_good = (
             "2014-05-29",
diff --git a/tests/countries/test_vietnam.py b/tests/countries/test_vietnam.py
index 62038528..38e74235 100644
--- a/tests/countries/test_vietnam.py
+++ b/tests/countries/test_vietnam.py
@@ -212,3 +212,23 @@ class TestVietnam(CommonCountryTests, TestCase):
             ("2022-09-01", "National Day"),
             ("2022-09-02", "National Day"),
         )
+
+    def test_l10n_th(self):
+        self.assertLocalizedHolidays(
+            "th",
+            ("2022-01-01", "วันปีใหม่สากล"),
+            ("2022-01-03", "ชดเชยวันปีใหม่สากล"),
+            ("2022-01-31", "วันก่อนวันตรุษเต๊ต"),
+            ("2022-02-01", "วันตรุษเต๊ต"),
+            ("2022-02-02", "วันตรุษเต๊ตวันที่สอง"),
+            ("2022-02-03", "วันตรุษเต๊ตวันที่สาม"),
+            ("2022-02-04", "วันตรุษเต๊ตวันที่สี่"),
+            ("2022-04-10", "วันสักการะบูชาบรรพกษัตริย์หุ่ง"),
+            ("2022-04-11", "ชดเชยวันสักการะบูชาบรรพกษัตริย์หุ่ง"),
+            ("2022-04-30", "วันปลดปล่อยภาคใต้เพื่อรวมชาติ"),
+            ("2022-05-01", "วันแรงงานสากล"),
+            ("2022-05-02", "ชดเชยวันปลดปล่อยภาคใต้เพื่อรวมชาติ"),
+            ("2022-05-03", "ชดเชยวันแรงงานสากล"),
+            ("2022-09-01", "วันชาติเวียตนาม"),
+            ("2022-09-02", "วันชาติเวียตนาม"),
+        )