From b6e8ca897418f466ef1bfcbdacd44b8f3dc6b438 Mon Sep 17 00:00:00 2001 From: fxlelouarn <115778739+fxlelouarn@users.noreply.github.com> Date: Tue, 6 Oct 2026 04:19:45 +0200 Subject: [PATCH] fix(app): correct the French translation (#6004) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The French locale was machine-translated word by word, without context: "Back" became "Dos" (the body part), CI "Checks" became "Chèques" (bank cheques), "Starting" became "Départ", "Connecting" became "De liaison", and many interpolation placeholders were glued to neighboring words ("{{label}}copié", "Daemonindisponible"). Review every client-owned French string against its English source and call site, apply one glossary across the file, and use French typography (’, …, non-breaking space before high punctuation). Add regression tests for the reported labels and for placeholders glued to French words. Co-authored-by: Claude Opus 5.5 --- packages/app/src/i18n/resources.test.ts | 17 + packages/app/src/i18n/resources/fr.ts | 2291 ++++++++--------- .../app/src/i18n/resources/plugin-settings.ts | 2 +- 3 files changed, 1162 insertions(+), 1148 deletions(-) diff --git a/packages/app/src/i18n/resources.test.ts b/packages/app/src/i18n/resources.test.ts index 46b3428026..2b83055774 100644 --- a/packages/app/src/i18n/resources.test.ts +++ b/packages/app/src/i18n/resources.test.ts @@ -183,6 +183,23 @@ describe("translation resources", () => { expect(ko.desktop.daemon.status.notRunning).toBe("실행 중이 아님"); }); + it("uses the French navigation and Git meanings for reported labels", () => { + expect(fr.common.back).toBe("Retour"); + expect(fr.common.actions.back).toBe("Retour"); + expect(fr.common.actions.copy).toBe("Copier"); + expect(fr.common.states.starting).toBe("Démarrage…"); + expect(fr.common.connectionStatus.connecting).toBe("Connexion…"); + expect(fr.workspace.git.pr.sections.checks).toBe("Vérifications"); + expect(fr.sidebar.display.show.checks).toBe("Vérifications"); + }); + + it("separates French interpolation placeholders from neighboring words", () => { + const glued = Object.entries(flattenStrings(fr)).filter(([, value]) => + /\p{L}\{\{|\}\}\p{L}{2,}/u.test(value), + ); + expect(glued).toEqual([]); + }); + it("labels the immediate add-to-chat action without an ellipsis", () => { expect(en.workspace.fileActions.addToChat).toBe("Add to chat"); }); diff --git a/packages/app/src/i18n/resources/fr.ts b/packages/app/src/i18n/resources/fr.ts index 2ce39d2dc1..19deced196 100644 --- a/packages/app/src/i18n/resources/fr.ts +++ b/packages/app/src/i18n/resources/fr.ts @@ -18,7 +18,7 @@ export const fr: TranslationResources = { matches: "Résultats de recherche", previous: "Résultat précédent", next: "Résultat suivant", - toggleReplace: "Afficher le remplacement", + toggleReplace: "Afficher/masquer le remplacement", replaceWith: "Remplacer par", replace: "Remplacer", replaceAll: "Tout remplacer", @@ -28,51 +28,50 @@ export const fr: TranslationResources = { }, common: { bottomSheetBackdrop: "Arrière-plan du panneau inférieur", - back: "Dos", - loading: "Chargement...", + back: "Retour", + loading: "Chargement…", actions: { - back: "Dos", + back: "Retour", cancel: "Annuler", close: "Fermer", - copy: "Copie", + copy: "Copier", copyLine: "Copier la ligne", - dismiss: "Rejeter", + dismiss: "Ignorer", reload: "Recharger", retry: "Réessayer", - search: "Recherche", + search: "Rechercher", select: "Sélectionner", selectAll: "Tout sélectionner", }, placeholders: { - search: "Recherche...", + search: "Rechercher…", }, empty: { - noResults: "Aucun résultat trouvé", + noResults: "Aucun résultat", noOptionsMatchSearch: "Aucune option ne correspond à votre recherche.", }, states: { - loading: "Chargement...", - starting: "Départ...", + loading: "Chargement…", + starting: "Démarrage…", copied: "Copié", - copiedLabel: "{{label}}copié", + copiedLabel: "Copié : {{label}}", downloadComplete: "Téléchargement terminé", - downloadFailed: "Le téléchargement a échoué", + downloadFailed: "Échec du téléchargement", }, errors: { error: "Erreur", - unableToSave: "Impossible d'enregistrer", + unableToSave: "Impossible d’enregistrer", unableToCopy: "Impossible de copier", nameRequired: "Le nom est requis", - daemonUnavailable: "Daemonindisponible", - daemonClientUnavailable: "ClientDaemonindisponible", - daemonClientDisconnected: "Le clientDaemonest déconnecté", - noFileFound: "Aucun fichier trouvé pour{{token}}", - unexpectedDictationError: - "Une erreur inattendue s'est produite lors du traitement de la dictée.", + daemonUnavailable: "Daemon indisponible", + daemonClientUnavailable: "Client du daemon indisponible", + daemonClientDisconnected: "Le client du daemon est déconnecté", + noFileFound: "Aucun fichier trouvé pour {{token}}", + unexpectedDictationError: "Une erreur inattendue s’est produite pendant la dictée.", }, connectionStatus: { online: "En ligne", - connecting: "De liaison", + connecting: "Connexion…", offline: "Hors ligne", error: "Erreur", idle: "Inactif", @@ -80,159 +79,159 @@ export const fr: TranslationResources = { }, shell: { menu: { - toggleSidebar: "Basculer la barre latérale", + toggleSidebar: "Afficher/masquer la barre latérale", open: "Ouvrir le menu", close: "Fermer le menu", }, commandCenter: { - placeholder: "Rechercher des commandes, fichiers, espaces de travail et agents...", - filePlaceholder: "Rechercher des fichiers...", - searchingFiles: "Recherche de fichiers...", - noMatches: "Aucune correspondance", - actions: "Actes", + placeholder: "Rechercher des commandes, fichiers, espaces de travail et agents…", + filePlaceholder: "Rechercher des fichiers…", + searchingFiles: "Recherche de fichiers…", + noMatches: "Aucun résultat", + actions: "Actions", files: "Fichiers", workspaces: "Espaces de travail", agents: "Agents", newAgent: "Nouvel agent", open: "Ouvrir {{name}}", openInSidePane: "Ouvrir {{name}} dans le panneau latéral", - openInFocusedPane: "Ouvrir {{name}} dans le volet actif", + openInFocusedPane: "Ouvrir {{name}} dans le panneau actif", addProject: "Ajouter un projet", - home: "Maison", + home: "Accueil", groupByProject: "Grouper par projet", groupByStatus: "Grouper par statut", modelGroupLabel: "Modèle", modelSearchKeywords: - "changer de modèle modifier le modèle définir le modèle sélectionner le modèle", - thinkingGroupLabel: "Raisonnement", - thinkingSearchKeywords: "raisonnement effort réflexion", + "changer de modèle modifier le modèle définir le modèle sélectionner le modèle model", + thinkingGroupLabel: "Réflexion", + thinkingSearchKeywords: "réflexion raisonnement effort thinking", modeGroupLabel: "Mode", - modeSearchKeywords: "accès permission approbation mode", + modeSearchKeywords: "accès autorisation approbation mode permission", planModeGroupLabel: "Mode plan", planModeSearchKeywords: "plan planification mode plan", fastModeGroupLabel: "Rapide", - fastModeSearchKeywords: "rapide vitesse faible latence", + fastModeSearchKeywords: "rapide vitesse faible latence fast", settingOn: "Activé", settingOff: "Désactivé", }, }, composer: { placeholders: { - desktop: "Envoyez un message à l'agent, marquez@filesou utilisez/commandset/skills", - mobile: "Message,@files,/commands", - fallback: "Message...", + desktop: "Écrivez à l’agent, mentionnez des @fichiers ou utilisez les /commandes et /skills", + mobile: "Message, @fichiers, /commandes", + fallback: "Message…", terminal: "Prompt", }, input: { - accessibilityLabel: "Agent de messagerie...", - terminalAccessibilityLabel: "Terminal prompt", - focusHint: "{{shortcut}}pour se concentrer", + accessibilityLabel: "Écrire à l’agent…", + terminalAccessibilityLabel: "Prompt du terminal", + focusHint: "{{shortcut}} pour saisir", addAttachment: "Ajouter une pièce jointe", - interruptAgent: "Agent d'interruption", - queueMessage: "Message de file d'attente", + interruptAgent: "Interrompre l’agent", + queueMessage: "Mettre le message en file d’attente", sendAndInterrupt: "Envoyer et interrompre", - sendAndSteer: "Envoyer et guider", - sendMessage: "Envoyer un message", - queue: "File d'attente", + sendAndSteer: "Envoyer et réorienter", + sendMessage: "Envoyer le message", + queue: "Mettre en file d’attente", send: "Envoyer", }, cancel: { - cancelingAgent: "Agent d'annulation", - stopAgent: "Agent d'arrêt", + cancelingAgent: "Annulation de l’agent…", + stopAgent: "Arrêter l’agent", interrupt: "Interrompre", }, voice: { enableVoiceMode: "Activer le mode vocal", voiceMode: "Mode vocal", - unmuteVoiceMode: "Activer le mode vocal", - muteVoiceMode: "Mode voix muette", + unmuteVoiceMode: "Réactiver le micro du mode vocal", + muteVoiceMode: "Couper le micro du mode vocal", stopDictation: "Arrêter la dictée", startDictation: "Démarrer la dictée", - unmuteVoice: "Réactiver la voix", - muteVoice: "Voix muette", + unmuteVoice: "Réactiver le micro", + muteVoice: "Couper le micro", dictation: "Dictée", - interruptBeforeVoice: "Interrompre l'agent avant de démarrer le mode vocal", + interruptBeforeVoice: "Interrompez l’agent avant de démarrer le mode vocal", }, attachments: { addImage: "Ajouter une image", pasteImage: "Coller une image", - addFile: "Upload file", - addIssueOrPr: "Ajouter un problème ouPR", - addIssueOrPr_mr: "Ajouter un problème ou MR", + addFile: "Importer un fichier", + addIssueOrPr: "Ajouter un ticket ou une PR", + addIssueOrPr_mr: "Ajouter un ticket ou une MR", dropImagesHere: "Déposez des images ici", - dropFilesHere: "Drop files here", - editQueuedMessage: "Modifier le message en file d'attente", - sendQueuedMessageNow: "Envoyer le message en file d'attente maintenant", - openImage: "Ouvrir la pièce jointe de l'image", - removeImage: "Supprimer l'image jointe", - removeFile: "Remove file attachment", + dropFilesHere: "Déposez des fichiers ici", + editQueuedMessage: "Modifier le message en file d’attente", + sendQueuedMessageNow: "Envoyer maintenant le message en file d’attente", + openImage: "Ouvrir l’image jointe", + removeImage: "Retirer l’image jointe", + removeFile: "Retirer le fichier joint", openGithub: "Ouvrir {{kind}} {{number}}", - removeGithub: "Supprimer {{kind}} {{number}}", + removeGithub: "Retirer {{kind}} {{number}}", element: "Élément", - openBrowserElement: "Ouvrir la pièce jointe de l'élément de navigateur", - removeBrowserElement: "Supprimer la pièce jointe d'un élément de navigateur", - openReview: "Ouvrir la pièce jointe de l'avis", - removeReview: "Supprimer la pièce jointe de l'avis", + openBrowserElement: "Ouvrir l’élément de navigateur joint", + removeBrowserElement: "Retirer l’élément de navigateur joint", + openReview: "Ouvrir la revue jointe", + removeReview: "Retirer la revue jointe", }, errors: { - failedToSend: "Échec de l'envoi du message", - failedToCreateAgent: "Échec de la création de l'agent", + failedToSend: "Impossible d’envoyer le message", + failedToCreateAgent: "Impossible de créer l’agent", noHostSelected: "Aucun hôte sélectionné", - initialPromptRequired: "Une invite initiale est requise", - alreadyLoading: "Déjà en cours de chargement", - uploadFailed: "Failed to upload file", + initialPromptRequired: "Un prompt initial est requis", + alreadyLoading: "Chargement déjà en cours", + uploadFailed: "Impossible d’importer le fichier", noClipboardImage: - "Aucune image dans le presse-papiers actuel. Essayez de coller depuis votre clavier.", + "Aucune image dans le presse-papiers. Essayez de coller depuis votre clavier.", pasteImageFailed: "Impossible de coller l’image", - fileTooLarge: "{{fileName}} is too large (max {{size}})", + fileTooLarge: "{{fileName}} est trop volumineux (maximum {{size}})", }, clientCommands: { - archiveAgent: "Archiver l'agent actuel", - freshDraft: "Archivez cet agent et démarrez un nouveau brouillon", + archiveAgent: "Archiver l’agent actuel", + freshDraft: "Archiver cet agent et démarrer un nouveau brouillon", }, github: { - searching: "Recherche...", - noResults: "Aucun résultat trouvé.", - searchPlaceholder: "Problèmes de recherche et PR...", - searchPlaceholder_mr: "Problèmes de recherche et MR...", - title: "Joindre le problème ouPR", - title_mr: "Joindre le problème ou MR", + searching: "Recherche…", + noResults: "Aucun résultat.", + searchPlaceholder: "Rechercher des tickets et des PR…", + searchPlaceholder_mr: "Rechercher des tickets et des MR…", + title: "Joindre un ticket ou une PR", + title_mr: "Joindre un ticket ou une MR", }, }, agentControls: { provider: { fallback: "Fournisseur", - select: "Sélectionnez le fournisseur d'agent", + select: "Choisir le fournisseur d’agent", }, thinking: { - title: "Pensée", + title: "Réflexion", unknown: "Inconnu", - extraHigh: "Très haut", - select: "Sélectionnez l'option de réflexion", - selectWithValue: "Sélectionnez l'option de réflexion ({{value}})", + extraHigh: "Très élevé", + select: "Choisir le niveau de réflexion", + selectWithValue: "Choisir le niveau de réflexion ({{value}})", }, model: { unknown: "Modèle inconnu", }, features: { - title: "Caractéristiques", - open: "Fonctionnalités de l'agent ouvert", - on: "Sur", + title: "Fonctionnalités", + open: "Ouvrir les fonctionnalités de l’agent", + on: "Activé", off: "Désactivé", }, mode: { title: "Mode", - searchPlaceholder: "Modes de recherche...", - selectWithValue: "Sélectionnez le mode agent ({{value}})", + searchPlaceholder: "Rechercher un mode…", + selectWithValue: "Choisir le mode de l’agent ({{value}})", }, hints: { - thinking: "Mode réflexion", + thinking: "Mode de réflexion", model: "Changer de modèle", mode: "Changer de mode", }, }, agentStream: { - empty: "Commencez à discuter avec cet agent...", + empty: "Commencez à discuter avec cet agent…", scrollToBottom: "Faire défiler vers le bas", historyLoadFailed: "Impossible de charger l’historique de l’agent", messageCapped: "Ce message a été tronqué ({{bytes}} octets).", @@ -245,34 +244,34 @@ export const fr: TranslationResources = { required: "Autorisation requise", deny: "Refuser", accept: "Accepter", - implement: "Mettre en œuvre", - question: "Comment souhaitez-vous procéder?", + implement: "Implémenter", + question: "Comment souhaitez-vous procéder ?", proposedPlan: "Plan proposé", }, }, agentPanel: { states: { - notFound: "Agentintrouvable", - failedToLoad: "Échec du chargement de l'agent", - reconnecting: "Reconnexion à l’hôte", - updating: "Mise à jour des messages", + notFound: "Agent introuvable", + failedToLoad: "Impossible de charger l’agent", + reconnecting: "Reconnexion à l’hôte…", + updating: "Mise à jour des messages…", timelineSyncFailed: "Impossible d’actualiser l’historique de l’agent.", timelineSyncRetrying: "Nouvelle tentative…", - archivingTitle: "Agent d'archivage...", - archivingSubtitle: "Veuillez patienter pendant que nous archivons cet agent.", + archivingTitle: "Archivage de l’agent…", + archivingSubtitle: "Veuillez patienter pendant l’archivage de cet agent.", }, unavailable: { selectedHost: "Hôte sélectionné", unknownHost: - "Impossible d'ouvrir cet agent car{{serverLabel}}n'est pas configuré sur ce périphérique.", + "Impossible d’ouvrir cet agent, car {{serverLabel}} n’est pas configuré sur cet appareil.", addHost: - "Ajoutez l'hôte dans Paramètres ou ouvrez un agent sur un serveur configuré pour continuer.", - preparingSession: "Préparation de la séance{{serverLabel}}...", - connecting: "Connexion à{{serverLabel}}...", - showSoon: "Nous montrerons cet agent dans un instant.", - showWhenOnline: "Nous afficherons cet agent une fois que l'hôte sera en ligne.", - reconnectingTo: "Reconnexion à{{serverLabel}}...", - showAgainWhenReachable: "Nous afficherons à nouveau cet agent dès que l'hôte sera joignable.", + "Pour continuer, ajoutez l’hôte dans Paramètres ou ouvrez un agent sur un serveur configuré.", + preparingSession: "Préparation de la session {{serverLabel}}…", + connecting: "Connexion à {{serverLabel}}…", + showSoon: "Cet agent va s’afficher dans un instant.", + showWhenOnline: "Cet agent s’affichera dès que l’hôte sera en ligne.", + reconnectingTo: "Reconnexion à {{serverLabel}}…", + showAgainWhenReachable: "Cet agent s’affichera de nouveau dès que l’hôte sera joignable.", }, archived: { callout: "Cet agent est archivé", @@ -281,42 +280,42 @@ export const fr: TranslationResources = { }, sessions: { title: "Historique", - empty: "Aucune séance pour l'instant", - noMatches: "Aucune séance correspondante", + empty: "Aucune session pour l’instant", + noMatches: "Aucune session correspondante", tooManyMatches: "Trop de résultats — affinez la recherche", - hostLoadFailed: "{{host}} : Impossible de charger l'historique", - searchPlaceholder: "Rechercher dans l'historique", + hostLoadFailed: "{{host}} : impossible de charger l’historique", + searchPlaceholder: "Rechercher dans l’historique", actions: { loadMore: "Charger plus", clearSearch: "Effacer la recherche", }, }, agentList: { - fallbackTitle: "Nouvelle séance", + fallbackTitle: "Nouvelle session", dateSections: { - recent: "Récent", - today: "Aujourd'hui", + recent: "Récents", + today: "Aujourd’hui", yesterday: "Hier", thisWeek: "Cette semaine", thisMonth: "Ce mois-ci", - older: "Plus vieux", + older: "Plus anciens", }, status: { - initializing: "Départ", + initializing: "Démarrage…", idle: "Inactif", - running: "En cours d'exécution", + running: "En cours", error: "Erreur", closed: "Fermé", }, badges: { archived: "Archivé", - pending: "{{count}}en attente", + pending: "{{count}} en attente", attention: "Attention", }, archiveSheet: { - hostOffline: "Hosthors ligne", - runningAgent: "Cet agent est toujours en cours d'exécution. L’archiver arrêtera l’agent.", - archive: "Archive", + hostOffline: "Hôte hors ligne", + runningAgent: "Cet agent est toujours en cours d’exécution. L’archiver l’arrêtera.", + archive: "Archiver", }, }, message: { @@ -331,33 +330,33 @@ export const fr: TranslationResources = { }, actions: { copyCode: "Copier le code", - copyTurn: "Copier le tour", + copyTurn: "Copier l’échange", copyMessage: "Copier le message", - forkMenu: "Dupliquer le message", - forkInNewTab: "Dupliquer dans un nouvel onglet", - forkInNewWorkspace: "Dupliquer dans un nouvel espace de travail", - forkUnavailable: "Mettez l'hôte à jour pour utiliser ceci.", - forkMissingWorkspace: "Cet agent n'est pas dans un espace de travail.", - forkFailed: "Impossible de dupliquer le chat", + forkMenu: "Forker la conversation à partir d’ici", + forkInNewTab: "Forker dans un nouvel onglet", + forkInNewWorkspace: "Forker dans un nouvel espace de travail", + forkUnavailable: "Mettez à jour l’hôte pour utiliser cette fonction.", + forkMissingWorkspace: "Cet agent n’est dans aucun espace de travail.", + forkFailed: "Impossible de forker la conversation", openFile: "Ouvrir le fichier", copied: "Copié", }, attachments: { - dismissImage: "Ignorer l'image", - closeImage: "Fermer l'image", - imageLoadFailed: "Impossible de charger l'image", + dismissImage: "Ignorer l’image", + closeImage: "Fermer l’image", + imageLoadFailed: "Impossible de charger l’image", imageUnavailable: "Image indisponible", - imagePreviewUnavailable: "Aperçu de l'image indisponible.", - imagePreviewLoadFailed: "Impossible de charger l'aperçu de l'image.", + imagePreviewUnavailable: "Aperçu de l’image indisponible.", + imagePreviewLoadFailed: "Impossible de charger l’aperçu de l’image.", review: "Revue", commentsOne: "1 commentaire", commentsMany: "{{count}} commentaires", - textAttachment: "Texte en pièce jointe", + textAttachment: "Pièce jointe texte", text: "Texte", file: "Fichier", }, speak: { - header: "Rayon", + header: "Prononcé", }, activity: { details: "Détails", @@ -365,21 +364,21 @@ export const fr: TranslationResources = { dictation: { start: "Démarrer la dictée vocale", cancel: "Annuler la dictée", - retry: "Réessayer la dictée", + retry: "Relancer la dictée", insert: "Insérer la transcription", insertAndSend: "Insérer la transcription et envoyer", - failed: "Échec de la dictée:{{error}}", - failedRetry: "La dictée a échoué. Appuyez sur réessayer.", + failed: "Échec de la dictée : {{error}}", + failedRetry: "La dictée a échoué. Appuyez sur Réessayer.", }, question: { - submit: "Soumettre", + submit: "Envoyer", next: "Suivant", - answerPlaceholder: "Tapez votre réponse...", - otherPlaceholder: "Autre...", + answerPlaceholder: "Saisissez votre réponse…", + otherPlaceholder: "Autre…", }, todo: { title: "Tâches", - empty: "Aucune tâche pour l'instant.", + empty: "Aucune tâche pour l’instant.", tasksProgress: "{{completed}}/{{total}} tâches", activity: { created: "{{count}} tâches créées", @@ -389,17 +388,17 @@ export const fr: TranslationResources = { }, }, compaction: { - loading: "Compactage...", - auto: "Contexte automatiquement compacté", + loading: "Compaction…", + auto: "Contexte compacté automatiquement", manual: "Contexte compacté manuellement", - withTokens: "Contexte compacté (jetons{{tokens}}K)", + withTokens: "Contexte compacté ({{tokens}}K tokens)", completed: "Contexte compacté", }, }, importSession: { chooseHostTitle: en.importSession.chooseHostTitle, - title: "Session d'importation", - searchPlaceholder: "Rechercher des sessions...", + title: "Importer une session", + searchPlaceholder: "Rechercher des sessions…", scope: { host: "Sessions sur {{host}}", workspace: "Cet espace de travail", @@ -409,40 +408,40 @@ export const fr: TranslationResources = { }, status: { connectHost: "Connectez-vous à un hôte pour importer des sessions", - updateHost: "Mettez à jour l'hôte pour importer des sessions.", - noProviders: "Aucun fournisseur importable n'est activé.", - loading: "Chargement des sessions récentes...", + updateHost: "Mettez à jour l’hôte pour importer des sessions.", + noProviders: "Aucun fournisseur importable n’est activé.", + loading: "Chargement des sessions récentes…", failedProvider: "Impossible de charger les sessions {{provider}}", - failedImport: "Impossible d'importer la session sélectionnée.", + failedImport: "Impossible d’importer la session sélectionnée.", }, actions: { - refresh: "Sessions de rafraîchissement", + refresh: "Actualiser les sessions", showAll: "Tout afficher", loadMore: "Charger plus", }, preview: { - untitledSession: "Séance sans titre", - noPrompt: "Aucun aperçu rapide", + untitledSession: "Session sans titre", + noPrompt: "Aucun aperçu du prompt", }, empty: { noRecent: "Aucune session récente à importer.", noMatches: "Aucune session ne correspond à votre recherche.", alreadyImported: "Toutes les sessions récentes sont déjà importées.", - noProviderSessions: "Aucune session{{provider}}trouvée.", + noProviderSessions: "Aucune session {{provider}} trouvée.", }, row: { - importing: "Importation...", + importing: "Importation…", }, }, workspace: { route: { - loading: "Chargement de l'espace de travail", - connecting: "De liaison", - hostOffline: "{{hostName}}est hors ligne", - cannotReachHost: "Impossible d'atteindre{{hostName}}", - hostStatus: "StatutHost:{{status}}", + loading: "Chargement de l’espace de travail…", + connecting: "Connexion…", + hostOffline: "{{hostName}} est hors ligne", + cannotReachHost: "Impossible de joindre {{hostName}}", + hostStatus: "Statut de l’hôte : {{status}}", needsHostUpgrade: "Mettez à jour votre hôte pour restaurer cet espace de travail", - manageHost: "Gérer l'hôte", + manageHost: "Gérer l’hôte", recovery: { archivedTitle: "Espace de travail archivé", restoreDescription: @@ -452,14 +451,14 @@ export const fr: TranslationResources = { unarchiveDescription: "{{workspaceName}} est archivé. Désarchivez-le pour le rouvrir.", restoreAction: "Restaurer", unarchiveAction: "Désarchiver", - restoringTitle: "Restauration de l'espace de travail", - restoringAction: "Restauration...", + restoringTitle: "Restauration de l’espace de travail", + restoringAction: "Restauration…", unavailableTitle: "Espace de travail indisponible", - checkFailedTitle: "Impossible de vérifier l'espace de travail", + checkFailedTitle: "Impossible de vérifier l’espace de travail", }, }, hoverCard: { - scriptsAccessibility: "ScriptsWorkspace", + scriptsAccessibility: "Scripts de l’espace de travail", copyPath: "Copier le chemin", copyBranchName: "Copier le nom de la branche", copied: "Copié", @@ -472,8 +471,8 @@ export const fr: TranslationResources = { copyRelativePath: "Copier le chemin relatif", revealIn: "Afficher dans {{target}}", download: "Télécharger", - addToChat: "Ajouter au chat", - moreActions: "Plus de propositions", + addToChat: "Ajouter à la conversation", + moreActions: "Plus d’actions", newFile: "Nouveau fichier", newFolder: "Nouveau dossier", collapseFolder: "Replier le dossier", @@ -482,24 +481,24 @@ export const fr: TranslationResources = { revert: "Abandonner les modifications", delete: "Supprimer", confirmDelete: { - fileTitle: "Supprimer le fichier ?", - folderTitle: "Supprimer le dossier ?", - message: "« {{name}} » sera définitivement supprimé.", + fileTitle: "Supprimer le fichier ?", + folderTitle: "Supprimer le dossier ?", + message: "« {{name}} » sera définitivement supprimé.", confirm: "Supprimer", cancel: "Annuler", }, confirmRevert: { - title: "Abandonner les modifications ?", - message: "Les modifications de « {{name}} » seront définitivement abandonnées.", + title: "Abandonner les modifications ?", + message: "Les modifications de « {{name}} » seront définitivement abandonnées.", confirm: "Abandonner", cancel: "Annuler", - failed: "Échec de l'abandon des modifications", + failed: "Impossible d’abandonner les modifications", }, }, fileExplorer: { sort: { name: "Nom", - modified: "Modifié", + modified: "Date de modification", size: "Taille", }, context: { @@ -507,10 +506,10 @@ export const fr: TranslationResources = { modified: "Modifié", }, actions: { - back: "Dos", + back: "Retour", retry: "Réessayer", refresh: "Actualiser les fichiers", - refreshing: "Actualisation des fichiers", + refreshing: "Actualisation des fichiers…", hideHiddenFiles: "Masquer les fichiers cachés", showHiddenFiles: "Afficher les fichiers cachés", }, @@ -519,16 +518,16 @@ export const fr: TranslationResources = { noVisibleFiles: "Aucun fichier visible", }, states: { - unavailable: "Workspacen'est pas disponible", - loading: "Chargement des fichiers...", + unavailable: "L’espace de travail est indisponible", + loading: "Chargement des fichiers…", }, errors: { - failedToListDirectory: "Échec de la liste du répertoire", - createFailed: "Échec de la création de l'entrée", - renameFailed: "Échec du renommage de l'entrée", - duplicateFailed: "Échec de la duplication de l'entrée", - revealFailed: "Échec de l'affichage de l'entrée", - deleteFailed: "Échec de la suppression de l'entrée", + failedToListDirectory: "Impossible de lister le répertoire", + createFailed: "Impossible de créer l’élément", + renameFailed: "Impossible de renommer l’élément", + duplicateFailed: "Impossible de dupliquer l’élément", + revealFailed: "Impossible d’afficher l’élément", + deleteFailed: "Impossible de supprimer l’élément", }, draft: { filePlaceholder: "Nom du fichier", @@ -537,33 +536,33 @@ export const fr: TranslationResources = { }, setup: { descriptor: { - label: "Installation", + label: "Configuration", completed: "Configuration terminée", - failed: "Échec de l'installation", - workspace: "ConfigurationWorkspace", + failed: "Échec de la configuration", + workspace: "Configuration de l’espace de travail", blocked: "Configuration bloquée", }, status: { - running: "En cours d'exécution", - completed: "Complété", - failed: "Échoué", - waiting: "En attente de la sortie de configuration", + running: "En cours", + completed: "Terminé", + failed: "Échec", + waiting: "En attente de la sortie de la configuration", blocked: "Bloqué", }, - waiting: "Configuration de l'espace de travail...", + waiting: "Configuration de l’espace de travail…", blocked: { - title: "La configuration n’a pas été exécutée", + title: "La configuration n’a pas été lancée", description: - "Cette PR provient de {{repository}}, un dépôt différent. Sa configuration et ses scripts pourraient exécuter du code que vous n’avez pas examiné.", - run: "Exécuter la configuration", - runFailed: "Échec de la configuration de l’espace de travail", + "Cette PR provient de {{repository}}, un autre dépôt. Sa configuration et ses scripts pourraient exécuter du code que vous n’avez pas relu.", + run: "Lancer la configuration", + runFailed: "Impossible de lancer la configuration de l’espace de travail", }, empty: { - noCommands: "Aucune commande de configuration n'a été exécutée pour cet espace de travail.", + noCommands: "Aucune commande de configuration n’a été exécutée pour cet espace de travail.", }, accessibility: { - noCommands: "Aucune commande de configuration n'a été exécutée pour cet espace de travail", - log: "Journal de configurationWorkspace", + noCommands: "Aucune commande de configuration n’a été exécutée pour cet espace de travail", + log: "Journal de configuration de l’espace de travail", }, log: { noOutput: "Aucune sortie", @@ -571,177 +570,177 @@ export const fr: TranslationResources = { }, browser: { unavailable: { - title: "Le navigateur est réservé au bureau", + title: "Le navigateur est réservé à l’app de bureau", subtitle: "Ouvrez cet espace de travail dans Electron pour utiliser le navigateur intégré.", }, - session: "Session de navigateur{{browserId}}", + session: "Session de navigateur {{browserId}}", controls: { - back: "Dos", - forward: "Avant", + back: "Retour", + forward: "Suivant", stopLoading: "Arrêter le chargement", - refresh: "Rafraîchir", - browserUrl: "NavigateurURL", - enterUrl: "EntrezURL", - openDevTools: "Outils de développement du navigateur ouvert", - cancelSelector: "Annuler le sélecteur d'élément", - annotateElement: "Annoter l'élément", - screenshotElement: "Capturer l'élément", - screenshotCopied: "Capture d'écran copiée dans le presse-papiers", + refresh: "Actualiser", + browserUrl: "URL du navigateur", + enterUrl: "Saisir une URL", + openDevTools: "Ouvrir les outils de développement du navigateur", + cancelSelector: "Annuler la sélection d’élément", + annotateElement: "Annoter l’élément", + screenshotElement: "Capturer l’élément", + screenshotCopied: "Capture d’écran copiée dans le presse-papiers", elementCopied: "Élément copié dans le presse-papiers", - screenshotFailed: "Impossible de copier la capture", + screenshotFailed: "Impossible de copier la capture d’écran", selectorLoading: "Attendez la fin du chargement de la page", - selectorFailed: "Impossible de démarrer le sélecteur d’élément", + selectorFailed: "Impossible de lancer le sélecteur d’élément", }, annotate: { - title: "Annoter l'élément", - placeholder: "Message à l'agent concernant cet élément…", + title: "Annoter l’élément", + placeholder: "Message à l’agent à propos de cet élément…", submit: "Joindre", cancel: "Annuler", }, devices: { - label: "Taille de l'appareil", + label: "Taille de l’appareil", responsive: "Adaptatif", }, errors: { - failedToLoad: "Échec du chargement de la page", - invalidUrl: "NavigateurURLinvalide", - unsupportedProtocol: "Navigateur non pris en charge bloquéURL:{{protocol}}", + failedToLoad: "Impossible de charger la page", + invalidUrl: "URL du navigateur invalide", + unsupportedProtocol: "URL bloquée, protocole non pris en charge : {{protocol}}", }, }, terminal: { - hostDisconnected: "Hostn'est pas connecté", - updateHost: "Mettez à jour l’hôte pour utiliser le terminal natif.", - unableToSubscribe: "Impossible de s'abonner au terminal", + hostDisconnected: "L’hôte n’est pas connecté", + updateHost: "Mettez à jour l’hôte pour utiliser le rendu natif du terminal.", + unableToSubscribe: "Impossible de s’abonner au terminal", }, tabs: { - loading: "Chargement...", + loading: "Chargement…", modified: "Modifications non enregistrées", - loadingAgentTitle: "Titre d'agent de chargement", + loadingAgentTitle: "Chargement du titre de l’agent…", fallback: { newAgent: "Nouvel agent", - setup: "Installation", - workspaceSetup: "ConfigurationWorkspace", + setup: "Configuration", + workspaceSetup: "Configuration de l’espace de travail", terminal: "Terminal", browser: "Navigateur", agent: "Agent", - workspace: "Workspace", + workspace: "Espace de travail", }, switcher: { - trigger: "Changer d'onglet ({{count}}ouvert)", - title: "Changer d'onglet", - searchPlaceholder: "Onglets de recherche", + trigger: "Changer d’onglet ({{count}} ouverts)", + title: "Changer d’onglet", + searchPlaceholder: "Rechercher des onglets", }, menu: { - openFor: "Ouvrir le menu pour{{label}}", + openFor: "Ouvrir le menu de {{label}}", copyResumeCommand: "Copier la commande de reprise", - copyAgentId: "Copier l'identifiant de l'agent", - copyTerminalId: "Copier l'identifiant du terminal", - copyFilePath: "Copy file path", - rename: "Rebaptiser", - closeAbove: "Fermer les onglets ci-dessus", - closeBelow: "Fermer les onglets ci-dessous", - closeLeft: "Près de la gauche", - closeRight: "Près de la droite", + copyAgentId: "Copier l’ID de l’agent", + copyTerminalId: "Copier l’ID du terminal", + copyFilePath: "Copier le chemin du fichier", + rename: "Renommer", + closeAbove: "Fermer les onglets au-dessus", + closeBelow: "Fermer les onglets en dessous", + closeLeft: "Fermer les onglets à gauche", + closeRight: "Fermer les onglets à droite", closeOthers: "Fermer les autres onglets", moveToMain: "Déplacer vers le panneau principal", - reloadAgent: "Agent de rechargement", + reloadAgent: "Recharger l’agent", reloadAgentTooltip: - "Rechargez l'agent pour mettre à jour les compétences, les MCP ou le statut de connexion.", + "Rechargez l’agent pour mettre à jour les skills, les MCP ou l’état de connexion.", close: "Fermer", renameTerminal: "Renommer le terminal", - renameAgent: "Renommer l'agent", + renameAgent: "Renommer l’agent", }, actions: { newTab: "Nouvel onglet", newAgent: "Nouvel agent", newTerminal: "Nouveau terminal", - preparingTerminal: "Préparation de l'onglet du terminal", - preparingTerminalTooltip: "Préparation du terminal...", + preparingTerminal: "Préparation de l’onglet de terminal…", + preparingTerminalTooltip: "Préparation du terminal…", newBrowser: "Nouveau navigateur", - maximizePane: "Agrandir le volet", - restorePane: "Restaurer le volet", - closePane: "Fermer le volet", + maximizePane: "Agrandir le panneau", + restorePane: "Restaurer le panneau", + closePane: "Fermer le panneau", exitFocusMode: "Quitter le mode concentration", - splitRight: "Volet divisé à droite", - splitDown: "Diviser le volet vers le bas", + splitRight: "Diviser le panneau à droite", + splitDown: "Diviser le panneau vers le bas", changes: "Modifications", files: "Fichiers", - pullRequest: "Demande de fusion", - terminalProfilesMenu: "Terminal profiles", - editTerminalProfiles: "Edit profiles", + pullRequest: "Pull request", + terminalProfilesMenu: "Profils de terminal", + editTerminalProfiles: "Modifier les profils", }, explorerSidebar: { - open: "Ouvrir le panneau latéral", - close: "Fermer le panneau latéral", - toggle: "Basculer le panneau latéral", - changes: "Changements", + open: "Ouvrir la barre latérale de l’explorateur", + close: "Fermer la barre latérale de l’explorateur", + toggle: "Afficher/masquer la barre latérale de l’explorateur", + changes: "Modifications", files: "Fichiers", }, toasts: { - copyFailed: "Échec de la copie", - agentIdCopiedLabel: "AgentID", - terminalIdCopiedLabel: "Identifiant du terminal", - resumeCommandCopiedLabel: "reprendre la commande", - filePathCopiedLabel: "File path", - resumeIdUnavailable: "ReprendreIDnon disponible", - resumeCommandUnavailable: "Commande de reprise non disponible", - reloadingAgent: "Agent de rechargement...", + copyFailed: "Impossible de copier", + agentIdCopiedLabel: "ID de l’agent", + terminalIdCopiedLabel: "ID du terminal", + resumeCommandCopiedLabel: "Commande de reprise", + filePathCopiedLabel: "Chemin du fichier", + resumeIdUnavailable: "ID de reprise indisponible", + resumeCommandUnavailable: "Commande de reprise indisponible", + reloadingAgent: "Rechargement de l’agent…", reloadedAgent: "Agent rechargé", - failedToReloadAgent: "Échec du rechargement de l'agent", - failedToCloseAgent: "Échec de la fermeture de l'agent", + failedToReloadAgent: "Impossible de recharger l’agent", + failedToCloseAgent: "Impossible de fermer l’agent", }, confirmations: { unsavedTitle: "Modifications non enregistrées", unsavedMessage: "Cet onglet contient des modifications non enregistrées. Le fermer supprimera le brouillon.", closeWithoutSaving: "Fermer sans enregistrer", - closePaneTitle: "Fermer le volet?", + closePaneTitle: "Fermer le panneau ?", bulkUnsaved: "{{count}} onglet(s) contiennent des modifications non enregistrées. Les fermer supprimera ces brouillons.", close: "Fermer", cancel: "Annuler", - archive: "Archive", - closeTerminalTitle: "Fermer le terminal?", - closeTerminalMessage: - "Tout processus en cours d’exécution dans ce terminal sera immédiatement arrêté.", - archiveRunningAgentTitle: "Archiver l'agent en cours d'exécution?", + archive: "Archiver", + closeTerminalTitle: "Fermer le terminal ?", + closeTerminalMessage: "Tout processus en cours dans ce terminal sera arrêté immédiatement.", + archiveRunningAgentTitle: "Archiver l’agent en cours ?", archiveRunningAgentMessage: - "Cet agent est toujours en cours d'exécution. L'archiver arrêtera l'agent et fermera l'onglet.", - closeTabsLeftTitle: "Fermer les onglets à gauche?", - closeTabsRightTitle: "Fermer les onglets à droite?", - closeOtherTabsTitle: "Fermer les autres onglets?", + "Cet agent est toujours en cours d’exécution. L’archiver arrêtera l’agent et fermera l’onglet.", + closeTabsLeftTitle: "Fermer les onglets à gauche ?", + closeTabsRightTitle: "Fermer les onglets à droite ?", + closeOtherTabsTitle: "Fermer les autres onglets ?", bulk: { - all: "Cela archivera les agents{{agents}}, fermera les terminaux{{terminals}}et fermera les onglets{{tabs}}. Tout processus en cours d’exécution dans un terminal fermé sera immédiatement arrêté.", + all: "Cette action archivera {{agents}} agent(s), fermera {{terminals}} terminal(s) et fermera {{tabs}} onglet(s). Tout processus en cours dans un terminal fermé sera arrêté immédiatement.", agentsAndTerminals: - "Cela archivera les agents{{agents}}et fermera les terminaux{{terminals}}. Tout processus en cours d’exécution dans un terminal fermé sera immédiatement arrêté.", + "Cette action archivera {{agents}} agent(s) et fermera {{terminals}} terminal(s). Tout processus en cours dans un terminal fermé sera arrêté immédiatement.", terminalsAndTabs: - "Cela fermera le(s) terminal(s){{terminals}}et fermera le(s) onglet(s){{tabs}}. Tout processus en cours d’exécution dans un terminal fermé sera immédiatement arrêté.", - agentsAndTabs: "Cela archivera les agents{{agents}}et fermera les onglets{{tabs}}.", + "Cette action fermera {{terminals}} terminal(s) et {{tabs}} onglet(s). Tout processus en cours dans un terminal fermé sera arrêté immédiatement.", + agentsAndTabs: + "Cette action archivera {{agents}} agent(s) et fermera {{tabs}} onglet(s).", terminals: - "Cela fermera le(s) terminal(s){{terminals}}. Tout processus en cours d’exécution dans un terminal fermé sera immédiatement arrêté.", - tabs: "Cela fermera les onglets{{tabs}}.", - agents: "Cela archivera les agents{{agents}}.", + "Cette action fermera {{terminals}} terminal(s). Tout processus en cours dans un terminal fermé sera arrêté immédiatement.", + tabs: "Cette action fermera {{tabs}} onglet(s).", + agents: "Cette action archivera {{agents}} agent(s).", }, }, }, header: { actions: { - workspaceActions: "ActionsWorkspace", + workspaceActions: "Actions de l’espace de travail", newAgent: "Nouvel agent", - newTerminal: "Nouvelle borne", - newBrowser: "Nouvel onglet du navigateur", - importSession: "Session d'importation", - copyPath: "Copier le chemin de l'espace de travail", + newTerminal: "Nouveau terminal", + newBrowser: "Nouvel onglet de navigateur", + importSession: "Importer une session", + copyPath: "Copier le chemin de l’espace de travail", copyBranchName: "Copier le nom de la branche", showSetup: "Afficher la configuration", }, toasts: { - workspacePathUnavailable: "Le cheminWorkspacen'est pas encore disponible", - branchNameUnavailable: "Nom de la succursale non disponible", + workspacePathUnavailable: "Le chemin de l’espace de travail n’est pas encore disponible", + branchNameUnavailable: "Nom de la branche indisponible", terminalQueued: - "Préparation de l'espace de travail, ouverture du terminal lorsque vous êtes prêt...", - workspacePathCopiedLabel: "CheminWorkspace", - branchNameCopiedLabel: "Nom de la succursale", + "Préparation de l’espace de travail, le terminal s’ouvrira dès qu’il sera prêt…", + workspacePathCopiedLabel: "Chemin de l’espace de travail", + branchNameCopiedLabel: "Nom de la branche", }, }, scripts: { @@ -751,231 +750,224 @@ export const fr: TranslationResources = { copyUrl: "Copier l’URL", openService: "Voir le service", restart: "Redémarrer", - run: "Courir", + run: "Lancer", stop: "Arrêter", view: "Voir le terminal", }, accessibility: { - trigger: "ScriptsWorkspace", + trigger: "Scripts de l’espace de travail", openService: "Voir le service {{scriptName}}", - viewTerminal: "Voir le terminal{{scriptName}}", - runScript: "Exécuter le script{{scriptName}}", - stopScript: "Arrêter{{scriptName}}", - restartScript: "Redémarrer{{scriptName}}", - copyUrl: "Copier l'URL de{{scriptName}}", - chooseUrl: "Choisir l’URL pour {{scriptName}}", - script: "Script{{scriptName}}", + viewTerminal: "Voir le terminal de {{scriptName}}", + runScript: "Lancer le script {{scriptName}}", + stopScript: "Arrêter {{scriptName}}", + restartScript: "Redémarrer {{scriptName}}", + copyUrl: "Copier l’URL de {{scriptName}}", + chooseUrl: "Choisir l’URL de {{scriptName}}", + script: "Script {{scriptName}}", }, routes: { public: "Proxy inverse", - paseo: "Memorable", + paseo: "Mémorable", direct: "Directe", }, states: { - exitCode: "quitter{{code}}", - startFailed: "Échec du démarrage de{{scriptName}}", - stopFailed: "Échec de l'arrêt de{{scriptName}}", + exitCode: "sortie {{code}}", + startFailed: "Impossible de démarrer {{scriptName}}", + stopFailed: "Impossible d’arrêter {{scriptName}}", }, }, tree: { - showFolderTree: "Afficher l'arborescence des dossiers", - hideFolderTree: "Masquer l'arborescence des dossiers", + showFolderTree: "Afficher l’arborescence des dossiers", + hideFolderTree: "Masquer l’arborescence des dossiers", }, git: { actions: { - moreOptions: "Plus d'options", - moreActions: "Plus de propositions", + moreOptions: "Plus d’options", + moreActions: "Plus d’actions", commit: { - label: "Commettre", - pending: "S'engager...", - success: "Engagé", + label: "Commiter", + pending: "Commit en cours…", + success: "Commité", }, pull: { - label: "Tirer", - pending: "Tirer...", - success: "Tiré", + label: "Pull", + pending: "Pull en cours…", + success: "Pull effectué", }, push: { - label: "Pousser", - pending: "Pousser...", - success: "Poussé", + label: "Push", + pending: "Push en cours…", + success: "Push effectué", }, pullAndPush: { - label: "Tirez et poussez", - pending: "Tirer et pousser...", - success: "Tiré et poussé", + label: "Pull et push", + pending: "Pull et push en cours…", + success: "Pull et push effectués", }, - viewPr: "VoirPR", + viewPr: "Voir la PR", createPr: { - label: "CréerPR", - pending: "Création dePR...", - success: "PRcréé", - label_mr: "Créer MR", - pending_mr: "Création de MR...", - success_mr: "MR créé", + label: "Créer une PR", + pending: "Création de la PR…", + success: "PR créée", + label_mr: "Créer une MR", + pending_mr: "Création de la MR…", + success_mr: "MR créée", }, mergeBranch: { - label: "Fusionner localement", - pending: "Fusion...", + label: "Fusionner en local", + pending: "Fusion…", success: "Fusionné", }, mergeFromBase: { - label: "Mise à jour de{{baseRef}}", - pending: "Mise à jour...", + label: "Mettre à jour depuis {{baseRef}}", + pending: "Mise à jour…", success: "Mis à jour", }, archive: { label: "Archiver l’espace de travail", - pending: "Archivage...", + pending: "Archivage…", success: "Archivé", }, mergePr: { - squash: "Fusionner PR (squash)", - merge: "Fusionner PR (merge)", - rebase: "Fusionner PR (rebase)", - pending: "Fusion de PR...", - success: "PR fusionné", - squash_mr: "Fusionner MR (squash)", - merge_mr: "Fusionner MR (merge)", - rebase_mr: "Fusionner MR (rebase)", - pending_mr: "Fusion de MR...", - success_mr: "MR fusionné", + squash: "Fusionner la PR (squash)", + merge: "Fusionner la PR (merge)", + rebase: "Fusionner la PR (rebase)", + pending: "Fusion de la PR…", + success: "PR fusionnée", + squash_mr: "Fusionner la MR (squash)", + merge_mr: "Fusionner la MR (merge)", + rebase_mr: "Fusionner la MR (rebase)", + pending_mr: "Fusion de la MR…", + success_mr: "MR fusionnée", }, - viewPr_mr: "Voir MR", + viewPr_mr: "Voir la MR", autoMerge: { enableSquash: "Fusion automatique (squash)", enableMerge: "Fusion automatique (merge)", enableRebase: "Fusion automatique (rebase)", enabled: "Fusion automatique activée", - enabling: "Activation de la fusion automatique...", - disabling: "Désactivation de la fusion automatique...", + enabling: "Activation de la fusion automatique…", + disabling: "Désactivation de la fusion automatique…", disabled: "Fusion automatique désactivée", }, unavailable: { viewPrNoForge: - "Voir {{noun}} n'est pas disponible pour le moment car {{brand}} n'est pas connecté", + "Impossible de voir la {{noun}} pour l’instant : {{brand}} n’est pas connecté", pullNoRemote: - "Pull n'est pas disponible ici car cette branche n'est pas encore connectée à une télécommande", + "Pull indisponible : cette branche n’est pas encore liée à un dépôt distant", pullDirty: - "Pull n'est pas disponible tant que vous avez des modifications locales, alors validez-les ou cachez-les d'abord", - pullUpToDate: "Pull n'est pas disponible car cette branche est déjà à jour", + "Pull indisponible tant que vous avez des modifications locales : commitez-les ou remisez-les d’abord", + pullUpToDate: "Pull indisponible : cette branche est déjà à jour", pushNoRemote: - "Push n'est pas disponible ici car cette branche n'est pas encore connectée à une télécommande", + "Push indisponible : cette branche n’est pas encore liée à un dépôt distant", pushBehind: - "Push n'est pas encore disponible, car de nouvelles modifications doivent être apportées en premier.", - pushNothing: "Push n'est pas disponible car il n'y a rien de nouveau à envoyer", + "Push indisponible pour l’instant : des modifications plus récentes doivent d’abord être récupérées", + pushNothing: "Push indisponible : il n’y a rien de nouveau à pousser", pullAndPushNoRemote: - "Le pull et le push ne sont pas disponibles ici car cette branche n'est pas encore connectée à une télécommande", + "Pull et push indisponibles : cette branche n’est pas encore liée à un dépôt distant", pullAndPushDirty: - "Pull et push ne sont pas disponibles tant que vous avez des modifications locales, alors validez-les ou cachez-les d'abord", + "Pull et push indisponibles tant que vous avez des modifications locales : commitez-les ou remisez-les d’abord", pullAndPushNoIncoming: - "Pull et push ne sont pas disponibles car il n'y a aucun changement entrant à récupérer d'abord", - pullAndPushInSync: - "Les fonctions Pull et Push ne sont pas disponibles car cette branche est déjà synchronisée", + "Pull et push indisponibles : aucune modification entrante à récupérer", + pullAndPushInSync: "Pull et push indisponibles : cette branche est déjà synchronisée", pullAndPushNothingToPush: - "Pull et push ne sont pas disponibles car il n'y a rien de nouveau à envoyer après le pull", + "Pull et push indisponibles : il n’y aurait rien de nouveau à pousser après le pull", createPrNoForge: - "Créer {{noun}} n'est pas disponible pour le moment car {{brand}} n'est pas connecté", + "Impossible de créer une {{noun}} pour l’instant : {{brand}} n’est pas connecté", createPrNoCommits: - "CréerPRn'est pas disponible car cette branche n'a pas encore de nouveaux commits", - mergeNoBase: - "La fusion n'est pas disponible car nous n'avons pas pu déterminer la branche de base", + "Impossible de créer une PR : cette branche n’a pas encore de nouveau commit", + mergeNoBase: "Fusion indisponible : impossible de déterminer la branche de base", mergeDirty: - "La fusion n'est pas disponible tant que vous avez des modifications locales, alors validez-les ou cachez-les d'abord", + "Fusion indisponible tant que vous avez des modifications locales : commitez-les ou remisez-les d’abord", mergeNothing: - "La fusion n'est pas disponible car cette branche n'a encore rien de nouveau à fusionner", - updateNoBase: - "La mise à jour n'est pas disponible car nous n'avons pas pu déterminer la branche de base", + "Fusion indisponible : cette branche n’a encore rien de nouveau à fusionner", + updateNoBase: "Mise à jour indisponible : impossible de déterminer la branche de base", updateDirty: - "La mise à jour n'est pas disponible tant que vous avez des modifications locales, alors validez-les ou cachez-les d'abord", + "Mise à jour indisponible tant que vous avez des modifications locales : commitez-les ou remisez-les d’abord", updateCurrent: - "La mise à jour n'est pas disponible car cette branche est déjà à jour avec{{baseRef}}", + "Mise à jour indisponible : cette branche est déjà à jour avec {{baseRef}}", mergePrNoGithub: - "La fusionPRn'est pas disponible pour le moment carGitHubn'est pas connecté", + "Impossible de fusionner la PR pour l’instant : GitHub n’est pas connecté", archiveNotWorktree: - "L'archive n'est pas disponible ici car cet espace de travail n'a pas été créé en tant qu'arbre de travailPaseo", + "Archivage indisponible : cet espace de travail n’a pas été créé comme worktree Paseo", mergePrNoForge: - "La fusion {{noun}} n'est pas disponible pour le moment car {{brand}} n'est pas connecté", - mergePrMissing: - "La fusionPRn'est pas disponible car il n'y a pas encore de demande d'extraction", - mergePrDraft: - "La fusionPRn'est pas disponible car la demande d'extraction est encore un brouillon", - mergePrMerged: - "La fusionPRn'est pas disponible car la demande d'extraction est déjà fusionnée", - mergePrClosed: "La fusionPRn'est pas disponible car la demande d'extraction est fermée", - mergePrConflicts: - "La fusionPRn'est pas disponible car la demande d'extraction présente des conflits", + "Impossible de fusionner la {{noun}} pour l’instant : {{brand}} n’est pas connecté", + mergePrMissing: "Impossible de fusionner la PR : il n’y a pas encore de pull request", + mergePrDraft: "Impossible de fusionner la PR : la pull request est encore un brouillon", + mergePrMerged: "Impossible de fusionner la PR : la pull request est déjà fusionnée", + mergePrClosed: "Impossible de fusionner la PR : la pull request est fermée", + mergePrConflicts: "Impossible de fusionner la PR : la pull request a des conflits", mergePrQueue: - "MergePRn'est pas disponible ici car ce référentiel utilise une file d'attente de fusion", + "Impossible de fusionner la PR ici : ce dépôt utilise une file d’attente de fusion", mergePrNotReady: - "La fusion {{noun}} n'est pas disponible jusqu'à ce que {{brand}} signale que {{noun}} est prête à fusionner", + "Impossible de fusionner la {{noun}} tant que {{brand}} n’indique pas que la {{noun}} est prête à être fusionnée", autoMergeCannotDisable: "La fusion automatique est activée, mais ce compte ne peut pas la désactiver", }, toasts: { - failedCommit: "Échec de la validation", - failedPull: "Échec de l'extraction", - failedPush: "Échec de la poussée", - failedPullAndPush: "Impossible de tirer et de pousser", - failedCreatePr: "Échec de la création dePR", - failedMergePr: "Échec de la fusion dePR", - failedEnableAutoMerge: "Échec de l'activation de la fusion automatique", - failedDisableAutoMerge: "Échec de la désactivation de la fusion automatique", - baseRefUnavailable: "Réf de base indisponible", + failedCommit: "Impossible de commiter", + failedPull: "Échec du pull", + failedPush: "Échec du push", + failedPullAndPush: "Échec du pull et du push", + failedCreatePr: "Impossible de créer la PR", + failedMergePr: "Impossible de fusionner la PR", + failedEnableAutoMerge: "Impossible d’activer la fusion automatique", + failedDisableAutoMerge: "Impossible de désactiver la fusion automatique", + baseRefUnavailable: "Référence de base indisponible", failedMerge: "Échec de la fusion", - failedMergeFromBase: "Échec de la fusion à partir de la base", + failedMergeFromBase: "Échec de la fusion depuis la base", }, archiveWarning: { - title: "Archiver «{{workspaceName}}»?", - confirm: "Archive", + title: "Archiver « {{workspaceName}} » ?", + confirm: "Archiver", cancel: "Annuler", - uncommittedChanges: "Modifications non validées", - uncommittedChangesWithDiff: "Modifications non validées ({{diffStat}})", - addedLine: "Ligne ajoutée{{count}}", - addedLines: "{{count}}lignes ajoutées", - deletedLine: "Ligne supprimée{{count}}", - deletedLines: "{{count}}lignes supprimées", - unpushedCommit: "Validation non poussée{{count}}", - unpushedCommits: "Validations non poussées{{count}}", + uncommittedChanges: "Modifications non commitées", + uncommittedChangesWithDiff: "Modifications non commitées ({{diffStat}})", + addedLine: "{{count}} ligne ajoutée", + addedLines: "{{count}} lignes ajoutées", + deletedLine: "{{count}} ligne supprimée", + deletedLines: "{{count}} lignes supprimées", + unpushedCommit: "{{count}} commit non poussé", + unpushedCommits: "{{count}} commits non poussés", }, }, diff: { - openChangesTab: "Ouvrir l'onglet Modifications", - openDiffTab: "Ouvrir l'onglet Diff", - closeChangesTab: "Fermer l'onglet Modifications", + openChangesTab: "Ouvrir l’onglet Modifications", + openDiffTab: "Ouvrir l’onglet Diff", + closeChangesTab: "Fermer l’onglet Modifications", jumpToFile: { title: "Aller au fichier", }, binaryFile: "Fichier binaire", - tooLarge: "Diff trop grand pour être affiché", + tooLarge: "Diff trop volumineux pour être affiché", previewTooLargeTitle: "Ce diff est trop volumineux pour être prévisualisé", - previewTooLargeDescription: "Réduisez la comparaison pour la prévisualiser ici", - unified: "Différentiel unifié", - split: "Différent côte à côte", + previewTooLargeDescription: "Réduisez la comparaison pour le prévisualiser ici", + unified: "Diff unifié", + split: "Diff côte à côte", switchToUnified: "Passer au diff unifié", switchToSplit: "Passer au diff côte à côte", options: "Options du diff", - inlineDiff: "Diff intégré", + inlineDiff: "Diff en ligne", hideWhitespace: "Masquer les espaces", showWhitespace: "Afficher les espaces", scrollLongLines: "Faire défiler les longues lignes", - wrapLongLines: "Enroulez les longues lignes", - collapseAllFolders: "Réduire tous les dossiers", - expandAllFolders: "Développer tous les dossiers", - collapseAllFiles: "Réduire tous les fichiers", - expandAllFiles: "Développer tous les fichiers", - refreshing: "Rafraîchissant", - refresh: "Rafraîchir", - refreshState: "Actualiser l'état de git et de {{brand}}", - failedRefresh: "Échec de l'actualisation de l'état git.", - seeUncommittedChanges: "Voir les modifications non validées", - seeCommittedChanges: "Voir les modifications validées", - checkingRepository: "Vérification du référentiel...", - notRepository: "Pas un dépôt git", - diffMode: "Mode différentiel", - uncommitted: "Non engagé", - committed: "Engagé", - branchUnknown: "Inconnu", + wrapLongLines: "Renvoyer les longues lignes à la ligne", + collapseAllFolders: "Replier tous les dossiers", + expandAllFolders: "Déplier tous les dossiers", + collapseAllFiles: "Replier tous les fichiers", + expandAllFiles: "Déplier tous les fichiers", + refreshing: "Actualisation…", + refresh: "Actualiser", + refreshState: "Actualiser l’état de git et de {{brand}}", + failedRefresh: "Impossible d’actualiser l’état git.", + seeUncommittedChanges: "Voir les modifications non commitées", + seeCommittedChanges: "Voir les modifications commitées", + checkingRepository: "Vérification du dépôt…", + notRepository: "Ce n’est pas un dépôt git", + diffMode: "Mode de diff", + uncommitted: "Non commité", + committed: "Commité", + branchUnknown: "Inconnue", base: "base", newFile: "Nouveau", deletedFile: "Supprimé", @@ -983,20 +975,20 @@ export const fr: TranslationResources = { commits: { title: "Commits", countLabel: "{{count}} commits de l’espace de travail", - noneAhead: "Aucun commit en avance sur {{baseRef}} pour le moment", + noneAhead: "Aucun commit en avance sur {{baseRef}} pour l’instant", fileDiffEmpty: "Aucune modification à afficher", - fileDiffError: "Échec du chargement du diff du fichier", + fileDiffError: "Impossible de charger le diff du fichier", loading: "Chargement des commits…", - loadError: "Échec du chargement des commits", - empty: "Aucun commit pour le moment", + loadError: "Impossible de charger les commits", + empty: "Aucun commit pour l’instant", }, }, openInEditor: { open: "Ouvrir", - chooseEditor: "Choisir l'éditeur", - openIn: "Espace de travail ouvert dans{{target}}", - openFileIn: "Open {{fileName}} in {{target}}", - failedOpen: "Échec de l'ouverture de l'espace de travail", + chooseEditor: "Choisir l’éditeur", + openIn: "Ouvrir l’espace de travail dans {{target}}", + openFileIn: "Ouvrir {{fileName}} dans {{target}}", + failedOpen: "Impossible d’ouvrir l’espace de travail", }, pr: { actions: { @@ -1004,60 +996,60 @@ export const fr: TranslationResources = { openOn: "Ouvrir sur {{brand}}", }, checksSummary: { - passedLabel: "succès", - failedLabel: "échec", + passedLabel: "réussies", + failedLabel: "en échec", runningLabel: "en cours", passedAccessible: "Vérifications réussies", failedAccessible: "Vérifications en échec", runningAccessible: "Vérifications en cours", }, sections: { - checks: "Chèques", + checks: "Vérifications", pipeline: "Pipeline", - reviews: "Avis", + reviews: "Revues", }, empty: { - noJobs: "Aucune tâche", - loadingPipeline: "Chargement du pipeline...", - pipelineJobsLoadFailed: "Impossible de charger les tâches du pipeline", - allowedToFail: "autorisé à échouer", + noJobs: "Aucun job", + loadingPipeline: "Chargement du pipeline…", + pipelineJobsLoadFailed: "Impossible de charger les jobs du pipeline", + allowedToFail: "échec autorisé", }, approvals: "{{given}} sur {{required}} approbations", accessibility: { - pullRequest: "Demande de tirage #{{number}}", - pullRequest_mr: "Demande de fusion !{{number}}", + pullRequest: "Pull request #{{number}}", + pullRequest_mr: "Merge request !{{number}}", checkStatus: { - passed: "Réussi", + passed: "Réussie", failed: "Échec", warning: "Avertissement", actionRequired: "Action requise", - manual: "Manuel", + manual: "Manuelle", pending: "En attente", - skipped: "Ignoré", - cancelled: "Annulé", + skipped: "Ignorée", + cancelled: "Annulée", }, }, states: { draft: "Brouillon", - merged: "Fusionné", - closed: "Fermé", - open: "Ouvrir", + merged: "Fusionnée", + closed: "Fermée", + open: "Ouverte", }, activity: { - commented: "Commenté", - approved: "Approuvé", - requestedChanges: "Modifications demandées", - reviewed: "Révisé", + commented: "A commenté", + approved: "A approuvé", + requestedChanges: "A demandé des modifications", + reviewed: "A relu", }, time: { - justNow: "tout à l' heure", + justNow: "à l’instant", }, thread: { discussion: "Fil de discussion", }, errors: { - statusLoadFailed: "Impossible de charger le statut de la demande d'extraction", - activityLoadFailed: "Impossible de charger l'activité de demande d'extraction", + statusLoadFailed: "Impossible de charger le statut de la pull request", + activityLoadFailed: "Impossible de charger l’activité de la pull request", }, }, forgeSetup: { @@ -1086,7 +1078,7 @@ export const fr: TranslationResources = { orange: "Orange", pink: "Rose", indigo: "Indigo", - teal: "Sarcelle", + teal: "Bleu canard", red: "Rouge", amber: "Ambre", blue: "Bleu", @@ -1105,7 +1097,7 @@ export const fr: TranslationResources = { color: "Couleur", save: "Enregistrer", delete: "Supprimer", - deleteTitle: "Supprimer {{name}} ?", + deleteTitle: "Supprimer {{name}} ?", deleteMessage_one: "Cela retire l’étiquette de {{count}} espace de travail sur cet hôte.", deleteMessage_other: "Cela retire l’étiquette de {{count}} espaces de travail sur cet hôte.", offline: "Cet hôte est hors ligne.", @@ -1124,7 +1116,7 @@ export const fr: TranslationResources = { }, sidebar: { display: { - trigger: "Préférences d'affichage", + trigger: "Préférences d’affichage", heading: "Affichage", grouping: { label: "Regroupement", @@ -1146,7 +1138,7 @@ export const fr: TranslationResources = { checks: "Vérifications", services: "Services", labels: "Libellés", - diff: "Statistiques de diff", + diff: "Statistiques du diff", timestamp: "Dernière activité", }, checks: { @@ -1174,8 +1166,8 @@ export const fr: TranslationResources = { }, host: { noHost: "Aucun hôte", - switchTitle: "Changer d'hôte", - searchPlaceholder: "Rechercher des hôtes...", + switchTitle: "Changer d’hôte", + searchPlaceholder: "Rechercher des hôtes…", }, actions: { addProject: "Ajouter un projet", @@ -1200,93 +1192,93 @@ export const fr: TranslationResources = { }, sections: { sessions: "Historique", - search: "Rechercher", + search: "Recherche", schedules: "Planifications", }, worktreeSetup: { - title: "Configurer les scripts d'arbre de travail", + title: "Configurer les scripts de worktree", description: - "Ajoutez des commandes de configuration pour que les nouveaux arbres de travail puissent installer des dépendances et se préparer automatiquement.", + "Ajoutez des commandes de configuration pour que les nouveaux worktrees installent leurs dépendances et se préparent automatiquement.", openProjectSettings: "Ouvrir les paramètres du projet", }, project: { actions: { menu: "Actions du projet", openSettings: "Ouvrir les paramètres du projet", - openNewWindow: "Open in new window", - openNewWindowFailed: "Couldn't open a new window", - openFolder: "Open in file manager", - openFolderFailed: "Couldn't open folder", - remove: "Supprimer le projet", - removing: "Suppression...", + openNewWindow: "Ouvrir dans une nouvelle fenêtre", + openNewWindowFailed: "Impossible d’ouvrir une nouvelle fenêtre", + openFolder: "Ouvrir dans le gestionnaire de fichiers", + openFolderFailed: "Impossible d’ouvrir le dossier", + remove: "Retirer le projet", + removing: "Retrait…", }, confirmations: { - removeTitle: "Supprimer le projet?", + removeTitle: "Retirer le projet ?", removeMessage: - "Supprimer «{{projectName}}» de la barre latérale?\n\nLes fichiers sur le disque ne seront pas modifiés.", + "Retirer « {{projectName}} » de la barre latérale ?\n\nLes fichiers sur le disque ne seront pas modifiés.", removeConfirm: "Retirer", cancel: "Annuler", }, toasts: { - hostDisconnected: "Hostn'est pas connecté", - removeFailed: "Échec de la suppression de certains espaces de travail", - updateHostToRemove: "Mettez à jour le host pour supprimer des projets.", + hostDisconnected: "L’hôte n’est pas connecté", + removeFailed: "Impossible de retirer certains espaces de travail", + updateHostToRemove: "Mettez à jour l’hôte pour retirer des projets.", }, empty: { - title: "Aucun projet pour l'instant", + title: "Aucun projet pour l’instant", description: "Ajoutez un projet pour commencer", }, }, workspace: { status: { - serviceRunning: "Service {{name}} en cours", + serviceRunning: "Service {{name}} en cours d’exécution", serviceUnhealthy: "Service {{name}} en échec", - creating: "Création...", + creating: "Création…", }, checks: { - passed: "Réussis : {{count}}", - failed: "Échecs : {{count}}", - warning: "Avertissements : {{count}}", - actionRequired: "Action requise : {{count}}", - manual: "Manuels : {{count}}", - pending: "En attente : {{count}}", + passed: "Réussies : {{count}}", + failed: "Échouées : {{count}}", + warning: "Avertissements : {{count}}", + actionRequired: "Action requise : {{count}}", + manual: "Manuelles : {{count}}", + pending: "En attente : {{count}}", }, actions: { - menu: "ActionsWorkspace", + menu: "Actions de l’espace de travail", newWorkspace: "Nouvel espace de travail", showMore: "Afficher plus", showLess: "Afficher moins", - createWorkspaceFor: "Créer un nouvel espace de travail pour{{projectName}}", + createWorkspaceFor: "Créer un espace de travail pour {{projectName}}", copyPath: "Copier le chemin", copyBranchName: "Copier le nom de la branche", - rename: "Renommer l'espace de travail", + rename: "Renommer l’espace de travail", pin: "Épingler en haut", unpin: "Désépingler", - archive: "Archive", + archive: "Archiver", archiveWorkspace: "Archiver l’espace de travail", hideFromSidebar: "Masquer de la barre latérale", - archiving: "Archivage...", - hiding: "Dissimulation...", + archiving: "Archivage…", + hiding: "Masquage…", }, confirmations: { - hideTitle: "Masquer l'espace de travail?", + hideTitle: "Masquer l’espace de travail ?", hideMessage: - "Masquer «{{workspaceName}}» dans la barre latérale?\n\nLes fichiers sur le disque ne seront pas modifiés.", - hideConfirm: "Cacher", + "Masquer « {{workspaceName}} » de la barre latérale ?\n\nLes fichiers sur le disque ne seront pas modifiés.", + hideConfirm: "Masquer", cancel: "Annuler", }, rename: { - title: "Renommer l'espace de travail", - submit: "Rebaptiser", - invalidBranchName: "Nom de succursale invalide", + title: "Renommer l’espace de travail", + submit: "Renommer", + invalidBranchName: "Nom de branche invalide", }, toasts: { - workspacePathUnavailable: "CheminWorkspacenon disponible", + workspacePathUnavailable: "Chemin de l’espace de travail indisponible", pathCopied: "Chemin copié", - branchNameCopied: "Nom de la succursale copié", - hostDisconnected: "Hostn'est pas connecté", - hideFailed: "Échec du masquage de l'espace de travail", - archiveFailed: "Échec de l'archivage de l'espace de travail", + branchNameCopied: "Nom de branche copié", + hostDisconnected: "L’hôte n’est pas connecté", + hideFailed: "Impossible de masquer l’espace de travail", + archiveFailed: "Impossible d’archiver l’espace de travail", }, }, }, @@ -1305,34 +1297,34 @@ export const fr: TranslationResources = { }, titlePlaceholder: "Titre (facultatif)", errors: { - hostDisconnected: "Hostn'est pas connecté", - createWorktreeFailed: "Échec de la création de l'arbre de travail", - composerStateRequired: "L'état du compositeur est requis", + hostDisconnected: "L’hôte n’est pas connecté", + createWorktreeFailed: "Impossible de créer le worktree", + composerStateRequired: "L’état de la zone de saisie est requis", selectModel: "Sélectionnez un modèle", }, tooltips: { - project: "Choose the project", - host: "Choose the host", - isolation: "Choose the isolation level", - startingRef: "Choisissez par où commencer", - launch: "Choose what to launch", + project: "Choisir le projet", + host: "Choisir l’hôte", + isolation: "Choisir le niveau d’isolation", + startingRef: "Choisir le point de départ", + launch: "Choisir quoi lancer", }, refPicker: { - startingRef: "Réf de départ", - intoBase: "dans {{baseRef}}", - searching: "Recherche...", + startingRef: "Réf. de départ", + intoBase: "vers {{baseRef}}", + searching: "Recherche…", noMatchingRefs: "Aucune référence correspondante.", - searchPlaceholder: "Rechercher des succursales et des PR", - title: "Commencer à partir de", + searchPlaceholder: "Rechercher des branches et des PR", + title: "Partir de", }, launch: { - title: "What to launch", + title: "Que lancer ?", chat: "Chat", terminal: "Terminal", - manageProfiles: "Manage profiles", - submit: "Launch", - promptPlaceholder: "Prompt {{name}}", - commandPlaceholder: "Run a command, or leave empty for a blank terminal", + manageProfiles: "Gérer les profils", + submit: "Lancer", + promptPlaceholder: "Prompt pour {{name}}", + commandPlaceholder: "Saisissez une commande, ou laissez vide pour un terminal vierge", }, }, desktop: { @@ -1343,181 +1335,180 @@ export const fr: TranslationResources = { close: "Fermer la fenêtre", }, quitting: { - title: "QuitterPaseo...", - detail: "Arrêt du démon local.", + title: "Fermeture de Paseo…", + detail: "Arrêt du daemon local.", }, daemon: { lifecycle: en.desktop.daemon.lifecycle, title: "Daemon", status: { title: "Statut", - builtInOnly: "Seul le démon de bureau intégré est affiché ici", - running: "en cours d'exécution", - notRunning: "ne fonctionne pas", - pid: "PID{{pid}}", + builtInOnly: "Seul le daemon intégré à l’application de bureau est affiché ici", + running: "en cours d’exécution", + notRunning: "arrêté", + pid: "PID {{pid}}", }, management: { - title: "Gérer le démon intégré", - hint: "LaissezPaseodémarrer et arrêter le démon intégré", - pauseTitle: "Suspendre le démon intégré", + title: "Gérer le daemon intégré", + hint: "Laisser Paseo démarrer et arrêter le daemon intégré", + pauseTitle: "Suspendre le daemon intégré", pauseMessage: - "Cela arrêtera immédiatement le démon intégré. Les agents en cours d'exécution et les terminaux connectés au démon intégré seront arrêtés.", - pauseAndStop: "Pause et arrêt", + "Le daemon intégré sera arrêté immédiatement. Les agents en cours et les terminaux connectés au daemon intégré seront arrêtés.", + pauseAndStop: "Suspendre et arrêter", registrationFailed: - "Built-in daemon started, but Paseo could not save the localhost connection. Toggle daemon management off and on again, or add localhost manually.", + "Le daemon intégré a démarré, mais Paseo n’a pas pu enregistrer la connexion localhost. Désactivez puis réactivez la gestion du daemon, ou ajoutez localhost manuellement.", pausedStopFailed: - "La gestion du démon intégré a été suspendue, maisPaseon'a ​​pas pu arrêter le démon.", - updateFailed: "Impossible de mettre à jour la gestion des démons intégrés.", + "La gestion du daemon intégré a été suspendue, mais Paseo n’a pas pu arrêter le daemon.", + updateFailed: "Impossible de mettre à jour la gestion du daemon intégré.", }, keepRunning: { - title: "Laisser le démon fonctionner après avoir quitté", - hint: "Daemoncontinue de fonctionner lorsque vous quittezPaseo", + title: "Laisser le daemon tourner après la fermeture", + hint: "Le daemon continue de tourner quand vous quittez Paseo", }, logs: { title: "Fichier journal", - modalTitle: "JournauxDaemon", + modalTitle: "Journaux du daemon", unavailable: "Chemin du journal indisponible", empty: "(le fichier journal est vide)", copied: "Chemin du journal copié.", copyFailed: "Impossible de copier le chemin du journal.", - open: "Journaux ouverts", + open: "Ouvrir les journaux", copyPath: "Copier le chemin", }, fullStatus: { title: "Statut complet", - modalTitle: "StatutDaemon", - hint: "Exécute`paseo daemon status`et affiche la sortie", - view: "Afficher l'état", + modalTitle: "Statut du daemon", + hint: "Exécute `paseo daemon status` et affiche la sortie", + view: "Afficher le statut", copied: "Statut copié dans le presse-papiers.", - fetchFailed: "Échec de la récupération de l'état du démon:{{message}}", + fetchFailed: "Impossible de récupérer le statut du daemon : {{message}}", }, advancedSettings: "Paramètres avancés", - openAdvancedSettings: "Ouvrir les paramètres avancés du démon", + openAdvancedSettings: "Ouvrir les paramètres avancés du daemon", versionMismatch: - "Les versions de l'application et du démon ne correspondent pas. Mettez à jour les deux vers la même version pour une meilleure expérience.", - loadFailed: "Impossible de charger l'état du démon de bureau.", + "Les versions de l’application et du daemon ne correspondent pas. Mettez-les à jour vers la même version pour une meilleure expérience.", + loadFailed: "Impossible de charger le statut du daemon de l’application de bureau.", }, updates: { status: { - checking: "Vérification des mises à jour de l'application...", - installing: "Installation de la mise à jour de l'application...", - upToDate: "L'application est à jour.", - upToDateWithLastChecked: "Up to date. Last checked at {{time}}.", - pending: "Nous vous informerons lorsque la mise à jour sera prête.", + checking: "Recherche de mises à jour de l’application…", + installing: "Installation de la mise à jour de l’application…", + upToDate: "L’application est à jour.", + upToDateWithLastChecked: "À jour. Dernière vérification à {{time}}.", + pending: "Nous vous préviendrons quand la mise à jour sera prête.", pendingWithLastChecked: - "Nous vous informerons lorsque la mise à jour sera prête. Dernière vérification à {{time}}.", - pendingWithVersion: "Mise à jour trouvée : {{version}}. Téléchargement...", + "Nous vous préviendrons quand la mise à jour sera prête. Dernière vérification à {{time}}.", + pendingWithVersion: "Mise à jour trouvée : {{version}}. Téléchargement…", pendingWithVersionAndLastChecked: - "Mise à jour trouvée : {{version}}. Téléchargement... Dernière vérification à {{time}}.", - availableWithVersion: "Mise à jour prête:{{version}}", + "Mise à jour trouvée : {{version}}. Téléchargement… Dernière vérification à {{time}}.", + availableWithVersion: "Mise à jour prête : {{version}}", availableWithVersionAndLastChecked: - "Mise à jour prête:{{version}}. Dernière vérification à {{time}}.", - available: "Une mise à jour de l'application est prête à être installée.", + "Mise à jour prête : {{version}}. Dernière vérification à {{time}}.", + available: "Une mise à jour de l’application est prête à être installée.", availableWithLastChecked: - "Une mise à jour de l'application est prête à être installée. Dernière vérification à {{time}}.", - installed: "Mise à jour de l'application installée. Redémarrage requis.", - failed: "Échec de la mise à jour de l'application.", - idle: "L'état de la mise à jour n'a pas encore été vérifié.", + "Une mise à jour de l’application est prête à être installée. Dernière vérification à {{time}}.", + installed: "Mise à jour de l’application installée. Redémarrage requis.", + failed: "Échec de la mise à jour de l’application.", + idle: "Les mises à jour n’ont pas encore été vérifiées.", }, - installError: "Impossible d'installer la mise à jour de l'application de bureau.", + installError: "Impossible d’installer la mise à jour de l’application de bureau.", callout: { installingTitle: "Installation de la mise à jour", - failedTitle: "La mise à jour a échoué", + failedTitle: "Échec de la mise à jour", availableTitle: "Mise à jour disponible", - genericError: "Quelque chose s'est mal passé.", - whatsNew: "Quoi de neuf", - installingAction: "Installation...", + genericError: "Une erreur s’est produite.", + whatsNew: "Nouveautés", + installingAction: "Installation…", installAndRestart: "Installer et redémarrer", - installingDescription: "Installation et redémarrage...", - versionReady: "{{version}}est prêt à être installé.", + installingDescription: "Installation et redémarrage…", + versionReady: "La version {{version}} est prête à être installée.", newVersionReady: "Une nouvelle version est prête à être installée.", restartWarning: - "La mise à niveau de l'application arrêtera l'exécution des agents et fermera les sessions de terminal.", + "La mise à jour de l’application arrêtera les agents en cours et fermera les sessions de terminal.", }, }, settings: { - loadFailed: "Impossible de charger les paramètres du bureau.", - saveFailed: "Impossible d'enregistrer les paramètres du bureau.", + loadFailed: "Impossible de charger les paramètres de l’application de bureau.", + saveFailed: "Impossible d’enregistrer les paramètres de l’application de bureau.", }, rosetta: { - title: "Téléchargez la versionApple Silicon", - runningIntel: "Vous exécutez la versionInteldePaseosousRosettasurApple Silicon.", + title: "Téléchargez la version Apple Silicon", + runningIntel: "Vous utilisez la version Intel de Paseo via Rosetta sur Apple Silicon.", highCpu: - "Cela entraîne une utilisation élevée du processeur. Téléchargez la versionApple Siliconpour le réparer.", + "Cela entraîne une forte utilisation du processeur. Téléchargez la version Apple Silicon pour corriger le problème.", download: "Télécharger", }, permissions: { notifications: { - allowed: "Les notifications sont autorisées par le système d'exploitation.", + allowed: "Les notifications sont autorisées par le système.", denied: "Les notifications sont refusées dans les paramètres système.", - notGranted: "Les notifications n'ont pas encore été accordées.", + notGranted: "Les notifications n’ont pas encore été autorisées.", webOnly: - "L’état des notifications sur le bureau est uniquement disponible sur l’exécution Web.", + "L’état des notifications de bureau n’est disponible que dans l’environnement web.", supported: "Les notifications de bureau sont prises en charge.", unsupported: "Les notifications de bureau ne sont pas prises en charge sur cette plateforme.", - apiUnavailable: "L'API de notification Web n'est pas disponible dans cet environnement.", + apiUnavailable: "L’API Web Notification n’est pas disponible dans cet environnement.", requestsWebOnly: - "Les demandes de notification sur le bureau sont uniquement disponibles sur l'exécution Web.", - requestUnavailable: "L'API de notification Web requestPermission() n'est pas disponible.", - requestFailed: "Échec de la demande d'autorisation de notification:{{message}}", - unexpectedState: "État d'autorisation de notification inattendu:{{state}}", + "Les demandes de notification de bureau ne sont disponibles que dans l’environnement web.", + requestUnavailable: + "La méthode requestPermission() de l’API Web Notification n’est pas disponible.", + requestFailed: "Échec de la demande d’autorisation de notification : {{message}}", + unexpectedState: "État d’autorisation de notification inattendu : {{state}}", }, microphone: { - webOnly: - "L’état du microphone de bureau est uniquement disponible dans l’environnement d’exécution Web.", - navigatorUnavailable: "Le navigateur n'est pas disponible dans cet environnement.", - granted: "L’accès au microphone est accordé.", - denied: "L'accès au microphone est refusé dans les paramètres système.", - notGranted: "L'autorisation du microphone n'a pas encore été accordée.", - unexpectedState: "État d'autorisation inattendu du microphone:{{state}}", + webOnly: "L’état du microphone n’est disponible que dans l’environnement web.", + navigatorUnavailable: "L’objet navigator n’est pas disponible dans cet environnement.", + granted: "L’accès au microphone est autorisé.", + denied: "L’accès au microphone est refusé dans les paramètres système.", + notGranted: "L’accès au microphone n’a pas encore été autorisé.", + unexpectedState: "État d’autorisation du microphone inattendu : {{state}}", statusApiUnavailable: - "L’API d’état du microphone n’est pas disponible dans ce runtime. Utilisez Request pour vérifier l’accès.", - queryFailed: "Échec de l'interrogation de l'état du microphone:{{message}}", - captureUnavailable: "La capture du microphone n'est pas disponible dans cet environnement.", + "L’API d’état du microphone n’est pas disponible dans cet environnement. Utilisez « Demander » pour vérifier l’accès.", + queryFailed: "Impossible de consulter l’état du microphone : {{message}}", + captureUnavailable: "La capture du microphone n’est pas disponible dans cet environnement.", permissionApiUnavailable: - "L'API d'état des autorisations n'est pas disponible. Utilisez Request pour vérifier l’accès.", + "L’API d’état des autorisations n’est pas disponible. Utilisez « Demander » pour vérifier l’accès.", requestsWebOnly: - "Les demandes de microphone de bureau sont uniquement disponibles sur le runtime Web.", + "Les demandes d’accès au microphone ne sont disponibles que dans l’environnement web.", captureApiUnavailable: - "L'API de capture de microphone n'est pas disponible dans cet environnement.", - requestDenied: - "L'autorisation du microphone a été refusée par l'utilisateur ou le système.", - noDevice: "Aucun microphone n'a été trouvé.", - requestFailed: "Échec de la demande d'autorisation du microphone:{{message}}", + "L’API de capture du microphone n’est pas disponible dans cet environnement.", + requestDenied: "L’accès au microphone a été refusé par l’utilisateur ou le système.", + noDevice: "Aucun microphone trouvé.", + requestFailed: "Échec de la demande d’accès au microphone : {{message}}", }, empty: { - notifications: "L'état de la notification n'a pas encore été vérifié.", - microphone: "L'état du microphone n'a pas encore été vérifié.", + notifications: "L’état des notifications n’a pas encore été vérifié.", + microphone: "L’état du microphone n’a pas encore été vérifié.", }, testNotification: { - title: "Test de notificationPaseo", - body: "Si vous pouvez voir cela, les notifications sur le bureau fonctionnent.", + title: "Test de notification Paseo", + body: "Si vous voyez ceci, les notifications de bureau fonctionnent.", notDelivered: - "La notification n'a pas été délivrée. Vérifiez Paramètres système > Notifications.", - failed: "Échec de l'envoi de la notification.", + "La notification n’a pas été délivrée. Vérifiez Réglages système > Notifications.", + failed: "Échec de l’envoi de la notification.", }, }, integrations: { cli: { - statusFailed: "Impossible de vérifier l'état de l'installation deCLI.", - installFailed: "Impossible d'installer lePaseoCLI.", + statusFailed: "Impossible de vérifier l’installation de la CLI.", + installFailed: "Impossible d’installer la CLI Paseo.", }, }, }, rootError: { title: "Paseo a rencontré un problème.", - body: "Réessayez pour recharger l'application. Si cela continue, joignez les détails ci-dessous au signalement.", + body: "Réessayez pour recharger l’application. Si le problème persiste, joignez les détails ci-dessous à votre signalement.", details: "Détails", }, startup: { - errorTitle: "Quelque chose s'est mal passé", + errorTitle: "Une erreur s’est produite", errorDescription: - "Le serveur local n'a pas pu démarrer. Si cela continue, veuillez signaler le problème surGitHubet inclure les journaux ci-dessous.", + "Le serveur local n’a pas pu démarrer. Si le problème persiste, signalez-le sur GitHub en joignant les journaux ci-dessous.", logs: { - loading: "Chargement des journaux du démon...", - unavailable: "Aucun journal de démon disponible.", - loadFailed: "Impossible de charger les journaux du démon:{{message}}", + loading: "Chargement des journaux du daemon…", + unavailable: "Aucun journal du daemon disponible.", + loadFailed: "Impossible de charger les journaux du daemon : {{message}}", }, }, openProject: { @@ -1527,24 +1518,24 @@ export const fr: TranslationResources = { description: "Ouvrez un dossier sur votre machine", }, importSession: { - title: "Session d'importation", - description: "Apportez des sessionsCLIexternes récentes", + title: "Importer une session", + description: "Ouvrez une session Claude Code, Codex ou autre lancée dans un terminal", }, setupProviders: { - title: "Fournisseurs d'installation", - description: "ConfigurezClaude Code,Codexet plus", + title: "Configurer les fournisseurs", + description: "Configurez Claude Code, Codex et plus encore", }, pairDevice: { title: "Associer un appareil", - description: "Connectez votre téléphone à ce démon", + description: "Connectez votre téléphone à ce daemon", }, }, }, projectPicker: { - placeholder: "Tapez pour rechercher...", + placeholder: "Tapez pour rechercher…", browse: "Parcourir…", - opening: "Projet d'ouverture...", - searching: "Recherche en cours...", + opening: "Ouverture du projet…", + searching: "Recherche…", empty: "Commencez à taper un chemin", errors: { directory_not_found: "Répertoire introuvable.", @@ -1554,76 +1545,77 @@ export const fr: TranslationResources = { }, branchSwitcher: { triggerTooltip: "Changer la branche de l’espace de travail", - currentBranch: "Branche actuelle:{{branchName}}. Appuyez pour changer de branche.", - placeholder: "Changer de branche...", - searchPlaceholder: "Filtrer les branches...", + currentBranch: "Branche actuelle : {{branchName}}. Appuyez pour changer de branche.", + placeholder: "Changer de branche…", + searchPlaceholder: "Filtrer les branches…", empty: "Aucune branche trouvée.", title: "Changer de branche", - uncommittedTitle: "Modifications non validées", + uncommittedTitle: "Modifications non commitées", uncommittedMessage: - "Vous avez des modifications non validées. Les ranger avant de changer de branche?", - stashAndSwitch: "Cachette et changement", - failedToStash: "Échec de la sauvegarde des modifications", - failedToSwitch: "Échec du changement de branche", - restoreStashTitle: "Restaurer les modifications cachées?", + "Vous avez des modifications non commitées. Les remiser avant de changer de branche ?", + stashAndSwitch: "Remiser et changer", + failedToStash: "Impossible de remiser les modifications", + failedToSwitch: "Impossible de changer de branche", + restoreStashTitle: "Restaurer les modifications remisées ?", restoreStashMessage: - "Cette branche a caché les modifications d'une session précédente. Souhaitez-vous les restaurer?", + "Cette branche contient des modifications remisées lors d’une session précédente. Voulez-vous les restaurer ?", restore: "Restaurer", later: "Plus tard", - stashRestored: "Modifications cachées restaurées", + stashRestored: "Modifications remisées restaurées", }, agentAutocomplete: { - searchingWorkspace: "Recherche dans l'espace de travail...", - loadingCommands: "Chargement des commandes...", + searchingWorkspace: "Recherche dans l’espace de travail…", + loadingCommands: "Chargement des commandes…", noFiles: "Aucun fichier ou répertoire trouvé", noCommands: "Aucune commande trouvée", failedToLoad: "Échec du chargement", - chooseProjectForCommands: "Choisissez un projet pour voir les commandes", - chooseModelForCommands: "Sélectionnez un modèle pour voir les commandes", + chooseProjectForCommands: "Choisissez un projet pour afficher les commandes", + chooseModelForCommands: "Sélectionnez un modèle pour afficher les commandes", }, loadOlderHistory: { - failed: "Impossible de charger l'ancien historique", + failed: "Impossible de charger l’historique plus ancien", }, imageAttachmentPicker: { permissionTitle: "Autorisation requise", - permissionMessage: "Veuillez autoriser l'accès à votre photothèque pour joindre des images.", + permissionMessage: "Autorisez l’accès à votre photothèque pour joindre des images.", errorTitle: "Erreur", - failedToSelect: "Échec de la sélection de l'image", + failedToSelect: "Impossible de sélectionner l’image", dialogTitle: "Joindre des images", dialogFilterName: "Images", }, workspaceSetup: { title: "Créer un espace de travail", errors: { - failedCreateWorktree: "Échec de la création de l'arbre de travail", - failedOpenProject: "Échec de l'ouverture du projet", + failedCreateWorktree: "Impossible de créer le worktree", + failedOpenProject: "Impossible d’ouvrir le projet", selectModel: "Sélectionnez un modèle", - hostDisconnected: "Hostn'est pas connecté", - pendingRequired: "Aucune configuration d'espace de travail n'est en attente", - composerStateRequired: "L'état du compositeur de configurationWorkspaceest requis", + hostDisconnected: "L’hôte n’est pas connecté", + pendingRequired: "Aucune configuration d’espace de travail en attente", + composerStateRequired: + "L’état de la zone de saisie de configuration de l’espace de travail est requis", }, }, onboarding: { - title: "Bienvenue surPaseo", + title: "Bienvenue dans Paseo", subtitle: "Connectez votre ordinateur pour commencer", actions: { settings: "Paramètres", }, }, modelSelector: { - title: "Sélectionnez le fournisseur", - selectModel: "Sélectionnez le modèle", - selectedModel: "Sélectionnez le modèle ({{model}})", - loading: "Chargement...", + title: "Sélectionner le fournisseur", + selectModel: "Sélectionner le modèle", + selectedModel: "Sélectionner le modèle ({{model}})", + loading: "Chargement…", loadingShort: "Chargement", - loadingSelector: "Chargement du sélecteur de modèle...", + loadingSelector: "Chargement du sélecteur de modèle…", error: "Erreur", - defaultModel: "Défaut", + defaultModel: "Par défaut", profiles: "Profils", providers: "Fournisseurs", model: "Modèle", editProfiles: "Modifier", - editProfilesLabel: "Modifier les profils d'agent", + editProfilesLabel: "Modifier les profils d’agent", createProfile: "Créer un profil", createProfileFromModel: "Créer un profil à partir de ce modèle", editProfileLabel: "Modifier {{name}}", @@ -1631,43 +1623,43 @@ export const fr: TranslationResources = { modelCount: "{{count}} modèle", modelCountPlural: "{{count}} modèles", retry: "Réessayer", - retrying: "Nouvelle tentative...", + retrying: "Nouvelle tentative…", noMatches: "Aucun modèle ne correspond à votre recherche", - noMatchesForQuery: "Aucun modèle ne correspond à « {{query}} »", - searchAllPlaceholder: "Rechercher dans tous les modèles...", - searchPlaceholder: "Rechercher des modèles...", - openProviderSettings: "Ouvrir les paramètres{{provider}}", + noMatchesForQuery: "Aucun modèle ne correspond à « {{query}} »", + searchAllPlaceholder: "Rechercher dans tous les modèles…", + searchPlaceholder: "Rechercher des modèles…", + openProviderSettings: "Ouvrir les paramètres de {{provider}}", }, providerCatalog: { title: "Ajouter un fournisseur", - search: "Fournisseurs de recherche", + search: "Rechercher des fournisseurs", noProviders: "Aucun fournisseur trouvé", actions: { add: "Ajouter", - adding: "Ajout", + adding: "Ajout…", installed: "Installé", cancel: "Annuler", - installInstructions: "Instructions d'installation", - installInstructionsFor: "Instructions d'installation{{provider}}", + installInstructions: "Instructions d’installation", + installInstructionsFor: "Instructions d’installation de {{provider}}", }, errors: { - unableToInstall: "Impossible d'installer le fournisseur", + unableToInstall: "Impossible d’installer le fournisseur", }, }, providerSelection: { - defaultModel: "Défaut", - selectModel: "Sélectionnez le modèle", - loading: "Chargement...", + defaultModel: "Par défaut", + selectModel: "Sélectionner le modèle", + loading: "Chargement…", error: "Erreur", unavailable: "Indisponible", unknownError: "Erreur inconnue", readiness: { - initialPromptRequired: "Une invite initiale est requise", - noProviders: "Aucun fournisseur disponible sur l'hébergeur sélectionné", - modelDefaultsLoading: "Les valeurs par défaut du modèle sont toujours en cours de chargement", - noModelAvailable: "Aucun modèle n'est disponible pour le fournisseur sélectionné", - workspaceDirectoryNotFound: "RépertoireWorkspaceintrouvable", - hostDisconnected: "Hostn'est pas connecté", + initialPromptRequired: "Un prompt initial est requis", + noProviders: "Aucun fournisseur disponible sur l’hôte sélectionné", + modelDefaultsLoading: "Les valeurs par défaut du modèle sont en cours de chargement", + noModelAvailable: "Aucun modèle disponible pour le fournisseur sélectionné", + workspaceDirectoryNotFound: "Répertoire de l’espace de travail introuvable", + hostDisconnected: "L’hôte n’est pas connecté", }, }, pairing: { @@ -1676,11 +1668,11 @@ export const fr: TranslationResources = { label: "Mot de passe de l’hôte", }, hostConfirmation: { - title: "Se connecter à cet hôte ?", + title: "Se connecter à cet hôte ?", description: - "Cet hôte pourra exécuter du code dans cette application et accéder à vos autres hôtes connectés. Connectez-vous uniquement si vous le reconnaissez.", + "Cet hôte pourra exécuter du code dans cette app et accéder à vos autres hôtes connectés. Ne vous connectez que si vous le reconnaissez.", descriptionChanged: - "Ce lien modifie la façon dont vous vous connectez à cet hôte. L'hôte pourra exécuter du code dans cette application et accéder à vos autres hôtes connectés. Connectez-vous uniquement si vous le reconnaissez.", + "Ce lien modifie la façon dont vous vous connectez à cet hôte. L’hôte pourra exécuter du code dans cette app et accéder à vos autres hôtes connectés. Ne vous connectez que si vous le reconnaissez.", hostLabel: "Hôte", fingerprintLabel: "Empreinte de la clé", relayLabel: "Relais", @@ -1694,22 +1686,22 @@ export const fr: TranslationResources = { }, remoteSsh: { title: "SSH distant", - description: "Connectez-vous avec le client SSH de bureau.", + description: "Connexion via le client SSH de bureau.", }, scanQr: { - title: "Scanner le codeQR", - description: "Connexion relais cryptée.", + title: "Scanner le code QR", + description: "Connexion chiffrée via le relais.", }, pasteLink: { - title: "Coller le lien d'association", - description: "Connexion relais cryptée.", + title: "Coller le lien d’association", + description: "Connexion chiffrée via le relais.", }, }, direct: { title: "Connexion directe", - helper: "Saisissez l'adresse d'un serveurPaseo.", + helper: "Saisissez l’adresse d’un serveur Paseo.", fields: { - host: "Host", + host: "Hôte", port: "Port", password: "Mot de passe", optional: "Facultatif", @@ -1717,9 +1709,9 @@ export const fr: TranslationResources = { connectionUri: "URI de connexion", }, advanced: { - label: "Avancé", - show: "Afficher avancé", - hide: "Masquer avancé", + label: "Options avancées", + show: "Afficher les options avancées", + hide: "Masquer les options avancées", }, passwordVisibility: { show: "Afficher le mot de passe", @@ -1727,33 +1719,33 @@ export const fr: TranslationResources = { }, actions: { cancel: "Annuler", - connect: "Connecter", - connecting: "De liaison...", + connect: "Se connecter", + connecting: "Connexion…", }, errors: { - hostRequired: "Hostest requis", + hostRequired: "L’hôte est requis", invalidPort: "Le port doit être compris entre 1 et 65535", invalidConnection: "Connexion invalide", - failedTitle: "La connexion a échoué", - failedToConnect: "Nous n'avons pas réussi à nous connecter à{{endpoint}}.", - noAdditionalDetails: "{{detail}}(aucun détail supplémentaire fourni)", - timedOut: "La connexion a expiré. Vérifiez l'hôte/portet votre réseau.", - refused: "Connexion rejetée. Le serveur fonctionne-t-il à cette adresse?", - hostNotFound: "Hostintrouvable. Vérifiez le nom d'hôte et réessayez.", - hostUnreachable: "Hostest inaccessible. Vérifiez votre réseau et votre pare-feu.", + failedTitle: "Échec de la connexion", + failedToConnect: "Impossible de se connecter à {{endpoint}}.", + noAdditionalDetails: "{{detail}} (aucun détail supplémentaire)", + timedOut: "Délai de connexion dépassé. Vérifiez l’hôte, le port et votre réseau.", + refused: "Connexion refusée. Le serveur est-il bien lancé à cette adresse ?", + hostNotFound: "Hôte introuvable. Vérifiez le nom d’hôte et réessayez.", + hostUnreachable: "Hôte inaccessible. Vérifiez votre réseau et votre pare-feu.", tlsError: - "Erreur TLS. Les connexions directes utilisent SSL uniquement lorsqu'un terminateur TLS se trouve devant le démon.", + "Erreur TLS. Les connexions directes n’utilisent SSL que si un terminateur TLS est placé devant le daemon.", unableToConnect: - "Impossible de se connecter. Vérifiez l'hôte/portet que le démon est accessible.", - details: "Détails:{{detail}}", + "Impossible de se connecter. Vérifiez l’hôte, le port et que le daemon est joignable.", + details: "Détails : {{detail}}", }, }, remoteSsh: { title: "SSH distant", - helper: "Connectez-vous à un daemon Paseo sur l’hôte distant.", + helper: "Connectez-vous à un daemon Paseo qui tourne sur l’hôte distant.", fields: { target: "Hôte SSH", - password: "Mot de passe du démon", + password: "Mot de passe du daemon", optional: "Facultatif", }, passwordVisibility: { @@ -1762,72 +1754,72 @@ export const fr: TranslationResources = { }, actions: { cancel: "Annuler", - connect: "Connecter", - connecting: "Connexion...", + connect: "Se connecter", + connecting: "Connexion…", }, errors: { targetRequired: "L’hôte SSH est requis", invalidTarget: "Saisissez un hôte ssh:// valide", - failedToConnect: "Connexion SSH impossible. {{detail}}", + failedToConnect: "Impossible de se connecter en SSH. {{detail}}", }, }, link: { - title: "Coller le lien d'association", - helper: "Collez le lien d'appairage depuis votre serveur.", - label: "Lien d'appariement", + title: "Coller le lien d’association", + helper: "Collez le lien d’association fourni par votre serveur.", + label: "Lien d’association", errors: { - required: "Collez un lien d'appairage (.../#offer=...)", - missingOffer: "Le lien doit inclure#offer=...", - emptyOffer: "La charge utile de l'offre est vide", - invalid: "Lien d'association invalide", - unableToPair: "Impossible de coupler l'hôte", + required: "Collez un lien d’association (.../#offer=...)", + missingOffer: "Le lien doit contenir #offer=...", + emptyOffer: "Le contenu de l’offre est vide", + invalid: "Lien d’association invalide", + unableToPair: "Impossible d’associer l’hôte", }, alert: { - failedTitle: "Échec du couplage", + failedTitle: "Échec de l’association", }, actions: { cancel: "Annuler", - pair: "Paire", - pairing: "L'appariement...", + pair: "Associer", + pairing: "Association…", }, }, scan: { - title: "ScannerQR", - webUnavailableTitle: "Non disponible sur le Web", + title: "Scanner le code QR", + webUnavailableTitle: "Indisponible sur le web", webUnavailableBody: - "L'analyseQRn'est pas prise en charge dans la version Web. Utilisez plutôt \"Coller le lien\".", + "Le scan de code QR n’est pas pris en charge dans la version web. Utilisez plutôt « Coller le lien ».", backToSettings: "Retour aux paramètres", cameraPermissionTitle: "Autorisation de la caméra", cameraPermissionBody: - "Autorisez l'accès à la caméra pour scanner le code d'appairageQRà partir de votre démon.", - grantPermission: "Accorder l'autorisation", - pairing: "L'appariement...", - unableToPair: "Impossible de coupler l'hôte", + "Autorisez l’accès à la caméra pour scanner le code QR d’association affiché par votre daemon.", + grantPermission: "Accorder l’autorisation", + pairing: "Association…", + unableToPair: "Impossible d’associer l’hôte", errorTitle: "Erreur", }, device: { - loadingOffer: "Chargement de l'offre d'association...", - failedToLoadOffer: "Échec du chargement de l'offre d'association.", - relayDisabled: "Le relais n'est pas activé. Activer le relais pour coupler un appareil.", - enableTitle: "Activer le relais ?", + loadingOffer: "Chargement de l’offre d’association…", + failedToLoadOffer: "Impossible de charger l’offre d’association.", + relayDisabled: "Le relais n’est pas activé. Activez-le pour associer un appareil.", + enableTitle: "Activer le relais ?", enableDescription: - "Le relais permet à cet appareil de se connecter depuis n’importe où. Le trafic de couplage est chiffré de bout en bout.", + "Le relais permet à cet appareil de se connecter depuis n’importe où. Le trafic d’association est chiffré de bout en bout.", relayDocs: "Fonctionnement du relais", - relayDocsAccessibility: "Lire comment fonctionne le relais Paseo", + relayDocsAccessibility: "Découvrir le fonctionnement du relais Paseo", enableRelay: "Activer le relais", - enablingRelay: "Activation...", + enablingRelay: "Activation…", notNow: "Pas maintenant", directConnectionHint: "Sans relais, connectez-vous directement via TCP, Tailscale ou un autre VPN. Aucun code QR n’est créé.", updateRequired: "Mettez à jour l’hôte pour activer le relais depuis Paseo Desktop.", - unavailable: "Offre de jumelage indisponible.", - hint: "Scannez ce codeQRavecPaseosur votre téléphone ou copiez le lien ci-dessous.", + unavailable: "Offre d’association indisponible.", + hint: "Scannez ce code QR avec Paseo sur votre téléphone, ou copiez le lien ci-dessous.", securityWarning: "Traitez ce lien d’association comme un mot de passe. Toute personne qui le possède peut accéder à ce daemon.", - qrUnavailable: "CodeQRindisponible.", - qrAccessibility: "Code QR de couplage", + qrUnavailable: "Code QR indisponible.", + qrAccessibility: "Code QR d’association", retry: "Réessayer", - copy: "Copie", + copy: "Copier", copied: "Copié", }, }, @@ -1835,41 +1827,41 @@ export const fr: TranslationResources = { actions: { mute: "Couper la voix en temps réel", unmute: "Réactiver la voix en temps réel", - stop: "Arrêtez la voix en temps réel et interrompez le tour", + stop: "Arrêter la voix en temps réel et interrompre le tour", }, }, rewind: { - tooltip: "Revenez à ce message", - warning: "Cette action ne peut pas être annulée", + tooltip: "Revenir à ce message", + warning: "Cette action est irréversible", actions: { - conversation: "Rembobiner la conversation", - files: "Rembobiner les fichiers", - both: "Rembobiner la conversation et les fichiers", + conversation: "Revenir en arrière sur la conversation", + files: "Revenir en arrière sur les fichiers", + both: "Revenir en arrière sur la conversation et les fichiers", }, errors: { - failed: "Échec du rembobinage de l'agent", + failed: "Impossible de faire revenir l’agent en arrière", }, }, diffViewer: { - empty: "Aucun changement à afficher", + empty: "Aucune modification à afficher", }, serviceUrl: { - title: "Service ouvertURL", - message: "Ouvrir{{url}}?", - inPaseo: "DansPaseo", + title: "Ouvrir l’URL du service", + message: "Ouvrir {{url}} ?", + inPaseo: "Dans Paseo", externalBrowser: "Navigateur externe", - dontAskAgain: "Ne demande plus", + dontAskAgain: "Ne plus demander", }, downloads: { - requestTokenFailed: "Échec de la demande du jeton de téléchargement.", - hostUnavailable: "L'hôte de téléchargement n'est pas disponible.", - cancelled: "Le téléchargement a été annulé.", - failed: "Échec du téléchargement du fichier.", - shareFile: "Partager un fichier", - shareFileNamed: "Partager{{fileName}}", + requestTokenFailed: "Impossible d’obtenir le token de téléchargement.", + hostUnavailable: "L’hôte de téléchargement est indisponible.", + cancelled: "Téléchargement annulé.", + failed: "Impossible de télécharger le fichier.", + shareFile: "Partager le fichier", + shareFileNamed: "Partager {{fileName}}", }, menu: { - backdrop: "Toile de fond du menu", + backdrop: "Arrière-plan du menu", }, subagents: { title: "Sous-agents", @@ -1880,32 +1872,32 @@ export const fr: TranslationResources = { pillLabelNeedsInputOne: "1 attend une réponse", pillLabelNeedsInputMany: "{{count}} attendent une réponse", pillLabelReadyToReview: "{{count}} à relire", - detachAction: "Detacher {{label}}", - detachTooltip: "Detacher le sous-agent", - archiveAction: "Archiver{{label}}", - archiveTooltip: "Sous-agent d'archivage", + detachAction: "Détacher {{label}}", + detachTooltip: "Détacher le sous-agent", + archiveAction: "Archiver {{label}}", + archiveTooltip: "Archiver le sous-agent", archiveFinishedAction: "Archiver les sous-agents terminés", archiveFinishedRetry: "Réessayer ({{failed}}/{{total}})", }, panels: { draft: { newAgent: "Nouvel agent", - creatingAgent: "Agent créateur", + creatingAgent: "Création de l’agent", }, file: { - directoryMissing: "Répertoire Workspace introuvable.", - loading: "Chargement du fichier...", + directoryMissing: "Répertoire de l’espace de travail introuvable.", + loading: "Chargement du fichier…", noPreview: "Aucun aperçu disponible", - binaryPreviewUnavailable: "Aperçu binaire indisponible", + binaryPreviewUnavailable: "Aperçu indisponible pour un fichier binaire", tooLargeToDisplay: "Ce fichier est trop volumineux pour être affiché", - failedToLoad: "Échec du chargement du fichier", - failedToLoadPreview: "Échec du chargement de l'aperçu du fichier", + failedToLoad: "Impossible de charger le fichier", + failedToLoadPreview: "Impossible de charger l’aperçu du fichier", editor: { - fileSize: "Taille {{size}}", + fileSize: "Taille du fichier : {{size}}", lines: "{{count}} lignes", - editorStatus: "État de l’éditeur : {{status}}", + editorStatus: "État de l’éditeur : {{status}}", unsavedChanges: "Modifications non enregistrées", - saving: "Enregistrement...", + saving: "Enregistrement…", saveFailed: "Échec de l’enregistrement", changedOnDisk: "Modifié sur le disque", vimMode: "Mode Vim {{mode}}", @@ -1918,7 +1910,7 @@ export const fr: TranslationResources = { conflictDescription: "Le contenu local a été conservé. Choisissez la version à garder.", overwrite: "Écraser", reload: "Recharger", - reloadTitle: "Recharger depuis le disque ?", + reloadTitle: "Recharger depuis le disque ?", reloadMessage: "Vos modifications locales seront perdues.", }, }, @@ -1929,108 +1921,108 @@ export const fr: TranslationResources = { chooseFile: "Choisissez un fichier", }, pullRequest: { - label: "Demande de fusion", - subtitle: "Détails de la demande de fusion", - emptyTitle: "Aucune demande de fusion pour le moment", + label: "Pull request", + subtitle: "Détails de la pull request", + emptyTitle: "Aucune pull request pour l’instant", emptyDescription: - "Créez une demande de fusion pour cette copie de travail afin d’afficher ses détails ici.", + "Créez une pull request pour cette copie de travail afin d’en voir les détails ici.", }, diff: { changesLabel: "Modifications", diffLabel: "Diff", - changesSubtitle: "Différences de l'arbre de travail", - commitSubtitle: "Différences du commit", - uncommittedSubtitle: "Modifications non validées", + changesSubtitle: "Diff de l’arbre de travail", + commitSubtitle: "Diff du commit", + uncommittedSubtitle: "Modifications non commitées", baseSubtitle: "Comparé à {{baseRef}}", - directoryMissing: "Répertoire Workspace introuvable.", + directoryMissing: "Répertoire de l’espace de travail introuvable.", empty: "Aucune modification", - loadError: "Échec du chargement des différences", - capabilityMissing: "Mettez à jour l'hôte pour voir les différences des commits.", + loadError: "Impossible de charger le diff", + capabilityMissing: "Mettez à jour l’hôte pour afficher le diff des commits.", }, }, toolCallDetails: { error: "Erreur", empty: "Aucun détail supplémentaire disponible", subAgentActivity: "Activité du sous-agent", - input: "Saisir", - output: "Sortir", + input: "Entrée", + output: "Sortie", }, toolCallGroup: { editedFiles: { - one: "a modifié {{count}} fichier", - other: "a modifié {{count}} fichiers", + one: "{{count}} fichier modifié", + other: "{{count}} fichiers modifiés", }, commands: { - one: "a exécuté {{count}} commande", - other: "a exécuté {{count}} commandes", + one: "{{count}} commande exécutée", + other: "{{count}} commandes exécutées", }, readFiles: { - one: "a lu {{count}} fichier", - other: "a lu {{count}} fichiers", + one: "{{count}} fichier lu", + other: "{{count}} fichiers lus", }, searches: { - one: "a effectué {{count}} recherche", - other: "a effectué {{count}} recherches", + one: "{{count}} recherche effectuée", + other: "{{count}} recherches effectuées", }, otherTools: { - one: "a utilisé {{count}} autre outil", - other: "a utilisé {{count}} autres outils", + one: "{{count}} autre outil utilisé", + other: "{{count}} autres outils utilisés", }, paseoCalls: { - one: "a appelé Paseo {{count}} fois", - other: "a appelé Paseo {{count}} fois", + one: "{{count}} appel à Paseo", + other: "{{count}} appels à Paseo", }, and: "et", }, renameModal: { - rename: "Rebaptiser", - saving: "Sauvegarde...", + rename: "Renommer", + saving: "Enregistrement…", }, sidebarCallout: { - dismiss: "Rejeter", + dismiss: "Ignorer", }, contextWindow: { noData: "Aucune donnée de contexte", - accessibilityNoData: "Fenêtre de contexte : aucune donnée de contexte", - title: "Fenêtre contextuelle", - used: "{{percentage}}% utilisé", - tokens: "Jetons{{used}}/{{max}}", - sessionCost: "Coût de la séance{{cost}}", - accessibility: "Fenêtre contextuelle{{percentage}}% utilisé", + accessibilityNoData: "Fenêtre de contexte : aucune donnée de contexte", + title: "Fenêtre de contexte", + used: "{{percentage}} % utilisés", + tokens: "{{used}} / {{max}} tokens", + sessionCost: "Coût de la session : {{cost}}", + accessibility: "Fenêtre de contexte : {{percentage}} % utilisés", }, review: { comment: { - add: "Ajouter un commentaire", - edit: "Modifier le commentaire de l'avis", - delete: "Supprimer le commentaire de l'avis", - label: "Revoir le commentaire", + add: "Ajouter un commentaire de revue", + edit: "Modifier le commentaire de revue", + delete: "Supprimer le commentaire de revue", + label: "Commentaire de revue", placeholder: "Laisser un commentaire", cancel: "Annuler", - cancelAccessibility: "Annuler le commentaire de révision", - save: "Commentaire", - saveAccessibility: "Enregistrer le commentaire de l'avis", + cancelAccessibility: "Annuler le commentaire de revue", + save: "Commenter", + saveAccessibility: "Enregistrer le commentaire de revue", }, }, settings: { title: "Paramètres", - loading: "Chargement des paramètres...", + loading: "Chargement des paramètres…", groups: { app: "Application", - host: "Host", + host: "Hôte", }, hostPicker: { - switchHost: "Changer d'hôte", - local: "Locale", + switchHost: "Changer d’hôte", + local: "Local", }, - backToWorkspace: "Dos", + backToWorkspace: "Retour", addHost: "Ajouter un hôte", - enableBuiltInDaemon: "Activer le démon intégré", + enableBuiltInDaemon: "Activer le daemon intégré", projects: "Projets", projectList: { - hostLoadFailed: "Impossible de charger les projets depuis l'hôte{{hostName}}:{{message}}", - editProject: "Modifier{{projectName}}", + hostLoadFailed: "Impossible de charger les projets depuis l’hôte {{hostName}} : {{message}}", + editProject: "Modifier {{projectName}}", }, - groupInfo: "À propos de{{title}}", + groupInfo: "À propos de {{title}}", sections: { general: "Général", chat: "Discussion", @@ -2050,32 +2042,32 @@ export const fr: TranslationResources = { editor: { title: "Éditeur", vimKeybindings: "Raccourcis Vim", - vimHint: "S’applique aux fichiers source sur le web et le bureau.", + vimHint: "S’applique aux fichiers source dans l’app web et l’app de bureau.", }, notifications: { title: "Notifications", permission: "Autorisation des notifications", refreshAccessibility: "Actualiser l’autorisation des notifications", playSound: "Émettre un son", - playSoundHint: "Émet un son lorsqu’une notification de bureau arrive", + playSoundHint: "Émet un son à l’arrivée d’une notification de bureau", test: "Tester la notification", testHint: "Envoie une notification avec ces réglages", - permissionRequired: "Autorisez l’accès aux notifications avant le test", + permissionRequired: "Autorisez les notifications avant de tester", send: "Envoyer", - sending: "Envoi...", + sending: "Envoi…", sentTitle: "Notification de test envoyée", sentDescription: "Paseo a transmis la notification au système d’exploitation.", sendFailedTitle: "Impossible d’envoyer la notification de test", }, hostSections: { projects: "Projets", - connections: "Relations", + connections: "Connexions", agents: "Agents", metadata: "Métadonnées", - workspaces: "Workspaces", + workspaces: "Espaces de travail", providers: "Fournisseurs", usage: "Utilisation", - terminals: "Terminals", + terminals: "Terminaux", plugins: "Plugins", host: "Aperçu", }, @@ -2103,43 +2095,43 @@ export const fr: TranslationResources = { description: "Les onglets du navigateur partagent les connexions et les données des sites dans Paseo.", clear: "Effacer les données du navigateur", - clearing: "Effacement...", - confirmTitle: "Effacer les données du navigateur ?", + clearing: "Effacement…", + confirmTitle: "Effacer les données du navigateur ?", confirmMessage: "Vous serez déconnecté des sites et les onglets ouverts seront rechargés.", success: "Données du navigateur effacées.", - error: "Impossible d'effacer les données du navigateur.", + error: "Impossible d’effacer les données du navigateur.", }, defaultSend: { label: "Envoi par défaut", descriptions: { interrupt: - "Lorsque l'agent est en cours d'exécution, Entrée interrompt. Commande/Ctrl+Entrée met en file d'attente.", + "Quand l’agent est en cours d’exécution, Entrée l’interrompt. Cmd/Ctrl+Entrée met en file d’attente.", steer: - "Lorsque l’agent est en cours d’exécution, Entrée oriente le tour actif. Commande/Ctrl+Entrée met en file d’attente.", + "Quand l’agent est en cours d’exécution, Entrée réoriente le tour en cours. Cmd/Ctrl+Entrée met en file d’attente.", queue: - "Lorsque l'agent est en cours d'exécution, Entrée met en file d'attente. Commande/Ctrl+Entrée envoie.", + "Quand l’agent est en cours d’exécution, Entrée met en file d’attente. Cmd/Ctrl+Entrée envoie.", }, options: { interrupt: "Interrompre", - steer: "Orienter", - queue: "File d'attente", + steer: "Réorienter", + queue: "File d’attente", }, }, serviceUrls: { options: { ask: "Demander", - inApp: "DansPaseo", + inApp: "Dans Paseo", external: "Navigateur externe", }, }, terminalScrollback: { - label: "DéfilementTerminal", + label: "Historique du terminal", description: "Lignes conservées dans le tampon du terminal intégré", - accessibilityLabel: "Lignes de défilementTerminal", + accessibilityLabel: "Lignes d’historique du terminal", }, autoExpandReasoning: { label: "Toujours afficher le raisonnement", - description: "Afficher le raisonnement de l'agent entièrement développé par défaut", + description: "Afficher par défaut le raisonnement de l’agent entièrement déplié", }, toolCallDetail: { label: "Affichage des appels d’outils", @@ -2151,7 +2143,7 @@ export const fr: TranslationResources = { }, language: { label: "Langue", - description: "Langue de l'application", + description: "Langue de l’application", options: { system: "Système", ar: "العربية", @@ -2174,67 +2166,68 @@ export const fr: TranslationResources = { accessibilityLabel: "Utiliser l’ancien rendu du terminal", }, testAudio: "Tester le son", - playTest: "Jouer à l'essai", - playing: "Jouant...", - playbackFailed: "Échec de la lecture:{{message}}", + playTest: "Lancer le test", + playing: "Lecture…", + playbackFailed: "Échec de la lecture : {{message}}", app: { - title: "App diagnostic", - rowTitle: "App diagnostic", - rowHint: "Collect connection, daemon, provider, desktop, and log details", - run: "Run", - running: "Running diagnostic...", + title: "Diagnostic de l’app", + rowTitle: "Diagnostic de l’app", + rowHint: + "Collecter les informations sur la connexion, le daemon, les fournisseurs, l’app de bureau et les journaux", + run: "Lancer", + running: "Diagnostic en cours…", copyLabel: "diagnostic", - copyAccessibility: "Copy diagnostic", - copyFailed: "Failed to copy diagnostic", - refreshAccessibility: "Refresh diagnostic", - refreshingAccessibility: "Refreshing diagnostic", + copyAccessibility: "Copier le diagnostic", + copyFailed: "Impossible de copier le diagnostic", + refreshAccessibility: "Actualiser le diagnostic", + refreshingAccessibility: "Actualisation du diagnostic", progress: { client: "Client", - desktop: "Desktop", + desktop: "App de bureau", }, }, }, about: { title: "À propos", - appVersion: "Version de l'application", - whatsNewHint: "Notes de version pour chaque release", + appVersion: "Version de l’application", + whatsNewHint: "Les nouveautés de chaque version", thisDevice: "Cet appareil", connectedHosts: "Hôtes connectés", offline: "Hors ligne", - versionDiffers: "La version diffère de cet appareil", + versionDiffers: "Version différente de celle de cet appareil", releaseChannel: { - label: "Canal de sortie", + label: "Canal de publication", description: - "Passez àBetapour obtenir des mises à jour plus tôt et contribuer à les façonner", + "Passez à la Bêta pour recevoir les mises à jour plus tôt et contribuer à les façonner", stable: "Stable", - beta: "Beta", + beta: "Bêta", }, updates: { - label: "Mises à jour de l'application", - readyToInstall: "Prêt à installer:{{version}}", - installTitle: "Installer la mise à jour du bureau", - installMessage: "Cela met à jourPaseosur cet ordinateur", + label: "Mises à jour de l’application", + readyToInstall: "Prête à installer : {{version}}", + installTitle: "Installer la mise à jour de l’app de bureau", + installMessage: "Paseo sera mis à jour sur cet ordinateur", installConfirm: "Installer la mise à jour", - update: "Mise à jour", - updateTo: "Mise à jour vers{{version}}", - installing: "Installation...", + update: "Mettre à jour", + updateTo: "Mettre à jour vers {{version}}", + installing: "Installation…", check: "Vérifier", - checking: "Vérification...", + checking: "Vérification…", alertTitle: "Erreur", - alertMessage: "Impossible d'ouvrir la boîte de dialogue de confirmation de mise à jour.", + alertMessage: "Impossible d’ouvrir la boîte de dialogue de confirmation de mise à jour.", }, }, appearance: { theme: { title: "Thème", - accessibilityLabel: "Thème:{{value}}", + accessibilityLabel: "Thème : {{value}}", options: { - light: "Lumière", + light: "Clair", dark: "Sombre", zinc: "Zinc", midnight: "Minuit", claude: "Claude", - ghostty: "Fantôme", + ghostty: "Ghostty", pureBlack: "Noir pur", auto: "Système", }, @@ -2244,7 +2237,7 @@ export const fr: TranslationResources = { }, chatOutline: { title: "Plan de la discussion", - description: "Afficher un plan pour passer d’une requête à l’autre", + description: "Afficher un plan pour naviguer entre les prompts", }, sidebar: { header: { @@ -2253,64 +2246,65 @@ export const fr: TranslationResources = { "Choisissez les éléments affichés en haut de la barre latérale et leur ordre", }, footer: { - title: "Pied", + title: "Pied de page", description: - "Choisissez les lignes affichées en bas de la barre latérale et leur ordre. Ajouter un projet et la rangée d’icônes restent toujours visibles", + "Choisissez les lignes affichées en bas de la barre latérale et leur ordre. « Ajouter un projet » et la rangée d’icônes restent toujours visibles", }, - moveUp: "Déplacer vers le haut", - moveDown: "Déplacer vers le bas", + moveUp: "Monter", + moveDown: "Descendre", }, fonts: { title: "Polices", - systemDefault: "Valeur par défaut du système", - interfaceFont: "Police d'interface", + systemDefault: "Police par défaut du système", + interfaceFont: "Police de l’interface", interfaceFontHint: - "Utilisé dans toute l'application. Laisser vide pour la valeur par défaut du système", - interfaceFontAccessibility: "Famille de polices d'interface", - interfaceSize: "Taille de l'interface", + "Utilisée dans toute l’application. Laissez vide pour utiliser la police par défaut du système", + interfaceFontAccessibility: "Famille de police de l’interface", + interfaceSize: "Taille de l’interface", interfaceSizeHint: "Utilisée pour la navigation, les contrôles et les libellés", - interfaceSizeAccessibility: "Taille de police de l'interface", + interfaceSizeAccessibility: "Taille de police de l’interface", contentSize: "Taille du contenu", - contentSizeHint: "Utilisée pour le texte du chat et le Markdown rendu", + contentSizeHint: "Utilisée pour le texte de la discussion et le Markdown rendu", contentSizeAccessibility: "Taille de police du contenu", - codeFont: "Police de code", + codeFont: "Police du code", codeFontHint: - "Utilisé dans le code, les différences et la sortie du terminal. Laisser vide pour la valeur par défaut du système", - codeFontAccessibility: "Famille de polices de code", + "Utilisée pour le code, les diffs et la sortie du terminal. Laissez vide pour utiliser la police par défaut du système", + codeFontAccessibility: "Famille de police du code", codeSize: "Taille du code", codeSizeHint: "Utilisée pour le code, les diffs et la sortie du terminal", - codeSizeAccessibility: "Taille de la police du code", + codeSizeAccessibility: "Taille de police du code", }, layout: { title: "Mise en page", contentWidth: "Largeur du contenu", - contentWidthHint: "Largeur maximale du chat et des fichiers Markdown sur les grands écrans", + contentWidthHint: + "Largeur maximale de la discussion et des fichiers Markdown sur les grands écrans", contentWidthAccessibility: "Largeur du contenu en pixels", reset: "Réinitialiser", resetAccessibility: "Réinitialiser la largeur du contenu", }, syntax: { title: "Syntaxe", - highlightTheme: "Thème de surbrillance", - highlightThemeHint: "Couleurs du code, indépendamment du thème de l'application", - highlightThemeAccessibility: "Thème phare:{{value}}", + highlightTheme: "Thème de coloration", + highlightThemeHint: "Couleurs du code, indépendantes du thème de l’application", + highlightThemeAccessibility: "Thème de coloration : {{value}}", previewAccessibility: - "Aperçu en direct de la typographie du contenu, du thème de syntaxe et de la police de code", + "Aperçu en direct de la typographie du contenu, du thème de syntaxe et de la police du code", previewContent: "Aperçu du contenu et du code", }, }, shortcuts: { dialogTitle: "Raccourcis", searchPlaceholder: "Rechercher des raccourcis", - unavailableOnMobile: "Les raccourcis clavier ne sont disponibles que sur le bureau", - capturePrompt: "Appuyez sur le raccourci...", - unassigned: "Non défini", + unavailableOnMobile: "Les raccourcis clavier ne sont disponibles que sur l’app de bureau", + capturePrompt: "Appuyez sur le raccourci…", + unassigned: "Non attribué", actions: { menu: "Actions pour {{name}}", - done: "Fait", + done: "Terminé", cancel: "Annuler", bind: "Attribuer", - rebind: "Relier", + rebind: "Réattribuer", clear: "Effacer", reset: "Rétablir la valeur par défaut", resetAll: "Tout réinitialiser", @@ -2318,85 +2312,85 @@ export const fr: TranslationResources = { sections: { general: "Général", workspaces: "Projets et espaces de travail", - tabsPanes: "Onglets et volets", + tabsPanes: "Onglets et panneaux", layout: "Disposition", - agentInput: "EntréeAgent", + agentInput: "Zone de saisie", }, help: { - openProject: "Projet ouvert", + openProject: "Ouvrir un projet", newWorkspace: "Nouvel espace de travail", - newWorktree: "Nouvel arbre de travail", + newWorktree: "Nouveau worktree", archiveWorkspace: "Archiver l’espace de travail", newTab: "Nouvel onglet", - closeCurrentTab: "Fermer l'onglet actuel", - jumpToWorkspace: "Accéder à l'espace de travail", - jumpToTab: "Aller à l'onglet", + closeCurrentTab: "Fermer l’onglet actuel", + jumpToWorkspace: "Aller à l’espace de travail", + jumpToTab: "Aller à l’onglet", previousWorkspace: "Espace de travail précédent", nextWorkspace: "Espace de travail suivant", previousTab: "Onglet précédent", nextTab: "Onglet suivant", - splitPaneRight: "Volet divisé à droite", - splitPaneDown: "Diviser le volet vers le bas", - focusPaneLeft: "Volet de mise au point à gauche", - focusPaneRight: "Volet de mise au point à droite", - focusPaneUp: "Volet de mise au point vers le haut", - focusPaneDown: "Volet de mise au point vers le bas", - moveTabLeft: "Déplacer l'onglet vers la gauche", - moveTabRight: "Déplacer l'onglet vers la droite", - moveTabUp: "Déplacer l'onglet vers le haut", - moveTabDown: "Déplacer l'onglet vers le bas", - closePane: "Fermer le volet", - newTerminal: "Nouvelle borne", + splitPaneRight: "Diviser le panneau vers la droite", + splitPaneDown: "Diviser le panneau vers le bas", + focusPaneLeft: "Activer le panneau de gauche", + focusPaneRight: "Activer le panneau de droite", + focusPaneUp: "Activer le panneau du haut", + focusPaneDown: "Activer le panneau du bas", + moveTabLeft: "Déplacer l’onglet vers la gauche", + moveTabRight: "Déplacer l’onglet vers la droite", + moveTabUp: "Déplacer l’onglet vers le haut", + moveTabDown: "Déplacer l’onglet vers le bas", + closePane: "Fermer le panneau", + newTerminal: "Nouveau terminal", searchFiles: "Rechercher des fichiers", - toggleCommandCenter: "Basculer le centre de commande", + toggleCommandCenter: "Afficher/masquer la palette de commandes", showKeyboardShortcuts: "Afficher les raccourcis clavier", - toggleLeftSidebar: "Basculer la barre latérale gauche", - toggleRightSidebar: "Basculer le panneau latéral", - toggleBothSidebars: "Basculer les deux barres latérales", - toggleSettings: "Basculer les paramètres", - toggleFocusMode: "Basculer le mode de mise au point", - cycleTheme: "Thème du cycle", - focusMessageInput: "Saisie du message de focus", - cycleAgentMode: "Parcourir les modes de l'agent", - toggleVoiceMode: "Changer le mode vocal", - startStopDictation: "Démarrer la dictée/stop", - interruptAgent: "Agent d'interruption", - sendMessage: "Envoyer un message", - queueMessage: "Message de file d'attente", - muteUnmuteVoiceMode: "Mode vocal/unmutemuet", + toggleLeftSidebar: "Afficher/masquer la barre latérale gauche", + toggleRightSidebar: "Afficher/masquer la barre latérale de l’explorateur", + toggleBothSidebars: "Afficher/masquer les deux barres latérales", + toggleSettings: "Afficher/masquer les paramètres", + toggleFocusMode: "Activer/désactiver le mode focus", + cycleTheme: "Parcourir les thèmes", + focusMessageInput: "Aller à la zone de saisie", + cycleAgentMode: "Parcourir les modes de l’agent", + toggleVoiceMode: "Activer/désactiver le mode vocal", + startStopDictation: "Démarrer/arrêter la dictée", + interruptAgent: "Interrompre l’agent", + sendMessage: "Envoyer le message", + queueMessage: "Mettre le message en file d’attente", + muteUnmuteVoiceMode: "Couper/réactiver le micro en mode vocal", switchProject: "Changer de projet", }, helpNotes: { showKeyboardShortcuts: - "Disponible lorsque le focus n’est pas dans un champ de texte ou un terminal.", + "Disponible quand le focus n’est ni dans un champ de texte ni dans un terminal.", }, }, integrations: { title: "Intégrations", docs: { - cli: "DocumentsCLI", - openCli: "Ouvrir la documentationCLI", + cli: "Documentation CLI", + openCli: "Ouvrir la documentation CLI", }, commandLine: { title: "Ligne de commande", - description: "Agents de contrôle et de script depuis votre terminal", + description: "Pilotez et scriptez vos agents depuis votre terminal", }, actions: { install: "Installer", - installing: "Installation...", + installing: "Installation…", installed: "Installé", }, }, permissions: { title: "Autorisations", microphone: "Microphone", - refresh: "Rafraîchir", - refreshing: "Rafraîchissant...", + refresh: "Actualiser", + refreshing: "Actualisation…", refreshAccessibility: "Actualiser les autorisations du bureau", actions: { - granted: "Accordé", - request: "Demande", - requesting: "Demander...", + granted: "Accordée", + request: "Demander", + requesting: "Demande…", }, }, host: { @@ -2415,12 +2409,12 @@ export const fr: TranslationResources = { options: { none: "Par défaut", violet: "Violet", - sky: "Ciel", + sky: "Bleu ciel", emerald: "Émeraude", orange: "Orange", pink: "Rose", indigo: "Indigo", - teal: "Sarcelle", + teal: "Bleu canard", red: "Rouge", amber: "Ambre", blue: "Bleu", @@ -2439,250 +2433,252 @@ export const fr: TranslationResources = { workspaceName: "my-workspace", }, }, - notFound: "Hostintrouvable", + notFound: "Hôte introuvable", badges: { relay: "Relais", - local: "Locale", + local: "Local", remoteSsh: "SSH distant", }, connections: { - title: "Relations", + title: "Connexions", removeTitle: "Supprimer la connexion", - removeMessage: "Supprimer{{name}}? Cela ne peut pas être annulé.", - removeAction: "Retirer", + removeMessage: "Supprimer {{name}} ? Cette action est irréversible.", + removeAction: "Supprimer", removeErrorTitle: "Erreur", removeErrorMessage: "Impossible de supprimer la connexion", - timeout: "Temps mort", + timeout: "Délai dépassé", }, pairDevices: { title: "Associer des appareils", rowTitle: "Associer un appareil", - rowHint: "Scannez un codeQRou copiez un lien pour connecter votre téléphone à cet hôte", + rowHint: "Scannez un QR code ou copiez un lien pour connecter votre téléphone à cet hôte", }, skills: { ...en.settings.host.skills, - sectionTitle: "Compétences en orchestration", - title: "Compétences en orchestration", - description: "Apprenez à vos agents à orchestrer via leCLI", + sectionTitle: "Skills d’orchestration", + title: "Skills d’orchestration", + description: "Apprenez à vos agents à orchestrer via la CLI", updateAvailable: "Mise à jour disponible", - updateTitle: "Mettre à jour les compétencesPaseo?", - updateFallback: "Synchronisez les compétences regroupées sur votre machine.", - uninstallTitle: "Désinstaller les compétencesPaseo?", + updateTitle: "Mettre à jour les skills Paseo ?", + updateFallback: "Synchronisez les skills fournis sur cet hôte.", + uninstallTitle: "Désinstaller les skills Paseo ?", uninstallMessage: - "Supprime toutes les compétences d'orchestrationPaseode ~/.agents, ~/.claude, ~/.codex.", - choose: "Choisir les compétences", - chooseAll: "Toutes les compétences", + "Supprime tous les skills d’orchestration Paseo de ~/.agents, ~/.claude et ~/.codex sur cet hôte.", + choose: "Choisir les skills", + chooseAll: "Tous les skills", chooseAllHint: - "Gardez installées toutes les compétences fournies, y compris celles ajoutées plus tard.", - chooseList: "Compétences fournies", - chooseEmpty: "Cette version ne fournit aucune compétence.", - removeTitle: "Supprimer les compétences décochées ?", + "Garder installés tous les skills fournis, y compris ceux ajoutés plus tard.", + chooseList: "Skills fournis", + chooseEmpty: "Cet hôte ne fournit aucun skill.", + removeTitle: "Supprimer les skills décochés ?", removeMessage: - "{{skills}} seront supprimées de ~/.agents, ~/.claude et ~/.codex. Tout ce que vous avez ajouté dans ces dossiers de compétences est également supprimé.", - saveFailed: "Impossible d'enregistrer votre sélection de compétences.", - statusFailed: "Impossible de vérifier l'état des compétences d'orchestration.", - updateFailed: "Impossible de mettre à jour les compétences d'orchestration.", - uninstallFailed: "Impossible de désinstaller les compétences d'orchestration.", - saveSelectionFailed: - "Impossible d'enregistrer la sélection des compétences d'orchestration.", + "{{skills}} seront supprimés de ~/.agents, ~/.claude et ~/.codex sur cet hôte. Tout ce que vous avez ajouté dans ces dossiers de skills sera également supprimé.", + saveFailed: "Impossible d’enregistrer votre sélection de skills.", + statusFailed: "Impossible de vérifier l’état des skills d’orchestration.", + updateFailed: "Impossible de mettre à jour les skills d’orchestration.", + uninstallFailed: "Impossible de désinstaller les skills d’orchestration.", + saveSelectionFailed: "Impossible d’enregistrer la sélection des skills d’orchestration.", actions: { install: "Installer", - installing: "Installation...", + installing: "Installation…", installed: "Installé", - update: "Mise à jour", - working: "Fonctionnement...", + update: "Mettre à jour", + working: "En cours…", remove: "Supprimer", uninstall: "Désinstaller", save: "Enregistrer", - saving: "Enregistrement...", + saving: "Enregistrement…", cancel: "Annuler", }, operations: { - add: "Ajouter une compétence", - update: "Mettre à jour la compétence", - delete: "Supprimer la compétence", + add: "Ajouter un skill", + update: "Mettre à jour le skill", + delete: "Supprimer le skill", }, }, orchestration: { title: "Orchestration", - unavailable: "Connectez-vous à cet hôte pour gérer l'orchestration", + unavailable: "Connectez-vous à cet hôte pour gérer l’orchestration", enableTools: { - title: "Activer les outilsPaseo", - hint: "Les agents pourront gérer les arbres de travail, les agents et les horaires", - accessibilityLabel: "Injecter les outilsPaseo", + title: "Activer les outils Paseo", + hint: "Les agents pourront gérer les worktrees, les agents et les planifications", + accessibilityLabel: "Injecter les outils Paseo", }, systemPrompt: { - title: "Invite système", - hint: "Ajoute une invite système à tous les agents", - sheetTitle: "Ajouter une invite système", - accessibilityLabel: "Ajouter une invite système", - placeholder: "Gardez toujours des réponses concises.", + title: "Prompt système", + hint: "Ajoute un prompt système à tous les agents", + sheetTitle: "Ajouter un prompt système", + accessibilityLabel: "Ajouter un prompt système", + placeholder: "Toujours répondre de façon concise.", edit: "Modifier", reset: "Réinitialiser", - save: "Sauvegarder", - saving: "Sauvegarde...", + save: "Enregistrer", + saving: "Enregistrement…", }, }, agents: { - unavailable: "Connect to this host to manage agents", + unavailable: "Connectez-vous à cet hôte pour gérer les agents", }, workspaces: { - unavailable: "Connect to this host to manage workspaces", + unavailable: "Connectez-vous à cet hôte pour gérer les espaces de travail", }, terminalProfiles: { - unavailable: "Connect to this host to manage terminal profiles", - sectionTitle: "Terminal profiles", - editProfile: "Edit profile", - addProfileTitle: "Add terminal profile", - editProfileTitle: "Edit terminal profile", + unavailable: "Connectez-vous à cet hôte pour gérer les profils de terminal", + sectionTitle: "Profils de terminal", + editProfile: "Modifier le profil", + addProfileTitle: "Ajouter un profil de terminal", + editProfileTitle: "Modifier le profil de terminal", namePlaceholder: "Claude Code", commandPlaceholder: "claude", argsPlaceholder: "--dangerously-skip-permissions", - nameLabel: "Name", - commandLabel: "Command", + nameLabel: "Nom", + commandLabel: "Commande", argsLabel: "Arguments", - nameRequired: "Name is required", - commandRequired: "Command is required", - argsHint: "Space-separated arguments passed to the command", - saving: "Saving...", - remove: "Remove", - removeConfirmTitle: "Remove profile?", - removeConfirmMessage: 'Remove "{{name}}"?', - moveUp: "Move up", - moveDown: "Move down", - save: "Save", - emptyState: "No profiles yet. Add one to launch terminals with a specific command.", + nameRequired: "Le nom est obligatoire", + commandRequired: "La commande est obligatoire", + argsHint: "Arguments séparés par des espaces, transmis à la commande", + saving: "Enregistrement…", + remove: "Supprimer", + removeConfirmTitle: "Supprimer le profil ?", + removeConfirmMessage: "Supprimer « {{name}} » ?", + moveUp: "Monter", + moveDown: "Descendre", + save: "Enregistrer", + emptyState: + "Aucun profil pour le moment. Ajoutez-en un pour lancer des terminaux avec une commande précise.", }, agentProfiles: { - sectionTitle: "Profils d'agent", - unavailable: "Connectez-vous à cet hôte pour gérer les profils d'agent", - unsupported: - "Cet hôte exécute un daemon qui ne prend pas encore en charge les profils d'agent", + sectionTitle: "Profils d’agent", + unavailable: "Connectez-vous à cet hôte pour gérer les profils d’agent", + unsupported: "Le daemon de cet hôte ne prend pas encore en charge les profils d’agent", emptyState: - "Aucun profil pour le moment. Ajoutez-en un pour démarrer des agents à partir d'un fournisseur et d'un modèle enregistrés.", - addProfileTitle: "Ajouter un profil d'agent", + "Aucun profil pour le moment. Ajoutez-en un pour démarrer des agents avec un fournisseur et un modèle enregistrés.", + addProfileTitle: "Ajouter un profil d’agent", newProfile: "Nouveau profil", editProfile: "Modifier le profil", - editProfileTitle: "Modifier le profil d'agent", + editProfileTitle: "Modifier le profil d’agent", nameLabel: "Nom", - namePlaceholder: "Travail sur l'UI", + namePlaceholder: "Travail sur l’UI", iconLabel: "Icône", noIcon: "Aucune", providerLabel: "Fournisseur", providerPlaceholder: "Sélectionner un fournisseur", - noProviders: "Aucun fournisseur n'est disponible sur cet hôte", + noProviders: "Aucun fournisseur disponible sur cet hôte", modelLabel: "Modèle", - noModels: "Ce fournisseur n'a aucun modèle à choisir", + noModels: "Ce fournisseur ne propose aucun modèle", modeLabel: "Mode", - noModes: "Ce fournisseur n'a aucun mode à choisir", - thinkingLabel: "Pensée", - noThinkingOptions: "Ce modèle n'a aucun niveau de pensée", - featuresLabel: "Caractéristiques", - featureCount: "{{count}} caractéristiques", - featureCountOne: "{{count}} caractéristique", + noModes: "Ce fournisseur ne propose aucun mode", + thinkingLabel: "Réflexion", + noThinkingOptions: "Ce modèle n’a aucun niveau de réflexion", + featuresLabel: "Fonctionnalités", + featureCount: "{{count}} fonctionnalités", + featureCountOne: "{{count}} fonctionnalité", notesLabel: "Quand l’utiliser", notesPlaceholder: - "À utiliser pour le travail sur l'UI — composants, mise en page et tokens de design.", + "À utiliser pour le travail sur l’UI : composants, mise en page et design tokens.", notesHint: "Aide les agents à choisir ce profil lorsqu’ils démarrent un autre agent.", save: "Enregistrer", - saving: "Enregistrement...", + saving: "Enregistrement…", remove: "Supprimer", - removeConfirmTitle: "Supprimer le profil ?", - removeConfirmMessage: "Supprimer « {{name}} » ?", - moveUp: "Déplacer vers le haut", - moveDown: "Déplacer vers le bas", + removeConfirmTitle: "Supprimer le profil ?", + removeConfirmMessage: "Supprimer « {{name}} » ?", + moveUp: "Monter", + moveDown: "Descendre", }, daemon: { rename: { - editLabel: "Modifier l'étiquette", - title: "Renommer l'hôte", - placeholder: "MonHost", + editLabel: "Modifier le libellé", + title: "Renommer l’hôte", + placeholder: "Mon hôte", submit: "Renommer", }, restart: { - title: "Redémarrer le démon", - hint: "Redémarre le processus démon. L'application se reconnectera automatiquement", + title: "Redémarrer le daemon", + hint: "Redémarre le processus du daemon. L’application se reconnectera automatiquement", confirm: "Redémarrer", - confirmTitle: "Redémarrer{{name}}", + confirmTitle: "Redémarrer {{name}}", confirmMessage: - "Cela redémarrera le démon. Les agents qui s'y exécutent continueront à fonctionner; l'application se reconnectera automatiquement.", - restarting: "Redémarrage...", + "Le daemon va redémarrer. Les agents qui y tournent continueront de s’exécuter et l’application se reconnectera automatiquement.", + restarting: "Redémarrage…", unableToReconnectTitle: "Impossible de se reconnecter", unableToReconnectMessage: - "{{name}}n'est pas revenu en ligne. Veuillez vérifier qu'il a redémarré.", - unavailableTitle: "Hostindisponible", + "{{name}} n’est pas revenu en ligne. Vérifiez qu’il a bien redémarré.", + unavailableTitle: "Hôte indisponible", unavailableMessage: - "Cet hôte n'est pas connecté. Attendez qu'il soit en ligne avant de redémarrer.", - offlineTitle: "Hosthors ligne", + "Cet hôte n’est pas connecté. Attendez qu’il soit en ligne avant de redémarrer.", + offlineTitle: "Hôte hors ligne", offlineMessage: - "Cet hôte est hors ligne.Paseose reconnecte automatiquement: attendez qu'il soit de nouveau en ligne avant de redémarrer.", + "Cet hôte est hors ligne. Paseo se reconnecte automatiquement : attendez qu’il soit de nouveau en ligne avant de redémarrer.", requestFailedTitle: "Erreur", requestFailedMessage: - "Échec de l'envoi de la demande de redémarrage.Paseose reconnecte automatiquement - réessayez une fois que l'hôte apparaît comme en ligne.", + "Impossible d’envoyer la demande de redémarrage. Paseo se reconnecte automatiquement : réessayez quand l’hôte apparaît en ligne.", dialogFailedMessage: - "Impossible d'ouvrir la boîte de dialogue de confirmation de redémarrage.", + "Impossible d’ouvrir la boîte de dialogue de confirmation du redémarrage.", }, update: { desktopManagedHint: "Ce daemon est géré par Paseo Desktop. Mettez à jour Paseo Desktop sur l’hôte.", - title: "Update daemon", - hint: "Update the daemon to the latest version and restart it", - confirm: "Update", - confirmTitle: "Update {{name}}", + title: "Mettre à jour le daemon", + hint: "Met à jour le daemon vers la dernière version puis le redémarre", + confirm: "Mettre à jour", + confirmTitle: "Mettre à jour {{name}}", confirmMessage: - "This will update the daemon to the latest version and restart it. Running agents will be briefly interrupted.", - updating: "Updating...", - phaseStarting: "Preparing update...", - phaseDownloading: "Downloading packages...", - phaseInstalling: "Installing...", - phaseComplete: "Update complete, restarting...", - unableToReconnectTitle: "Unable to reconnect", + "Le daemon va être mis à jour vers la dernière version puis redémarré. Les agents en cours seront brièvement interrompus.", + updating: "Mise à jour…", + phaseStarting: "Préparation de la mise à jour…", + phaseDownloading: "Téléchargement des paquets…", + phaseInstalling: "Installation…", + phaseComplete: "Mise à jour terminée, redémarrage…", + unableToReconnectTitle: "Impossible de se reconnecter", unableToReconnectMessage: - "{{name}} did not come back online after updating. Please verify the daemon restarted.", - unavailableTitle: "Host unavailable", + "{{name}} n’est pas revenu en ligne après la mise à jour. Vérifiez que le daemon a bien redémarré.", + unavailableTitle: "Hôte indisponible", unavailableMessage: - "This host is not connected. Wait for it to come online before updating.", - offlineTitle: "Host offline", - offlineMessage: "This host is offline. Wait until it is back online before updating.", - requestFailedTitle: "Update failed", - requestFailedMessage: "Failed to update the daemon: {{error}}", - dialogFailedMessage: "Unable to open the update confirmation dialog.", + "Cet hôte n’est pas connecté. Attendez qu’il soit en ligne avant de lancer la mise à jour.", + offlineTitle: "Hôte hors ligne", + offlineMessage: + "Cet hôte est hors ligne. Attendez qu’il soit de nouveau en ligne avant de lancer la mise à jour.", + requestFailedTitle: "Échec de la mise à jour", + requestFailedMessage: "Impossible de mettre à jour le daemon : {{error}}", + dialogFailedMessage: + "Impossible d’ouvrir la boîte de dialogue de confirmation de la mise à jour.", }, dangerZone: "Zone dangereuse", remove: { - title: "Supprimer l'hôte", - localTitle: "Remove localhost connection", + title: "Supprimer l’hôte", + localTitle: "Supprimer la connexion localhost", hint: "Supprime cet hôte et ses connexions enregistrées de cet appareil", - localHint: "Removes localhost from this device and stops the built-in daemon", - localConfirmTitle: "Remove localhost connection and stop daemon?", - confirmMessage: "Supprimer{{name}}? Cela supprimera ses connexions enregistrées.", + localHint: "Supprime localhost de cet appareil et arrête le daemon intégré", + localConfirmTitle: "Supprimer la connexion localhost et arrêter le daemon ?", + confirmMessage: "Supprimer {{name}} ? Ses connexions enregistrées seront supprimées.", localConfirmMessage: - "This will remove the localhost connection, turn off built-in daemon management, and stop the managed daemon. Remote hosts remain connected.", + "La connexion localhost sera supprimée, la gestion du daemon intégré désactivée et le daemon géré arrêté. Les hôtes distants restent connectés.", errorTitle: "Erreur", - errorMessage: "Impossible de supprimer l'hôte", - localErrorMessage: "Unable to remove localhost connection", + errorMessage: "Impossible de supprimer l’hôte", + localErrorMessage: "Impossible de supprimer la connexion localhost", }, }, }, providers: { title: "Fournisseurs", addProvider: "Ajouter un fournisseur", - providerDetails: "Détails du fournisseur{{name}}", - enableProvider: "Activer{{name}}", + providerDetails: "Détails du fournisseur {{name}}", + enableProvider: "Activer {{name}}", unavailable: "Connectez-vous à cet hôte pour voir les fournisseurs", - loading: "Chargement...", - addErrorTitle: "Unable to add provider", + loading: "Chargement…", + addErrorTitle: "Impossible d’ajouter le fournisseur", updateErrorTitle: "Impossible de mettre à jour le fournisseur", actions: { - menu: "{{name}} actions", - remove: "Remove provider", - removing: "Removing...", + menu: "Actions de {{name}}", + remove: "Supprimer le fournisseur", + removing: "Suppression…", }, remove: { - confirmTitle: "Remove {{name}}?", - confirmMessage: "This deletes the provider entry from config.json. It cannot be undone.", - confirm: "Remove", - errorTitle: "Unable to remove provider", + confirmTitle: "Supprimer {{name}} ?", + confirmMessage: + "L’entrée du fournisseur sera supprimée de config.json. Cette action est irréversible.", + confirm: "Supprimer", + errorTitle: "Impossible de supprimer le fournisseur", }, statuses: { disabled: "Désactivé", @@ -2696,40 +2692,40 @@ export const fr: TranslationResources = { many: "{{count}} modèles", addModel: "Ajouter un modèle", addCustomTitle: "Ajouter un modèle personnalisé", - modelId: "ModèleID", - modelIdPlaceholder: "par ex. ouvert/gpt-5", + modelId: "ID du modèle", + modelIdPlaceholder: "ex. openai/gpt-5", add: "Ajouter", - adding: "Ajout...", - failedToSave: "Échec de l'enregistrement du modèle", - removeModel: "Supprimer{{id}}", + adding: "Ajout…", + failedToSave: "Impossible d’enregistrer le modèle", + removeModel: "Supprimer {{id}}", searchPlaceholder: "Rechercher des modèles", - loading: "Chargement des modèles...", + loading: "Chargement des modèles…", retry: "Réessayer", - retrying: "Nouvelle tentative...", + retrying: "Nouvelle tentative…", noSearchMatches: "Aucun modèle ne correspond à votre recherche", noneDetected: "Aucun modèle détecté", - discovered: "Découvert", + discovered: "Détectés", custom: "Modèles personnalisés", - updated: "{{time}}mis à jour", + updated: "Mis à jour {{time}}", }, diagnostic: { - title: "Diagnostique", - button: "Diagnostique", - refresh: "Rafraîchir", - refreshing: "Rafraîchissant...", + title: "Diagnostic", + button: "Diagnostic", + refresh: "Actualiser", + refreshing: "Actualisation…", copyLabel: "diagnostic", copyAccessibility: "Copier le diagnostic", - copyFailed: "Échec de la copie du diagnostic", + copyFailed: "Impossible de copier le diagnostic", refreshAccessibility: "Actualiser le diagnostic", - refreshingAccessibility: "Diagnostic rafraîchissant", - running: "Exécution du diagnostic...", + refreshingAccessibility: "Actualisation du diagnostic", + running: "Exécution du diagnostic…", none: "Aucun diagnostic disponible", - failedToFetch: "Échec de la récupération du diagnostic", + failedToFetch: "Impossible de récupérer le diagnostic", unknownError: "Erreur inconnue", }, }, project: { - noEditableTarget: "Ce projet n'est pas modifiable sur cet hôte.", + noEditableTarget: "Ce projet n’est pas modifiable sur cet hôte.", backToProjects: "Retour aux projets", edit: { title: "Modifier le projet", @@ -2737,85 +2733,86 @@ export const fr: TranslationResources = { nameLabel: "Nom du projet", icon: "Icône", chooseImage: "Choisir une image", - useAutomatic: "Utiliser l'automatique", - imageUrl: "URL d'image ou de site", - save: "Enregistrer", + useAutomatic: "Icône automatique", + imageUrl: "URL d’une image ou d’un site", + save: "Enregistrer les modifications", savedToast: "Projet mis à jour", }, readFailures: { - invalidTitle: "paseo.json n'a pas pu être analysé", + invalidTitle: "Impossible d’analyser paseo.json", invalidDescription: "Corrigez le fichier sur le disque, puis rechargez.", - missingTitle: "Cet hôte n'a pas ce projet", - missingSingleHost: "L'hôte sélectionné n'a aucune trace de ce projet.", + missingTitle: "Ce projet n’existe pas sur cet hôte", + missingSingleHost: "L’hôte sélectionné n’a aucune trace de ce projet.", transportTitle: "Impossible de charger paseo.json", - transportFallback: "L'hôte n'a pas répondu.", + transportFallback: "L’hôte n’a pas répondu.", failedTitle: "Impossible de charger paseo.json", failedDescription: "Rechargez pour réessayer.", }, worktree: { - title: "Crochets de cycle de vie Worktree", - info: "Commandes exécutées lorsqu'un arbre de travail est créé ou supprimé pour ce projet", - docs: "Documents", + title: "Hooks de cycle de vie des worktrees", + info: "Commandes exécutées à la création ou à la suppression d’un worktree de ce projet", + docs: "Documentation", docsTooltip: - "Voir la documentation pour plus de détails et les variables d'environnement disponibles pour ces commandes", - setup: "Installation", - setupAccessibility: "Commandes de configuration de Worktree", - uncommittedTitle: "Validez les modifications de paseo.json", + "Consultez la documentation pour plus de détails et la liste des variables d’environnement disponibles pour ces commandes", + setup: "Configuration", + setupAccessibility: "Commandes de configuration du worktree", + uncommittedTitle: "Commitez les modifications de paseo.json", uncommittedDescription: "Les nouveaux worktrees utilisent le script de configuration de la branche de base sélectionnée.", - teardown: "Démolir", - teardownAccessibility: "Commandes de démontage de Worktree", + teardown: "Démontage", + teardownAccessibility: "Commandes de démontage du worktree", }, scripts: { title: "Scripts", - info: "Services de longue durée et commandes ponctuelles que vous pouvez lancer à partir de n'importe quel agent de ce projet", - empty: "Pas encore de scripts.", + info: "Services de longue durée et commandes ponctuelles que vous pouvez lancer depuis n’importe quel agent de ce projet", + empty: "Aucun script pour le moment.", untitled: "Script sans titre", - port: "port{{port}}", - menuAccessibility: "Ouvrir le menu des scripts", - removeTitle: "Supprimer le script?", - removeMessage: "Supprimer{{name}}?", - removeFallbackName: "ce scénario", + port: "port {{port}}", + menuAccessibility: "Ouvrir le menu du script", + removeTitle: "Supprimer le script ?", + removeMessage: "Supprimer {{name}} ?", + removeFallbackName: "ce script", name: "Nom", command: "Commande", nameAccessibility: "Nom du script", - commandAccessibility: "Commande de script", - nameRequired: "Le nom est requis", - commandRequired: "La commande est requise", - newScript: "Nouveau scénario", - editScript: "Modifier{{name}}", - runAsService: "Exécuter en tant que service", - serviceHint: "Paseosupervise le processus et attribue un port via $PASEO_PORT", + commandAccessibility: "Commande du script", + nameRequired: "Le nom est obligatoire", + commandRequired: "La commande est obligatoire", + newScript: "Nouveau script", + editScript: "Modifier {{name}}", + runAsService: "Exécuter comme service", + serviceHint: "Paseo supervise le processus et lui attribue un port via $PASEO_PORT", actions: { add: "Ajouter un script", edit: "Modifier", - remove: "Retirer", + remove: "Supprimer", }, }, metadata: { - title: "Génération de métadonnées", - info: "Instructions spécifiques au projet injectées dans les invites de l'IA quePaseoutilise pour générer des métadonnées: utilisez-les pour appliquer les conventions de votre équipe telles que la dénomination des branches, le style de validation ou le formatPR.", - branchName: "Noms des succursales", + title: "Génération des métadonnées", + info: "Instructions propres au projet, injectées dans les prompts IA que Paseo utilise pour générer les métadonnées : servez-vous-en pour imposer les conventions de votre équipe (nommage des branches, style de commit, format des PR).", + branchName: "Noms de branches", branchNamePlaceholder: - "Préfixez les branches avec feat/ ou fix/, mb/ pour les branches personnelles", - commitMessage: "Valider les messages", - commitMessagePlaceholder: "Utiliser des commits conventionnels avec une portée", - pullRequest: "Demandes de tirage", + "Préfixez les branches par feat/ ou fix/, et par mb/ pour les branches personnelles", + commitMessage: "Messages de commit", + commitMessagePlaceholder: "Utilisez les Conventional Commits avec un scope", + pullRequest: "Pull requests", pullRequestPlaceholder: - "Commencez avec un résumé d'un paragraphe, incluez une section sur le plan de test", + "Commencez par un résumé d’un paragraphe et incluez une section « Test plan »", }, writeFailures: { staleTitle: "Configuration modifiée sur le disque", - staleDescription: "Rechargez pour récupérer le dernier paseo.json avant de sauvegarder.", - failedTitle: "Impossible d'enregistrer paseo.json", - failedDescription: "Réessayez ou rechargez la dernière version à partir du disque.", + staleDescription: + "Rechargez pour récupérer la dernière version de paseo.json avant d’enregistrer.", + failedTitle: "Impossible d’enregistrer paseo.json", + failedDescription: "Réessayez ou rechargez la dernière version depuis le disque.", }, actions: { reload: "Recharger", - tryAgain: "Essayer à nouveau", - save: "Sauvegarder", + tryAgain: "Réessayer", + save: "Enregistrer", saved: "Projet enregistré", - saving: "Sauvegarde...", + saving: "Enregistrement…", cancel: "Annuler", }, }, diff --git a/packages/app/src/i18n/resources/plugin-settings.ts b/packages/app/src/i18n/resources/plugin-settings.ts index 104bf6b1d0..b3f0621df7 100644 --- a/packages/app/src/i18n/resources/plugin-settings.ts +++ b/packages/app/src/i18n/resources/plugin-settings.ts @@ -163,7 +163,7 @@ export const pluginSettings = { globalEnabled: "Plugins activés", globalDisabled: "Plugins désactivés", }, - removeConfirmTitle: "Supprimer {{id}} ?", + removeConfirmTitle: "Supprimer {{id}} ?", removeConfirmMessage: "La configuration sera supprimée. Le dossier source ne sera pas effacé.", states: { offlineTitle: "L’hôte des plugins est hors ligne",