feat(ui): add locales and split catalogs

Adds Spanish, French, Russian, Japanese, and Simplified Chinese catalogs and wires supported locales into the i18n layer.
This commit is contained in:
Shantur Rathore
2026-01-26 12:56:26 +00:00
parent 5b1e21345f
commit feccbd13bd
89 changed files with 4531 additions and 30 deletions

View File

@@ -0,0 +1,6 @@
export const advancedSettingsMessages = {
"advancedSettings.title": "Paramètres avancés",
"advancedSettings.environmentVariables.title": "Variables d'environnement",
"advancedSettings.environmentVariables.subtitle": "Appliquées à chaque démarrage d'une nouvelle instance OpenCode",
"advancedSettings.actions.close": "Fermer",
} as const

View File

@@ -0,0 +1,29 @@
export const appMessages = {
"app.launchError.title": "Impossible de lancer OpenCode",
"app.launchError.description": "Nous n'avons pas pu démarrer le binaire OpenCode sélectionné. Consultez la sortie d'erreur ci-dessous ou choisissez un autre binaire dans les Paramètres avancés.",
"app.launchError.binaryPathLabel": "Chemin du binaire",
"app.launchError.errorOutputLabel": "Sortie d'erreur",
"app.launchError.openAdvancedSettings": "Ouvrir les paramètres avancés",
"app.launchError.close": "Fermer",
"app.launchError.closeTitle": "Fermer (Esc)",
"app.launchError.fallbackMessage": "Échec du lancement de l'espace de travail",
"app.stopInstance.confirmMessage": "Arrêter l'instance OpenCode ? Cela arrêtera le serveur.",
"app.stopInstance.title": "Arrêter l'instance",
"app.stopInstance.confirmLabel": "Arrêter",
"app.stopInstance.cancelLabel": "Laisser tourner",
"emptyState.logoAlt": "Logo CodeNomad",
"emptyState.brandTitle": "CodeNomad",
"emptyState.tagline": "Sélectionnez un dossier pour commencer à coder avec l'IA",
"emptyState.actions.selectFolder": "Sélectionner un dossier",
"emptyState.actions.selecting": "Sélection...",
"emptyState.keyboardShortcut": "Raccourci clavier : {shortcut}",
"emptyState.examples": "Exemples : {example}",
"emptyState.multipleInstances": "Vous pouvez avoir plusieurs instances du même dossier",
"releases.upgradeRequired.title": "Mise à jour requise",
"releases.upgradeRequired.message.withVersion": "Mettez à jour vers CodeNomad {version} pour utiliser la dernière UI.",
"releases.upgradeRequired.message.noVersion": "Mettez à jour CodeNomad pour utiliser la dernière UI.",
"releases.upgradeRequired.action.getUpdate": "Obtenir la mise à jour",
} as const

View File

