const messages = {
  common: {
    cancel: "Annuler",
    create: "Créer",
    save: "Enregistrer",
    saving: "Enregistrement…",
    saveChanges: "Enregistrer les modifications",
    connected: "Connecté",
    notConnected: "Non connecté",
    disconnect: "Déconnecter",
    disconnecting: "Déconnexion...",
  },
  root: {
    commandActions: "Opérations",
    commandSearch: "Rechercher",
    commandAppearance: "Apparence",
    toggleTheme: "Changer de thème",
    extensionSignedInTitle: "Connecté",
    extensionSignedInDescription:
      "Ouvrez à nouveau l’extension Clips pour commencer l’enregistrement.",
    gotIt: "Compris",
  },
  builderCredits: {
    pausedTitle: "Crédits Builder.io en pause",
    transcriptionDescription:
      "Mettez Builder.io à niveau pour reprendre la transcription de secours. Les transcriptions natives existantes restent visibles.",
    cleanupDescription:
      "Mettez Builder.io à niveau pour reprendre le nettoyage des transcriptions, les résumés et les titres IA. La transcription native a été conservée.",
    settingsDescription:
      "Mettez Builder.io à niveau pour reprendre la transcription de secours, le nettoyage des transcriptions, les résumés et les titres IA. Les transcriptions natives existantes restent visibles.",
    titleDescription:
      "La génération de titres IA est en pause. Votre transcription fonctionne toujours.",
    upgrade: "Mettre Builder.io à niveau",
    retryAfterUpgrade: "Réessayer après la mise à niveau",
    openAiSetup: "Configuration IA",
    featureBackupTranscription: "Transcription de secours",
    featureCleanup: "Nettoyage de transcription",
    featureSummaries: "Résumés",
    featureTitles: "Titres IA",
  },
  recorder: {
    cameraBlurTitle: "Flouter l'arrière-plan",
    cameraBlurDescription: "Restez net et floutez ce qui est derrière vous",
    cameraBlurToggle: "Flouter l'arrière-plan de la caméra",
    cameraBlurIntensityLabel: "Intensité",
    cameraBlurIntensityAria: "Intensité du flou d'arrière-plan",
  },
  navigation: {
    brand: "Clips",
    library: "Bibliothèque",
    spaces: "Espaces",
    meetings: "Réunions",
    dictate: "Dicter",
    archive: "Archiver",
    trash: "Corbeille",
    settings: "Paramètres",
    notifications: "Alertes",
    insights: "Analyses",
    space: "Espace",
    folder: "Dossier",
    extensions: "Rallonges",
    newRecording: "Nouvel enregistrement",
    folders: "Dossiers",
    newFolder: "Nouveau dossier",
    noSpaces: "Aucun espace pour le moment",
    desktopCta: "Obtenir l’app de bureau",
    desktopTitle: "Obtenez l’app de bureau Clips.",
    desktopBody:
      "Enregistrez depuis la barre de menus, utilisez un raccourci global et profitez des mises à jour automatiques.",
    expandSidebar: "Développer la barre latérale",
    collapseSidebar: "Réduire la barre latérale",
    agentEmptyState: "Comment puis-je vous aider avec vos enregistrements ?",
    agentSuggestionSummary: "Résume mon dernier enregistrement",
    agentSuggestionPricing: "Trouve où j’ai mentionné les prix",
    agentSuggestionFiller: "Supprime les mots de remplissage de ce clip",
    createFolderError: "Échec de la création",
    folderCreated: "Dossier créé",
    folderNamePlaceholder: "Nom du dossier",
  },
  empty: {
    library: {
      title: "Votre bibliothèque est vide",
      body: "Capturez votre premier enregistrement d’écran et il apparaîtra ici, prêt à partager.",
      cta: "Enregistrer votre premier Clip",
    },
    folder: {
      title: "Ce dossier est vide",
      body: "Glissez-y des enregistrements ou lancez l’enregistrement pour commencer dans ce dossier.",
      cta: "Enregistrer ici",
    },
    space: {
      title: "Aucun enregistrement dans cet espace pour le moment",
      body: "Partagez un enregistrement avec l’espace ou créez-en un nouveau ; votre équipe le verra ici.",
      cta: "Enregistrer pour cet espace",
    },
    archive: {
      title: "Rien dans l’archive",
      body: "Les enregistrements archivés sont masqués de la bibliothèque, mais conservés. Vous pourrez toujours les restaurer plus tard.",
    },
    trash: {
      title: "La corbeille est vide",
      body: "Les enregistrements supprimés restent ici pendant 30 jours avant d’être supprimés définitivement.",
    },
    search: {
      title: "Aucun résultat",
      body: "Essayez un autre terme de recherche ou vérifiez vos filtres.",
    },
  },
  trashRoute: {
    title: "Corbeille",
    selected: "{{count}} sélectionné(s)",
    deselectAll: "Tout désélectionner",
    selectAll: "Tout sélectionner",
    restore: "Restaurer",
    deleteForever: "Supprimer définitivement",
    deleteForeverTitle: "Supprimer définitivement ?",
    bulkDeleteDescription:
      "Enregistrements à supprimer définitivement : {{count}}. Cette action est irréversible.",
    singleDeleteDescription:
      "Cet enregistrement sera supprimé définitivement. Cette action est irréversible.",
    restored: "Restauré",
    restoreFailed: "Échec de la restauration",
    permanentlyDeleted: "Supprimé définitivement",
    deleteFailed: "Échec de la suppression",
  },
  recordingRoute: {
    pageTitle: "Enregistrement du clip · Clips",
  },
  meetingDetailRoute: {
    pageTitle: "Réunion · Clips",
  },
  recordingPage: {
    untitledClip: "Extrait sans titre",
    recordingNotFound: "Enregistrement introuvable",
    noAccess: "Vous n’aurez peut-être pas accès à ce clip.",
    backToLibrary: "Retour à la bibliothèque",
    storageStillDisconnected: "Le stockage n'est toujours pas connecté",
    finishBuilderOrS3:
      "Terminez la fenêtre contextuelle Builder.io ou configurez le stockage S3, puis réessayez.",
    loomImportResumed: "L'importation de Loom a repris",
    clipUploadResumed: "Le téléchargement du clip a repris",
    couldNotRetryLoom: "Impossible de réessayer l'importation Loom",
    couldNotResumeUpload: "Impossible de reprendre le téléchargement",
    tryAgainMoment: "Réessayez dans un instant.",
    aiRequestFailed: "La requête IA a échoué",
    titleUpdated: "Titre mis à jour",
    transcriptNotReady: "La transcription n'est pas encore prête",
    tryAfterTranscription: "Réessayez une fois la transcription terminée.",
    titleGenerationQueued: "Génération de titres en file d'attente",
    descriptionQueued: "Demande de description en file d'attente",
    chapterQueued: "Demande de chapitre en file d'attente",
    fillerQueued: "Suppression des mots de remplissage en file d'attente",
    silenceQueued: "Suppression du silence en file d'attente",
    workflowQueued: "Demande de workflow en file d'attente",
    pageTitle: "Enregistrement de clips · Clips",
    loomMissingUrl: "Cet enregistrement Loom n'a pas sa source URL.",
    finalizeFailed: "Échec de la finalisation ({{status}})",
    uploadTooLarge:
      "Clips a essayé de compresser cet enregistrement de bureau, mais il est encore trop volumineux pour être téléchargé. L'original est enregistré localement et peut être réessayé à partir du menu Clips.",
    desktopSavedUploadFailed:
      "L'enregistreur de bureau a terminé et a enregistré une copie locale, mais Clips n'a pas pu la télécharger. Vous pouvez réessayer à partir du menu Clips sans réenregistrer.",
    retryLibrary: "Vous pouvez réessayer depuis la bibliothèque.",
    processingStuck:
      "Le traitement n'est pas terminé après 30 secondes (status={{status}}). Le téléchargement du clip n'est peut-être pas terminé – vérifiez les journaux du serveur pour les messages de fragmentation/finalisation.",
    uploadingAssembling:
      "Télécharger et assembler votre vidéo : cela ne prend généralement que quelques secondes.",
    connectStorageImportLoom: "Connectez le stockage pour importer ce Loom.",
    connectStorageFinishClip:
      "Connectez le stockage pour terminer l’enregistrement de ce clip.",
    uploadPausedSaved:
      "Téléchargement interrompu ; clip enregistré localement.",
    savingWentWrong:
      "Une erreur s'est produite lors de l'enregistrement de ce clip.",
    finishingClip: "Je termine votre clip…",
    loomSourcePreserved:
      "Le lien source Loom est conservé. Connectez le stockage Builder.io ou S3 et Clips réessayera d'enregistrer sa propre copie.",
    clipDataPreserved:
      "Vos données de clip sont toujours conservées. Connectez le stockage Builder.io ou S3 et Clips le téléchargera automatiquement.",
    details: "Détails",
    importingLoom: "Importation de Loom...",
    uploadingSavedClip: "Téléchargement du clip enregistré…",
    storageConnectedSavingLoom:
      "Le stockage est connecté. Clips enregistre maintenant sa propre copie.",
    storageConnectedFinishing:
      "Le stockage est connecté. Clips termine le téléchargement maintenant.",
    connectStorageImportLoomTitle: "Connecter le stockage pour importer Loom",
    connectStorageFinishSaving:
      "Connectez le stockage pour terminer la sauvegarde",
    chooseStorageRetryLoom:
      "Choisissez où Clips doit stocker les vidéos. Une fois connecté, Clips réessayera cette importation Loom.",
    chooseStorageUpload:
      "Choisissez où Clips doit stocker les vidéos. Une fois connecté, ce clip enregistré sera téléchargé automatiquement.",
    storageConnectedImporting: "Stockage connecté. Importation de Loom...",
    storageConnectedUploading:
      "Stockage connecté. Téléchargement de ce clip...",
    retryImport: "Réessayer l'importation",
    retryUpload: "Réessayez de télécharger",
    checkAgain: "Revérifier",
    back: "Dos",
    done: "Terminé",
    edit: "Modifier",
    aiTools: "Outils d'IA",
    enhanceRecording: "Améliorer cet enregistrement",
    regenerateTitle: "Régénérer le titre",
    regenerateDescription: "Régénérer la description",
    autoChapters: "Chapitres automatiques",
    removeFillerWords: "Supprimer les mots de remplissage",
    removeSilences: "Supprimer les silences (>1,2s)",
    generatePrSummary: "Générer un résumé des relations publiques",
    generateSop: "Générer SOP",
    generateSopTooltip:
      "SOP signifie Standard Operating Procedure : un runbook réutilisable étape par étape généré à partir de ce clip.",
    generateTicket: "Générer un ticket",
    generateEmail: "Générer un e-mail",
    share: "Partager",
    fromMeeting: "De la réunion :",
    untitled: "Sans titre",
    agent: "Traduit: Agent",
    activity: "Activité",
    transcript: "Transcription",
    insights: "Connaissances",
    settings: "Paramètres",
    askAboutClip: "Renseignez-vous sur ce clip…",
    summarizeClip: "Résumez ce clip",
    generateChapters: "Générer des chapitres à partir de la transcription",
    findActionItems: "Rechercher des actions et des suivis",
    draftRecap: "Rédigez un récapitulatif partageable",
    findKeyMoments: "Retrouvez les moments clés",
    listFollowUpActions: "Répertorier les actions de suivi",
    draftQuestions: "Projet de questions pour l'auteur",
    retryFailed: "Échec de la nouvelle tentative : {{message}}",
    networkError: "erreur réseau",
    ownerInsights: "Points de vue du propriétaire",
    ownerInsightsDescription:
      "Les vues, la complétion et les détails du spectateur sont visibles pour les éditeurs de ce clip.",
  },
  sharePage: {
    agentReadableContext: "Contexte de clip lisible par l'agent",
    agentInstructions:
      "Récupérez agentContextUrl pour la transcription et le cadre JPEG URLs. Récupérez le cadre URLs pour VOIR l'écran, pas seulement lire la transcription.",
    untitledClip: "Extrait sans titre",
    incorrectPassword: "Mot de passe incorrect",
    passwordProtected: "Ce clip est protégé par mot de passe",
    linkExpired: "Lien expiré",
    linkExpiredMessage:
      "Le créateur a fixé une expiration sur ce lien de partage.",
    clipUnavailable: "Extrait indisponible",
    clipUnavailableMessage:
      "Cet enregistrement n'est pas public ou le lien n'est pas valide. S'il s'agit de votre clip, connectez-vous pour vérifier l'accès.",
    signIn: "Se connecter",
    somethingWentWrong: "Quelque chose s'est mal passé",
    pleaseTryAgain: "Veuillez réessayer.",
    connectStorageFinish: "Connectez le stockage pour terminer ce clip.",
    needsAttention: "Ce clip a besoin d’attention pour être terminé.",
    savingWentWrong:
      "Une erreur s'est produite lors de l'enregistrement de ce clip.",
    finishingClip: "Je termine ce clip...",
    loomPreservedManage:
      "Le lien source Loom est conservé. Connectez le stockage Builder.io ou S3, puis réessayez l'importation.",
    videoPreservedManage:
      "La vidéo est conservée. Connectez le stockage Builder.io ou S3 et Clips terminera de le télécharger.",
    creatorNeedsStorage:
      "Le créateur doit connecter le stockage Builder.io ou S3 avant que ce clip puisse se terminer.",
    signInStorage:
      "S'il s'agit de votre clip, connectez-vous ici pour connecter le stockage Builder.io ou S3 et terminer le téléchargement.",
    uploadNotCompleteSession:
      "Le téléchargement n'est pas encore terminé. Ouvrez le tableau de bord de ce clip ou demandez au créateur de vérifier le stockage.",
    uploadNotCompleteSignIn:
      "Le téléchargement n'est pas encore terminé. S'il s'agit de votre clip, connectez-vous pour ouvrir les commandes du propriétaire et vérifier le stockage.",
    creatorMayRetry: "Le créateur devra peut-être réessayer.",
    uploadingAssembling:
      "Téléchargement et assemblage de la vidéo. Cette page sera mise à jour automatiquement.",
    details: "Détails",
    connectStorageFinishSaving:
      "Connectez le stockage pour terminer la sauvegarde",
    chooseStorageCheck:
      "Choisissez où Clips doit stocker les vidéos. Une fois connectée, cette page sera vérifiée à nouveau.",
    storageConnectedChecking: "Stockage connecté. Je vérifie ce clip...",
    signInToFinish: "Connectez-vous pour terminer",
    signInIfYours: "Connectez-vous si c'est le vôtre",
    openDashboard: "Ouvrir le tableau de bord",
    checkAgain: "Revérifier",
    backToHome: "Retour à la maison",
    generatingTitle: "Génération du titre",
    tryClips: "Essayez Clips",
    clipOptions: "Options de clips",
    downloading: "Téléchargement...",
    downloadMp4: "Télécharger MP4",
    share: "Partager",
    agent: "Traduit: Agent",
    comments: "Commentaires",
    transcript: "Transcription",
    insights: "Connaissances",
    downloadForMac: "Télécharger pour Mac",
    downloadForWindows: "Télécharger pour Windows",
    downloadDesktopApp: "Téléchargez l'application de bureau",
    agentNativeClips: "Agent-Native Clips",
    agentNativeClipsIntro: "est une alternative gratuite,",
    openSource: "open source",
    agentFriendly: "compatible avec les agents",
    loomAlternative: "à Loom",
    signUp: "S’inscrire",
    ownerInsights: "Insights du propriétaire",
    ownerInsightsDescription:
      "Les vues, l’achèvement et les détails des spectateurs sont visibles par les éditeurs de ce clip.",
  },
  meetingDetail: {
    untitledMeeting: "Réunion sans titre",
    unassigned: "Non attribué",
    them: "Eux",
    me: "Moi",
    regeneratingNotes:
      "Notes régénératrices : vos propres notes sont conservées",
    meetingRemoved: "Réunion supprimée",
    couldNotRemoveMeeting: "Impossible de supprimer la réunion",
    couldNotLoadMeeting: "Impossible de charger cette réunion.",
    transcriptCopied: "Transcription copiée",
    couldNotCopyTranscript: "Impossible de copier la transcription",
    allMeetings: "Toutes les réunions",
    live: "En direct",
    generatingNotesInline: "Générer des notes…",
    regenerateNotes: "Régénérer les notes",
    share: "Partager",
    meetingOptions: "Options de réunion",
    removeMeeting: "Supprimer la réunion",
    removeThisMeeting: "Supprimer cette réunion ?",
    removeDescription:
      "Cela supprime la réunion de Clips. Il ne supprimera aucune transcription liée ni ne modifiera votre Google Calendar.",
    cancel: "Annuler",
    removing: "Suppression...",
    remove: "Retirer",
    desktopHint:
      "Enregistrez des notes en direct pour cette réunion à partir de l'application de bureau Clips — la transcription et les notes AI apparaîtront ici automatiquement.",
    getDesktopApp: "Obtenir l'application de bureau",
    generateNotesFailed: "Impossible de générer des notes. Essayer à nouveau.",
    attendee_one: "participant {{count}}",
    attendee_other: "participants {{count}}",
    joinCall: "Rejoindre l'appel",
    myNotes: "Mes notes",
    aiNotes: "Notes sur l'IA",
    actionItems: "Éléments d'action",
    working: "Fonctionnement…",
    noActionItems:
      "Aucune action pour l'instant. Ils apparaissent ici après la génération des notes à partir d'une transcription.",
    transcript: "Transcription",
    segments: "segments {{count}}",
    copyTranscript: "Copier la transcription",
    copyFullTranscript: "Copier la transcription complète",
    attendee_many: "{{count}} attendees",
  },
  transcriptPanel: {
    transcribing: "Transcription…",
    pendingDescription:
      "La transcription en direct apparaît dès que la parole est capturée. Le nettoyage se poursuit en arrière-plan.",
    noSpeechDetected: "Aucune parole détectée",
    noSpeechDescription:
      "Nous n'avons capté aucun discours dans cet enregistrement. Si c’était intentionnel, vous êtes prêt. Sinon, vérifiez vos autorisations de microphone et de parole, puis réessayez la transcription.",
    retry: "Réessayer",
    transcriptUnavailable: "Transcription indisponible : {{reason}}",
    transcriptUnavailableTitle: "Transcription indisponible",
    providerNeedsAttention: "Le fournisseur demande une action",
    providerNeedsAttentionDescription:
      "Le fournisseur actuel a mis cette demande en pause. Passez à Builder.io ou mettez la clé à jour, puis réessayez.",
    enableTranscriptionTitle: "Activer la transcription",
    enableTranscriptionDescription:
      "Activez les sous-titres, la recherche dans la transcription et les résumés pour ce Clip.",
    searchPlaceholder: "Rechercher la transcription",
    copyTranscript: "Copier la transcription",
    downloadSrt: "Télécharger .srt",
    cleanupRunning: "Nettoyage de la transcription en arrière-plan.",
    noMatches: "Aucun match.",
    noTranscript: "Pas encore de transcription.",
    noTranscriptCaptured: "Aucune transcription n’a été capturée.",
    backupFailed:
      "Aucune parole n’a été capturée localement et la transcription de sauvegarde n’a pas été terminée. Réessayez ou vérifiez les autorisations du microphone et de la parole.",
    backupNotSetup:
      "Aucune parole n’a été capturée localement et la transcription de sauvegarde n’est pas configurée.",
    cleanupKept:
      "Le nettoyage n'a pas pu se terminer. La transcription native a été conservée.",
    cleanupBuilderFailed:
      "Le nettoyage n'a pas pu se terminer même si Builder.io est connecté. La transcription native a été conservée.",
    cleanupPaused:
      "Le nettoyage est suspendu. Connectez l’IA dans Paramètres : Builder.io (crédits gratuits) ou votre propre clé LLM.",
    builderNoResponse:
      "Je n'ai pas eu de réponse de Builder. Autorisez les fenêtres contextuelles et réessayez.",
    saveFailed: "Échec de l'enregistrement ({{status}})",
    savedRetrying: "Sauvé. Nouvelle tentative de transcription…",
    getGroqKey: "Obtenez la clé Groq",
    groqKeysStart: "Les touches Groq commencent par",
    waiting: "En attendant…",
    nativeSpeechPrimary:
      "La reconnaissance vocale native reste la source principale de transcription.",
  },
  thumbnailPicker: {
    failedCapture: "Échec de la capture de l'image",
    failedGif: "Échec de la génération de GIF : essayez une portée plus courte",
    nothingToApply: "Rien à postuler pour l'instant",
    updated: "Miniature mise à jour",
    failedUpdate: "Échec de la mise à jour de la vignette",
    thumbnail: "Miniature",
    upload: "Importer",
    frame: "Image",
    animatedGif: "GIF animé",
    uploadImage: "Télécharger une image",
    uploadedPreview: "Aperçu téléchargé",
    currentThumbnail: "Miniature actuelle",
    frameAt: "Cadre à {{time}}",
    captureFrame: "Capturer l'image",
    preview: "Aperçu",
    capturedFrame: "Cadre capturé",
    capturePreview: "Capturer une image pour prévisualiser",
    start: "Début : {{time}}",
    duration: "Durée : {{time}}",
    generateGif: "Générer GIF",
    animatedPreview: "Aperçu miniature animé",
    generateGifPreview: "Générez un GIF pour prévisualiser",
    cancel: "Annuler",
    saveThumbnail: "Enregistrer la miniature",
  },
  shareDialog: {
    publicDescription:
      "Toute personne disposant du lien peut voir — connectez-vous pour commenter ou réagir",
    shareRecording: "Partager l'enregistrement",
    shareTitle: 'Partager "{{title}}"',
    link: "Lien",
    invite: "Inviter",
    embed: "Intégrer",
    shareLink: "Lien de partage",
    shareWithAgents: "Partager avec les agents",
    copyAgentPrompt: "Copier le prompt pour agent",
    agentPrompt:
      "Récupère cette URL de contexte Clips pour agent : {{agentContextUrl}}. Utilise transcript.segments pour le contexte parlé, récupère recommendedFrames ou les URLs de l'API d'images pour voir l'écran, et consulte browserDiagnostics s'il est présent pour les journaux de console expurgés et les métadonnées de requêtes fetch/XHR.",
    agentTokenDescription:
      "Cette URL temporaire pour agents permet de lire le clip sans le rendre public. Elle expire dans deux heures.",
    gifPreview: "aperçu de GIF",
    openPlayer: "Joueur ouvert",
    downloadMp4: "Télécharger MP4",
    embedsNeedPublic: "Les intégrations nécessitent un clip public",
    embedPublicDescription:
      "Ce clip est actuellement {{visibility}}. Les iframes intégrées se chargent de manière anonyme, le clip doit donc être public pour que les spectateurs puissent le regarder.",
    makingPublic: "Rendre public…",
    makePublic: "Rendre public",
    askOwnerPublic: "Demandez au propriétaire de le rendre public.",
    responsive: "Réactif (16:9)",
    fixedSize: "Taille fixe",
    embedIframeTitle: "Video Clips",
    width: "Largeur",
    height: "Hauteur",
    autoplay: "Lecture automatique",
    startAt: "Commencer à (secondes)",
    embedCode: "Code d’intégration",
    sharePlainTitle: "Partager {{title}}",
  },
  shareUi: {
    owner: "Propriétaire : {{email}}",
    generalAccess: "Accès général",
    restrictedLinkDescription:
      "Ce lien ne fonctionnera que pour les personnes qui y ont déjà accès.",
    makingPublic: "Rendre public…",
    makePublicAndCopy: "Rendre public et copier",
    copy: "Copie",
    addPeopleByEmail: "Ajouter des personnes par email",
    notifyPeople: "Avertir les gens",
    peopleWithAccess: "Personnes ayant accès",
    ownerRole: "Propriétaire",
    remove: "Retirer",
    noAccessYet: "Personne n'y a encore accès.",
    visibility: {
      private: {
        label: "Privé",
        description: "Seules les personnes ayant accès peuvent voir",
      },
      org: {
        label: "Organisation",
        description: "Tout le monde dans votre organisation peut voir",
      },
      public: {
        label: "Publique",
        description: "Toute personne disposant du lien peut voir",
      },
    },
    roles: {
      viewer: "Téléspectateur",
      editor: "Éditeur",
      admin: "Administrateur",
    },
  },
  quickAsk: {
    title: "Renseignez-vous sur cette réunion",
    toggleHint: "pour basculer · Esc pour fermer",
    quickPrompts: "Invites rapides",
    whatDidIMiss: "Qu'est-ce que j'ai raté ?",
    whatDidIMissPrompt: "Qu'est-ce que j'ai raté ?",
    summarizeLastFive: "Résumez les 5 dernières minutes",
    summarizeLastFivePrompt:
      "Résumez les 5 dernières minutes de cette réunion en 3 à 5 puces.",
    actionItemsForMe: "Points d'action pour moi",
    actionItemsForMePrompt:
      "Répertoriez les actions de cette réunion qui me sont assignées. Utilisez des puces de case à cocher.",
    history: "Histoire",
    emptyDescription:
      "Demandez n'importe quoi. L’agent dispose de la transcription complète et du contexte de la réunion.",
    placeholder: "Demandez n'importe quoi…",
    send: "Envoyer",
    sentToChat:
      "Envoyé pour discuter : consultez la barre latérale de l'agent pour la réponse.",
  },
  brandingEditor: {
    title: "Image de marque",
    uploadImageFile: "Veuillez télécharger un fichier image.",
    logoUploaded: "Logo téléchargé",
    uploadFailed: "Échec du téléchargement",
    brandingUpdated: "Image de marque mise à jour",
    saveFailed: "Échec de l'enregistrement",
    organizationName: "Nom de l'organisation",
    brandColor: "Couleur de la marque",
    brandColorPicker: "Sélecteur de couleurs de marque",
    useColor: "Utilisez {{color}}",
    logo: "Logo",
    logoPreview: "Aperçu du logo",
    dropReplace: "Déposez une nouvelle image à remplacer",
    dropHere: "Déposez un PNG / JPG / SVG ici",
    uploading: "Téléchargement…",
    chooseFile: "Choisir un fichier",
    remove: "Retirer",
    preview: "Aperçu",
    organizationFallback: "Organisation",
    saving: "Économie…",
    save: "Sauvegarder",
  },
  downloadRoute: {
    pageTitle: "Télécharger Clips Desktop",
    description:
      "Enregistrez votre écran à partir de la barre de menu. Application de bureau à mise à jour automatique pour macOS et Windows.",
    macSublabel: "Universel (Apple Silicon + Intel)",
    windowsSublabel: "Programme d'installation de MSI 64 bits",
    downloadFor: "Télécharger pour {{platform}}",
    alsoFor: "Également disponible pour {{platform}}",
    backToLibrary: "Retour à la bibliothèque",
    clipsDesktop: "Clips Desktop",
    heroDescription:
      "Un enregistreur de barre de menus pour l’écran, la caméra et écran + caméra. Démarrage en un clic, bulle caméra déplaçable et lien de partage instantané à l’arrêt.",
    versionReleased: "Version {{version}} — publiée {{date}}",
    version: "Traduit: Version {{version}}",
    manifestError:
      "Impossible de charger le manifeste de version : choisissez un programme d'installation sur la page des versions.",
    loadingRelease: "Chargement de la dernière version…",
    chromeTitle: "Extension Chrome pour les journaux du navigateur",
    chromeDescription:
      "Utilisez l'extension lorsque vous souhaitez un enregistrement plus une console expurgée et récupérez les diagnostics/XHR à partir de l'onglet à partir duquel vous lancez. L'application de bureau reste l'enregistreur quotidien le plus fluide.",
    installChrome: "Installer l'extension Chrome",
    chromePending: "Chrome Web Store URL en attente",
  },
  inviteRoute: {
    missingToken: "Jeton d'invitation manquant.",
    notFound: "Invitation introuvable ou expirée.",
    loadFailed: "Échec du chargement de l'invitation",
    joined: "A rejoint {{team}}",
    theTeam: "l'équipe",
    acceptFailed: "Échec de l'acceptation de l'invitation",
    declined: "Invitation refusée",
    declineFailed: "Échec du refus",
    signInRequired: "Connexion requise",
    signInDescription:
      "Vous devez vous connecter avant de pouvoir accepter une invitation.",
    signIn: "Se connecter",
    invited: "Vous avez été invité",
    loading: "Chargement…",
    role: "Rôle:",
    invitedToJoin: "{{inviter}} vous a invité à rejoindre {{team}} sur Clips.",
    emailMismatch:
      "Attention : cette invitation a été envoyée à {{inviteEmail}}. Vous êtes connecté en tant que {{sessionEmail}}. L'acceptation fonctionnera toujours, mais l'e-mail de votre compte sera celui qui rejoindra.",
    decline: "Refuser",
    joining: "Adhésion…",
    acceptInvite: "Accepter l’invitation",
    declineInvite: "Refuser cette invitation ?",
    declineDescription:
      "L'invitation sera supprimée. L'administrateur peut toujours vous en envoyer un nouveau.",
    cancel: "Annuler",
    pageTitle: "Rejoindre l’équipe · Clips",
  },
  settings: {
    openAgentSettings: "Ouvrir les paramètres de l’agent",
    agentDescription:
      "Ouvrez les paramètres de l’agent dans la barre latérale pour les modèles, clés API, automatisations, voix et autres contrôles.",
    agentTitle: "Paramètres de l’agent",
    title: "Paramètres",
    pageTitle: "Paramètres · Clips",
    intro: "Préférences et services connectés pour cet espace Clips.",
    languageTitle: "Langue",
    languageDescription:
      "Choisissez la langue de l’interface pour ce compte. Clips s’en souviendra sur tous vos appareils.",
    languageLabel: "Langue de l’interface",
    whatsNew: "Nouveautés",
    changelogEmpty: "Aucune mise à jour pour le moment.",
    viewAllUpdates: "Voir toutes les mises à jour",
    expand: "Développer",
    collapse: "Replier",
    changelogMarkdown: `# Journal des modifications

Tous les changements visibles par les utilisateurs de Clips sont documentés ici. Vous pouvez l’ouvrir à tout moment depuis le menu de commandes (Cmd+K -> "Nouveautés") ou depuis les paramètres.

## 2026-06-23

### Ajouté

- Vous pouvez maintenant voir les nouveautés directement dans Clips. Le journal des modifications est disponible dans le menu de commandes (Cmd+K) et dans les paramètres.`,
    profile: "Profil",
    email: "E-mail",
    displayName: "Nom affiché",
    displayNamePlaceholder: "Votre nom",
    playback: "Lecture",
    defaultPlaybackSpeed: "Vitesse de lecture par défaut",
    playbackDescription:
      "Appliquée automatiquement quand vous ouvrez un enregistrement.",
    transcript: "Transcription",
    transcriptCleanup: "Nettoyage en arrière-plan",
    transcriptCleanupDescription:
      "Affichez immédiatement la transcription native, puis nettoyez-la en arrière-plan lorsqu’elle est disponible.",
    notifications: "Alertes",
    emailNotifications: "Notifications par e-mail",
    emailNotificationsDescription:
      "Recevez un e-mail lorsqu’une personne commente, réagit ou partage un enregistrement avec vous.",
    saved: "Paramètres enregistrés",
    saveFailed: "Échec de l’enregistrement",
    builderConnectedToast: "Builder.io connecté",
    videoStorage: "Stockage vidéo",
    videoStorageDescription:
      "Builder.io est le chemin de stockage principal pour les téléversements Clips. S3 est disponible si vous devez utiliser votre propre bucket.",
    checkingBuilder: "Vérification de Builder.io",
    builderConnected: "Builder.io connecté",
    connectBuilder: "Utiliser Builder.io (gratuit)",
    builderConnectedFor: "Utilisation de Builder.io pour {{orgName}}.",
    builderConnectedGeneric:
      "Les nouveaux clips utilisent le fournisseur Builder.io connecté.",
    builderIncludes:
      "Inclut le stockage objet, les téléversements et la transcription gérée pour les nouveaux clips.",
    s3Title: "Stockage compatible S3",
    secondary: "Secondaire",
    active: "Actif",
    s3BuilderConnectedDescription:
      "À utiliser uniquement si cet espace doit téléverser vers votre propre bucket plutôt que Builder.io.",
    s3CurrentProvider: "Utilisation actuelle de {{providerName}}.",
    s3OwnBucketDescription:
      "Utilisez votre propre bucket si vous ne voulez pas du stockage Builder.io.",
    configureS3: "Configurer S3",
    hideS3: "Masquer S3",
    saveStorage: "Enregistrer le stockage",
    storageSaved: "Paramètres de stockage enregistrés",
    storageRequired:
      "Endpoint, bucket, access key et secret sont obligatoires.",
    s3EndpointLabel: "URL du point de terminaison",
    s3BucketLabel: "Seau",
    s3AccessKeyLabel: "ID de clé d’accès",
    s3SecretAccessKeyLabel: "Clé d’accès secrète",
    s3RegionLabel: "Région",
    s3PublicBaseUrlLabel: "URL de base publique",
    apiSetup: "Configuration IA",
    apiSetupDescription:
      "Connectez l’IA avec les crédits gratuits Builder.io ou vos propres clés LLM.",
    builderEasySetup: "Crédits gratuits Builder.io",
    builderAiAvailable:
      "Les crédits IA inclus et la transcription gérée sont disponibles pour Clips.",
    builderAiDescription:
      "Utilisez d’abord Builder.io pour les crédits IA inclus, le stockage objet, les téléversements et la transcription gérée.",
    providerKeyTitle: "Utiliser votre propre clé fournisseur",
    providerKeyDescription:
      "Ajoutez des clés Anthropic, OpenAI, Gemini, Groq ou OpenRouter pour une utilisation facturée par fournisseur.",
    providerKeysSet: "{{count}} définies",
    checkingProviderKeys: "Vérification des clés fournisseur…",
    keySet: "Définie",
    replaceKey: "Remplacer la clé…",
    pasteProviderKey: "Collez d’abord une clé fournisseur.",
    apiKeySaved: "Clé API enregistrée",
    apiKeyFailed: "Échec de l’enregistrement de la clé",
    slackTitle: "Agent-Native Clips pour Slack",
    slackDescription:
      "Partagez un clip public, collez le lien dans Slack, et il se lit directement, sans étape supplémentaire pour les spectateurs. Connectez chaque espace une seule fois.",
    checkingSlack: "Vérification de Slack",
    slackConnected_one: "{{count}} espace connecté",
    slackConnected_many: "{{count}} espaces connectés",
    slackConnected_other: "{{count}} espaces connectés",
    slackOauthNeeded: "Identifiants OAuth requis",
    slackPreviewDescription:
      "Les liens Clips publics peuvent s’afficher comme aperçus lisibles dans Slack.",
    connectSlack: "Connecter Slack",
    slackClientMissing:
      "Définissez SLACK_CLIENT_ID et SLACK_CLIENT_SECRET pour ce déploiement avant de connecter des espaces.",
    slackSigningMissing:
      "Définissez SLACK_SIGNING_SECRET afin de vérifier les callbacks d’événements Slack.",
    connectedBy: "Connecté par {{email}}",
    disconnectSlackLabel: "Déconnecter {{team}}",
    slackConnectedToast: "Slack connecté",
    slackCheckedToast: "Connexion Slack vérifiée",
    slackDisconnectedToast: "Slack déconnecté",
    slackConnectFailed: "Échec de la connexion à Slack",
    slackDisconnectFailed: "Échec de la déconnexion de Slack",
    disconnectSlackTitle: "Déconnecter Slack ?",
    disconnectSlackDescription:
      "Clips supprimera le token bot stocké pour {{team}} et cessera d’envoyer des aperçus Slack lisibles.",
    thisWorkspace: "cet espace",
    slackConnected: "Slack connecté",
  },
  insightsHub: {
    title: "Insights",
    period: "Période",
    last7Days: "7 derniers jours",
    last14Days: "14 derniers jours",
    last30Days: "30 derniers jours",
    last90Days: "90 derniers jours",
    exportCsv: "Exporter en CSV",
    description:
      "Engagement dans votre organisation sur les {{days}} derniers jours.",
    views: "Vues",
    reactions: "Réactions",
    comments: "Commentaires",
    recordings: "Enregistrements",
    engagementTrend: "Tendance d’engagement",
    topVideos: "Meilleures vidéos",
    topCreators: "Meilleurs créateurs",
  },
  folderTree: {
    noFolders: "Aucun dossier pour le moment",
    rename: "Renommer",
    newSubfolder: "Nouveau sous-dossier",
    delete: "Supprimer",
    renameFolder: "Renommer le dossier",
    renamed: "Dossier renommé",
    renameFailed: "Échec du renommage",
    createInside: "Créer un dossier dans « {{name}} ».",
    folderName: "Nom du dossier",
    created: "Dossier créé",
    createFailed: "Échec de la création",
    deleteFolder: "Supprimer le dossier ?",
    deleteDescription:
      "Les enregistrements qu’il contient seront déplacés vers le niveau parent (racine de la bibliothèque ou dossier parent). Les sous-dossiers imbriqués seront supprimés. Cette action est irréversible.",
    deleted: "Dossier supprimé",
    deleteFailed: "Échec de la suppression",
  },
  organizationSettings: {
    pageTitle: "Paramètres de l’organisation · Clips",
    title: "Organisation · Paramètres",
    namedTitle: "{{name}} · Paramètres",
    noOrganization:
      "Aucune organisation pour le moment. Créez-en une depuis le sélecteur d’organisation pour commencer.",
    description:
      "Administration de l’organisation : marque, membres, invitations.",
    adminsOnlyBranding: "Seuls les administrateurs peuvent modifier la marque.",
    members: "Membres",
    pendingInvites: "Invitations en attente",
    noPendingInvites: "Aucune invitation en attente.",
    email: "E-mail",
    role: "Rôle",
    sent: "Envoyé",
  },
  recordingInsights: {
    loading: "Chargement des insights…",
    noData: "Aucune donnée pour le moment.",
    views: "Vues",
    uniqueViewers: "Spectateurs uniques",
    completion: "Achèvement",
    ctaConversion: "Conversion CTA",
    dropOff: "Abandon",
    viewersCount: "{{count}} spectateurs",
    watching: "Regarde",
    recentViewers: "Spectateurs récents",
    noViewers: "Aucun spectateur pour le moment.",
    anonymous: "Anonyme",
    anon: "Anon",
    moreViewers: "+{{count}} de plus",
  },
  libraryGrid: {
    spaceRoot: "Racine de l’espace",
    libraryRoot: "Racine de la bibliothèque",
    clipsMoved: "{{count}} clips déplacés",
    moveFailed: "Échec du déplacement des clips",
    titleRequired: "Le titre ne peut pas être vide",
    clipRenamed: "Clip renommé",
    renameFailed: "Échec du renommage du clip",
    renameClip: "Renommer le clip",
    clipTitle: "Titre du clip",
    movedToTrash: "Déplacé vers la corbeille",
    restoredFromArchive: "Restauré depuis l’archive",
    archived: "Archivé",
    clipsArchived: "{{count}} clips archivés",
    clipsArchiveFailed: "{{count}} clips n’ont pas pu être archivés",
    clipsMovedToTrash: "{{count}} clips déplacés vers la corbeille",
    clipsTrashFailed:
      "{{count}} clips n’ont pas pu être déplacés vers la corbeille",
  },
  notificationsRoute: {
    pageTitle: "Alertes · Clips",
    title: "Notifications",
    description:
      "Commentaires, réactions, mentions et partages sur vos enregistrements au cours des 30 derniers jours.",
    replySent: "Réponse envoyée",
    sendFailed: "Échec de l’envoi",
    all: "Tout",
    comments: "Commentaires",
    reactions: "Réactions",
    mentions: "Mentions",
    shares: "Partages",
    loading: "Chargement…",
    replyTo: "Répondre à {{email}} sur",
    replyPlaceholder: "Écrire une réponse…",
  },
  stitchManager: {
    defaultTitle: "Enregistrement assemblé",
    title: "Assembler des enregistrements",
    pickAtLeastTwo: "Choisissez au moins 2 enregistrements à assembler",
    videoUrlMissing:
      "Un ou plusieurs enregistrements n’ont pas encore d’URL vidéo prête",
    connectStorage:
      "Connectez le stockage avant d’assembler des enregistrements : Builder.io (stockage + IA sur l’offre gratuite) ou stockage compatible S3.",
    created: "Enregistrement assemblé créé",
    failed: "Échec de l’assemblage des enregistrements",
    noOtherRecordings: "Aucun autre enregistrement disponible.",
    combineOrder: "Ordre de combinaison",
    emptyQueue:
      "Cliquez sur des enregistrements à gauche pour les ajouter ici. Faites glisser pour réordonner.",
    titleLabel: "Titre",
    combining:
      "Combinaison avec ffmpeg.wasm — {{progress}} %. Les grands assemblages peuvent prendre une minute.",
    combine: "Combiner",
  },
  inviteDialog: {
    title: "Inviter des membres",
    description:
      "Collez un ou plusieurs e-mails séparés par des virgules ou des retours à la ligne. Les invitations expirent dans 7 jours.",
    enterEmail: "Saisissez au moins une adresse e-mail.",
    invalidEmails: "E-mail(s) non valide(s) : {{emails}}",
    emailFailed: "{{email}} : {{message}}",
    failed: "Échec",
    sent: "{{count}} invitations envoyées.",
    sentWithFailures: "{{sent}} invitations envoyées, {{failed}} échecs.",
    emails: "E-mails",
    memberRole: "Membre — enregistrer, modifier, partager",
    adminRole: "Admin — contrôle total",
    sending: "Envoi…",
    sendInvites: "Envoyer les invitations",
  },
  membersList: {
    memberRole: "Membre",
    adminRole: "Admin",
    roleUpdated: "Rôle de {{email}} mis à jour en {{role}}",
    updateFailed: "Échec de la mise à jour du rôle",
    removed: "{{email}} retiré de l’organisation",
    removeFailed: "Échec de la suppression du membre",
    noMembers: "Aucun membre pour le moment.",
    member: "Membre",
    joined: "A rejoint",
    you: "(vous)",
    removeMemberLabel: "Retirer {{email}}",
    removeTitle: "Retirer le membre ?",
    removeDescription:
      "{{email}} perdra l’accès à cette organisation. Vous pourrez toujours l’inviter à nouveau.",
    remove: "Retirer",
  },
  slackShareHint: {
    playsInline: "Lecture inline dans Slack",
    connectedDescription:
      "Collez ce lien dans n’importe quel espace connecté pour le lire inline.",
    makeInline: "Le lire inline dans Slack",
    connectDescription:
      "Connectez un espace pour que ce lien se déplie en vidéo.",
    connect: "Connecter",
  },
  commentsPanel: {
    disabled: "Les commentaires sont désactivés pour cet enregistrement.",
    beFirst: "Soyez le premier à commenter",
    leaveNotePanel: "Laissez une note en haut de ce panneau.",
    leaveNoteTimestamp: "Laissez une note à l’horodatage actuel.",
    leaveComment: "Laisser un commentaire...",
    signInToComment: "Connectez-vous pour laisser un commentaire.",
    signIn: "Se connecter",
    replyingTo: "Réponse à",
    commentAt: "Commentaire à",
    writeReply: "Écrire une réponse...",
    commentButton: "Commenter",
    composerPlaceholder: "Ajouter un commentaire…",
    mentionSomeone: "Mentionner quelqu'un",
    addEmoji: "Ajouter un emoji",
  },
  shareMeeting: {
    pageTitle: "Notes de réunion · Clips",
    description: "Notes de réunion IA partagées via Clips.",
    unavailable: "Cette réunion est privée ou n’est plus disponible.",
    tryClips: "Essayer Clips",
    attendees: "{{count}} participants",
    noAiNotes: "Les notes IA n’ont pas encore été générées pour cette réunion.",
    summary: "Résumé",
    keyPoints: "Points clés",
    actionItems: "Actions à faire",
  },
  deleteRecordingMenu: {
    movedToTrash: "Clip déplacé vers la corbeille",
    deleteFailed: "Échec de la suppression du clip",
    clipOptions: "Options du clip",
    delete: "Supprimer",
    moveTitle: "Déplacer ce clip vers la corbeille ?",
    moveDescription:
      "Cela retire le clip de votre bibliothèque. Vous pourrez le restaurer depuis la corbeille ou le supprimer définitivement plus tard.",
    deleting: "Suppression...",
    moveToTrash: "Déplacer vers la corbeille",
  },
  recordingToolbar: {
    controls: "Commandes d’enregistrement",
    resumeRecording: "Reprendre l’enregistrement",
    pauseRecording: "Mettre l’enregistrement en pause",
    resumeShortcut: "Reprendre (⌥⇧P)",
    pauseShortcut: "Pause (⌥⇧P)",
    stop: "Arrêter l’enregistrement",
    elapsed: "Temps écoulé",
    cancel: "Annuler l’enregistrement",
    cancelShortcut: "Annuler (⌥⇧C)",
  },
  countdownOverlay: {
    startsIn: "L’enregistrement commence dans {{count}}",
    cancel: "Annuler l’enregistrement",
    skip: "Ignorer le compte à rebours et démarrer maintenant",
    hint: "Esc pour annuler · Entrée pour démarrer maintenant",
  },
  videoPlayer: {
    loomVideo: "Vidéo Loom",
    noVideo: "Aucune vidéo disponible",
    thanks: "Merci d’avoir regardé",
    playClip: "Lire le clip",
  },
  searchBar: {
    placeholder: "Rechercher des enregistrements…",
    clear: "Effacer la recherche",
    searching: "Recherche…",
    noMatchesFor: "Aucun résultat pour",
    titleTranscript: "Titre + transcription",
    titleComment: "Titre + commentaire",
    transcript: "Transcription",
    comment: "Commentaire",
    titleOrDescription: "Titre ou description",
  },
  organizationSwitcher: {
    noOrganization: "Aucune organisation",
    organizationCount: "{{count}} organisations",
    organizations: "Organisations",
    noOrganizations: "Aucune organisation pour le moment",
    switchFailed: "Échec du changement d’organisation",
    newOrganization: "Nouvelle organisation",
    createOrganization: "Créer une organisation",
    organizationName: "Nom de l’organisation",
    created: "« {{name}} » créée",
    createFailed: "Échec de la création de l’organisation",
    creating: "Création…",
  },
  playerControls: {
    playbackSpeed: "Vitesse de lecture",
  },
  autoRecordPrompt: {
    notesStarted: "Notes démarrées.",
    cancelWithSeconds: "Annuler ({{count}} s)",
    startNotesQuestion: "C’est l’heure de cette réunion. Démarrer les notes ?",
    autoStartsIn: "Démarrage automatique dans {{count}} s",
    startNotes: "Démarrer les notes",
    dismiss: "Fermer",
  },
  meetingCanvas: {
    noAiNotes:
      "Aucune note IA pour le moment. Générez des notes à partir d’une transcription terminée.",
    noNotes: "Aucune note.",
    yourNotes: "Vos notes…",
    clickToEdit: "Cliquer pour modifier",
  },
  meetingCard: {
    live: "En direct",
    transcript: "Transcription",
    aiNotesReady: "Notes IA prêtes",
    noSummary: "Aucun résumé pour le moment",
    transcriptSource: "Source de transcription",
    now: "Maintenant",
    started: "Démarrée",
    inMinutes: "dans {{count}} min",
    inHours: "dans {{count}} h",
    join: "Rejoindre",
    openNotes: "Ouvrir les notes",
    open: "Ouvrir",
  },
  transcriptBubbles: {
    listening: "Écoute…",
    noTranscript: "Aucune transcription pour le moment.",
    liveTranscriptDescription:
      "La transcription en direct apparaîtra ici lorsque les notes commenceront.",
    me: "Moi",
    them: "Eux",
  },
  editorLayout: {
    trimmed: "Découpé",
    trimFailed: "Échec du découpage",
    cut: "Coupé",
    cutFailed: "Échec de la coupe",
    split: "Divisé",
    splitFailed: "Échec de la division",
    loadingRecording: "Chargement de l’enregistrement…",
    recordingNotFound: "Enregistrement introuvable",
    noVideoYet: "Aucune vidéo disponible pour le moment.",
  },
  transcriptEditor: {
    transcript: "Transcription",
    selectionRange: "· sélection {{start}} → {{end}}",
    selectTextToTrim: "· sélectionnez du texte à découper",
    cutSelection: "Couper la sélection",
    noTranscript: "Aucune transcription pour le moment.",
  },
  createSpaceDialog: {
    newSpace: "Nouvel espace",
    description: "Créez un espace dans l’organisation actuelle.",
    name: "Nom",
    color: "Couleur",
    useColor: "Utiliser la couleur {{color}}",
    spaceCreated: "Espace créé",
    createFailed: "Impossible de créer l’espace",
  },
  signInPrompt: {
    title: "Connectez-vous pour {{intent}}",
    description:
      "Créez un compte ou connectez-vous pour {{intent}} sur ce clip. Nous vous ramènerons ici lorsque vous aurez terminé.",
    notNow: "Pas maintenant",
    signIn: "Se connecter",
  },
  embedRoute: {
    passwordRequired: "Mot de passe requis",
    unavailable: "Clip indisponible.",
  },
  cameraVisualizer: {
    bubble: "Bulle",
    live: "En direct",
    waiting: "En attente",
    opening: "Ouverture",
    stop: "Arrêter",
    openingEllipsis: "Ouverture...",
    test: "Tester",
    selectedPreview: "Aperçu de la caméra sélectionnée",
    preview: "Aperçu caméra",
    setBubbleSize: "Définir la taille de la bulle caméra {{size}}",
  },
  storageSetup: {
    builderTimeout:
      "Aucune réponse de Builder après 5 minutes. Vérifiez la fenêtre contextuelle et réessayez.",
    builderConnected: "Builder.io connecté",
    waitingForBuilder: "En attente de Builder...",
    connectBuilder: "Utiliser Builder.io (gratuit)",
    free: "Gratuit",
    configureS3: "configurer un stockage compatible S3",
    whyPrompt: "Pourquoi vois-je ceci ?",
    whyDescription:
      "Clips est 100 % gratuit et open source, vous devez donc connecter un moyen de stocker vos clips. Connectez le stockage avec Builder.io pour le stockage et l’IA sur l’offre gratuite, ou utilisez un stockage compatible S3 et vos propres clés LLM.",
  },
  captureInstall: {
    title: "Choose your recorder (Localisé)",
    description:
      "Use Chrome when you need browser logs, or desktop for the smoothest everyday capture. (Localisé)",
    chromeTitle: "Chrome extension (Localisé)",
    chromeDescription:
      "Best when you want redacted console and network diagnostics from the browser tab. (Localisé)",
    chromePendingDescription:
      "Browser logs option is ready, pending the Chrome Web Store URL. (Localisé)",
    desktopTitle: "Desktop app (Localisé)",
    desktopDescription:
      "Most seamless for global shortcuts, menu-bar recording, meetings, and repeat captures. (Localisé)",
  },
  editableTitle: {
    untitled: "Untitled Clip (Localisé)",
    renameFailed: "Failed to rename clip (Localisé)",
    emptyTitle: "Title cannot be empty (Localisé)",
    generatingTitle: "Generating title (Localisé)",
    placeholder: "Clip title (Localisé)",
    editLabel: "Edit clip title (Localisé)",
  },
  chapters: {
    title: "Chapters (Localisé)",
    addHere: "Add here (Localisé)",
    empty: "No chapters yet. (Localisé)",
    remove: "Remove chapter (Localisé)",
    saveFailed: "Failed to save chapters (Localisé)",
    duplicateAtPoint: "A chapter already exists at this point (Localisé)",
    defaultTitle: "Chapter {{count}} (Localisé)",
    seekTo: "Seek to {{time}} (Localisé)",
  },
  editorToolbar: {
    undoTooltip: "Undo (Cmd/Ctrl+Z) (Localisé)",
    playPauseTooltip: "Play / Pause (Space) (Localisé)",
    sourceDuration: "({{duration}} src) (Localisé)",
    previewSpeed: "Preview speed (Localisé)",
    previewSpeedTooltip: "Preview speed while trimming (Localisé)",
    cutSelection: "Cut selection (Localisé)",
    cutSelectedRange: "Cut selected range (Localisé)",
    edit: "Edit (Localisé)",
    playheadEdits: "Playhead edits (Localisé)",
    splitAtPlayhead: "Split at playhead (Localisé)",
    cutBeforePlayhead: "Cut before playhead (Localisé)",
    cutAfterPlayhead: "Cut after playhead (Localisé)",
    panels: "Panels (Localisé)",
    hideChapters: "Hide chapters (Localisé)",
    showChapters: "Show chapters (Localisé)",
    thumbnail: "Thumbnail (Localisé)",
    stitchClips: "Stitch clips (Localisé)",
    zoom: "Zoom (Localisé)",
    zoomOut: "Zoom out (Localisé)",
    fitToWidth: "Fit to width (Localisé)",
    zoomIn: "Zoom in (Localisé)",
    clearAllEdits: "Clear all edits (Localisé)",
    loadingFfmpeg: "Loading ffmpeg… (Localisé)",
    exportMp4: "Export MP4 (Localisé)",
    longExportTitle: "This export is long (Localisé)",
    longExportDescription:
      "The edited video is {{duration}}. ffmpeg.wasm runs in your browser and may run out of memory for very long exports. You can try anyway or download the original file instead. (Localisé)",
    downloadOriginal: "Download original (Localisé)",
    exportAnyway: "Export anyway (Localisé)",
    clearAllEditsTitle: "Clear all edits? (Localisé)",
    clearAllEditsDescription:
      "This removes every trim, blur, and the custom thumbnail from this recording. The original video is never modified. (Localisé)",
    clearEdits: "Clear edits (Localisé)",
    nothingToUndo: "Nothing to undo (Localisé)",
    undoFailed: "Undo failed (Localisé)",
    editsCleared: "Edits cleared (Localisé)",
    clearFailed: "Clear failed (Localisé)",
    selectRangeFirst:
      "Select a range on the waveform or transcript first (Localisé)",
    selectionCut: "Selection cut (Localisé)",
    trimFailed: "Trim failed (Localisé)",
    movePlayheadPastIntro:
      "Move the playhead past the intro you want to cut (Localisé)",
    startCut: "Start cut (Localisé)",
    movePlayheadBeforeEnding:
      "Move the playhead before the ending you want to cut (Localisé)",
    endCut: "End cut (Localisé)",
    splitAdded: "Split added (Localisé)",
    splitFailed: "Split failed (Localisé)",
    videoNotReady: "Video not ready yet (Localisé)",
    exportedMp4: "Exported MP4 (Localisé)",
    exportFailed:
      "Export failed — ffmpeg.wasm can't always handle long videos. Try shorter edits or use the original file. (Localisé)",
  },
  preRecord: {
    modeScreenCamera: "Screen + cam (Localisé)",
    modeScreenOnly: "Screen only (Localisé)",
    modeCameraOnly: "Camera only (Localisé)",
    surfaceWindow: "Window (Localisé)",
    surfaceWindowDescription: "Best for slides or one app (Localisé)",
    surfaceBrowser: "Browser tab (Localisé)",
    surfaceBrowserDescription: "Choose an open tab (Localisé)",
    surfaceScreen: "Screen (Localisé)",
    surfaceScreenDescription: "Capture everything (Localisé)",
    microphoneSelectionUnsupported:
      "This browser does not support microphone device selection. (Localisé)",
    enumerateFailed: "Could not enumerate devices (Localisé)",
    noMicrophone: "No microphone (Localisé)",
    defaultMicrophone: "Default microphone (Localisé)",
    shortMicLabel: "Mic {{id}} (Localisé)",
    defaultCamera: "Default camera (Localisé)",
    shortCameraLabel: "Camera {{id}} (Localisé)",
    noAudio: "No audio (Localisé)",
    noCamera: "No camera (Localisé)",
    loomImportFailed: "Could not import that Loom. (Localisé)",
    fixMicrophoneAccess:
      "Fix microphone access or turn audio off before recording. (Localisé)",
    fixCameraAccess:
      "Fix camera access or switch to Screen mode before recording. (Localisé)",
    captureSource: "Capture source (Localisé)",
    selectedSurface: "{{surface}} selected (Localisé)",
    change: "Change (Localisé)",
    audioAndCamera: "Audio & camera (Localisé)",
    audio: "Audio (Localisé)",
    check: "Check (Localisé)",
    choose: "Choose (Localisé)",
    defaultMicPlaceholder: "Default mic (Localisé)",
    openingMicrophone: "Opening microphone... (Localisé)",
    chooseMicrophone: "Choose microphone... (Localisé)",
    includeAudioAria: "Include audio in this recording (Localisé)",
    tryClipsDesktop: "Try Clips Desktop. (Localisé)",
    cameraOff: "Camera off (Localisé)",
    includeCameraAria: "Include camera in this recording (Localisé)",
    startRecording: "Start recording (Localisé)",
    uploadVideo: "Upload video (Localisé)",
    importLoom: "Import Loom (Localisé)",
    importing: "Importing... (Localisé)",
    import: "Import (Localisé)",
  },
  playerSettings: {
    title: "Settings (Localisé)",
    privacy: "Privacy (Localisé)",
    visibility: "Visibility (Localisé)",
    visibilityPrivate: "Private (Localisé)",
    visibilityOrg: "Organization (Localisé)",
    visibilityPublic: "Public (Localisé)",
    passwordProtection: "Password protection (Localisé)",
    passwordSetPlaceholder:
      "Password is set — type to replace, leave empty + Save to clear (Localisé)",
    noPasswordPlaceholder: "No password (Localisé)",
    expiry: "Expiry (Localisé)",
    viewerOptions: "Viewer options (Localisé)",
    comments: "Comments (Localisé)",
    reactions: "Reactions (Localisé)",
    allowDownloads: "Allow downloads (Localisé)",
    animatedThumbnail: "Animated thumbnail (Localisé)",
    defaultPlaybackSpeed: "Default playback speed (Localisé)",
    callToAction: "Call to action (Localisé)",
    defaultCtaLabel: "Learn more (Localisé)",
    addCta: "+ Add (Localisé)",
    noCtas:
      "No CTAs yet. Add a button that appears during or after the video. (Localisé)",
    buttonLabelPlaceholder: "Button label (Localisé)",
    placementThroughout: "Throughout (Localisé)",
    placementEnd: "At end (Localisé)",
    delete: "Delete (Localisé)",
  },
  recordRoute: {
    pageTitle: "New recording — Clips (Localisé)",
    uploadFailed: "Upload failed (Localisé)",
    uploadFailedAtChunk:
      "Upload failed at chunk {{chunk}}/{{total}}: {{message}} (Localisé)",
    couldNotStartRecording: "Could not start recording (Localisé)",
    couldNotStartRecorder: "Could not start recorder (Localisé)",
    openSettings: "Open settings (Localisé)",
    openedRecorderInNewTab: "Opened recorder in a new tab (Localisé)",
    videoReadyToUpload: "Video is ready to upload (Localisé)",
    videoUploaded: "Video uploaded (Localisé)",
    videoTooLarge: "Video is too large (Localisé)",
    storageNeededToFinishLoomImport:
      "Storage needed to finish Loom import (Localisé)",
    loomImported: "Loom imported (Localisé)",
    couldNotImportLoom: "Could not import that Loom. (Localisé)",
    recordingReadyToUpload: "Recording is ready to upload (Localisé)",
    recordingSaved: "Recording saved (Localisé)",
    noLocalRecordingData:
      "No local recording data is available to download. (Localisé)",
    recordingDownloadStarted: "Recording download started (Localisé)",
    backToLibrary: "Back to library (Localisé)",
    clipsRecorder: "Clips recorder (Localisé)",
    preparingSources: "Preparing sources… (Localisé)",
    recordingScreen:
      "Recording your screen — switch to the window you want to capture (Localisé)",
    largeClipsNeedReencode:
      "Large clips need a quick re-encode before upload. (Localisé)",
    savingRecording: "Saving your recording… (Localisé)",
    sessionExpired: "Session expired (Localisé)",
    sessionExpiredDescription:
      "Your login session has expired. Log in again to start recording. (Localisé)",
    logIn: "Log in (Localisé)",
    betterInDesktop: "Better in the desktop app (Localisé)",
    desktopAppDescription:
      "Menu-bar launch, global shortcuts, auto-updates, and smoother repeat recordings. (Localisé)",
    downloadDesktopApp: "Download desktop app (Localisé)",
    technicalDetails: "Technical details (Localisé)",
    whatToCheck: "What to check (Localisé)",
    downloadRecording: "Download recording (Localisé)",
    openRecorderInTab: "Open recorder in tab (Localisé)",
    connectStorageToFinish:
      "Connectez le stockage sur l’écran suivant : Builder.io (stockage + IA sur l’offre gratuite) ou stockage compatible S3. Clips terminera l’enregistrement.",
    connectStorageToRetryLoom:
      "Connectez le stockage sur l’écran suivant : Builder.io (stockage + IA sur l’offre gratuite) ou stockage compatible S3. Clips relancera l’import.",
  },
  dictateRoute: {
    pageTitle: "Dictate · Clips (Localisé)",
    howToUse: "How to use Dictate (Localisé)",
    browserDictation: "Browser dictation (Localisé)",
    browserDictationDescription:
      "Use the button on this page, or press the shortcut while this tab is focused. Browser dictation saves here for copy and cleanup. (Localisé)",
    desktopShortcuts: "Desktop shortcuts (Localisé)",
    desktopShortcutsDescriptionSuffix: ", in the desktop app. (Localisé)",
    holdFn: "Hold Fn (Localisé)",
    browserUnavailable:
      "Browser speech recognition is unavailable here. Use Chrome or the desktop app for global dictation. (Localisé)",
    browserUnavailableShort:
      "Browser speech recognition is unavailable here (Localisé)",
    startSpeaking: "Start speaking... (Localisé)",
    replacedOriginal: "Replaced original with cleaned text (Localisé)",
    noText: "No text (Localisé)",
    emptyTranscript: "Empty transcript (Localisé)",
    replaceOriginal: "Replace original with cleaned (Localisé)",
    cleanupWithAi: "Cleanup with AI (Localisé)",
    cleanupHint:
      'Click "Cleanup with AI" to fix punctuation, casing, and filler words. (Localisé)',
    startFirst: "Start your first dictation (Localisé)",
    emptyDesktopDescription:
      "Hold {{fnKey}} anywhere on your Mac, or press {{modifierKey}} ⇧ Space. Your history will live here. (Localisé)",
    emptyWebDescription:
      "Dictation runs through the desktop app for global shortcuts that work in any app — Slack, your editor, anywhere. (Localisé)",
    downloadDesktopApp: "Download Clips desktop app (Localisé)",
    holdToDictate: "hold to dictate (Localisé)",
    toggle: "toggle (Localisé)",
    desktopCtaTitle: "Dictate from anywhere with the desktop app (Localisé)",
    desktopCtaDescription:
      "Press {{modifierKey}} ⇧ Space in any app. Browser dictation is unreliable — the desktop app is the way to use this. (Localisé)",
    noSpeechCaptured: "No speech captured (Localisé)",
    dictationSaved: "Dictation saved (Localisé)",
    voiceToTextDescription:
      "Voice-to-text dictation with AI cleanup. Get the desktop app to dictate from anywhere with a global shortcut. (Localisé)",
    loadFailed: "Couldn't load dictations. (Localisé)",
    noFilterMatches: "No dictations matching this filter. (Localisé)",
  },
  clipsFinalRaw: {
    splitAtPlayhead: "Couper à la tête de lecture (S)",
    selectedCount: "{{count}} sélectionnés",
    move: "Déplacer",
    moveSelected: "Déplacer {{count}} sélectionnés",
    current: "Actuel",
    clearSelection: "Effacer la sélection",
    waitingForStorage: "En attente du stockage",
    savedLocally: "Enregistré localement",
    uploadFailed: "Échec de l’envoi",
    connectStorageToFinish:
      "Ouvrez pour connecter le stockage et terminer l’enregistrement.",
    retryFromClipsMenu:
      "Réessayez depuis le menu Clips ; inutile de réenregistrer.",
    removeFailedClip: "Supprimer ce clip en échec.",
    remove: "Supprimer",
    viewsCount: "{{count}} vues",
    recordingMenu: "Menu de l’enregistrement",
    moveToFolder: "Déplacer vers un dossier",
    unarchive: "Désarchiver",
    shareNamedMeeting: "Partager « {{title}} »",
    shareMeeting: "Partager la réunion",
    shareLink: "Lien de partage",
    alreadyHaveIt: "Je l’ai déjà",
    link: "Lien",
    invite: "Inviter",
    inviteFailed: "Impossible d’inviter la personne",
    removePersonFailed: "Impossible de supprimer la personne",
    passwordProtectedDescription:
      "Cette vidéo est protégée. Saisissez le mot de passe pour la regarder.",
    password: "Mot de passe",
    unlock: "Déverrouiller",
    noEngagementData: "Aucune donnée d’engagement pour le moment.",
    allCaughtUp: "Vous êtes à jour.",
    someone: "Quelqu’un",
    view: "Voir",
    reply: "Répondre",
    commentedOn: "a commenté",
    reactedTo: "a réagi à",
    mentionedYouIn: "vous a mentionné dans",
    shared: "a partagé",
    noCreatorsYet: "Aucun créateur pour le moment.",
    creator: "Créateur",
    engagement: "Engagement",
    selectedMicrophoneWaveform: "Forme d’onde du micro sélectionné",
    goHome: "Aller à l’accueil",
    testMic: "Tester le micro",
    archivePageTitle: "Archives · Clips",
    insightsPageTitle: "Analyses · Clips",
    folderPageTitle: "Dossier · Clips",
    spacePageTitle: "Espace · Clips",
    spacesPageTitle: "Espaces · Clips",
    trashPageTitle: "Corbeille · Clips",
  },
  bugReportRoute: {
    pageTitle: "Rapport de bug · Clips",
    donePageTitle: "Rapport de bug envoyé · Clips",
    eyebrow: "Rapport de bug",
    title: "Enregistrer un rapport de bug",
    description:
      "Capturez une courte reproduction avec écran, voix et contexte navigateur expurgé pour votre équipe.",
    issueTitleLabel: "Titre du problème",
    issueTitlePlaceholder: "Qu'est-ce qui n'a pas fonctionné ?",
    detailsLabel: "Détails",
    detailsPlaceholder: "Que deviez-vous voir se produire ?",
    emailLabel: "Votre e-mail",
    emailPlaceholder: "vous@example.com",
    severityLabel: "Gravité",
    severityLow: "Faible",
    severityNormal: "Normale",
    severityHigh: "Élevée",
    severityUrgent: "Urgente",
    sourceLabel: "Source",
    sourceUnknown: "Page produit actuelle",
    startRecording: "Enregistrer l'écran",
    privacyNote:
      "Clips enregistre la capture avec l'accès espace de travail par défaut. Les URL et métadonnées sont expurgées avant l'enregistrement.",
    doneTitle: "Rapport de bug envoyé",
    doneDescription:
      "L'enregistrement est sauvegardé dans Clips et le produit hôte a été notifié.",
    openRecording: "Ouvrir l'enregistrement",
    copyLink: "Copier le lien",
    copied: "Copié",
    returnToProduct: "Retour au produit",
    missingRecording: "Enregistrement introuvable",
  },
  meetingsRoute: {
    pageTitle: "Meetings · Clips (Localisé)",
    transcriptPending: "Transcript pending (Localisé)",
    notesPending: "Notes pending (Localisé)",
    pastRecordings: "Past recordings (Localisé)",
    calendarNeedsReconnect:
      "Google Calendar needs to be reconnected to keep showing your upcoming meetings. (Localisé)",
    connectGoogleCalendar: "Connect Google Calendar (Localisé)",
    desktopReminder:
      "Get a desktop reminder when meetings start so recorded notes land in this history automatically. (Localisé)",
    getDesktopApp: "Get desktop app (Localisé)",
    requiredForReminders:
      "Required for meeting reminders and transcription. (Localisé)",
    calendarConnected: "Calendar connected (Localisé)",
    calendarDisconnected: "Calendar disconnected (Localisé)",
    calendarSettings: "Calendar settings (Localisé)",
    connectCalendarReminder:
      "Connect Google Calendar for meeting reminders. (Localisé)",
    disconnectGoogleCalendarTitle: "Disconnect Google Calendar? (Localisé)",
    title: "Meetings (Localisé)",
    intro: "Upcoming calendar meetings and your recorded notes. (Localisé)",
    searchPlaceholder: "Search meetings... (Localisé)",
    clearSearch: "Clear search (Localisé)",
    noMeetingsYet: "No meetings yet (Localisé)",
    noMeetingsDescription:
      "Upcoming calendar meetings show up here, and finished recordings land here once you take notes. (Localisé)",
    noMeetingsMatch: 'No meetings match "{{query}}" (Localisé)',
    refreshing: "Refreshing… (Localisé)",
  },
};

export default messages;
