11"""Phone number geocoding functionality
22
33>>> import phonenumbers
4- >>> from phonenumbers.geocoder import area_description_for_number
4+ >>> from phonenumbers.geocoder import description_for_number
55>>> from phonenumbers.util import u
66>>> gb_number = phonenumbers.parse("+442083612345", "GB")
77>>> de_number = phonenumbers.parse("0891234567", "DE")
88>>> ch_number = phonenumbers.parse("0431234567", "CH")
9- >>> str(area_description_for_number (gb_number, "en"))
9+ >>> str(description_for_number (gb_number, "en"))
1010'London'
11- >>> str(area_description_for_number (gb_number, "fr")) # fall back to English
11+ >>> str(description_for_number (gb_number, "fr")) # fall back to English
1212'London'
13- >>> str(area_description_for_number (gb_number, "en", region="GB"))
13+ >>> str(description_for_number (gb_number, "en", region="GB"))
1414'London'
15- >>> str(area_description_for_number (gb_number, "en", region="US"))
16- 'London '
17- >>> str(area_description_for_number (de_number, "en"))
15+ >>> str(description_for_number (gb_number, "en", region="US")) # fall back to country
16+ 'United Kingdom '
17+ >>> str(description_for_number (de_number, "en"))
1818'Munich'
19- >>> u('M\u00fc nchen') == area_description_for_number (de_number, "de")
19+ >>> u('M\u00fc nchen') == description_for_number (de_number, "de")
2020True
21- >>> u('Z\u00fc rich') == area_description_for_number (ch_number, "de")
21+ >>> u('Z\u00fc rich') == description_for_number (ch_number, "de")
2222True
23- >>> str(area_description_for_number (ch_number, "en"))
23+ >>> str(description_for_number (ch_number, "en"))
2424'Zurich'
25- >>> str(area_description_for_number (ch_number, "fr"))
25+ >>> str(description_for_number (ch_number, "fr"))
2626'Zurich'
27- >>> str(area_description_for_number (ch_number, "it"))
27+ >>> str(description_for_number (ch_number, "it"))
2828'Zurigo'
2929
3030"""
6666 raise
6767
6868
69+ _LOCALE_NORMALIZATION_MAP = {"zh_TW" : "zh_Hant" , "zh_HK" : "zh_Hant" , "zh_MO" : "zh_Hant" }
70+
71+
6972def _may_fall_back_to_english (lang ):
7073 # Don't fall back to English if the requested language is among the following:
7174 # - Chinese
@@ -74,16 +77,38 @@ def _may_fall_back_to_english(lang):
7477 return lang != "zh" and lang != "ja" and lang != "ko"
7578
7679
80+ def _full_locale (lang , script , region ):
81+ if script is not None :
82+ if region is not None :
83+ return "%s_%s_%s" % (lang , script , region )
84+ else :
85+ return "%s_%s" % (lang , script )
86+ elif region is not None :
87+ return "%s_%s" % (lang , region )
88+ else :
89+ return lang
90+
91+
7792def _find_lang (langdict , lang , script , region ):
7893 """Return the entry in the dictionary for the given language information."""
79- # First look for lang, script as a combination
80- lang_script = "%s_%s" % (lang , script )
81- if lang_script in langdict :
82- return langdict [lang_script ]
94+ # Check if we should map this to a different locale.
95+ full_locale = _full_locale (lang , script , region )
96+ if (full_locale in _LOCALE_NORMALIZATION_MAP and
97+ _LOCALE_NORMALIZATION_MAP [full_locale ] in langdict ):
98+ return langdict [_LOCALE_NORMALIZATION_MAP [full_locale ]]
99+ # First look for the full locale
100+ if full_locale in langdict :
101+ return langdict [full_locale ]
102+ # Then look for lang, script as a combination
103+ if script is not None :
104+ lang_script = "%s_%s" % (lang , script )
105+ if lang_script in langdict :
106+ return langdict [lang_script ]
83107 # Next look for lang, region as a combination
84- lang_region = "%s_%s" % (lang , region )
85- if lang_region in langdict :
86- return langdict [lang_region ]
108+ if region is not None :
109+ lang_region = "%s_%s" % (lang , region )
110+ if lang_region in langdict :
111+ return langdict [lang_region ]
87112 # Fall back to bare language code lookup
88113 if lang in langdict :
89114 return langdict [lang ]
@@ -94,7 +119,7 @@ def _find_lang(langdict, lang, script, region):
94119 return None
95120
96121
97- def area_description_for_number (numobj , lang , script = None , region = None ):
122+ def _area_description_for_number (numobj , lang , script = None , region = None ):
98123 """Return a text description of the area of a PhoneNumber for the given language.
99124
100125 Arguments:
@@ -199,7 +224,7 @@ def description_for_valid_number(numobj, lang, script=None, region=None):
199224 number, or an empty string if no description is available."""
200225 number_region = region_code_for_number (numobj )
201226 if region is None or region == number_region :
202- area_description = area_description_for_number (numobj , lang , script , region )
227+ area_description = _area_description_for_number (numobj , lang , script , region )
203228 if area_description != "" :
204229 return area_description
205230 else :
0 commit comments