@@ -0,0 +1,160 @@
export const commandMessages = {
"commandPalette.title": "Palette de commandes",
"commandPalette.description": "Rechercher et exécuter des commandes",
"commandPalette.searchPlaceholder": "Tapez une commande ou recherchez...",
"commandPalette.empty": "Aucune commande trouvée pour \"{query}\"",
"commandPalette.category.customCommands": "Commandes personnalisées",
"commandPalette.category.instance": "Instance",
"commandPalette.category.session": "Session",
"commandPalette.category.agentModel": "Agent et modèle",
"commandPalette.category.inputFocus": "Saisie et focus",
"commandPalette.category.system": "Système",
"commandPalette.category.other": "Autre",
"commands.newInstance.label": "Nouvelle instance",
"commands.newInstance.description": "Ouvrir le sélecteur de dossiers pour créer une nouvelle instance",
"commands.newInstance.keywords": "dossier, projet, espace de travail",
"commands.closeInstance.label": "Fermer l'instance",
"commands.closeInstance.description": "Arrêter le serveur de l'instance actuelle",
"commands.closeInstance.keywords": "arrêter, quitter, fermer",
"commands.nextInstance.label": "Instance suivante",
"commands.nextInstance.description": "Passer à l'onglet d'instance suivant",
"commands.nextInstance.keywords": "changer, naviguer, suivant",
"commands.previousInstance.label": "Instance précédente",
"commands.previousInstance.description": "Passer à l'onglet d'instance précédent",
"commands.previousInstance.keywords": "changer, naviguer, précédent",
"commands.newSession.label": "Nouvelle session",
"commands.newSession.description": "Créer une nouvelle session parente",
"commands.newSession.keywords": "créer, démarrer",
"commands.closeSession.label": "Fermer la session",
"commands.closeSession.description": "Fermer la session parente actuelle",
"commands.closeSession.keywords": "fermer, arrêter",
"commands.scrubSessions.label": "Nettoyer les sessions",
"commands.scrubSessions.description": "Supprimer les sessions vides, les sessions de sous-agent ayant terminé leur tâche principale, ainsi que les sessions forkées inutiles.",
"commands.scrubSessions.keywords": "nettoyage, vide, sessions, supprimer, effacer",
"commands.instanceInfo.label": "Infos de l'instance",
"commands.instanceInfo.description": "Ouvrir la vue d'ensemble de l'instance pour les journaux et le statut",
"commands.instanceInfo.keywords": "infos, journaux, console, sortie, logs",
"commands.nextSession.label": "Session suivante",
"commands.nextSession.description": "Passer à l'onglet de session suivant",
"commands.nextSession.keywords": "changer, naviguer, suivant",
"commands.previousSession.label": "Session précédente",
"commands.previousSession.description": "Passer à l'onglet de session précédent",
"commands.previousSession.keywords": "changer, naviguer, précédent",
"commands.compactSession.label": "Compacter la session",
"commands.compactSession.description": "Résumer et compacter la session actuelle",
"commands.compactSession.keywords": "résumer, compresser, compact",
"commands.compactSession.errorFallback": "Impossible de compacter la session",
"commands.compactSession.alert.title": "Échec du compactage",
"commands.compactSession.alert.message": "Échec du compactage : {message}",
"commands.undoLastMessage.label": "Annuler le dernier message",
"commands.undoLastMessage.description": "Revenir sur le dernier message",
"commands.undoLastMessage.keywords": "revenir, annuler",
"commands.undoLastMessage.none.title": "Aucune action à annuler",
"commands.undoLastMessage.none.message": "Rien à annuler",
"commands.undoLastMessage.failed.title": "Échec de l'annulation",
"commands.undoLastMessage.failed.message": "Impossible de revenir au message",
"commands.openModelSelector.label": "Ouvrir le sélecteur de modèle",
"commands.openModelSelector.description": "Choisir un autre modèle",
"commands.openModelSelector.keywords": "modèle, llm, ia, ai",
"commands.selectModelVariant.label": "Sélectionner la variante du modèle",
"commands.selectModelVariant.description": "Choisir un effort de réflexion pour le modèle actuel",
"commands.selectModelVariant.keywords": "variante, réflexion, raisonnement, effort",
"commands.openAgentSelector.label": "Ouvrir le sélecteur d'agent",
"commands.openAgentSelector.description": "Choisir un autre agent",
"commands.openAgentSelector.keywords": "agent, mode",
"commands.clearInput.label": "Effacer la saisie",
"commands.clearInput.description": "Effacer la zone de texte du prompt",
"commands.clearInput.keywords": "effacer, réinitialiser, prompt",
"commands.thinkingBlocks.label.show": "Afficher les blocs de réflexion",
"commands.thinkingBlocks.label.hide": "Masquer les blocs de réflexion",
"commands.thinkingBlocks.description": "Afficher/masquer le processus de réflexion de l'IA",
"commands.thinkingBlocks.keywords": "réflexion, raisonnement, basculer, afficher, masquer",
"commands.timelineToolCalls.label.show": "Afficher les appels d'outil dans la timeline",
"commands.timelineToolCalls.label.hide": "Masquer les appels d'outil dans la timeline",
"commands.timelineToolCalls.description": "Afficher/masquer les entrées d'appel d'outil dans la timeline des messages",
"commands.timelineToolCalls.keywords": "timeline, outil, basculer",
"commands.common.expanded": "Développé",
"commands.common.collapsed": "Réduit",
"commands.common.visible": "Visible",
"commands.common.hidden": "Masqué",
"commands.common.enabled": "Activé",
"commands.common.disabled": "Désactivé",
"commands.thinkingBlocksDefault.label": "Blocs de réflexion par défaut · {state}",
"commands.thinkingBlocksDefault.description": "Choisir si les blocs de réflexion démarrent développés",
"commands.thinkingBlocksDefault.keywords": "réflexion, raisonnement, développer, réduire, défaut",
"commands.diffViewSplit.label": "Utiliser la vue diff côte à côte",
"commands.diffViewSplit.description": "Afficher les diffs d'appels d'outil côte à côte",
"commands.diffViewSplit.keywords": "diff, côte à côte, vue",
"commands.diffViewUnified.label": "Utiliser la vue diff unifiée",
"commands.diffViewUnified.description": "Afficher les diffs d'appels d'outil en ligne",
"commands.diffViewUnified.keywords": "diff, unifiée, vue",
"commands.toolOutputsDefault.label": "Sorties d'outil par défaut · {state}",
"commands.toolOutputsDefault.description": "Choisir l'ouverture par défaut des sorties d'outil",
"commands.toolOutputsDefault.keywords": "outil, sortie, développer, réduire",
"commands.diagnosticsDefault.label": "Diagnostics par défaut · {state}",
"commands.diagnosticsDefault.description": "Choisir l'ouverture par défaut de la sortie des diagnostics",
"commands.diagnosticsDefault.keywords": "diagnostics, développer, réduire",
"commands.tokenUsageDisplay.label": "Affichage de l'usage des tokens · {state}",
"commands.tokenUsageDisplay.description": "Afficher ou masquer les stats de tokens et de coût pour les messages de l'assistant",
"commands.tokenUsageDisplay.keywords": "token, usage, coût, stats",
"commands.autoCleanupBlankSessions.label": "Nettoyage auto des sessions vides · {state}",
"commands.autoCleanupBlankSessions.description": "Nettoyer automatiquement les sessions vides lors de la création de nouvelles",
"commands.autoCleanupBlankSessions.keywords": "auto, nettoyage, vide, sessions, basculer",
"commands.showHelp.label": "Afficher l'aide",
"commands.showHelp.description": "Afficher les raccourcis clavier et l'aide",
"commands.showHelp.keywords": "raccourcis, aide",
"commands.custom.argumentsPrompt.message": "Arguments pour /{name}",
"commands.custom.argumentsPrompt.title": "Commande personnalisée",
"commands.custom.argumentsPrompt.inputLabel": "Arguments",
"commands.custom.argumentsPrompt.inputPlaceholder": "ex. foo bar",
"commands.custom.argumentsPrompt.confirmLabel": "Exécuter",
"commands.custom.argumentsPrompt.cancelLabel": "Annuler",
"commands.custom.argumentsPrompt.openFailed.message": "Impossible d'ouvrir l'invite d'arguments.",
"commands.custom.argumentsPrompt.openFailed.title": "Arguments de commande",
"commands.custom.entries.descriptionFallback": "Commande personnalisée",
"commands.custom.sessionRequired.message": "Sélectionnez une session avant d'exécuter une commande personnalisée.",
"commands.custom.sessionRequired.title": "Session requise",
"commands.custom.runFailed.message": "Impossible d'exécuter la commande personnalisée. Consultez la console pour les détails.",
"commands.custom.runFailed.title": "Échec de la commande",
"unifiedPicker.loading.searching": "Recherche...",
"unifiedPicker.loading.loadingWorkspace": "Chargement de l'espace de travail...",
"unifiedPicker.title.command": "Sélectionner une commande",
"unifiedPicker.title.mention": "Sélectionner un agent ou un fichier",
"unifiedPicker.empty": "Aucun résultat",
"unifiedPicker.sections.commands": "COMMANDES",
"unifiedPicker.sections.agents": "AGENTS",
"unifiedPicker.sections.files": "FICHIERS",
"unifiedPicker.badge.subagent": "sous-agent",
"unifiedPicker.footer.navigate": "naviguer",
"unifiedPicker.footer.select": "sélectionner",
"unifiedPicker.footer.close": "fermer",
} as const

View File

@@ -0,0 +1,16 @@
export const dialogMessages = {
"alertDialog.fallbackTitle.info": "Attention",
"alertDialog.fallbackTitle.warning": "Veuillez vérifier",
"alertDialog.fallbackTitle.error": "Un problème est survenu",
"alertDialog.actions.confirm": "Confirmer",
"alertDialog.actions.run": "Exécuter",
"alertDialog.actions.ok": "OK",
"alertDialog.actions.cancel": "Annuler",
"alertDialog.prompt.inputLabel": "Saisie",
"backgroundProcessOutputDialog.title": "Sortie en arrière-plan",
"backgroundProcessOutputDialog.actions.close": "Fermer",
"backgroundProcessOutputDialog.loading": "Chargement de la sortie...",
"backgroundProcessOutputDialog.truncatedNotice": "Sortie tronquée pour l'affichage.",
"backgroundProcessOutputDialog.loadErrorFallback": "Impossible de charger la sortie.",
} as const

View File

