Repository: vacanza/holidays
Pull request #2601 (2025-06-05 19:58:03)

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


coderabbitai[bot]: <!-- This is an auto-generated comment: summarize by coderabbit.ai -->
<!-- This is an auto-generated comment: review in progress by coderabbit.ai -->

> [!NOTE]
> Currently processing new changes in this PR. This may take a few minutes, please wait...
> 
> <details>
> <summary>📥 Commits</summary>
> 
> Reviewing files that changed from the base of the PR and between 32a0f7c51e38501a612e004b9d818872f58af992 and 83cac2c032437c92c4980d67274872ca21fdfa9b.
> 
> </details>
> 
> <details>
> <summary>📒 Files selected for processing (14)</summary>
> 
> * `README.md` (2 hunks)
> * `holidays/calendars/__init__.py` (1 hunks)
> * `holidays/calendars/mongolian.py` (1 hunks)
> * `holidays/countries/__init__.py` (1 hunks)
> * `holidays/countries/mongolia.py` (1 hunks)
> * `holidays/groups/__init__.py` (1 hunks)
> * `holidays/groups/eastern.py` (1 hunks)
> * `holidays/groups/mongolian.py` (1 hunks)
> * `holidays/locale/en_MN/LC_MESSAGES/MN.po` (1 hunks)
> * `holidays/locale/en_US/LC_MESSAGES/MN.po` (1 hunks)
> * `holidays/locale/mn/LC_MESSAGES/MN.po` (1 hunks)
> * `holidays/registry.py` (1 hunks)
> * `scripts/calendar/asian_generator.py` (4 hunks)
> * `tests/countries/test_mongolia.py` (1 hunks)
> 
> </details>
> 
> ```ascii
>  _________________________________________________________________________________________________________________
> < Iterate the schedule with the code. Use experience you gain as you implement to refine the project time scales. >
>  -----------------------------------------------------------------------------------------------------------------
>   \
>    \   (\__/)
>        (•ㅅ•)
>        / 　 づ
> ```

<!-- end of auto-generated comment: review in progress by coderabbit.ai -->
<!-- usage_tips_start -->

> [!TIP]
> <details>
> <summary>CodeRabbit can generate a title for your PR based on the changes with custom instructions.</summary>
> 
> Add the `reviews.auto_title_instructions` setting in your project's settings in CodeRabbit to generate a title for your PR based on the changes in the PR with custom instructions.
> 
> </details>

<!-- usage_tips_end -->
<!-- finishing_touch_checkbox_start -->

<details open="true">
<summary>✨ Finishing Touches</summary>

- [ ] <!-- {"checkboxId": "7962f53c-55bc-4827-bfbf-6a18da830691"} --> 📝 Generate Docstrings

</details>

<!-- finishing_touch_checkbox_end -->
<!-- tips_start -->

---

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

<details>
<summary>❤️ Share</summary>

- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)
- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)
- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)
- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)

</details>

<details>
<summary>🪧 Tips</summary>

### Chat

There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=vacanza/holidays&utm_content=2601):

- Review comments: Directly reply to a review comment made by CodeRabbit. Example:
  - `I pushed a fix in commit <commit_id>, please review it.`
  - `Explain this complex logic.`
  - `Open a follow-up GitHub issue for this discussion.`
- Files and specific lines of code (under the "Files changed" tab): Tag `@coderabbitai` in a new review comment at the desired location with your query. Examples:
  - `@coderabbitai explain this code block.`
  -	`@coderabbitai modularize this function.`
- PR comments: Tag `@coderabbitai` in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
  - `@coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.`
  - `@coderabbitai read src/utils.ts and explain its main purpose.`
  - `@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.`
  - `@coderabbitai help me debug CodeRabbit configuration file.`

### Support

Need help? Create a ticket on our [support page](https://www.coderabbit.ai/contact-us/support) for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

### CodeRabbit Commands (Invoked using PR comments)

- `@coderabbitai pause` to pause the reviews on a PR.
- `@coderabbitai resume` to resume the paused reviews.
- `@coderabbitai review` to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
- `@coderabbitai full review` to do a full review from scratch and review all the files again.
- `@coderabbitai summary` to regenerate the summary of the PR.
- `@coderabbitai generate docstrings` to [generate docstrings](https://docs.coderabbit.ai/finishing-touches/docstrings) for this PR.
- `@coderabbitai generate sequence diagram` to generate a sequence diagram of the changes in this PR.
- `@coderabbitai resolve` resolve all the CodeRabbit review comments.
- `@coderabbitai configuration` to show the current CodeRabbit configuration for the repository.
- `@coderabbitai help` to get help.

### Other keywords and placeholders

- Add `@coderabbitai ignore` anywhere in the PR description to prevent this PR from being reviewed.
- Add `@coderabbitai summary` to generate the high-level summary at a specific location in the PR description.
- Add `@coderabbitai` anywhere in the PR title to generate the title automatically.

### Documentation and Community

- Visit our [Documentation](https://docs.coderabbit.ai) for detailed information on how to use CodeRabbit.
- Join our [Discord Community](http://discord.gg/coderabbit) to get help, request features, and share feedback.
- Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements.

</details>

<!-- tips_end -->
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=2601) **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=2601&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=2601&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=2601&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=2601&metric=new_coverage&view=list)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [2.6% Duplication on New Code](https://sonarcloud.io/component_measures?id=vacanza_python-holidays&pullRequest=2601&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=vacanza_python-holidays&pullRequest=2601)


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=2601) **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=2601&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=2601&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=2601&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=2601&metric=new_coverage&view=list)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [2.5% Duplication on New Code](https://sonarcloud.io/component_measures?id=vacanza_python-holidays&pullRequest=2601&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=vacanza_python-holidays&pullRequest=2601)


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=2601) **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=2601&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=2601&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=2601&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=2601&metric=new_coverage&view=list)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [2.5% Duplication on New Code](https://sonarcloud.io/component_measures?id=vacanza_python-holidays&pullRequest=2601&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=vacanza_python-holidays&pullRequest=2601)


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=2601) **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=2601&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=2601&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=2601&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=2601&metric=new_coverage&view=list)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [2.5% Duplication on New Code](https://sonarcloud.io/component_measures?id=vacanza_python-holidays&pullRequest=2601&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=vacanza_python-holidays&pullRequest=2601)


ankushhKapoor: > @ankushhKapoor, good work! I like such things. 😋

Thankss

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=2601) **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=2601&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=2601&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=2601&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=2601&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=2601&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=vacanza_python-holidays&pullRequest=2601)


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=2601) **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=2601&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=2601&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=2601&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=2601&metric=new_coverage&view=list)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [1.4% Duplication on New Code](https://sonarcloud.io/component_measures?id=vacanza_python-holidays&pullRequest=2601&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=vacanza_python-holidays&pullRequest=2601)


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=2601) **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=2601&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=2601&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=2601&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=2601&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=2601&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=vacanza_python-holidays&pullRequest=2601)


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=2601) **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=2601&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=2601&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=2601&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=2601&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=2601&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=vacanza_python-holidays&pullRequest=2601)


PPsyrius: > Any updates regarding this? If it's helpful, please share the test data — I’d be happy to take a look and debug where needed.

It was the 2022 Tsagaan Sar and 2024 Genghis Khan's Birthday, which have since been fixed 👍 

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=2601) **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=2601&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=2601&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=2601&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=2601&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=2601&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=vacanza_python-holidays&pullRequest=2601)


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=2601) **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=2601&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=2601&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=2601&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=2601&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=2601&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=vacanza_python-holidays&pullRequest=2601)


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=2601) **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=2601&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=2601&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=2601&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=2601&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=2601&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=vacanza_python-holidays&pullRequest=2601)


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=2601) **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=2601&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=2601&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=2601&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=2601&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=2601&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=vacanza_python-holidays&pullRequest=2601)


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=2601) **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=2601&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=2601&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=2601&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=2601&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=2601&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=vacanza_python-holidays&pullRequest=2601)


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=2601) **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=2601&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=2601&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=2601&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=2601&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=2601&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=vacanza_python-holidays&pullRequest=2601)


PPsyrius: As for that one long observance period (SEP, 5 to OCT, 20): https://legalinfo.mn/mn/detail?lawId=100714&showType=1
```python
        if self._year >= 2007:
            # New Harvest Days.
            name = tr(Шинэ ургацын өдрүүд)
            dt = self._add_holiday_sep_5(name)
            for delta in range(1, 46):
                self._add_holiday(name, _timedelta(dt, delta))
```
And for the 2 remaining `WORKDAY` I don't think our syntactic sugar implementation supports such cases yet @KJhellico @arkid15r 
- `Байгаль орчныг хамгаалах өдрүүд` (Environmental Protection Days): The whole 4th week of September
- `Үндэсний бичиг соёл, номын өдрүүд` (National Literary, Cultural and Book Days; added on July 2nd, 2021): Saturday and Sunday of the 3rd week of May and September.

ankushhKapoor: > I'm a little freaked out by the 46-day holiday... 😐 As for those two: we need to clarify how exactly the weeks are counted to determine the 3rd and 4th.

Just to confirm — the 46-day long holiday is to be added, right?
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=2601) **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=2601&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=2601&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=2601&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=2601&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=2601&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=vacanza_python-holidays&pullRequest=2601)


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=2601) **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=2601&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=2601&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=2601&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=2601&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=2601&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=vacanza_python-holidays&pullRequest=2601)


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=2601) **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=2601&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=2601&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=2601&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=2601&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=2601&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=vacanza_python-holidays&pullRequest=2601)


PPsyrius: > Just to confirm — the 46-day long holiday is to be added, right?

Yes, a minor correction here is that it's in section 5 and thus instead a `WORKDAY` observance (I'm not sure why Mongolian government even think this is a logical things to do, but it exists 🤷 ), the other instance of long holidays being de facto implemented that I know was Thailand's Songkran holidays between 1914-1925 (19 days long)
ankushhKapoor: 
> ```python
>         if self._year >= 2007:
>             # New Harvest Days.
>             name = tr(Шинэ ургацын өдрүүд)
>             dt = self._add_holiday_sep_5(name)
>             for delta in range(1, 46):
>                 self._add_holiday(name, _timedelta(dt, delta))
> ```

How to handle test cases for this ??

