holidays 0.82__py3-none-any.whl → 0.83__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. holidays/calendars/islamic.py +26 -6
  2. holidays/countries/__init__.py +1 -0
  3. holidays/countries/azerbaijan.py +1 -1
  4. holidays/countries/canada.py +27 -13
  5. holidays/countries/denmark.py +18 -6
  6. holidays/countries/fiji.py +2 -3
  7. holidays/countries/finland.py +3 -6
  8. holidays/countries/guyana.py +24 -32
  9. holidays/countries/india.py +21 -78
  10. holidays/countries/iran.py +133 -269
  11. holidays/countries/ireland.py +1 -1
  12. holidays/countries/israel.py +1 -1
  13. holidays/countries/macau.py +5 -8
  14. holidays/countries/mauritius.py +10 -9
  15. holidays/countries/montserrat.py +1 -1
  16. holidays/countries/myanmar.py +9 -10
  17. holidays/countries/nepal.py +11 -30
  18. holidays/countries/netherlands.py +28 -24
  19. holidays/countries/new_zealand.py +75 -31
  20. holidays/countries/nigeria.py +53 -75
  21. holidays/countries/norway.py +1 -1
  22. holidays/countries/rwanda.py +2 -2
  23. holidays/countries/slovakia.py +23 -4
  24. holidays/countries/sri_lanka.py +21 -58
  25. holidays/countries/suriname.py +1 -2
  26. holidays/countries/sweden.py +1 -1
  27. holidays/countries/switzerland.py +86 -3
  28. holidays/countries/taiwan.py +1 -1
  29. holidays/countries/tanzania.py +19 -29
  30. holidays/countries/thailand.py +8 -7
  31. holidays/countries/trinidad_and_tobago.py +1 -1
  32. holidays/countries/ukraine.py +1 -1
  33. holidays/countries/united_kingdom.py +1 -1
  34. holidays/countries/united_states.py +2 -2
  35. holidays/countries/western_sahara.py +92 -0
  36. holidays/groups/buddhist.py +2 -2
  37. holidays/groups/chinese.py +5 -2
  38. holidays/groups/christian.py +10 -0
  39. holidays/groups/eastern.py +3 -1
  40. holidays/groups/hindu.py +9 -3
  41. holidays/groups/international.py +1 -1
  42. holidays/groups/islamic.py +10 -3
  43. holidays/groups/mongolian.py +5 -2
  44. holidays/groups/sinhala.py +6 -3
  45. holidays/groups/tibetan.py +5 -2
  46. holidays/holiday_base.py +21 -22
  47. holidays/locale/ar/LC_MESSAGES/EH.mo +0 -0
  48. holidays/locale/de/LC_MESSAGES/CH.mo +0 -0
  49. holidays/locale/en_US/LC_MESSAGES/CH.mo +0 -0
  50. holidays/locale/en_US/LC_MESSAGES/EH.mo +0 -0
  51. holidays/locale/en_US/LC_MESSAGES/NL.mo +0 -0
  52. holidays/locale/es/LC_MESSAGES/EH.mo +0 -0
  53. holidays/locale/fr/LC_MESSAGES/CH.mo +0 -0
  54. holidays/locale/fr/LC_MESSAGES/EH.mo +0 -0
  55. holidays/locale/fy/LC_MESSAGES/NL.mo +0 -0
  56. holidays/locale/it/LC_MESSAGES/CH.mo +0 -0
  57. holidays/locale/nl/LC_MESSAGES/NL.mo +0 -0
  58. holidays/locale/th/LC_MESSAGES/CH.mo +0 -0
  59. holidays/locale/th/LC_MESSAGES/DK.mo +0 -0
  60. holidays/locale/th/LC_MESSAGES/NL.mo +0 -0
  61. holidays/locale/uk/LC_MESSAGES/CH.mo +0 -0
  62. holidays/locale/uk/LC_MESSAGES/NL.mo +0 -0
  63. holidays/observed_holiday_base.py +16 -4
  64. holidays/registry.py +2 -0
  65. holidays/version.py +1 -1
  66. {holidays-0.82.dist-info → holidays-0.83.dist-info}/METADATA +18 -16
  67. {holidays-0.82.dist-info → holidays-0.83.dist-info}/RECORD +71 -63
  68. {holidays-0.82.dist-info → holidays-0.83.dist-info}/WHEEL +0 -0
  69. {holidays-0.82.dist-info → holidays-0.83.dist-info}/licenses/CONTRIBUTORS +0 -0
  70. {holidays-0.82.dist-info → holidays-0.83.dist-info}/licenses/LICENSE +0 -0
  71. {holidays-0.82.dist-info → holidays-0.83.dist-info}/top_level.txt +0 -0