@@ -0,0 +1,43 @@
export const filesystemMessages = {
"directoryBrowser.defaultDescription": "Parcourez les dossiers sous la racine d'espace de travail configurée.",
"directoryBrowser.close": "Fermer",
"directoryBrowser.currentFolder": "Dossier actuel",
"directoryBrowser.selectCurrent": "Sélectionner le dossier actuel",
"directoryBrowser.newFolder": "Nouveau dossier",
"directoryBrowser.creating": "Création…",
"directoryBrowser.loadingFolders": "Chargement des dossiers…",
"directoryBrowser.noFolders": "Aucun dossier disponible.",
"directoryBrowser.upOneLevel": "Remonter d'un niveau",
"directoryBrowser.select": "Sélectionner",
"directoryBrowser.load.errorFallback": "Impossible de charger le système de fichiers",
"directoryBrowser.createFolder.promptMessage": "Créer un nouveau dossier dans le répertoire courant.",
"directoryBrowser.createFolder.title": "Nouveau dossier",
"directoryBrowser.createFolder.inputLabel": "Nom du dossier",
"directoryBrowser.createFolder.inputPlaceholder": "ex. mon-nouveau-projet",
"directoryBrowser.createFolder.confirmLabel": "Créer",
"directoryBrowser.createFolder.cancelLabel": "Annuler",
"directoryBrowser.createFolder.invalidNameMessage": "Veuillez saisir un seul nom de dossier.",
"directoryBrowser.createFolder.invalidNameDetail": "Les noms de dossier ne peuvent pas contenir de barres obliques, '..' ou '~'.",
"directoryBrowser.createFolder.errorFallback": "Impossible de créer le dossier",
"filesystemBrowser.descriptionFallback": "Recherchez un chemin sous la racine d'espace de travail configurée.",
"filesystemBrowser.rootLabel": "Racine : {root}",
"filesystemBrowser.actions.close": "Fermer",
"filesystemBrowser.actions.retry": "Réessayer",
"filesystemBrowser.actions.select": "Sélectionner",
"filesystemBrowser.filterLabel": "Filtrer",
"filesystemBrowser.search.placeholder.directories": "Rechercher des dossiers",
"filesystemBrowser.search.placeholder.files": "Rechercher des fichiers",
"filesystemBrowser.currentFolder.label": "Dossier actuel",
"filesystemBrowser.currentFolder.selectCurrent": "Sélectionner le dossier actuel",
"filesystemBrowser.loading.filesystem": "système de fichiers",
"filesystemBrowser.loading.workspaceRoot": "racine de l'espace de travail",
"filesystemBrowser.loading.loadingWithPath": "Chargement de {path}…",
"filesystemBrowser.empty.noEntries": "Aucune entrée trouvée.",
"filesystemBrowser.navigation.upOneLevel": "Remonter d'un niveau",
"filesystemBrowser.hints.navigate": "Naviguer",
"filesystemBrowser.hints.select": "Sélectionner",
"filesystemBrowser.hints.close": "Fermer",
"filesystemBrowser.errors.loadFilesystemFallback": "Impossible de charger le système de fichiers",
"filesystemBrowser.errors.openDirectoryFallback": "Impossible d'ouvrir le répertoire",
} as const

View File

@@ -0,0 +1,34 @@
export const folderSelectionMessages = {
"folderSelection.logoAlt": "Logo CodeNomad",
"folderSelection.tagline": "Sélectionnez un dossier pour commencer à coder avec l'IA",
"folderSelection.links.github": "GitHub de CodeNomad",
"folderSelection.links.githubStars": "Stars GitHub de CodeNomad",
"folderSelection.links.discord": "Discord de CodeNomad",
"folderSelection.empty.title": "Aucun dossier récent",
"folderSelection.empty.description": "Parcourez un dossier pour commencer",
"folderSelection.recent.title": "Dossiers récents",
"folderSelection.recent.subtitle.one": "{count} dossier disponible",
"folderSelection.recent.subtitle.other": "{count} dossiers disponibles",
"folderSelection.recent.remove": "Retirer des récents",
"folderSelection.browse.title": "Parcourir les dossiers",
"folderSelection.browse.subtitle": "Sélectionnez n'importe quel dossier sur votre ordinateur",
"folderSelection.browse.button": "Parcourir les dossiers",
"folderSelection.browse.buttonOpening": "Ouverture...",
"folderSelection.advancedSettings": "Paramètres avancés",
"folderSelection.hints.navigate": "Naviguer",
"folderSelection.hints.select": "Sélectionner",
"folderSelection.hints.remove": "Retirer",
"folderSelection.hints.browse": "Parcourir",
"folderSelection.loading.title": "Démarrage de l'instance...",
"folderSelection.loading.subtitle": "Patientez pendant que nous préparons votre espace de travail.",
"folderSelection.dialog.title": "Sélectionner l'espace de travail",
"folderSelection.dialog.description": "Sélectionnez un espace de travail pour commencer à coder.",
} as const

View File

@@ -0,0 +1,36 @@
import { advancedSettingsMessages } from "./advancedSettings"
import { appMessages } from "./app"
import { commandMessages } from "./commands"
import { dialogMessages } from "./dialogs"
import { filesystemMessages } from "./filesystem"
import { folderSelectionMessages } from "./folderSelection"
import { instanceMessages } from "./instance"
import { loadingScreenMessages } from "./loadingScreen"
import { logMessages } from "./logs"
import { markdownMessages } from "./markdown"
import { messagingMessages } from "./messaging"
import { remoteAccessMessages } from "./remoteAccess"
import { sessionMessages } from "./session"
import { settingsMessages } from "./settings"
import { timeMessages } from "./time"
import { toolCallMessages } from "./toolCall"
import { mergeMessageParts } from "../merge"
export const frMessages = mergeMessageParts(
folderSelectionMessages,
advancedSettingsMessages,
loadingScreenMessages,
timeMessages,
appMessages,
dialogMessages,
filesystemMessages,
instanceMessages,
logMessages,
sessionMessages,
messagingMessages,
toolCallMessages,
markdownMessages,
settingsMessages,
remoteAccessMessages,
commandMessages,
)

View File