```python
    def test_l10n_en_us(self):
        self.assertLocalizedHolidays(
            "en_US",
            ("2024-01-01", "New Year's Day"),
            ("2024-01-13", "Constitutional Day of Mongolia"),
            ("2024-02-10", "Tsagaan Sar"),
            ("2024-02-11", "Tsagaan Sar"),
            ("2024-02-12", "Tsagaan Sar"),
            ("2024-03-01", "Patriots' Day"),
            ("2024-03-08", "International Women's Day"),
            ("2024-03-18", "Military Day"),
            ("2024-04-07", "Health Protection Day"),
            ("2024-04-26", "Intellectual Property Day"),
            ("2024-05-15", "Family Day"),
            ("2024-05-23", "The Buddha's Birthday"),
            ("2024-06-01", "Children's Day"),
            (
                "2024-07-10",
                "National Festival and People's Revolution Anniversary; National Flag Day",
            ),
            ("2024-07-11", "National Festival and People's Revolution Anniversary"),
            ("2024-07-12", "National Festival and People's Revolution Anniversary"),
            ("2024-07-13", "National Festival and People's Revolution Anniversary"),
            ("2024-07-14", "National Festival and People's Revolution Anniversary"),
            ("2024-07-15", "National Festival and People's Revolution Anniversary"),
            ("2024-08-25", "Youth Day"),
            ("2024-09-05", "New Harvest Days"),
            ("2024-09-10", "Memorial Day of Political Defendants"),
            ("2024-10-01", "Elders' Day"),
            ("2024-10-29", "Capital Day"),
            ("2024-11-02", "Genghis Khan's Birthday"),
            ("2024-11-26", "Republic Day"),
            ("2024-12-10", "Democracy and Human Rights Day"),
            ("2024-12-29", "National Freedom and Independence Day"),
        )
```
It needs assertion for New Harvest Days for all 46 days in `test_l10n_en_us` and `test_l10n_default` .

KJhellico: That's one of the reasons why I'm freaked out by such holidays. :) But what can we do? Look at Sweden...
ankushhKapoor: > That's one of the reasons why I'm freaked out by such holidays. :) But what can we do? Look at Sweden...

I saw Sweden — honestly, I have no words 😅
I’ll update the code🫤

PPsyrius: I think we can use a year prior to that holiday's implementation i.e. 2006 for the l10n test,s and a `test_2024_public` to check all modern 2024 public holidays 
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=2601) **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=2601&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=2601&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=2601&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=2601&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=2601&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=vacanza_python-holidays&pullRequest=2601)


KJhellico: > ```python
> dt = self._add_holiday_4th_mon_of_sep(name)
> ```

For example, in 2020, this week does not intuitively look like 4th 🙄
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=2601) **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=2601&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=2601&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=2601&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=2601&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=2601&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=vacanza_python-holidays&pullRequest=2601)


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=2601) **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=2601&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=2601&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=2601&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=2601&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=2601&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=vacanza_python-holidays&pullRequest=2601)


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=2601) **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=2601&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=2601&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=2601&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=2601&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=2601&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=vacanza_python-holidays&pullRequest=2601)


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=2601) **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=2601&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=2601&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=2601&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=2601&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=2601&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=vacanza_python-holidays&pullRequest=2601)


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=2601) **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=2601&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=2601&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=2601&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=2601&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=2601&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=vacanza_python-holidays&pullRequest=2601)


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=2601) **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=2601&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=2601&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=2601&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=2601&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=2601&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=vacanza_python-holidays&pullRequest=2601)


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=2601) **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=2601&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=2601&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=2601&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=2601&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=2601&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=vacanza_python-holidays&pullRequest=2601)


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=2601) **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=2601&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=2601&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=2601&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=2601&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=2601&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=vacanza_python-holidays&pullRequest=2601)


PPsyrius: > Any update on this? Or would it be better to hold off on adding these holidays for now?

I sent an email to `contact@mecc.gov.mn` back on Monday and got 0 replies still. I think you can just comment out that holiday for now 😔 
ankushhKapoor: > I sent an email to `contact@mecc.gov.mn` back on Monday and got 0 replies still. I think you can just comment out that holiday for now, the "National Literary, Cultural and Book Days" however looks fine 😔

 ```python
         # Established on July 2nd, 2021.
         if self._year >= 2021:
             # National Literary, Cultural and Book Days.
             name = tr("Үндэсний бичиг соёл, номын өдрүүд")
             self._add_holiday_3rd_sat_of_sep(name)
             self._add_holiday_1_day_past_3rd_sat_of_sep(name)
             if self._year >= 2022:
                 self._add_holiday_3rd_sat_of_mar(name)
                 self._add_holiday_1_day_past_3rd_sat_of_mar(name)
 ```
 
 This implementation provided by you is good for "National Literary, Cultural and Book Days" or there are some changes needed ?
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=2601) **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=2601&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=2601&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=2601&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=2601&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=2601&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=vacanza_python-holidays&pullRequest=2601)


KJhellico: The situation with  "National Literary..."  is similar, as it's also based on weeks numbering, which we are not sure about.
ankushhKapoor: > The situation with "National Literary..." is similar, as it's also based on weeks numbering, which we are not sure about.

So, should we hold off on adding this holiday too ?
PPsyrius: > ```python
> """
> NOTE:
> The following observances are currently unimplemented due to unclear week-based scheduling rules:
> 
> 1. National Literary, Cultural and Book Days (Үндэсний бичиг соёл, номын өдрүүд):
>    - Observed on Saturday and Sunday of the 3rd week of May and September.
>    - Officially added on July 2nd, 2021.
> 
> 2. Environmental Protection Days (Байгаль орчныг хамгаалах өдрүүд):
>    - Observed during the 4th week of September.
> 
> These are defined using "week of the month" logic, but it is unclear whether weeks start from
> the 1st of the month or the first full week. We previously contacted contact@mecc.gov.mn for
> clarification but received no response.
> 
> See: 
> https://github.com/vacanza/holidays/issues/2672
> """
> ```
> 
> 
> This comment is appropriate to add at the start of `workday()` section?
> 
> 
> 
> 
> Please let me know if there are any other changes or improvements you'd like me to make.

Let's go with this 👍


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=2601) **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=2601&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=2601&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=2601&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=2601&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=2601&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=vacanza_python-holidays&pullRequest=2601)


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=2601) **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=2601&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=2601&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=2601&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=2601&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=2601&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=vacanza_python-holidays&pullRequest=2601)


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=2601) **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=2601&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=2601&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=2601&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=2601&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=2601&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=vacanza_python-holidays&pullRequest=2601)


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=2601) **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=2601&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=2601&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=2601&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=2601&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=2601&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=vacanza_python-holidays&pullRequest=2601)



Patch:
diff --git a/README.md b/README.md
index 816399bf..1ee89ab7 100644
--- a/README.md
+++ b/README.md
@@ -105,7 +105,7 @@ and detailed information.
 
 ## Available Countries
 