@@ -25,8 +25,12 @@ class IslamicHolidays(EasternCalendarHolidays):
25
25
  calendar consisting of 12 lunar months in a year of 354 or 355 days.
26
26
  """
27
27
 
28
- def __init__(self, cls=None, show_estimated=True) -> None:
29
- self._islamic_calendar = cls() if cls else _IslamicLunar()
28
+ def __init__(self, cls=None, *, show_estimated=True, calendar_delta_days=0) -> None:
29
+ self._islamic_calendar = (
30
+ cls(calendar_delta_days=calendar_delta_days)
31
+ if cls
32
+ else _IslamicLunar(calendar_delta_days=calendar_delta_days)
33
+ )
30
34
  self._islamic_calendar_show_estimated = show_estimated
31
35
 
32
36
  def _add_ali_al_rida_death_day(self, name) -> set[date]:
@@ -282,7 +286,10 @@ class IslamicHolidays(EasternCalendarHolidays):
282
286
  holiday date is an estimation.
283
287
  """
284
288
  return self._add_eastern_calendar_holiday_set(
285
- name, dts_estimated, self._islamic_calendar_show_estimated, days_delta
289
+ name,
290
+ dts_estimated,
291
+ show_estimated=self._islamic_calendar_show_estimated,
292
+ days_delta=days_delta,
286
293
  )
287
294
 
288
295
  def _add_islamic_new_year_day(self, name) -> set[date]:
@@ -22,7 +22,7 @@ class MongolianCalendarHolidays(EasternCalendarHolidays):
22
22
  Mongolian lunisolar calendar holidays.
23
23
  """
24
24
 
25
- def __init__(self, cls=None, show_estimated=False) -> None:
25
+ def __init__(self, cls=None, *, show_estimated=False) -> None:
26
26
  self._mongolian_calendar = cls() if cls else _MongolianLunisolar()
27
27
  self._mongolian_calendar_show_estimated = show_estimated
28
28
 
@@ -37,7 +37,10 @@ class MongolianCalendarHolidays(EasternCalendarHolidays):
37
37
  """
38
38
 
39
39
  return self._add_eastern_calendar_holiday(
40
- name, dt_estimated, self._mongolian_calendar_show_estimated, days_delta
40
+ name,
41
+ dt_estimated,
42
+ show_estimated=self._mongolian_calendar_show_estimated,
43
+ days_delta=days_delta,
41
44
  )
42
45
 
43
46
  def _add_buddha_day(self, name) -> Optional[date]:
@@ -32,7 +32,7 @@ class SinhalaCalendarHolidays(EasternCalendarHolidays):
32
32
  Adhi month dates are instead hardcoded in Sri Lanka country implementation.
33
33
  """
34
34
 
35
- def __init__(self, cls=None, show_estimated=False) -> None:
35
+ def __init__(self, cls=None, *, show_estimated=False) -> None:
36
36
  self._sinhala_calendar = cls() if cls else _SinhalaLunar()
37
37
  self._sinhala_calendar_show_estimated = show_estimated
38
38
 
@@ -46,7 +46,7 @@ class SinhalaCalendarHolidays(EasternCalendarHolidays):
46
46
  is an estimation.
47
47
  """
48
48
  return self._add_eastern_calendar_holiday(
49
- name, dt_estimated, self._sinhala_calendar_show_estimated
49
+ name, dt_estimated, show_estimated=self._sinhala_calendar_show_estimated
50
50
  )
51
51
 