@@ -0,0 +1,125 @@
export const instanceMessages = {
"instanceTabs.new.title": "Nouvelle instance (Cmd/Ctrl+N)",
"instanceTabs.new.ariaLabel": "Nouvelle instance",
"instanceTabs.remote.title": "Connexion à distance",
"instanceTabs.remote.ariaLabel": "Connexion à distance",
"instanceInfo.title": "Informations de l'instance",
"instanceInfo.labels.folder": "Dossier",
"instanceInfo.labels.project": "Projet",
"instanceInfo.labels.versionControl": "Contrôle de version",
"instanceInfo.labels.opencodeVersion": "Version d'OpenCode",
"instanceInfo.labels.binaryPath": "Chemin du binaire",
"instanceInfo.labels.environmentVariables": "Variables d'environnement ({count})",
"instanceInfo.loading": "Chargement...",
"instanceInfo.server.title": "Serveur",
"instanceInfo.server.port": "Port :",
"instanceInfo.server.pid": "PID :",
"instanceInfo.server.status": "Statut :",
"instanceTab.status.permission": "En attente d'autorisation",
"instanceTab.status.compacting": "Compactage",
"instanceTab.status.working": "En cours",
"instanceTab.status.idle": "Inactif",
"instanceTab.status.ariaLabel": "Statut de l'instance : {status}",
"instanceTab.actions.close.ariaLabel": "Fermer l'instance",
"instanceShell.leftPanel.sessionsTitle": "Sessions",
"instanceShell.leftPanel.instanceInfo": "Infos de l'instance",
"instanceShell.leftDrawer.pin": "Épingler le tiroir gauche",
"instanceShell.leftDrawer.unpin": "Désépingler le tiroir gauche",
"instanceShell.leftDrawer.toggle.pinned": "Tiroir gauche épinglé",
"instanceShell.leftDrawer.toggle.open": "Ouvrir le tiroir gauche",
"instanceShell.leftDrawer.toggle.close": "Fermer le tiroir gauche",
"instanceShell.rightDrawer.pin": "Épingler le tiroir droit",
"instanceShell.rightDrawer.unpin": "Désépingler le tiroir droit",
"instanceShell.rightDrawer.toggle.pinned": "Tiroir droit épinglé",
"instanceShell.rightDrawer.toggle.open": "Ouvrir le tiroir droit",
"instanceShell.rightDrawer.toggle.close": "Fermer le tiroir droit",
"instanceShell.metrics.usedLabel": "Utilisé",
"instanceShell.metrics.availableLabel": "Dispo",
"instanceShell.commandPalette.openAriaLabel": "Ouvrir la palette de commandes",
"instanceShell.commandPalette.button": "Palette de commandes",
"instanceShell.connection.ariaLabel": "Connexion {status}",
"instanceShell.connection.connected": "Connecté",
"instanceShell.connection.connecting": "Connexion...",
"instanceShell.connection.disconnected": "Déconnecté",
"instanceShell.connection.unknown": "Inconnu",
"instanceWelcome.shortcuts.newSession": "Nouvelle session",
"instanceWelcome.empty.title": "Aucune session précédente",
"instanceWelcome.empty.description": "Créez une nouvelle session ci-dessous pour commencer",
"instanceWelcome.loading.title": "Chargement des sessions",
"instanceWelcome.loading.description": "Récupération de vos sessions précédentes...",
"instanceWelcome.resume.title": "Reprendre une session",
"instanceWelcome.resume.subtitle.one": "{count} session disponible",
"instanceWelcome.resume.subtitle.other": "{count} sessions disponibles",
"instanceWelcome.session.untitled": "Session sans titre",
"instanceWelcome.new.title": "Démarrer une nouvelle session",
"instanceWelcome.new.subtitle": "Nous réutiliserons automatiquement votre dernier agent/modèle",
"instanceWelcome.new.createButton": "Créer la session",
"instanceWelcome.overlay.close": "Fermer",
"instanceWelcome.actions.viewInstanceInfo": "Voir les infos de l'instance",
"instanceWelcome.actions.renameTitle": "Renommer la session",
"instanceWelcome.actions.deleteTitle": "Supprimer la session",
"instanceWelcome.hints.navigate": "Naviguer",
"instanceWelcome.hints.jump": "Sauter",
"instanceWelcome.hints.firstLast": "Prem./Dern.",
"instanceWelcome.hints.resume": "Reprendre",
"instanceWelcome.hints.delete": "Supprimer",
"instanceWelcome.toasts.renameError": "Impossible de renommer la session",
"instanceDisconnected.title": "Instance déconnectée",
"instanceDisconnected.folderFallback": "cet espace de travail",
"instanceDisconnected.reasonFallback": "Le serveur ne répond plus",
"instanceDisconnected.description": "{folder} n'est plus accessible. Fermez l'onglet pour continuer à travailler.",
"instanceDisconnected.details.title": "Détails",
"instanceDisconnected.details.folderLabel": "Dossier :",
"instanceDisconnected.actions.closeInstance": "Fermer l'instance",
"instanceShell.empty.title": "Aucune session sélectionnée",
"instanceShell.empty.description": "Sélectionnez une session pour voir les messages",
"instanceShell.rightPanel.title": "Panneau d'état",
"instanceShell.rightPanel.sections.plan": "Plan",
"instanceShell.rightPanel.sections.backgroundProcesses": "Shells en arrière-plan",
"instanceShell.rightPanel.sections.mcp": "Serveurs MCP",
"instanceShell.rightPanel.sections.lsp": "Serveurs LSP",
"instanceShell.rightPanel.sections.plugins": "Plugins",
"instanceShell.plan.noSessionSelected": "Sélectionnez une session pour voir le plan.",
"instanceShell.plan.empty": "Aucun plan pour l'instant.",
"instanceShell.backgroundProcesses.empty": "Aucun processus en arrière-plan.",
"instanceShell.backgroundProcesses.status": "Statut : {status}",
"instanceShell.backgroundProcesses.output": "Sortie : {sizeKb}KB",
"instanceShell.backgroundProcesses.actions.output": "Sortie",
"instanceShell.backgroundProcesses.actions.stop": "Arrêter",
"instanceShell.backgroundProcesses.actions.terminate": "Terminer",
"versionPill.appWithVersion": "Appli {version}",
"versionPill.ui": "UI",
"versionPill.uiWithVersion": "UI {version}",
"versionPill.source": " ({source})",
"opencodeBinarySelector.title": "Binaire OpenCode",
"opencodeBinarySelector.subtitle": "Choisissez quel exécutable OpenCode doit lancer",
"opencodeBinarySelector.customPath.placeholder": "Saisissez le chemin vers le binaire opencode…",
"opencodeBinarySelector.actions.add": "Ajouter",
"opencodeBinarySelector.actions.browse": "Parcourir le binaire…",
"opencodeBinarySelector.actions.removeTitle": "Supprimer le binaire",
"opencodeBinarySelector.badge.systemPath": "Utiliser le binaire depuis le PATH système",
"opencodeBinarySelector.status.checkingVersions": "Vérification des versions…",
"opencodeBinarySelector.status.checking": "Vérification…",
"opencodeBinarySelector.dialog.title": "Sélectionner le binaire OpenCode",
"opencodeBinarySelector.dialog.description": "Parcourez les fichiers exposés par le serveur CLI.",
"opencodeBinarySelector.validation.invalidBinary": "Binaire OpenCode invalide",
"opencodeBinarySelector.validation.alreadyValidating": "Validation déjà en cours",
"opencodeBinarySelector.display.systemPath": "{name} (PATH système)",
"opencodeBinarySelector.versionLabel": "v{version}",
} as const

View File