-We currently support 204 country codes. The standard way to refer to a country is by using its [ISO
+We currently support 205 country codes. The standard way to refer to a country is by using its [ISO
 3166-1 alpha-2 code](https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes), the same used
 for domain names, and for a subdivision its [ISO 3166-2
 code](https://en.wikipedia.org/wiki/ISO_3166-2). Some countries have common or foreign names or
@@ -994,6 +994,13 @@ any) in brackets, available languages and additional holiday categories. All cou
 <td></td>
 </tr>
 <tr>
+<td>Mongolia</td>
+<td>MN</td>
+<td></td>
+<td>en_US, <strong>mn</strong></td>
+<td>WORKDAY</td>
+</tr>
+<tr>
 <td>Montenegro</td>
 <td>ME</td>
 <td></td>
diff --git a/holidays/calendars/__init__.py b/holidays/calendars/__init__.py
index 0f23e37a..66e2c4bd 100644
--- a/holidays/calendars/__init__.py
+++ b/holidays/calendars/__init__.py
@@ -22,6 +22,7 @@ from holidays.calendars.hindu import _CustomHinduHolidays, _HinduLunisolar
 from holidays.calendars.islamic import _CustomIslamicHolidays, _IslamicLunar
 from holidays.calendars.julian import JULIAN_CALENDAR
 from holidays.calendars.julian_revised import JULIAN_REVISED_CALENDAR
+from holidays.calendars.mongolian import _CustomMongolianHolidays, _MongolianLunisolar
 from holidays.calendars.persian import _Persian
 from holidays.calendars.sinhala import _SinhalaLunar, _CustomSinhalaHolidays
 from holidays.calendars.thai import _ThaiLunisolar, KHMER_CALENDAR, THAI_CALENDAR
diff --git a/holidays/calendars/mongolian.py b/holidays/calendars/mongolian.py
new file mode 100644
index 00000000..44b2bdc5
--- /dev/null
+++ b/holidays/calendars/mongolian.py
@@ -0,0 +1,342 @@
+#  holidays
+#  --------
+#  A fast, efficient Python library for generating country, province and state
+#  specific sets of holidays on the fly. It aims to make determining whether a
+#  specific date is a holiday as fast and flexible as possible.
+#
+#  Authors: Vacanza Team and individual contributors (see CONTRIBUTORS file)
+#           dr-prodigy <dr.prodigy.github@gmail.com> (c) 2017-2023
+#           ryanss <ryanssdev@icloud.com> (c) 2014-2017
+#  Website: https://github.com/vacanza/holidays
+#  License: MIT (see LICENSE file)
+
+from datetime import date
+from typing import Optional
+
+from holidays.calendars.custom import _CustomCalendar
+from holidays.calendars.gregorian import JAN, FEB, MAR, MAY, JUN, OCT, NOV, DEC
+
+BUDDHA_DAY = "BUDDHA_DAY"
+GENGHIS_KHAN_DAY = "GENGHIS_KHAN_DAY"
+TSAGAAN_SAR = "TSAGAAN_SAR"
+
+
+class _MongolianLunisolar:
+    BUDDHA_DAY_DATES = {
+        2004: (JUN, 3),
+        2005: (MAY, 23),
+        2006: (JUN, 11),
+        2007: (MAY, 31),
+        2008: (MAY, 20),
+        2009: (JUN, 7),
+        2010: (MAY, 27),
+        2011: (MAY, 17),
+        2012: (JUN, 4),
+        2013: (MAY, 25),
+        2014: (JUN, 13),
+        2015: (JUN, 2),
+        2016: (MAY, 21),
+        2017: (JUN, 9),
+        2018: (MAY, 29),
+        2019: (MAY, 18),
+        2020: (JUN, 5),
+        2021: (MAY, 26),
+        2022: (JUN, 14),
+        2023: (JUN, 4),
+        2024: (MAY, 23),
+        2025: (JUN, 11),
+        2026: (MAY, 31),
+        2027: (MAY, 20),
+        2028: (JUN, 7),
+        2029: (MAY, 27),
+        2030: (MAY, 17),
+        2031: (JUN, 5),
+        2032: (MAY, 25),
+        2033: (JUN, 12),
+        2034: (JUN, 2),
+        2035: (MAY, 22),
+        2036: (JUN, 8),
+        2037: (MAY, 29),
+        2038: (MAY, 18),
+        2039: (JUN, 6),
+        2040: (MAY, 26),
+        2041: (JUN, 14),
+        2042: (JUN, 3),
+        2043: (MAY, 23),
+        2044: (JUN, 10),
+        2045: (MAY, 30),
+        2046: (MAY, 20),
+        2047: (JUN, 8),
+        2048: (MAY, 27),
+        2049: (MAY, 17),
+        2050: (JUN, 5),
+        2051: (MAY, 25),
+        2052: (JUN, 12),
+        2053: (JUN, 1),
+        2054: (MAY, 21),
+        2055: (JUN, 9),
+        2056: (MAY, 29),
+        2057: (MAY, 18),
+        2058: (JUN, 6),
+        2059: (MAY, 27),
+        2060: (JUN, 14),
+        2061: (JUN, 3),
+        2062: (MAY, 23),
+        2063: (JUN, 11),
+        2064: (MAY, 30),
+        2065: (MAY, 20),
+        2066: (JUN, 8),
+        2067: (MAY, 28),
+        2068: (JUN, 15),
+        2069: (JUN, 4),
+        2070: (MAY, 24),
+        2071: (JUN, 12),
+        2072: (MAY, 31),
+        2073: (MAY, 21),
+        2074: (JUN, 9),
+        2075: (MAY, 30),
+        2076: (MAY, 18),
+        2077: (JUN, 6),
+        2078: (MAY, 26),
+        2079: (JUN, 14),
+        2080: (JUN, 2),
+        2081: (MAY, 22),
+        2082: (JUN, 10),
+        2083: (MAY, 31),
+        2084: (MAY, 20),
+        2085: (JUN, 8),
+        2086: (MAY, 28),
+        2087: (JUN, 16),
+        2088: (JUN, 4),
+        2089: (MAY, 24),
+        2090: (JUN, 12),
+        2091: (JUN, 1),
+        2092: (MAY, 21),
+        2093: (JUN, 9),
+        2094: (MAY, 30),
+        2095: (MAY, 19),
+        2096: (JUN, 6),
+        2097: (MAY, 26),
+        2098: (JUN, 13),
+        2099: (JUN, 3),
+        2100: (MAY, 23),
+    }
+
+    GENGHIS_KHAN_DAY_DATES = {
+        2004: (NOV, 13),
+        2005: (NOV, 2),
+        2006: (NOV, 21),
+        2007: (NOV, 10),
+        2008: (NOV, 28),
+        2009: (NOV, 17),
+        2010: (NOV, 7),
+        2011: (NOV, 26),
+        2012: (NOV, 14),
+        2013: (NOV, 4),
+        2014: (NOV, 23),
+        2015: (NOV, 12),
+        2016: (OCT, 31),
+        2017: (NOV, 19),
+        2018: (NOV, 8),
+        2019: (NOV, 27),
+        2020: (NOV, 16),
+        2021: (NOV, 5),
+        2022: (NOV, 24),
+        2023: (NOV, 14),
+        2024: (NOV, 2),
+        2025: (NOV, 21),
+        2026: (NOV, 10),
+        2027: (NOV, 29),
+        2028: (NOV, 17),
+        2029: (NOV, 7),
+        2030: (NOV, 26),
+        2031: (NOV, 15),
+        2032: (NOV, 4),
+        2033: (NOV, 22),
+        2034: (NOV, 11),
+        2035: (NOV, 30),
+        2036: (NOV, 18),
+        2037: (NOV, 8),
+        2038: (NOV, 27),
+        2039: (NOV, 17),
+        2040: (NOV, 5),
+        2041: (NOV, 24),
+        2042: (NOV, 13),
+        2043: (NOV, 2),
+        2044: (NOV, 20),
+        2045: (NOV, 9),
+        2046: (NOV, 28),
+        2047: (NOV, 18),
+        2048: (NOV, 7),
+        2049: (NOV, 26),
+        2050: (NOV, 15),
+        2051: (NOV, 4),
+        2052: (NOV, 22),
+        2053: (NOV, 11),
+        2054: (NOV, 30),
+        2055: (NOV, 19),
+        2056: (NOV, 8),
+        2057: (NOV, 27),
+        2058: (NOV, 17),
+        2059: (NOV, 6),
+        2060: (NOV, 24),
+        2061: (NOV, 13),
+        2062: (NOV, 2),
+        2063: (NOV, 21),
+        2064: (NOV, 9),
+        2065: (NOV, 28),
+        2066: (NOV, 18),
+        2067: (NOV, 7),
+        2068: (NOV, 25),
+        2069: (NOV, 14),
+        2070: (NOV, 3),
+        2071: (NOV, 22),
+        2072: (NOV, 11),
+        2073: (NOV, 30),
+        2074: (NOV, 19),
+        2075: (NOV, 9),
+        2076: (NOV, 27),
+        2077: (NOV, 16),
+        2078: (NOV, 5),
+        2079: (NOV, 24),
+        2080: (NOV, 12),
+        2081: (NOV, 1),
+        2082: (NOV, 21),
+        2083: (NOV, 10),
+        2084: (NOV, 28),
+        2085: (NOV, 18),
+        2086: (NOV, 7),
+        2087: (NOV, 26),
+        2088: (NOV, 14),
+        2089: (NOV, 3),
+        2090: (NOV, 22),
+        2091: (NOV, 12),
+        2092: (NOV, 30),
+        2093: (NOV, 19),
+        2094: (NOV, 9),
+        2095: (NOV, 27),
+        2096: (NOV, 15),
+        2097: (NOV, 5),
+        2098: (NOV, 23),
+        2099: (NOV, 13),
+        2100: (DEC, 2),
+    }
+
+    TSAGAAN_SAR_DATES = {
+        2004: (FEB, 21),
+        2005: (FEB, 9),
+        2006: (JAN, 30),
+        2007: (FEB, 18),
+        2008: (FEB, 8),
+        2009: (FEB, 25),
+        2010: (FEB, 14),
+        2011: (FEB, 3),
+        2012: (FEB, 22),
+        2013: (FEB, 11),
+        2014: (JAN, 31),
+        2015: (FEB, 19),
+        2016: (FEB, 9),
+        2017: (FEB, 27),
+        2018: (FEB, 16),
+        2019: (FEB, 5),
+        2020: (FEB, 24),
+        2021: (FEB, 12),
+        2022: (FEB, 2),
+        2023: (FEB, 21),
+        2024: (FEB, 10),
+        2025: (MAR, 1),
+        2026: (FEB, 18),
+        2027: (FEB, 7),
+        2028: (FEB, 26),
+        2029: (FEB, 14),
+        2030: (FEB, 3),
+        2031: (FEB, 22),
+        2032: (FEB, 12),
+        2033: (JAN, 31),
+        2034: (FEB, 19),
+        2035: (FEB, 9),
+        2036: (FEB, 28),
+        2037: (FEB, 16),
+        2038: (FEB, 5),
+        2039: (FEB, 24),
+        2040: (FEB, 13),
+        2041: (FEB, 2),
+        2042: (FEB, 21),
+        2043: (FEB, 10),
+        2044: (FEB, 29),
+        2045: (FEB, 17),
+        2046: (FEB, 6),
+        2047: (FEB, 25),
+        2048: (FEB, 14),
+        2049: (FEB, 3),
+        2050: (FEB, 22),
+        2051: (FEB, 12),
+        2052: (FEB, 1),
+        2053: (FEB, 19),
+        2054: (FEB, 8),
+        2055: (FEB, 27),
+        2056: (FEB, 16),
+        2057: (FEB, 4),
+        2058: (FEB, 23),
+        2059: (FEB, 13),
+        2060: (FEB, 3),
+        2061: (FEB, 21),
+        2062: (FEB, 10),
+        2063: (MAR, 1),
+        2064: (FEB, 18),
+        2065: (FEB, 6),
+        2066: (FEB, 25),
+        2067: (FEB, 14),
+        2068: (FEB, 4),
+        2069: (FEB, 22),
+        2070: (FEB, 12),
+        2071: (FEB, 1),
+        2072: (FEB, 19),
+        2073: (FEB, 7),
+        2074: (FEB, 26),
+        2075: (FEB, 16),
+        2076: (FEB, 5),
+        2077: (FEB, 23),
+        2078: (FEB, 13),
+        2079: (FEB, 2),
+        2080: (FEB, 21),
+        2081: (FEB, 9),
+        2082: (FEB, 28),
+        2083: (FEB, 17),
+        2084: (FEB, 7),
+        2085: (FEB, 25),
+        2086: (FEB, 14),
+        2087: (FEB, 4),
+        2088: (FEB, 23),
+        2089: (FEB, 11),
+        2090: (MAR, 2),
+        2091: (FEB, 19),
+        2092: (FEB, 8),
+        2093: (FEB, 26),
+        2094: (FEB, 16),
+        2095: (FEB, 5),
+        2096: (FEB, 24),
+        2097: (FEB, 13),
+        2098: (FEB, 2),
+        2099: (FEB, 21),
+        2100: (FEB, 10),
+    }
+
+    def _get_holiday(self, holiday: str, year: int) -> tuple[Optional[date], bool]:
+        estimated_dates = getattr(self, f"{holiday}_DATES", {})
+        exact_dates = getattr(self, f"{holiday}_DATES_{_CustomCalendar.CUSTOM_ATTR_POSTFIX}", {})
+        dt = exact_dates.get(year, estimated_dates.get(year, ()))
+        return date(year, *dt) if dt else None, year not in exact_dates
+
+    def buddha_day_date(self, year: int) -> tuple[Optional[date], bool]:
+        return self._get_holiday(BUDDHA_DAY, year)
+
+    def genghis_khan_day_date(self, year: int) -> tuple[Optional[date], bool]:
+        return self._get_holiday(GENGHIS_KHAN_DAY, year)
+
+    def tsagaan_sar_date(self, year: int) -> tuple[Optional[date], bool]:
+        return self._get_holiday(TSAGAAN_SAR, year)
+
+
+class _CustomMongolianHolidays(_CustomCalendar, _MongolianLunisolar):
+    pass
diff --git a/holidays/countries/__init__.py b/holidays/countries/__init__.py
index ff59c21c..81df7e8e 100644
--- a/holidays/countries/__init__.py
+++ b/holidays/countries/__init__.py
@@ -138,6 +138,7 @@ from holidays.countries.mexico import Mexico, MX, MEX
 from holidays.countries.micronesia import Micronesia, FM, FSM
 from holidays.countries.moldova import Moldova, MD, MDA
 from holidays.countries.monaco import Monaco, MC, MCO
+from holidays.countries.mongolia import Mongolia, MN, MNG
 from holidays.countries.montenegro import Montenegro, ME, MNE
 from holidays.countries.morocco import Morocco, MA, MOR
 from holidays.countries.mozambique import Mozambique, MZ, MOZ
diff --git a/holidays/countries/mongolia.py b/holidays/countries/mongolia.py
new file mode 100644
index 00000000..f1115b09
--- /dev/null
+++ b/holidays/countries/mongolia.py
@@ -0,0 +1,202 @@
+#  holidays
+#  --------
+#  A fast, efficient Python library for generating country, province and state
+#  specific sets of holidays on the fly. It aims to make determining whether a
+#  specific date is a holiday as fast and flexible as possible.
+#
+#  Authors: Vacanza Team and individual contributors (see CONTRIBUTORS file)
+#           dr-prodigy <dr.prodigy.github@gmail.com> (c) 2017-2023
+#           ryanss <ryanssdev@icloud.com> (c) 2014-2017
+#  Website: https://github.com/vacanza/holidays
+#  License: MIT (see LICENSE file)
+
+from gettext import gettext as tr
+
+from holidays.calendars.gregorian import _timedelta
+from holidays.constants import PUBLIC, WORKDAY
+from holidays.groups import InternationalHolidays, MongolianCalendarHolidays
+from holidays.holiday_base import HolidayBase
+
+
+class Mongolia(HolidayBase, InternationalHolidays, MongolianCalendarHolidays):
+    """Mongolia holidays.
+
+    References:
+        * [Law on Public holidays and days of observation](https://web.archive.org/web/20250327062440/https://legalinfo.mn/mn/detail/399)
+        * [Labor Law](https://web.archive.org/web/20250421093230/https://legalinfo.mn/mn/detail?lawId=16230709635751)
+        * <https://en.wikipedia.org/wiki/Public_holidays_in_Mongolia>
+        * [Mongolian lunar calendar](https://web.archive.org/web/20230412171012/https://www.math.mcgill.ca/gantumur/cal/index_mn.html)
+        * <https://web.archive.org/web/20250613054645/https://www.timeanddate.com/holidays/mongolia/>
+        * <https://web.archive.org/web/20250429110535/https://investmongolia.gov.mn/mongolia-at-a-glance/>
+    """
+
+    country = "MN"
+    default_language = "mn"
+    start_year = 2004
+    supported_categories = (PUBLIC, WORKDAY)
+    supported_languages = ("en_US", "mn")
+
+    def __init__(self, *args, **kwargs):
+        InternationalHolidays.__init__(self)
+        MongolianCalendarHolidays.__init__(self)
+        super().__init__(*args, **kwargs)
+
+    def _populate_public_holidays(self):
+        # New Year's Day.
+        self._add_new_years_day(tr("Шинэ жил"))
+
+        # Lunar New Year.
+        name = tr("Цагаан сар")
+        self._add_tsagaan_sar(name)
+        self._add_tsagaan_sar_day_2(name)
+        # Expanded on November 28th, 2013.
+        if self._year >= 2014:
+            self._add_tsagaan_sar_day_3(name)
+
+        # International Women's Day.
+        self._add_womens_day(tr("Олон улсын эмэгтэйчүүдийн өдөр"))
+
+        # Children's Day.
+        self._add_childrens_day(tr("Хүүхдийн баяр"))
+
+        # Established on December 20th, 2019.
+        if self._year >= 2020:
+            # The Buddha's Birthday.
+            self._add_buddha_day(tr("Бурхан багшийн Их дүйчин өдөр"))
+
+        # National Festival and People's Revolution Anniversary.
+        name = tr("Үндэсний их баяр наадам, Ардын хувьсгалын ойн баяр")
+        # Expanded to July 10 on July 7th, 2023.
+        if self._year >= 2023:
+            self._add_holiday_jul_10(name)
+        self._add_holiday_jul_11(name)
+        self._add_holiday_jul_12(name)
+        self._add_holiday_jul_13(name)
+        # Expanded to July 14-15 on July 1st, 2014.
+        if self._year >= 2014:
+            self._add_holiday_jul_14(name)
+            self._add_holiday_jul_15(name)
+
+        # Established on November 8th, 2012.
+        if self._year >= 2012:
+            # Genghis Khan's Birthday.
+            self._add_genghis_khan_day(tr("Их Эзэн Чингис хааны өдөр"))
+
+        # Repealed on November 8th, 2012.
+        # Re-established again on November 18th, 2016.
+        if self._year <= 2011 or self._year >= 2016:
+            self._add_holiday_nov_26(
+                # Republic Day.
+                tr("Бүгд Найрамдах Улс тунхагласан өдөр")
+                if self._year >= 2016
+                # Republic Holiday.
+                else tr("Бүгд Найрамдах Улс тунхагласны баяр")
+            )
+
+        # Established on August 16th, 2007.
+        # Renamed and considered a Public Holiday on December 23rd, 2011.
+        if self._year >= 2011:
+            self._add_holiday_dec_29(
+                # National Freedom and Independence Day.
+                tr("Үндэсний эрх чөлөө, тусгаар тогтнолоо сэргээсний баярын өдөр")
+            )
+
+    def _populate_workday_holidays(self):
+        """
+        NOTE:
+        The following observances are currently unimplemented
+        due to unclear week-based scheduling rules:
+
+        1. National Literary, Cultural and Book Days (Үндэсний бичиг соёл, номын өдрүүд):
+        - Observed on Saturday and Sunday of the 3rd week of May and September.
+        - Officially added on July 2nd, 2021.
+
+        2. Environmental Protection Days (Байгаль орчныг хамгаалах өдрүүд):
+        - Observed during the 4th week of September.
+
+        These are defined using "week of the month" logic, but it is unclear whether weeks start
+        from the 1st of the month or the first full week. We previously contacted
+        contact@mecc.gov.mn for clarification but received no response.
+
+        See:
+        https://github.com/vacanza/holidays/issues/2672
+        """
+
+        # Constitution Day.
+        self._add_holiday_jan_13(tr("Монгол Улсын Үндсэн хуулийн өдөр"))
+
+        # Established on December 9th, 2004.
+        if self._year >= 2005:
+            # Patriots' Day.
+            self._add_holiday_mar_1(tr("Эх орончдын өдөр"))
+
+        # Renamed on February 9th, 2011.
+        self._add_holiday_mar_18(
+            # Military Day.
+            tr("Монгол цэргийн өдөр")
+            if self._year >= 2011
+            # Armed Forces Day.
+            else tr("Зэвсэгт хүчний өдөр")
+        )
+
+        # Health Protection Day.
+        self._add_holiday_apr_7(tr("Эрүүл мэндийг хамгаалах өдөр"))
+
+        # Intellectual Property Protection Day.
+        self._add_holiday_apr_26(tr("Оюуны өмчийг хамгаалах өдөр"))
+
+        # Family Day.
+        self._add_holiday_may_15(tr("Гэр бүлийн өдөр"))
+
+        # Established on June 11th, 2009.
+        if self._year >= 2009:
+            # National Flag Day.
+            self._add_holiday_jul_10(tr("Монгол Улсын төрийн далбааны өдөр"))
+
+        # Youth Day.
+        self._add_holiday_aug_25(tr("Залуучуудын өдөр"))
+
+        if self._year >= 2007:
+            # New Harvest Days.
+            name = tr("Шинэ ургацын өдрүүд")
+            dt = self._add_holiday_sep_5(name)
+            for delta in range(1, 46):
+                self._add_holiday(name, _timedelta(dt, delta))
+
+        # Memorial Day of Political Victims.
+        self._add_holiday_sep_10(tr("Улс төрийн хэлмэгдэгсдийн дурсгалын өдөр"))
+
+        # Elders' Day.
+        self._add_holiday_oct_1(tr("Ахмадын өдөр"))
+
+        # Renamed on July 7th, 2021.
+        self._add_holiday_oct_29(
+            # Capital City Day.
+            tr("Монгол Улсын нийслэл хотын өдөр")
+            if self._year >= 2021
+            # Capital Day.
+            else tr("Монгол Улсын Нийслэлийн өдөр")
+        )
+
+        # Established on November 8th, 2012 after the old one was repealed.
+        # Made a Public Holiday again on November 8th, 2016.
+        if 2012 <= self._year <= 2015:
+            # Republic Day.
+            self._add_holiday_nov_26(tr("Бүгд Найрамдах Улс тунхагласан өдөр"))
+
+        # Democracy and Human Rights Day.
+        self._add_holiday_dec_10(tr("Ардчилал, хүний эрхийн өдөр"))
+
+        # Established on August 16th, 2007.
+        # Renamed and considered a Public Holiday on December 23rd, 2011.
+        if 2007 <= self._year <= 2010:
+            # National Freedom Day.
+            self._add_holiday_dec_29(tr("Үндэсний эрх чөлөөний өдөр"))
+
+
+class MN(Mongolia):
+    pass
+
+
+class MNG(Mongolia):
+    pass
diff --git a/holidays/groups/__init__.py b/holidays/groups/__init__.py
index 214fde4a..3ebb83b2 100644
--- a/holidays/groups/__init__.py
+++ b/holidays/groups/__init__.py
@@ -22,6 +22,7 @@ from holidays.groups.hebrew import HebrewCalendarHolidays
 from holidays.groups.hindu import HinduCalendarHolidays
 from holidays.groups.international import InternationalHolidays
 from holidays.groups.islamic import IslamicHolidays
+from holidays.groups.mongolian import MongolianCalendarHolidays
 from holidays.groups.persian import PersianCalendarHolidays
 from holidays.groups.sinhala import SinhalaCalendarHolidays
 from holidays.groups.thai import ThaiCalendarHolidays
diff --git a/holidays/groups/eastern.py b/holidays/groups/eastern.py
index 165fb9f4..a177a865 100644
--- a/holidays/groups/eastern.py
+++ b/holidays/groups/eastern.py
@@ -29,7 +29,7 @@ class EasternCalendarHolidays:
         days_delta: int = 0,
     ) -> Optional[date]:
         """
-        Add Eastern (Buddhist, Chinese, Hindu, Islamic) calendar holiday.
+        Add Eastern (Buddhist, Chinese, Hindu, Islamic, Mongolian) calendar holiday.
 
         Adds customizable estimation label to holiday name if holiday date is an estimation.
         """
