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.
(self, lang_code)
| 1046 | self.cur_messages = [] |
| 1047 | |
| 1048 | def normalize_language(self, lang_code): |
| 1049 | """ |
| 1050 | Convert a locale code such as ``en_US`` or ``fr`` into a readable |
| 1051 | language name (e.g. ``English`` or ``French``). If Babel is |
| 1052 | available it is used for reliable conversion; otherwise a small |
| 1053 | built-in fallback map handles common languages. |
| 1054 | """ |
| 1055 | if not lang_code: |
| 1056 | return None |
| 1057 | |
| 1058 | if lang_code.upper() in ("C", "POSIX"): |
| 1059 | return None |
| 1060 | |
| 1061 | # Probably already a language name |
| 1062 | if ( |
| 1063 | len(lang_code) > 3 |
| 1064 | and "_" not in lang_code |
| 1065 | and "-" not in lang_code |
| 1066 | and lang_code[0].isupper() |
| 1067 | ): |
| 1068 | return lang_code |
| 1069 | |
| 1070 | # Preferred: Babel |
| 1071 | if Locale is not None: |
| 1072 | try: |
| 1073 | loc = Locale.parse(lang_code.replace("-", "_")) |
| 1074 | return loc.get_display_name("en").capitalize() |
| 1075 | except Exception: |
| 1076 | pass # Fall back to manual mapping |
| 1077 | |
| 1078 | # Simple fallback for common languages |
| 1079 | fallback = { |
| 1080 | "en": "English", |
| 1081 | "fr": "French", |
| 1082 | "es": "Spanish", |
| 1083 | "de": "German", |
| 1084 | "it": "Italian", |
| 1085 | "pt": "Portuguese", |
| 1086 | "zh": "Chinese", |
| 1087 | "ja": "Japanese", |
| 1088 | "ko": "Korean", |
| 1089 | "ru": "Russian", |
| 1090 | } |
| 1091 | primary_lang_code = lang_code.replace("-", "_").split("_")[0].lower() |
| 1092 | return fallback.get(primary_lang_code, lang_code) |
| 1093 | |
| 1094 | def get_user_language(self): |
| 1095 | """ |
no outgoing calls