@@ -0,0 +1,17 @@
export const loadingScreenMessages = {
"loadingScreen.logoAlt": "Logo CodeNomad",
"loadingScreen.status.issue": "Un problème est survenu",
"loadingScreen.actions.showAnother": "En afficher un autre",
"loadingScreen.errors.missingRoot": "Élément racine de chargement introuvable",
"loadingScreen.phrases.neurons": "Réchauffage des neurones de l'IA…",
"loadingScreen.phrases.daydreaming": "On convainc l'IA d'arrêter de rêvasser…",
"loadingScreen.phrases.goggles": "Polissage des lunettes de code de l'IA…",
"loadingScreen.phrases.reorganizingFiles": "On demande à l'IA d'arrêter de réorganiser vos fichiers…",
"loadingScreen.phrases.coffee": "On donne un café supplémentaire à l'IA…",
"loadingScreen.phrases.nodeModules": "On apprend à l'IA à ne pas supprimer node_modules (encore)…",
"loadingScreen.phrases.actNatural": "On dit à l'IA d'avoir l'air naturel avant votre arrivée…",
"loadingScreen.phrases.rewritingHistory": "On demande à l'IA d'arrêter de réécrire l'histoire…",
"loadingScreen.phrases.stretch": "On laisse l'IA s'étirer avant son sprint de code…",
"loadingScreen.phrases.keyboardControl": "On persuade l'IA de vous rendre le contrôle du clavier…",
} as const

View File

@@ -0,0 +1,18 @@
export const logMessages = {
"logsView.title": "Journaux du serveur",
"logsView.actions.show": "Afficher les journaux du serveur",
"logsView.actions.hide": "Masquer les journaux du serveur",
"logsView.envVars.title": "Variables d'environnement ({count})",
"logsView.paused.title": "Les journaux du serveur sont en pause",
"logsView.paused.description": "Activez le streaming pour suivre l'activité de votre serveur OpenCode.",
"logsView.empty.waiting": "En attente de la sortie du serveur...",
"logsView.scrollToBottom": "Aller en bas",
"infoView.logs.title": "Journaux du serveur",
"infoView.logs.actions.show": "Afficher les journaux du serveur",
"infoView.logs.actions.hide": "Masquer les journaux du serveur",
"infoView.logs.paused.title": "Les journaux du serveur sont en pause",
"infoView.logs.paused.description": "Activez le streaming pour suivre l'activité de votre serveur OpenCode.",
"infoView.logs.empty.waiting": "En attente de la sortie du serveur...",
"infoView.logs.scrollToBottom": "Aller en bas",
} as const

View File

@@ -0,0 +1,7 @@
export const markdownMessages = {
"markdown.codeBlock.copy.label": "Copier",
"markdown.codeBlock.copy.copied": "Copié !",
"markdown.codeBlock.copy.failed": "Échec",
"markdown.copy": "Copier",
} as const

View File

@@ -0,0 +1,109 @@
export const messagingMessages = {
"messageListHeader.sidebar.openSessionListAriaLabel": "Ouvrir la liste des sessions",
"messageListHeader.metrics.usedLabel": "Utilisé",
"messageListHeader.metrics.availableLabel": "Dispo",
"messageListHeader.commandPalette.ariaLabel": "Ouvrir la palette de commandes",
"messageListHeader.commandPalette.button": "Palette de commandes",
"messageListHeader.connection.connected": "Connecté",
"messageListHeader.connection.connecting": "Connexion...",
"messageListHeader.connection.disconnected": "Déconnecté",
"messageSection.empty.logoAlt": "Logo CodeNomad",
"messageSection.empty.brandTitle": "CodeNomad",
"messageSection.empty.title": "Démarrer une conversation",
"messageSection.empty.description": "Saisissez un message ci-dessous ou ouvrez la palette de commandes :",
"messageSection.empty.tips.commandPalette": "Palette de commandes",
"messageSection.empty.tips.askAboutCodebase": "Parler de votre codebase",
"messageSection.empty.tips.attachFilesPrefix": "Joindre des fichiers avec",
"messageSection.loading.messages": "Chargement des messages...",
"messageSection.scroll.toFirstAriaLabel": "Aller au premier message",
"messageSection.scroll.toLatestAriaLabel": "Aller au dernier message",
"messageSection.quote.addAsQuote": "Ajouter en citation",
"messageSection.quote.addAsCode": "Ajouter en code",
"messageTimeline.ariaLabel": "Chronologie des messages",
"messageTimeline.segment.user.label": "Vous",
"messageTimeline.segment.assistant.label": "Asst",
"messageTimeline.segment.compaction.label": "Compaction",
"messageTimeline.tool.fallbackLabel": "Appel d'outil",
"messageTimeline.tooltip.userFallback": "Message utilisateur",
"messageTimeline.tooltip.assistantFallback": "Réponse de l'assistant",
"messageTimeline.tooltip.compaction.auto": "Compaction auto",
"messageTimeline.tooltip.compaction.manual": "Compaction utilisateur",
"messageTimeline.text.filePrefix": "[Fichier] {filename}",
"messageTimeline.text.attachment": "Pièce jointe",
"messageBlock.tool.header": "Appel d'outil",
"messageBlock.tool.unknown": "inconnu",
"messageBlock.tool.goToSession.label": "Aller à la session",
"messageBlock.tool.goToSession.title": "Aller à la session",
"messageBlock.tool.goToSession.unavailableTitle": "Session pas encore disponible",
"messageBlock.compaction.ariaLabel": "Compaction de la session",
"messageBlock.compaction.autoLabel": "Session compactée automatiquement",
"messageBlock.compaction.manualLabel": "Session compactée par vous",
"messageBlock.usage.input": "Entrée",
"messageBlock.usage.output": "Sortie",
"messageBlock.usage.reasoning": "Raisonnement",
"messageBlock.usage.cacheRead": "Lecture du cache",
"messageBlock.usage.cacheWrite": "Écriture du cache",
"messageBlock.usage.cost": "Coût",
"messageBlock.step.agentLabel": "Agent : {agent}",
"messageBlock.step.modelLabel": "Modèle : {model}",
"messageBlock.reasoning.thinkingLabel": "Réflexion",
"messageBlock.reasoning.expandAriaLabel": "Développer la réflexion",
"messageBlock.reasoning.collapseAriaLabel": "Réduire la réflexion",
"messageBlock.reasoning.indicator.hide": "Masquer",
"messageBlock.reasoning.indicator.view": "Voir",
"messageBlock.reasoning.detailsAriaLabel": "Détails du raisonnement",
"codeBlockInline.actions.copy": "Copier",
"codeBlockInline.actions.copied": "Copié !",
"messageItem.speaker.you": "Vous",
"messageItem.speaker.assistant": "Assistant",
"messageItem.actions.revert": "Revenir",
"messageItem.actions.revertTitle": "Revenir à ce message",
"messageItem.actions.fork": "Fork",
"messageItem.actions.forkTitle": "Fork depuis ce message",
"messageItem.actions.copy": "Copier",
"messageItem.actions.copyTitle": "Copier le message",
"messageItem.actions.copied": "Copié !",
"messageItem.status.queued": "EN FILE",
"messageItem.status.generating": "Génération...",
"messageItem.status.sending": "Envoi...",
"messageItem.status.failedToSend": "Échec de l'envoi du message",
"messageItem.attachment.defaultName": "piece-jointe",
"messageItem.attachment.downloadAriaLabel": "Télécharger {name}",
"messageItem.agentMeta.agentLabel": "Agent : {agent}",
"messageItem.agentMeta.modelLabel": "Modèle : {model}",
"messageItem.errors.authenticationFallback": "Erreur d'authentification",
"messageItem.errors.outputLengthExceeded": "Longueur de sortie du message dépassée",
"messageItem.errors.requestAborted": "La requête a été annulée",
"messageItem.errors.unknownFallback": "Une erreur inconnue est survenue",
"attachmentChip.removeAriaLabel": "Retirer la pièce jointe",
"expandButton.toggleAriaLabel": "Basculer la hauteur de la zone de saisie",
"promptInput.placeholder.shell": "Exécuter une commande shell (Esc pour quitter)...",
"promptInput.placeholder.default": "Tapez votre message, @fichier, @agent, ou collez des images et du texte...",
"promptInput.hints.shell.exit": "pour quitter le mode shell",
"promptInput.hints.shell.enable": "Mode shell",
"promptInput.hints.commands": "Commandes",
"promptInput.history.previousAriaLabel": "Prompt précédent",
"promptInput.history.nextAriaLabel": "Prompt suivant",
"promptInput.overlay.newLine": "Nouvelle ligne",
"promptInput.overlay.send": "Envoyer",
"promptInput.overlay.filesAgents": "Fichiers/agents",
"promptInput.overlay.history": "Historique",
"promptInput.overlay.attachments": "• {count} fichier(s) joint(s)",
"promptInput.overlay.shellModeActive": "Mode shell actif",
"promptInput.overlay.press": "Appuyez sur",
"promptInput.overlay.againToAbort": "à nouveau pour interrompre la session",
"promptInput.stopSession.ariaLabel": "Arrêter la session",
"promptInput.stopSession.title": "Arrêter la session",
"promptInput.send.ariaLabel": "Envoyer le message",
"promptInput.send.errorFallback": "Impossible d'envoyer le message",
"promptInput.send.errorTitle": "Échec de l'envoi",
} as const