diff --git a/holidays/groups/mongolian.py b/holidays/groups/mongolian.py
new file mode 100644
index 00000000..1a536fea
--- /dev/null
+++ b/holidays/groups/mongolian.py
@@ -0,0 +1,103 @@
+#  holidays
+#  --------
+#  A fast, efficient Python library for generating country, province and state
+#  specific sets of holidays on the fly. It aims to make determining whether a
+#  specific date is a holiday as fast and flexible as possible.
+#
+#  Authors: Vacanza Team and individual contributors (see CONTRIBUTORS file)
+#           dr-prodigy <dr.prodigy.github@gmail.com> (c) 2017-2023
+#           ryanss <ryanssdev@icloud.com> (c) 2014-2017
+#  Website: https://github.com/vacanza/holidays
+#  License: MIT (see LICENSE file)
+
+from datetime import date
+from typing import Optional
+
+from holidays.calendars import _MongolianLunisolar
+from holidays.groups.eastern import EasternCalendarHolidays
+
+
+class MongolianCalendarHolidays(EasternCalendarHolidays):
+    """
+    Mongolian lunisolar calendar holidays.
+    """
+
+    def __init__(self, cls=None, show_estimated=False) -> None:
+        self._mongolian_calendar = cls() if cls else _MongolianLunisolar()
+        self._mongolian_calendar_show_estimated = show_estimated
+
+    def _add_mongolian_calendar_holiday(
+        self, name: str, dt_estimated: tuple[Optional[date], bool], days_delta: int = 0
+    ) -> Optional[date]:
+        """
+        Add Mongolian calendar holiday.
+
+        Adds customizable estimation label to holiday name if holiday date
+        is an estimation.
+        """
+
+        return self._add_eastern_calendar_holiday(
+            name, dt_estimated, self._mongolian_calendar_show_estimated, days_delta
+        )
+
+    def _add_buddha_day(self, name) -> Optional[date]:
+        """
+        Add Buddha Day.
+
+        Buddha Day is celebrated on the 15th day of the early summer month
+        in the Mongolian lunisolar calendar.
+        This holiday honors the birth, enlightenment, and death of Buddha.
+        https://en.wikipedia.org/wiki/Vesak (general Buddhist context)
+        """
+        return self._add_mongolian_calendar_holiday(
+            name, self._mongolian_calendar.buddha_day_date(self._year)
+        )
+
+    def _add_genghis_khan_day(self, name) -> Optional[date]:
+        """
+        Add Genghis Khan's Birthday.
+
+        Genghis Khan's Birthday is observed on the 1st day of the early winter month
+        according to the Mongolian lunisolar calendar.
+        It commemorates the birth of the founder of the Mongol Empire.
+        https://en.wikipedia.org/wiki/Genghis_Khan
+        """
+        return self._add_mongolian_calendar_holiday(
+            name, self._mongolian_calendar.genghis_khan_day_date(self._year)
+        )
+
+    def _add_tsagaan_sar(self, name) -> Optional[date]:
+        """
+        Add Tsagaan Sar (Mongolian Lunar New Year).
+
+        Tsagaan Sar, or White Moon Festival, marks the beginning of the Mongolian Lunar New Year.
+        It usually falls on the first day of the first month of the Mongolian lunisolar calendar.
+        https://en.wikipedia.org/wiki/Tsagaan_Sar
+        """
+        return self._add_mongolian_calendar_holiday(
+            name, self._mongolian_calendar.tsagaan_sar_date(self._year)
+        )
+
+    def _add_tsagaan_sar_day_2(self, name) -> Optional[date]:
+        """
+        Add Tsagaan Sar Day 2 (Mongolian Lunar New Year).
+
+        Tsagaan Sar, or White Moon Festival, marks the beginning of the Mongolian Lunar New Year.
+        It usually falls on the first day of the first month of the Mongolian lunisolar calendar.
+        https://en.wikipedia.org/wiki/Tsagaan_Sar
+        """
+        return self._add_mongolian_calendar_holiday(
+            name, self._mongolian_calendar.tsagaan_sar_date(self._year), days_delta=+1
+        )
+
+    def _add_tsagaan_sar_day_3(self, name) -> Optional[date]:
+        """
+        Add Tsagaan Sar Day 3 (Mongolian Lunar New Year).
+
+        Tsagaan Sar, or White Moon Festival, marks the beginning of the Mongolian Lunar New Year.
+        It usually falls on the first day of the first month of the Mongolian lunisolar calendar.
+        https://en.wikipedia.org/wiki/Tsagaan_Sar
+        """
+        return self._add_mongolian_calendar_holiday(
+            name, self._mongolian_calendar.tsagaan_sar_date(self._year), days_delta=+2
+        )
diff --git a/holidays/locale/en_US/LC_MESSAGES/MN.po b/holidays/locale/en_US/LC_MESSAGES/MN.po
new file mode 100644
index 00000000..f85d10fa
--- /dev/null
+++ b/holidays/locale/en_US/LC_MESSAGES/MN.po
@@ -0,0 +1,131 @@
+#  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)
+#
+# Mongolia holidays en_US localization.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Holidays 0.76\n"
+"POT-Creation-Date: 2025-06-04 01:55+0530\n"
+"PO-Revision-Date: 2025-06-04 01:55+0530\n"
+"Last-Translator: Ankush Kapoor <work.ankushkapoor1626@gmail.com>\n"
+"Language-Team: Holidays Localization Team\n"
+"Language: en_US\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Lingva 5.0.6\n"
+"X-Source-Language: mn\n"
+
+#. New Year's Day.
+msgid "Шинэ жил"
+msgstr "New Year's Day"
+
+#. Lunar New Year.
+msgid "Цагаан сар"
+msgstr "Lunar New Year"
+
+#. International Women's Day.
+msgid "Олон улсын эмэгтэйчүүдийн өдөр"
+msgstr "International Women's Day"
+
+#. Children's Day.
+msgid "Хүүхдийн баяр"
+msgstr "Children's Day"
+
+#. The Buddha's Birthday.
+msgid "Бурхан багшийн Их дүйчин өдөр"
+msgstr "The Buddha's Birthday"
+
+#. National Festival and People's Revolution Anniversary.
+msgid "Үндэсний их баяр наадам, Ардын хувьсгалын ойн баяр"
+msgstr "National Festival and People's Revolution Anniversary"
+
+#. Genghis Khan's Birthday.
+msgid "Их Эзэн Чингис хааны өдөр"
+msgstr "Genghis Khan's Birthday"
+
+#. Republic Day.
+msgid "Бүгд Найрамдах Улс тунхагласан өдөр"
+msgstr "Republic Day"
+
+#. Republic Holiday.
+msgid "Бүгд Найрамдах Улс тунхагласны баяр"
+msgstr "Republic Holiday"
+
+#. National Freedom and Independence Day.
+msgid "Үндэсний эрх чөлөө, тусгаар тогтнолоо сэргээсний баярын өдөр"
+msgstr "National Freedom and Independence Day"
+
+#. Constitution Day.
+msgid "Монгол Улсын Үндсэн хуулийн өдөр"
+msgstr "Constitution Day"
+
+#. Patriots' Day.
+msgid "Эх орончдын өдөр"
+msgstr "Patriots' Day"
+
+#. Military Day.
+msgid "Монгол цэргийн өдөр"
+msgstr "Military Day"
+
+#. Armed Forces Day.
+msgid "Зэвсэгт хүчний өдөр"
+msgstr "Armed Forces Day"
+
+#. Health Protection Day.
+msgid "Эрүүл мэндийг хамгаалах өдөр"
+msgstr "Health Protection Day"
+
+#. Intellectual Property Protection Day.
+msgid "Оюуны өмчийг хамгаалах өдөр"
+msgstr "Intellectual Property Protection Day"
+
+#. Family Day.
+msgid "Гэр бүлийн өдөр"
+msgstr "Family Day"
+
+#. National Flag Day.
+msgid "Монгол Улсын төрийн далбааны өдөр"
+msgstr "National Flag Day"
+
+#. Youth Day.
+msgid "Залуучуудын өдөр"
+msgstr "Youth Day"
+
+#. New Harvest Days.
+msgid "Шинэ ургацын өдрүүд"
+msgstr "New Harvest Days"
+
+#. Memorial Day of Political Victims.
+msgid "Улс төрийн хэлмэгдэгсдийн дурсгалын өдөр"
+msgstr "Memorial Day of Political Victims"
+
+#. Elders' Day.
+msgid "Ахмадын өдөр"
+msgstr "Elders' Day"
+
+#. Capital City Day.
+msgid "Монгол Улсын нийслэл хотын өдөр"
+msgstr "Capital City Day"
+
+#. Capital Day.
+msgid "Монгол Улсын Нийслэлийн өдөр"
+msgstr "Capital Day"
+
+#. Democracy and Human Rights Day.
+msgid "Ардчилал, хүний эрхийн өдөр"
+msgstr "Democracy and Human Rights Day"
+
+#. National Freedom Day.
+msgid "Үндэсний эрх чөлөөний өдөр"
+msgstr "National Freedom Day"
diff --git a/holidays/locale/mn/LC_MESSAGES/MN.po b/holidays/locale/mn/LC_MESSAGES/MN.po
new file mode 100644
index 00000000..f00e5131
--- /dev/null
+++ b/holidays/locale/mn/LC_MESSAGES/MN.po
@@ -0,0 +1,132 @@
+#  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)
+#
+# Mongolia holidays.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Holidays 0.76\n"
+"POT-Creation-Date: 2025-06-04 01:56+0530\n"
+"PO-Revision-Date: 2025-06-04 21:39+0530\n"
+"Last-Translator: Ankush Kapoor <work.ankushkapoor1626@gmail.com>\n"
+"Language-Team: Holidays Localization Team\n"
+"Language: mn\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Lingva 5.0.6\n"
+"X-Generator: Poedit 3.4.2\n"
+"X-Source-Language: mn\n"
+
+#. New Year's Day.
+msgid "Шинэ жил"
+msgstr ""
+
+#. Lunar New Year.
+msgid "Цагаан сар"
+msgstr ""
+
+#. International Women's Day.
+msgid "Олон улсын эмэгтэйчүүдийн өдөр"
+msgstr ""
+
+#. Children's Day.
+msgid "Хүүхдийн баяр"
+msgstr ""
+
+#. The Buddha's Birthday.
+msgid "Бурхан багшийн Их дүйчин өдөр"
+msgstr ""
+
+#. National Festival and People's Revolution Anniversary.
+msgid "Үндэсний их баяр наадам, Ардын хувьсгалын ойн баяр"
+msgstr ""
+
+#. Genghis Khan's Birthday.
+msgid "Их Эзэн Чингис хааны өдөр"
+msgstr ""
+
+#. Republic Day.
+msgid "Бүгд Найрамдах Улс тунхагласан өдөр"
+msgstr ""
+
+#. Republic Holiday.
+msgid "Бүгд Найрамдах Улс тунхагласны баяр"
+msgstr ""
+
+#. National Freedom and Independence Day.
+msgid "Үндэсний эрх чөлөө, тусгаар тогтнолоо сэргээсний баярын өдөр"
+msgstr ""
+
+#. Constitution Day.
+msgid "Монгол Улсын Үндсэн хуулийн өдөр"
+msgstr ""
+
+#. Patriots' Day.
+msgid "Эх орончдын өдөр"
+msgstr ""
+
+#. Military Day.
+msgid "Монгол цэргийн өдөр"
+msgstr ""
+
+#. Armed Forces Day.
+msgid "Зэвсэгт хүчний өдөр"
+msgstr ""
+
+#. Health Protection Day.
+msgid "Эрүүл мэндийг хамгаалах өдөр"
+msgstr ""
+
+#. Intellectual Property Protection Day.
+msgid "Оюуны өмчийг хамгаалах өдөр"
+msgstr ""
+
+#. Family Day.
+msgid "Гэр бүлийн өдөр"
+msgstr ""
+
+#. National Flag Day.
+msgid "Монгол Улсын төрийн далбааны өдөр"
+msgstr ""
+
+#. Youth Day.
+msgid "Залуучуудын өдөр"
+msgstr ""
+
+#. New Harvest Days.
+msgid "Шинэ ургацын өдрүүд"
+msgstr ""
+
+#. Memorial Day of Political Victims.
+msgid "Улс төрийн хэлмэгдэгсдийн дурсгалын өдөр"
+msgstr ""
+
+#. Elders' Day.
+msgid "Ахмадын өдөр"
+msgstr ""
+
+#. Capital City Day.
+msgid "Монгол Улсын нийслэл хотын өдөр"
+msgstr ""
+
+#. Capital Day.
+msgid "Монгол Улсын Нийслэлийн өдөр"
+msgstr ""
+
+#. Democracy and Human Rights Day.
+msgid "Ардчилал, хүний эрхийн өдөр"
+msgstr ""
+
+#. National Freedom Day.
+msgid "Үндэсний эрх чөлөөний өдөр"
+msgstr ""
diff --git a/holidays/registry.py b/holidays/registry.py
index 1a6241b8..967e503d 100644
--- a/holidays/registry.py
+++ b/holidays/registry.py
@@ -141,6 +141,7 @@ COUNTRIES: RegistryDict = {
     "micronesia": ("Micronesia", "FM", "FSM"),
     "moldova": ("Moldova", "MD", "MDA"),
     "monaco": ("Monaco", "MC", "MCO"),
+    "mongolia": ("Mongolia", "MN", "MNG"),
     "montenegro": ("Montenegro", "ME", "MNE"),
     "morocco": ("Morocco", "MA", "MOR"),
     "mozambique": ("Mozambique", "MZ", "MOZ"),
diff --git a/scripts/calendar/mongolian_generator.py b/scripts/calendar/mongolian_generator.py
new file mode 100644
index 00000000..98192531
--- /dev/null
+++ b/scripts/calendar/mongolian_generator.py
@@ -0,0 +1,183 @@
+#!/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)
+
+from datetime import date
+from pathlib import Path
+
+"""
+This file generates Gregorian dates for Mongolian lunisolar calendar based holidays.
+
+See the Wikipedia article: https://en.wikipedia.org/wiki/Mongolian_calendar
+
+Sources:
+- https://www.math.mcgill.ca/gantumur/cal/year.html
+"""
+
+m_zero = 3
+epoch = 1747
+ixx = 46
+betastar = 10
+beta = 172
+
+m0 = 2359237 + 2603 / 2828
+m1 = 167025 / 5656
+m2 = 11135 / 11312
+s0 = 397 / 402
+s1 = 65 / 804
+s2 = 13 / 4824
+a0 = 1523 / 1764
+a1 = 253 / 3528
+a2 = 1 / 28
+
+
+def mstar(y, m):
+    return 12 * (y - epoch) + m - m_zero
+
+
+def leap_month(y, m):
+    t = (24 * (y - epoch) + 2 * m - beta) % 65
+    return t <= 1
+
+
+def leap_year(y):
+    t = (24 * (y - epoch) - beta) % 65
+    return t >= 41
+
+
+def true_month(y, m, is_leap):
+    p = 67 * mstar(y, m) + betastar
+    pp, ix = divmod(p, 65)
+    return pp if is_leap or ix < ixx else pp + 1
+
+
+def moon_tab(i):
+    i %= 28
+    s = 1
+    if i >= 14:
+        i -= 14
+        s = -1
+    if i > 7:
+        i = 14 - i
+    a = int(i)
+    b = a + 1
+    v = (0, 5, 10, 15, 19, 22, 24, 25)
+    return s * (v[a] if a == i else (b - i) * v[a] + (i - a) * v[b])
+
+
+def sun_tab(i):
+    i %= 12
+    s = 1
+    if i >= 6:
+        i -= 6
+        s = -1
+    if i > 3:
+        i = 6 - i
+    a = int(i)
+    b = a + 1
+    v = (0, 6, 10, 11)
+    return s * (v[a] if a == i else (b - i) * v[a] + (i - a) * v[b])
+
+
+def true_date(d, n):
+    mean_date = n * m1 + d * m2 + m0
+    mean_sun = n * s1 + d * s2 + s0
+    anomaly_moon = n * a1 + d * a2 + a0
+    moon_equ = moon_tab(28 * anomaly_moon)
+    anomaly_sun = mean_sun - 0.25
+    sun_equ = sun_tab(12 * anomaly_sun)
+    return mean_date + moon_equ / 60 - sun_equ / 60
+
+
+def julian_day(y, m, is_leap, d):
+    n = true_month(y, m, is_leap)
+    t = true_date(d, n)
+    return int(t)
+
+
+def gregorian_date(jdn):
+    f = jdn + 1401 + (4 * jdn + 274277) // 146097 * 3 // 4 - 38
+    e = 4 * f + 3
+    h = e % 1461 // 4
+    h = 5 * h + 2
+    d = (h % 153) // 5 + 1
+    m = (h // 153 + 2) % 12 + 1
+    y = e // 1461 - 4716 + (14 - m) // 12
+    return date(y, m, d)
+
+
+def mongolian_to_gregorian(m_year, m_month, is_leap, m_day):
+    return gregorian_date(julian_day(m_year, m_month, is_leap, m_day))
+
+
+def get_tsagaan_sar(y):
+    return gregorian_date(julian_day(y - 1, 12, False, 30) + 1)
+
+
+def find_festival_date(y, m_month, m_day):
+    return gregorian_date(julian_day(y, m_month, False, m_day))
+
+
+CLASS_NAME = "_{cal_name}Lunisolar"
+OUT_FILE_NAME = "{cal_name}_dates.py"
+
+CLASS_TEMPLATE = """class {class_name}:
+{holiday_data}"""
+
+HOLIDAY_ARRAY_TEMPLATE = """    {hol_name}_DATES = {{
+{year_dates}
+    }}
+"""
+
+YEAR_TEMPLATE = "        {year}: ({date}),"
+
+CALENDARS = {
+    "MONGOLIAN": "Mongolian",
+}
+
+MONGOLIAN_HOLIDAYS = (
+    ("BUDDHA_DAY", lambda y: find_festival_date(y, 4, 15)),
+    ("GENGHIS_KHAN_DAY", lambda y: find_festival_date(y, 10, 1)),
+    ("TSAGAAN_SAR", get_tsagaan_sar),
+)
+
+
+def generate_data():
+    g_year_min, g_year_max = 2004, 2100
+    holiday_data = []
+
+    for hol_name, hol_func in MONGOLIAN_HOLIDAYS:
+        year_dates = []
+        for year in range(g_year_min, g_year_max + 1):
+            dt = hol_func(year)
+            date_str = f"{dt.strftime('%b').upper()}, {dt.day}"
+            year_dates.append(YEAR_TEMPLATE.format(year=year, date=date_str))
+
+        year_dates_str = "\n".join(year_dates)
+        holiday_data.append(
+            HOLIDAY_ARRAY_TEMPLATE.format(hol_name=hol_name, year_dates=year_dates_str)
+        )
+
+    holiday_data_str = "\n".join(holiday_data)
+    class_str = CLASS_TEMPLATE.format(
+        class_name=CLASS_NAME.format(cal_name="Mongolian"),
+        holiday_data=holiday_data_str,
+    )
+
+    path = Path("holidays/calendars") / OUT_FILE_NAME.format(cal_name="mongolian")
+    path.parent.mkdir(parents=True, exist_ok=True)
+    path.write_text(class_str, encoding="UTF-8")
+
+
+if __name__ == "__main__":
+    generate_data()


Test patch:
diff --git a/tests/countries/test_mongolia.py b/tests/countries/test_mongolia.py
new file mode 100644
index 00000000..198fbde3
--- /dev/null
+++ b/tests/countries/test_mongolia.py
@@ -0,0 +1,448 @@
+#  holidays
+#  --------
+#  A fast, efficient Python library for generating country, province and state
+#  specific sets of holidays on the fly. It aims to make determining whether a
+#  specific date is a holiday as fast and flexible as possible.
+#
+#  Authors: Vacanza Team and individual contributors (see CONTRIBUTORS file)
+#           dr-prodigy <dr.prodigy.github@gmail.com> (c) 2017-2023
+#           ryanss <ryanssdev@icloud.com> (c) 2014-2017
+#  Website: https://github.com/vacanza/holidays
+#  License: MIT (see LICENSE file)
+
+from unittest import TestCase
+
+from holidays.constants import PUBLIC, WORKDAY
+from holidays.countries.mongolia import Mongolia, MN, MNG
+from tests.common import CommonCountryTests
+
+
+class TestMongolia(CommonCountryTests, TestCase):
+    @classmethod
+    def setUpClass(cls):
+        years = range(2004, 2050)
+        super().setUpClass(Mongolia, years=years)
+        cls.workday_holidays = Mongolia(categories=WORKDAY, years=years)
+
+    def test_country_aliases(self):
+        self.assertAliases(Mongolia, MN, MNG)
+
+    def test_no_holidays(self):
+        self.assertNoHolidays(Mongolia(years=2003, categories=(PUBLIC, WORKDAY)))
+
+    def test_new_years_day(self):
+        self.assertHolidayName("Шинэ жил", (f"{year}-01-01" for year in range(2004, 2050)))
+
+    def test_constitutional_day(self):
+        name = "Монгол Улсын Үндсэн хуулийн өдөр"
+        self.assertHolidayName(
+            name, self.workday_holidays, (f"{year}-01-13" for year in range(2004, 2050))
+        )
+        self.assertNoHolidayName(name)
+
+    def test_tsagaan_sar(self):
+        name = "Цагаан сар"
+        # Day 1.
+        self.assertHolidayName(
+            name,
+            "2012-02-22",
+            "2013-02-11",
+            "2014-01-31",
+            "2021-02-12",
+            "2022-02-02",
+            "2023-02-21",
+            "2024-02-10",
+            "2025-03-01",
+        )
+        # Day 2.
+        self.assertHolidayName(
+            name,
+            "2012-02-23",
+            "2013-02-12",
+            "2014-02-01",
+            "2021-02-13",
+            "2022-02-03",
+            "2023-02-22",
+            "2024-02-11",
+            "2025-03-02",
+        )
+        # Day 3.
+        self.assertHolidayName(
+            name,
+            "2014-02-02",
+            "2021-02-14",
+            "2022-02-04",
+            "2023-02-23",
+            "2024-02-12",
+            "2025-03-03",
+        )
+        self.assertHolidayName(name, range(2004, 2050))
+        self.assertNoHolidayName(name, "2012-02-24", "2013-02-13")
+
+    def test_patriots_day(self):
+        name = "Эх орончдын өдөр"
+        self.assertHolidayName(
+            name, self.workday_holidays, (f"{year}-03-01" for year in range(2005, 2050))
+        )
+        self.assertNoHolidayName(name, self.workday_holidays, range(2004, 2005))
+        self.assertNoHolidayName(name)
+
+    def test_womens_day(self):
+        self.assertHolidayName(
+            "Олон улсын эмэгтэйчүүдийн өдөр", (f"{year}-03-08" for year in range(2004, 2050))
+        )
+
+    def test_military_day(self):
+        name_2004 = "Зэвсэгт хүчний өдөр"
+        name_2011 = "Монгол цэргийн өдөр"
+        self.assertHolidayName(
+            name_2004, self.workday_holidays, (f"{year}-03-18" for year in range(2004, 2011))
+        )
+        self.assertHolidayName(
+            name_2011, self.workday_holidays, (f"{year}-03-18" for year in range(2011, 2050))
+        )
+        self.assertNoHolidayName(name_2004, self.workday_holidays, range(2011, 2050))
+        self.assertNoHolidayName(name_2011, self.workday_holidays, range(2004, 2011))
+        self.assertNoHolidayName(name_2004)
+        self.assertNoHolidayName(name_2011)
+
+    def test_health_protection_day(self):
+        name = "Эрүүл мэндийг хамгаалах өдөр"
+        self.assertHolidayName(
+            name, self.workday_holidays, (f"{year}-04-07" for year in range(2004, 2050))
+        )
+        self.assertNoHolidayName(name)
+
+    def test_intellectual_property_protection_day(self):
+        name = "Оюуны өмчийг хамгаалах өдөр"
+        self.assertHolidayName(
+            name, self.workday_holidays, (f"{year}-04-26" for year in range(2004, 2050))
+        )
+        self.assertNoHolidayName(name)
+
+    def test_family_day(self):
+        name = "Гэр бүлийн өдөр"
+        self.assertHolidayName(
+            name, self.workday_holidays, (f"{year}-05-15" for year in range(2004, 2050))
+        )
+        self.assertNoHolidayName(name)
+
+    def test_childrens_day(self):
+        self.assertHolidayName("Хүүхдийн баяр", (f"{year}-06-01" for year in range(2004, 2050)))
+
+    def test_the_buddhas_birthday(self):
+        name = "Бурхан багшийн Их дүйчин өдөр"
+        self.assertHolidayName(
+            name,
+            "2021-05-26",
+            "2022-06-14",
+            "2023-06-04",
+            "2024-05-23",
+            "2025-06-11",
+        )
+        self.assertHolidayName(name, range(2020, 2050))
+        self.assertNoHolidayName(name, range(2004, 2020))
+
+    def test_national_flag_day(self):
+        name = "Монгол Улсын төрийн далбааны өдөр"
+        self.assertHolidayName(
+            name, self.workday_holidays, (f"{year}-07-10" for year in range(2009, 2050))
+        )
+        self.assertNoHolidayName(name, self.workday_holidays, range(2004, 2009))
+        self.assertNoHolidayName(name)
+
+    def test_national_festival_and_peoples_revolution_anniversary(self):
+        name = "Үндэсний их баяр наадам, Ардын хувьсгалын ойн баяр"
+
+        # JUL 10.
+        self.assertHolidayName(name, (f"{year}-07-10" for year in range(2023, 2050)))
+        self.assertNoHolidayName(name, (f"{year}-07-10" for year in range(2004, 2023)))
+
+        # JUL 11, 12, 13.
+        for year in range(2004, 2050):
+            self.assertHolidayName(name, f"{year}-07-11", f"{year}-07-12", f"{year}-07-13")
+
+        # JUL 14, 15.
+        for year in range(2014, 2050):
+            self.assertHolidayName(name, f"{year}-07-14", f"{year}-07-15")
+        for year in range(2004, 2014):
+            self.assertNoHolidayName(name, f"{year}-07-14", f"{year}-07-15")
+
+    def test_youth_day(self):
+        name = "Залуучуудын өдөр"
+        self.assertHolidayName(
+            name, self.workday_holidays, (f"{year}-08-25" for year in range(2004, 2050))
+        )
+        self.assertNoHolidayName(name)
+
+    def test_new_harvest_days(self):
+        name = "Шинэ ургацын өдрүүд"
+        for year in range(2007, 2050):
+            self.assertHolidayName(
+                name, self.workday_holidays, (f"{year}-09-05", f"{year}-10-01", f"{year}-10-20")
+            )
+        self.assertNoHolidayName(name, self.workday_holidays, range(2004, 2007))
+        self.assertNoHolidayName(name)
+
+    def test_memorial_day_of_political_victims(self):
+        name = "Улс төрийн хэлмэгдэгсдийн дурсгалын өдөр"
+        self.assertHolidayName(
+            name, self.workday_holidays, (f"{year}-09-10" for year in range(2004, 2050))
+        )
+        self.assertNoHolidayName(name)
+
+    def test_elders_day(self):
+        name = "Ахмадын өдөр"
+        self.assertHolidayName(
+            name, self.workday_holidays, (f"{year}-10-01" for year in range(2004, 2050))
+        )
+        self.assertNoHolidayName(name)
+
+    def test_capital_day(self):
+        name_2004 = "Монгол Улсын Нийслэлийн өдөр"
+        name_2021 = "Монгол Улсын нийслэл хотын өдөр"
+        self.assertHolidayName(
+            name_2004, self.workday_holidays, (f"{year}-10-29" for year in range(2004, 2021))
+        )
+        self.assertHolidayName(
+            name_2021, self.workday_holidays, (f"{year}-10-29" for year in range(2021, 2050))
+        )
+        self.assertNoHolidayName(name_2004, self.workday_holidays, range(2021, 2050))
+        self.assertNoHolidayName(name_2021, self.workday_holidays, range(2004, 2021))
+        self.assertNoHolidayName(name_2004)
+        self.assertNoHolidayName(name_2021)
+
+    def test_genghis_khans_birthday(self):
+        name = "Их Эзэн Чингис хааны өдөр"
+        self.assertHolidayName(
+            name,
+            "2021-11-05",
+            "2022-11-24",
+            "2023-11-14",
+            "2024-11-02",
+            "2025-11-21",
+        )
+        self.assertHolidayName(name, range(2012, 2050))
+        self.assertNoHolidayName(name, range(2004, 2012))
+
+    def test_republic_day(self):
+        name_2004 = "Бүгд Найрамдах Улс тунхагласны баяр"
+        name_2012 = "Бүгд Найрамдах Улс тунхагласан өдөр"
+
+        # Public holidays.
+        self.assertHolidayName(name_2004, (f"{year}-11-26" for year in range(2004, 2012)))
+        self.assertHolidayName(name_2012, (f"{year}-11-26" for year in range(2016, 2050)))
+        self.assertNoHolidayName(name_2004, range(2012, 2050))
+        self.assertNoHolidayName(name_2012, range(2004, 2016))
+
+        # Workday holidays.
+        self.assertHolidayName(
+            name_2012, self.workday_holidays, (f"{year}-11-26" for year in range(2012, 2016))
+        )
+        self.assertNoHolidayName(
+            name_2012, self.workday_holidays, range(2004, 2012), range(2016, 2050)
+        )
+
+    def test_democracy_and_human_rights_day(self):
+        name = "Ардчилал, хүний эрхийн өдөр"
+        self.assertHolidayName(
+            name, self.workday_holidays, (f"{year}-12-10" for year in range(2004, 2050))
+        )
+        self.assertNoHolidayName(name)
+
+    def test_independence_day(self):
+        name_2007 = "Үндэсний эрх чөлөөний өдөр"
+        name_2011 = "Үндэсний эрх чөлөө, тусгаар тогтнолоо сэргээсний баярын өдөр"
+
+        # Public holidays.
+        self.assertHolidayName(name_2011, (f"{year}-12-29" for year in range(2011, 2050)))
+        self.assertNoHolidayName(name_2007)
+        self.assertNoHolidayName(name_2011, range(2004, 2011))
+
+        # Workday holidays.
+        self.assertHolidayName(
+            name_2007, self.workday_holidays, (f"{year}-12-29" for year in range(2007, 2011))
+        )
+        self.assertNoHolidayName(
+            name_2007, self.workday_holidays, range(2004, 2007), range(2011, 2050)
+        )
+        self.assertNoHolidayName(name_2011, self.workday_holidays)
+
+    def test_2025(self):
+        self.assertHolidays(
+            Mongolia(years=2025),
+            ("2025-01-01", "Шинэ жил"),
+            ("2025-03-01", "Цагаан сар"),
+            ("2025-03-02", "Цагаан сар"),
+            ("2025-03-03", "Цагаан сар"),
+            ("2025-03-08", "Олон улсын эмэгтэйчүүдийн өдөр"),
+            ("2025-06-01", "Хүүхдийн баяр"),
+            ("2025-06-11", "Бурхан багшийн Их дүйчин өдөр"),
+            ("2025-07-10", "Үндэсний их баяр наадам, Ардын хувьсгалын ойн баяр"),
+            ("2025-07-11", "Үндэсний их баяр наадам, Ардын хувьсгалын ойн баяр"),
+            ("2025-07-12", "Үндэсний их баяр наадам, Ардын хувьсгалын ойн баяр"),
+            ("2025-07-13", "Үндэсний их баяр наадам, Ардын хувьсгалын ойн баяр"),
+            ("2025-07-14", "Үндэсний их баяр наадам, Ардын хувьсгалын ойн баяр"),
+            ("2025-07-15", "Үндэсний их баяр наадам, Ардын хувьсгалын ойн баяр"),
+            ("2025-11-21", "Их Эзэн Чингис хааны өдөр"),
+            ("2025-11-26", "Бүгд Найрамдах Улс тунхагласан өдөр"),
+            ("2025-12-29", "Үндэсний эрх чөлөө, тусгаар тогтнолоо сэргээсний баярын өдөр"),
+        )
+
+    def test_l10n_default(self):
+        self.assertLocalizedHolidays(
+            ("2024-01-01", "Шинэ жил"),
+            ("2024-01-13", "Монгол Улсын Үндсэн хуулийн өдөр"),
+            ("2024-02-10", "Цагаан сар"),
+            ("2024-02-11", "Цагаан сар"),
+            ("2024-02-12", "Цагаан сар"),
+            ("2024-03-01", "Эх орончдын өдөр"),
+            ("2024-03-08", "Олон улсын эмэгтэйчүүдийн өдөр"),
+            ("2024-03-18", "Монгол цэргийн өдөр"),
+            ("2024-04-07", "Эрүүл мэндийг хамгаалах өдөр"),
+            ("2024-04-26", "Оюуны өмчийг хамгаалах өдөр"),
+            ("2024-05-15", "Гэр бүлийн өдөр"),
+            ("2024-05-23", "Бурхан багшийн Их дүйчин өдөр"),
+            ("2024-06-01", "Хүүхдийн баяр"),
+            (
+                "2024-07-10",
+                "Монгол Улсын төрийн далбааны өдөр; "
+                "Үндэсний их баяр наадам, Ардын хувьсгалын ойн баяр",
+            ),
+            ("2024-07-11", "Үндэсний их баяр наадам, Ардын хувьсгалын ойн баяр"),
+            ("2024-07-12", "Үндэсний их баяр наадам, Ардын хувьсгалын ойн баяр"),
+            ("2024-07-13", "Үндэсний их баяр наадам, Ардын хувьсгалын ойн баяр"),
+            ("2024-07-14", "Үндэсний их баяр наадам, Ардын хувьсгалын ойн баяр"),
+            ("2024-07-15", "Үндэсний их баяр наадам, Ардын хувьсгалын ойн баяр"),
+            ("2024-08-25", "Залуучуудын өдөр"),
+            ("2024-09-05", "Шинэ ургацын өдрүүд"),
+            ("2024-09-06", "Шинэ ургацын өдрүүд"),
+            ("2024-09-07", "Шинэ ургацын өдрүүд"),
+            ("2024-09-08", "Шинэ ургацын өдрүүд"),
+            ("2024-09-09", "Шинэ ургацын өдрүүд"),
+            ("2024-09-10", "Улс төрийн хэлмэгдэгсдийн дурсгалын өдөр; Шинэ ургацын өдрүүд"),
+            ("2024-09-11", "Шинэ ургацын өдрүүд"),
+            ("2024-09-12", "Шинэ ургацын өдрүүд"),
+            ("2024-09-13", "Шинэ ургацын өдрүүд"),
+            ("2024-09-14", "Шинэ ургацын өдрүүд"),
+            ("2024-09-15", "Шинэ ургацын өдрүүд"),
+            ("2024-09-16", "Шинэ ургацын өдрүүд"),
+            ("2024-09-17", "Шинэ ургацын өдрүүд"),
+            ("2024-09-18", "Шинэ ургацын өдрүүд"),
+            ("2024-09-19", "Шинэ ургацын өдрүүд"),
+            ("2024-09-20", "Шинэ ургацын өдрүүд"),
+            ("2024-09-21", "Шинэ ургацын өдрүүд"),
+            ("2024-09-22", "Шинэ ургацын өдрүүд"),
+            ("2024-09-23", "Шинэ ургацын өдрүүд"),
+            ("2024-09-24", "Шинэ ургацын өдрүүд"),
+            ("2024-09-25", "Шинэ ургацын өдрүүд"),
+            ("2024-09-26", "Шинэ ургацын өдрүүд"),
+            ("2024-09-27", "Шинэ ургацын өдрүүд"),
+            ("2024-09-28", "Шинэ ургацын өдрүүд"),
+            ("2024-09-29", "Шинэ ургацын өдрүүд"),
+            ("2024-09-30", "Шинэ ургацын өдрүүд"),
+            ("2024-10-01", "Ахмадын өдөр; Шинэ ургацын өдрүүд"),
+            ("2024-10-02", "Шинэ ургацын өдрүүд"),
+            ("2024-10-03", "Шинэ ургацын өдрүүд"),
+            ("2024-10-04", "Шинэ ургацын өдрүүд"),
+            ("2024-10-05", "Шинэ ургацын өдрүүд"),
+            ("2024-10-06", "Шинэ ургацын өдрүүд"),
+            ("2024-10-07", "Шинэ ургацын өдрүүд"),
+            ("2024-10-08", "Шинэ ургацын өдрүүд"),
+            ("2024-10-09", "Шинэ ургацын өдрүүд"),
+            ("2024-10-10", "Шинэ ургацын өдрүүд"),
+            ("2024-10-11", "Шинэ ургацын өдрүүд"),
+            ("2024-10-12", "Шинэ ургацын өдрүүд"),
+            ("2024-10-13", "Шинэ ургацын өдрүүд"),
+            ("2024-10-14", "Шинэ ургацын өдрүүд"),
+            ("2024-10-15", "Шинэ ургацын өдрүүд"),
+            ("2024-10-16", "Шинэ ургацын өдрүүд"),
+            ("2024-10-17", "Шинэ ургацын өдрүүд"),
+            ("2024-10-18", "Шинэ ургацын өдрүүд"),
+            ("2024-10-19", "Шинэ ургацын өдрүүд"),
+            ("2024-10-20", "Шинэ ургацын өдрүүд"),
+            ("2024-10-29", "Монгол Улсын нийслэл хотын өдөр"),
+            ("2024-11-02", "Их Эзэн Чингис хааны өдөр"),
+            ("2024-11-26", "Бүгд Найрамдах Улс тунхагласан өдөр"),
+            ("2024-12-10", "Ардчилал, хүний эрхийн өдөр"),
+            ("2024-12-29", "Үндэсний эрх чөлөө, тусгаар тогтнолоо сэргээсний баярын өдөр"),
+        )
+
+    def test_l10n_en_us(self):
+        self.assertLocalizedHolidays(
+            "en_US",
+            ("2024-01-01", "New Year's Day"),
+            ("2024-01-13", "Constitution Day"),
+            ("2024-02-10", "Lunar New Year"),
+            ("2024-02-11", "Lunar New Year"),
+            ("2024-02-12", "Lunar New Year"),
+            ("2024-03-01", "Patriots' Day"),
+            ("2024-03-08", "International Women's Day"),
+            ("2024-03-18", "Military Day"),
+            ("2024-04-07", "Health Protection Day"),
+            ("2024-04-26", "Intellectual Property Protection Day"),
+            ("2024-05-15", "Family Day"),
+            ("2024-05-23", "The Buddha's Birthday"),
+            ("2024-06-01", "Children's Day"),
+            (
+                "2024-07-10",
+                "National Festival and People's Revolution Anniversary; National Flag Day",
+            ),
+            ("2024-07-11", "National Festival and People's Revolution Anniversary"),
+            ("2024-07-12", "National Festival and People's Revolution Anniversary"),
+            ("2024-07-13", "National Festival and People's Revolution Anniversary"),
+            ("2024-07-14", "National Festival and People's Revolution Anniversary"),
+            ("2024-07-15", "National Festival and People's Revolution Anniversary"),
+            ("2024-08-25", "Youth Day"),
+            ("2024-09-05", "New Harvest Days"),
+            ("2024-09-06", "New Harvest Days"),
+            ("2024-09-07", "New Harvest Days"),
+            ("2024-09-08", "New Harvest Days"),
+            ("2024-09-09", "New Harvest Days"),
+            ("2024-09-10", "Memorial Day of Political Victims; New Harvest Days"),
+            ("2024-09-11", "New Harvest Days"),
+            ("2024-09-12", "New Harvest Days"),
+            ("2024-09-13", "New Harvest Days"),
+            ("2024-09-14", "New Harvest Days"),
+            ("2024-09-15", "New Harvest Days"),
+            ("2024-09-16", "New Harvest Days"),
+            ("2024-09-17", "New Harvest Days"),
+            ("2024-09-18", "New Harvest Days"),
+            ("2024-09-19", "New Harvest Days"),
+            ("2024-09-20", "New Harvest Days"),
+            ("2024-09-21", "New Harvest Days"),
+            ("2024-09-22", "New Harvest Days"),
+            ("2024-09-23", "New Harvest Days"),
+            ("2024-09-24", "New Harvest Days"),
+            ("2024-09-25", "New Harvest Days"),
+            ("2024-09-26", "New Harvest Days"),
+            ("2024-09-27", "New Harvest Days"),
+            ("2024-09-28", "New Harvest Days"),
+            ("2024-09-29", "New Harvest Days"),
+            ("2024-09-30", "New Harvest Days"),
+            ("2024-10-01", "Elders' Day; New Harvest Days"),
+            ("2024-10-02", "New Harvest Days"),
+            ("2024-10-03", "New Harvest Days"),
+            ("2024-10-04", "New Harvest Days"),
+            ("2024-10-05", "New Harvest Days"),
+            ("2024-10-06", "New Harvest Days"),
+            ("2024-10-07", "New Harvest Days"),
+            ("2024-10-08", "New Harvest Days"),
+            ("2024-10-09", "New Harvest Days"),
+            ("2024-10-10", "New Harvest Days"),
+            ("2024-10-11", "New Harvest Days"),
+            ("2024-10-12", "New Harvest Days"),
+            ("2024-10-13", "New Harvest Days"),
+            ("2024-10-14", "New Harvest Days"),
+            ("2024-10-15", "New Harvest Days"),
+            ("2024-10-16", "New Harvest Days"),
+            ("2024-10-17", "New Harvest Days"),
+            ("2024-10-18", "New Harvest Days"),
+            ("2024-10-19", "New Harvest Days"),
+            ("2024-10-20", "New Harvest Days"),
+            ("2024-10-29", "Capital City Day"),
+            ("2024-11-02", "Genghis Khan's Birthday"),
+            ("2024-11-26", "Republic Day"),
+            ("2024-12-10", "Democracy and Human Rights Day"),
+            ("2024-12-29", "National Freedom and Independence Day"),
+        )