"""VoxCast UI strings: French. Key/placeholder parity with en.py enforced."""

STRINGS: dict[str, str] = {
    # ── Panel (main.qml) ────────────────────────────────────────────────
    "panel_ready": "Prêt",
    "panel_transcribing": "Transcription...",
    "panel_correcting": "Correction...",
    "panel_enhancing": "Amélioration (IA)…",
    "panel_converting": "Conversion...",
    "panel_error": "Erreur",
    "panel_drop_file": "Déposer un fichier → Markdown",
    "panel_acc_ai_mode": "Mode IA",
    "panel_acc_settings": "Paramètres",
    "panel_acc_undock": "Détacher",
    "panel_acc_hide": "Masquer",

    # ── Settings window ─────────────────────────────────────────────────
    "settings_title": "Paramètres",
    "sec_interface": "INTERFACE",
    "row_ui_language": "Langue",
    "sec_audio": "AUDIO",
    "row_microphone": "Microphone",
    "opt_system_default": "Par défaut du système",
    "row_voice_test": "Test vocal",
    "btn_test": "Tester",
    "btn_stop": "Arrêter",
    "btn_play": "Lire",
    "sec_recognition": "RECONNAISSANCE",
    "row_model": "Modèle",
    "model_swift": "Swift",
    "model_precise": "Precise",
    "model_ultra": "Ultra",
    "hint_model_swift": "Rapide et léger, le bon choix pour les ordinateurs portables et les PC sans carte graphique.",
    "hint_model_precise": "Précision équilibrée, un choix solide au quotidien, fonctionne bien sur la plupart des PC.",
    "hint_model_ultra": "Précision maximale, idéal avec une carte graphique (4 Go); nettement plus lent sans elle.",
    "compat_gpu_ok": "Fonctionnera sur votre carte graphique ({vram} Go).",
    "compat_gpu_low": "Votre carte graphique ({vram} Go) a trop peu de mémoire pour ce modèle, il fonctionnera sur le processeur (plus lent).",
    "compat_cpu": "Aucune carte graphique compatible détectée, ce modèle fonctionnera sur le processeur.",
    "compat_cpu_forced": "Fonctionnera sur le processeur (défini dans les paramètres).",
    "row_language": "Langue",
    "row_lang_auto": "Détection automatique de la langue",
    "hint_lang_auto": "Détecte la langue à chaque dictée. Une langue fixe est plus rapide et plus précise.",
    "row_live_mode": "Transcription en direct",
    "hint_live_mode": "Le texte apparaît au curseur pendant que vous parlez, au lieu d'apparaître après l'arrêt. Pas d'amélioration IA dans ce mode; le texte est saisi au curseur.",
    "hint_output_live": "La transcription en direct est activée : le texte est saisi au curseur pendant que vous parlez, ces options de sortie ne s'appliquent donc pas.",
    "hint_live_cpu": "Fonctionne mieux avec une carte graphique; sur le processeur, la transcription peut prendre du retard sur votre voix.",
    "live_cpu_warning": "Le mode direct fonctionne sur le processeur et peut prendre du retard; une carte graphique est recommandée.",
    "sec_output": "SORTIE",
    "row_text_output": "Sortie du texte",
    "opt_clipboard": "Presse-papiers",
    "opt_type_at_cursor": "Saisir au curseur",
    "opt_both": "Les deux",
    "row_insert_method": "Méthode d'insertion",
    "opt_paste": "Coller (Ctrl+V)",
    "opt_typing": "Saisie",
    "hint_typing": "Simule une saisie au clavier. Fonctionne dans les terminaux.",
    "sec_controls": "COMMANDES",
    "row_hotkey": "Raccourci",
    "row_mode": "Mode",
    "opt_hold": "Maintenir",
    "opt_toggle": "Basculer",
    "sec_performance": "PERFORMANCES",
    "row_compute": "Calcul",
    "opt_auto": "Auto",
    "opt_gpu": "GPU",
    "opt_cpu": "CPU",
    "hint_cpu_slow": "Le mode CPU est plus lent.",
    "sec_system": "SYSTÈME",
    "row_autostart": "Démarrage automatique",
    "row_startup_sound": "Son de démarrage",
    "row_recording_sound": "Son d'enregistrement",
    "row_shutdown_sound": "Son de fermeture",
    "row_always_on_top": "Toujours au premier plan",
    "row_small_panel": "Petit panneau",
    "sec_file_conversion": "CONVERSION DE FICHIERS",
    "row_save_mode": "Mode d'enregistrement",
    "opt_ask": "Demander",
    "opt_beside_file": "À côté du fichier",
    "opt_folder": "Dossier",
    "row_folder": "Dossier",
    "btn_browse": "Parcourir",
    "row_timestamps": "Horodatage",
    "row_open_after": "Ouvrir ensuite",
    "row_context_menu": "Menu contextuel",
    "hint_context_menu": "Ajoute « Convertir en Markdown » au menu contextuel de l'Explorateur.",
    "sec_ai": "AMÉLIORATION IA",
    "row_enable": "Activer",
    "hint_ai": "Peaufinez vos dictées avec l'IA (nettoyage, e-mail, réponse…). Choisissez le mode actif par clic droit sur le panneau ou via le bouton IA du panneau.",
    "row_provider": "Fournisseur",
    "row_api_key": "Clé API",
    "ph_api_key": "Coller la clé API",
    "ph_api_key_saved": "•••••••• enregistrée, saisissez pour remplacer",
    "btn_save": "Enregistrer",
    "hint_key_stored": "Clé stockée en sécurité dans le Gestionnaire d'identification Windows.",
    "btn_clear": "Effacer",
    "btn_load": "Charger",
    "btn_loading": "Chargement",
    "row_active_mode": "Mode actif",
    "mode_normal": "Normal (sans IA)",
    # Display names of the built-in AI modes (shown while the user hasn't
    # renamed them; the stored name stays the English default).
    "mode_cleanup": "Nettoyer",
    "mode_email": "E-mail",
    "mode_reply": "Réponse",
    "mode_todo": "Liste de tâches",
    "mode_notes": "Notes",
    "mode_formal": "Formel",
    "lbl_custom_modes": "Modes personnalisés",
    "sec_license": "LICENCE",
    "row_status": "Statut",
    "lic_activated": "● Activé",
    "lic_not_activated": "○ Non activé",
    "btn_activate": "Activer",
    "sec_updates": "MISES À JOUR",
    "row_version": "Version",
    "btn_check_updates": "Rechercher des mises à jour",
    "btn_checking": "Vérification",
    "btn_downloading_pct": "{pct}%  téléchargement…",
    "btn_download_install": "Télécharger et installer v{version}",
    "btn_reset": "Réinitialiser",
    "reset_title": "Réinitialiser les paramètres",
    "reset_question": "Réinitialiser tous les paramètres aux valeurs par défaut ?",
    "dlg_model_dl_title": "Téléchargement requis",
    "dlg_model_dl_text": "Le modèle sélectionné n'est pas encore installé. VoxCast téléchargera environ {size} de données vocales, puis basculera. Lancer le téléchargement maintenant ?",

    # ── Mode editor ─────────────────────────────────────────────────────
    "ph_mode_name": "Nom du mode",
    "tip_remove_mode": "Supprimer le mode",
    "ph_system_prompt": "Prompt système, indique à l'IA comment transformer la transcription.",
    "btn_add_mode": "Ajouter un mode",
    "mode_new": "Nouveau mode",

    # ── Mode menu (panel) ───────────────────────────────────────────────
    "menu_ai_mode": "MODE IA",
    "menu_ai_mode_off": "MODE IA  ·  DÉSACTIVÉ",
    "menu_ai_settings": "Paramètres…",
    "menu_copy_raw": "Copier la transcription originale",
    "tray_raw_copied": "La transcription originale a été copiée dans le presse-papiers.",

    # ── Activation overlay ──────────────────────────────────────────────
    "act_title": "Activer VoxCast",
    "act_intro": "Saisissez votre clé de licence pour activer cet appareil. L'activation est une étape en ligne unique, ensuite VoxCast fonctionne entièrement hors ligne.",
    "act_enter_key": "Veuillez saisir votre clé de licence.",
    "act_button": "Activer",
    "act_button_busy": "Activation…",
    "act_update_available": "La version {version} est disponible.",
    "act_update_now": "Mettre à jour maintenant",
    "act_device": "Appareil : ",
    "act_quit": "Quitter",

    # ── First-run overlay ───────────────────────────────────────────────
    "fr_title": "Configuration de VoxCast",
    "fr_pick_language": "Sélectionnez votre langue pour la reconnaissance vocale.\nCela évite la détection automatique lente à chaque utilisation.",
    "fr_continue": "Continuer",
    "fr_preparing": "Préparation des modèles...",
    "fr_hint_label": "Astuce :",
    "status_hw_check": "Vérification du matériel...",
    "fr_hw_gpu": "Carte graphique détectée ({vram} Go) : le modèle {model} sera configuré.",
    "fr_hw_cpu": "Aucune carte graphique dédiée détectée : le modèle {model} sera configuré.",
    "fr_hint_download": "Les modèles se téléchargent une seule fois et restent sur votre appareil, aucun cloud nécessaire.",
    "fr_hint_hotkey": "Appuyez sur Ctrl+Maj+Espace pour dicter, appuyez de nouveau pour arrêter.",
    "fr_hint_ai": "Clic droit sur le panneau pour choisir un mode IA (p. ex. E-mail, Réponse).",
    "fr_hint_dragfile": "Glissez un fichier sur le panneau pour le transformer en Markdown.",
    "fr_hint_audio": "Déposez un fichier audio (mp3, ogg, m4a…) pour le transcrire.",
    "fr_hint_explorer": "Dans l'Explorateur, clic droit sur un fichier → « Convertir en Markdown ».",
    "fr_hint_dock": "Ancrez le panneau à un bord de l'écran, il s'escamote jusqu'à ce que vous en ayez besoin.",
    "fr_hint_settings": "Ouvrez les Paramètres pour changer de modèle, de langue ou de raccourci à tout moment.",

    # ── Status messages (Python → panel) ────────────────────────────────
    "status_init_services": "Initialisation des services...",
    "status_loading_vad": "Chargement de la détection d'activité vocale...",
    "status_loading_model": "Chargement du modèle de reconnaissance vocale...",
    "status_init_models": "Initialisation des modèles...",
    "status_loading": "Chargement du modèle...",
    "status_switching_model": "Changement de modèle...",
    "status_downloading_engine": "Téléchargement du moteur de reconnaissance vocale...",
    "status_engine_ready": "Moteur de reconnaissance vocale prêt",
    "status_downloading_correction": "Téléchargement du modèle de correction...",
    "status_correction_ready": "Modèle de correction téléchargé",

    # ── Meeting recording ────────────────────────────────────────────────
    "menu_meeting_start": "Enregistrer une réunion",
    "menu_meeting_stop": "Arrêter l'enregistrement de la réunion",
    "meeting_consent_title": "Enregistrer des réunions",
    "meeting_consent_body": "VoxCast enregistre l'audio du système et votre microphone afin que vous puissiez transcrire appels et réunions.\n\nAssurez-vous que tous les participants acceptent d'être enregistrés, dans de nombreux pays (y compris l'Allemagne) enregistrer un appel sans consentement est une infraction pénale.",
    "meeting_consent_accept": "Compris, démarrer l'enregistrement",
    "meeting_consent_cancel": "Annuler",
    "status_meeting_recording": "Enregistrement de la réunion",
    "status_meeting_transcribing": "Transcription de la réunion… {pct}%",
    "meeting_done_title": "Réunion transcrite",
    "meeting_done_body": "La transcription a été enregistrée, cliquez ici pour l'ouvrir.",
    "meeting_resume_note": "Un enregistrement de réunion inachevé a été trouvé, transcription en cours.",
    "menu_meeting_folder": "Ouvrir le dossier des réunions",
    "meeting_source_title": "Que faut-il enregistrer ?",
    "meeting_source_system": "Tout le système",
    "meeting_source_empty": "Aucune application ne diffuse d'audio en ce moment",
    "meeting_app_fallback": "La capture de l'application n'a pas pu démarrer, tout le système est enregistré à la place.",
    "md_meeting_source": "Source",
    "meeting_partial_note": "L'enregistrement s'est terminé prématurément, la partie enregistrée a tout de même été traitée.",
    "meeting_system_silent": "Aucun audio système n'a été capturé, vérifiez votre périphérique de lecture. Certains casques diffusent l'audio d'une manière que Windows ne peut pas enregistrer; changer le périphérique de sortie par défaut aide.",
    "meeting_summary_failed": "Le résumé IA a échoué, la transcription a été enregistrée sans lui.",
    "err_meeting_folder": "Le dossier des réunions n'a pas pu être créé. Vérifiez le dossier dans les Paramètres.",
    "err_meeting_disk": "Espace disque insuffisant, enregistrement de la réunion arrêté.",
    "err_meeting_maxlen": "Durée maximale de réunion atteinte (4 h), enregistrement arrêté.",
    "err_meeting_capture": "L'enregistrement de la réunion a échoué, aucun audio n'a pu être capturé.",
    "err_meeting_transcribe": "La transcription de la réunion a échoué. Le fichier audio a été conservé pour que vous puissiez réessayer.",
    "md_meeting_title": "Réunion",
    "md_meeting_date": "Date",
    "md_meeting_duration": "Durée",
    "md_meeting_summary": "Résumé",
    "md_meeting_transcript": "Transcription",
    "sec_remote": "Serveur distant",
    "row_remote_enable": "Utiliser un serveur distant",
    "hint_remote": "Exécutez la transcription sur un autre ordinateur doté d'un GPU ou d'un CPU plus puissant. La dictée, la conversion de fichiers et les réunions sont traitées sur le serveur.",
    "hint_recognition_remote": "Le serveur distant gère la reconnaissance, le modèle local ci-dessous est donc désactivé. Choisissez le modèle sur le serveur.",
    "row_remote_url": "Adresse du serveur",
    "ph_remote_url": "http://192.168.1.10:8590",
    "row_remote_key": "Clé API",
    "ph_remote_key": "Collez la clé API du serveur",
    "btn_remote_test": "Tester la connexion",
    "remote_testing": "Test en cours...",
    "btn_remote_discover": "Rechercher un serveur",
    "remote_discovering": "Recherche en cours...",
    "remote_discover_none": "Aucun serveur trouvé. Vérifiez que le serveur est démarré, que les deux appareils sont sur le même réseau et que le pare-feu du serveur autorise VoxCast Server sur le réseau local.",
    "remote_enhance_available": "Amélioration IA disponible",
    "remote_update_available": "Mise à jour du serveur disponible : {version}",
    "row_tls_mode": "Certificat",
    "tls_verify": "Exiger un certificat valide",
    "tls_pinned": "Faire confiance à ce serveur",
    "tls_insecure": "Autoriser n'importe quel certificat",
    "btn_trust_cert": "Vérifier le certificat",
    "tls_trust_title": "Faire confiance à ce serveur ?",
    "tls_trust_body": "Le serveur a présenté cette empreinte de certificat. Vérifiez qu'elle correspond à votre serveur avant de lui faire confiance.",
    "tls_trust_confirm": "Faire confiance",
    "tls_trust_failed": "Impossible de lire le certificat du serveur. Vérifiez l'adresse et que HTTPS est activé.",
    "tls_insecure_warning": "La connexion n'est pas vérifiée. Utilisez-la uniquement sur un réseau de confiance.",
    "row_enhance_source": "Amélioration IA",
    "enhance_own": "Ma propre clé d'API",
    "enhance_server": "Utiliser le serveur",
    "hint_enhance_server": "Le serveur améliore avec sa propre clé IA, vous n'avez donc pas besoin d'en saisir une ici.",
    "lbl_server_modes": "Modes d'entreprise (depuis le serveur)",
    "managed_locked": "Géré par votre organisation",
    "remote_http_warn": "Cette connexion n'est pas chiffrée. Utilisez-la uniquement sur un réseau local de confiance.",
    "remote_live_hint": "Les sous-titres en direct s'exécutent sur cet appareil; ils nécessitent un modèle installé localement.",
    "remote_connected": "Connecté : {model} sur {where}",
    "remote_on_gpu": "GPU ({vram} GB)",
    "remote_on_cpu": "CPU",
    "err_remote_unreachable": "Impossible de joindre le serveur distant. Vérifiez l'adresse et votre réseau.",
    "err_remote_auth": "Le serveur distant a rejeté la clé API.",
    "err_remote_busy": "Le serveur distant est occupé. Veuillez réessayer dans un instant.",
    "err_remote_failed": "Le serveur distant n'a pas pu traiter cet audio.",
    "sec_meeting": "RÉUNION",
    "row_meeting_mic": "Enregistrer le microphone",
    "hint_meeting_mic": "Capture aussi votre propre voix, pas seulement celle des autres participants.",
    "row_meeting_language": "Langue",
    "lang_meeting_auto": "Détection automatique",
    "row_convert_language": "Langue de l'audio",
    "lang_convert_auto": "Détection automatique",
    "err_convert_engine_loading": "Le moteur vocal est encore en cours de chargement. Relancez la conversion dans un instant.",
    "err_convert_no_speech": "Aucune parole n'a été reconnue dans ce fichier. Aucun fichier Markdown n'a été créé.",
    "err_convert_engine_error": "Le moteur vocal a signalé une erreur pendant la transcription.",
    "tray_convert_failed": "Impossible de convertir {name} : {error}",
    "hint_meeting_language": "La détection automatique gère les réunions dans toutes les langues, même en cas de changement en cours d'appel. Ne choisissez une langue que si la détection a du mal.",
    "row_meeting_keep": "Conserver le fichier audio",
    "hint_meeting_keep": "Enregistre la capture au format .wav à côté de la transcription.",
    "row_meeting_summary": "Résumé IA",
    "hint_meeting_summary": "Ajoute un résumé généré par l'IA en tête de la transcription (nécessite que l'amélioration IA soit configurée).",
    "hint_meeting_summary_nokey": "L'amélioration IA n'est pas configurée, les résumés seront ignorés.",
    "row_meeting_folder": "Enregistrer dans",
    "meeting_folder_default": "Documents\\VoxCast\\Meetings",
    "btn_open": "Ouvrir",

    # ── Errors / tray (Python) ──────────────────────────────────────────
    "err_audio_lib": "Bibliothèque audio non disponible",
    "err_gpu_oom": "Mémoire GPU saturée. Redémarrez en mode CPU.",
    "err_gpu_fallback": "Carte graphique non disponible, exécution sur le processeur (plus lent).",
    "err_hotkey_init": "Système de raccourcis non initialisé",
    "err_mic": "Erreur de microphone. Vérifiez votre périphérique audio.",
    "err_mic_test_busy": "Un enregistrement est déjà en cours. Arrêtez-le avant de tester le microphone.",
    "err_model_switch": "Le changement de modèle a échoué. Veuillez réessayer.",
    "err_model_download": "Le téléchargement du modèle vocal a échoué. Vérifiez votre connexion Internet.",
    "err_speech_start": "La reconnaissance vocale n'a pas pu démarrer.",
    "err_transcription": "La transcription a échoué. Veuillez réessayer.",
    "err_model_missing": "Modèle vocal introuvable. Veuillez sélectionner un modèle dans les Paramètres.",
    "tray_cpu_fallback": "Aucun GPU compatible trouvé. Exécution sur le CPU.\nLa transcription sera plus lente qu'avec l'accélération GPU.",
    "tray_cpu_configured": "Exécution sur le CPU, comme configuré dans les paramètres.",
    "tray_cpu_detected": "Aucun GPU compatible détecté. Exécution sur le CPU.\nPour une transcription plus rapide, un GPU compatible est recommandé.",
    "tray_file_not_found": "Fichier introuvable.",
    "tray_no_supported_files": "Aucun fichier pris en charge à convertir.",
    "tray_still_starting": "VoxCast démarre encore, réessayez.",
    "tray_no_output_folder": "Dossier de sortie non défini, choisissez où enregistrer.",
    "tray_context_menu_failed": "Le menu contextuel n'a pas pu être mis à jour.",
    "tray_need_api_key": "Saisissez et enregistrez d'abord une clé API.",
    "tray_models_load_failed": "Impossible de charger les modèles.",
    "tray_show_hide": "Afficher/Masquer",

    # ── License (Python user messages) ──────────────────────────────────
    "lic_enter_key": "Veuillez saisir votre clé de licence.",
    "lic_saved_failed": "Activé, mais la licence n'a pas pu être enregistrée sur ce PC.",
    "lic_success": "VoxCast est activé. Merci !",
    "lic_check_failed": "L'activation a échoué. Veuillez vérifier votre clé.",
    "lic_no_server": "Impossible de joindre le serveur d'activation. Vérifiez votre connexion Internet.",
    "lic_unexpected": "L'activation a échoué de façon inattendue. Veuillez réessayer.",

    # ── Updates (Python user messages) ──────────────────────────────────
    "upd_checking": "Recherche de mises à jour…",
    "upd_latest": "Vous êtes sur la dernière version.",
    "upd_available": "La version {version} est disponible.",
    "upd_dialog_title": "Mise à jour disponible",
    "upd_whats_new": "Nouveautés",
    "upd_required": "Obligatoire",
    "upd_no_notes": "Améliorations générales et corrections.",
    "upd_later": "Plus tard",
    "upd_install_now": "Télécharger et installer",
    "upd_install_note": "La mise à jour remplace automatiquement votre version actuelle, rien d'autre à faire.",
    "upd_downloading": "Téléchargement de la version {version}…",
    "upd_failed": "La mise à jour a échoué. Veuillez réessayer.",
    "upd_starting_installer": "Lancement de l'installateur…",
    "upd_installer_failed": "L'installateur n'a pas pu être lancé.",
    "upd_err_filename": "Nom de fichier d'installateur inattendu dans le manifeste de mise à jour.",
    "upd_err_https": "Le téléchargement de la mise à jour doit utiliser HTTPS.",
    "upd_err_response": "Le serveur de mise à jour a renvoyé une réponse invalide.",
    "upd_err_no_url": "Aucune URL de téléchargement fournie.",
    "upd_err_no_checksum": "La somme de contrôle manque dans le manifeste de mise à jour. Abandon.",
    "upd_err_redirect": "Le serveur de mise à jour a renvoyé une redirection inattendue.",
    "upd_err_integrity": "Le fichier téléchargé a échoué au contrôle d'intégrité. Abandon.",
    "upd_err_check": "Impossible de rechercher des mises à jour : {error}",
    "upd_err_download": "Le téléchargement a échoué : {error}",
    "upd_err_save": "La mise à jour n'a pas pu être enregistrée : {error}",
    "upd_err_host": "Téléchargement de mise à jour refusé depuis l'hôte non fiable '{host}'.",

    # ── LLM (user messages) ─────────────────────────────────────────────
    # ── Late additions (review sweep) ───────────────────────────────────
    "act_first": "Veuillez d'abord activer VoxCast.",
    "llm_enhance_failed": "L'amélioration IA a échoué : {error}",
    "llm_truncated": "La réponse de l'IA a été tronquée, la transcription originale a été utilisée à la place.",
    "llm_mode_needs_key": "Mode IA sélectionné, ajoutez une clé API dans les Paramètres pour activer l'amélioration.",
    "tt_recording": "Enregistrement...",
    "tray_saved": "Enregistré : {name}",
    "tray_converted": "{n} fichiers convertis en Markdown.",
    "hk_press_key": "Appuyez sur une touche...",
    "hk_acc_record": "Appuyez sur les touches du raccourci",
    "no_folder": "Aucun dossier sélectionné",
    "llm_load_models_ph": "Charger les modèles →",

    "llm_no_key": "Aucune clé API fournie.",
    "llm_no_key_configured": "Aucune clé API configurée.",
    "llm_bad_key": "Clé API invalide ou non autorisée.",
    "llm_rate_limit": "Limite de requêtes atteinte. Veuillez réessayer sous peu.",
    "llm_provider_down": "Le fournisseur d'IA est temporairement indisponible.",
    "llm_request_failed": "La requête a échoué ({code}).",
    "llm_network": "Erreur réseau : {error}",
    "llm_no_model": "Aucun modèle d'IA utilisable trouvé pour cette clé API.",
}