View File

@@ -0,0 +1,51 @@
export const remoteAccessMessages = {
"remoteAccess.eyebrow": "Passation à distance",
"remoteAccess.title": "Se connecter à CodeNomad à distance",
"remoteAccess.subtitle": "Utilisez les adresses ci-dessous pour ouvrir CodeNomad depuis un autre appareil.",
"remoteAccess.close": "Fermer l'accès à distance",
"remoteAccess.refresh": "Rafraîchir",
"remoteAccess.sections.listeningMode.label": "Mode d'écoute",
"remoteAccess.sections.listeningMode.help": "Autorisez ou limitez les passations à distance en écoutant sur toutes les interfaces ou uniquement sur localhost.",
"remoteAccess.toggle.on": "Activé",
"remoteAccess.toggle.off": "Désactivé",
"remoteAccess.toggle.title": "Autoriser les connexions depuis d'autres IP",
"remoteAccess.toggle.caption.all": "Écoute sur 0.0.0.0",
"remoteAccess.toggle.caption.local": "Écoute sur 127.0.0.1",
"remoteAccess.toggle.note": "Modifier ceci nécessite un redémarrage et stoppe temporairement toutes les instances actives. Partagez les adresses ci-dessous une fois le serveur redémarré.",
"remoteAccess.listeningMode.restartConfirm.message": "Redémarrer pour appliquer le mode d'écoute ? Cela arrêtera toutes les instances en cours.",
"remoteAccess.listeningMode.restartConfirm.title.all": "Ouvrir aux autres appareils",
"remoteAccess.listeningMode.restartConfirm.title.local": "Limiter à cet appareil",
"remoteAccess.listeningMode.restartConfirm.confirmLabel": "Redémarrer maintenant",
"remoteAccess.listeningMode.restartConfirm.cancelLabel": "Annuler",
"remoteAccess.restart.errorManual": "Impossible de redémarrer automatiquement. Veuillez redémarrer l'application pour appliquer le changement.",
"remoteAccess.sections.serverPassword.label": "Mot de passe du serveur",
"remoteAccess.sections.serverPassword.help": "Les passations à distance nécessitent un mot de passe. Définissez-en un facile à retenir pour autoriser la connexion depuis d'autres appareils.",
"remoteAccess.authStatus.unavailable": "Statut d'authentification indisponible.",
"remoteAccess.username": "Nom d'utilisateur : {username}",
"remoteAccess.password.status.set": "Un mot de passe est défini pour l'accès à distance.",
"remoteAccess.password.status.unset": "Aucun mot de passe mémorable n'est encore défini. Définissez-en un pour autoriser les connexions à distance.",
"remoteAccess.password.actions.cancel": "Annuler",
"remoteAccess.password.actions.change": "Changer le mot de passe",
"remoteAccess.password.actions.set": "Définir le mot de passe",
"remoteAccess.password.form.newPassword": "Nouveau mot de passe",
"remoteAccess.password.form.confirmPassword": "Confirmer le mot de passe",
"remoteAccess.password.form.placeholder": "Au moins 8 caractères",
"remoteAccess.password.error.tooShort": "Le mot de passe doit contenir au moins 8 caractères.",
"remoteAccess.password.error.mismatch": "Les mots de passe ne correspondent pas.",
"remoteAccess.password.save.saving": "Enregistrement…",
"remoteAccess.password.save.label": "Enregistrer le mot de passe",
"remoteAccess.sections.addresses.label": "Adresses accessibles",
"remoteAccess.sections.addresses.help": "Lancez ou scannez depuis une autre machine pour passer le contrôle.",
"remoteAccess.addresses.loading": "Chargement des adresses…",
"remoteAccess.addresses.none": "Aucune adresse disponible pour le moment.",
"remoteAccess.address.scope.network": "Réseau",
"remoteAccess.address.scope.loopback": "Boucle locale",
"remoteAccess.address.scope.internal": "Interne",
"remoteAccess.address.open": "Ouvrir",
"remoteAccess.address.showQr": "Afficher le QR",
"remoteAccess.address.hideQr": "Masquer le QR",
"remoteAccess.address.qrAlt": "QR pour {url}",
} as const

View File

