6464 raise
6565
6666
67+ _LOCALE_NORMALIZATION_MAP = {"zh_TW" : "zh_Hant" , "zh_HK" : "zh_Hant" , "zh_MO" : "zh_Hant" }
68+
69+
6770def _may_fall_back_to_english (lang ):
6871 # Don't fall back to English if the requested language is among the following:
6972 # - Chinese
@@ -72,16 +75,38 @@ def _may_fall_back_to_english(lang):
7275 return lang != "zh" and lang != "ja" and lang != "ko"
7376
7477
78+ def _full_locale (lang , script , region ):
79+ if script is not None :
80+ if region is not None :
81+ return "%s_%s_%s" % (lang , script , region )
82+ else :
83+ return "%s_%s" % (lang , script )
84+ elif region is not None :
85+ return "%s_%s" % (lang , region )
86+ else :
87+ return lang
88+
89+
7590def _find_lang (langdict , lang , script , region ):
7691 """Return the entry in the dictionary for the given language information."""
77- # First look for lang, script as a combination
78- lang_script = "%s_%s" % (lang , script )
79- if lang_script in langdict :
80- return langdict [lang_script ]
92+ # Check if we should map this to a different locale.
93+ full_locale = _full_locale (lang , script , region )
94+ if (full_locale in _LOCALE_NORMALIZATION_MAP and
95+ _LOCALE_NORMALIZATION_MAP [full_locale ] in langdict ):
96+ return langdict [_LOCALE_NORMALIZATION_MAP [full_locale ]]
97+ # First look for the full locale
98+ if full_locale in langdict :
99+ return langdict [full_locale ]
100+ # Then look for lang, script as a combination
101+ if script is not None :
102+ lang_script = "%s_%s" % (lang , script )
103+ if lang_script in langdict :
104+ return langdict [lang_script ]
81105 # Next look for lang, region as a combination
82- lang_region = "%s_%s" % (lang , region )
83- if lang_region in langdict :
84- return langdict [lang_region ]
106+ if region is not None :
107+ lang_region = "%s_%s" % (lang , region )
108+ if lang_region in langdict :
109+ return langdict [lang_region ]
85110 # Fall back to bare language code lookup
86111 if lang in langdict :
87112 return langdict [lang ]
0 commit comments