2424if TYPE_CHECKING :
2525 from typing_extensions import Literal , TypeAlias
2626
27+ from babel import dates , numbers
28+
2729 _GLOBAL_KEY : TypeAlias = Literal [
2830 "all_currencies" ,
2931 "currency_fractions" ,
@@ -306,7 +308,7 @@ def parse(
306308 there is a locale ``en`` that can exist
307309 by itself.
308310 :raise `ValueError`: if the string does not appear to be a valid locale
309- identifier
311+ identifier or ``None`` is passed
310312 :raise `UnknownLocaleError`: if no locale data is available for the
311313 requested locale
312314 :raise `TypeError`: if the identifier is not a string or a `Locale`
@@ -423,7 +425,7 @@ def __str__(self) -> str:
423425 self .modifier ))
424426
425427 @property
426- def _data (self ) -> localedata .LocaleDataDict :
428+ def _data (self ) -> localedata .LocaleDataDict [ str , Any ] :
427429 if self .__data is None :
428430 self .__data = localedata .LocaleDataDict (localedata .load (str (self )))
429431 return self .__data
@@ -541,7 +543,7 @@ def english_name(self) -> str | None:
541543 # { General Locale Display Names
542544
543545 @property
544- def languages (self ) -> localedata .LocaleDataDict :
546+ def languages (self ) -> localedata .LocaleDataDict [ str , str ] :
545547 """Mapping of language codes to translated language names.
546548
547549 >>> Locale('de', 'DE').languages['ja']
@@ -553,7 +555,7 @@ def languages(self) -> localedata.LocaleDataDict:
553555 return self ._data ['languages' ]
554556
555557 @property
556- def scripts (self ) -> localedata .LocaleDataDict :
558+ def scripts (self ) -> localedata .LocaleDataDict [ str , str ] :
557559 """Mapping of script codes to translated script names.
558560
559561 >>> Locale('en', 'US').scripts['Hira']
@@ -565,7 +567,7 @@ def scripts(self) -> localedata.LocaleDataDict:
565567 return self ._data ['scripts' ]
566568
567569 @property
568- def territories (self ) -> localedata .LocaleDataDict :
570+ def territories (self ) -> localedata .LocaleDataDict [ str , str ] :
569571 """Mapping of script codes to translated script names.
570572
571573 >>> Locale('es', 'CO').territories['DE']
@@ -577,7 +579,7 @@ def territories(self) -> localedata.LocaleDataDict:
577579 return self ._data ['territories' ]
578580
579581 @property
580- def variants (self ) -> localedata .LocaleDataDict :
582+ def variants (self ) -> localedata .LocaleDataDict [ str , str ] :
581583 """Mapping of script codes to translated script names.
582584
583585 >>> Locale('de', 'DE').variants['1901']
@@ -588,7 +590,7 @@ def variants(self) -> localedata.LocaleDataDict:
588590 # { Number Formatting
589591
590592 @property
591- def currencies (self ) -> localedata .LocaleDataDict :
593+ def currencies (self ) -> localedata .LocaleDataDict [ str , str ] :
592594 """Mapping of currency codes to translated currency names. This
593595 only returns the generic form of the currency name, not the count
594596 specific one. If an actual number is requested use the
@@ -602,7 +604,7 @@ def currencies(self) -> localedata.LocaleDataDict:
602604 return self ._data ['currency_names' ]
603605
604606 @property
605- def currency_symbols (self ) -> localedata .LocaleDataDict :
607+ def currency_symbols (self ) -> localedata .LocaleDataDict [ str , str ] :
606608 """Mapping of currency codes to symbols.
607609
608610 >>> Locale('en', 'US').currency_symbols['USD']
@@ -613,7 +615,7 @@ def currency_symbols(self) -> localedata.LocaleDataDict:
613615 return self ._data ['currency_symbols' ]
614616
615617 @property
616- def number_symbols (self ) -> localedata .LocaleDataDict :
618+ def number_symbols (self ) -> localedata .LocaleDataDict [ str , str ] :
617619 """Symbols used in number formatting.
618620
619621 .. note:: The format of the value returned may change between
@@ -625,7 +627,7 @@ def number_symbols(self) -> localedata.LocaleDataDict:
625627 return self ._data ['number_symbols' ]
626628
627629 @property
628- def decimal_formats (self ) -> localedata .LocaleDataDict :
630+ def decimal_formats (self ) -> localedata .LocaleDataDict [ str | None , numbers . NumberPattern ] :
629631 """Locale patterns for decimal number formatting.
630632
631633 .. note:: The format of the value returned may change between
@@ -637,7 +639,11 @@ def decimal_formats(self) -> localedata.LocaleDataDict:
637639 return self ._data ['decimal_formats' ]
638640
639641 @property
640- def compact_decimal_formats (self ) -> localedata .LocaleDataDict :
642+ def compact_decimal_formats (
643+ self
644+ ) -> localedata .LocaleDataDict [
645+ str , localedata .LocaleDataDict [str , localedata .LocaleDataDict [str , numbers .NumberPattern ]]
646+ ]:
641647 """Locale patterns for compact decimal number formatting.
642648
643649 .. note:: The format of the value returned may change between
@@ -649,7 +655,7 @@ def compact_decimal_formats(self) -> localedata.LocaleDataDict:
649655 return self ._data ['compact_decimal_formats' ]
650656
651657 @property
652- def currency_formats (self ) -> localedata .LocaleDataDict :
658+ def currency_formats (self ) -> localedata .LocaleDataDict [ str , numbers . NumberPattern ] :
653659 """Locale patterns for currency number formatting.
654660
655661 .. note:: The format of the value returned may change between
@@ -663,7 +669,11 @@ def currency_formats(self) -> localedata.LocaleDataDict:
663669 return self ._data ['currency_formats' ]
664670
665671 @property
666- def compact_currency_formats (self ) -> localedata .LocaleDataDict :
672+ def compact_currency_formats (
673+ self
674+ ) -> localedata .LocaleDataDict [
675+ str , localedata .LocaleDataDict [str , localedata .LocaleDataDict [str , numbers .NumberPattern ]]
676+ ]:
667677 """Locale patterns for compact currency number formatting.
668678
669679 .. note:: The format of the value returned may change between
@@ -675,7 +685,7 @@ def compact_currency_formats(self) -> localedata.LocaleDataDict:
675685 return self ._data ['compact_currency_formats' ]
676686
677687 @property
678- def percent_formats (self ) -> localedata .LocaleDataDict :
688+ def percent_formats (self ) -> localedata .LocaleDataDict [ str | None , numbers . NumberPattern ] :
679689 """Locale patterns for percent number formatting.
680690
681691 .. note:: The format of the value returned may change between
@@ -687,7 +697,7 @@ def percent_formats(self) -> localedata.LocaleDataDict:
687697 return self ._data ['percent_formats' ]
688698
689699 @property
690- def scientific_formats (self ) -> localedata .LocaleDataDict :
700+ def scientific_formats (self ) -> localedata .LocaleDataDict [ str | None , numbers . NumberPattern ] :
691701 """Locale patterns for scientific number formatting.
692702
693703 .. note:: The format of the value returned may change between
@@ -701,7 +711,7 @@ def scientific_formats(self) -> localedata.LocaleDataDict:
701711 # { Calendar Information and Date Formatting
702712
703713 @property
704- def periods (self ) -> localedata .LocaleDataDict :
714+ def periods (self ) -> localedata .LocaleDataDict [ str , str ] :
705715 """Locale display names for day periods (AM/PM).
706716
707717 >>> Locale('en', 'US').periods['am']
@@ -713,21 +723,31 @@ def periods(self) -> localedata.LocaleDataDict:
713723 return localedata .LocaleDataDict ({}) # pragma: no cover
714724
715725 @property
716- def day_periods (self ) -> localedata .LocaleDataDict :
726+ def day_periods (
727+ self
728+ ) -> localedata .LocaleDataDict [
729+ str , localedata .LocaleDataDict [str , localedata .LocaleDataDict [str , str ]]
730+ ]:
717731 """Locale display names for various day periods (not necessarily only AM/PM).
718732
719733 These are not meant to be used without the relevant `day_period_rules`.
720734 """
721735 return self ._data ['day_periods' ]
722736
723737 @property
724- def day_period_rules (self ) -> localedata .LocaleDataDict :
738+ def day_period_rules (
739+ self
740+ ) -> localedata .LocaleDataDict [str | None , localedata .LocaleDataDict [str , str ]]:
725741 """Day period rules for the locale. Used by `get_period_id`.
726742 """
727743 return self ._data .get ('day_period_rules' , localedata .LocaleDataDict ({}))
728744
729745 @property
730- def days (self ) -> localedata .LocaleDataDict :
746+ def days (
747+ self
748+ ) -> localedata .LocaleDataDict [
749+ str , localedata .LocaleDataDict [str , localedata .LocaleDataDict [int , str ]]
750+ ]:
731751 """Locale display names for weekdays.
732752
733753 >>> Locale('de', 'DE').days['format']['wide'][3]
@@ -736,7 +756,11 @@ def days(self) -> localedata.LocaleDataDict:
736756 return self ._data ['days' ]
737757
738758 @property
739- def months (self ) -> localedata .LocaleDataDict :
759+ def months (
760+ self
761+ ) -> localedata .LocaleDataDict [
762+ str , localedata .LocaleDataDict [str , localedata .LocaleDataDict [int , str ]]
763+ ]:
740764 """Locale display names for months.
741765
742766 >>> Locale('de', 'DE').months['format']['wide'][10]
@@ -745,7 +769,11 @@ def months(self) -> localedata.LocaleDataDict:
745769 return self ._data ['months' ]
746770
747771 @property
748- def quarters (self ) -> localedata .LocaleDataDict :
772+ def quarters (
773+ self
774+ ) -> localedata .LocaleDataDict [
775+ str , localedata .LocaleDataDict [str , localedata .LocaleDataDict [int , str ]]
776+ ]:
749777 """Locale display names for quarters.
750778
751779 >>> Locale('de', 'DE').quarters['format']['wide'][1]
@@ -754,7 +782,7 @@ def quarters(self) -> localedata.LocaleDataDict:
754782 return self ._data ['quarters' ]
755783
756784 @property
757- def eras (self ) -> localedata .LocaleDataDict :
785+ def eras (self ) -> localedata .LocaleDataDict [ str , localedata . LocaleDataDict [ int , str ]] :
758786 """Locale display names for eras.
759787
760788 .. note:: The format of the value returned may change between
@@ -768,7 +796,11 @@ def eras(self) -> localedata.LocaleDataDict:
768796 return self ._data ['eras' ]
769797
770798 @property
771- def time_zones (self ) -> localedata .LocaleDataDict :
799+ def time_zones (
800+ self
801+ ) -> localedata .LocaleDataDict [
802+ str , localedata .LocaleDataDict [str , localedata .LocaleDataDict [str , str ]]
803+ ]:
772804 """Locale display names for time zones.
773805
774806 .. note:: The format of the value returned may change between
@@ -782,7 +814,11 @@ def time_zones(self) -> localedata.LocaleDataDict:
782814 return self ._data ['time_zones' ]
783815
784816 @property
785- def meta_zones (self ) -> localedata .LocaleDataDict :
817+ def meta_zones (
818+ self
819+ ) -> localedata .LocaleDataDict [
820+ str , localedata .LocaleDataDict [str , localedata .LocaleDataDict [str , str ]]
821+ ]:
786822 """Locale display names for meta time zones.
787823
788824 Meta time zones are basically groups of different Olson time zones that
@@ -799,7 +835,7 @@ def meta_zones(self) -> localedata.LocaleDataDict:
799835 return self ._data ['meta_zones' ]
800836
801837 @property
802- def zone_formats (self ) -> localedata .LocaleDataDict :
838+ def zone_formats (self ) -> localedata .LocaleDataDict [ str , str ] :
803839 """Patterns related to the formatting of time zones.
804840
805841 .. note:: The format of the value returned may change between
@@ -854,7 +890,7 @@ def min_week_days(self) -> int:
854890 return self ._data ['week_data' ]['min_days' ]
855891
856892 @property
857- def date_formats (self ) -> localedata .LocaleDataDict :
893+ def date_formats (self ) -> localedata .LocaleDataDict [ str , dates . DateTimePattern ] :
858894 """Locale patterns for date formatting.
859895
860896 .. note:: The format of the value returned may change between
@@ -868,7 +904,7 @@ def date_formats(self) -> localedata.LocaleDataDict:
868904 return self ._data ['date_formats' ]
869905
870906 @property
871- def time_formats (self ) -> localedata .LocaleDataDict :
907+ def time_formats (self ) -> localedata .LocaleDataDict [ str , dates . DateTimePattern ] :
872908 """Locale patterns for time formatting.
873909
874910 .. note:: The format of the value returned may change between
@@ -882,7 +918,7 @@ def time_formats(self) -> localedata.LocaleDataDict:
882918 return self ._data ['time_formats' ]
883919
884920 @property
885- def datetime_formats (self ) -> localedata .LocaleDataDict :
921+ def datetime_formats (self ) -> localedata .LocaleDataDict [ str , str ] :
886922 """Locale patterns for datetime formatting.
887923
888924 .. note:: The format of the value returned may change between
@@ -896,7 +932,7 @@ def datetime_formats(self) -> localedata.LocaleDataDict:
896932 return self ._data ['datetime_formats' ]
897933
898934 @property
899- def datetime_skeletons (self ) -> localedata .LocaleDataDict :
935+ def datetime_skeletons (self ) -> localedata .LocaleDataDict [ str , dates . DateTimePattern ] :
900936 """Locale patterns for formatting parts of a datetime.
901937
902938 >>> Locale('en').datetime_skeletons['MEd']
@@ -909,7 +945,9 @@ def datetime_skeletons(self) -> localedata.LocaleDataDict:
909945 return self ._data ['datetime_skeletons' ]
910946
911947 @property
912- def interval_formats (self ) -> localedata .LocaleDataDict :
948+ def interval_formats (
949+ self
950+ ) -> localedata .LocaleDataDict [str | None , str | localedata .LocaleDataDict [str , list [str ]]]:
913951 """Locale patterns for interval formatting.
914952
915953 .. note:: The format of the value returned may change between
@@ -946,7 +984,7 @@ def plural_form(self) -> PluralRule:
946984 return self ._data .get ('plural_form' , _default_plural_rule )
947985
948986 @property
949- def list_patterns (self ) -> localedata .LocaleDataDict :
987+ def list_patterns (self ) -> localedata .LocaleDataDict [ str , localedata . LocaleDataDict [ str , str ]] :
950988 """Patterns for generating lists
951989
952990 .. note:: The format of the value returned may change between
@@ -979,7 +1017,7 @@ def ordinal_form(self) -> PluralRule:
9791017 return self ._data .get ('ordinal_form' , _default_plural_rule )
9801018
9811019 @property
982- def measurement_systems (self ) -> localedata .LocaleDataDict :
1020+ def measurement_systems (self ) -> localedata .LocaleDataDict [ str , str ] :
9831021 """Localized names for various measurement systems.
9841022
9851023 >>> Locale('fr', 'FR').measurement_systems['US']
@@ -1013,7 +1051,9 @@ def text_direction(self) -> str:
10131051 return '' .join (word [0 ] for word in self .character_order .split ('-' ))
10141052
10151053 @property
1016- def unit_display_names (self ) -> localedata .LocaleDataDict :
1054+ def unit_display_names (
1055+ self
1056+ ) -> localedata .LocaleDataDict [str , localedata .LocaleDataDict [str , str ]]:
10171057 """Display names for units of measurement.
10181058
10191059 .. seealso::
0 commit comments