52
52
  def _add_sinhala_calendar_holiday_set(
@@ -59,7 +59,10 @@ class SinhalaCalendarHolidays(EasternCalendarHolidays):
59
59
  is an estimation.
60
60
  """
61
61
  return self._add_eastern_calendar_holiday_set(
62
- name, dts_estimated, self._sinhala_calendar_show_estimated, days_delta
62
+ name,
63
+ dts_estimated,
64
+ show_estimated=self._sinhala_calendar_show_estimated,
65
+ days_delta=days_delta,
63
66
  )
64
67
 
65
68
  def _add_bak_poya(self, name) -> Optional[date]:
@@ -22,7 +22,7 @@ class TibetanCalendarHolidays(EasternCalendarHolidays):
22
22
  Tibetan lunisolar calendar holidays.
23
23
  """
24
24
 
25
- def __init__(self, cls=None, show_estimated=False) -> None:
25
+ def __init__(self, cls=None, *, show_estimated=False) -> None:
26
26
  self._tibetan_calendar = cls() if cls else _TibetanLunisolar()
27
27
  self._tibetan_calendar_show_estimated = show_estimated
28
28
 
@@ -36,7 +36,10 @@ class TibetanCalendarHolidays(EasternCalendarHolidays):
36
36
  is an estimation.
37
37
  """
38
38
  return self._add_eastern_calendar_holiday(
39
- name, dt_estimated, self._tibetan_calendar_show_estimated, days_delta
39
+ name,
40
+ dt_estimated,
41
+ show_estimated=self._tibetan_calendar_show_estimated,
42
+ days_delta=days_delta,
40
43
  )
41
44
 
42
45
  def _add_blessed_rainy_day(self, name) -> Optional[date]:
holidays/holiday_base.py CHANGED
@@ -808,7 +808,7 @@ class HolidayBase(dict[date, str]):
808
808
  self[dt] = self.tr(name)
809
809
  return dt
810
810
 
811
- def _add_special_holidays(self, mapping_names, observed=False):
811
+ def _add_special_holidays(self, mapping_names, *, observed=False):
812
812
  """Add special holidays."""
813
813
  for mapping_name in mapping_names:
814
814
  for data in _normalize_tuple(getattr(self, mapping_name, {}).get(self._year, ())):
@@ -865,7 +865,14 @@ class HolidayBase(dict[date, str]):
865
865
  def _is_sunday(self, *args) -> bool:
866
866
  return self._check_weekday(SUN, *args)
867
867
 
868
- def _is_weekend(self, *args):
868
+ def _is_weekday(self, *args) -> bool:
869
+ """
870
+ Returns True if date's week day is not a weekend day.
871
+ Returns False otherwise.
872
+ """
873
+ return not self._is_weekend(*args)
874
+
875
+ def _is_weekend(self, *args) -> bool:
869
876
  """
870
877
  Returns True if date's week day is a weekend day.
871
878
  Returns False otherwise.
@@ -1361,11 +1368,12 @@ class HolidaySum(HolidayBase):
1361
1368
  else:
1362
1369
  self.holidays.append(operand)
1363
1370
 
1364
- kwargs: dict[str, Any] = {}
1365
1371
  # Join years, expand and observed.
1366
- kwargs["years"] = h1.years | h2.years
1367
- kwargs["expand"] = h1.expand or h2.expand
1368
- kwargs["observed"] = h1.observed or h2.observed
1372
+ kwargs: dict[str, Any] = {
1373
+ "expand": h1.expand or h2.expand,
1374
+ "observed": h1.observed or h2.observed,
1375
+ "years": h1.years | h2.years,
1376
+ }
1369
1377
  # Join country and subdivisions data.
1370
1378
  # TODO: this way makes no sense: joining Italy Catania (IT, CA) with
1371
1379
  # USA Mississippi (US, MS) and USA Michigan (US, MI) yields
@@ -1374,25 +1382,16 @@ class HolidaySum(HolidayBase):
1374
1382
  # and Milano, or ... you get the picture.
1375
1383
  # Same goes when countries and markets are being mixed (working, yet
1376
1384
  # still nonsensical).
1385
+ value: Optional[Union[str, list[str]]]
1377
1386
  for attr in ("country", "market", "subdiv"):
1378
- if (
1379
- getattr(h1, attr, None)
1380
- and getattr(h2, attr, None)
1381
- and getattr(h1, attr) != getattr(h2, attr)
1382
- ):
1383
- a1 = (
1384
- getattr(h1, attr)
1385
- if isinstance(getattr(h1, attr), list)
1386
- else [getattr(h1, attr)]
1387
- )
1388
- a2 = (
1389
- getattr(h2, attr)
1390
- if isinstance(getattr(h2, attr), list)
1391
- else [getattr(h2, attr)]
1392
- )
1387
+ a1 = getattr(h1, attr, None)
1388
+ a2 = getattr(h2, attr, None)
1389
+ if a1 and a2 and a1 != a2:
1390
+ a1 = a1 if isinstance(a1, list) else [a1]
1391
+ a2 = a2 if isinstance(a2, list) else [a2]
1393
1392
  value = a1 + a2
1394
1393
  else:
1395
- value = getattr(h1, attr, None) or getattr(h2, attr, None)
1394
+ value = a1 or a2
1396
1395
 
1397
1396
  if attr == "subdiv":
1398
1397
  kwargs[attr] = value
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -145,7 +145,9 @@ class ObservedHolidayBase(HolidayBase):
145
145
  self,
146
146
  dt: Optional[DateArg] = None,
147
147
  name: Optional[str] = None,
148
+ *,
148
149
  rule: Optional[ObservedRule] = None,
150
+ force_observed: bool = False,
149
151
  show_observed_label: bool = True,
150
152
  ) -> tuple[bool, Optional[date]]:
