diff --git a/ports/RGSX/config.py b/ports/RGSX/config.py index 32b6d8f..1a19a76 100644 --- a/ports/RGSX/config.py +++ b/ports/RGSX/config.py @@ -13,7 +13,7 @@ except Exception: pygame = None # type: ignore # Version actuelle de l'application -app_version = "2.2.2.4" +app_version = "2.2.2.5" def get_application_root(): diff --git a/ports/RGSX/display.py b/ports/RGSX/display.py index b134946..a9e0901 100644 --- a/ports/RGSX/display.py +++ b/ports/RGSX/display.py @@ -924,38 +924,44 @@ def draw_history_list(screen): progress = entry.get("progress", 0) progress = max(0, min(100, progress)) # Clamp progress between 0 and 100 + # Precompute provider prefix once + provider_prefix = entry.get("provider_prefix") or (entry.get("provider") + ":" if entry.get("provider") else "") # Compute status text (optimized version without redundant prefix for errors) if status in ["Téléchargement", "downloading"]: status_text = _("history_status_downloading").format(progress) - provider_prefix = entry.get("provider_prefix") or (entry.get("provider") + ":" if entry.get("provider") else "") + # Coerce to string and prefix provider when relevant + status_text = str(status_text or "") if provider_prefix and not status_text.startswith(provider_prefix): status_text = f"{provider_prefix} {status_text}" elif status == "Extracting": status_text = _("history_status_extracting").format(progress) - provider_prefix = entry.get("provider_prefix") or (entry.get("provider") + ":" if entry.get("provider") else "") + status_text = str(status_text or "") if provider_prefix and not status_text.startswith(provider_prefix): status_text = f"{provider_prefix} {status_text}" elif status == "Download_OK": # Completed: no provider prefix (per requirement) status_text = _("history_status_completed") + status_text = str(status_text or "") elif status == "Erreur": # Prefer friendly mapped message now stored in 'message' status_text = entry.get('message') if not status_text: # Some legacy entries might have only raw in result[1] or auxiliary field status_text = entry.get('raw_error_realdebrid') or entry.get('error') or 'Échec' + # Coerce to string early for safe operations + status_text = str(status_text or "") # Strip redundant prefixes if any for prefix in ["Erreur :", "Erreur:", "Error:", "Error :"]: if status_text.startswith(prefix): status_text = status_text[len(prefix):].strip() break - provider_prefix = entry.get("provider_prefix") or (entry.get("provider") + ":" if entry.get("provider") else "") if provider_prefix and not status_text.startswith(provider_prefix): status_text = f"{provider_prefix} {status_text}" elif status == "Canceled": status_text = _("history_status_canceled") + status_text = str(status_text or "") else: - status_text = status + status_text = str(status or "") # Determine color dedicated to status (independent from selection for better readability) if status == "Erreur": @@ -971,7 +977,7 @@ def draw_history_list(screen): platform_text = truncate_text_end(platform, config.small_font, col_platform_width - 10) game_text = truncate_text_end(game_name, config.small_font, col_game_width - 10) size_text = truncate_text_end(size_text, config.small_font, col_size_width - 10) - status_text = truncate_text_middle(status_text, config.small_font, col_status_width - 10, is_filename=False) + status_text = truncate_text_middle(str(status_text or ""), config.small_font, col_status_width - 10, is_filename=False) y_pos = rect_y + margin_top_bottom + header_height + idx * line_height + line_height // 2 platform_surface = config.small_font.render(platform_text, True, color) diff --git a/ports/RGSX/language.py b/ports/RGSX/language.py index 5728591..4f5d7f0 100644 --- a/ports/RGSX/language.py +++ b/ports/RGSX/language.py @@ -68,19 +68,29 @@ def load_language(lang_code=None): return False def get_text(key, default=None): - """Récupère la traduction correspondant à la clé.""" - if not translations: - load_language() - - if key in translations: - return translations[key] - - # Si la clé n'existe pas, retourner la valeur par défaut ou la clé elle-même - if default is not None: - return default - - logger.warning(f"Clé de traduction '{key}' non trouvée dans la langue {current_language}") - return key + """Récupère la traduction correspondant à la clé en garantissant une chaîne. + + - Ne retourne jamais None: fallback vers default (si fourni) sinon la clé. + - Si la valeur traduite n'est pas une chaîne (liste/dict/etc.), fallback similaire. + """ + try: + if not translations: + load_language() + # Valeur brute potentielle + val = translations.get(key) if isinstance(translations, dict) else None + if isinstance(val, str) and val: + return val + # Fallback: utiliser default si fourni + if isinstance(default, str) and default: + return default + # Dernier recours: retourner la clé elle-même (stringifiée) + return str(key) + except Exception as e: + try: + logger.warning(f"get_text fallback for key={key}: {e}") + except Exception: + pass + return str(default) if default is not None else str(key) def get_available_languages(): """Récupère la liste des langues disponibles."""