{
  "account_default_name": "Utilisateur",
  "account_frame_title": "👤 Compte utilisateur",
  "account_login": "Connexion",
  "account_logout": "Déconnexion",
  "account_status_guest": "Mode invité - aucune authentification active",
  "account_status_user": "Connecté en tant que {user}",
  "account_switch": "Changer d'utilisateur",
  "all_files": "Tous les fichiers",
  "api": {
    "auth_bypass_detected": {
      "description": "L'endpoint API {endpoint} peut être contourné en utilisant l'en-tête {header}",
      "evidence": "Statut changé de {normal_status} à {bypass_status}",
      "impact": "Le contournement d'authentification peut permettre un accès API non autorisé.",
      "remediation": "Examinez la logique d'authentification et assurez-vous qu'elle ne peut pas être contournée avec des en-têtes falsifiés.",
      "title": "Contournement d'authentification potentiel via en-têtes"
    },
    "dangerous_methods": {
      "description": "L'endpoint API {endpoint} autorise les méthodes : {methods}",
      "evidence": "En-tête Allow : {allowed_methods}",
      "impact": "Les méthodes HTTP inutiles peuvent fournir une surface d'attaque supplémentaire.",
      "remediation": "Restreignez les méthodes HTTP à celles uniquement requises pour la fonctionnalité API.",
      "title": "Méthodes HTTP potentiellement dangereuses autorisées"
    },
    "endpoint_unreachable": {
      "description": "Impossible d'analyser l'endpoint API {endpoint} : {error}",
      "evidence": "Endpoint : {url}",
      "remediation": "Vérifiez la disponibilité de l'API et la connectivité réseau.",
      "title": "Endpoint API {endpoint} inaccessible"
    },
    "invasive_mode_required": {
      "description": "L'analyse de sécurité API requiert le paramètre --allow-invasive pour une détection approfondie.",
      "impact": "Limité à la découverte basique des endpoints.",
      "remediation": "Relancez le scan avec --allow-invasive si vous disposez de l'autorisation pour des tests actifs.",
      "title": "L'analyse API nécessite le mode invasif"
    },
    "multiple_versions": {
      "description": "Multiples versions d'API trouvées : {versions}",
      "evidence": "Versions accessibles : {accessible_versions}",
      "impact": "Les anciennes versions d'API peuvent avoir des vulnérabilités non corrigées.",
      "remediation": "Assurez-vous que les anciennes versions d'API sont correctement dépréciées et sécurisées.",
      "title": "Multiples versions d'API accessibles"
    },
    "no_rate_limiting": {
      "description": "L'endpoint API {endpoint} ne montre aucun en-tête de limitation de débit",
      "evidence": "En-têtes X-Rate-Limit-* manquants",
      "impact": "Les APIs non protégées peuvent être sujettes à l'abus et aux attaques DoS.",
      "remediation": "Implémentez la limitation de débit API pour prévenir l'abus.",
      "title": "Aucun en-tête de limitation de débit détecté"
    },
    "no_rate_limiting_detected": {
      "description": "L'endpoint API {endpoint} n'a pas appliqué de limitation de débit aux requêtes rapides",
      "evidence": "5 requêtes rapides ont toutes retourné les codes de statut : {responses}",
      "impact": "Les APIs non protégées sont vulnérables à l'abus et aux attaques DoS.",
      "remediation": "Implémentez la limitation de débit pour prévenir l'abus d'API.",
      "title": "Aucune limitation de débit détectée sur l'API"
    },
    "permissive_cors": {
      "description": "L'endpoint API {endpoint} autorise les requêtes depuis n'importe quelle origine",
      "evidence": "Access-Control-Allow-Origin : *",
      "impact": "Peut permettre l'abus d'API cross-origin et le vol de données.",
      "remediation": "Configurez CORS pour n'autoriser que les origines de confiance pour les endpoints API.",
      "title": "CORS permissif sur l'endpoint API"
    },
    "sensitive_data_exposure": {
      "description": "L'endpoint API {endpoint} peut exposer des informations {pattern_name}",
      "evidence": "Motif '{pattern}' trouvé dans la réponse",
      "impact": "L'exposition d'informations sensibles peut mener à une compromission de sécurité.",
      "remediation": "Examinez les réponses API et filtrez les données sensibles avant de les retourner aux clients.",
      "title": "Exposition potentielle de {pattern_name} dans l'API"
    },
    "unauthenticated_access": {
      "description": "L'endpoint API {endpoint} retourne des données sans authentification",
      "evidence": "HTTP {status} sans en-tête Authorization",
      "impact": "L'accès API non authentifié peut exposer des données sensibles.",
      "remediation": "Implémentez l'authentification API (clés API, OAuth, tokens JWT).",
      "title": "Endpoint API accessible sans authentification"
    },
    "verbose_errors": {
      "description": "L'endpoint API {endpoint} retourne des informations d'erreur détaillées",
      "evidence": "La réponse d'erreur contient des détails techniques",
      "impact": "Les messages d'erreur détaillés peuvent aider les attaquants dans la reconnaissance.",
      "remediation": "Implémentez des messages d'erreur génériques et loggez les erreurs détaillées côté serveur.",
      "title": "Messages d'erreur API verbeux"
    }
  },
  "app_title": "Web Sentinel - Scanner de Sécurité",
  "attention_title": "Attention",
  "auth_guest_mode": "Mode invité (FREE)",
  "auth_login_button": "Se connecter",
  "auth_login_email": "Adresse email :",
  "auth_login_forgot": "Mot de passe oublié ?",
  "auth_login_local": "Créer un compte local",
  "auth_login_offline": "Mode hors ligne",
  "auth_login_password": "Mot de passe :",
  "auth_login_remember": "Se souvenir de moi",
  "auth_login_signup": "Créer un compte cloud",
  "auth_login_title": "Connexion Web Sentinel",
  "auth_logout_button": "Déconnexion",
  "auth_logout_confirm": "Voulez-vous vraiment vous déconnecter ?",
  "auth_logout_success": "Vous êtes maintenant en mode invité (FREE).",
  "auth_user_welcome": "Bienvenue {} !",
  "backend": {
    "actuator_details_exposed": {
      "description": "L'endpoint de santé Spring Boot Actuator révèle des détails internes du système",
      "evidence": "Informations de santé détaillées à : {url}",
      "impact": "Les informations internes du système peuvent aider dans la reconnaissance.",
      "remediation": "Configurez management.endpoint.health.show-details=when-authorized",
      "title": "Endpoint de santé détaillé exposé"
    },
    "analysis_requires_invasive": {
      "description": "L'analyse des configurations backend nécessite le flag --allow-invasive pour une détection améliorée.",
      "impact": "Limité à l'analyse des réponses HTTP uniquement.",
      "remediation": "Lancez le scan avec --allow-invasive si vous avez un accès légitime à l'application.",
      "title": "L'analyse backend nécessite le mode invasif"
    },
    "config_file_exposed": {
      "description": "Le fichier de configuration {endpoint} est accessible publiquement",
      "evidence": "Accessible à : {url}",
      "impact": "Les fichiers de configuration peuvent contenir des informations sensibles.",
      "remediation": "Restreignez l'accès aux fichiers de configuration via la configuration du serveur web.",
      "title": "Fichier de configuration sensible exposé"
    },
    "dev_tool_accessible": {
      "description": "L'endpoint de développement {endpoint} est accessible en production",
      "evidence": "Accessible à : {url}",
      "impact": "Les outils de développement peuvent exposer des données et fonctionnalités sensibles de l'application.",
      "remediation": "Désactivez les outils de développement et les interfaces de débogage en environnement de production.",
      "title": "Outil de développement accessible en production"
    },
    "permissive_cors": {
      "description": "CORS autorise les requêtes depuis {origin}",
      "evidence": "Access-Control-Allow-Origin : {cors_origin}",
      "impact": "Un CORS permissif peut permettre des attaques cross-origin.",
      "remediation": "Configurez CORS pour n'autoriser que les origines de confiance.",
      "title": "Configuration CORS permissive détectée"
    },
    "security_txt_found": {
      "description": "Informations de politique de sécurité disponibles à {endpoint}",
      "evidence": "Accessible à : {url}",
      "remediation": "Examinez security.txt pour les informations de contact et les politiques.",
      "title": "Fichier Security.txt trouvé"
    },
    "verbose_error_pages": {
      "description": "Les pages d'erreur révèlent des traces de pile ou des informations de débogage",
      "evidence": "Erreur verbeuse à : {url}",
      "impact": "Les informations de débogage peuvent révéler la structure de l'application et les vulnérabilités.",
      "remediation": "Configurez des pages d'erreur personnalisées et désactivez le mode débogage en production.",
      "title": "Pages d'erreur verbeuses détectées"
    }
  },
  "brand_title": "🛡️ Web Sentinel",
  "brand_title_caps": "🛡️ WEB SENTINEL",
  "btn_clear": "🗑️ Effacer",
  "btn_close": "Fermer",
  "btn_details": "Détails",
  "btn_export": "📊 Exporter rapport",
  "btn_load": "📁 Charger",
  "btn_save": "💾 Sauver",
  "btn_start_scan": "🚀 Lancer le scan",
  "btn_stop_scan": "⏹️ Arrêter",
  "clear_domains_hint": "Effacer tous les domaines",
  "cli_arg_allow_invasive": "Active les sondes actives pour les tests d'injection.",
  "cli_arg_domain": "Nom d'hôte de la cible (ex. example.com)",
  "cli_arg_history_file": "Chemin pour stocker l'historique des scans (défaut : {default}).",
  "cli_arg_html_report": "Enregistre un rapport HTML vers le chemin fourni.",
  "cli_arg_http_port": "Port HTTP (défaut : {default})",
  "cli_arg_https_port": "Port HTTPS (défaut : {default})",
  "cli_arg_json": "Affiche les constats au format JSON au lieu d'un tableau.",
  "cli_arg_json_report": "Enregistre le contexte complet du rapport dans le fichier JSON fourni.",
  "cli_arg_language": "Langue de sortie CLI (défaut : {default}).",
  "cli_arg_log_file": "Chemin du fichier de logs (défaut : {default}).",
  "cli_arg_modules": "Liste des modules à exécuter (défaut : tous).",
  "cli_arg_no_history": "Désactive la persistance de l'historique des scans.",
  "cli_arg_timeout": "Timeout réseau en secondes pour les requêtes sortantes (défaut : {default})",
  "cli_description": "Diagnostics de sécurité passifs pour vos sites autorisés.",
  "cli_html_not_allowed": "❌ Export HTML non autorisé par votre licence.",
  "cli_html_saved": "Rapport HTML enregistré dans {}",
  "cli_invasive_not_allowed": "❌ Tests invasifs non autorisés par votre licence. Mode invasif désactivé.",
  "cli_json_saved": "Rapport JSON enregistré dans {}",
  "cli_license_fallback": "⚠️ Mode dégradé : licence non trouvée, fonctionnalités limitées.",
  "cli_license_loaded": "✅ Licence chargée (tier : {}).",
  "cli_unknown_modules_warning": "Modules inconnus ignorés : {}",
  "col_action": "Action",
  "col_domain": "🌐 Domaine",
  "col_impact": "💥 Impact",
  "col_module": "🔧 Module",
  "col_severity": "⚠️ Sévérité",
  "col_status": "📊 Status",
  "col_title": "📝 Titre",
  "config_title": "⚙️ Configuration & Compte",
  "confirm_clear": "Effacer tous les domaines ?",
  "confirm_title": "Confirmation",
  "connection_offline": "🌐 Hors ligne",
  "connection_online": "🌐 Connecté",
  "control_section": "🎮 Contrôles",
  "cookie_insecure": "Cookie non sécurisé détecté: {}",
  "detail_code": "Code",
  "detail_description": "Description",
  "detail_file": "Fichier",
  "detail_remediation": "Correction recommandée",
  "detected": "Détecté",
  "dialog_export_ai": "Exporter pour Agent IA (correction automatique)",
  "dialog_export_results_html": "Exporter les résultats en HTML",
  "dialog_export_results_json": "Exporter les résultats en JSON",
  "dialog_export_sast_html": "Exporter les résultats SAST en HTML",
  "dialog_export_sast_json": "Exporter les résultats SAST en JSON",
  "dialog_select_files": "Sélectionner les fichiers source",
  "dialog_select_folder": "Sélectionner un dossier à analyser",
  "domain_clear_button": "🧹 Vider",
  "domain_completed": "Scan de {} terminé",
  "domain_config_frame": "🎯 Configuration du Scan",
  "domain_export_ai": "🤖 Export Agent IA",
  "domain_export_clear": "🧹 Effacer",
  "domain_export_html": "🌐 Export HTML",
  "domain_export_json": "💾 Export JSON",
  "domain_history_option": "📚 Enregistrer dans l'historique",
  "domain_input_label": "🌐 Domaine ou URL:",
  "domain_invasive_option": "🔍 Mode invasif",
  "domain_invasive_warning": "Les tests invasifs sont réservés aux licences PRO et supérieures.",
  "domain_limit_body": "Votre licence permet de scanner jusqu'à {limit} domaine(s) simultanément.",
  "domain_limit_title": "Limite atteinte",
  "domain_list_label": "📋 Domaines à scanner:",
  "domain_missing_body": "Veuillez ajouter au moins un domaine à scanner.",
  "domain_no_findings": "   ✅ Aucun problème détecté",
  "domain_options_frame": "🔧 Options de Scan",
  "domain_remove_button": "🗑️ Supprimer",
  "domain_result_code": "     ↳ Code: {code}",
  "domain_result_description": "     ↳ Description: {description}",
  "domain_result_detail_line": "   • [{severity}] {title} ({module})",
  "domain_result_file": "     ↳ Fichier: {location}",
  "domain_result_header": "🌐 {domain}\n   ➤ Résumé: {summary}",
  "domain_result_line": "   • [{severity}] {title} ({module})",
  "domain_result_remediation": "     ↳ Correction recommandée: {remediation}",
  "domain_results_frame": "📋 Résultats du Scan",
  "domain_scan_button": "🚀 Lancer le Scan",
  "domain_scan_error": "Le scan a échoué : {error}",
  "domain_scan_running_body": "Veuillez patienter, un scan est déjà en cours.",
  "domain_scan_running_title": "Scan en cours",
  "domains_hint": "Entrez vos domaines (un par ligne):\nexemple.com\nmonsite.fr\napi.monapp.com",
  "domains_section": "🌐 Domaines à scanner",
  "error_access_denied_body": "Votre licence ne permet pas d'utiliser le module SAST.",
  "error_access_denied_title": "Accès refusé",
  "error_export_failed": "Impossible d'exporter le rapport:",
  "error_folder_invalid": "{path} n'est pas un dossier valide.",
  "error_folder_missing": "Le dossier {path} n'existe pas.",
  "error_load_failed": "Impossible de charger le fichier:",
  "error_no_domains": "Veuillez entrer au moins un domaine.",
  "error_no_modules": "Veuillez sélectionner au moins un module.",
  "error_sast_failed": "Analyse SAST échouée : {error}",
  "error_save_failed": "Impossible de sauvegarder le fichier:",
  "error_scan_failed": "Erreur lors du scan:",
  "error_title": "Erreur",
  "export_ai_btn": "🤖 Export Agent IA",
  "export_ai_error": "Impossible d'exporter le rapport Agent IA : {error}",
  "export_ai_success": "Rapport Agent IA exporté avec succès vers {filename}",
  "export_clear_btn": "🧹 Effacer",
  "export_copy_btn": "📋 Copier Résultats",
  "export_html_btn": "🌐 Export SAST HTML",
  "export_json_btn": "💾 Export SAST JSON",
  "export_no_issues_for_ai": "Aucune erreur critique/élevée/moyenne à corriger pour l'Agent IA",
  "export_no_report": "Aucun rapport à exporter.",
  "export_no_results": "Aucun résultat à exporter.",
  "export_results_error": "Erreur lors de l'export : {error}",
  "export_results_success": "Résultats exportés dans {filename}",
  "export_sast_copy_message": "Résultats copiés dans le presse-papier",
  "export_sast_html_error": "Impossible d'exporter le rapport HTML : {error}",
  "export_sast_html_message": "Rapport SAST exporté dans {filename}",
  "export_sast_json_error": "Impossible d'exporter le rapport JSON : {error}",
  "export_sast_json_message": "Rapport SAST exporté dans {filename}",
  "export_success_open": "Rapport exporté avec succès. Voulez-vous l'ouvrir ?",
  "export_success_title": "Succès",
  "failed": "Échec",
  "finding_description": "📝 Description",
  "finding_evidence": "🔍 Preuves",
  "finding_impact": "💥 Impact",
  "finding_remediation": "💡 Recommandation",
  "fixes_confirmed": "Correctifs confirmés ({}): {}",
  "folder_browse": "📂 Parcourir",
  "general_error": "Erreur générale",
  "header_subtitle": "Scanner de Sécurité Web & Analyse de Code Source",
  "headers": {
    "cookie_missing_httponly": {
      "description": "Le cookie « {cookie} » n'a pas l'attribut HttpOnly.",
      "remediation": "Marquez les cookies d'authentification avec HttpOnly pour bloquer l'accès JavaScript.",
      "title": "Cookie sans attribut HttpOnly"
    },
    "cookie_missing_samesite": {
      "description": "Le cookie « {cookie} » n'a pas l'attribut SameSite.",
      "impact": "Les cookies sans SameSite sont envoyés automatiquement lors des navigations inter-sites.",
      "remediation": "Définissez SameSite=Lax ou Strict pour réduire le risque de CSRF.",
      "title": "Cookie sans attribut SameSite"
    },
    "cookie_missing_secure": {
      "description": "Le cookie « {cookie} » n'a pas l'attribut Secure.",
      "remediation": "Marquez les cookies de session avec Secure pour imposer le transport HTTPS.",
      "title": "Cookie sans attribut Secure"
    },
    "https_downgrade": {
      "description": "La requête a été redirigée vers l'URL HTTP {url}.",
      "remediation": "Assurez-vous que toutes les redirections forcent HTTPS.",
      "title": "Downgrade HTTPS détecté"
    },
    "https_request_failed": {
      "description": "Impossible de récupérer {url} : {error}",
      "remediation": "Vérifiez la résolution DNS et la réponse du site en HTTPS.",
      "title": "Échec de la requête HTTPS"
    },
    "missing": {
      "content-security-policy": {
        "description": "L'en-tête Content-Security-Policy est absent sur {url}.",
        "remediation": "Définissez une politique Content-Security-Policy pour limiter les sources de scripts et de ressources.",
        "title": "En-tête Content-Security-Policy manquant"
      },
      "cross-origin-embedder-policy": {
        "description": "L'en-tête Cross-Origin-Embedder-Policy est absent sur {url}.",
        "remediation": "Activez Cross-Origin-Embedder-Policy pour exiger CORS ou CORP sur les ressources intégrées.",
        "title": "En-tête Cross-Origin-Embedder-Policy manquant"
      },
      "cross-origin-opener-policy": {
        "description": "L'en-tête Cross-Origin-Opener-Policy est absent sur {url}.",
        "remediation": "Définissez Cross-Origin-Opener-Policy pour isoler les contextes de navigation et limiter les fuites XS.",
        "title": "En-tête Cross-Origin-Opener-Policy manquant"
      },
      "cross-origin-resource-policy": {
        "description": "L'en-tête Cross-Origin-Resource-Policy est absent sur {url}.",
        "remediation": "Définissez Cross-Origin-Resource-Policy pour maîtriser le chargement inter-origine.",
        "title": "En-tête Cross-Origin-Resource-Policy manquant"
      },
      "permissions-policy": {
        "description": "L'en-tête Permissions-Policy est absent sur {url}.",
        "remediation": "Adoptez Permissions-Policy afin de contrôler les fonctionnalités puissantes du navigateur.",
        "title": "En-tête Permissions-Policy manquant"
      },
      "referrer-policy": {
        "description": "L'en-tête Referrer-Policy est absent sur {url}.",
        "remediation": "Ajoutez Referrer-Policy pour limiter la fuite d'informations sensibles.",
        "title": "En-tête Referrer-Policy manquant"
      },
      "strict-transport-security": {
        "description": "L'en-tête Strict-Transport-Security est absent sur {url}.",
        "remediation": "Configurez Strict-Transport-Security afin d'imposer HTTPS et d'activer le préchargement.",
        "title": "En-tête Strict-Transport-Security manquant"
      },
      "x-content-type-options": {
        "description": "L'en-tête X-Content-Type-Options est absent sur {url}.",
        "remediation": "Configurez X-Content-Type-Options: nosniff pour empêcher le MIME sniffing.",
        "title": "En-tête X-Content-Type-Options manquant"
      },
      "x-frame-options": {
        "description": "L'en-tête X-Frame-Options est absent sur {url}.",
        "remediation": "Définissez X-Frame-Options sur DENY ou SAMEORIGIN pour réduire le clickjacking.",
        "title": "En-tête X-Frame-Options manquant"
      }
    },
    "verbose_banner": {
      "description": "L'en-tête {header} divulgue des informations sur le logiciel : {value}",
      "impact": "Ces bannières facilitent l'ajustement des attaques sur des versions connues.",
      "remediation": "Supprimez les versions exposées dans l'en-tête {header} ou désactivez-le.",
      "title": "Bannière {header} trop verbeuse"
    }
  },
  "headers_missing": "En-tête de sécurité manquant: {}",
  "history_column_date": "Date",
  "history_column_summary": "Résumé",
  "history_column_target": "Cible",
  "history_column_type": "Type",
  "history_detail_date": "Date : {value}",
  "history_detail_description": "Description : {value}",
  "history_detail_evidence": "Evidence : {value}",
  "history_detail_frame": "📝 Détails du scan",
  "history_detail_item": "[{severity}] {title}",
  "history_detail_module": "Module : {value}",
  "history_detail_no_issue": "✅ Aucun problème détecté",
  "history_detail_remediation": "Remédiation : {value}",
  "history_detail_summary": "Synthèse : {value}",
  "history_detail_target": "Cible : {value}",
  "history_detail_type": "Type : {value}",
  "history_more_files": "{preview} (+{extra} autres)",
  "history_no_entries": "Aucun scan enregistré pour le moment.",
  "history_no_entries_prompt": "Sélectionnez une entrée pour afficher les détails complets.",
  "history_sast_save_failed": "Échec de l'enregistrement SAST: {error}",
  "history_save_failed": "Échec de l'enregistrement de l'historique: {error}",
  "history_title": "📊 Rapports & Historique",
  "history_type_domain": "Domaine",
  "history_type_sast": "SAST",
  "html_files": "Fichiers HTML",
  "info_sast_running_body": "Une analyse SAST est déjà en cours.",
  "info_sast_running_title": "Analyse en cours",
  "info_title": "Info",
  "injection": {
    "disabled": {
      "description": "Le mode passif n'envoie pas de charges actives. Relancez avec allow_invasive=True pour activer.",
      "remediation": "Activez allow_invasive lorsque vous avez l'autorisation d'effectuer des tests actifs.",
      "title": "Tests d'injection désactivés"
    },
    "none_detected": {
      "description": "La sonde active s'est déroulée sans motif d'erreur SQL/XSS.",
      "remediation": "Complétez avec des outils d'analyse dynamique plus approfondis.",
      "title": "Aucun indicateur d'injection"
    },
    "probe_failed": {
      "description": "La sonde invasive n'a pas pu joindre {url} : {error}",
      "remediation": "Vérifiez que l'hôte accepte HTTPS et qu'aucun WAF ne bloque les tests légers.",
      "title": "Requête de test active échouée ({url})"
    },
    "reflected_xss": {
      "description": "Le marqueur injecté est renvoyé dans la réponse, signe d'un encodage insuffisant.",
      "impact": "Les entrées réfléchies permettent à un attaquant d'exécuter du script dans le navigateur.",
      "remediation": "Échappez les entrées utilisateur avant rendu et appliquez une CSP restrictive.",
      "title": "XSS réfléchi potentiel ({url})"
    },
    "server_error": {
      "description": "Le serveur renvoie le statut {status} lors de l'envoi de charges actives.",
      "impact": "Les exceptions non gérées révèlent des détails internes et facilitent des enchaînements d'exploits.",
      "remediation": "Gérez correctement les entrées inattendues et ajoutez des contrôles de validation.",
      "title": "Erreur serveur sur entrée malformée ({url})"
    },
    "sql_error": {
      "description": "La réponse contient un message d'erreur base de données correspondant à « {signature} ».",
      "impact": "Les traces et erreurs de driver révèlent la technologie et facilitent l'exploitation.",
      "remediation": "Nettoyez les entrées et supprimez les messages d'erreur détaillés de la base.",
      "title": "Erreur SQL détectée ({url})"
    }
  },
  "injection_disabled": "Tests d'injection désactivés",
  "injection_error_detected": "Fuite d'erreur de base de données détectée",
  "invasive_btn_cancel": "❌ Annuler",
  "invasive_btn_continue": "✅ Continuer (J'ai l'autorisation)",
  "invasive_checkbox_confirm": "Je confirme avoir l'autorisation légale pour ces tests",
  "invasive_mode": "🔍 Mode invasif (tests actifs)",
  "invasive_warning_message": "🚨 ATTENTION : Vous vous apprêtez à activer les tests d'injection invasifs.\n\n⚠️ RISQUES :\n• Envoi de payloads de test sur les serveurs cibles\n• Peut déclencher des alertes de sécurité\n• Peut causer des dysfonctionnements temporaires\n• Peut être considéré comme une tentative d'intrusion\n\n✅ UTILISATION AUTORISÉE UNIQUEMENT SUR :\n• Vos propres domaines et applications\n• Domaines avec autorisation écrite du propriétaire\n• Environnements de test contrôlés\n\n❌ N'UTILISEZ JAMAIS SUR :\n• Domaines tiers sans autorisation\n• Applications en production non contrôlées\n• Systèmes dont vous n'êtes pas propriétaire\n\n🎯 RESPONSABILITÉ :\nEn continuant, vous confirmez avoir l'autorisation légale pour effectuer ces tests sur les domaines spécifiés.\n\nVoulez-vous vraiment activer les tests invasifs ?",
  "invasive_warning_title": "⚠️ AVERTISSEMENT - Tests invasifs",
  "json_files": "Fichiers JSON",
  "language_auto": "auto",
  "language_label": "Sélection de la langue :",
  "language_labels": {
    "en": "EN ⚡ English",
    "fr": "FR ⚡ Français"
  },
  "language_section": "🌍 Langue",
  "license_alert_critical": "La licence expire dans {} jour(s).",
  "license_alert_expired": "Licence expirée.",
  "license_alert_info": "La licence expirera dans {} jours.",
  "license_alert_warning": "La licence expire dans {} jours.",
  "license_button_label_default": "🔐 Licence",
  "license_button_label_short": "Licence",
  "license_current": "Licence actuelle : {tier}",
  "license_dialog_error": "Impossible d'afficher les informations de licence : {error}",
  "license_dialog_features": "✅ Fonctionnalités disponibles :",
  "license_dialog_header": "🏷️ Licence actuelle : {tier}",
  "license_dialog_limits": "📊 Limites :",
  "license_dialog_window_title": "Statut de la licence",
  "license_feature_advanced": "• {status} Règles avancées",
  "license_feature_api": "• {status} Accès API",
  "license_feature_domains": "• {status} Scan de domaines",
  "license_feature_html": "• {status} Export HTML",
  "license_feature_invasive": "• {status} Tests invasifs",
  "license_feature_sast": "• {status} Analyse SAST",
  "license_frame_title": "🎫 Licence",
  "license_import_dialog_title": "Sélectionner un fichier licence",
  "license_import_error": "Impossible d'importer la licence : {}",
  "license_import_error_title": "Erreur licence",
  "license_import_success": "La licence a été installée avec succès.",
  "license_import_success_title": "Licence installée",
  "license_import_warning": "La licence a été copiée mais reste invalide. L'application fonctionne en mode gratuit.",
  "license_import_warning_title": "Licence invalide",
  "license_limit_domains": "• Domaines simultanés : {value}",
  "license_limit_files": "• Fichiers SAST max/mois : {value}",
  "license_limit_size": "• Taille max des fichiers : {value}",
  "license_limits": "Domaines simultanés : {domains} | Fichiers SAST : {files} | Taille SAST : {size}",
  "license_modal_close": "Fermer",
  "license_modal_days_value": "{} jour(s)",
  "license_modal_details": "Détails",
  "license_modal_expires_in": "Expire dans",
  "license_modal_feature_api": "API REST",
  "license_modal_feature_disabled": "Désactivé",
  "license_modal_feature_enabled": "Activé",
  "license_modal_feature_html": "Export HTML",
  "license_modal_feature_invasive": "Tests invasifs",
  "license_modal_feature_multi_user": "Multi-utilisateurs",
  "license_modal_features": "Fonctionnalités",
  "license_modal_grace_hours": "Période de grâce (h)",
  "license_modal_heading": "Statut de la licence Web Sentinel",
  "license_modal_id": "Identifiant",
  "license_modal_import": "Importer une licence…",
  "license_modal_max_domains": "Domaines autorisés",
  "license_modal_max_users": "Utilisateurs autorisés",
  "license_modal_not_available": "Non disponible",
  "license_modal_tier": "Offre",
  "license_modal_title": "Gestion de la licence",
  "license_modal_unknown": "Inconnu",
  "license_modal_unlimited": "Illimité",
  "license_modal_valid_until": "Valide jusqu'au",
  "license_status_critical": "⚠️ Licence expirant dans {} jour(s).",
  "license_status_error": "❌ Erreur licence : {}",
  "license_status_expired": "⚠️ Licence expirée – veuillez renouveler.",
  "license_status_free_mode": "🆓 Mode gratuit : fonctionnalités limitées.",
  "license_status_info": "ℹ️ Licence valide – expiration dans {} jours.",
  "license_status_warning": "ℹ️ Licence expirant dans {} jours.",
  "load_domains_hint": "Charger domaines depuis un fichier",
  "login_error_message": "Erreur lors de la connexion : {error}",
  "login_success_message": "Connexion réussie !",
  "login_success_title": "Succès",
  "logout_error_message": "Erreur lors de la déconnexion : {error}",
  "logout_success_message": "Déconnexion réussie",
  "manage_license": "Gérer la licence",
  "manual_selection_label": "Sélection manuelle",
  "messages": {
    "dialog_select_source_files": "Sélectionner les fichiers de code source",
    "dialog_select_source_folder": "Sélectionner le dossier contenant le code source",
    "gui": {
      "fallback_classic": "Utilisation de l'interface classique…",
      "import_error": "Erreur d'import : {error}",
      "install_command": "pip install requests beautifulsoup4",
      "install_hint": "Assurez-vous que tous les modules sont installés :",
      "pil_fallback": "⚠️ PIL indisponible, utilisation d'un texte de secours",
      "unexpected_error": "Erreur inattendue : {error}"
    },
    "headless": {
      "domain_findings": "   Constats détectés : {count}",
      "domain_header": "\n🌐 Domaine : {domain}",
      "domain_limit": "⚠️ Limite de domaines atteinte ({limit}) ; mise à niveau requise.",
      "domain_no_findings": "   ✅ Aucun problème de sécurité détecté",
      "domains_list": "[DOMAINES] {domains}",
      "export_failed": "❌ Échec de l'export : {error}",
      "export_html": "✅ Rapport HTML exporté vers : {path}",
      "export_json": "✅ Rapport exporté vers : {path}",
      "fallback_headless": "🔄 Bascule vers le mode headless…",
      "html_export_not_allowed": "⚠️ L'export HTML requiert un abonnement PRO.",
      "init": "[HEADLESS] HeadlessWebSentinelGUI initialisé (pas d'affichage GUI)",
      "invasive_not_allowed": "⚠️ Tests invasifs désactivés pour ce plan. Passez en PRO.",
      "modules_list": "[MODULES] {modules}",
      "more_findings": "      … et {count} supplémentaires",
      "no_domains": "❌ Erreur : aucun domaine renseigné",
      "no_modules": "❌ Erreur : aucun module sélectionné",
      "no_results": "📝 Aucun résultat d'analyse à afficher",
      "no_results_export": "❌ Aucun résultat à exporter",
      "results_header": "📊 RÉSULTATS DU SCAN",
      "results_summary": "🎯 Résumé : {domains} domaine(s), {findings} constats",
      "scan_complete": "✅ Scan terminé : {count} domaine(s) analysé(s)",
      "scan_error": "❌ Erreur de scan : {error}",
      "scan_start": "[DÉMARRAGE] Scan headless pour {count} domaine(s)…",
      "scanning_domain": "🔍 Analyse de {domain}…",
      "severity_block": "   {severity} : {count} constats",
      "test_complete": "🎯 Test terminé : {result}",
      "test_start": "🧪 Démarrage du mode test headless…",
      "tk_init_failed": "⚠️ Échec de l'initialisation tkinter : {error}",
      "tk_not_available": "⚠️ tkinter indisponible : {error}",
      "unsupported_format": "❌ Format non pris en charge : {format}"
    },
    "history_parse_failed": "Impossible d'analyser le fichier d'historique {path} : {error}",
    "history_persisted": "Historique enregistré pour {domain} – exécutions totales : {runs}",
    "license_initializing": "🔐 Initialisation du système de licence…",
    "osint_crtsh_invalid_json": "Réponse crt.sh non JSON pour {domain}",
    "osint_crtsh_lookup_failed": "Recherche crt.sh échouée pour {domain} : {error}",
    "profile_default_description": "Profil de scan par défaut",
    "sast_license_required": "❌ L'analyse de code requiert une licence PRO ou supérieure",
    "simple_headless": {
      "scan_domain": "[SCAN] Test de {domain}",
      "scan_error": "[ERREUR] {domain} : {error}",
      "scan_result": "[RÉSULTAT] {domain} : {count} constats",
      "test_complete": "[FIN] Test terminé : {domains} domaine(s), {findings} constats",
      "test_start": "[TEST] Démarrage du test headless de compatibilité"
    },
    "size_limit_skipping": "Limite de taille atteinte, fichier ignoré : {file}",
    "upgrade_for_sast": "💡 Mettez à niveau votre licence pour accéder au SAST",
    "gui_fallback_classic": {
      "title": "Problème de sécurité détecté",
      "description": "Un problème de sécurité a été identifié (messages.gui_fallback_classic).",
      "remediation": "Examinez et corrigez cette vulnérabilité de sécurité."
    },
    "gui_import_error": {
      "title": "Problème de sécurité détecté",
      "description": "Un problème de sécurité a été identifié (messages.gui_import_error).",
      "remediation": "Examinez et corrigez cette vulnérabilité de sécurité."
    },
    "gui_install_command": {
      "title": "Problème de sécurité détecté",
      "description": "Un problème de sécurité a été identifié (messages.gui_install_command).",
      "remediation": "Examinez et corrigez cette vulnérabilité de sécurité."
    },
    "gui_install_hint": {
      "title": "Problème de sécurité détecté",
      "description": "Un problème de sécurité a été identifié (messages.gui_install_hint).",
      "remediation": "Examinez et corrigez cette vulnérabilité de sécurité."
    },
    "gui_unexpected_error": {
      "title": "Problème de sécurité détecté",
      "description": "Un problème de sécurité a été identifié (messages.gui_unexpected_error).",
      "remediation": "Examinez et corrigez cette vulnérabilité de sécurité."
    }
  },
  "modern": {
    "analysis_failed": {
      "description": "Échec de récupération de la page principale pour analyse : {error}",
      "evidence": "URL : {url}",
      "remediation": "Vérifiez l'accessibilité du site et réessayez.",
      "title": "Impossible d'analyser les technologies web modernes"
    },
    "android_app_links": {
      "description": "Configuration Android App Links détectée",
      "evidence": "Trouvé {count} configurations de liens d'app",
      "impact": "Les liens d'app créent une surface d'attaque supplémentaire entre le web et l'application mobile.",
      "remediation": "Assurez-vous que les cibles de liens d'app sont correctement validées dans l'application mobile.",
      "title": "Android App Links configurés"
    },
    "angular_dev_mode": {
      "description": "Angular peut fonctionner en mode développement",
      "evidence": "Indicateurs de mode développement trouvés",
      "impact": "Le mode développement expose les outils de débogage et réduit les performances.",
      "remediation": "Activez le mode production avec enableProdMode() dans main.ts.",
      "title": "Mode développement Angular détecté"
    },
    "credentials_exposed": {
      "description": "Le code côté client peut contenir des informations {pattern_name}",
      "evidence": "Trouvé {count} correspondances potentielles",
      "impact": "Les identifiants exposés peuvent être extraits par quiconque visualise le code source de la page.",
      "remediation": "Déplacez les identifiants sensibles vers le code côté serveur et utilisez des variables d'environnement.",
      "title": "Potentiel {pattern_name} exposé dans le code client"
    },
    "deployment_platform": {
      "description": "Le site semble être déployé sur : {platforms}",
      "evidence": "En-têtes de plateforme : {platforms}",
      "impact": "Des considérations de sécurité spécifiques à la plateforme peuvent s'appliquer.",
      "remediation": "Assurez-vous que les paramètres de sécurité de la plateforme sont correctement configurés.",
      "title": "Plateforme de déploiement détectée"
    },
    "env_vars_exposed": {
      "description": "Les variables d'environnement peuvent être exposées dans le bundle client {framework}",
      "evidence": "Références de variables d'environnement trouvées dans le code client",
      "impact": "Les variables d'environnement sensibles peuvent être exposées aux utilisateurs.",
      "remediation": "Assurez-vous que seules les variables préfixées NEXT_PUBLIC_ ou NUXT_ENV_ sont exposées au client.",
      "title": "Variables d'environnement exposées dans le client"
    },
    "external_apis_hardcoded": {
      "description": "Trouvé {count} URLs d'API externes dans le code client",
      "evidence": "APIs externes : {apis}",
      "impact": "Les URLs d'API codées en dur peuvent exposer l'architecture backend et les endpoints.",
      "remediation": "Utilisez des variables d'environnement ou un proxy côté serveur pour les appels d'API externes.",
      "title": "URLs d'API externes codées en dur dans le client"
    },
    "frameworks_detected": {
      "description": "Frameworks détectés : {frameworks}",
      "evidence": "Frameworks : {frameworks}",
      "impact": "Des considérations de sécurité spécifiques aux frameworks peuvent s'appliquer.",
      "remediation": "Assurez-vous que les frameworks sont à jour et configurés de manière sécurisée.",
      "title": "Frameworks JavaScript détectés"
    },
    "ios_universal_links": {
      "description": "Configuration iOS Universal Links détectée",
      "evidence": "Configuration Universal Links trouvée",
      "impact": "Les liens universels créent une surface d'attaque supplémentaire entre le web et l'application mobile.",
      "remediation": "Assurez-vous que la gestion des liens universels est correctement validée dans l'application iOS.",
      "title": "iOS Universal Links configurés"
    },
    "pwa_detected": {
      "description": "Manifeste Progressive Web App trouvé",
      "evidence": "Manifeste disponible à : {url}",
      "impact": "Les capacités PWA nécessitent des considérations de sécurité supplémentaires.",
      "remediation": "Assurez-vous que les bonnes pratiques de sécurité PWA sont suivies.",
      "title": "Manifeste PWA détecté"
    },
    "pwa_insecure_icon": {
      "description": "L'icône PWA est servie via HTTP non sécurisé",
      "evidence": "Src de l'icône : {src}",
      "impact": "Les ressources non sécurisées peuvent être manipulées en transit.",
      "remediation": "Servez toutes les ressources PWA via HTTPS.",
      "title": "Icône PWA servie via HTTP"
    },
    "pwa_invalid_manifest": {
      "description": "Le fichier manifeste PWA contient du JSON invalide",
      "evidence": "Échec de l'analyse JSON",
      "impact": "Un manifeste invalide peut empêcher l'installation de la PWA.",
      "remediation": "Corrigez les erreurs de syntaxe JSON dans manifest.json.",
      "title": "Format de manifeste PWA invalide"
    },
    "pwa_scope_permissive": {
      "description": "La portée PWA permet l'accès à tout le domaine",
      "evidence": "Portée : '{scope}'",
      "impact": "Une portée large peut permettre à la PWA d'intercepter des ressources non intentionnelles.",
      "remediation": "Restreignez la portée PWA aux chemins d'application spécifiques.",
      "title": "Portée PWA trop permissive"
    },
    "react_dev_build": {
      "description": "React fonctionne en mode développement en production",
      "evidence": "react.development.js trouvé dans la page",
      "impact": "Les builds de développement exposent des informations de débogage et ont de moins bonnes performances.",
      "remediation": "Utilisez le build de production de React (react.production.min.js).",
      "title": "Build de développement React détecté"
    },
    "server_timing_sensitive": {
      "description": "L'en-tête Server-Timing peut exposer des informations internes du système",
      "evidence": "Server-Timing : {server_timing}",
      "impact": "Les informations de timing internes peuvent aider dans la reconnaissance.",
      "remediation": "Examinez le contenu de l'en-tête Server-Timing pour des informations sensibles.",
      "title": "Informations sensibles dans l'en-tête Server-Timing"
    },
    "sw_aggressive_caching": {
      "description": "Le Service Worker utilise une mise en cache stale-while-revalidate",
      "evidence": "Stratégie staleWhileRevalidate détectée",
      "impact": "Une mise en cache agressive peut servir des données d'authentification ou sensibles obsolètes.",
      "remediation": "Examinez la stratégie de cache pour les données sensibles et l'état d'authentification.",
      "title": "Stratégie de cache potentiellement agressive"
    },
    "sw_insecure_resources": {
      "description": "Le Service Worker peut mettre en cache des ressources servies via HTTP",
      "evidence": "URLs HTTP trouvées dans le Service Worker",
      "impact": "Les ressources non sécurisées mises en cache peuvent persister et être servies aux utilisateurs.",
      "remediation": "Assurez-vous que toutes les ressources mises en cache sont servies via HTTPS.",
      "title": "Service Worker met en cache des ressources HTTP"
    }
  },
  "module_access_control": "Contrôle d'Accès (A01)",
  "module_api_security": "Sécurité API",
  "module_auth_failures": "Défaillances Auth (A07)",
  "module_backend_config": "Config Backend",
  "module_crypto_failures": "Défaillances Crypto (A02)",
  "module_headers": "En-têtes HTTP",
  "module_injection": "Tests d'injection",
  "module_insecure_design": "Conception Non Sécurisée (A04)",
  "module_modern_web": "Technologies Modernes",
  "module_osint": "Veille OSINT",
  "module_security_misconfig": "Mauvaise Configuration (A05)",
  "module_source_code": "Code source (SAST)",
  "module_static": "Analyse statique",
  "module_static_analysis": "Analyse statique",
  "module_third_party": "Outils tiers",
  "module_tls": "TLS/SSL",
  "module_vulnerable_components": "Composants Vulnérables (A06)",
  "modules": {
    "access_control": {
      "description": "OWASP A01 - Détection des contrôles d'accès cassés (IDOR, élévation de privilèges)."
    },
    "api_security": {
      "description": "Analyse de sécurité des APIs REST/GraphQL et découverte d'endpoints."
    },
    "backend_config": {
      "description": "Analyse des configurations backend via les endpoints publics."
    },
    "broken_authentication": {
      "description": "OWASP A07 - Détection des failles d'authentification et de session."
    },
    "crypto_failures": {
      "description": "OWASP A02 - Analyse des défaillances cryptographiques (TLS faible, chiffrements)."
    },
    "headers": {
      "description": "Renforcement des en-têtes HTTP et sécurisation des cookies."
    },
    "injection": {
      "description": "Tests bénins pour détecter les indicateurs SQL/XSS."
    },
    "insecure_design": {
      "description": "OWASP A04 - Analyse des schémas de conception non sécurisés."
    },
    "modern_web": {
      "description": "Analyse des technologies web modernes (SPA, PWA, frameworks)."
    },
    "osint": {
      "description": "Collecte OSINT pour cartographier l'exposition publique."
    },
    "security_misconfiguration": {
      "description": "OWASP A05 - Détection des mauvaises configurations (en-têtes, interfaces admin)."
    },
    "source_code": {
      "description": "Analyse statique (SAST) des vulnérabilités dans le code source."
    },
    "static_analysis": {
      "description": "Heuristiques DOM pour XSS réfléchi et jetons CSRF."
    },
    "third_party": {
      "description": "Connecteurs OWASP ZAP, Burp Suite, Nikto pour analyses externes."
    },
    "tls": {
      "description": "Hygiène des certificats TLS (expiration, couverture des noms d'hôte)."
    },
    "vulnerable_components": {
      "description": "OWASP A06 - Détection de composants vulnérables ou obsolètes (CVE)."
    }
  },
  "modules_label": "Modules:",
  "no_findings": "Aucun constat détecté.",
  "no_regressions": "Aucune régression détectée.",
  "no_sast_results": "Aucun résultat SAST à exporter.",
  "no_scan_performed": "Aucun scan effectué",
  "no_vulnerabilities": "Aucune vulnérabilité détectée",
  "options_section": "⚙️ Options de scan",
  "osint": {
    "email": {
      "exposed": {
        "description": "Have I Been Pwned signale des brèches historiques pour : {emails}",
        "remediation": "Réinitialisez les mots de passe concernés, activez MFA et surveillez les alias exposés.",
        "title": "Alias d'entreprise exposés dans des brèches"
      },
      "lookup_partial_errors": {
        "description": "Certaines requêtes Have I Been Pwned ont échoué : {errors}",
        "remediation": "Réessayez après avoir résolu les erreurs réseau ou les limitations API.",
        "title": "Erreurs lors de la vérification des brèches email"
      },
      "lookup_skipped": {
        "description": "La vérification des brèches emails a été ignorée ({reason}).",
        "remediation": "Fournissez une clé API HIBP via la variable HIBP_API_KEY pour activer la vérification.",
        "title": "Recherche de brèches non effectuée"
      }
    },
    "subdomains": {
      "large_footprint": {
        "description": "Les journaux Certificate Transparency exposent {count} sous-domaines pour {domain}.",
        "evidence": "Exemples : {examples}",
        "remediation": "Sécurisez les sous-domaines publics et retirez les hôtes obsolètes des certificats publiés.",
        "title": "{count} sous-domaines visibles dans les journaux CT"
      }
    },
    "technologies": {
      "detected": {
        "description": "Le sondage HTTP a identifié les technologies exposées : {technologies}",
        "remediation": "Vérifiez que ces composants sont à jour et minimisent les métadonnées divulguées.",
        "title": "Empreinte technologique web détectée"
      }
    }
  },
  "owasp": {
    "access_control": {
      "test": {
        "description": "Constat de test utilisé pour le module de contrôle d'accès.",
        "remediation": "Remplacez ce mécanisme de test par des vérifications réelles.",
        "title": "Constat de test du contrôle d'accès"
      }
    },
    "broken_authentication": {
      "test": {
        "description": "Constat de test pour les scénarios d'authentification rompue.",
        "remediation": "Ajoutez des vérifications réelles de résilience de l'authentification.",
        "title": "Constat de test authentification rompue"
      }
    },
    "crypto_failures": {
      "test": {
        "description": "Constat de test pour les scénarios de défaillance cryptographique.",
        "remediation": "Ajoutez de vrais contrôles cryptographiques avant la mise en production.",
        "title": "Constat de test défaillances cryptographiques"
      }
    },
    "insecure_design": {
      "test": {
        "description": "Constat de test pour les scénarios de conception non sécurisée.",
        "remediation": "Implémentez de véritables diagnostics de conception sécurisée.",
        "title": "Constat de test conception non sécurisée"
      }
    },
    "security_misconfiguration": {
      "test": {
        "description": "Constat de test pour les risques de mauvaise configuration.",
        "remediation": "Ajoutez des vérifications réelles des mauvaises configurations.",
        "title": "Constat de test mauvaise configuration"
      }
    },
    "vulnerable_components": {
      "test": {
        "description": "Constat de test pour les composants vulnérables.",
        "remediation": "Remplacez ce stub par des contrôles réels des composants.",
        "title": "Constat de test composants vulnérables"
      }
    }
  },
  "pref_detailed": "Inclure un rapport détaillé SAST",
  "pref_history": "Enregistrer l'historique des scans",
  "pref_invasive": "Autoriser les tests invasifs par défaut",
  "pref_recursive": "Activer l'analyse récursive des dossiers SAST",
  "preferences_frame": "🔧 Préférences",
  "rec_add_header": "Ajouter l'en-tête {} avec une politique appropriée.",
  "rec_disable_legacy": "Désactiver les protocoles TLS obsolètes côté serveur.",
  "rec_enable_invasive": "Activer le mode invasif pour tester les injections.",
  "rec_fix_error_handling": "Améliorer la gestion d'erreurs pour éviter les fuites d'information.",
  "rec_renew_cert": "Renouveler le certificat SSL immédiatement.",
  "rec_secure_cookie": "Marquer les cookies sensibles avec les attributs Secure, HttpOnly et SameSite.",
  "rec_update_cert": "Mettre en place l'auto-renouvellement du certificat.",
  "regressions_detected": "Régressions détectées ({}): {}",
  "report_date_label": "Date du scan :",
  "report_domain_label": "Domaine analysé :",
  "report_html_title": "Web Sentinel - Rapport",
  "report_main_heading": "🔐 Rapport de Sécurité Web Sentinel",
  "report_no_regressions": "Aucune nouvelle vulnérabilité détectée depuis le dernier scan.",
  "report_no_resolved": "Aucune vulnérabilité n'a été corrigée depuis le dernier scan.",
  "report_section_findings": "🔍 Détails des Vulnérabilités",
  "report_section_regressions": "⚠️ Nouvelles Vulnérabilités",
  "report_section_resolved": "✅ Vulnérabilités Corrigées",
  "report_section_summary": "📊 Résumé des Vulnérabilités",
  "results_section": "📋 Résultats du scan",
  "sast": {
    "cpp": {
      "dangerous_function": {
        "description": "{func}() est susceptible aux attaques de débordement de tampon",
        "remediation": "Utilisez des alternatives plus sûres comme strncpy(), strncat(), snprintf()",
        "title": "Usage de fonction dangereuse {func}()"
      },
      "format_string": {
        "description": "Utiliser des variables directement dans printf peut conduire à des attaques de chaîne de format",
        "remediation": "Utilisez des spécificateurs de format : printf(\"%s\", variable)",
        "title": "Vulnérabilité potentielle de chaîne de format"
      },
      "memory_allocation": {
        "description": "Assurez-vous que tous les appels malloc() ont un free() correspondant",
        "remediation": "Utilisez les modèles RAII ou les pointeurs intelligents en C++",
        "title": "Allocation de mémoire dynamique détectée"
      }
    },
    "dart": {
      "http_connection": {
        "description": "Les connexions HTTP ne sont pas chiffrées",
        "remediation": "Utilisez HTTPS pour toutes les communications externes",
        "title": "Connexion HTTP non sécurisée dans Flutter"
      },
      "webview_debugging": {
        "description": "Le débogage WebView devrait être désactivé en production",
        "remediation": "Définissez debuggingEnabled à false dans les builds de production",
        "title": "Débogage WebView activé"
      }
    },
    "dockerfile": {
      "privileged_mode": {
        "description": "Le mode privilégié donne au conteneur un accès complet à l'hôte",
        "remediation": "Évitez le flag --privileged, utilisez des capacités spécifiques à la place",
        "title": "Mode conteneur privilégié"
      },
      "root_user": {
        "description": "Exécuter des conteneurs en tant que root augmente le risque de sécurité",
        "remediation": "Créez et utilisez un utilisateur non-root",
        "title": "Conteneur s'exécutant en tant qu'utilisateur root"
      },
      "secrets_in_env": {
        "description": "Les secrets ne devraient pas être stockés dans des variables d'environnement",
        "remediation": "Utilisez les secrets Docker ou la gestion externe des secrets",
        "title": "Secret potentiel dans une variable d'environnement"
      }
    },
    "file_limit_exceeded": {
      "description": "Trouvé {found} fichiers, mais la licence limite à {limit}",
      "remediation": "Mettez à niveau votre licence ou réduisez le périmètre avec des modèles d'exclusion",
      "title": "Limite de fichiers dépassée"
    },
    "generic": {
      "hardcoded_secrets": {
        "description": "Secrets potentiels trouvés dans le code source",
        "remediation": "Utilisez des variables d'environnement ou un système de gestion des secrets",
        "title": "Secrets codés en dur détectés"
      },
      "weak_crypto": {
        "description": "L'usage de {algorithm} est déconseillé pour des raisons de sécurité",
        "remediation": "Utilisez des algorithmes cryptographiques plus forts comme SHA-256, AES-256",
        "title": "Algorithme cryptographique faible détecté"
      },
      "security_issue": {
        "title": "Problème de sécurité détecté",
        "description": "Un problème de sécurité a été identifié (sast.generic.security_issue).",
        "remediation": "Examinez et corrigez cette vulnérabilité de sécurité."
      }
    },
    "js": {
      "dom_xss": {
        "description": "Ligne {line} utilise innerHTML avec des données utilisateur",
        "remediation": "Utilisez textContent ou assainissez avec DOMPurify",
        "title": "Vulnérabilité potentielle de DOM XSS"
      },
      "eval_usage": {
        "description": "L'usage d'eval() à la ligne {line} peut exécuter du code arbitraire",
        "remediation": "Évitez eval() ou utilisez JSON.parse() pour les données",
        "title": "Usage dangereux d'eval() détecté"
      }
    },
    "kotlin": {
      "intent_vulnerability": {
        "description": "Les actions Intent codées en dur peuvent être vulnérables",
        "remediation": "Validez les sources Intent et utilisez des Intents explicites quand possible",
        "title": "Problème de sécurité Intent potentiel"
      },
      "sql_injection": {
        "description": "L'interpolation de chaîne dans rawQuery peut conduire à une injection SQL",
        "remediation": "Utilisez des requêtes paramétrées avec des espaces réservés ?",
        "title": "Injection SQL potentielle dans Android"
      }
    },
    "missing_target": {
      "description": "L'analyse statique nécessite le paramètre --source-path",
      "remediation": "Fournir le chemin du code source avec l'option --source-path",
      "title": "Cible de code source non configurée"
    },
    "no_files_found": {
      "description": "Aucun fichier source correspondant aux critères n'a été trouvé",
      "remediation": "Vérifiez les extensions de fichier et les modèles d'exclusion",
      "title": "Aucun fichier source trouvé"
    },
    "objc": {
      "format_string": {
        "description": "Utiliser des variables directement dans NSLog peut être dangereux",
        "remediation": "Utilisez le format NSLog(@\"%@\", variable)",
        "title": "Vulnérabilité potentielle de chaîne de format dans NSLog"
      },
      "weak_crypto": {
        "description": "MD5 et SHA1 sont cryptographiquement faibles",
        "remediation": "Utilisez SHA-256 ou des algorithmes plus forts",
        "title": "Algorithme cryptographique faible"
      }
    },
    "path_not_found": {
      "description": "Le chemin source {path} n'existe pas",
      "remediation": "Vérifiez le chemin source et assurez-vous qu'il est accessible",
      "title": "Chemin source introuvable"
    },
    "php": {
      "command_injection": {
        "description": "Ligne {line} exécute une commande système avec une entrée utilisateur",
        "remediation": "Utilisez escapeshellarg() et validez les entrées, préférez des alternatives sûres",
        "title": "Vulnérabilité potentielle d'injection de commande"
      },
      "file_inclusion": {
        "description": "Ligne {line} inclut un fichier basé sur une entrée utilisateur",
        "remediation": "Validez et autorisez les fichiers autorisés, évitez les entrées utilisateur dans les chemins d'inclusion",
        "title": "Vulnérabilité potentielle d'inclusion de fichier local/distant"
      },
      "sql_injection": {
        "description": "Ligne {line} utilise une entrée utilisateur dans une requête SQL",
        "remediation": "Utilisez des requêtes préparées avec liaison de paramètres (PDO::prepare() ou mysqli_prepare())",
        "title": "Vulnérabilité potentielle d'injection SQL"
      },
      "xss": {
        "description": "Ligne {line} affiche des données utilisateur non filtrées",
        "remediation": "Utilisez htmlspecialchars() ou filter_var() pour assainir les sorties",
        "title": "Vulnérabilité potentielle de Cross-Site Scripting (XSS)"
      }
    },
    "powershell": {
      "execution_policy": {
        "description": "Contourner la politique d'exécution réduit la sécurité",
        "remediation": "Utilisez une signature de code appropriée au lieu de contourner la politique",
        "title": "Contournement de la politique d'exécution"
      },
      "hardcoded_credentials": {
        "description": "Les informations d'identification codées en dur dans les scripts ne sont pas sécurisées",
        "remediation": "Utilisez le Gestionnaire d'informations d'identification Windows ou un coffre-fort sécurisé",
        "title": "Informations d'identification codées en dur dans PowerShell"
      },
      "invoke_expression": {
        "description": "Invoke-Expression peut exécuter du code arbitraire",
        "remediation": "Évitez Invoke-Expression ou validez soigneusement les entrées",
        "title": "Usage dangereux d'Invoke-Expression"
      }
    },
    "python": {
      "eval_usage": {
        "description": "L'usage d'eval/exec à la ligne {line} peut exécuter du code arbitraire",
        "remediation": "Utilisez ast.literal_eval() pour une évaluation sûre ou évitez l'exécution dynamique",
        "title": "Usage dangereux d'eval/exec"
      }
    },
    "ruby": {
      "command_injection": {
        "description": "Ligne {line} exécute une commande système avec une entrée utilisateur",
        "remediation": "Utilisez Open3.capture3() ou shellwords pour une exécution sûre des commandes",
        "title": "Injection de commande potentielle en Ruby"
      },
      "eval_usage": {
        "description": "eval() peut exécuter du code arbitraire",
        "remediation": "Évitez eval() ou utilisez des alternatives plus sûres comme JSON.parse",
        "title": "Usage dangereux d'eval() en Ruby"
      },
      "sql_injection": {
        "description": "Ligne {line} utilise l'interpolation de chaîne dans les requêtes SQL",
        "remediation": "Utilisez des requêtes paramétrées ou des méthodes ActiveRecord avec des espaces réservés",
        "title": "Injection SQL potentielle dans Rails"
      }
    },
    "rust": {
      "raw_pointer": {
        "description": "Les pointeurs bruts peuvent conduire à des problèmes de sécurité mémoire",
        "remediation": "Préférez les modèles Rust sûrs et validez les opérations sur les pointeurs",
        "title": "Usage de pointeur brut détecté"
      },
      "transmute_usage": {
        "description": "transmute peut causer un comportement indéfini si mal utilisé",
        "remediation": "Utilisez des alternatives plus sûres ou validez soigneusement l'usage de transmute",
        "title": "Usage dangereux de transmute"
      },
      "unsafe_block": {
        "description": "Les blocs unsafe contournent les garanties de sécurité de Rust",
        "remediation": "Examinez attentivement le code unsafe et minimisez son usage",
        "title": "Bloc de code Rust unsafe détecté"
      }
    },
    "scan_error": {
      "description": "Impossible d'analyser le fichier : {error}",
      "remediation": "Vérifiez l'encodage et les permissions du fichier",
      "title": "Erreur de scan dans {file}"
    },
    "shell": {
      "command_injection": {
        "description": "Les variables non quotées dans des commandes dangereuses peuvent conduire à une injection",
        "remediation": "Quotez toutes les variables : \"$variable\"",
        "title": "Injection de commande potentielle dans le script shell"
      },
      "eval_usage": {
        "description": "eval peut exécuter des commandes arbitraires",
        "remediation": "Évitez eval ou validez soigneusement les entrées",
        "title": "Usage dangereux d'eval dans le shell"
      },
      "hardcoded_password": {
        "description": "Les mots de passe codés en dur sont un risque de sécurité",
        "remediation": "Utilisez des variables d'environnement ou une gestion sécurisée des secrets",
        "title": "Mot de passe codé en dur dans le script shell"
      }
    },
    "swift": {
      "http_connection": {
        "description": "Les connexions HTTP ne sont pas chiffrées",
        "remediation": "Utilisez HTTPS pour toutes les communications réseau",
        "title": "Connexion HTTP non sécurisée"
      },
      "keychain_issue": {
        "description": "kSecAttrAccessibleAlways rend les éléments du trousseau accessibles même quand verrouillé",
        "remediation": "Utilisez des paramètres d'accessibilité plus restrictifs comme kSecAttrAccessibleWhenUnlocked",
        "title": "Paramètre d'accessibilité Keychain non sécurisé"
      }
    },
    "terraform": {
      "hardcoded_secret": {
        "description": "Les secrets ne devraient pas être codés en dur dans les fichiers Terraform",
        "remediation": "Utilisez les variables Terraform, AWS Secrets Manager ou HashiCorp Vault",
        "title": "Secret codé en dur dans Terraform"
      },
      "overly_permissive": {
        "description": "0.0.0.0/0 permet l'accès depuis n'importe où",
        "remediation": "Restreignez les blocs CIDR à des plages d'IP spécifiques",
        "title": "Accès réseau trop permissif"
      },
      "unencrypted_storage": {
        "description": "Le stockage devrait être chiffré",
        "remediation": "Définissez encrypted = true pour les ressources de stockage",
        "title": "Configuration de stockage non chiffré"
      }
    },
    "scala": {
      "deserialization": {
        "title": "Problème de sécurité détecté",
        "description": "Un problème de sécurité a été identifié (sast.scala.deserialization).",
        "remediation": "Examinez et corrigez cette vulnérabilité de sécurité."
      }
    }
  },
  "sast.cpp.dangerous_function": {
    "description": "{func}() est sujet aux attaques de dépassement de tampon",
    "remediation": "Utilisez des alternatives plus sûres comme strncpy(), strncat(), snprintf()",
    "title": "Usage de fonction dangereuse {func}()"
  },
  "sast.cpp.format_string": {
    "description": "Utiliser des variables directement dans printf peut conduire à des attaques de chaîne de format",
    "remediation": "Utilisez des spécificateurs de format : printf(\"%s\", variable)",
    "title": "Vulnérabilité de chaîne de format potentielle"
  },
  "sast.cpp.memory_allocation": {
    "description": "Assurez-vous que tous les appels malloc() ont un free() correspondant",
    "remediation": "Utilisez les motifs RAII ou les pointeurs intelligents en C++",
    "title": "Allocation de mémoire dynamique détectée"
  },
  "sast.dart.http_connection": {
    "description": "Les connexions HTTP ne sont pas chiffrées",
    "remediation": "Utilisez HTTPS pour toutes les communications externes",
    "title": "Connexion HTTP non sécurisée en Flutter"
  },
  "sast.dart.webview_debugging": {
    "description": "Le débogage WebView devrait être désactivé en production",
    "remediation": "Définissez debuggingEnabled à false dans les builds de production",
    "title": "Débogage WebView activé"
  },
  "sast.dockerfile.privileged_mode": {
    "description": "Le mode privilégié donne au conteneur un accès complet à l'hôte",
    "remediation": "Évitez le flag --privileged, utilisez des capacités spécifiques à la place",
    "title": "Mode conteneur privilégié"
  },
  "sast.dockerfile.root_user": {
    "description": "Faire fonctionner les conteneurs en tant que root augmente le risque de sécurité",
    "remediation": "Créez et utilisez un utilisateur non-root",
    "title": "Conteneur fonctionnant en tant qu'utilisateur root"
  },
  "sast.dockerfile.secrets_in_env": {
    "description": "Les secrets ne devraient pas être stockés dans les variables d'environnement",
    "remediation": "Utilisez Docker secrets ou la gestion de secrets externe",
    "title": "Secret potentiel dans une variable d'environnement"
  },
  "sast.file_limit_exceeded": {
    "description": "Trouvé {found} fichiers, mais la licence limite à {limit}",
    "remediation": "Mettez à niveau la licence ou réduisez la portée avec des motifs d'exclusion",
    "title": "Limite de fichiers dépassée"
  },
  "sast.generic.hardcoded_secrets": {
    "description": "Des secrets potentiels ont été trouvés dans le code source",
    "remediation": "Utilisez des variables d'environnement ou un système de gestion des secrets",
    "title": "Secrets codés en dur détectés"
  },
  "sast.generic.weak_crypto": {
    "description": "L'usage de {algorithm} est déconseillé pour des raisons de sécurité",
    "remediation": "Utilisez des algorithmes cryptographiques plus forts comme SHA-256, AES-256",
    "title": "Algorithme cryptographique faible détecté"
  },
  "sast.js.dom_xss": {
    "description": "La ligne {line} utilise innerHTML avec des données utilisateur",
    "remediation": "Utilisez textContent ou sanitizez avec DOMPurify",
    "title": "Vulnérabilité DOM XSS potentielle"
  },
  "sast.js.eval_usage": {
    "description": "L'usage d'eval() à la ligne {line} peut exécuter du code arbitraire",
    "remediation": "Évitez eval() ou utilisez JSON.parse() pour les données",
    "title": "Usage dangereux d'eval() détecté"
  },
  "sast.kotlin.intent_vulnerability": {
    "description": "Les actions Intent codées en dur peuvent être vulnérables",
    "remediation": "Validez les sources Intent et utilisez des Intents explicites quand possible",
    "title": "Problème de sécurité Intent potentiel"
  },
  "sast.kotlin.sql_injection": {
    "description": "L'interpolation de chaîne dans rawQuery peut conduire à une injection SQL",
    "remediation": "Utilisez des requêtes paramétrées avec des placeholders ?",
    "title": "Injection SQL potentielle en Android"
  },
  "sast.missing_target": {
    "description": "L'analyse statique nécessite un chemin source ou des fichiers explicites.",
    "remediation": "Fournissez un argument --source-path ou sélectionnez des fichiers dans l'onglet SAST.",
    "title": "Aucune cible source configurée"
  },
  "sast.no_files_found": {
    "description": "Aucun fichier source correspondant aux critères n'a été trouvé",
    "remediation": "Vérifiez les extensions de fichiers et les motifs d'exclusion",
    "title": "Aucun fichier source trouvé"
  },
  "sast.not_configured": {
    "description": "L'analyse de code source nécessite le paramètre --source-path",
    "remediation": "Fournissez un chemin de code source avec l'option --source-path",
    "title": "Analyse de code source non configurée"
  },
  "sast.objc.format_string": {
    "description": "Utiliser des variables directement dans NSLog peut être non sécurisé",
    "remediation": "Utilisez le format NSLog(@\"%@\", variable)",
    "title": "Vulnérabilité de chaîne de format potentielle dans NSLog"
  },
  "sast.objc.weak_crypto": {
    "description": "MD5 et SHA1 sont cryptographiquement faibles",
    "remediation": "Utilisez SHA-256 ou des algorithmes plus forts",
    "title": "Algorithme cryptographique faible"
  },
  "sast.path_not_found": {
    "description": "Le chemin source {path} n'existe pas",
    "remediation": "Vérifiez le chemin source et assurez-vous qu'il est accessible",
    "title": "Chemin source non trouvé"
  },
  "sast.php.command_injection": {
    "description": "La ligne {line} exécute une commande système avec l'entrée utilisateur",
    "remediation": "Utilisez escapeshellarg() et validez l'entrée, préférez des alternatives sûres",
    "title": "Vulnérabilité d'injection de commande potentielle"
  },
  "sast.php.file_inclusion": {
    "description": "La ligne {line} inclut un fichier basé sur l'entrée utilisateur",
    "remediation": "Validez et mettez en liste blanche les fichiers autorisés, évitez l'entrée utilisateur dans les chemins d'inclusion",
    "title": "Vulnérabilité d'inclusion de fichier locale/distante potentielle"
  },
  "sast.php.sql_injection": {
    "description": "La ligne {line} utilise des données utilisateur dans une requête SQL",
    "remediation": "Utilisez des requêtes préparées avec liaison de paramètres (PDO::prepare() ou mysqli_prepare())",
    "title": "Vulnérabilité d'injection SQL potentielle"
  },
  "sast.php.xss": {
    "description": "La ligne {line} affiche des données utilisateur non filtrées",
    "remediation": "Utilisez htmlspecialchars() ou filter_var() pour assainir la sortie",
    "title": "Vulnérabilité de Cross-Site Scripting (XSS) potentielle"
  },
  "sast.powershell.execution_policy": {
    "description": "Contourner la politique d'exécution réduit la sécurité",
    "remediation": "Utilisez une signature de code appropriée au lieu de contourner la politique",
    "title": "Contournement de la politique d'exécution"
  },
  "sast.powershell.hardcoded_credentials": {
    "description": "Les identifiants codés en dur dans les scripts sont non sécurisés",
    "remediation": "Utilisez Windows Credential Manager ou un coffre-fort sécurisé",
    "title": "Identifiants codés en dur en PowerShell"
  },
  "sast.powershell.invoke_expression": {
    "description": "Invoke-Expression peut exécuter du code arbitraire",
    "remediation": "Évitez Invoke-Expression ou validez soigneusement l'entrée",
    "title": "Usage dangereux d'Invoke-Expression"
  },
  "sast.python.eval_usage": {
    "description": "L'usage d'eval/exec à la ligne {line} peut exécuter du code arbitraire",
    "remediation": "Utilisez ast.literal_eval() pour une évaluation sûre ou évitez l'exécution dynamique",
    "title": "Usage dangereux d'eval/exec"
  },
  "sast.python.sql_injection": {
    "description": "Injection SQL potentielle à la ligne {line}",
    "remediation": "Utilisez des requêtes paramétrées avec des placeholders (?, %s)",
    "title": "Injection SQL"
  },
  "sast.python.command_injection": {
    "description": "Injection de commande système à la ligne {line}",
    "remediation": "Utilisez subprocess avec une liste d'arguments au lieu de shell=True",
    "title": "Injection de commande système"
  },
  "sast.python.pickle_usage": {
    "description": "Désérialisation pickle dangereuse à la ligne {line}",
    "remediation": "Évitez pickle.loads() ou utilisez hmac pour signer les données",
    "title": "Désérialisation pickle non sécurisée"
  },
  "sast.python.hardcoded_credential": {
    "description": "Identifiants hardcodés détectés à la ligne {line}",
    "remediation": "Utilisez des variables d'environnement ou un gestionnaire de secrets",
    "title": "Identifiants hardcodés"
  },
  "sast.ruby.command_injection": {
    "description": "La ligne {line} exécute une commande système avec l'entrée utilisateur",
    "remediation": "Utilisez Open3.capture3() ou shellwords pour une exécution de commande sûre",
    "title": "Injection de commande potentielle en Ruby"
  },
  "sast.ruby.eval_usage": {
    "description": "eval() peut exécuter du code arbitraire",
    "remediation": "Évitez eval() ou utilisez des alternatives plus sûres comme JSON.parse",
    "title": "Usage dangereux d'eval() en Ruby"
  },
  "sast.ruby.sql_injection": {
    "description": "La ligne {line} utilise l'interpolation de chaîne dans les requêtes SQL",
    "remediation": "Utilisez des requêtes paramétrées ou des méthodes ActiveRecord avec des placeholders",
    "title": "Injection SQL potentielle en Rails"
  },
  "sast.rust.raw_pointer": {
    "description": "Les pointeurs bruts peuvent conduire à des problèmes de sécurité mémoire",
    "remediation": "Préférez les motifs Rust sûrs et validez les opérations sur les pointeurs",
    "title": "Usage de pointeur brut détecté"
  },
  "sast.rust.transmute_usage": {
    "description": "transmute peut causer un comportement indéfini s'il est mal utilisé",
    "remediation": "Utilisez des alternatives plus sûres ou validez soigneusement l'usage de transmute",
    "title": "Usage dangereux de transmute"
  },
  "sast.rust.unsafe_block": {
    "description": "Les blocs non sécurisés contournent les garanties de sécurité de Rust",
    "remediation": "Examinez attentivement le code non sécurisé et minimisez son usage",
    "title": "Bloc de code Rust non sécurisé détecté"
  },
  "sast.scan_error": {
    "description": "Impossible d'analyser le fichier : {error}",
    "remediation": "Vérifiez l'encodage et les permissions du fichier",
    "title": "Erreur d'analyse dans {file}"
  },
  "sast.shell.command_injection": {
    "description": "Les variables non quotées dans les commandes dangereuses peuvent conduire à une injection",
    "remediation": "Quotez toutes les variables : \"$variable\"",
    "title": "Injection de commande potentielle dans un script shell"
  },
  "sast.shell.eval_usage": {
    "description": "eval peut exécuter des commandes arbitraires",
    "remediation": "Évitez eval ou validez soigneusement l'entrée",
    "title": "Usage dangereux d'eval en shell"
  },
  "sast.shell.hardcoded_password": {
    "description": "Les mots de passe codés en dur sont un risque de sécurité",
    "remediation": "Utilisez des variables d'environnement ou la gestion de secrets sécurisée",
    "title": "Mot de passe codé en dur dans un script shell"
  },
  "sast.swift.http_connection": {
    "description": "Les connexions HTTP ne sont pas chiffrées",
    "remediation": "Utilisez HTTPS pour toutes les communications réseau",
    "title": "Connexion HTTP non sécurisée"
  },
  "sast.swift.keychain_issue": {
    "description": "kSecAttrAccessibleAlways rend les éléments du trousseau accessibles même quand verrouillé",
    "remediation": "Utilisez des paramètres d'accessibilité plus restrictifs comme kSecAttrAccessibleWhenUnlocked",
    "title": "Paramètre d'accessibilité Keychain non sécurisé"
  },
  "sast.terraform.hardcoded_secret": {
    "description": "Les secrets ne devraient pas être codés en dur dans les fichiers Terraform",
    "remediation": "Utilisez les variables Terraform, AWS Secrets Manager, ou HashiCorp Vault",
    "title": "Secret codé en dur en Terraform"
  },
  "sast.terraform.overly_permissive": {
    "description": "0.0.0.0/0 permet l'accès depuis n'importe où",
    "remediation": "Restreignez les blocs CIDR à des plages IP spécifiques",
    "title": "Accès réseau trop permissif"
  },
  "sast.terraform.unencrypted_storage": {
    "description": "Le stockage devrait être chiffré",
    "remediation": "Définissez encrypted = true pour les ressources de stockage",
    "title": "Configuration de stockage non chiffré"
  },
  "sast_clear_files_button": "🧹 Vider",
  "sast_detailed": "📝 Rapport détaillé",
  "sast_detected_files": "📄 Fichiers détectés : {count}",
  "sast_files_analyzed_line": "   Fichiers analysés: {count}",
  "sast_files_label": "📋 Fichiers à analyser :",
  "sast_folder_label": "📂 Dossier à analyser :",
  "sast_info_disabled": "❌ SAST non disponible - Licence PRO/ENTERPRISE/SYSOP requise",
  "sast_info_generic": "✅ SAST activé - Limites selon votre licence",
  "sast_info_limits": "✅ SAST activé - Max : {files} fichiers, {size}",
  "sast_languages_label": "Langages analysés : {languages}",
  "sast_manual_label": "📄 Ou sélectionner des fichiers :",
  "sast_no_files_warning": "Aucun fichier source reconnu n'a été détecté pour cet emplacement.\nVérifiez que votre dossier contient des fichiers .py, .js, .php, etc.\nAjustez les exclusions ou choisissez un dossier contenant le code source.",
  "sast_options_frame": "🔧 Options SAST",
  "sast_recursive": "🔄 Analyser sous-dossiers",
  "sast_remove_file_button": "🗑️ Supprimer",
  "sast_results_frame": "🔍 Résultats de l'Analyse SAST",
  "sast_scan_button": "🔍 Analyser le Code",
  "sast_scan_incomplete_body": "Sélectionnez un dossier ou des fichiers à analyser.",
  "sast_scan_incomplete_title": "Configuration incomplète",
  "sast_scan_started_line": "🔍 Lancement de l'analyse SAST pour {count} fichier(s)...",
  "sast_select_files_button": "📄 Sélectionner fichiers",
  "sast_selected_folder": "📂 Dossier : {path}",
  "sast_selection_frame": "📁 Sélection des Fichiers Source",
  "save_domains_hint": "Sauvegarder la liste des domaines",
  "scan_started_line": "🚀 Démarrage du scan pour {count} domaine(s)...",
  "scan_summary": "✅ Scan terminé: {} domaines, {} observations",
  "scanner": {
    "unhandled_error": {
      "description": "Le module {module} a échoué avec l'erreur : {error}",
      "remediation": "Consultez la pile d'appels et la connectivité réseau.",
      "title": "Erreur imprévue du scanner"
    }
  },
  "scanning_domain": "Scan de {} en cours...",
  "severity_critical": "CRITIQUE",
  "severity_high": "ÉLEVÉ",
  "severity_info": "INFO",
  "severity_low": "FAIBLE",
  "severity_medium": "MOYEN",
  "source_files_filter": "Fichiers source",
  "static": {
    "dom_fetch_failed": {
      "description": "Impossible de récupérer la page {url} : {error}",
      "impact": "Sans document de base, l'analyse statique ne peut pas évaluer l'exposition.",
      "remediation": "Vérifiez le DNS, les règles de pare-feu et la configuration TLS de l'hôte cible.",
      "title": "Impossible de récupérer le DOM"
    },
    "dynamic_js_execution": {
      "description": "Le code inline utilise eval()/Function sur {count} occurrences.",
      "impact": "L'évaluation dynamique facilite l'exécution de charges injectées.",
      "remediation": "Refactorisez pour éviter les API de type eval et appliquez des hashes CSP.",
      "title": "Exécution JavaScript dynamique"
    },
    "form_without_csrf": {
      "description": "Le formulaire POST cible « {action} » sans champ CSRF caché.",
      "impact": "Les formulaires sans défense CSRF exposent les actions authentifiées à la falsification.",
      "remediation": "Injectez des jetons anti-CSRF générés côté serveur et vérifiez-les.",
      "title": "Formulaire sans jeton CSRF"
    },
    "inline_event_handlers": {
      "description": "Le DOM contient {count} gestionnaires on* sans nonce CSP.",
      "impact": "Les gestionnaires inline constituent un point d'injection pour les XSS reflétés.",
      "remediation": "Remplacez les gestionnaires inline par addEventListener et appliquez des nonces CSP.",
      "title": "Gestionnaires inline détectés"
    },
    "inline_script_pattern": {
      "description": "Un script inline correspond au motif « {pattern} ».",
      "impact": "Les scripts inline réduisent l'efficacité de la CSP et facilitent les XSS.",
      "remediation": "Externalisez les scripts avec des nonces CSP ou nettoyez le contenu dynamique.",
      "title": "Script inline avec motif risqué"
    },
    "no_heuristics": {
      "description": "L'analyse du DOM n'a pas détecté de jeton CSRF manquant ni de scripts inline dangereux.",
      "impact": "La couverture heuristique est limitée et doit compléter les tests dynamiques.",
      "remediation": "Maintenez les nonces CSP et la validation CSRF côté serveur.",
      "title": "Aucune heuristique statique déclenchée"
    },
    "playwright_failed": {
      "description": "L'inspection via navigateur headless a échoué : {error}",
      "impact": "Les heuristiques sur les gestionnaires inline sont limitées au parsing statique.",
      "remediation": "Installez les navigateurs Playwright et assurez-vous que le sandbox autorise le mode headless.",
      "title": "Analyse Playwright échouée"
    }
  },
  "status_completed": "Scan terminé avec succès",
  "status_error": "Erreur lors du scan",
  "status_no_source": "⚠️ Aucun fichier source",
  "status_ready": "✅ Prêt",
  "status_ready_license": "✅ Prêt - Licence {tier}",
  "status_sast_done": "✅ Analyse SAST terminée",
  "status_sast_error": "❌ Erreur SAST",
  "status_sast_running": "🔍 Analyse SAST en cours...",
  "status_scan_done": "✅ Scan terminé",
  "status_scan_error": "❌ Scan en erreur",
  "status_scan_progress": "🔍 Analyse {index}/{total} - {domain}",
  "status_scan_running": "🔄 Scan en cours...",
  "status_scanning": "Scan en cours...",
  "status_stopped": "Scan arrêté",
  "stopped": "Arrêté",
  "subscription_checkout_error": "Impossible d'ouvrir la page de paiement : {}",
  "subscription_checkout_opened": "Redirection vers la page de paiement…",
  "subscription_discount_format": "-{} % par rapport au mensuel",
  "subscription_discount_label": "Économies annuelles",
  "subscription_feature_api": "Accès API",
  "subscription_feature_html_export": "Exports HTML",
  "subscription_feature_invasive": "Tests invasifs",
  "subscription_feature_multi_user": "Gestion multi-utilisateurs",
  "subscription_feature_scan_passive": "Scans passifs",
  "subscription_invasive_not_allowed": "Le mode invasif nécessite un abonnement PRO ou supérieur.",
  "subscription_manage_plan": "Gérer mon abonnement",
  "subscription_payment_unavailable": "Le service de paiement est temporairement indisponible. Contactez le support pour mettre à niveau votre abonnement.",
  "subscription_plan_enterprise_features": "Tout PRO\nGestion multi-utilisateurs\nAccès API et intégrations",
  "subscription_plan_enterprise_price_annual": "490 € / an",
  "subscription_plan_enterprise_price_monthly": "49 € / mois",
  "subscription_plan_enterprise_title": "Plan Enterprise",
  "subscription_plan_free_price": "0 €",
  "subscription_plan_free_title": "Plan Free",
  "subscription_plan_pro_features": "Scans illimités\nTests invasifs\nExports HTML avancés",
  "subscription_plan_pro_price_annual": "99 € / an",
  "subscription_plan_pro_price_monthly": "9,99 € / mois",
  "subscription_plan_pro_title": "Plan PRO",
  "subscription_pricing_label": "Tarification",
  "subscription_select_annual": "Annuel",
  "subscription_select_monthly": "Mensuel",
  "subscription_table_feature_header": "Fonctionnalité",
  "subscription_upgrade_cta": "Passer à PRO",
  "subscription_upgrade_message_domains": "La formule Free est limitée à 3 domaines. Passez à PRO pour scanner davantage de cibles.",
  "subscription_upgrade_message_generic": "Débloquez toutes les fonctionnalités professionnelles.",
  "subscription_upgrade_message_html_export": "L'export HTML est réservé aux abonnements PRO. Passez à PRO pour générer des rapports avancés.",
  "subscription_upgrade_needed": "Mise à niveau requise",
  "subscription_upgrade_subtitle": "Choisissez l'offre la plus adaptée à votre équipe.",
  "subscription_upgrade_title": "Débloquez Web Sentinel PRO",
  "success_domains_loaded": "Chargé {} domaines depuis {}",
  "success_domains_saved": "Sauvegardé {} domaines vers {}",
  "success_export": "Rapport exporté vers {}",
  "success_scan_complete": "Scan de {} domaines terminé avec succès!",
  "summary_label": "Résumé",
  "summary_no_issue": "✅ Aucun problème détecté",
  "tab_domain_scan": "🌐  Scan de Domaine",
  "tab_reports_history": "📊  Rapports & Historique",
  "tab_sast_analysis": "🔍  Code Source (SAST)",
  "tab_settings": "⚙️  Configuration",
  "text_files": "Fichiers texte",
  "thirdparty": {
    "burp_detected": {
      "description": "API Burp Enterprise accessible à {url}.",
      "impact": "La corrélation des findings Burp améliore la priorisation.",
      "remediation": "Automatisez la planification des scans et l'import via l'orchestrateur.",
      "title": "API Burp Enterprise détectée"
    },
    "burp_error": {
      "description": "L'API Burp a répondu avec le statut HTTP {status}.",
      "impact": "Les données de vulnérabilité externes ne peuvent pas être synchronisées.",
      "remediation": "Inspectez les journaux Burp Enterprise et validez les permissions du compte.",
      "title": "Erreur retournée par l'API Burp Enterprise"
    },
    "burp_not_configured": {
      "description": "Définissez BURP_API_URL/BURP_API_KEY pour agréger les problèmes passifs.",
      "impact": "Les baselines Burp ne seront pas corrélées dans les rapports Sentinel.",
      "remediation": "Exposez l'API REST de Burp Enterprise et créez une clé API en lecture seule.",
      "title": "API Burp Enterprise non configurée"
    },
    "burp_unreachable": {
      "description": "Impossible de contacter Burp Enterprise à {url} : {error}",
      "impact": "Aucun rapprochement entre Burp et les diagnostics internes.",
      "remediation": "Vérifiez l'accès VPN, les certificats TLS et la validité de la clé API.",
      "title": "API Burp Enterprise injoignable"
    },
    "nikto_detected": {
      "description": "Nikto est accessible à l'emplacement {path}.",
      "impact": "Les baselines Nikto peuvent être exécutées dans les orchestrations planifiées.",
      "remediation": "Lancez Nikto avec `-Plugins passive -Format json` et importez les résultats.",
      "title": "Binaire Nikto détecté"
    },
    "nikto_not_found": {
      "description": "L'exécutable Nikto est absent du PATH ; le profil passif ne peut pas démarrer.",
      "impact": "La couverture des mauvaises configurations HTTP sera absente.",
      "remediation": "Installez Nikto et exposez son chemin via NIKTO_PATH ou le PATH système.",
      "title": "Binaire Nikto introuvable"
    },
    "ready": {
      "description": "OWASP ZAP, Burp Suite Enterprise ou Nikto sont disponibles pour l'orchestration.",
      "impact": "L'exécution coordonnée étend la couverture avec des outils spécialisés.",
      "remediation": "Déclenchez des scans via les CLI/API des intégrations.",
      "title": "Intégrations tierces détectées"
    },
    "zap_detected": {
      "description": "API ZAP accessible à {url} (version {version}).",
      "impact": "Les scans passifs ZAP peuvent être planifiés avec les vérifications internes.",
      "remediation": "Configurez le contexte ZAP pour restreindre le périmètre et partager les sessions.",
      "title": "API OWASP ZAP détectée"
    },
    "zap_error": {
      "description": "L'API ZAP a répondu avec le statut HTTP {status}.",
      "impact": "Les résultats passifs ne peuvent pas être récupérés depuis ZAP.",
      "remediation": "Consultez les logs ZAP et vérifiez l'accessibilité de l'API avec la clé fournie.",
      "title": "Erreur retournée par l'API OWASP ZAP"
    },
    "zap_not_configured": {
      "description": "Définissez ZAP_API_URL et éventuellement ZAP_API_KEY pour activer l'intégration.",
      "impact": "Sans API, l'orchestrateur ne peut pas lancer les scans de base.",
      "remediation": "Démarrez OWASP ZAP en mode daemon et exposez l'API localement avec restrictions.",
      "title": "API OWASP ZAP non configurée"
    },
    "zap_unreachable": {
      "description": "Impossible de contacter l'API ZAP à {url} : {error}",
      "impact": "Le spidering passif et l'export d'alertes sont désactivés.",
      "remediation": "Contrôlez que le daemon fonctionne, que le réseau autorise l'accès et que la clé API est valide.",
      "title": "API OWASP ZAP injoignable"
    }
  },
  "timeout_label": "Timeout (sec):",
  "tls": {
    "certificate_expired": {
      "description": "Le certificat a expiré le {date}.",
      "remediation": "Renouvelez immédiatement le certificat et déployez la nouvelle chaîne.",
      "title": "Certificat TLS expiré"
    },
    "certificate_missing": {
      "description": "La négociation TLS a réussi mais aucun certificat n'a été renvoyé.",
      "impact": "Les navigateurs bloquent la connexion car la chaîne de certificats est incomplète.",
      "remediation": "Réémettez le certificat TLS et installez-le correctement sur le répartiteur de charge.",
      "title": "Certificat TLS manquant"
    },
    "certificate_near_expiry": {
      "description": "Le certificat expire le {date} (reste {days} jours).",
      "remediation": "Planifiez le renouvellement du certificat avant la date d'expiration.",
      "title": "Certificat proche de l'expiration"
    },
    "certificate_not_yet_valid": {
      "description": "Le certificat ne devient valide qu'à partir du {date}.",
      "remediation": "Regénérez le certificat avec une période de validité cohérente.",
      "title": "Certificat pas encore valide"
    },
    "handshake_failed": {
      "description": "Impossible d'établir une session TLS avec {domain}:{port} : {error}",
      "impact": "Les clients ne peuvent pas établir de session chiffrée avec le service.",
      "remediation": "Vérifiez que le service HTTPS est actif et que la chaîne de certificats est valide.",
      "title": "Échec de la négociation TLS"
    },
    "hostname_not_covered": {
      "description": "{domain} est absent de la liste SAN : {san_list}",
      "remediation": "Générez un certificat incluant ce nom d'hôte dans le SAN.",
      "title": "Nom d'hôte non couvert par le certificat"
    },
    "http_redirect_check_failed": {
      "description": "Impossible de vérifier le comportement de redirection HTTP : {error}",
      "impact": "Les clients peuvent rester sur HTTP si la redirection échoue.",
      "remediation": "Assurez-vous que le port 80 est accessible ou fermé si tout le trafic est en HTTPS.",
      "title": "Échec de la vérification de redirection HTTP"
    },
    "http_redirect_not_permanent": {
      "description": "La première réponse HTTP renvoie le code {status} au lieu d'un 301/308.",
      "impact": "Les caches et moteurs de recherche peuvent ignorer les règles de redirection.",
      "remediation": "Répondez avec 301 ou 308 pour imposer la montée automatique vers HTTPS.",
      "title": "Redirection HTTP non permanente"
    },
    "https_port_unreachable": {
      "description": "Erreur réseau lors de l'accès à {domain}:{port} : {error}",
      "impact": "Les visiteurs risquent de basculer en HTTP en clair ou de subir une indisponibilité.",
      "remediation": "Assurez-vous que le port 443 est ouvert et qu'aucun pare-feu ne bloque l'accès.",
      "title": "Port HTTPS inaccessible"
    },
    "https_redirect_missing": {
      "description": "La sonde HTTP aboutit sur l'URL en clair {url}.",
      "impact": "Les visiteurs restent exposés aux interceptions en clair.",
      "remediation": "Redirigez tout le trafic HTTP vers HTTPS avec des réponses 301 ou 308.",
      "title": "Absence de redirection HTTPS"
    },
    "legacy_protocol": {
      "description": "Le serveur accepte encore la version TLS obsolète {protocol}.",
      "impact": "Les protocoles obsolètes affaiblissent le chiffrement et compromettent la conformité.",
      "remediation": "Désactivez TLS 1.0/1.1 sur le serveur ou le répartiteur de charge.",
      "title": "Protocole TLS obsolète accepté"
    },
    "no_san": {
      "description": "Le certificat ne contient aucune entrée Subject Alternative Name.",
      "remediation": "Émettez un certificat incluant des entrées SAN pour les domaines couverts.",
      "title": "Certificat sans SAN"
    }
  },
  "tls_cert_expired": "Certificat SSL expiré",
  "tls_cert_expiring": "Certificat SSL expire dans {} jours",
  "tls_handshake_failed": "Échec de la négociation TLS",
  "tls_legacy_protocol": "Protocole TLS obsolète détecté: {}",
  "unit_mb": "Mo",
  "unknown_domain": "Inconnu",
  "unlimited_domains": "Illimité",
  "unlimited_files": "Illimité",
  "unlimited_size": "Illimitée",
  "user_license_button": "📄 Licence",
  "user_login_button": "🔐 Connexion",
  "user_logout_button": "🚪 Déconnexion",
  " not in match": {
    "group(0):\n            # Ajoute la clé i18n avant la parenthèse fermante\n            full_match = match": {
      "group(0)\n            if full_match": {
        "endswith(": {
          "title": "Problème de sécurité détecté",
          "description": "Un problème de sécurité a été identifié ( not in match.group(0):\n            # Ajoute la clé i18n avant la parenthèse fermante\n            full_match = match.group(0)\n            if full_match.endswith().",
          "remediation": "Examinez et corrigez cette vulnérabilité de sécurité."
        }
      }
    }
  },
  "([^": {
    "title": "Problème de sécurité détecté",
    "description": "Un problème de sécurité a été identifié (([^).",
    "remediation": "Examinez et corrigez cette vulnérabilité de sécurité."
  },
  "Potential Command Injection vulnerability": {
    "title": "Problème de sécurité détecté",
    "description": "Un problème de sécurité a été identifié (Potential Command Injection vulnerability).",
    "remediation": "Examinez et corrigez cette vulnérabilité de sécurité."
  },
  "dialog_select_source_files": {
    "title": "Problème de sécurité détecté",
    "description": "Un problème de sécurité a été identifié (dialog_select_source_files).",
    "remediation": "Examinez et corrigez cette vulnérabilité de sécurité."
  },
  "dialog_select_source_folder": {
    "title": "Problème de sécurité détecté",
    "description": "Un problème de sécurité a été identifié (dialog_select_source_folder).",
    "remediation": "Examinez et corrigez cette vulnérabilité de sécurité."
  },
  "profile_default_description": {
    "title": "Problème de sécurité détecté",
    "description": "Un problème de sécurité a été identifié (profile_default_description).",
    "remediation": "Examinez et corrigez cette vulnérabilité de sécurité."
  },
  "severity_": {
    "title": "Problème de sécurité détecté",
    "description": "Un problème de sécurité a été identifié (severity_).",
    "remediation": "Examinez et corrigez cette vulnérabilité de sécurité."
  },
  "{i18n_key}": {
    "title": "Problème de sécurité détecté",
    "description": "Un problème de sécurité a été identifié ({i18n_key}).",
    "remediation": "Examinez et corrigez cette vulnérabilité de sécurité."
  },
  "ui": {
    "domain_scan_running_title": "Scan in progress",
    "domain_scan_running_body": "Please wait, a scan is already running.",
    "domain_missing_body": "Please add at least one domain to scan.",
    "domain_limit_body": "Your license allows scanning up to {limit} domain(s) simultaneously.",
    "domain_invasive_warning": "Invasive tests are reserved for PRO and higher licenses.",
    "domain_scan_error": "The scan failed: {error}",
    "status_scan_running": "🔄 Scan in progress...",
    "status_scan_progress": "🔍 Scanning {index}/{total} - {domain}",
    "status_scan_done": "✅ Scan completed",
    "status_scan_error": "❌ Scan failed",
    "scan_started_line": "🚀 Starting scan for {count} domain(s)...",
    "domain_limit_title": "Limit reached",
    "dialog_export_results_json": "Export results to JSON",
    "dialog_export_results_html": "Export results to HTML",
    "export_no_results": "No results to export.",
    "export_no_report": "No report to export.",
    "export_results_success": "Results exported to {filename}",
    "export_results_error": "Error while exporting: {error}",
    "login_error_message": "Error during sign-in: {error}",
    "logout_error_message": "Error during sign-out: {error}",
    "login_success_title": "Success",
    "login_success_message": "Successfully signed in!",
    "logout_success_message": "Signed out successfully",
    "dialog_export_sast_json": "Export SAST results to JSON",
    "dialog_export_sast_html": "Export SAST results to HTML",
    "sast_info_limits": "✅ SAST enabled – Max: {files} files, {size}",
    "sast_scan_incomplete_body": "Select a folder or files to analyze.",
    "status_no_source": "⚠️ No source files"
  }
}