151
153
  if dt is None:
@@ -155,7 +157,7 @@ class ObservedHolidayBase(HolidayBase):
155
157
  # Convert to date: (m, d) → use self._year; (y, m, d) → use directly.
156
158
  dt = dt if isinstance(dt, date) else date(self._year, *dt) if len(dt) == 2 else date(*dt)
157
159
 
158
- if not self.observed or not self._is_observed(dt):
160
+ if not (force_observed or (self.observed and self._is_observed(dt))):
159
161
  return False, dt
160
162
 
161
163
  dt_observed = self._get_observed_date(dt, rule or self._observed_rule)
@@ -196,16 +198,26 @@ class ObservedHolidayBase(HolidayBase):
196
198
  return True, dt_observed
197
199
 
198
200
  def _move_holiday(
199
- self, dt: date, rule: Optional[ObservedRule] = None, show_observed_label: bool = True
201
+ self,
202
+ dt: date,
203
+ *,
204
+ rule: Optional[ObservedRule] = None,
205
+ force_observed: bool = False,
206
+ show_observed_label: bool = True,
200
207
  ) -> tuple[bool, Optional[date]]:
201
208
  is_observed, dt_observed = self._add_observed(
202
- dt, rule=rule, show_observed_label=show_observed_label
209
+ dt, rule=rule, force_observed=force_observed, show_observed_label=show_observed_label
203
210
  )
204
211
  if is_observed:
205
212
  self.pop(dt)
206
213
  return is_observed, dt_observed if is_observed else dt
207
214
 
208
- def _populate_observed(self, dts: set[date], multiple: bool = False) -> None:
215
+ def _move_holiday_forced(
216
+ self, dt: date, rule: Optional[ObservedRule] = None
217
+ ) -> tuple[bool, Optional[date]]:
218
+ return self._move_holiday(dt, rule=rule, force_observed=True, show_observed_label=False)
219
+
220
+ def _populate_observed(self, dts: set[date], *, multiple: bool = False) -> None:
209
221
  """
210
222
  When multiple is True, each holiday from a given date has its own observed date.
211
223
  """
