|
29 | 29 | from .utils import _UiInvoker, _run_coro_async |
30 | 30 | from .dialogs import ProgressDialog, CompilationProcessDialog |
31 | 31 | from .Venv_Manager import VenvManager |
| 32 | +from .i18n import ( |
| 33 | + _apply_main_app_translations as _i18n_apply_translations, |
| 34 | + show_language_dialog as _i18n_show_dialog, |
| 35 | +) |
32 | 36 |
|
33 | 37 | # Référence globale vers l'instance GUI pour récupération du workspace par l'API_SDK |
34 | 38 | _latest_gui_instance = None |
@@ -1073,72 +1077,8 @@ def show_statistics(self): |
1073 | 1077 | current_language = "English" |
1074 | 1078 |
|
1075 | 1079 | def _apply_main_app_translations(self, tr: dict): |
1076 | | - # Utilitaires internes pour éviter les valeurs codées en dur |
1077 | | - def _set(attr: str, key: str, method: str = "setText"): |
1078 | | - try: |
1079 | | - widget = getattr(self, attr, None) |
1080 | | - value = tr.get(key) |
1081 | | - if widget is not None and value: |
1082 | | - getattr(widget, method)(value) |
1083 | | - except Exception: |
1084 | | - pass |
1085 | | - |
1086 | | - # Sidebar & main buttons |
1087 | | - _set("btn_select_folder", "select_folder") |
1088 | | - _set("btn_select_files", "select_files") |
1089 | | - _set("btn_build_all", "build_all") |
1090 | | - _set("btn_export_config", "export_config") |
1091 | | - _set("btn_import_config", "import_config") |
1092 | | - _set("btn_cancel_all", "cancel_all") |
1093 | | - _set("btn_suggest_deps", "suggest_deps") |
1094 | | - _set("btn_help", "help") |
1095 | | - _set("btn_show_stats", "show_stats") |
1096 | | - |
1097 | | - # Bouton de langue (variante System vs simple), sans valeur de secours |
1098 | | - try: |
1099 | | - if getattr(self, "select_lang", None): |
1100 | | - if ( |
1101 | | - getattr(self, "language_pref", getattr(self, "language", "System")) |
1102 | | - == "System" |
1103 | | - ): |
1104 | | - val = tr.get("choose_language_system_button") or tr.get( |
1105 | | - "choose_language_button" |
1106 | | - ) |
1107 | | - else: |
1108 | | - val = tr.get("choose_language_button") |
1109 | | - if val: |
1110 | | - self.select_lang.setText(val) |
1111 | | - except Exception: |
1112 | | - pass |
1113 | | - |
1114 | | - # Bouton de thème (variante System vs simple), sans valeur de secours |
1115 | | - try: |
1116 | | - if getattr(self, "select_theme", None): |
1117 | | - if getattr(self, "theme", "System") == "System": |
1118 | | - val = tr.get("choose_theme_system_button") or tr.get( |
1119 | | - "choose_theme_button" |
1120 | | - ) |
1121 | | - else: |
1122 | | - val = tr.get("choose_theme_button") |
1123 | | - if val: |
1124 | | - self.select_theme.setText(val) |
1125 | | - except Exception: |
1126 | | - pass |
1127 | | - |
1128 | | - # Workspace |
1129 | | - _set("venv_button", "venv_button") |
1130 | | - _set("label_workspace_section", "label_workspace_section") |
1131 | | - _set("venv_label", "venv_label") |
1132 | | - _set("label_folder", "label_folder") |
1133 | | - |
1134 | | - # Files |
1135 | | - _set("label_files_section", "label_files_section") |
1136 | | - _set("btn_remove_file", "btn_remove_file") |
1137 | | - |
1138 | | - # Logs |
1139 | | - _set("label_logs_section", "label_logs_section") |
1140 | | - |
1141 | | - # Note: Tabs are now dynamically created by engines, no static translation needed |
| 1080 | + """Apply translations to UI elements - uses centralized i18n module version.""" |
| 1081 | + _i18n_apply_translations(self, tr) |
1142 | 1082 |
|
1143 | 1083 | def apply_language(self, lang_display: str): |
1144 | 1084 | # Launch non-blocking translation loading and apply when ready |
@@ -1235,83 +1175,8 @@ def set_compilation_ui_enabled(self, enabled): |
1235 | 1175 | self.set_controls_enabled(enabled) |
1236 | 1176 |
|
1237 | 1177 | def show_language_dialog(self): |
1238 | | - from PySide6.QtWidgets import QInputDialog |
1239 | | - |
1240 | | - from .i18n import available_languages, get_translations, resolve_system_language |
1241 | | - |
1242 | | - async def _prepare(): |
1243 | | - langs = await available_languages() |
1244 | | - name_to_code = {l.get("name", l.get("code")): l.get("code") for l in langs} |
1245 | | - display = ["System"] + list(name_to_code.keys()) |
1246 | | - current = getattr( |
1247 | | - self, "language_pref", getattr(self, "language", "System") |
1248 | | - ) |
1249 | | - try: |
1250 | | - start_index = display.index(current if current in display else "System") |
1251 | | - except Exception: |
1252 | | - start_index = 0 |
1253 | | - return name_to_code, display, start_index |
1254 | | - |
1255 | | - def _after_prepared(res): |
1256 | | - if isinstance(res, Exception): |
1257 | | - try: |
1258 | | - self.log_i18n( |
1259 | | - "❌ Échec de chargement des langues disponibles.", |
1260 | | - "❌ Failed to load available languages.", |
1261 | | - ) |
1262 | | - except Exception: |
1263 | | - pass |
1264 | | - return |
1265 | | - name_to_code, display, start_index = res |
1266 | | - title = self.tr("Choisir la langue", "Choose language") |
1267 | | - label = self.tr("Langue :", "Language:") |
1268 | | - choice, ok = QInputDialog.getItem( |
1269 | | - self, title, label, display, start_index, False |
1270 | | - ) |
1271 | | - if ok and choice: |
1272 | | - if choice == "System": |
1273 | | - self.language_pref = "System" |
1274 | | - # Apply resolved system language for UI strings, but keep pref as System |
1275 | | - self.apply_language("System") |
1276 | | - if self.select_lang: |
1277 | | - |
1278 | | - async def _fetch_sys(): |
1279 | | - code = await resolve_system_language() |
1280 | | - return await get_translations(code) |
1281 | | - |
1282 | | - _run_coro_async( |
1283 | | - _fetch_sys(), |
1284 | | - lambda tr: self.select_lang.setText( |
1285 | | - tr.get("choose_language_system_button") |
1286 | | - or tr.get("select_lang") |
1287 | | - or "" |
1288 | | - ), |
1289 | | - ui_owner=self, |
1290 | | - ) |
1291 | | - else: |
1292 | | - code = name_to_code.get(choice) or choice |
1293 | | - self.language_pref = code |
1294 | | - self.apply_language(code) |
1295 | | - if self.select_lang: |
1296 | | - _run_coro_async( |
1297 | | - get_translations(code), |
1298 | | - lambda tr2: self.select_lang.setText( |
1299 | | - tr2.get("choose_language_button") |
1300 | | - or tr2.get("select_lang") |
1301 | | - or "" |
1302 | | - ), |
1303 | | - ui_owner=self, |
1304 | | - ) |
1305 | | - else: |
1306 | | - try: |
1307 | | - self.log_i18n( |
1308 | | - "Sélection de la langue annulée.", |
1309 | | - "Language selection canceled.", |
1310 | | - ) |
1311 | | - except Exception: |
1312 | | - pass |
1313 | | - |
1314 | | - _run_coro_async(_prepare(), _after_prepared, ui_owner=self) |
| 1178 | + """Show language selection dialog - uses centralized i18n module version.""" |
| 1179 | + _i18n_show_dialog(self) |
1315 | 1180 |
|
1316 | 1181 | from .deps_analyser import ( |
1317 | 1182 | _install_next_dependency, |
|
0 commit comments