Repository: vacanza/holidays
Pull request #2520 (2025-05-02 14:37:10)

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


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 180b104eea207384a2a285fd4a511ef1ef11f640 and d4aee3cada4129a56b43421b25f890cca9155270.
> 
> </details>
> 
> <details>
> <summary>📒 Files selected for processing (31)</summary>
> 
> * `README.md` (11 hunks)
> * `holidays/countries/american_samoa.py` (1 hunks)
> * `holidays/countries/andorra.py` (1 hunks)
> * `holidays/countries/argentina.py` (2 hunks)
> * `holidays/countries/australia.py` (2 hunks)
> * `holidays/countries/austria.py` (1 hunks)
> * `holidays/countries/bolivia.py` (1 hunks)
> * `holidays/countries/bosnia_and_herzegovina.py` (2 hunks)
> * `holidays/countries/brazil.py` (1 hunks)
> * `holidays/countries/canada.py` (1 hunks)
> * `holidays/countries/chile.py` (1 hunks)
> * `holidays/countries/el_salvador.py` (2 hunks)
> * `holidays/countries/france.py` (2 hunks)
> * `holidays/countries/germany.py` (2 hunks)
> * `holidays/countries/guam.py` (1 hunks)
> * `holidays/countries/india.py` (2 hunks)
> * `holidays/countries/macau.py` (1 hunks)
> * `holidays/countries/malaysia.py` (2 hunks)
> * `holidays/countries/new_zealand.py` (1 hunks)
> * `holidays/countries/nicaragua.py` (2 hunks)
> * `holidays/countries/northern_mariana_islands.py` (1 hunks)
> * `holidays/countries/portugal.py` (2 hunks)
> * `holidays/countries/puerto_rico.py` (1 hunks)
> * `holidays/countries/sao_tome_and_principe.py` (2 hunks)
> * `holidays/countries/spain.py` (1 hunks)
> * `holidays/countries/switzerland.py` (1 hunks)
> * `holidays/countries/tuvalu.py` (2 hunks)
> * `holidays/countries/united_states.py` (2 hunks)
> * `holidays/countries/united_states_minor_outlying_islands.py` (1 hunks)
> * `holidays/countries/united_states_virgin_islands.py` (1 hunks)
> * `tests/test_docs.py` (2 hunks)
> 
> </details>
> 
> ```ascii
>  _________________________________________________________________________________________________
> < I reached into your code and found nothing there to ease the pressure on my ever-worrying mind. >
>  -------------------------------------------------------------------------------------------------
>   \
>    \   (\__/)
>        (•ㅅ•)
>        / 　 づ
> ```

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

> [!TIP]
> <details>
> <summary>CodeRabbit can enforce grammar and style rules using `languagetool`.</summary>
> 
> Configure `languagetool` in your project's settings in CodeRabbit enable/disable rules and categories. Refer to the [LanguageTool Community](https://community.languagetool.org/rule/list) to learn more.
> 
> </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=2520):

- Review comments: Directly reply to a review comment made by CodeRabbit. Example:
  - `I pushed a fix in commit <commit_id>, please review it.`
  - `Generate unit testing code for this file.`
  - `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 generate unit testing code for this file.`
  -	`@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 generate unit testing code.`
  - `@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=2520) **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=2520&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=2520&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=2520&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=2520&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=2520&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=vacanza_python-holidays&pullRequest=2520)


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

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


```diff
@@            Coverage Diff            @@
##               dev     #2520   +/-   ##
=========================================
  Coverage   100.00%   100.00%           
=========================================
  Files          215       215           
  Lines        13650     13663   +13     
  Branches      1930      1930           