holidays/registry.py CHANGED
@@ -278,6 +278,7 @@ COUNTRIES: RegistryDict = {
278
278
  "venezuela": ("Venezuela", "VE", "VEN"),
279
279
  "vietnam": ("Vietnam", "VN", "VNM"),
280
280
  "wallis_and_futuna": ("WallisAndFutuna", "WF", "WLF", "HolidaysWF"),
281
+ "western_sahara": ("WesternSahara", "EH", "ESH"),
281
282
  "yemen": ("Yemen", "YE", "YEM"),
282
283
  "zambia": ("Zambia", "ZM", "ZMB"),
283
284
  "zimbabwe": ("Zimbabwe", "ZW", "ZWE"),
@@ -351,6 +352,7 @@ class EntityLoader:
351
352
  @staticmethod
352
353
  def _get_entity_codes(
353
354
  container: RegistryDict,
355
+ *,
354
356
  include_aliases: bool = True,
355
357
  max_code_length: int = 3,
356
358
  min_code_length: int = 2,
holidays/version.py CHANGED
@@ -10,4 +10,4 @@
10
10
  # Website: https://github.com/vacanza/holidays
11
11
  # License: MIT (see LICENSE file)
12
12
 
13
- __version__ = "0.82"
13
+ __version__ = "0.83"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: holidays
3
- Version: 0.82
3
+ Version: 0.83
4
4
  Summary: Open World Holidays Framework
5
5
  Author: Vacanza Team
6
6
  Maintainer: Arkadii Yakovets, Panpakorn Siripanich, Serhii Murza
@@ -22,6 +22,7 @@ Classifier: Programming Language :: Python :: 3.10
22
22
  Classifier: Programming Language :: Python :: 3.11
23
23
  Classifier: Programming Language :: Python :: 3.12
24
24
  Classifier: Programming Language :: Python :: 3.13
25
+ Classifier: Programming Language :: Python :: 3.14
25
26
  Classifier: Programming Language :: Python :: Implementation :: CPython
26
27
  Classifier: Topic :: File Formats :: JSON
27
28
  Classifier: Topic :: Office/Business :: Financial :: Accounting
@@ -52,7 +53,7 @@ specific date is a holiday as fast and flexible as possible.
52
53
  <tr>
53
54
  <td>CI/CD</td>
54
55
  <td>
55
- <a href="https://github.com/vacanza/holidays/actions/workflows/ci-cd.yml?query=branch%3Adev"><img src="https://img.shields.io/github/actions/workflow/status/vacanza/holidays/ci-cd.yml?branch=dev&color=41BE4A&style=flat" alt="CI/CD status"></a>&nbsp;<a href="https://holidays.readthedocs.io/en/latest/?badge=latest"><img src="https://img.shields.io/readthedocs/holidays?color=41BE4A&style=flat" alt="Documentation status"></a>
56
+ <a href="https://github.com/vacanza/holidays/actions/workflows/ci-cd.yml?query=branch%3Adev"><img src="https://img.shields.io/github/actions/workflow/status/vacanza/holidays/ci-cd.yml?branch=dev&color=41B5BE&style=flat" alt="CI/CD status"></a>&nbsp;<a href="https://holidays.readthedocs.io/en/latest/?badge=latest"><img src="https://img.shields.io/readthedocs/holidays?color=41B5BE&style=flat" alt="Documentation status"></a>&nbsp;<a href="https://snyk.io/advisor/python/holidays/"><img alt="Open World Holidays Package Health Score" src="https://img.shields.io/badge/dynamic/regex?url=https%3A%2F%2Fsnyk.io%2Fadvisor%2Fpython%2Fholidays%2Fbadge.svg&search=%5Cd%7B1%2C3%7D%2F%5Cd%7B1%2C3%7D&style=flat&label=snyk&color=41B5BE"></a>
56
57
  </td>
57
58
  </tr>
58
59
  <tr>
@@ -64,7 +65,7 @@ specific date is a holiday as fast and flexible as possible.
64
65
  <tr>
65
66
  <td>GitHub</td>
66
67
  <td>
67
- <a href="https://github.com/vacanza/holidays/stargazers"><img src="https://img.shields.io/github/stars/vacanza/holidays?color=41BE4A&style=flat" alt="GitHub stars"></a>&nbsp;<a href="https://github.com/vacanza/holidays/forks"><img src="https://img.shields.io/github/forks/vacanza/holidays?color=41BE4A&style=flat" alt="GitHub forks"></a>&nbsp;<a href="https://github.com/vacanza/holidays/graphs/contributors"><img src="https://img.shields.io/github/contributors/vacanza/holidays?color=41BE4A&style=flat" alt="GitHub contributors"></a>&nbsp;<a href="https://github.com/vacanza/holidays/commits/dev"><img src="https://img.shields.io/github/last-commit/vacanza/holidays/dev?color=41BE4A&style=flat" alt="GitHub last commit"></a>
68
+ <a href="https://github.com/vacanza/holidays/stargazers"><img src="https://img.shields.io/github/stars/vacanza/holidays?color=41B5BE&style=flat" alt="GitHub stars"></a>&nbsp;<a href="https://github.com/vacanza/holidays/forks"><img src="https://img.shields.io/github/forks/vacanza/holidays?color=41B5BE&style=flat" alt="GitHub forks"></a>&nbsp;<a href="https://github.com/vacanza/holidays/graphs/contributors"><img src="https://img.shields.io/github/contributors/vacanza/holidays?color=41B5BE&style=flat" alt="GitHub contributors"></a>&nbsp;<a href="https://github.com/vacanza/holidays/commits/dev"><img src="https://img.shields.io/github/last-commit/vacanza/holidays/dev?color=41B5BE&style=flat" alt="GitHub last commit"></a>
68
69
  </td>
69
70
  </tr>
70
71
  <tr>
@@ -73,12 +74,6 @@ specific date is a holiday as fast and flexible as possible.
73
74
  <a href="https://doi.org/10.5281/zenodo.14884702"><img src="https://img.shields.io/badge/DOI-10.5281/zenodo.14884702-41B5BE?style=flat" alt="Open World Holidays Framework DOI"></a>
74
75
  </td>
75
76
  </tr>
76
- <tr>
77
- <td>Snyk</td>
78
- <td>
79
- <a href="https://snyk.io/advisor/python/holidays/"><img src="https://snyk.io/advisor/python/holidays/badge.svg" alt="Open World Holidays Package Health Score"></a>
80
- </td>
81
- </tr>
82
77
  </table>
83
78
 
84
79
  ## Install
@@ -100,7 +95,7 @@ version upgrades.
100
95
 
101
96
  ## Documentation
102
97
 
103
- The documentation is hosted on [Read the Docs](https://holidays.readthedocs.io/).
98
+ The documentation is hosted on [Read the Docs](https://holidays.readthedocs.io).
104
99
 
105
100
  ## Quick Start
106
101
 
@@ -142,9 +137,9 @@ and detailed information.
142
137
 
143
138
  ## Available Countries
144
139
 
145
- We currently support 248 country codes. The standard way to refer to a country is by using its [ISO
146
- 3166-1 alpha-2 code](https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes), the same used
147
- for domain names, and for a subdivision its [ISO 3166-2
140
+ We currently support 249 country codes and are fully compatible with [ISO 3166-1](https://www.iso.org/iso-3166-country-codes.html).
141
+ 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),
142
+ the same used for domain names, and for a subdivision its [ISO 3166-2
148
143
  code](https://en.wikipedia.org/wiki/ISO_3166-2). Some countries have common or foreign names or
149
144
  abbreviations as aliases for their subdivisions. These are defined in the (optional)
150
145
  `subdivisions_aliases` attribute. Some of the countries support more than one language for holiday
@@ -600,7 +595,7 @@ any) in brackets, available languages and additional holiday categories. All cou
600
595
  <td>Denmark</td>
601
596
  <td>DK</td>
602
597
  <td></td>
603
- <td><strong>da</strong>, en_US, uk</td>
598
+ <td><strong>da</strong>, en_US, th, uk</td>
604
599
  <td>OPTIONAL</td>
605
600
  </tr>
606
601
  <tr>
@@ -1265,7 +1260,7 @@ any) in brackets, available languages and additional holiday categories. All cou
1265
1260
  <td>Netherlands</td>
1266
1261
  <td>NL</td>
1267
1262
  <td></td>
1268
- <td>en_US, fy, <strong>nl</strong>, uk</td>
1263
+ <td>en_US, fy, <strong>nl</strong>, th, uk</td>
1269
1264
  <td>OPTIONAL</td>
1270
1265
  </tr>
1271
1266
  <tr>
@@ -1692,7 +1687,7 @@ any) in brackets, available languages and additional holiday categories. All cou
1692
1687
  <td>Switzerland</td>
1693
1688
  <td>CH</td>
1694
1689
  <td>Cantons: AG (Aargau), AI (Appenzell Innerrhoden), AR (Appenzell Ausserrhoden), BE (Bern, Berne), BL (Basel-Landschaft), BS (Basel-Stadt), FR (Freiburg, Fribourg), GE (Genève), GL (Glarus), GR (Graubünden, Grigioni, Grischun), JU (Jura), LU (Luzern), NE (Neuchâtel), NW (Nidwalden), OW (Obwalden), SG (Sankt Gallen), SH (Schaffhausen), SO (Solothurn), SZ (Schwyz), TG (Thurgau), TI (Ticino), UR (Uri), VD (Vaud), VS (Valais, Wallis), ZG (Zug), ZH (Zürich)</td>
1695
- <td><strong>de</strong>, en_US, fr, it, uk</td>
1690
+ <td><strong>de</strong>, en_US, fr, it, th, uk</td>
1696
1691
  <td>HALF_DAY, OPTIONAL</td>
1697
1692
  </tr>
1698
1693
  <tr>
@@ -1906,6 +1901,13 @@ any) in brackets, available languages and additional holiday categories. All cou
1906
1901
  <td></td>
1907
1902
  </tr>
1908
1903
  <tr>
1904
+ <td>Western Sahara</td>
1905
+ <td>EH</td>
1906
+ <td></td>
1907
+ <td><strong>ar</strong>, en_US, es, fr</td>
1908
+ <td></td>
1909
+ </tr>
1910
+ <tr>
1909
1911
  <td>Yemen</td>
1910
1912
  <td>YE</td>
1911
1913
  <td></td>