Refactor getting the index of a user's language (#3311)

* refactor: rename variables of tuple

* refactor: rename function argument

* refactor: use function to get index of language

* refactor: replace for-loop

* refactor: use variable

* refactor: assert values are not None

To satisfy the type checker.

* refactor: change generator expression to for-loop
This commit is contained in:
David Culley 2024-07-25 07:46:59 +02:00 committed by GitHub
parent 5c33e5ea65
commit 6c0857395f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -180,9 +180,16 @@ def set_lang(lang: str) -> None:
tr_legacyglobal.backend = weakref.ref(current_i18n) tr_legacyglobal.backend = weakref.ref(current_i18n)
def get_def_lang(lang: str | None = None) -> tuple[int, str]: def get_def_lang(user_lang: str | None = None) -> tuple[int, str]:
"""Return lang converted to name used on disk and its index, defaulting to system language """Return user_lang converted to name used on disk and its index, defaulting to system language
or English if not available.""" or English if not available."""
def get_index_of_language(wanted_locale: str) -> int | None:
for i, (_, locale_) in enumerate(langs):
if locale_ == wanted_locale:
return i
return None
try: try:
# getdefaultlocale() is deprecated since Python 3.11, but we need to keep using it as getlocale() behaves differently: https://bugs.python.org/issue38805 # getdefaultlocale() is deprecated since Python 3.11, but we need to keep using it as getlocale() behaves differently: https://bugs.python.org/issue38805
with warnings.catch_warnings(): with warnings.catch_warnings():
@ -195,25 +202,27 @@ def get_def_lang(lang: str | None = None) -> tuple[int, str]:
except: except:
# fails on osx # fails on osx
sys_lang = "en_US" sys_lang = "en_US"
user_lang = lang
if user_lang in compatMap: if user_lang in compatMap:
user_lang = compatMap[user_lang] user_lang = compatMap[user_lang]
idx = None idx = None
lang = None lang = None
en_idx = None
for preferred_lang in (user_lang, sys_lang): for preferred_lang in (user_lang, sys_lang):
for lang_idx, (name, code) in enumerate(langs): idx = get_index_of_language(preferred_lang)
if code == "en_US": is_language_supported = idx is not None
en_idx = lang_idx if is_language_supported:
if code == preferred_lang: assert preferred_lang is not None
idx = lang_idx lang = preferred_lang
lang = preferred_lang
if idx is not None:
break break
# if the specified language and the system language aren't available, revert to english # if the specified language and the system language aren't available, revert to english
if idx is None: is_preferred_language_supported = idx is not None
idx = en_idx if not is_preferred_language_supported:
lang = "en_US" lang = "en_US"
idx = get_index_of_language(lang)
is_english_supported = idx is not None
if not is_english_supported:
raise AssertionError("English is supposed to be a supported language.")
assert idx is not None and lang is not None
return (idx, lang) return (idx, lang)