=========================================
+ Hits         13650     13663   +13     
```

</details>

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

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

- :snowflake: [Test Analytics](https://docs.codecov.com/docs/test-analytics): Detect flaky tests, report on failures, and find test suite problems.
</details>
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=2520) **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=2520&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=2520&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=2520&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=2520&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=2520&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=vacanza_python-holidays&pullRequest=2520)


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



Patch:
diff --git a/README.md b/README.md
index e379ac7f..88b84229 100644
--- a/README.md
+++ b/README.md
@@ -177,7 +177,7 @@ any) in brackets, available languages and additional holiday categories. All cou
 <tr>
 <td>Andorra</td>
 <td>AD</td>
-<td>Parishes: 02, 03, 04, 05, 06, 07, 08</td>
+<td>Parishes: 02 (Canillo), 03 (Encamp), 04 (La Massana), 05 (Ordino), 06 (Sant Julià de Lòria), 07 (Andorra la Vella), 08 (Escaldes-Engordany)</td>
 <td></td>
 <td></td>
 </tr>
@@ -289,7 +289,7 @@ any) in brackets, available languages and additional holiday categories. All cou
 <tr>
 <td>Bolivia</td>
 <td>BO</td>
-<td>Departments: B, C, H, L, N, O, P, S, T</td>
+<td>Departments: B (El Beni), C (Cochabamba), H (Chuquisaca), L (La Paz), N (Pando), O (Oruro), P (Potosí), S (Santa Cruz), T (Tarija)</td>
 <td>en_US, <strong>es</strong>, uk</td>
 <td></td>
 </tr>
@@ -359,7 +359,7 @@ any) in brackets, available languages and additional holiday categories. All cou
 <tr>
 <td>Canada</td>
 <td>CA</td>
-<td>Provinces and territories: AB, BC, MB, NB, NL, NS, NT, NU, ON, PE, QC, SK, YT</td>
+<td>Provinces and territories: AB (Alberta), BC (British Columbia, Colombie-Britannique), MB (Manitoba), NB (New Brunswick, Nouveau-Brunswick), NL (Newfoundland and Labrador, Terre-Neuve-et-Labrador), NS (Nova Scotia, Nouvelle-Écosse), NT (Northwest Territories, Territoires du Nord-Ouest), NU (Nunavut), ON (Ontario), PE (Prince Edward Island, Île-du-Prince-Édouard), QC (Quebec, Québec), SK (Saskatchewan), YT (Yukon)</td>
 <td>ar, <strong>en_CA</strong>, en_US, fr, th</td>
 <td>GOVERNMENT, OPTIONAL</td>
 </tr>
@@ -373,7 +373,7 @@ any) in brackets, available languages and additional holiday categories. All cou
 <tr>
 <td>Chile</td>
 <td>CL</td>
-<td>Regions: AI, AN, AP, AR, AT, BI, CO, LI, LL, LR, MA, ML, NB, RM, TA, VS</td>
+<td>Regions: AI (Aisén del General Carlos Ibañez del Campo), AN (Antofagasta), AP (Arica y Parinacota), AR (La Araucanía), AT (Atacama), BI (Biobío), CO (Coquimbo), LI (Libertador General Bernardo O'Higgins), LL (Los Lagos), LR (Los Ríos), MA (Magallanes), ML (Maule), NB (Ñuble), RM (Región Metropolitana de Santiago), TA (Tarapacá), VS (Valparaíso)</td>
 <td>en_US, <strong>es</strong>, uk</td>
 <td>BANK</td>
 </tr>
@@ -555,7 +555,7 @@ any) in brackets, available languages and additional holiday categories. All cou
 <tr>
 <td>Germany</td>
 <td>DE</td>
-<td>States: BB (Brandenburg), BE (Berlin), BW (Baden-Württemberg), BY (Bayern), HB (Bremen), HE (Hessen), HH (Hamburg), MV (Mecklenburg-Vorpommern), NI (Niedersachsen), NW (Nordrhein-Westfalen), RP (Rheinland-Pfalz), SH (Schleswig-Holstein), SL (Saarland), SN (Sachsen), ST (Sachsen-Anhalt), TH (Thüringen)</td>
+<td>Lands: BB (Brandenburg), BE (Berlin), BW (Baden-Württemberg), BY (Bayern), HB (Bremen), HE (Hessen), HH (Hamburg), MV (Mecklenburg-Vorpommern), NI (Niedersachsen), NW (Nordrhein-Westfalen), RP (Rheinland-Pfalz), SH (Schleswig-Holstein), SL (Saarland), SN (Sachsen), ST (Sachsen-Anhalt), TH (Thüringen)</td>
 <td><strong>de</strong>, en_US, th, uk</td>
 <td>CATHOLIC</td>
 </tr>
@@ -689,7 +689,7 @@ any) in brackets, available languages and additional holiday categories. All cou
 <tr>
 <td>Italy</td>
 <td>IT</td>
-<td>Provinces: AG (Agrigento), AL (Alessandria), AN (Ancona), AO (Aosta), AP (Ascoli Piceno), AQ (L'Aquila), AR (Arezzo), AT (Asti), AV (Avellino), BA (Bari), BG (Bergamo), BI (Biella), BL (Belluno), BN (Benevento), BO (Bologna), BR (Brindisi), BS (Brescia), BT (Barletta-Andria-Trani), BZ (Bolzano), CA (Cagliari), CB (Campobasso), CE (Caserta), CH (Chieti), CL (Caltanissetta), CN (Cuneo), CO (Como), CR (Cremona), CS (Cosenza), CT (Catania), CZ (Catanzaro), EN (Enna), FC (Forli-Cesena, Forlì-Cesena), FE (Ferrara), FG (Foggia), FI (Firenze), FM (Fermo), FR (Frosinone), GE (Genova), GO (Gorizia), GR (Grosseto), IM (Imperia), IS (Isernia), KR (Crotone), LC (Lecco), LE (Lecce), LI (Livorno), LO (Lodi), LT (Latina), LU (Lucca), MB (Monza e Brianza), MC (Macerata), ME (Messina), MI (Milano), MN (Mantova), MO (Modena), MS (Massa-Carrara), MT (Matera), NA (Napoli), NO (Novara), NU (Nuoro), OR (Oristano), PA (Palermo), PC (Piacenza), PD (Padova), PE (Pescara), PG (Perugia), PI (Pisa), PN (Pordenone), PO (Prato), PR (Parma), PT (Pistoia), PU (Pesaro e Urbino), PV (Pavia), PZ (Potenza), RA (Ravenna), RC (Reggio Calabria), RE (Reggio Emilia), RG (Ragusa), RI (Rieti), RM (Roma), RN (Rimini), RO (Rovigo), SA (Salerno), SI (Siena), SO (Sondrio), SP (La Spezia), SR (Siracusa), SS (Sassari), SU (Sud Sardegna), SV (Savona), TA (Taranto), TE (Teramo), TN (Trento), TO (Torino), TP (Trapani), TR (Terni), TS (Trieste), TV (Treviso), UD (Udine), VA (Varese), VB (Verbano-Cusio-Ossola), VC (Vercelli), VE (Venezia), VI (Vicenza), VR (Verona), VT (Viterbo), VV (Vibo Valentia). Cities: Andria, Barletta, Cesena, Forli (Forlì), Pesaro, Trani, Urbino</td>
+<td>Provinces: AG (Agrigento), AL (Alessandria), AN (Ancona), AO (Aosta), AP (Ascoli Piceno), AQ (L'Aquila), AR (Arezzo), AT (Asti), AV (Avellino), BA (Bari), BG (Bergamo), BI (Biella), BL (Belluno), BN (Benevento), BO (Bologna), BR (Brindisi), BS (Brescia), BT (Barletta-Andria-Trani), BZ (Bolzano), CA (Cagliari), CB (Campobasso), CE (Caserta), CH (Chieti), CL (Caltanissetta), CN (Cuneo), CO (Como), CR (Cremona), CS (Cosenza), CT (Catania), CZ (Catanzaro), EN (Enna), FC (Forli-Cesena, Forlì-Cesena), FE (Ferrara), FG (Foggia), FI (Firenze), FM (Fermo), FR (Frosinone), GE (Genova), GO (Gorizia), GR (Grosseto), IM (Imperia), IS (Isernia), KR (Crotone), LC (Lecco), LE (Lecce), LI (Livorno), LO (Lodi), LT (Latina), LU (Lucca), MB (Monza e Brianza), MC (Macerata), ME (Messina), MI (Milano), MN (Mantova), MO (Modena), MS (Massa-Carrara), MT (Matera), NA (Napoli), NO (Novara), NU (Nuoro), OR (Oristano), PA (Palermo), PC (Piacenza), PD (Padova), PE (Pescara), PG (Perugia), PI (Pisa), PN (Pordenone), PO (Prato), PR (Parma), PT (Pistoia), PU (Pesaro e Urbino), PV (Pavia), PZ (Potenza), RA (Ravenna), RC (Reggio Calabria), RE (Reggio Emilia), RG (Ragusa), RI (Rieti), RM (Roma), RN (Rimini), RO (Rovigo), SA (Salerno), SI (Siena), SO (Sondrio), SP (La Spezia), SR (Siracusa), SS (Sassari), SU (Sud Sardegna), SV (Savona), TA (Taranto), TE (Teramo), TN (Trento), TO (Torino), TP (Trapani), TR (Terni), TS (Trieste), TV (Treviso), UD (Udine), VA (Varese), VB (Verbano-Cusio-Ossola), VC (Vercelli), VE (Venezia), VI (Vicenza), VR (Verona), VT (Viterbo), VV (Vibo Valentia); cities: Andria, Barletta, Cesena, Forli (Forlì), Pesaro, Trani, Urbino</td>
 <td></td>
 <td></td>
 </tr>
@@ -822,7 +822,7 @@ any) in brackets, available languages and additional holiday categories. All cou
 <tr>
 <td>Malaysia</td>
 <td>MY</td>
-<td>States and federal territories: 01 (Johor, JHR), 02 (Kedah, KDH), 03 (Kelantan, KTN), 04 (Melaka, MLK), 05 (Negeri Sembilan, NSN), 06 (Pahang, PHG), 07 (Pulau Pinang, PNG), 08 (Perak, PRK), 09 (Perlis, PLS), 10 (Selangor, SGR), 11 (Terengganu, TRG), 12 (Sabah, SBH), 13 (Sarawak, SWK), 14 (WP Kuala Lumpur, KUL), 15 (WP Labuan, LBN), 16 (WP Putrajaya, PJY)</td>
+<td>States and federal territories: 01 (Johor, JHR), 02 (Kedah, KDH), 03 (Kelantan, KTN), 04 (Melaka, MLK), 05 (Negeri Sembilan, NSN), 06 (Pahang, PHG), 07 (Pulau Pinang, PNG), 08 (Perak, PRK), 09 (Perlis, PLS), 10 (Selangor, SGR), 11 (Terengganu, TRG), 12 (Sabah, SBH), 13 (Sarawak, SWK), 14 (Wilayah Persekutuan Kuala Lumpur, KUL), 15 (Wilayah Persekutuan Labuan, LBN), 16 (Wilayah Persekutuan Putrajaya, PJY)</td>
 <td>en_US, <strong>ms_MY</strong>, th</td>
 <td></td>
 </tr>
@@ -913,7 +913,7 @@ any) in brackets, available languages and additional holiday categories. All cou
 <tr>
 <td>New Zealand</td>
 <td>NZ</td>
-<td>Regions and Special Island Authorities: AUK (Auckland, Tāmaki-Makaurau, AU), BOP (Bay of Plenty, Toi Moana, BP), CAN (Canterbury, Waitaha, CA), CIT (Chatham Islands Territory, Chatham Islands, Wharekauri, CI), GIS (Gisborne, Te Tairāwhiti, GI), HKB (Hawke's Bay, Te Matau-a-Māui, HB), MBH (Marlborough, MA), MWT (Manawatū Whanganui, Manawatū-Whanganui, MW), NSN (Nelson, Whakatū, NE), NTL (Northland, Te Taitokerau, NO), OTA (Otago, Ō Tākou, OT), STL (Southland, Te Taiao Tonga, SO), TAS (Tasman, Te tai o Aorere, TS), TKI (Taranaki, TK), WGN (Greater Wellington, Te Pane Matua Taiao, Wellington, Te Whanganui-a-Tara, WG), WKO (Waikato, WK), WTC (West Coast, Te Tai o Poutini, WC). Subregions: South Canterbury</td>
+<td>Regions and Special Island Authorities: AUK (Auckland, Tāmaki-Makaurau, AU), BOP (Bay of Plenty, Toi Moana, BP), CAN (Canterbury, Waitaha, CA), CIT (Chatham Islands Territory, Chatham Islands, Wharekauri, CI), GIS (Gisborne, Te Tairāwhiti, GI), HKB (Hawke's Bay, Te Matau-a-Māui, HB), MBH (Marlborough, MA), MWT (Manawatū Whanganui, Manawatū-Whanganui, MW), NSN (Nelson, Whakatū, NE), NTL (Northland, Te Taitokerau, NO), OTA (Otago, Ō Tākou, OT), STL (Southland, Te Taiao Tonga, SO), TAS (Tasman, Te tai o Aorere, TS), TKI (Taranaki, TK), WGN (Greater Wellington, Te Pane Matua Taiao, Wellington, Te Whanganui-a-Tara, WG), WKO (Waikato, WK), WTC (West Coast, Te Tai o Poutini, WC); subregions: South Canterbury</td>
 <td></td>
 <td></td>
 </tr>
@@ -1151,7 +1151,7 @@ any) in brackets, available languages and additional holiday categories. All cou
 <tr>
 <td>Spain</td>
 <td>ES</td>
-<td>Autonomous communities: AN, AR, AS, CB, CE, CL, CM, CN, CT, EX, GA, IB, MC, MD, ML, NC, PV, RI, VC</td>
+<td>Autonomous communities: AN (Andalucía), AR (Aragón), AS (Asturias), CB (Cantabria), CE (Ceuta), CL (Castilla y León), CM (Castilla-La Mancha), CN (Canarias), CT (Cataluña, Catalunya), EX (Extremadura), GA (Galicia), IB (Islas Baleares, Illes Balears), MC (Murcia), MD (Madrid), ML (Melilla), NC (Navarra), PV (País Vasco), RI (La Rioja), VC (Valenciana)</td>
 <td>en_US, <strong>es</strong>, uk</td>
 <td></td>
 </tr>
@@ -1179,7 +1179,7 @@ any) in brackets, available languages and additional holiday categories. All cou
 <tr>
 <td>Switzerland</td>
 <td>CH</td>
-<td>Cantons: AG, AI, AR, BL, BS, BE, FR, GE, GL, GR, JU, LU, NE, NW, OW, SG, SH, SZ, SO, TG, TI, UR, VD, VS, ZG, ZH</td>
+<td>Cantons: AG (Aargau), AI (Appenzell Innerrhoden), AR (Appenzell Ausserrhoden), BE (Bern, Berne), BL (Basel-Landschaft), BS (Basel-Stadt), FR (Freiburg, Fribourg), GE (Genève), GL (Glarus), GR (Graubünden, Grigioni, Grischun), JU (Jura), LU (Luzern), NE (Neuchâtel), NW (Nidwalden), OW (Obwalden), SG (Sankt Gallen), SH (Schaffhausen), SO (Solothurn), SZ (Schwyz), TG (Thurgau), TI (Ticino), UR (Uri), VD (Vaud), VS (Valais, Wallis), ZG (Zug), ZH (Zürich)</td>
 <td><strong>de</strong>, en_US, fr, it, uk</td>
 <td>HALF_DAY, OPTIONAL</td>
 </tr>
@@ -1277,7 +1277,7 @@ any) in brackets, available languages and additional holiday categories. All cou
 <tr>
 <td>United States of America (the)</td>
 <td>US</td>
-<td>States and territories: AK, AL, AR, AS, AZ, CA, CO, CT, DC, DE, FL, GA, GU, HI, IA, ID, IL, IN, KS, KY, LA, MA, MD, ME, MI, MN, MO, MP, MS, MT, NC, ND, NE, NH, NJ, NM, NV, NY, OH, OK, OR, PA, PR, RI, SC, SD, TN, TX, UM, UT, VA, VI, VT, WA, WI, WV, WY</td>
+<td>States and territories: AK (Alaska), AL (Alabama), AR (Arkansas), AS (American Samoa), AZ (Arizona), CA (California), CO (Colorado), CT (Connecticut), DC (District of Columbia), DE (Delaware), FL (Florida), GA (Georgia), GU (Guam), HI (Hawaii), IA (Iowa), ID (Idaho), IL (Illinois), IN (Indiana), KS (Kansas), KY (Kentucky), LA (Louisiana), MA (Massachusetts), MD (Maryland), ME (Maine), MI (Michigan), MN (Minnesota), MO (Missouri), MP (Northern Mariana Islands), MS (Mississippi), MT (Montana), NC (North Carolina), ND (North Dakota), NE (Nebraska), NH (New Hampshire), NJ (New Jersey), NM (New Mexico), NV (Nevada), NY (New York), OH (Ohio), OK (Oklahoma), OR (Oregon), PA (Pennsylvania), PR (Puerto Rico), RI (Rhode Island), SC (South Carolina), SD (South Dakota), TN (Tennessee), TX (Texas), UM (United States Minor Outlying Islands), UT (Utah), VA (Virginia), VI (Virgin Islands, U.S.), VT (Vermont), WA (Washington), WI (Wisconsin), WV (West Virginia), WY (Wyoming)</td>
 <td></td>
 <td>GOVERNMENT, UNOFFICIAL</td>
 </tr>
diff --git a/holidays/countries/american_samoa.py b/holidays/countries/american_samoa.py
index 56ef0218..33e1d29d 100644
--- a/holidays/countries/american_samoa.py
+++ b/holidays/countries/american_samoa.py
@@ -24,6 +24,7 @@ class HolidaysAS(US):
     country = "AS"
     supported_categories = (GOVERNMENT, PUBLIC, UNOFFICIAL)
     subdivisions = ()  # Override US subdivisions.
+    subdivisions_aliases = {}  # Override US subdivisions aliases.
 
     def _populate_public_holidays(self) -> None:
         self.subdiv = "AS"
diff --git a/holidays/countries/andorra.py b/holidays/countries/andorra.py
index 0677687f..afa570cd 100644
--- a/holidays/countries/andorra.py
+++ b/holidays/countries/andorra.py
@@ -32,6 +32,15 @@ class Andorra(HolidayBase, ChristianHolidays, InternationalHolidays):
         "07",  # Andorra la Vella.
         "08",  # Escaldes-Engordany.
     )
+    subdivisions_aliases = {
+        "Canillo": "02",
+        "Encamp": "03",
+        "La Massana": "04",
+        "Ordino": "05",
+        "Sant Julià de Lòria": "06",
+        "Andorra la Vella": "07",
+        "Escaldes-Engordany": "08",
+    }
 
     def __init__(self, *args, **kwargs) -> None:
         ChristianHolidays.__init__(self)
diff --git a/holidays/countries/argentina.py b/holidays/countries/argentina.py
index 3f03258a..952ab4c9 100644
--- a/holidays/countries/argentina.py
+++ b/holidays/countries/argentina.py
@@ -147,10 +147,10 @@ class Argentina(
 
     country = "AR"
     default_language = "es"
-    supported_languages = ("en_US", "es", "uk")
-    supported_categories = (ARMENIAN, BANK, GOVERNMENT, HEBREW, ISLAMIC, PUBLIC)
     # %s (observed).
     observed_label = tr("%s (observado)")
+    # Decree-Law 2446.
+    start_year = 1957
     subdivisions = (
         "A",  # Salta.
         "B",  # Buenos Aires.
@@ -203,8 +203,8 @@ class Argentina(
         "Jujuy": "Y",
         "Santa Cruz": "Z",
     }
-    # Decree-Law 2446.
-    start_year = 1957
+    supported_languages = ("en_US", "es", "uk")
+    supported_categories = (ARMENIAN, BANK, GOVERNMENT, HEBREW, ISLAMIC, PUBLIC)
 
     def __init__(self, islamic_show_estimated: bool = True, *args, **kwargs):
         """
diff --git a/holidays/countries/australia.py b/holidays/countries/australia.py
index 241087ee..48b88867 100644
--- a/holidays/countries/australia.py
+++ b/holidays/countries/australia.py
@@ -50,12 +50,22 @@ class Australia(ObservedHolidayBase, ChristianHolidays, InternationalHolidays, S
     """
 
     country = "AU"
-    supported_categories = (BANK, HALF_DAY, PUBLIC)
     default_language = "en_AU"
     # %s (observed).
     observed_label = tr("%s (observed)")
-    supported_languages = ("en_AU", "en_US", "th")
-    subdivisions = ("ACT", "NSW", "NT", "QLD", "SA", "TAS", "VIC", "WA")
+    start_year = 1801
+    # fmt: off
+    subdivisions = (
+        "ACT",  # Australian Capital Territory.
+        "NSW",  # New South Wales.
+        "NT",   # Northern Territory.
+        "QLD",  # Queensland.
+        "SA",   # South Australia.
+        "TAS",  # Tasmania.
+        "VIC",  # Victoria.
+        "WA",   # Western Australia.
+    )
+    # fmt: on
     subdivisions_aliases = {
         "Australian Capital Territory": "ACT",
         "New South Wales": "NSW",
@@ -66,7 +76,8 @@ class Australia(ObservedHolidayBase, ChristianHolidays, InternationalHolidays, S
         "Victoria": "VIC",
         "Western Australia": "WA",
     }
-    start_year = 1801
+    supported_categories = (BANK, HALF_DAY, PUBLIC)
+    supported_languages = ("en_AU", "en_US", "th")
 
     @property
     def sovereign_birthday(self) -> str:
diff --git a/holidays/countries/austria.py b/holidays/countries/austria.py
index aae43dd9..0cd9a7d4 100644
--- a/holidays/countries/austria.py
+++ b/holidays/countries/austria.py
@@ -22,8 +22,6 @@ class Austria(HolidayBase, ChristianHolidays, InternationalHolidays):
 
     country = "AT"
     default_language = "de"
-    supported_categories = (BANK, PUBLIC)
-    supported_languages = ("de", "en_US", "uk")
     subdivisions = (
         "1",  # Burgenland.
         "2",  # Kärnten.
@@ -62,6 +60,8 @@ class Austria(HolidayBase, ChristianHolidays, InternationalHolidays):
         "Wien": "9",
         "W": "9",
     }
+    supported_categories = (BANK, PUBLIC)
+    supported_languages = ("de", "en_US", "uk")
 
     def __init__(self, *args, **kwargs) -> None:
         ChristianHolidays.__init__(self)
diff --git a/holidays/countries/bolivia.py b/holidays/countries/bolivia.py
index c5ed41a9..123b904a 100644
--- a/holidays/countries/bolivia.py
+++ b/holidays/countries/bolivia.py
@@ -38,21 +38,32 @@ class Bolivia(ObservedHolidayBase, ChristianHolidays, InternationalHolidays):
 
     country = "BO"
     default_language = "es"
-    supported_languages = ("en_US", "es", "uk")
     # %s (observed).
     observed_label = tr("%s (observado)")
+    start_year = 1825
     subdivisions = (
-        "B",  # El Beni
-        "C",  # Cochabamba
-        "H",  # Chuquisaca
-        "L",  # La Paz
-        "N",  # Pando
-        "O",  # Oruro
-        "P",  # Potosí
-        "S",  # Santa Cruz
-        "T",  # Tarija
+        "B",  # El Beni.
+        "C",  # Cochabamba.
+        "H",  # Chuquisaca.
+        "L",  # La Paz.
+        "N",  # Pando.
+        "O",  # Oruro.
+        "P",  # Potosí.
+        "S",  # Santa Cruz.
+        "T",  # Tarija.
     )
-    start_year = 1825
+    subdivisions_aliases = {
+        "El Beni": "B",
+        "Cochabamba": "C",
+        "Chuquisaca": "H",
+        "La Paz": "L",
+        "Pando": "N",
+        "Oruro": "O",
+        "Potosí": "P",
+        "Santa Cruz": "S",
+        "Tarija": "T",
+    }
+    supported_languages = ("en_US", "es", "uk")
 
     def __init__(self, *args, **kwargs):
         ChristianHolidays.__init__(self)
diff --git a/holidays/countries/bosnia_and_herzegovina.py b/holidays/countries/bosnia_and_herzegovina.py
index 9f0b87be..1aa2c32b 100644
--- a/holidays/countries/bosnia_and_herzegovina.py
+++ b/holidays/countries/bosnia_and_herzegovina.py
@@ -58,13 +58,12 @@ class BosniaAndHerzegovina(
 
     country = "BA"
     default_language = "bs"
-    supported_languages = ("bs", "en_US", "sr", "uk")
     # %s (observed).
     observed_label = tr("%s (preneseno)")
     subdivisions = (
-        "BIH",  # Federacija Bosne i Hercegovine
-        "BRC",  # Brčko distrikt
-        "SRP",  # Republika Srpska
+        "BIH",  # Federacija Bosne i Hercegovine.
+        "BRC",  # Brčko distrikt.
+        "SRP",  # Republika Srpska.
     )
     subdivisions_aliases = {
         "Federacija Bosne i Hercegovine": "BIH",
@@ -74,6 +73,7 @@ class BosniaAndHerzegovina(
         "Republika Srpska": "SRP",
         "RS": "SRP",
     }
+    supported_languages = ("bs", "en_US", "sr", "uk")
 
     def __init__(self, islamic_show_estimated: bool = True, *args, **kwargs):
         """
diff --git a/holidays/countries/brazil.py b/holidays/countries/brazil.py
index e6e3b30d..550998ab 100644
--- a/holidays/countries/brazil.py
+++ b/holidays/countries/brazil.py
@@ -32,6 +32,8 @@ class Brazil(ObservedHolidayBase, ChristianHolidays, InternationalHolidays):
 
     country = "BR"
     default_language = "pt_BR"
+    # Decreto n. 155-B, de 14.01.1890
+    start_year = 1890
     subdivisions = (
         "AC",
         "AL",
@@ -90,11 +92,8 @@ class Brazil(ObservedHolidayBase, ChristianHolidays, InternationalHolidays):
         "São Paulo": "SP",
         "Tocantins": "TO",
     }
-
     supported_categories = (OPTIONAL, PUBLIC)
     supported_languages = ("en_US", "pt_BR", "uk")
-    # Decreto n. 155-B, de 14.01.1890
-    start_year = 1890
 
     def __init__(self, *args, **kwargs) -> None:
         ChristianHolidays.__init__(self)
diff --git a/holidays/countries/canada.py b/holidays/countries/canada.py
index 8f828bdb..46789137 100644
--- a/holidays/countries/canada.py
+++ b/holidays/countries/canada.py
@@ -51,24 +51,46 @@ class Canada(ObservedHolidayBase, ChristianHolidays, InternationalHolidays, Stat
     default_language = "en_CA"
     # %s (observed).
     observed_label = tr("%s (observed)")
-    supported_categories = (GOVERNMENT, OPTIONAL, PUBLIC)
+    start_year = 1867
     subdivisions = (
-        "AB",
-        "BC",
-        "MB",
-        "NB",
-        "NL",
-        "NS",
-        "NT",
-        "NU",
-        "ON",
-        "PE",
-        "QC",
-        "SK",
-        "YT",
+        "AB",  # Alberta.
+        "BC",  # British Columbia (Colombie-Britannique).
+        "MB",  # Manitoba.
+        "NB",  # New Brunswick (Nouveau-Brunswick).
+        "NL",  # Newfoundland and Labrador (Terre-Neuve-et-Labrador).
+        "NS",  # Nova Scotia (Nouvelle-Écosse).
+        "NT",  # Northwest Territories (Territoires du Nord-Ouest).
+        "NU",  # Nunavut.
+        "ON",  # Ontario.
+        "PE",  # Prince Edward Island (Île-du-Prince-Édouard).
+        "QC",  # Quebec (Québec).
+        "SK",  # Saskatchewan.
+        "YT",  # Yukon.
     )
+    subdivisions_aliases = {
+        "Alberta": "AB",
+        "British Columbia": "BC",
+        "Colombie-Britannique": "BC",
+        "Manitoba": "MB",
+        "New Brunswick": "NB",
+        "Nouveau-Brunswick": "NB",
+        "Newfoundland and Labrador": "NL",
+        "Terre-Neuve-et-Labrador": "NL",
+        "Nova Scotia": "NS",
+        "Nouvelle-Écosse": "NS",
+        "Northwest Territories": "NT",
+        "Territoires du Nord-Ouest": "NT",
+        "Nunavut": "NU",
+        "Ontario": "ON",
+        "Prince Edward Island": "PE",
+        "Île-du-Prince-Édouard": "PE",
+        "Quebec": "QC",
+        "Québec": "QC",
+        "Saskatchewan": "SK",
+        "Yukon": "YT",
+    }
+    supported_categories = (GOVERNMENT, OPTIONAL, PUBLIC)
     supported_languages = ("ar", "en_CA", "en_US", "fr", "th")
-    start_year = 1867
 
     def __init__(self, *args, **kwargs):
         ChristianHolidays.__init__(self)
diff --git a/holidays/countries/chile.py b/holidays/countries/chile.py
index f2122d9a..9773986c 100644
--- a/holidays/countries/chile.py
+++ b/holidays/countries/chile.py
@@ -60,27 +60,45 @@ class Chile(ObservedHolidayBase, ChristianHolidays, InternationalHolidays, Stati
 
     country = "CL"
     default_language = "es"
+    start_year = 1915
     subdivisions = (
-        "AI",
-        "AN",
-        "AP",
-        "AR",
-        "AT",
-        "BI",
-        "CO",
-        "LI",
-        "LL",
-        "LR",
-        "MA",
-        "ML",
-        "NB",
-        "RM",
-        "TA",
-        "VS",
+        "AI",  # Aisén del General Carlos Ibañez del Campo.
+        "AN",  # Antofagasta.
+        "AP",  # Arica y Parinacota.
+        "AR",  # La Araucanía.
+        "AT",  # Atacama.
+        "BI",  # Biobío.
+        "CO",  # Coquimbo.
+        "LI",  # Libertador General Bernardo O'Higgins.
+        "LL",  # Los Lagos.
+        "LR",  # Los Ríos.
+        "MA",  # Magallanes.
+        "ML",  # Maule.
+        "NB",  # Ñuble.
+        "RM",  # Región Metropolitana de Santiago.
+        "TA",  # Tarapacá.
+        "VS",  # Valparaíso.
     )
+    subdivisions_aliases = {
+        "Aisén del General Carlos Ibañez del Campo": "AI",
+        "Antofagasta": "AN",
+        "Arica y Parinacota": "AP",
+        "La Araucanía": "AR",
+        "Atacama": "AT",
+        "Biobío": "BI",
+        "Coquimbo": "CO",
+        "Libertador General Bernardo O'Higgins": "LI",
+        "Los Lagos": "LL",
+        "Los Ríos": "LR",
+        "Magallanes": "MA",
+        "Maule": "ML",
+        "Ñuble": "NB",
+        "Región Metropolitana de Santiago": "RM",
+        "Tarapacá": "TA",
+        "Valparaíso": "VS",
+    }
     supported_categories = (BANK, PUBLIC)
     supported_languages = ("en_US", "es", "uk")
-    start_year = 1915
 
     def __init__(self, *args, **kwargs):
         ChristianHolidays.__init__(self)
diff --git a/holidays/countries/el_salvador.py b/holidays/countries/el_salvador.py
index 49f65210..1dd247ce 100644
--- a/holidays/countries/el_salvador.py
+++ b/holidays/countries/el_salvador.py
@@ -27,22 +27,23 @@ class ElSalvador(HolidayBase, ChristianHolidays, InternationalHolidays):
 
     country = "SV"
     default_language = "es"
-    supported_languages = ("en_US", "es", "uk")
+    # Labor Code 1972.
+    start_year = 1973
     subdivisions = (
-        "AH",  # Ahuachapán
-        "CA",  # Cabañas
-        "CH",  # Chalatenango
-        "CU",  # Cuscatlán
-        "LI",  # La Libertad
-        "MO",  # Morazán
-        "PA",  # La Paz
-        "SA",  # Santa Ana
-        "SM",  # San Miguel
-        "SO",  # Sonsonate
-        "SS",  # San Salvador
-        "SV",  # San Vicente
-        "UN",  # La Unión
-        "US",  # Usulután
+        "AH",  # Ahuachapán.
+        "CA",  # Cabañas.
+        "CH",  # Chalatenango.
+        "CU",  # Cuscatlán.
+        "LI",  # La Libertad.
+        "MO",  # Morazán.
+        "PA",  # La Paz.
+        "SA",  # Santa Ana.
+        "SM",  # San Miguel.
+        "SO",  # Sonsonate.
+        "SS",  # San Salvador.
+        "SV",  # San Vicente.
+        "UN",  # La Unión.
+        "US",  # Usulután.
     )
     subdivisions_aliases = {
         "Ahuachapán": "AH",
@@ -60,8 +61,7 @@ class ElSalvador(HolidayBase, ChristianHolidays, InternationalHolidays):
         "La Unión": "UN",
         "Usulután": "US",
     }
-    # Labor Code 1972.
-    start_year = 1973
+    supported_languages = ("en_US", "es", "uk")
 
     def __init__(self, *args, **kwargs):
         ChristianHolidays.__init__(self)
diff --git a/holidays/countries/france.py b/holidays/countries/france.py
index 269925bd..a17d8083 100644
--- a/holidays/countries/france.py
+++ b/holidays/countries/france.py
@@ -30,7 +30,7 @@ class France(HolidayBase, ChristianHolidays, InternationalHolidays):
 
     country = "FR"
     default_language = "fr"
-    supported_languages = ("en_US", "fr", "uk")
+    start_year = 1801
     subdivisions: tuple[str, ...] = (
         "BL",  # Saint-Barthélemy.
         "GES",  # Alsace, Champagne-Ardenne, Lorraine(Moselle).
@@ -59,7 +59,7 @@ class France(HolidayBase, ChristianHolidays, InternationalHolidays):
         "Wallis-et-Futuna": "WF",
         "Mayotte": "YT",
     }
-
+    supported_languages = ("en_US", "fr", "uk")
     _deprecated_subdivisions = (
         "Alsace-Moselle",
         "Guadeloupe",
@@ -74,7 +74,6 @@ class France(HolidayBase, ChristianHolidays, InternationalHolidays):
         "Saint-Martin",
         "Wallis-et-Futuna",
     )
-    start_year = 1801
 
     def __init__(self, *args, **kwargs):
         ChristianHolidays.__init__(self)
diff --git a/holidays/countries/germany.py b/holidays/countries/germany.py
index 76c41e1c..09a8dc38 100644
--- a/holidays/countries/germany.py
+++ b/holidays/countries/germany.py
@@ -35,26 +35,24 @@ class Germany(HolidayBase, ChristianHolidays, InternationalHolidays, StaticHolid
 
     country = "DE"
     default_language = "de"
-    supported_categories = (CATHOLIC, PUBLIC)
-    supported_languages = ("de", "en_US", "th", "uk")
+    start_year = 1990
     subdivisions = (
-        # ISO 3166-2:DE
-        "BB",
-        "BE",
-        "BW",
-        "BY",
-        "HB",
-        "HE",
-        "HH",
-        "MV",
-        "NI",
-        "NW",
-        "RP",
-        "SH",
-        "SL",
-        "SN",
-        "ST",
-        "TH",
+        "BB",  # Brandenburg.
+        "BE",  # Berlin.
+        "BW",  # Baden-Württemberg.
+        "BY",  # Bayern.
+        "HB",  # Bremen.
+        "HE",  # Hessen.
+        "HH",  # Hamburg.
+        "MV",  # Mecklenburg-Vorpommern.
+        "NI",  # Niedersachsen.
+        "NW",  # Nordrhein-Westfalen.
+        "RP",  # Rheinland-Pfalz.
+        "SH",  # Schleswig-Holstein.
+        "SL",  # Saarland.
+        "SN",  # Sachsen.
+        "ST",  # Sachsen-Anhalt.
+        "TH",  # Thüringen.
     )
     subdivisions_aliases = {
         "Brandenburg": "BB",
@@ -74,8 +72,9 @@ class Germany(HolidayBase, ChristianHolidays, InternationalHolidays, StaticHolid
         "Sachsen-Anhalt": "ST",
         "Thüringen": "TH",
     }
+    supported_categories = (CATHOLIC, PUBLIC)
+    supported_languages = ("de", "en_US", "th", "uk")
     _deprecated_subdivisions = ("BYP",)
-    start_year = 1990
 
     def __init__(self, *args, **kwargs) -> None:
         ChristianHolidays.__init__(self)
diff --git a/holidays/countries/guam.py b/holidays/countries/guam.py
index 86912b1a..b569dc1d 100644
--- a/holidays/countries/guam.py
+++ b/holidays/countries/guam.py
@@ -24,6 +24,7 @@ class HolidaysGU(US):
     country = "GU"
     supported_categories = (GOVERNMENT, PUBLIC, UNOFFICIAL)
     subdivisions = ()  # Override US subdivisions.
+    subdivisions_aliases = {}  # Override US subdivisions aliases.
 
     def _populate_public_holidays(self) -> None:
         self.subdiv = "GU"
diff --git a/holidays/countries/india.py b/holidays/countries/india.py
index 9df99893..09a4d096 100644
--- a/holidays/countries/india.py
+++ b/holidays/countries/india.py
@@ -46,8 +46,8 @@ class India(
     default_language = "en_IN"
     # %s (estimated).
     estimated_label = tr("%s (estimated)")
-    supported_categories = (OPTIONAL, PUBLIC)
-    supported_languages = ("en_IN", "en_US", "hi")
+    # India gained independence on August 15, 1947.
+    start_year = 1948
     subdivisions = (
         "AN",  # Andaman and Nicobar Islands.
         "AP",  # Andhra Pradesh.
@@ -86,10 +86,6 @@ class India(
         "UP",  # Uttar Pradesh.
         "WB",  # West Bengal.
     )
-    _deprecated_subdivisions = (
-        "DD",  # Daman and Diu.
-        "OR",  # Orissa.
-    )
     subdivisions_aliases = {
         "Andaman and Nicobar Islands": "AN",
         "Andhra Pradesh": "AP",
@@ -147,9 +143,12 @@ class India(
         "Uttar Pradesh": "UP",
         "West Bengal": "WB",
     }
-
-    # India gained independence on August 15, 1947.
-    start_year = 1948
+    supported_categories = (OPTIONAL, PUBLIC)
+    supported_languages = ("en_IN", "en_US", "hi")
+    _deprecated_subdivisions = (
+        "DD",  # Daman and Diu.
+        "OR",  # Orissa.
+    )
 
     def __init__(self, islamic_show_estimated: bool = True, *args, **kwargs):
         """
diff --git a/holidays/countries/macau.py b/holidays/countries/macau.py
index bffa1bcc..3a587715 100644
--- a/holidays/countries/macau.py
+++ b/holidays/countries/macau.py
@@ -62,6 +62,8 @@ class Macau(
 
     country = "MO"
     default_language = "zh_MO"
+    # Decreto-Lei n.º 4/82/M.
+    start_year = 1982
     subdivisions = (
         "I",  # Ilhas.
         "M",  # Macau.
@@ -77,8 +79,6 @@ class Macau(
     }
     supported_categories = (GOVERNMENT, MANDATORY, PUBLIC)
     supported_languages = ("en_MO", "en_US", "pt_MO", "th", "zh_CN", "zh_MO")
-    # Decreto-Lei n.º 4/82/M.
-    start_year = 1982
 
     def __init__(self, *args, **kwargs):
         ChineseCalendarHolidays.__init__(self)
diff --git a/holidays/countries/malaysia.py b/holidays/countries/malaysia.py
index 8b11556b..5cb64026 100644
--- a/holidays/countries/malaysia.py
+++ b/holidays/countries/malaysia.py
@@ -94,23 +94,24 @@ class Malaysia(
     observed_label = tr("Cuti %s")
     # %s (observed, estimated).
     observed_estimated_label = tr("Cuti %s (anggaran)")
+    start_year = 1952
     subdivisions = (
-        "01",
-        "02",
-        "03",
-        "04",
-        "05",
-        "06",
-        "07",
-        "08",
-        "09",
-        "10",
-        "11",
-        "12",
-        "13",
-        "14",
-        "15",
-        "16",
+        "01",  # Johor.
+        "02",  # Kedah.
+        "03",  # Kelantan.
+        "04",  # Melaka.
+        "05",  # Negeri Sembilan.
+        "06",  # Pahang.
+        "07",  # Pulau Pinang.
+        "08",  # Perak.
+        "09",  # Perlis.
+        "10",  # Selangor.
+        "11",  # Terengganu.
+        "12",  # Sabah.
+        "13",  # Sarawak.
+        "14",  # Wilayah Persekutuan Kuala Lumpur.
+        "15",  # Wilayah Persekutuan Labuan.
+        "16",  # Wilayah Persekutuan Putrajaya.
     )
     subdivisions_aliases = {
         "Johor": "01",
@@ -139,15 +140,14 @@ class Malaysia(
         "SBH": "12",
         "Sarawak": "13",
         "SWK": "13",
-        "WP Kuala Lumpur": "14",
+        "Wilayah Persekutuan Kuala Lumpur": "14",
         "KUL": "14",
-        "WP Labuan": "15",
+        "Wilayah Persekutuan Labuan": "15",
         "LBN": "15",
-        "WP Putrajaya": "16",
+        "Wilayah Persekutuan Putrajaya": "16",
         "PJY": "16",
     }
     supported_languages = ("en_US", "ms_MY", "th")
-    start_year = 1952
 
     def __init__(self, islamic_show_estimated: bool = True, *args, **kwargs):
         """
diff --git a/holidays/countries/new_zealand.py b/holidays/countries/new_zealand.py
index b0641022..dbde0218 100644
--- a/holidays/countries/new_zealand.py
+++ b/holidays/countries/new_zealand.py
@@ -28,26 +28,27 @@ class NewZealand(ObservedHolidayBase, ChristianHolidays, InternationalHolidays,
 
     country = "NZ"
     observed_label = "%s (observed)"
+    start_year = 1894
     subdivisions = (
         # ISO 3166-2: Regions and Special Island Authorities.
         # https://en.wikipedia.org/wiki/ISO_3166-2:NZ
-        "AUK",  # Auckland / Tāmaki-makaurau
-        "BOP",  # Bay of Plenty / Toi Moana
-        "CAN",  # Canterbury / Waitaha
-        "CIT",  # Chatham Islands Territory / Wharekauri
-        "GIS",  # Gisborne / Te Tairāwhiti
-        "HKB",  # Hawke's Bay / Te Matau a Māui
-        "MBH",  # Marlborough
-        "MWT",  # Manawatū-Whanganui / Manawatū Whanganui
-        "NSN",  # Nelson / Whakatū
-        "NTL",  # Northland / Te Tai tokerau
-        "OTA",  # Otago / Ō Tākou
-        "STL",  # Southland / Te Taiao Tonga
-        "TAS",  # Tasman / Te tai o Aorere
-        "TKI",  # Taranaki
-        "WGN",  # Greater Wellington / Te Pane Matua Taiao
-        "WKO",  # Waikato
-        "WTC",  # West Coast / Te Tai o Poutini
+        "AUK",  # Auckland (Tāmaki-Makaurau).
+        "BOP",  # Bay of Plenty (Toi Moana).
+        "CAN",  # Canterbury (Waitaha).
+        "CIT",  # Chatham Islands Territory (Wharekauri).
+        "GIS",  # Gisborne (Te Tairāwhiti).
+        "HKB",  # Hawke's Bay (Te Matau-a-Māui).
+        "MBH",  # Marlborough (Manawatū-Whanganui).
+        "MWT",  # Manawatū-Whanganui (Manawatū Whanganui).
+        "NSN",  # Nelson (Whakatū).
+        "NTL",  # Northland (Te Taitokerau).
+        "OTA",  # Otago (Ō Tākou).
+        "STL",  # Southland (Te Taiao Tonga).
+        "TAS",  # Tasman (Te tai o Aorere).
+        "TKI",  # Taranaki (Taranaki).
+        "WGN",  # Greater Wellington (Te Pane Matua Taiao).
+        "WKO",  # Waikato (Waikato).
+        "WTC",  # West Coast (Te Tai o Poutini).
         # Subregions:
         # https://www.govt.nz/browse/work/public-holidays-and-work/public-holidays-and-anniversary-dates/
         "South Canterbury",
@@ -114,7 +115,6 @@ class NewZealand(ObservedHolidayBase, ChristianHolidays, InternationalHolidays,
         "STC",  # For 'South Canterbury' Subregional Holidays.
         "WTL",  # Westland, Correct code is WTC (for West Coast).
     )
-    start_year = 1894
 
     def __init__(self, *args, **kwargs):
         ChristianHolidays.__init__(self)
diff --git a/holidays/countries/nicaragua.py b/holidays/countries/nicaragua.py
index e6f7b6b7..ddfdaba7 100644
--- a/holidays/countries/nicaragua.py
+++ b/holidays/countries/nicaragua.py
@@ -28,23 +28,23 @@ class Nicaragua(HolidayBase, ChristianHolidays, InternationalHolidays):
     country = "NI"
     default_language = "es"
     subdivisions = (
-        "AN",
-        "AS",
-        "BO",
-        "CA",
-        "CI",
-        "CO",
-        "ES",
-        "GR",
-        "JI",
-        "LE",
-        "MD",
-        "MN",
-        "MS",
-        "MT",
-        "NS",
-        "RI",
-        "SJ",
+        "AN",  # Costa Caribe Norte.
+        "AS",  # Costa Caribe Sur.
+        "BO",  # Boaco.
+        "CA",  # Carazo.
+        "CI",  # Chinandega.
+        "CO",  # Chontales.
+        "ES",  # Estelí.
+        "GR",  # Granada.
+        "JI",  # Jinotega.
+        "LE",  # León.
+        "MD",  # Madriz.
+        "MN",  # Managua.
+        "MS",  # Masaya.
+        "MT",  # Matagalpa.
+        "NS",  # Nueva Segovia.
+        "RI",  # Rivas.
+        "SJ",  # Río San Juan.
     )
     subdivisions_aliases = {
         "Costa Caribe Norte": "AN",
@@ -62,8 +62,8 @@ class Nicaragua(HolidayBase, ChristianHolidays, InternationalHolidays):
         "Masaya": "MS",
         "Matagalpa": "MT",
         "Nueva Segovia": "NS",
-        "Río San Juan": "SJ",
         "Rivas": "RI",
+        "Río San Juan": "SJ",
     }
     supported_languages = ("en_US", "es", "uk")
 
diff --git a/holidays/countries/northern_mariana_islands.py b/holidays/countries/northern_mariana_islands.py
index 12c6dc8a..c232a4ba 100644
--- a/holidays/countries/northern_mariana_islands.py
+++ b/holidays/countries/northern_mariana_islands.py
@@ -24,6 +24,7 @@ class HolidaysMP(US):
     country = "MP"
     supported_categories = (GOVERNMENT, PUBLIC, UNOFFICIAL)
     subdivisions = ()  # Override US subdivisions.
+    subdivisions_aliases = {}  # Override US subdivisions aliases.
 
     def _populate_public_holidays(self) -> None:
         self.subdiv = "MP"
diff --git a/holidays/countries/portugal.py b/holidays/countries/portugal.py
index 9ea32ddc..c48057d4 100644
--- a/holidays/countries/portugal.py
+++ b/holidays/countries/portugal.py
@@ -38,29 +38,27 @@ class Portugal(HolidayBase, ChristianHolidays, InternationalHolidays):
     default_language = "pt_PT"
     supported_categories = (OPTIONAL, PUBLIC)
     start_year = 1801
-
-    # https://en.wikipedia.org/wiki/ISO_3166-2:PT
     subdivisions = (
-        "01",
-        "02",
-        "03",
-        "04",
-        "05",
-        "06",
-        "07",
-        "08",
-        "09",
-        "10",
-        "11",
-        "12",
-        "13",
-        "14",
-        "15",
-        "16",
-        "17",
-        "18",
-        "20",
-        "30",
+        "01",  # Aveiro.
+        "02",  # Beja.
+        "03",  # Braga.
+        "04",  # Bragança.
+        "05",  # Castelo Branco.
+        "06",  # Coimbra.
+        "07",  # Évora.
+        "08",  # Faro.
+        "09",  # Guarda.
+        "10",  # Leiria.
+        "11",  # Lisboa.
+        "12",  # Portalegre.
+        "13",  # Porto.
+        "14",  # Santarém.
+        "15",  # Setúbal.
+        "16",  # Viana do Castelo.
+        "17",  # Vila Real.
+        "18",  # Viseu.
+        "20",  # Região Autónoma dos Açores.
+        "30",  # Região Autónoma da Madeira.
     )
     subdivisions_aliases = {
         "Aveiro": "01",
@@ -84,8 +82,8 @@ class Portugal(HolidayBase, ChristianHolidays, InternationalHolidays):
         "Região Autónoma dos Açores": "20",
         "Região Autónoma da Madeira": "30",
     }
-    _deprecated_subdivisions = ("Ext",)
     supported_languages = ("en_US", "pt_PT", "uk")
+    _deprecated_subdivisions = ("Ext",)
 
     def __init__(self, *args, **kwargs) -> None:
         ChristianHolidays.__init__(self)
diff --git a/holidays/countries/puerto_rico.py b/holidays/countries/puerto_rico.py
index 277caccb..9c5cf9cc 100644
--- a/holidays/countries/puerto_rico.py
+++ b/holidays/countries/puerto_rico.py
@@ -24,6 +24,7 @@ class HolidaysPR(US):
     country = "PR"
     supported_categories = (GOVERNMENT, PUBLIC, UNOFFICIAL)
     subdivisions = ()  # Override US subdivisions.
+    subdivisions_aliases = {}  # Override US subdivisions aliases.
 
     def _populate_public_holidays(self) -> None:
         self.subdiv = "PR"
diff --git a/holidays/countries/sao_tome_and_principe.py b/holidays/countries/sao_tome_and_principe.py
index 75a967f2..198b82b9 100644
--- a/holidays/countries/sao_tome_and_principe.py
+++ b/holidays/countries/sao_tome_and_principe.py
@@ -30,16 +30,15 @@ class SaoTomeAndPrincipe(ObservedHolidayBase, ChristianHolidays, InternationalHo
     default_language = "pt_ST"
     # %s (observed).
     observed_label = tr("%s (observado)")
-    supported_languages = ("en_US", "pt_ST")
     start_year = 2014
     subdivisions = (
-        "01",
-        "02",
-        "03",
-        "04",
-        "05",
-        "06",
-        "P",
+        "01",  # Água Grande.
+        "02",  # Cantagalo.
+        "03",  # Caué.
+        "04",  # Lembá.
+        "05",  # Lobata.
+        "06",  # Mé-Zóchi.
+        "P",  # Príncipe.
     )
     subdivisions_aliases = {
         # Districts.
@@ -52,6 +51,7 @@ class SaoTomeAndPrincipe(ObservedHolidayBase, ChristianHolidays, InternationalHo
         # Autonomous Region.
         "Príncipe": "P",
     }
+    supported_languages = ("en_US", "pt_ST")
 
     def __init__(self, *args, **kwargs):
         ChristianHolidays.__init__(self)
diff --git a/holidays/countries/spain.py b/holidays/countries/spain.py
index b1b6a7d4..44ed461e 100644
--- a/holidays/countries/spain.py
+++ b/holidays/countries/spain.py
@@ -55,26 +55,49 @@ class Spain(
     # Monday following %s.
     observed_label = tr("Lunes siguiente a %s")
     subdivisions = (
-        "AN",  # Andalucía
-        "AR",  # Aragón
-        "AS",  # Asturias
-        "CB",  # Cantabria
-        "CE",  # Ceuta
-        "CL",  # Castilla y León
-        "CM",  # Castilla-La Mancha
-        "CN",  # Canarias
-        "CT",  # Cataluña
-        "EX",  # Extremadura
-        "GA",  # Galicia
-        "IB",  # Islas Baleares
-        "MC",  # Murcia
-        "MD",  # Madrid
-        "ML",  # Melilla
-        "NC",  # Navarra
-        "PV",  # País Vasco
-        "RI",  # La Rioja
-        "VC",  # Valenciana
+        "AN",  # Andalucía.
+        "AR",  # Aragón.
+        "AS",  # Asturias.
+        "CB",  # Cantabria.
+        "CE",  # Ceuta.
+        "CL",  # Castilla y León.
+        "CM",  # Castilla-La Mancha.
+        "CN",  # Canarias.
+        "CT",  # Cataluña (Catalunya).
+        "EX",  # Extremadura.
+        "GA",  # Galicia.
+        "IB",  # Islas Baleares (Illes Balears).
+        "MC",  # Murcia.
+        "MD",  # Madrid.
+        "ML",  # Melilla.
+        "NC",  # Navarra.
+        "PV",  # País Vasco.
+        "RI",  # La Rioja.
+        "VC",  # Valenciana.
     )
+    subdivisions_aliases = {
+        "Andalucía": "AN",
+        "Aragón": "AR",
+        "Asturias": "AS",
+        "Cantabria": "CB",
+        "Ceuta": "CE",
+        "Castilla y León": "CL",
+        "Castilla-La Mancha": "CM",
+        "Canarias": "CN",
+        "Cataluña": "CT",
+        "Catalunya": "CT",
+        "Extremadura": "EX",
+        "Galicia": "GA",
+        "Islas Baleares": "IB",
+        "Illes Balears": "IB",
+        "Murcia": "MC",
+        "Madrid": "MD",
+        "Melilla": "ML",
+        "Navarra": "NC",
+        "País Vasco": "PV",
+        "La Rioja": "RI",
+        "Valenciana": "VC",
+    }
     supported_languages = ("en_US", "es", "uk")
 
     def __init__(self, islamic_show_estimated: bool = True, *args, **kwargs):
diff --git a/holidays/countries/switzerland.py b/holidays/countries/switzerland.py
index bdddb076..185e5850 100644
--- a/holidays/countries/switzerland.py
+++ b/holidays/countries/switzerland.py
@@ -29,37 +29,70 @@ class Switzerland(ObservedHolidayBase, ChristianHolidays, InternationalHolidays)
 
     country = "CH"
     default_language = "de"
+    start_year = 1801
     subdivisions = (
-        "AG",  # Aargau
-        "AI",  # Appenzell Innerrhoden
-        "AR",  # Appenzell Ausserrhoden
-        "BL",  # Basel-Landschaft
-        "BS",  # Basel-Stadt
-        "BE",  # Bern
-        "FR",  # Fribourg
-        "GE",  # Geneva
-        "GL",  # Glarus
-        "GR",  # Graubünden
-        "JU",  # Jura
-        "LU",  # Luzern
-        "NE",  # Neuchâtel
-        "NW",  # Nidwalden
-        "OW",  # Obwalden
-        "SG",  # St. Gallen
-        "SH",  # Schaffhausen
-        "SZ",  # Schwyz
-        "SO",  # Solothurn
-        "TG",  # Thurgau
-        "TI",  # Ticino
-        "UR",  # Uri
-        "VD",  # Vaud
-        "VS",  # Valais
-        "ZG",  # Zug
-        "ZH",  # Zürich
+        "AG",  # Aargau.
+        "AI",  # Appenzell Innerrhoden.
+        "AR",  # Appenzell Ausserrhoden.
+        "BE",  # Bern (Berne).
+        "BL",  # Basel-Landschaft.
+        "BS",  # Basel-Stadt.
+        "FR",  # Freiburg (Fribourg).
+        "GE",  # Genève.
+        "GL",  # Glarus.
+        "GR",  # Graubünden (Grigioni, Grischun).
+        "JU",  # Jura.
+        "LU",  # Luzern.
+        "NE",  # Neuchâtel.
+        "NW",  # Nidwalden.
+        "OW",  # Obwalden.
+        "SG",  # Sankt Gallen.
+        "SH",  # Schaffhausen.
+        "SO",  # Solothurn.
+        "SZ",  # Schwyz.
+        "TG",  # Thurgau.
+        "TI",  # Ticino.
+        "UR",  # Uri.
+        "VD",  # Vaud.
+        "VS",  # Valais (Wallis).
+        "ZG",  # Zug.
+        "ZH",  # Zürich.
     )
+    subdivisions_aliases = {
+        "Aargau": "AG",
+        "Appenzell Innerrhoden": "AI",
+        "Appenzell Ausserrhoden": "AR",
+        "Bern": "BE",
+        "Berne": "BE",
+        "Basel-Landschaft": "BL",
+        "Basel-Stadt": "BS",
+        "Freiburg": "FR",
+        "Fribourg": "FR",
+        "Genève": "GE",
+        "Glarus": "GL",
+        "Graubünden": "GR",
+        "Grigioni": "GR",
+        "Grischun": "GR",
+        "Jura": "JU",
+        "Luzern": "LU",
+        "Neuchâtel": "NE",
+        "Nidwalden": "NW",
+        "Obwalden": "OW",
+        "Sankt Gallen": "SG",
+        "Schaffhausen": "SH",
+        "Solothurn": "SO",
+        "Schwyz": "SZ",
+        "Thurgau": "TG",
+        "Ticino": "TI",
+        "Uri": "UR",
+        "Vaud": "VD",
+        "Valais": "VS",
+        "Wallis": "VS",
+        "Zug": "ZG",
+        "Zürich": "ZH",
+    }
     supported_categories = (HALF_DAY, OPTIONAL, PUBLIC)
     supported_languages = ("de", "en_US", "fr", "it", "uk")
-    start_year = 1801
 
     def __init__(self, *args, **kwargs):
         ChristianHolidays.__init__(self)
diff --git a/holidays/countries/tuvalu.py b/holidays/countries/tuvalu.py
index 0e59ecb7..d1e9c5f6 100644
--- a/holidays/countries/tuvalu.py
+++ b/holidays/countries/tuvalu.py
@@ -39,7 +39,10 @@ class Tuvalu(ObservedHolidayBase, ChristianHolidays, InternationalHolidays):
     default_language = "tvl"
     # %s (observed).
     observed_label = tr("%s (fakamatakuga)")
-    supported_languages = ("en_GB", "en_US", "tvl")
+    # Tuvalu became fully independent of the United Kingdom on October 1, 1978
+    # Tuvalu's PUBLIC HOLIDAYS (AMENDMENT) ACT 1990 (Act 2 of 1990)
+    # It was first proclaimed on FEB 7th, 1990
+    start_year = 1990
     subdivisions = (
         "FUN",  # Funafuti.
         "NIT",  # Niutao.
@@ -62,10 +65,7 @@ class Tuvalu(ObservedHolidayBase, ChristianHolidays, InternationalHolidays):
         "Nui": "NUI",
         "Vaitupu": "VAI",
     }
-    # Tuvalu became fully independent of the United Kingdom on October 1, 1978
-    # Tuvalu's PUBLIC HOLIDAYS (AMENDMENT) ACT 1990 (Act 2 of 1990)
-    # It was first proclaimed on FEB 7th, 1990
-    start_year = 1990
+    supported_languages = ("en_GB", "en_US", "tvl")
 
     def __init__(self, *args, **kwargs):
         ChristianHolidays.__init__(self)
diff --git a/holidays/countries/united_states.py b/holidays/countries/united_states.py
index dd0ad75b..ae775dae 100644
--- a/holidays/countries/united_states.py
+++ b/holidays/countries/united_states.py
@@ -84,8 +84,8 @@ class UnitedStates(ObservedHolidayBase, ChristianHolidays, InternationalHolidays
     """
 
     country = "US"
-    supported_categories = (GOVERNMENT, PUBLIC, UNOFFICIAL)
     observed_label = "%s (observed)"
+    start_year = 1777
     subdivisions: Union[tuple[()], tuple[str, ...]] = (
         "AK",  # Alaska.
         "AL",  # Alabama.
@@ -145,13 +145,71 @@ class UnitedStates(ObservedHolidayBase, ChristianHolidays, InternationalHolidays
         "WV",  # West Virginia.
         "WY",  # Wyoming.
     )
-
+    subdivisions_aliases = {
+        "Alaska": "AK",
+        "Alabama": "AL",
+        "Arkansas": "AR",
+        "American Samoa": "AS",
+        "Arizona": "AZ",
+        "California": "CA",
+        "Colorado": "CO",
+        "Connecticut": "CT",
+        "District of Columbia": "DC",
+        "Delaware": "DE",
+        "Florida": "FL",
+        "Georgia": "GA",
+        "Guam": "GU",
+        "Hawaii": "HI",
+        "Iowa": "IA",
+        "Idaho": "ID",
+        "Illinois": "IL",
+        "Indiana": "IN",
+        "Kansas": "KS",
+        "Kentucky": "KY",
+        "Louisiana": "LA",
+        "Massachusetts": "MA",
+        "Maryland": "MD",
+        "Maine": "ME",
+        "Michigan": "MI",
+        "Minnesota": "MN",
+        "Missouri": "MO",
+        "Northern Mariana Islands": "MP",
+        "Mississippi": "MS",
+        "Montana": "MT",
+        "North Carolina": "NC",
+        "North Dakota": "ND",
+        "Nebraska": "NE",
+        "New Hampshire": "NH",
+        "New Jersey": "NJ",
+        "New Mexico": "NM",
+        "Nevada": "NV",
+        "New York": "NY",
+        "Ohio": "OH",
+        "Oklahoma": "OK",
+        "Oregon": "OR",
+        "Pennsylvania": "PA",
+        "Puerto Rico": "PR",
+        "Rhode Island": "RI",
+        "South Carolina": "SC",
+        "South Dakota": "SD",
+        "Tennessee": "TN",
+        "Texas": "TX",
+        "United States Minor Outlying Islands": "UM",
+        "Utah": "UT",
+        "Virginia": "VA",
+        "Virgin Islands, U.S.": "VI",
+        "Vermont": "VT",
+        "Washington": "WA",
+        "Wisconsin": "WI",
+        "West Virginia": "WV",
+        "Wyoming": "WY",
+    }
+    supported_categories = (GOVERNMENT, PUBLIC, UNOFFICIAL)
     _deprecated_subdivisions = (
         "FM",
         "MH",
         "PW",
     )
-    start_year = 1777
 
     def __init__(self, *args, **kwargs):
         ChristianHolidays.__init__(self)
diff --git a/holidays/countries/united_states_minor_outlying_islands.py b/holidays/countries/united_states_minor_outlying_islands.py
index b056c8fb..0f3e2da2 100644
--- a/holidays/countries/united_states_minor_outlying_islands.py
+++ b/holidays/countries/united_states_minor_outlying_islands.py
@@ -24,6 +24,7 @@ class HolidaysUM(US):
     country = "UM"
     supported_categories = (GOVERNMENT, PUBLIC, UNOFFICIAL)
     subdivisions = ()  # Override US subdivisions.
+    subdivisions_aliases = {}  # Override US subdivisions aliases.
 
     def _populate_public_holidays(self) -> None:
         self.subdiv = "UM"
diff --git a/holidays/countries/united_states_virgin_islands.py b/holidays/countries/united_states_virgin_islands.py
index a966635c..593def93 100644
--- a/holidays/countries/united_states_virgin_islands.py
+++ b/holidays/countries/united_states_virgin_islands.py
@@ -24,6 +24,7 @@ class HolidaysVI(US):
     country = "VI"
     supported_categories = (GOVERNMENT, PUBLIC, UNOFFICIAL)
     subdivisions = ()  # Override US subdivisions.
+    subdivisions_aliases = {}  # Override US subdivisions aliases.
 
     def _populate_public_holidays(self) -> None:
         self.subdiv = "VI"


Test patch:
diff --git a/tests/test_docs.py b/tests/test_docs.py
index daf523b7..86d29c93 100644
--- a/tests/test_docs.py
+++ b/tests/test_docs.py
@@ -101,8 +101,7 @@ class TestReadme(TestCase):
             country_subdivisions_aliases[country_code] = {}
             subdivision_str = row[2]
             if subdivision_str:
-                for subdivision_groups in subdivision_str.split("."):
-                    subdivision_aliases_group = subdivision_groups.split(";")[0].strip()
+                for subdivision_aliases_group in subdivision_str.split(";"):
                     # Exclude empty subdivisions.
                     if ":" not in subdivision_aliases_group:
                         country_subdivisions[country_code] = []
@@ -119,10 +118,13 @@ class TestReadme(TestCase):
                             subdivision_aliases = subdivision_aliases_re.match(subdivision_aliases)
                             subdivision = subdivision_aliases.group(1)
                             aliases = subdivision_aliases.group(2).split(", ")
+                            # "Virgin Islands, U.S." special case.
+                            if len(aliases) == 2 and aliases[1] == "U.S.":
+                                aliases = [subdivision_aliases.group(2)]
                         else:
                             aliases = []
                             subdivision = subdivision_aliases
-                        subdivision = subdivision.strip(" *")
+                        subdivision = subdivision.strip()
 
                         country_subdivisions[country_code].append(subdivision)
                         country_subdivisions_aliases[country_code][subdivision] = aliases