[fix] fix match_language issue to make zh-TW match to zh-Hant-TW

pybabel separates locales with underscores but we use hyphens
everywhere babel doesn't directly touch
This commit is contained in:
Marc Abonce Seguin 2021-10-04 22:44:58 -07:00
parent 09a6872e5f
commit b60a0ab04c
2 changed files with 21 additions and 3 deletions

View file

@ -380,9 +380,12 @@ def _match_language(lang_code, lang_list=[], custom_aliases={}): # pylint: disa
return lang_code return lang_code
# try to get the most likely country for this language # try to get the most likely country for this language
subtags = get_global('likely_subtags').get(lang_code) subtags = get_global('likely_subtags').get(lang_code.replace('-', '_'))
if subtags: if subtags:
subtag_parts = subtags.split('_') subtags = subtags.replace('_', '-')
if subtags in lang_list:
return subtags
subtag_parts = subtags.split('-')
new_code = subtag_parts[0] + '-' + subtag_parts[-1] new_code = subtag_parts[0] + '-' + subtag_parts[-1]
if new_code in custom_aliases: if new_code in custom_aliases:
new_code = custom_aliases[new_code] new_code = custom_aliases[new_code]
@ -403,6 +406,12 @@ def match_language(locale_code, lang_list=[], custom_aliases={}, fallback='en-US
locale_parts = locale_code.split('-') locale_parts = locale_code.split('-')
lang_code = locale_parts[0] lang_code = locale_parts[0]
# if locale_code has script, try matching without it
if len(locale_parts) > 2:
language = _match_language(lang_code + '-' + locale_parts[-1], lang_list, custom_aliases)
if language:
return language
# try to get language using an equivalent country code # try to get language using an equivalent country code
if len(locale_parts) > 1: if len(locale_parts) > 1:
country_alias = get_global('territory_aliases').get(locale_parts[-1]) country_alias = get_global('territory_aliases').get(locale_parts[-1])
@ -412,8 +421,9 @@ def match_language(locale_code, lang_list=[], custom_aliases={}, fallback='en-US
return language return language
# try to get language using an equivalent language code # try to get language using an equivalent language code
alias = get_global('language_aliases').get(lang_code) alias = get_global('language_aliases').get(lang_code.replace('-', '_'))
if alias: if alias:
alias = alias.replace('_', '-')
language = _match_language(alias, lang_list, custom_aliases) language = _match_language(alias, lang_list, custom_aliases)
if language: if language:
return language return language

View file

@ -92,6 +92,14 @@ class TestUtils(SearxTestCase):
self.assertEqual(utils.match_language('es', [], fallback='fallback'), 'fallback') self.assertEqual(utils.match_language('es', [], fallback='fallback'), 'fallback')
self.assertEqual(utils.match_language('ja', ['jp'], {'ja': 'jp'}), 'jp') self.assertEqual(utils.match_language('ja', ['jp'], {'ja': 'jp'}), 'jp')
# handle script tags
self.assertEqual(utils.match_language('zh-CN', ['zh-Hans-CN', 'zh-Hant-TW']), 'zh-Hans-CN')
self.assertEqual(utils.match_language('zh-TW', ['zh-Hans-CN', 'zh-Hant-TW']), 'zh-Hant-TW')
self.assertEqual(utils.match_language('zh-Hans-CN', ['zh-CN', 'zh-TW']), 'zh-CN')
self.assertEqual(utils.match_language('zh-Hant-TW', ['zh-CN', 'zh-TW']), 'zh-TW')
self.assertEqual(utils.match_language('zh-Hans', ['zh-CN', 'zh-TW', 'zh-HK']), 'zh-CN')
self.assertEqual(utils.match_language('zh-Hant', ['zh-CN', 'zh-TW', 'zh-HK']), 'zh-TW')
aliases = {'en-GB': 'en-UK', 'he': 'iw'} aliases = {'en-GB': 'en-UK', 'he': 'iw'}
# guess country # guess country