mirror of
https://github.com/Aider-AI/aider.git
synced 2025-05-30 09:14:59 +00:00
refactor: add normalize_language and improve get_user_language to return readable names
This commit is contained in:
parent
433f2908a0
commit
e17c7d938c
1 changed files with 61 additions and 9 deletions
|
@ -1018,23 +1018,75 @@ class Coder:
|
||||||
]
|
]
|
||||||
self.cur_messages = []
|
self.cur_messages = []
|
||||||
|
|
||||||
def get_user_language(self):
|
def normalize_language(self, lang_code):
|
||||||
if self.chat_language:
|
"""
|
||||||
return self.chat_language
|
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:
|
try:
|
||||||
lang = locale.getlocale()[0]
|
lang = locale.getlocale()[0]
|
||||||
if lang:
|
if lang:
|
||||||
return lang # Return the full language code, including country
|
return self.normalize_language(lang)
|
||||||
except Exception:
|
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)
|
lang = os.environ.get(env_var)
|
||||||
if lang:
|
if lang:
|
||||||
return lang.split(".")[
|
lang = lang.split(".")[0] # Strip encoding if present
|
||||||
0
|
return self.normalize_language(lang)
|
||||||
] # Return language and country, but remove encoding if present
|
|
||||||
|
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue