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",
    probe: "Sonder",
    call: "Appeler",
    confirm: "Confirmer",
    cancel: "Annuler",
    unselect: "Désélectionner",
    enabled: "Activé",
    disabled: "Désactivé",
    na: "n/d",
    configured: "Configuré",
    running: "En cours d’exécution",
    linked: "Lié",
    mode: "Mode",
    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",
    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)",
    },
  },
  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}",
  },
  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é)",
      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.",
    },
    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.",
      mobileHint:
        "Sur mobile ? Copiez l’URL complète (y compris #token=...) depuis openclaw dashboard --no-open sur votre ordinateur.",
    },
    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 →",
    },
    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",
    },
  },
  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",
    },
    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: "En cours…",
    },
    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: {
    page: {
      subtitle:
        "Voyez où vont les jetons, quand les sessions augmentent et ce qui génère les coûts.",
    },
    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",
    },
    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",
    },
    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: "Toutes",
      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",
  },
  chat: {
    disconnected: "Déconnecté du Gateway.",
    refreshTitle: "Actualiser les données du 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",
    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",
  },
  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)",
    tr: "Türkçe (turc)",
    uk: "Українська (ukrainien)",
    id: "Bahasa Indonesia (indonésien)",
    pl: "Polski (polonais)",
  },
  cron: {
    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: "Toutes",
      sort: "Trier",
      nextRun: "Prochaine exécution",
      recentlyUpdated: "Récemment mises à jour",
      name: "Nom",
      direction: "Direction",
      ascending: "Croissant",
      descending: "Décroissant",
      reset: "Réinitialiser",
      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",
      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.",
    },
  },
};
