refactor: add normalize_language and improve get_user_language to return readable names

This commit is contained in:
Paul Gauthier (aider) 2025-05-01 17:29:14 -07:00
parent 433f2908a0
commit e17c7d938c

View file

@ -1018,23 +1018,75 @@ class Coder:
]
self.cur_messages = []
def get_user_language(self):
if self.chat_language:
return self.chat_language
def normalize_language(self, lang_code):
"""
Convert a locale code such as ``en_US`` or ``fr`` into a readable
language name (e.g. ``English`` or ``French``). If Babel is
available it is used for reliable conversion; otherwise a small
built-in fallback map handles common languages.
"""
if not lang_code:
return None
# Probably already a language name
if (
len(lang_code) > 3
and "_" not in lang_code
and "-" not in lang_code
and lang_code[0].isupper()
):
return lang_code
# Preferred: Babel
if Locale is not None:
try:
loc = Locale.parse(lang_code.replace("-", "_"))
return loc.get_display_name("en").capitalize()
except Exception:
pass # Fall back to manual mapping
# Simple fallback for common languages
fallback = {
"en": "English",
"fr": "French",
"es": "Spanish",
"de": "German",
"it": "Italian",
"pt": "Portuguese",
"zh": "Chinese",
"ja": "Japanese",
"ko": "Korean",
"ru": "Russian",
}
return fallback.get(lang_code.split("_")[0].lower(), lang_code)
def get_user_language(self):
"""
Detect the user's language preference and return a human-readable
language name such as ``English``. Detection order:
1. ``self.chat_language`` if explicitly set
2. ``locale.getlocale()``
3. ``LANG`` / ``LANGUAGE`` / ``LC_ALL`` / ``LC_MESSAGES`` environment variables
"""
# Explicit override
if self.chat_language:
return self.normalize_language(self.chat_language)
# System locale
try:
lang = locale.getlocale()[0]
if lang:
return lang # Return the full language code, including country
return self.normalize_language(lang)
except Exception:
pass
pass # pragma: no cover
for env_var in ["LANG", "LANGUAGE", "LC_ALL", "LC_MESSAGES"]:
# Environment variables
for env_var in ("LANG", "LANGUAGE", "LC_ALL", "LC_MESSAGES"):
lang = os.environ.get(env_var)
if lang:
return lang.split(".")[
0
] # Return language and country, but remove encoding if present
lang = lang.split(".")[0] # Strip encoding if present
return self.normalize_language(lang)
return None