@@ -0,0 +1,67 @@
export const sessionMessages = {
"sessionPicker.title": "OpenCode • {folder}",
"sessionPicker.empty.noPrevious": "Aucune session précédente",
"sessionPicker.resume.title": "Reprendre une session ({count}) :",
"sessionPicker.session.untitled": "Sans titre",
"sessionPicker.divider.or": "ou",
"sessionPicker.new.title": "Démarrer une nouvelle session :",
"sessionPicker.agents.loading": "Chargement des agents...",
"sessionPicker.actions.creating": "Création...",
"sessionPicker.actions.createSession": "Créer une session",
"sessionPicker.actions.cancel": "Annuler",
"sessionList.header.title": "Sessions",
"sessionList.session.untitled": "Sans titre",
"sessionList.status.working": "En cours",
"sessionList.status.compacting": "Compactage",
"sessionList.status.idle": "Inactif",
"sessionList.status.needsPermission": "Autorisation requise",
"sessionList.status.needsInput": "Entrée requise",
"sessionList.expand.collapseAriaLabel": "Réduire la session",
"sessionList.expand.expandAriaLabel": "Développer la session",
"sessionList.expand.collapseTitle": "Réduire",
"sessionList.expand.expandTitle": "Développer",
"sessionList.actions.copyId.ariaLabel": "Copier l'ID de session",
"sessionList.actions.copyId.title": "Copier l'ID de session",
"sessionList.actions.rename.ariaLabel": "Renommer la session",
"sessionList.actions.rename.title": "Renommer la session",
"sessionList.actions.delete.ariaLabel": "Supprimer la session",
"sessionList.actions.delete.title": "Supprimer la session",
"sessionList.copyId.success": "ID de session copié",
"sessionList.copyId.error": "Impossible de copier l'ID de session",
"sessionList.delete.error": "Impossible de supprimer la session",
"sessionList.rename.error": "Impossible de renommer la session",
"sessionRenameDialog.title": "Renommer la session",
"sessionRenameDialog.description.withLabel": "Mettre à jour le titre de \"{label}\".",
"sessionRenameDialog.description.default": "Définir un nouveau titre pour cette session.",
"sessionRenameDialog.input.label": "Nom de la session",
"sessionRenameDialog.input.placeholder": "Saisissez un nom de session",
"sessionRenameDialog.actions.cancel": "Annuler",
"sessionRenameDialog.actions.rename": "Renommer",
"sessionRenameDialog.actions.renaming": "Renommage…",
"sessionView.fallback.sessionNotFound": "Session introuvable",
"sessionView.alerts.abortFailed.message": "Impossible d'arrêter la session",
"sessionView.alerts.abortFailed.title": "Échec de l'arrêt",
"sessionView.alerts.revertFailed.message": "Impossible de revenir au message",
"sessionView.alerts.revertFailed.title": "Échec du retour",
"sessionView.alerts.forkFailed.message": "Impossible de forker la session",
"sessionView.alerts.forkFailed.title": "Échec du fork",
"sessionView.attachments.expandPastedTextAriaLabel": "Développer le texte collé",
"sessionView.attachments.insertPastedTextTitle": "Insérer le texte collé",
"sessionView.attachments.removeAriaLabel": "Retirer la pièce jointe",
"sessionEvents.sessionCompactedToast": "La session {label} a été compactée",
"sessionEvents.sessionError.unknown": "Erreur inconnue",
"sessionEvents.sessionError.title": "Erreur de session",
"sessionEvents.sessionError.message": "Erreur : {message}",
"sessionState.cleanup.deepConfirm.message": "Ce nettoyage peut être lent et peut supprimer des sessions que vous ne vouliez pas supprimer. Confirmez-vous ?",
"sessionState.cleanup.deepConfirm.title": "Nettoyage approfondi des sessions",
"sessionState.cleanup.deepConfirm.detail": "Le nettoyage approfondi des sessions supprime toutes les sessions sans messages, retire les sessions de sous-agent terminées et efface les forks inutilisés d'une session.",
"sessionState.cleanup.deepConfirm.confirmLabel": "Continuer",
"sessionState.cleanup.deepConfirm.cancelLabel": "Annuler",
"sessionState.cleanup.toast.one": "Nettoyage de {count} session vide",
"sessionState.cleanup.toast.other": "Nettoyage de {count} sessions vides",
} as const

View File

@@ -0,0 +1,54 @@
export const settingsMessages = {
"instanceServiceStatus.sections.lsp": "Serveurs LSP",
"instanceServiceStatus.sections.mcp": "Serveurs MCP",
"instanceServiceStatus.sections.plugins": "Plugins",
"instanceServiceStatus.lsp.loading": "Chargement des serveurs LSP...",
"instanceServiceStatus.lsp.empty": "Aucun serveur LSP détecté.",
"instanceServiceStatus.lsp.status.connected": "Connecté",
"instanceServiceStatus.lsp.status.error": "Erreur",
"instanceServiceStatus.mcp.loading": "Chargement des serveurs MCP...",
"instanceServiceStatus.mcp.empty": "Aucun serveur MCP détecté.",
"instanceServiceStatus.mcp.toggleAriaLabel": "Basculer le serveur MCP {name}",
"instanceServiceStatus.plugins.loading": "Chargement des plugins...",
"instanceServiceStatus.plugins.empty": "Aucun plugin configuré.",
"permissionBanner.pendingRequests.one": "{count} demande en attente",
"permissionBanner.pendingRequests.other": "{count} demandes en attente",
"permissionBanner.detail.permission.one": "{count} autorisation",
"permissionBanner.detail.permission.other": "{count} autorisations",
"permissionBanner.detail.question.one": "{count} question",
"permissionBanner.detail.question.other": "{count} questions",
"permissionBanner.detail.wrapper": " ({detail})",
"agentSelector.placeholder": "Sélectionner un agent...",
"agentSelector.badge.subagent": "sous-agent",
"agentSelector.none": "Aucun",
"agentSelector.trigger.primary": "Agent : {agent}",
"modelSelector.placeholder.search": "Rechercher des modèles...",
"modelSelector.none": "Aucun",
"modelSelector.trigger.primary": "Modèle : {model}",
"thinkingSelector.variant.default": "Par défaut",
"thinkingSelector.label": "Réflexion : {variant}",
"envEditor.title": "Variables d'environnement",
"envEditor.count.one": "({count} variable)",
"envEditor.count.other": "({count} variables)",
"envEditor.fields.name.placeholder": "Nom de la variable",
"envEditor.fields.name.readOnlyTitle": "Nom de la variable (lecture seule)",
"envEditor.fields.value.placeholder": "Valeur de la variable",
"envEditor.actions.remove.title": "Supprimer la variable",
"envEditor.actions.add.title": "Ajouter une variable",
"envEditor.empty": "Aucune variable d'environnement configurée. Ajoutez des variables ci-dessus pour personnaliser l'environnement OpenCode.",
"envEditor.help": "Ces variables seront disponibles dans l'environnement OpenCode lors du démarrage des instances.",
"contextUsagePanel.headings.tokens": "Tokens",
"contextUsagePanel.headings.context": "Contexte",
"contextUsagePanel.labels.input": "Entrée",
"contextUsagePanel.labels.output": "Sortie",
"contextUsagePanel.labels.cost": "Coût",
"contextUsagePanel.labels.used": "Utilisé",
"contextUsagePanel.labels.available": "Dispo",
"contextUsagePanel.unavailable": "--",
} as const

View File

@@ -0,0 +1,6 @@
export const timeMessages = {
"time.relative.justNow": "à l'instant",
"time.relative.daysAgoShort": "il y a {count} j",
"time.relative.hoursAgoShort": "il y a {count} h",
"time.relative.minutesAgoShort": "il y a {count} min",
} as const

View File

