diff --git a/aider/coders/base_coder.py b/aider/coders/base_coder.py index 855f34e8a..a9cd778bc 100755 --- a/aider/coders/base_coder.py +++ b/aider/coders/base_coder.py @@ -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