import type { TranslationMap } from "../lib/types.ts";

// Generated by scripts/control-ui-i18n.ts.
export const fr: TranslationMap = {
  common: {
    health: "Santé",
    ok: "OK",
    yes: "Oui",
    no: "Non",
    active: "Actif",
    loading: "Chargement…",
    refreshing: "Actualisation…",
    online: "En ligne",
    offline: "Hors ligne",
    connect: "Connecter",
    connected: "Connecté",
    refresh: "Actualiser",
    reload: "Recharger",
    reset: "Réinitialiser",
    probe: "Sonder",
    call: "Appeler",
    confirm: "Confirmer",
    cancel: "Annuler",
    next: "Prochaine",
    back: "Retour",
    create: "Créer",
    copy: "Copier",
    copied: "Copié !",
    copyCode: "Copier le code",
    delete: "Supprimer",
    dismiss: "Ignorer",
    unselect: "Désélectionner",
    enabled: "Activé",
    disabled: "Désactivé",
    none: "aucun",
    na: "n/d",
    never: "never",
    configured: "Configuré",
    running: "En cours d’exécution",
    linked: "Lié",
    mode: "Mode",
    system: "Système",
    light: "Léger",
    dark: "Sombre",
    baseUrl: "URL de base",
    lastStart: "Dernier démarrage",
    lastProbe: "Dernière sonde",
    lastInbound: "Dernière entrée",
    lastConnect: "Dernière connexion",
    lastMessage: "Dernier message",
    authAge: "Âge de l’authentification",
    credential: "Identifiant",
    audience: "Audience",
    publicKey: "Clé publique",
    probeOk: "Sonde réussie",
    probeFailed: "Échec de la sonde",
    reloadConfig: "Recharger la config",
    loadConfig: "Charger la config",
    loadApprovals: "Charger les approbations",
    settingsSections: "Sections des paramètres",
    version: "Version",
    docs: "Documentation",
    theme: "Thème",
    colorMode: "Mode de couleur",
    colorModeOption: "Mode de couleur : {mode}",
    resources: "Ressources",
    search: "Rechercher",
    save: "Enregistrer",
    saving: "Enregistrement…",
    saveAndPublish: "Enregistrer et publier",
    importing: "Importation…",
    importFromRelays: "Importer depuis les Relays",
    showAdvanced: "Afficher les options avancées",
    hideAdvanced: "Masquer les options avancées",
    unsavedChanges: "Vous avez des modifications non enregistrées",
    secondsAgo: "il y a {count}s",
    working: "Traitement…",
    showQr: "Afficher le QR",
    relink: "Relier à nouveau",
    waitForScan: "Attendre le scan",
    logout: "Se déconnecter",
  },
  channels: {
    health: {
      title: "Santé du canal",
      subtitle: "Instantanés de l’état du canal depuis le gateway.",
      noSnapshotYet: "Aucun instantané pour le moment.",
    },
    generic: {
      subtitle: "État et configuration du canal.",
    },
    gatewayUrlConfirmation: {
      title: "Changer l’URL du Gateway",
      subtitle: "Cela reconnectera à un autre serveur Gateway",
      warning:
        "Confirmez uniquement si vous faites confiance à cette URL. Des URL malveillantes peuvent compromettre votre système.",
    },
    nostr: {
      profile: "Profil",
      editProfile: "Modifier le profil",
      profilePicture: "Photo de profil",
      noProfile: "Aucun profil défini.",
      noProfileHint:
        'Cliquez sur "Modifier le profil" pour ajouter votre nom, votre bio et votre avatar.',
      name: "Nom",
      displayName: "Nom d’affichage",
      about: "À propos",
      advanced: "Avancé",
      profilePicturePreview: "Aperçu de la photo de profil",
      account: "Compte",
      username: "Nom d’utilisateur",
      usernameHelp: "Nom d’utilisateur court (par ex., satoshi)",
      bio: "Bio",
      bioPlaceholder: "Parlez de vous aux autres...",
      bioHelp: "Une brève bio ou description",
      displayNameHelp: "Votre nom d’affichage complet",
      avatarUrl: "URL de l’avatar",
      avatarHelp: "URL HTTPS vers votre photo de profil",
      bannerUrl: "URL de la bannière",
      bannerHelp: "URL HTTPS vers une image de bannière",
      website: "Site web",
      websiteHelp: "Votre site web personnel",
      nip05Identifier: "Identifiant NIP-05",
      nip05Help: "Identifiant vérifiable (par ex., you@domain.com)",
      lightningAddress: "Adresse Lightning",
      lightningHelp: "Adresse Lightning pour les pourboires (LUD-16)",
    },
  },
  lazyView: {
    loadingTitle: "Chargement du panneau",
    errorTitle: "Échec du chargement du panneau",
    errorSubtitle:
      "Rechargez la page pour charger la dernière version du bundle Control UI, ou réessayez si la requête réseau a échoué.",
    retry: "Réessayer",
    unknownError: "Erreur inconnue de chargement du module.",
  },
  nodes: {
    binding: {
      loadConfigHint: "Chargez la config pour modifier les bindings.",
      formModeHint: "Passez l’onglet Config en mode Form pour modifier les bindings ici.",
      execNodeBinding: "Binding du nœud d’exécution",
      execNodeBindingSubtitle:
        "Épinglez les agents à un nœud spécifique lors de l’utilisation de exec host=node.",
      defaultBinding: "Binding par défaut",
      defaultBindingHint: "Utilisé lorsque les agents ne remplacent pas un binding de nœud.",
      node: "Nœud",
    },
  },
  instances: {
    title: "Instances connectées",
    subtitle: "Balises de présence du gateway et des clients.",
    showHosts: "Afficher les hôtes et les IP",
    hideHosts: "Masquer les hôtes et les IP",
    toggleHostVisibility: "Basculer la visibilité des hôtes",
    noInstances: "Aucune instance signalée pour le moment.",
    lastInput: "Dernière entrée {time}",
    reason: "Raison {reason}",
  },
  sessionsView: {
    title: "Sessions",
    subtitle: "Clés de session actives et remplacements par session.",
    store: "Stockage : {path}",
    active: "Actif",
    limit: "Limite",
    filters: "Filtres",
    showFilters: "Afficher les filtres",
    hideFilters: "Masquer les filtres",
    sourceFilters: "Filtres de source de session",
    global: "Global",
    unknown: "Inconnu",
    showArchived: "Afficher les sessions archivées",
    activeTooltip: "Mis à jour au cours des {count} dernières minutes.",
    limitTooltip: "Nombre maximal de sessions à charger.",
    globalTooltip: "Inclure les sessions globales.",
    unknownTooltip: "Inclure les sessions inconnues.",
    showArchivedTooltip: "Inclure les sessions archivées.",
    minutesPlaceholder: "min",
    searchPlaceholder: "Filtrer par clé, agent, libellé, type…",
    selected: "{count} sélectionné(s)",
    deleteSelected: "Supprimer",
    selectAllOnPage: "Tout sélectionner sur la page",
    selectSession: "Sélectionner la session",
    optionalPlaceholder: "(facultatif)",
    key: "Clé",
    label: "Libellé",
    kind: "Type",
    updated: "Mis à jour",
    tokens: "Jetons",
    compaction: "Compactage",
    thinking: "Réflexion",
    fast: "Rapide",
    verbose: "Détaillé",
    reasoning: "Raisonnement",
    noSessions: "Aucune session trouvée.",
    noSessionsMatchFilters: "Aucune session ne correspond à vos filtres.",
    showAll: "Tout afficher",
    inherit: "hériter",
    defaultOption: "Par défaut ({value})",
    offExplicit: "désactivé (explicite)",
    on: "activé",
    off: "désactivé",
    full: "complet",
    stream: "flux",
    customOption: "{value} (personnalisé)",
    manual: "manuel",
    autoThreshold: "seuil automatique",
    overflowRetry: "nouvelle tentative après dépassement",
    timeoutRetry: "nouvelle tentative après expiration",
    tokenRange: "{before} to {after} tokens",
    tokensBefore: "{count} tokens avant",
    tokenDeltaUnavailable: "delta de tokens indisponible",
    checkpoints: "{count} points de contrôle",
    checkpoint: "{count} point de contrôle",
    showSessionDetails: "Afficher les détails de la session pour {count}",
    hideSessionDetails: "Masquer les détails de la session pour {count}",
    sessionDetails: "Détails de la session",
    compactionHistory: "Historique de compactage",
    status: "Statut",
    statusLive: "En direct",
    statusIdle: "Inactif",
    statusUnknown: "Inconnu",
    statusRunning: "En cours d’exécution",
    statusDone: "Terminé",
    statusFailed: "Échec",
    statusKilled: "Arrêté",
    statusTimeout: "Délai dépassé",
    model: "Modèle",
    provider: "Fournisseur",
    runtime: "Exécution",
    surface: "Surface",
    subject: "Sujet",
    room: "Salon",
    space: "Espace",
    sessionId: "ID de session",
    activeRun: "Exécution active",
    archived: "Archivée",
    loadingCheckpoints: "Chargement des points de contrôle…",
    noCheckpoints: "Aucun point de contrôle de compactage enregistré pour cette session.",
    noSummary: "Aucun résumé capturé.",
    branchFromCheckpoint: "Créer une branche à partir du point de contrôle",
    restoreCheckpoint: "Restaurer le point de contrôle",
  },
  agents: {
    noAgents: "No agents",
    copyId: "Copy ID",
    copyIdTitle: "Copy agent ID to clipboard",
    default: "Default",
    setDefault: "Set Default",
    alreadyDefaultTitle: "Already the default agent",
    setDefaultTitle: "Set as the default agent",
    selectTitle: "Select an agent",
    selectSubtitle: "Pick an agent to inspect its workspace and tools.",
    tabs: {
      overview: "Aperçu",
      files: "Fichiers",
      tools: "Outils",
      skills: "Skills",
      channels: "Canaux",
      cronJobs: "Tâches cron",
    },
    context: {
      title: "Agent Context",
      workspace: "Workspace",
      openFilesTab: "Open Files tab",
      primaryModel: "Primary Model",
      runtime: "Exécution",
      identityName: "Identity Name",
      identityAvatar: "Identity Avatar",
      skillsFilter: "Skills Filter",
      default: "Default",
      configurationSubtitle: "Workspace, identity, and model configuration.",
      schedulingSubtitle: "Workspace and scheduling targets.",
    },
    channels: {
      title: "Canaux",
      subtitle: "Gateway-wide channel status snapshot.",
      lastRefresh: "Last refresh: {time}",
      loadHint: "Load channels to see live status.",
      empty: "No channels found.",
      connectedCount: "{connected}/{total} connected",
      noAccounts: "no accounts",
      configuredCount: "{count} configured",
      notConfigured: "not configured",
      enabledCount: "{count} enabled",
      setupGuide: "Setup guide",
    },
    cronPanel: {
      schedulerTitle: "Scheduler",
      schedulerSubtitle: "Gateway cron status.",
      jobs: "Tâches",
      nextWake: "Prochain réveil",
      agentJobsTitle: "Agent Cron Jobs",
      agentJobsSubtitle: "Scheduled jobs targeting this agent.",
      noJobs: "No jobs assigned.",
      runNow: "Run Now",
    },
    files: {
      emptyDraft: "Empty draft",
      minRead: "{count} min read",
      markdownPreview: "Markdown Preview",
      extensionPreview: "{ext} Preview",
      preview: "Preview",
      expandPreview: "Expand preview",
      collapsePreview: "Collapse preview",
      editFile: "Edit file",
      closePreview: "Close preview",
      coreFilesTitle: "Core Files",
      coreFilesSubtitle: "Bootstrap persona, identity, and tool guidance.",
      workspace: "Workspace",
      loadHint: "Load the agent workspace files to edit core instructions.",
      empty: "No files found.",
      missing: "missing",
      selectFile: "Select a file to edit.",
      previewMarkdownTitle: "Preview rendered markdown",
      willCreateOnSave: "Will Create on Save",
      liveDraftPreview: "Live Draft Preview",
      savedPreview: "Saved Preview",
      updated: "Updated {time}",
      notCreatedYet: "Not Created Yet",
      updatedUnknown: "Updated Unknown",
      missingHint: "This file is missing. Saving will create it in the agent workspace.",
      content: "Content",
      words: "{count} words",
      lines: "lines",
    },
  },
  debug: {
    snapshotsTitle: "Snapshots",
    snapshotsSubtitle: "Status, health, and heartbeat data.",
    status: "Statut",
    health: "Santé",
    lastHeartbeat: "Last heartbeat",
    security: {
      audit: "Security audit",
      critical: "{count} critical",
      warnings: "{count} warnings",
      noCriticalIssues: "No critical issues",
      info: "{count} info",
      runPrefix: "Exécuter",
      runSuffix: "for details.",
    },
    manualRpcTitle: "Manual RPC",
    manualRpcSubtitle: "Send a raw gateway method with JSON params.",
    method: "Method",
    selectMethod: "Select a method…",
    paramsJson: "Params (JSON)",
    modelsTitle: "Models",
    modelsSubtitle: "Catalog from models.list.",
    eventLogTitle: "Journal des événements",
    eventLogSubtitle: "Latest gateway events.",
    noEvents: "No events yet.",
  },
  quickSettings: {
    security: {
      browserEnabled: "Browser enabled",
      toolProfile: "Tool profile",
    },
  },
  execApproval: {
    expiresIn: "expires in {time}",
    expired: "expired",
    execApprovalNeeded: "Exec approval needed",
    pluginApprovalNeeded: "Plugin approval needed",
    pending: "{count} pending",
    allowOnce: "Allow once",
    alwaysAllow: "Always allow",
    deny: "Deny",
    labels: {
      host: "Host",
      agent: "Agent",
      session: "Session",
      cwd: "CWD",
      resolved: "Resolved",
      security: "Security",
      ask: "Ask",
      severity: "Severity",
      plugin: "Plugin",
    },
  },
  agentTools: {
    connectedSource: "Connecté : {id}",
    connected: "Connecté",
    channelSource: "Canal : {id}",
    channel: "Canal",
    builtIn: "Intégré",
  },
  nav: {
    chat: "Chat",
    control: "Contrôle",
    agent: "Agent",
    settings: "Paramètres",
    expand: "Développer la barre latérale",
    collapse: "Réduire la barre latérale",
    resize: "Redimensionner la barre latérale",
  },
  tabs: {
    agents: "Agents",
    overview: "Aperçu",
    channels: "Canaux",
    instances: "Instances",
    sessions: "Sessions",
    usage: "Utilisation",
    cron: "Tâches cron",
    skills: "Skills",
    nodes: "Nœuds",
    chat: "Chat",
    config: "Configuration",
    communications: "Communications",
    appearance: "Apparence",
    automation: "Automatisation",
    infrastructure: "Infrastructure",
    aiAgents: "IA et agents",
    debug: "Débogage",
    logs: "Journaux",
    dreams: "Rêves",
  },
  subtitles: {
    agents: "Espaces de travail, outils, identités.",
    overview: "Statut, points d’entrée, santé.",
    channels: "Canaux et paramètres.",
    instances: "Clients et nœuds connectés.",
    sessions: "Sessions actives et valeurs par défaut.",
    usage: "Utilisation de l’API et coûts.",
    cron: "Réveils et exécutions récurrentes.",
    skills: "Skills et clés API.",
    nodes: "Appareils appairés et commandes.",
    chat: "Chat Gateway pour les interventions rapides.",
    config: "Modifier openclaw.json.",
    communications: "Canaux, messages et paramètres audio.",
    appearance: "Thème, UI et paramètres de l’assistant de configuration.",
    automation: "Commandes, hooks, cron et plugins.",
    infrastructure: "Paramètres Gateway, web, navigateur et médias.",
    aiAgents: "Agents, modèles, Skills, outils, mémoire, session.",
    debug: "Captures, événements, RPC.",
    logs: "Journaux Gateway en direct.",
    dreams: "Consolidation de la mémoire pendant le sommeil.",
  },
  overview: {
    access: {
      title: "Accès Gateway",
      subtitle: "Où le tableau de bord se connecte et comment il s’authentifie.",
      wsUrl: "URL WebSocket",
      token: "Jeton Gateway",
      password: "Mot de passe (non enregistré)",
      passwordPlaceholder: "mot de passe système ou partagé",
      sessionKey: "Clé de session par défaut",
      language: "Langue",
      connectHint: "Cliquez sur Connect pour appliquer les modifications de connexion.",
      trustedProxy: "Authentifié via un proxy de confiance.",
      showToken: "Afficher le jeton",
      hideToken: "Masquer le jeton",
      toggleTokenVisibility: "Basculer la visibilité du jeton",
      showPassword: "Afficher le mot de passe",
      hidePassword: "Masquer le mot de passe",
      togglePasswordVisibility: "Basculer la visibilité du mot de passe",
    },
    snapshot: {
      title: "Capture",
      subtitle: "Dernières informations de handshake du Gateway.",
      status: "Statut",
      uptime: "Temps de fonctionnement",
      tickInterval: "Intervalle de tick",
      lastChannelsRefresh: "Dernière actualisation des canaux",
      channelsHint: "Utilisez Channels pour lier WhatsApp, Telegram, Discord, Signal ou iMessage.",
    },
    stats: {
      instances: "Instances",
      instancesHint: "Balises de présence au cours des 5 dernières minutes.",
      sessions: "Sessions",
      sessionsHint: "Clés de session récentes suivies par le Gateway.",
      cron: "Cron",
      cronNext: "Prochain réveil {time}",
    },
    notes: {
      title: "Notes",
      subtitle: "Rappels rapides pour les configurations de contrôle à distance.",
      tailscaleTitle: "Tailscale serve",
      tailscaleText:
        "Privilégiez le mode serve pour garder le Gateway sur loopback avec l’authentification tailnet.",
      sessionTitle: "Hygiène des sessions",
      sessionText: "Utilisez /new ou sessions.patch pour réinitialiser le contexte.",
      cronTitle: "Rappels cron",
      cronText: "Utilisez des sessions isolées pour les exécutions récurrentes.",
    },
    auth: {
      required:
        "Ce Gateway nécessite une authentification. Ajoutez un jeton ou un mot de passe, puis cliquez sur Connect.",
      failed:
        "Échec de l’authentification. Recopiez une URL avec jeton avec {command}, ou mettez à jour le jeton, puis cliquez sur Connect.",
    },
    pairing: {
      hint: "Cet appareil nécessite une approbation d’appairage de l’hôte Gateway.",
      scopeUpgradeTitle: "Mise à niveau de portée en attente d’approbation.",
      scopeUpgradeSummary:
        "Cet appareil est déjà appairé, mais l’élargissement de portée demandé est en attente d’approbation.",
      roleUpgradeTitle: "Mise à niveau du rôle en attente d’approbation.",
      roleUpgradeSummary:
        "Cet appareil est déjà appairé, mais le changement de rôle demandé est en attente d’approbation.",
      metadataUpgradeTitle: "Modification des métadonnées de l’appareil en attente d’approbation.",
      metadataUpgradeSummary:
        "Cet appareil est déjà appairé, mais la modification des métadonnées est en attente d’approbation.",
      mobileHint:
        "Sur mobile ? Copiez l’URL complète (y compris #token=...) depuis openclaw dashboard --no-open sur votre ordinateur.",
      docsTitle: "Documentation sur l’appairage des appareils (s’ouvre dans un nouvel onglet)",
      docsLink: "Documentation : Appairage des appareils",
    },
    insecure: {
      hint: "Cette page utilise HTTP, le navigateur bloque donc l’identité de l’appareil. Utilisez HTTPS (Tailscale Serve) ou ouvrez {url} sur l’hôte Gateway.",
      stayHttp: "Si vous devez rester en HTTP, définissez {config} (jeton uniquement).",
    },
    connection: {
      title: "Comment se connecter",
      step1: "Démarrez le Gateway sur votre machine hôte :",
      step2: "Obtenez une URL du tableau de bord avec jeton :",
      step3:
        "Collez l’URL WebSocket et le jeton ci-dessus, ou ouvrez directement l’URL avec jeton.",
      step4: "Ou générez un jeton réutilisable :",
      docsHint: "Pour l’accès à distance, Tailscale Serve est recommandé. ",
      docsLink: "Lire la documentation →",
      authDocsTitle:
        "Documentation sur l’authentification de la Control UI (s’ouvre dans un nouvel onglet)",
      authDocsLink: "Documentation : Authentification de la Control UI",
      tailscaleDocsTitle: "Documentation sur Tailscale Serve (s’ouvre dans un nouvel onglet)",
      tailscaleDocsLink: "Documentation : Tailscale Serve",
      insecureHttpDocsTitle: "Documentation sur HTTP non sécurisé (s’ouvre dans un nouvel onglet)",
      insecureHttpDocsLink: "Documentation : HTTP non sécurisé",
      copyCommand: "Copier la commande",
      copyCommandAria: "Copier la commande : {command}",
    },
    cards: {
      cost: "Coût",
      skills: "Skills",
      recentSessions: "Sessions récentes",
      modelAuth: "Authentification des modèles",
      modelAuthOk: "{count} ok",
      modelAuthExpired: "{count} expirés",
      modelAuthExpiring: "{count} expirent bientôt",
      modelAuthProviders: "{count} fournisseurs",
      modelAuthUsageLeft: "Il reste {pct} %",
      modelAuthExpiresIn: "expire {when}",
      modelAuthAttentionExpiredTitle: "Authentification des modèles expirée",
      modelAuthAttentionExpiringTitle: "L'authentification des modèles expire bientôt",
      modelAuthAttentionExpiredDesc: "{providers} — réauthentifiez-vous avec openclaw models auth",
      modelAuthAttentionExpiringEntry: "{provider} ({when})",
    },
    attention: {
      title: "Attention",
    },
    eventLog: {
      title: "Journal des événements",
    },
    logTail: {
      title: "Journaux Gateway",
    },
    quickActions: {
      newSession: "Nouvelle session",
      automation: "Automatisation",
      refreshAll: "Tout actualiser",
      terminal: "Terminal",
    },
    palette: {
      placeholder: "Saisissez une commande…",
      noResults: "Aucun résultat",
      categories: {
        search: "Rechercher",
        navigation: "Navigation",
        skills: "Skills",
      },
      items: {
        overview: "Aperçu",
        sessions: "Sessions",
        scheduled: "Planifié",
        skills: "Skills",
        settings: "Paramètres",
        agents: "Agents",
        shellCommand: "Commande shell",
        debugMode: "Mode débogage",
      },
      descriptions: {
        shellCommand: "Exécuter le shell",
        debugMode: "Basculer le débogage",
      },
      footer: {
        navigate: "naviguer",
        select: "sélectionner",
        close: "fermer",
      },
    },
  },
  dreaming: {
    tabs: {
      scene: "Scène",
      diary: "Journal",
      advanced: "Avancé",
    },
    header: {
      refresh: "Actualiser",
      refreshing: "Actualisation…",
      on: "Rêverie activée",
      off: "Rêverie désactivée",
    },
    restartConfirmation: {
      title: "Restart Gateway to Apply Change",
      subtitle: "Changing Dreaming mode restarts the gateway.",
      warning:
        "This action will restart the Gateway and may temporarily interrupt chats, automations, and connected channels.",
      confirm: "Confirm Restart",
      restarting: "Restarting…",
      failed: "Could not apply change. Check your connection and try again.",
    },
    status: {
      active: "Rêverie active",
      idle: "Rêverie inactive",
      promotedSuffix: "promu",
      nextSweepPrefix: "prochaine passe",
    },
    scene: {
      backfill: "Rattrapage",
      dedupeDiary: "Journal de déduplication",
      reset: "Réinitialiser",
      clearGrounded: "Effacer les éléments ancrés",
      repairCache: "Réparer le cache des rêves",
      working: "Traitement…",
    },
    phase: {
      light: "Léger",
      deep: "Profond",
      rem: "REM",
      off: "désactivé",
    },
    advanced: {
      eyebrow: "Vérification",
      title: "Vérification du journal quotidien",
      description:
        "Vérifiez ce qui provient du journal quotidien, ce qui est en attente de promotion et ce qui a été promu récemment.",
      summaryFromDailyLog: "du journal quotidien",
      summaryWaiting: "en attente",
      summaryPromotedToday: "promu aujourd’hui",
      stagedTitle: "Du journal quotidien",
      stagedDescription: "Rejouer les candidats extraits d’anciennes entrées du journal quotidien.",
      shortTermTitle: "En attente de promotion",
      shortTermDescription:
        "Candidats à court terme actuels en attente d’être promus en mémoire réelle.",
      sortRecent: "Les plus récents",
      sortSignals: "Support le plus fort",
      originDailyLog: "rejoué",
      originLive: "en direct",
      originMixed: "mixte",
      promotedTitle: "Promotions récentes",
      promotedDescription: "Éléments qui ont déjà franchi l’étape de promotion.",
      emptyGrounded: "Aucune entrée de relecture ancrée en attente pour le moment.",
      emptyShortTerm: "Aucune entrée à court terme à examiner.",
      emptyPromoted: "Aucune promotion récente à examiner.",
      updatedPrefix: "mis à jour",
    },
    stats: {
      shortTerm: "Court terme",
      grounded: "Ancré",
      signals: "Signaux",
      promoted: "Promus",
      phaseHits: "Occurrences de phase",
    },
    trace: {
      shortTerm: "Court terme",
      grounded: "Ancré",
      signals: "Signaux",
      promoted: "Promus",
      groundedLed: "grounded-led",
      emptyShortTerm: "Aucun élément à court terme actif.",
      emptyGrounded: "Aucun élément ancré en attente.",
      emptySignals: "Aucun signal actif.",
      emptyPromoted: "Rien n’a encore été promu aujourd’hui.",
    },
    diary: {
      title: "Journal des rêves",
      noDreamsYet: "Aucun rêve pour le moment",
      noDreamsHint: "Les rêves apparaîtront ici après le premier cycle de rêverie.",
      waitingTitle: "Le journal attend",
      waitingHint: "Les entrées narratives apparaîtront après le prochain cycle de rêverie.",
      older: "Plus anciens",
      newer: "Plus récents",
      reload: "Recharger",
      reloading: "Rechargement…",
    },
    phrases: {
      consolidatingMemories: "consolidation des souvenirs…",
      tidyingKnowledgeGraph: "rangement du graphe de connaissances…",
      replayingConversations: "relecture des conversations d’aujourd’hui…",
      weavingShortTerm: "tissage du court terme dans le long terme…",
      defragmentingMindPalace: "défragmentation du palais mental…",
      filingLooseThoughts: "classement des pensées éparses…",
      connectingDots: "connexion de points éloignés…",
      compostingContext: "compostage des anciennes fenêtres de contexte…",
      alphabetizingSubconscious: "alphabétisation du subconscient…",
      promotingHunches: "promotion des intuitions prometteuses…",
      forgettingNoise: "oubli de ce qui n’a pas d’importance…",
      dreamingEmbeddings: "rêverie en embeddings…",
      reorganizingAttic: "réorganisation du grenier de la mémoire…",
      indexingDay: "indexation en douceur de la journée…",
      nurturingInsights: "maturation des intuitions naissantes…",
      simmeringIdeas: "mijotage d’idées à moitié formées…",
      whisperingVectorStore: "chuchotement au vector store…",
    },
  },
  usage: {
    common: {
      emptyValue: "—",
      unknown: "inconnu",
    },
    loading: {
      title: "Aperçu de l’utilisation",
      badge: "Chargement",
    },
    metrics: {
      tokens: "Jetons",
      cost: "Coût",
      session: "session",
      sessions: "sessions",
    },
    presets: {
      today: "Aujourd’hui",
      last7d: "7 j",
      last30d: "30 j",
      last90d: "90 j",
      last1y: "1 an",
      all: "Tous",
    },
    scope: {
      instance: "Instance actuelle",
      instanceHint: "Afficher uniquement l’id de session actif pour chaque session logique.",
      family: "Lignée historique",
      familyHint:
        "Regrouper les ids de session connus adossés à des transcriptions ayant fait l’objet d’une rotation.",
      familyIncluded: "La lignée historique inclut {count} instances de session.",
    },
    filters: {
      title: "Filtres",
      to: "à",
      startDate: "Date de début",
      endDate: "Date de fin",
      timeZone: "Fuseau horaire",
      timeZoneLocal: "Local",
      timeZoneUtc: "UTC",
      pin: "Épingler",
      pinned: "Épinglé",
      unpin: "Désépingler les filtres",
      selectAll: "Tout sélectionner",
      clear: "Effacer",
      clearAll: "Tout effacer",
      remove: "Supprimer le filtre",
      all: "Tous",
      days: "Jours",
      hours: "Heures",
      session: "Session",
      agent: "Agent",
      channel: "Canal",
      provider: "Fournisseur",
      model: "Modèle",
      tool: "Outil",
      daysCount: "{count} jours",
      hoursCount: "{count} heures",
      sessionsCount: "{count} sessions",
    },
    query: {
      placeholder:
        "Filtrer les sessions (ex. key:agent:main:cron* model:gpt-4o has:errors minTokens:2000)",
      apply: "Filtrer (côté client)",
      matching: "{shown} sessions sur {total} correspondent",
      inRange: "{total} sessions dans l’intervalle",
      tip: "Astuce : utilisez les filtres ou cliquez sur les barres pour affiner les jours.",
    },
    export: {
      label: "Exporter",
      sessionsCsv: "CSV des sessions",
      dailyCsv: "CSV quotidien",
      json: "JSON",
    },
    cacheStatus: {
      warning:
        "Le cache d’utilisation est en cours de reconstruction en arrière-plan. Les totaux affichés peuvent être obsolètes.",
      title: "{status} : {pending} en attente, {stale} obsolètes, {cached} en cache",
      status: {
        refreshing: "actualisation",
        stale: "obsolète",
        partial: "partiel",
      },
    },
    empty: {
      title: "Commencez par une plage de dates",
      subtitle:
        "Chargez les données d’utilisation pour comparer les coûts, examiner les sessions et explorer les chronologies sans quitter le tableau de bord.",
      hint: "Sélectionnez une plage de dates et cliquez sur Actualiser pour charger l’utilisation.",
      noData: "Aucune donnée",
      featureOverview: "Cartes d’aperçu",
      featureSessions: "Classement des sessions",
      featureTimeline: "Exploration de la chronologie",
    },
    daily: {
      title: "Utilisation quotidienne",
      total: "Total",
      byType: "Par type",
      tokensTitle: "Utilisation quotidienne des jetons",
      costTitle: "Coût quotidien",
    },
    breakdown: {
      output: "Sortie",
      input: "Entrée",
      cacheWrite: "Écriture du cache",
      cacheRead: "Lecture du cache",
      total: "Total",
      tokensByType: "Jetons par type",
      costByType: "Coût par type",
    },
    overview: {
      title: "Aperçu de l’utilisation",
      messages: "Messages",
      messagesHint: "Nombre total de messages utilisateur et assistant dans l’intervalle.",
      messagesAbbrev: "msgs",
      user: "utilisateur",
      assistant: "assistant",
      toolCalls: "Appels d’outil",
      toolCallsHint: "Nombre total d’appels d’outil sur l’ensemble des sessions.",
      toolsUsed: "outils utilisés",
      errors: "Erreurs",
      errorsHint: "Nombre total d’erreurs de message et d’outil dans l’intervalle.",
      toolResults: "résultats d’outil",
      avgTokens: "Moy. jetons / msg",
      avgTokensHint: "Nombre moyen de jetons par message dans cet intervalle.",
      avgCost: "Coût moy. / msg",
      avgCostHint: "Coût moyen par message lorsque les providers signalent les coûts.",
      avgCostHintMissing:
        "Coût moyen par message lorsque les providers signalent les coûts. Les données de coût sont manquantes pour certaines ou toutes les sessions de cet intervalle.",
      acrossMessages: "Sur {count} messages",
      sessions: "Sessions",
      sessionsHint: "Sessions distinctes dans l’intervalle.",
      sessionsInRange: "sur {count} dans l’intervalle",
      throughput: "Débit",
      throughputHint:
        "Le débit indique les jetons par minute pendant le temps d’activité. Plus il est élevé, mieux c’est.",
      tokensPerMinute: "jet/min",
      perMinute: "/ min",
      errorRate: "Taux d’erreur",
      errorHint: "Taux d’erreur = erreurs / total des messages. Plus il est faible, mieux c’est.",
      avgSession: "session moy.",
      cacheHitRate: "Taux de réussite du cache",
      cacheHint:
        "Taux de réussite du cache = lecture du cache / (entrée + lecture du cache). Plus il est élevé, mieux c’est.",
      cached: "en cache",
      prompt: "prompt",
      calls: "appels",
      topModels: "Principaux modèles",
      topProviders: "Principaux providers",
      topTools: "Principaux outils",
      topAgents: "Principaux agents",
      topChannels: "Principaux canaux",
      peakErrorDays: "Jours avec le plus d’erreurs",
      peakErrorHours: "Heures avec le plus d’erreurs",
      noModelData: "Aucune donnée de modèle",
      noProviderData: "Aucune donnée de provider",
      noToolCalls: "Aucun appel d’outil",
      noAgentData: "Aucune donnée d’agent",
      noChannelData: "Aucune donnée de canal",
      noErrorData: "Aucune donnée d’erreur",
    },
    sessions: {
      title: "Sessions",
      shown: "{count} affichées",
      total: "{count} au total",
      avg: "moy.",
      all: "Tous",
      recent: "Consultées récemment",
      recentShort: "Récentes",
      sort: "Trier",
      ascending: "Croissant",
      descending: "Décroissant",
      clearSelection: "Effacer la sélection",
      noRecent: "Aucune session récente",
      noneInRange: "Aucune session dans l’intervalle",
      more: "+{count} de plus",
      selected: "Sélectionnées ({count})",
      copy: "Copier",
      copyName: "Copier le nom de la session",
      limitReached:
        "Affichage des 1 000 premières sessions. Réduisez la plage de dates pour obtenir des résultats complets.",
    },
    details: {
      noUsageData: "Aucune donnée d’utilisation pour cette session.",
      duration: "Durée",
      modelMix: "Répartition des modèles",
      filtered: "(filtré)",
      close: "Fermer les détails de la session",
      noTimeline: "Aucune donnée de chronologie",
      noDataInRange: "Aucune donnée dans l’intervalle",
      usageOverTime: "Utilisation au fil du temps",
      reset: "Réinitialiser",
      perTurn: "Par tour",
      cumulative: "Cumulé",
      turnRange: "Tours {start}–{end} sur {total}",
      assistantOutputTokens: "Jetons de sortie de l’assistant",
      userToolInputTokens: "Jetons d’entrée utilisateur + outil",
      tokensWrittenToCache: "Jetons écrits dans le cache",
      tokensReadFromCache: "Jetons lus depuis le cache",
      noContextData: "Aucune donnée de contexte",
      systemPromptBreakdown: "Répartition du prompt système",
      collapse: "Réduire",
      collapseAll: "Tout réduire",
      expandAll: "Tout développer",
      baseContextPerMessage: "Contexte de base par message",
      system: "Système",
      systemShort: "Sys",
      skills: "Skills",
      tools: "Outils",
      files: "Fichiers",
      ofInput: "de l’entrée",
      of: "de",
      timelineFiltered: "chronologie filtrée",
      conversation: "Conversation",
      noMessages: "Aucun message",
      tool: "Outil",
      toolResult: "Résultat d’outil",
      hasTools: "Contient des outils",
      searchConversation: "Rechercher dans la conversation",
      you: "Vous",
      noMessagesMatch: "Aucun message ne correspond aux filtres.",
    },
    mosaic: {
      title: "Activité par heure",
      subtitleEmpty: "Les estimations nécessitent des horodatages de session.",
      subtitle:
        "Estimé à partir des plages de session (première/dernière activité). Fuseau horaire : {zone}.",
      noTimelineData: "Aucune donnée de chronologie pour le moment.",
      dayOfWeek: "Jour de la semaine",
      midnight: "Minuit",
      fourAm: "4 h",
      eightAm: "8 h",
      noon: "Midi",
      fourPm: "16 h",
      eightPm: "20 h",
      legend: "Faible → Forte densité de jetons",
      sun: "Dim",
      mon: "Lun",
      tue: "Mar",
      wed: "Mer",
      thu: "Jeu",
      fri: "Ven",
      sat: "Sam",
    },
  },
  login: {
    subtitle: "Tableau de bord Gateway",
    passwordPlaceholder: "facultatif",
    showToken: "Afficher le jeton",
    hideToken: "Masquer le jeton",
    toggleTokenVisibility: "Basculer la visibilité du jeton",
    showPassword: "Afficher le mot de passe",
    hidePassword: "Masquer le mot de passe",
    togglePasswordVisibility: "Basculer la visibilité du mot de passe",
    failure: {
      rawError: "Erreur brute",
      docsAuth: "Docs d’authentification Control UI",
      docsPairing: "Docs d’appairage des appareils",
      docsInsecure: "Docs HTTP non sécurisé",
      authRequired: {
        title: "Authentification requise",
        summary:
          "Le Gateway est joignable, mais il lui faut un jeton ou un mot de passe correspondant avant que ce navigateur puisse se connecter.",
        stepPaste:
          "Collez le jeton de openclaw dashboard --no-open ou saisissez le mot de passe configuré.",
        stepGenerate:
          "Si aucun jeton n’est configuré, exécutez openclaw doctor --generate-gateway-token sur l’hôte Gateway.",
        stepConnect: "Cliquez de nouveau sur Connect après avoir mis à jour l’identifiant.",
      },
      authFailed: {
        title: "L’authentification ne correspond pas",
        summary:
          "L’identifiant fourni a été refusé. La cause la plus courante est un jeton obsolète ou copié depuis une autre URL Gateway.",
        stepDashboard:
          "Exécutez openclaw dashboard --no-open et ouvrez la nouvelle URL ou collez son jeton.",
        stepReplace:
          "Remplacez les valeurs de jeton/mot de passe obsolètes ; ne réutilisez pas un jeton provenant d’une autre URL Gateway.",
        stepMode:
          "Utilisez un seul mode d’authentification correspondant à la fois : jeton gateway pour le mode jeton, mot de passe pour le mode mot de passe.",
      },
      rateLimited: {
        title: "Trop de tentatives échouées",
        summary:
          "Le Gateway limite temporairement les tentatives d’authentification pour ce client.",
        stepStop: "Arrêtez de réessayer depuis cet onglet pendant un moment.",
        stepWait:
          "Attendez que le limiteur d’authentification se calme, puis reconnectez-vous avec l’identifiant corrigé.",
        stepCheckClients:
          "Si cet hôte est partagé, vérifiez que d’autres clients ne répètent pas de mauvais essais.",
      },
      pairing: {
        title: "Appairage de l’appareil requis",
        scopeTitle: "Mise à niveau de scope en attente",
        roleTitle: "Mise à niveau du rôle en attente",
        metadataTitle: "Actualisation de l’appareil en attente",
        summary:
          "Ce navigateur nécessite une approbation unique de l’hôte Gateway avant de pouvoir utiliser Control UI.",
        upgradeSummary:
          "Ce navigateur est déjà connu, mais l’accès demandé a changé et nécessite une nouvelle approbation.",
        stepList: "Exécutez openclaw devices list sur l’hôte Gateway.",
        stepApproveId: "Approuvez cette demande : openclaw devices approve {requestId}.",
        stepApprove: "Approuvez la demande navigateur/appareil en attente depuis cette liste.",
        stepReconnect: "Reconnectez-vous après la fin de l’approbation.",
      },
      insecure: {
        title: "Contexte de navigateur sécurisé requis",
        summary:
          "Cette page s’exécute en HTTP simple, le navigateur ne peut donc pas créer l’identité d’appareil attendue par le Gateway.",
        stepHttps:
          "Utilisez HTTPS/Tailscale Serve, ou ouvrez http://127.0.0.1:18789 sur l’hôte Gateway.",
        stepLocalCompat:
          "Pour la compatibilité locale en mode jeton uniquement, définissez gateway.controlUi.allowInsecureAuth: true.",
        stepAvoidDisable:
          "Évitez de désactiver l’authentification des appareils pour l’accès HTTP distant.",
      },
      origin: {
        title: "Origine du navigateur non autorisée",
        summary:
          "Le Gateway a rejeté l’origine de cette page avant d’accepter la connexion Control UI.",
        stepAllowedOrigins:
          "Ajoutez cette origine de navigateur à gateway.controlUi.allowedOrigins.",
        stepFullOrigin:
          "Utilisez des origines complètes comme http://localhost:5173, pas des motifs wildcard.",
        stepRestart:
          "Redémarrez ou rechargez le Gateway après avoir modifié les origines autorisées.",
      },
      protocol: {
        title: "Incompatibilité de protocole",
        summary:
          "La Control UI servie et le Gateway en cours d’exécution ne sont pas d’accord sur le protocole de connexion pris en charge.",
        stepDashboard:
          "Rouvrez le dashboard servi avec openclaw dashboard afin que l’UI et le Gateway viennent de la même installation.",
        stepDevUi:
          "Si vous utilisez pnpm ui:dev, reconstruisez ou redémarrez l’UI de développement avec le checkout actuel.",
        stepRestart:
          "Redémarrez le Gateway après la mise à jour d’OpenClaw afin qu’il serve le protocole actuel.",
      },
      network: {
        title: "Connexion impossible",
        summary:
          "Le navigateur n’a pas pu terminer la connexion au Gateway. Vérifiez la cible et le transport avant de réessayer les identifiants.",
        stepGateway:
          "Confirmez que le Gateway fonctionne avec openclaw status ou openclaw gateway run.",
        stepUrl:
          "Vérifiez l’URL WebSocket et utilisez wss:// lorsque le Gateway est derrière HTTPS/Tailscale Serve.",
        stepDashboard:
          "Rouvrez le dashboard avec openclaw dashboard --no-open pour recopier l’URL actuelle et les détails d’authentification.",
      },
    },
  },
  chat: {
    disconnected: "Déconnecté du Gateway.",
    refreshTitle: "Actualiser les données du chat",
    settings: "Paramètres de chat",
    thinkingToggle: "Afficher/masquer la sortie de réflexion/travail de l’assistant",
    toolCallsToggle: "Afficher/masquer les appels d’outil et les résultats d’outil",
    autoScrollMode: "Mode de défilement automatique",
    autoScrollAlways: "Toujours",
    autoScrollNearBottom: "Près du bas",
    autoScrollOff: "Désactivé",
    focusToggle: "Activer/désactiver le mode focus (masquer la barre latérale + l’en-tête de page)",
    hideCronSessions: "Masquer les sessions cron",
    showCronSessions: "Afficher les sessions cron",
    showCronSessionsHidden: "Afficher les sessions cron ({count} masquées)",
    onboardingDisabled: "Désactivé pendant la configuration",
    gatewayStatus: "État du Gateway : {status}",
    commandPaletteTitle: "Rechercher ou accéder à… (⌘K)",
    openCommandPalette: "Ouvrir la palette de commandes",
    docsOpensInNewTab: "{label} (s’ouvre dans un nouvel onglet)",
    updateAvailable: "Mise à jour disponible :",
    runningVersion: "version v{version} en cours d’exécution",
    updating: "Mise à jour…",
    updateNow: "Mettre à jour maintenant",
    dismissUpdateBanner: "Ignorer la bannière de mise à jour",
    switchedSession: "Passage à {session}",
    welcome: {
      ready: "Ready to chat",
      hintBeforeShortcut: "Type a message below ·",
      hintAfterShortcut: "for commands",
      suggestions: {
        whatCanYouDo: "What can you do?",
        summarizeRecentSessions: "Summarize my recent sessions",
        configureChannel: "Help me configure a channel",
        checkSystemHealth: "Check system health",
      },
    },
    runControls: {
      newSession: "New session",
      export: "Exporter",
      exportChat: "Export chat",
      queue: "Queue",
      queueMessage: "Queue message",
      stop: "Stop",
      stopGenerating: "Stop generating",
      send: "Send",
      sendMessage: "Send message",
    },
    composer: {
      placeholder: "Message {name} (Enter to send)",
      placeholderWithAttachments: "Add a message or paste more images...",
      placeholderDisconnected: "Connect to the gateway to start chatting...",
      attachFile: "Attach file",
      startTalk: "Start Talk",
      stopTalk: "Stop Talk",
    },
    selectors: {
      agentFilter: "Filtrer les sessions par agent",
      session: "Chat session",
      model: "Chat model",
      thinkingLevel: "Chat thinking level",
    },
  },
  languages: {
    en: "Anglais",
    zhCN: "简体中文 (chinois simplifié)",
    zhTW: "繁體中文 (chinois traditionnel)",
    ptBR: "Português (portugais brésilien)",
    de: "Deutsch (allemand)",
    es: "Español (espagnol)",
    jaJP: "日本語 (japonais)",
    ko: "한국어 (coréen)",
    fr: "Français (français)",
    ar: "العربية (arabe)",
    it: "Italiano (italien)",
    tr: "Türkçe (turc)",
    uk: "Українська (ukrainien)",
    id: "Bahasa Indonesia (indonésien)",
    pl: "Polski (polonais)",
    th: "ไทย (thaï)",
    vi: "Tiếng Việt (vietnamien)",
    nl: "Nederlands (néerlandais)",
    fa: "فارسی (persan)",
  },
  cron: {
    quickCreate: {
      schedules: {
        everyMorning: {
          label: "Chaque matin",
          description: "Tous les jours à 8 h 00",
        },
        everyEvening: {
          label: "Chaque soir",
          description: "Tous les jours à 18 h 00",
        },
        hourly: {
          label: "Toutes les heures",
          description: "Toutes les heures",
        },
        weekdays: {
          label: "Jours de semaine",
          description: "Lun.–ven. à 9 h 00",
        },
        weekly: {
          label: "Chaque semaine",
          description: "Chaque lundi à 9 h 00",
        },
        once: {
          label: "Exécuter une fois",
          description: "Une seule fois, supprimer après l’exécution",
        },
      },
      delivery: {
        notify: {
          label: "Me notifier",
          description: "Envoyer les résultats au chat",
        },
        silent: {
          label: "Silencieux",
          description: "Exécuter sans notification",
        },
        isolated: {
          label: "Session indépendante",
          description: "Exécuter dans sa propre session",
        },
      },
      steps: {
        what: "Quoi",
        when: "Quand",
        how: "Comment",
      },
      defaultName: "Automatisation",
      whatHeading: "Que doit-elle faire ?",
      whatHint:
        "Décrivez la tâche en langage naturel. L’agent exécutera cette invite à chaque fois.",
      promptPlaceholder:
        "p. ex., Vérifie ma boîte de réception pour les e-mails urgents et résume-les...",
      nameOptional: "Nom (facultatif)",
      namePlaceholder: "p. ex., Vérification de la boîte de réception du matin",
      whenHeading: "Quand doit-elle s’exécuter ?",
      whenHint: "Choisissez une planification. Vous pourrez l’ajuster plus tard.",
      howHeading: "Comment doit-elle fonctionner ?",
      howHint: "Choisissez le mode de remise des résultats.",
      title: "Nouvelle automatisation",
    },
    summary: {
      enabled: "Activé",
      yes: "Oui",
      no: "Non",
      jobs: "Tâches",
      nextWake: "Prochain réveil",
      refreshing: "Actualisation...",
      refresh: "Actualiser",
    },
    jobs: {
      title: "Tâches",
      subtitle: "Toutes les tâches planifiées stockées dans le Gateway.",
      shownOf: "{shown} affichées sur {total}",
      searchJobs: "Rechercher des tâches",
      searchPlaceholder: "Nom, description ou agent",
      enabled: "Activé",
      schedule: "Planification",
      lastRun: "Dernière exécution",
      all: "Tous",
      sort: "Trier",
      nextRun: "Prochaine exécution",
      recentlyUpdated: "Récemment mises à jour",
      name: "Nom",
      direction: "Direction",
      ascending: "Croissant",
      descending: "Décroissant",
      reset: "Réinitialiser",
      emptyTitle: "No scheduled jobs yet.",
      emptyHint: "Create one from a plain-language prompt; advanced fields can wait.",
      emptyFilteredHint: "Clear or change filters to see scheduled jobs.",
      noMatching: "Aucune tâche correspondante.",
      loading: "Chargement...",
      loadMore: "Charger plus de tâches",
    },
    runs: {
      title: "Historique d’exécution",
      subtitleAll: "Dernières exécutions pour toutes les tâches.",
      subtitleJob: "Dernières exécutions pour {title}.",
      scope: "Portée",
      allJobs: "Toutes les tâches",
      selectedJob: "Tâche sélectionnée",
      searchRuns: "Rechercher des exécutions",
      searchPlaceholder: "Résumé, erreur ou tâche",
      newestFirst: "Plus récentes d’abord",
      oldestFirst: "Plus anciennes d’abord",
      status: "Statut",
      delivery: "Distribution",
      clear: "Effacer",
      allStatuses: "Tous les statuts",
      allDelivery: "Toute la distribution",
      selectJobHint: "Sélectionnez une tâche pour examiner l’historique d’exécution.",
      noMatching: "Aucune exécution correspondante.",
      loadMore: "Charger plus d’exécutions",
      runStatusOk: "OK",
      runStatusError: "Erreur",
      runStatusSkipped: "Ignoré",
      runStatusUnknown: "Inconnu",
      deliveryDelivered: "Distribué",
      deliveryNotDelivered: "Non distribué",
      deliveryUnknown: "Inconnu",
      deliveryNotRequested: "Non demandé",
    },
    form: {
      editJob: "Modifier la tâche",
      newJob: "Nouvelle tâche",
      advancedJob: "Advanced job",
      updateSubtitle: "Mettez à jour la tâche planifiée sélectionnée.",
      createSubtitle: "Créez un réveil planifié ou une exécution d’agent.",
      required: "Obligatoire",
      requiredSr: "obligatoire",
      basics: "Notions de base",
      basicsSub: "Donnez-lui un nom, choisissez l’assistant et définissez l’état activé.",
      fieldName: "Nom",
      description: "Description",
      agentId: "ID de l’agent",
      namePlaceholder: "Brief du matin",
      descriptionPlaceholder: "Contexte facultatif pour cette tâche",
      agentPlaceholder: "main ou ops",
      agentHelp: "Commencez à taper pour choisir un agent connu, ou saisissez-en un personnalisé.",
      schedule: "Planification",
      scheduleSub: "Contrôlez quand cette tâche s’exécute.",
      every: "Toutes les",
      at: "À",
      cronOption: "Cron",
      runAt: "Exécuter à",
      unit: "Unité",
      minutes: "Minutes",
      hours: "Heures",
      days: "Jours",
      expression: "Expression",
      expressionPlaceholder: "0 7 * * *",
      everyAmountPlaceholder: "30",
      timezoneOptional: "Fuseau horaire (facultatif)",
      timezonePlaceholder: "America/Los_Angeles",
      timezoneHelp:
        "Choisissez un fuseau horaire courant ou saisissez n’importe quel fuseau horaire IANA valide.",
      jitterHelp: "Besoin de jitter ? Utilisez Avancé → Fenêtre de décalage / Unité de décalage.",
      execution: "Exécution",
      executionSub: "Choisissez quand réveiller et ce que cette tâche doit faire.",
      session: "Session",
      main: "Principale",
      isolated: "Isolée",
      sessionHelp: "Principale publie un événement système. Isolée exécute un tour d’agent dédié.",
      wakeMode: "Mode de réveil",
      now: "Maintenant",
      nextHeartbeat: "Prochain heartbeat",
      wakeModeHelp:
        "Maintenant déclenche immédiatement. Prochain heartbeat attend le cycle suivant.",
      payloadKind: "Que faut-il exécuter ?",
      systemEvent: "Publier un message dans la chronologie principale",
      agentTurn: "Exécuter une tâche d’assistant (isolée)",
      systemEventHelp:
        "Envoie votre texte à la chronologie principale du Gateway (idéal pour les rappels/déclencheurs).",
      agentTurnHelp:
        "Démarre une exécution de l’assistant dans sa propre session à partir de votre prompt.",
      timeoutSeconds: "Délai d’expiration (secondes)",
      timeoutPlaceholder: "Facultatif, ex. 90",
      timeoutHelp:
        "Facultatif. Laissez vide pour utiliser le comportement de délai d’expiration par défaut du Gateway pour cette exécution.",
      mainTimelineMessage: "Message de la chronologie principale",
      assistantTaskPrompt: "Prompt de tâche de l’assistant",
      deliverySection: "Distribution",
      deliverySub: "Choisissez où les résumés d’exécution sont envoyés.",
      resultDelivery: "Distribution du résultat",
      announceDefault: "Annoncer le résumé (par défaut)",
      webhookPost: "Webhook POST",
      noneInternal: "Aucun (interne)",
      deliveryHelp:
        "Annoncer publie un résumé dans le chat. Aucun conserve l’exécution en interne.",
      webhookUrl: "URL du webhook",
      channel: "Canal",
      webhookPlaceholder: "https://example.com/cron",
      channelHelp: "Choisissez quel canal connecté reçoit le résumé.",
      webhookHelp: "Envoyez les résumés d’exécution vers un endpoint webhook.",
      to: "À",
      toPlaceholder: "+1555... ou ID de chat",
      toHelp: "Remplacement facultatif du destinataire (ID de chat, téléphone ou ID utilisateur).",
      advanced: "Avancé",
      advancedHelp:
        "Remplacements facultatifs pour les garanties de distribution, le jitter de planification et les contrôles du modèle.",
      deleteAfterRun: "Supprimer après exécution",
      deleteAfterRunHelp:
        "Idéal pour les rappels ponctuels qui doivent se nettoyer automatiquement.",
      clearAgentOverride: "Effacer le remplacement d’agent",
      clearAgentHelp: "Force cette tâche à utiliser l’assistant par défaut du Gateway.",
      exactTiming: "Timing exact (sans décalage)",
      exactTimingHelp: "Exécuter exactement aux limites cron sans étalement.",
      staggerWindow: "Fenêtre de décalage",
      staggerUnit: "Unité de décalage",
      staggerPlaceholder: "30",
      seconds: "Secondes",
      model: "Modèle",
      modelPlaceholder: "openai/gpt-5.2",
      modelHelp: "Commencez à taper pour choisir un modèle connu, ou saisissez-en un personnalisé.",
      thinking: "Réflexion",
      thinkingPlaceholder: "low",
      thinkingHelp: "Utilisez un niveau suggéré ou saisissez une valeur spécifique au provider.",
      bestEffortDelivery: "Distribution au mieux",
      bestEffortHelp: "Ne faites pas échouer la tâche si la distribution elle-même échoue.",
      cantAddYet: "Impossible d’ajouter la tâche pour le moment",
      fillRequired: "Remplissez les champs obligatoires ci-dessous pour activer l’envoi.",
      fixFields: "Corrigez {count} champ pour continuer.",
      fixFieldsPlural: "Corrigez {count} champs pour continuer.",
      saving: "Enregistrement...",
      saveChanges: "Enregistrer les modifications",
      addJob: "Ajouter une tâche",
      cancel: "Annuler",
    },
    jobList: {
      allJobs: "toutes les tâches",
      selectJob: "(sélectionnez une tâche)",
      enabled: "activée",
      disabled: "désactivée",
      edit: "Modifier",
      clone: "Cloner",
      disable: "Désactiver",
      enable: "Activer",
      run: "Exécuter",
      history: "Historique",
      remove: "Supprimer",
    },
    jobDetail: {
      system: "Système",
      prompt: "Prompt",
      delivery: "Distribution",
      agent: "Agent",
    },
    jobState: {
      status: "Statut",
      next: "Prochaine",
      last: "Dernière",
    },
    runEntry: {
      noSummary: "Aucun résumé.",
      runAt: "Exécuter à",
      openRunChat: "Ouvrir le chat d’exécution",
      next: "Prochain {rel}",
      due: "Prévu {rel}",
    },
    errors: {
      nameRequired: "Le nom est obligatoire.",
      scheduleAtInvalid: "Saisissez une date/heure valide.",
      everyAmountInvalid: "L’intervalle doit être supérieur à 0.",
      cronExprRequired: "L’expression cron est obligatoire.",
      staggerAmountInvalid: "Le décalage doit être supérieur à 0.",
      systemTextRequired: "Le texte système est obligatoire.",
      agentMessageRequired: "Le message de l’agent est obligatoire.",
      timeoutInvalid: "S’il est défini, le délai d’expiration doit être supérieur à 0 seconde.",
      webhookUrlRequired: "L’URL du webhook est obligatoire.",
      webhookUrlInvalid: "L’URL du webhook doit commencer par http:// ou https://.",
      invalidRunTime: "Heure d’exécution invalide.",
      invalidIntervalAmount: "Montant d’intervalle invalide.",
      cronExprRequiredShort: "Expression cron obligatoire.",
      invalidStaggerAmount: "Montant de décalage invalide.",
      systemEventTextRequired: "Texte de l’événement système obligatoire.",
      agentMessageRequiredShort: "Message de l’agent obligatoire.",
      nameRequiredShort: "Nom obligatoire.",
    },
  },
};