@@ -0,0 +1,121 @@
export const toolCallMessages = {
"toolCall.pending.waitingToRun": "En attente d'exécution...",
"toolCall.error.label": "Erreur :",
"toolCall.diff.label": "Diff",
"toolCall.diff.label.withPath": "Diff · {path}",
"toolCall.diff.viewMode.ariaLabel": "Mode d'affichage du diff",
"toolCall.diff.viewMode.split": "Côte à côte",
"toolCall.diff.viewMode.unified": "Unifié",
"toolCall.diagnostics.title": "Diagnostics",
"toolCall.diagnostics.ariaLabel": "Diagnostics",
"toolCall.diagnostics.ariaLabel.withLabel": "Diagnostics {label}",
"toolCall.diagnostics.severity.error.short": "ERR",
"toolCall.diagnostics.severity.warning.short": "WARN",
"toolCall.diagnostics.severity.info.short": "INFO",
"toolCall.renderer.toolName.shell": "Shell",
"toolCall.renderer.toolName.fetch": "Fetch",
"toolCall.renderer.toolName.invalid": "Invalide",
"toolCall.renderer.toolName.plan": "Plan",
"toolCall.renderer.toolName.applyPatch": "Appliquer le patch",
"toolCall.renderer.action.working": "En cours...",
"toolCall.renderer.action.writingCommand": "Rédaction de la commande...",
"toolCall.renderer.action.preparingEdit": "Préparation de la modification...",
"toolCall.renderer.action.readingFile": "Lecture du fichier...",
"toolCall.renderer.action.preparingWrite": "Préparation de l'écriture...",
"toolCall.renderer.action.preparingPatch": "Préparation du patch...",
"toolCall.renderer.action.planning": "Planification...",
"toolCall.renderer.action.fetchingFromWeb": "Récupération sur le Web...",
"toolCall.renderer.action.findingFiles": "Recherche de fichiers...",
"toolCall.renderer.action.searchingContent": "Recherche dans le contenu...",
"toolCall.renderer.action.listingDirectory": "Liste du répertoire...",
"toolCall.renderer.bash.title.timeout": "Délai : {timeout}",
"toolCall.renderer.read.detail.offset": "Décalage : {offset}",
"toolCall.renderer.read.detail.limit": "Limite : {limit}",
"toolCall.renderer.todo.empty": "Aucun élément de plan pour l'instant.",
"toolCall.renderer.todo.status.pending": "En attente",
"toolCall.renderer.todo.status.inProgress": "En cours",
"toolCall.renderer.todo.status.completed": "Terminé",
"toolCall.renderer.todo.status.cancelled": "Annulé",
"toolCall.renderer.todo.title.plan": "Plan",
"toolCall.renderer.todo.title.creating": "Création du plan",
"toolCall.renderer.todo.title.completing": "Finalisation du plan",
"toolCall.renderer.todo.title.updating": "Mise à jour du plan",
"toolCall.permission.status.required": "Autorisation requise",
"toolCall.permission.status.queued": "Autorisation en file d'attente",
"toolCall.permission.requestedDiff.label": "Diff demandé",
"toolCall.permission.requestedDiff.withPath": "Diff demandé · {path}",
"toolCall.permission.queuedText": "En attente des réponses d'autorisations précédentes.",
"toolCall.permission.actions.allowOnce": "Autoriser une fois",
"toolCall.permission.actions.alwaysAllow": "Toujours autoriser",
"toolCall.permission.actions.deny": "Refuser",
"toolCall.permission.shortcuts.allowOnce": "Autoriser une fois",
"toolCall.permission.shortcuts.alwaysAllow": "Toujours autoriser",
"toolCall.permission.shortcuts.deny": "Refuser",
"toolCall.permission.errors.unableToUpdate": "Impossible de mettre à jour l'autorisation",
"permissionApproval.title": "Demandes",
"permissionApproval.empty": "Aucune demande en attente.",
"permissionApproval.kind.permission": "Autorisation",
"permissionApproval.kind.question": "Question",
"permissionApproval.questionCount.one": "{count} question",
"permissionApproval.questionCount.other": "{count} questions",
"permissionApproval.status.active": "Active",
"permissionApproval.actions.closeAriaLabel": "Fermer",
"permissionApproval.actions.goToSession": "Aller à la session",
"permissionApproval.actions.loadingSession": "Chargement…",
"permissionApproval.actions.loadSession": "Charger la session",
"permissionApproval.actions.allowOnce": "Autoriser une fois",
"permissionApproval.actions.alwaysAllow": "Toujours autoriser",
"permissionApproval.actions.deny": "Refuser",
"permissionApproval.fallbackHint": "Chargez la session pour plus d'informations.",
"permissionApproval.errors.unableToUpdatePermission": "Impossible de mettre à jour l'autorisation",
"toolCall.question.status.required": "Question requise",
"toolCall.question.status.queued": "Question en file d'attente",
"toolCall.question.status.questions": "Questions",
"toolCall.question.action.awaitingAnswers": "En attente des réponses...",
"toolCall.question.title.questions": "Questions",
"toolCall.question.title.askingQuestions": "Questions en cours",
"toolCall.question.type.one": "Question",
"toolCall.question.type.other": "Questions",
"toolCall.question.number": "Q{number}:",
"toolCall.question.multiple": "Multiple",
"toolCall.question.custom.title": "Saisir une réponse personnalisée",
"toolCall.question.custom.label": "Réponse personnalisée",
"toolCall.question.custom.placeholder": "Saisissez votre propre réponse",
"toolCall.question.actions.submit": "Envoyer",
"toolCall.question.actions.dismiss": "Ignorer",
"toolCall.question.shortcuts.submit": "Envoyer",
"toolCall.question.shortcuts.dismiss": "Ignorer",
"toolCall.question.queuedText": "En attente des réponses précédentes.",
"toolCall.question.validation.answerAll": "Veuillez répondre à toutes les questions avant d'envoyer.",
"toolCall.question.errors.unableToReply": "Impossible de répondre",
"toolCall.question.errors.unableToDismiss": "Impossible d'ignorer",
"toolCall.task.action.delegating": "Délégation...",
"toolCall.task.sections.prompt": "Prompt",
"toolCall.task.sections.steps": "Étapes",
"toolCall.task.sections.output": "Sortie",
"toolCall.task.steps.count": "{count} étapes",
"toolCall.task.meta.agentModel": "Agent : {agent} • Modèle : {model}",
"toolCall.task.meta.agent": "Agent : {agent}",
"toolCall.task.meta.model": "Modèle : {model}",
"toolCall.status.pending": "En attente",
"toolCall.status.running": "En cours",
"toolCall.status.completed": "Terminé",
"toolCall.status.error": "Erreur",
"toolCall.status.unknown": "Inconnu",
"toolCall.applyPatch.action.preparing": "Préparation de apply_patch...",
"toolCall.applyPatch.title.withFileCount.one": "{tool} ({count} fichier)",
"toolCall.applyPatch.title.withFileCount.other": "{tool} ({count} fichiers)",
"toolCall.applyPatch.fileFallback": "Fichier {number}",
} as const