import type en from './en';

const fr: typeof en = {
  common: {
    appName: 'Arboretum',
    loading: 'Chargement…',
    cancel: 'Annuler',
    logout: 'Se déconnecter',
    language: 'Langue',
    refresh: 'Rafraîchir',
    back: 'Retour',
    search: 'Rechercher',
    settings: 'Réglages',
    close: 'Fermer',
    retry: 'Réessayer',
    confirm: 'Confirmer',
    delete: 'Supprimer',
  },
  login: {
    title: 'Connectez-vous avec votre jeton d’accès',
    tokenLabel: 'Jeton d’accès',
    tokenPlaceholder: 'arb_…',
    submit: 'Se connecter',
    submitting: 'Connexion…',
    invalidToken: 'Jeton invalide',
    rateLimited: 'Trop de tentatives. Patientez avant de réessayer',
    genericError: 'Échec de la connexion ({status})',
  },
  sessions: {
    title: 'Sessions',
    refresh: 'Rafraîchir',
    empty: 'Aucune session. Démarrez-en une ci-dessous.',
    newSession: 'Nouvelle session',
    cwdLabel: 'Répertoire de travail',
    cwdPlaceholder: '/chemin/absolu/du/projet',
    commandLabel: 'Commande',
    creating: 'Création…',
    open: 'Ouvrir',
    observe: 'Observer',
    view: 'Voir',
    resume: 'Reprendre',
    fork: 'Dupliquer',
    kill: 'Tuer',
    confirmKill: 'Confirmer',
    live: 'en cours',
    resumable: 'reprenable',
    sourceDiscovered: 'découverte',
    hide: 'Masquer',
    unhide: 'Réafficher',
    hiddenBadge: 'masquée',
    hideDiscovered: 'Masquer l’historique externe',
    showHidden: 'Afficher les masquées',
    hideHidden: 'Masquer les masquées',
    archive: 'Archiver',
    unarchive: 'Désarchiver',
    archivedBadge: 'archivée',
    showArchived: 'Afficher les archivées',
    hideArchived: 'Masquer les archivées',
    clients: 'aucun client | 1 client | {n} clients',
    exitCode: 'code de sortie {code}',
    statusLabel: {
      starting: 'démarrage',
      running: 'en cours',
      exited: 'terminée',
    },
    registryStatus: {
      busy: 'occupée',
      idle: 'disponible',
      waiting: 'en attente',
    },
    dialog: {
      waiting: 'En attente de votre saisie',
      deny: 'Refuser (Échap)',
      kind: {
        trust: 'Confiance',
        permission: 'Permission',
        question: 'Question',
        plan: 'Plan',
      },
    },
  },
  dashboard: {
    title: 'Worktrees',
    allSessions: 'Toutes les sessions',
    groups: 'Groupes',
  },
  groups: {
    title: 'Groupes',
    new: 'Nouveau groupe',
    create: 'Créer',
    creating: 'Création…',
    nameLabel: 'Nom du groupe',
    namePlaceholder: 'ex. Stack paiements',
    colorLabel: 'Couleur',
    reposLabel: 'Dépôts',
    empty: 'Aucun groupe. Créez-en un ci-dessus.',
    noRepos: 'Aucun dépôt sélectionné.',
    noReposInGroup: 'Aucun dépôt dans ce groupe. Ajoutez-en ci-dessous.',
    noReposRegistered: 'Aucun dépôt enregistré. Ajoutez-en d’abord depuis le tableau de bord.',
    open: 'Ouvrir',
    edit: 'Modifier les dépôts',
    editDone: 'Terminé',
    remove: 'Supprimer',
    confirmDelete: 'Confirmer',
    repoCount: 'aucun dépôt | 1 dépôt | {n} dépôts',
    dashboard: 'Tableau de bord',
    missingRepo: 'Dépôt indisponible',
    removeFromGroup: 'Retirer du groupe',
    sessionsActive: 'aucune session active | 1 session active | {n} sessions actives',
    viewList: 'Dépôts',
    viewGrid: 'Terminaux',
    gridEmpty: 'Aucune session active dans ce groupe.',
    gridCapped: '{shown} sessions affichées sur {total}. Fermez des terminaux pour voir le reste.',
    newFeature: 'Nouvelle session de groupe',
    spanBadge: 'groupe · {n} dépôt | groupe · {n} dépôts',
  },
  crossRepo: {
    title: 'Nouvelle session de groupe',
    intro: 'Lance UNE session Claude couvrant tous les dépôts du groupe : une seule conversation reliant l’ensemble.',
    modeLabel: 'Répertoires',
    modeFeature: 'Nouvelle branche dans chaque dépôt',
    modeMain: 'Checkouts principaux',
    branchLabel: 'Nom de branche',
    branchPlaceholder: 'feature/…',
    branchHint: 'Créée si absente, réutilisée si déjà présente dans le dépôt.',
    baseRefLabel: 'Branche de base (optionnel)',
    baseRefPlaceholder: 'branche par défaut du dépôt',
    commandLabel: 'Session',
    reposLabel: 'Dépôts de la session',
    launch: 'Lancer la session',
    launching: 'Lancement…',
    close: 'Fermer',
    ok: 'worktree prêt',
    error: 'échec',
    skippedLabel: 'ignoré',
    done: 'Session de groupe démarrée.',
    sessionFailed: 'Impossible de démarrer la session.',
  },
  repos: {
    add: 'Ajouter un repo',
    adding: 'Ajout…',
    remove: 'Retirer',
    pathLabel: 'Chemin du dépôt',
    pathPlaceholder: '/chemin/absolu/du/repo',
    empty: 'Aucun dépôt enregistré. Ajoutez-en un ci-dessus, ou lancez un scan.',
    invalid: 'indisponible',
    scan: 'Scanner',
    scanResult: 'Aucun nouveau dépôt trouvé | 1 nouveau dépôt ajouté | {n} nouveaux dépôts ajoutés',
    hide: 'Masquer',
    show: 'Afficher',
    showHidden: 'Afficher les masqués ({n})',
  },
  worktrees: {
    new: 'Nouveau worktree',
    create: 'Créer',
    creating: 'Création…',
    branch: 'Branche',
    newBranch: 'créer la branche',
    baseRefLabel: 'Branche de base',
    baseRefPlaceholder: 'branche par défaut',
    start: 'Démarrer',
    starting: 'Démarrage…',
    startNone: 'aucune session',
    startWork: 'Démarrer le travail',
    modeLabel: 'Mode',
    modeWorktree: 'Worktree',
    modeMain: 'Branche principale',
    branchModeLabel: 'Branche',
    currentBranch: 'branche actuelle',
    newBranchOpt: 'nouvelle branche',
    commandLabel: 'Commande',
    delete: 'Supprimer',
    confirmDelete: 'Confirmer',
    forceDelete: 'Forcer la suppression',
    prune: 'Élaguer',
    commit: 'Commit',
    commitPlaceholder: 'Message de commit',
    committing: 'Commit…',
    push: 'Push',
    pushing: 'Push…',
    promote: 'Passer en principal',
    promoting: 'Promotion…',
    promoteConfirm:
      'La branche « {branch} » deviendra le checkout principal du dépôt ; ce worktree sera supprimé (l’ancienne branche principale est conservée). Continuer ?',
    forcePromote: 'Forcer (arbre modifié)',
    main: 'principal',
    detached: 'détaché',
    locked: 'verrouillé',
    prunable: 'élaguable',
    clean: 'propre',
    dirty: '{n} modifié(s)',
    noSession: 'aucune session',
    externalSessions: 'externes',
    showExternalSessions: 'Afficher les sessions externes ({n})',
  },
  project: {
    new: 'Nouveau projet',
    title: 'Nouveau projet',
    intro: 'Crée un nouveau dossier sous la racine choisie, puis y lance une session.',
    nameLabel: 'Nom du projet',
    namePlaceholder: 'mon-projet',
    rootLabel: 'Dossier racine',
    rootPlaceholder: '/chemin/absolu/racine',
    gitInit: 'Initialiser un dépôt git (git init)',
    commandLabel: 'Commande',
    create: 'Créer',
    creating: 'Création…',
  },
  workspace: {
    open: 'Ouvrir l’IDE',
    files: 'Fichiers',
    changes: 'Changements',
    noChanges: 'Aucun changement',
    changesTruncated: 'Trop de changements. Liste tronquée.',
    terminal: 'Terminal',
    editor: 'Éditeur',
    diff: 'Diff',
    noFileOpen: 'Aucun fichier ouvert',
    noFileHint: 'Choisissez un fichier dans l’arbre pour l’éditer, ou un fichier modifié pour voir son diff.',
    noSession: 'Aucune session ici',
    noSessionHint: 'Lancez une session sur ce worktree depuis le tableau de bord pour obtenir un terminal.',
  },
  ide: {
    projects: 'Projets',
    addProject: 'Ajouter un projet',
    noProjects: 'Aucun projet pour l’instant. Ajoutez-en un pour démarrer.',
    noWorktrees: 'Aucun worktree',
    activity: {
      explorer: 'Explorateur',
      git: 'Git',
      sessions: 'Sessions',
      groups: 'Groupes',
    },
    startClaude: 'Lancer Claude',
    startBash: 'Lancer bash',
    noFileOpen: 'Aucun fichier ouvert',
    noFileHint: 'Choisissez un fichier dans l’arbre pour l’éditer, ou un fichier modifié pour voir son diff.',
    terminals: 'Terminaux',
    noTerminal: 'Aucun terminal ouvert',
    noTerminalHint: 'Ouvrez une session Claude depuis l’arbre pour y attacher un terminal.',
    comingSoon: 'Bientôt disponible',
    ready: 'Prêt',
  },
  editor: {
    save: 'Enregistrer',
    unsaved: 'Modifications non enregistrées',
    conflict: 'Ce fichier a changé sur le disque depuis son ouverture.',
    reload: 'Recharger',
    overwrite: 'Écraser',
  },
  diff: {
    binary: 'Fichier binaire. Pas de diff texte.',
    tooLarge: 'Diff trop volumineux à afficher.',
    noChanges: 'Aucun changement dans ce fichier.',
  },
  git: {
    ahead: 'commits en avance',
    behind: 'commits en retard',
    staged: 'indexé',
    unstaged: 'non indexé',
    conflicts: 'conflits',
  },
  commit: {
    staged: 'Indexés',
    changes: 'Changements',
    stage: 'Indexer',
    unstage: 'Désindexer',
    stageAll: 'Tout indexer',
    unstageAll: 'Tout désindexer',
    discard: 'Abandonner',
    confirmDiscard: 'Confirmer l’abandon (destructif)',
    amend: 'Amender le dernier commit',
    amendPlaceholder: 'Nouveau message (vide = conserver le précédent)',
    messagePlaceholder: 'Message de commit…',
    commit: 'Commit',
    push: 'Push',
    fetch: 'Fetch',
    pull: 'Pull (fast-forward)',
    pullRebase: 'Pull --rebase',
    alreadyPushed: 'Amend impossible : ce commit a déjà été poussé.',
  },
  gitconn: {
    title: 'Connexions git',
    hint: 'Connectez Gitea, GitLab ou GitHub pour cloner des dépôts privés. Les tokens sont chiffrés au repos et jamais ré-affichés.',
    empty: 'Aucune connexion pour l’instant.',
    addConnection: 'Ajouter une connexion',
    add: 'Ajouter',
    service: 'Service',
    authType: 'Authentification',
    pat: 'Jeton d’accès personnel',
    appPassword: 'Mot de passe d’application',
    label: 'Libellé',
    labelPlaceholder: 'ex. Mon Gitea',
    baseUrl: 'URL de l’instance',
    username: 'Identifiant',
    usernamePlaceholder: 'optionnel',
    token: 'Jeton',
    password: 'Mot de passe',
    test: 'Tester',
    added: 'Connexion ajoutée',
    deleted: 'Connexion supprimée',
    testOk: 'Connecté en tant que {user}',
    testFailed: 'Échec de connexion : {error}',
  },
  clone: {
    button: 'Cloner',
    title: 'Cloner un dépôt',
    noCredential: 'Aucune connexion git configurée.',
    goSettings: 'En ajouter dans les Réglages',
    credential: 'Connexion',
    search: 'Rechercher',
    searchPlaceholder: 'Filtrer les dépôts…',
    private: 'privé',
    noRepos: 'Aucun dépôt trouvé.',
    more: 'Charger plus',
    dest: 'Dossier de destination',
    destPlaceholder: '/chemin/du/clone',
    destHint: 'Doit être sous un dossier de scan configuré ; le dossier est créé par le clone.',
    clone: 'Cloner',
    starting: 'Démarrage…',
    cloning: 'Clonage…',
    done: 'Clone terminé',
    failed: 'Échec du clone',
    back: 'Retour',
  },
  terminal: {
    observer: 'observateur (lecture seule)',
    sessionEnded: 'Session terminée',
    back: 'Sessions',
    notAttachable:
      'Cette session tourne hors d’Arboretum. Dupliquez-la pour interagir, ou reprenez-la une fois arrêtée.',
    fullscreen: 'Plein écran',
    exitFullscreen: 'Quitter le plein écran',
    maximize: 'Agrandir',
    restore: 'Réduire',
    openFullscreen: 'Ouvrir en plein écran',
    group: 'Groupe',
    covers: 'couvre',
  },
  push: {
    enable: 'Activer les notifications',
    disable: 'Notifications activées',
    denied: 'Permission de notification refusée. Activez-la dans les réglages du navigateur.',
    unsupported: 'Le push nécessite HTTPS (ex. Tailscale Serve) ; sur iOS, installez d’abord l’app sur l’écran d’accueil.',
  },
  fs: {
    browse: 'Parcourir…',
    up: 'Remonter',
    useFolder: 'Utiliser ce dossier',
    showHidden: 'Afficher les cachés',
    loading: 'Chargement…',
    empty: 'Aucun sous-dossier',
    repoBadge: 'dépôt',
  },
  ws: {
    reconnecting: 'Connexion perdue. Reconnexion…',
  },
  nav: {
    ide: 'IDE',
    worktrees: 'Worktrees',
    sessions: 'Sessions',
    groups: 'Groupes',
    settings: 'Réglages',
    help: 'Aide',
    more: 'Plus',
    gitea: 'Code source',
    buymeacoffee: 'Offrez-moi un café',
    waiting: 'en attente',
  },
  controls: {
    searchPlaceholder: 'Rechercher…',
    results: 'aucun résultat | 1 résultat | {n} résultats',
    sortBy: 'Trier par',
    filters: 'Filtres',
    clearAll: 'Effacer',
  },
  sort: {
    asc: 'Croissant',
    desc: 'Décroissant',
    session: {
      state: 'État',
      recent: 'Plus récentes',
      clients: 'Clients',
      cwd: 'Répertoire',
      command: 'Commande',
    },
    worktree: {
      main: 'Principal d’abord',
      branch: 'Branche',
      dirty: 'Modifications',
      ahead: 'En avance',
      behind: 'En retard',
      activity: 'Activité',
    },
    repo: {
      label: 'Nom',
      created: 'Créé le',
      worktrees: 'Worktrees',
      activity: 'Activité',
    },
    group: {
      label: 'Nom',
      created: 'Créé le',
      repos: 'Dépôts',
      activeSessions: 'Sessions actives',
    },
  },
  filter: {
    state: {
      label: 'État',
      live: 'Active',
      waiting: 'En attente',
      busy: 'Occupée',
      idle: 'Disponible',
      exited: 'Terminée',
      resumable: 'Reprenable',
    },
    command: {
      label: 'Commande',
    },
    source: {
      label: 'Source',
      managed: 'Gérée',
      discovered: 'Découverte',
    },
    repo: {
      label: 'Dépôt',
    },
    worktree: {
      dirtiness: 'Modifications',
      dirty: 'Modifié',
      clean: 'Propre',
      session: 'Session',
      with: 'Avec session',
      without: 'Sans session',
      flags: 'Drapeaux',
      locked: 'Verrouillé',
      prunable: 'Élaguable',
    },
  },
  pagination: {
    prev: 'Précédent',
    next: 'Suivant',
    pageOf: 'Page {page} / {pageCount}',
    perPage: 'Par page',
    all: 'Tout',
  },
  palette: {
    placeholder: 'Aller à un dépôt, worktree, session, groupe…',
    empty: 'Aucun résultat',
    hint: '↑↓ naviguer · ↵ ouvrir · échap fermer',
    types: {
      repo: 'Dépôt',
      worktree: 'Worktree',
      session: 'Session',
      group: 'Groupe',
      action: 'Action',
    },
    actions: {
      newSession: 'Nouvelle session',
      addRepo: 'Ajouter un dépôt',
      newGroup: 'Nouveau groupe',
    },
  },
  toast: {
    sessionCreated: 'Session démarrée',
    sessionKilled: 'Session tuée',
    sessionResumed: 'Session reprise',
    sessionForked: 'Session dupliquée',
    sessionHidden: 'Session masquée',
    sessionUnhidden: 'Session réaffichée',
    sessionsHidden: 'aucune session masquée | 1 session masquée | {n} sessions masquées',
    sessionArchived: 'Session archivée',
    sessionUnarchived: 'Session désarchivée',
    repoAdded: 'Dépôt ajouté',
    repoRemoved: 'Dépôt retiré',
    worktreeCreated: 'Worktree créé',
    worktreeDeleted: 'Worktree supprimé',
    pruned: 'Worktrees élagués',
    groupCreated: 'Groupe créé',
    groupUpdated: 'Groupe mis à jour',
    groupDeleted: 'Groupe supprimé',
    groupSessionLaunched: 'Session de groupe démarrée',
    groupSessionPartial: 'Session de groupe démarrée ({n} dépôt(s) ignoré(s))',
    projectCreated: 'Projet créé',
    genericError: 'Une erreur est survenue',
    dismiss: 'Fermer',
  },
  attention: {
    title: 'À traiter',
    count: 'aucune session en attente | 1 session en attente | {n} sessions en attente',
    empty: 'Rien à traiter',
  },
  settings: {
    title: 'Réglages',
    // Préférences
    preferences: 'Préférences',
    preferencesHint: 'Ces réglages ne s’appliquent qu’à ce navigateur.',
    language: 'Langue',
    notifications: 'Notifications',
    notificationsEnabled: 'Activées. Vous serez notifié lorsqu’une session attend une réponse.',
    notificationsDisabled: 'Désactivées.',
    enableNotifications: 'Activer les notifications',
    disableNotifications: 'Désactiver les notifications',
    testNotification: 'Envoyer un test',
    testSent: 'Notification de test envoyée',
    pushUnsupported: 'Le push exige HTTPS (ex. Tailscale Serve) ; sur iOS, installez d’abord l’app sur l’écran d’accueil.',
    // Accès & sécurité
    security: 'Accès & sécurité',
    securityHint: 'Les jetons donnent un accès complet à ce serveur. Créez-en un par appareil et révoquez ceux que vous n’utilisez plus.',
    tokens: 'Jetons d’accès',
    newTokenLabel: 'Libellé',
    newTokenPlaceholder: 'ex. téléphone, portable',
    createToken: 'Créer un jeton',
    tokenCreated: 'Jeton créé',
    copyTokenHint: 'Copiez ce jeton maintenant. Par sécurité il ne sera plus jamais affiché.',
    copy: 'Copier',
    copied: 'Copié',
    current: 'courant',
    created: 'Créé le {date}',
    lastUsed: 'utilisé le {date}',
    neverUsed: 'jamais utilisé',
    revoke: 'Révoquer',
    confirmRevoke: 'Confirmer la révocation',
    tokenRevoked: 'Jeton révoqué',
    lastTokenError: 'Impossible de révoquer le dernier jeton actif. Créez-en un autre d’abord.',
    save: 'Enregistrer',
    saved: 'Enregistré',
    // Sécurité & conformité
    compliance: 'Sécurité & conformité',
    complianceHint: 'Exportez ou effacez les données liées à votre jeton (RGPD), et consultez le journal d’audit des opérations sensibles.',
    exportData: 'Exporter mes données',
    refreshAudit: 'Journal d’audit',
    deleteData: 'Effacer mes données',
    deleteConfirm: 'Effacer les données liées à votre jeton (abonnements push) et révoquer ce jeton ? Action irréversible.',
    deleteDone: 'Vos données ont été effacées.',
    // Découverte des dépôts
    discovery: 'Découverte des dépôts',
    discoveryHint: 'Arboretum scanne ces dossiers à la recherche de dépôts git et les enregistre automatiquement. Les dépôts masqués sont conservés et jamais ré-ajoutés.',
    scanRoots: 'Dossiers à scanner',
    scanRootsEmpty: 'Aucun dossier configuré. Votre dossier personnel est utilisé par défaut.',
    addRoot: 'Ajouter un dossier',
    removeRoot: 'Retirer',
    scanInterval: 'Intervalle de re-scan (minutes)',
    scanIntervalHint: '0 désactive le scan périodique. Les changements prennent effet au prochain redémarrage du daemon.',
    // Sessions (rétention / archivage auto)
    sessions: 'Sessions',
    sessionsHint: 'Les sessions terminées plus anciennes que la fenêtre de rétention sont archivées automatiquement (masquées de la liste par défaut). Rien n’est supprimé. Une session archivée reste reprenable et forkable.',
    retentionDays: 'Auto-archiver après (jours)',
    retentionDaysHint: '0 n’archive jamais. Les sessions archivées sont masquées par défaut ; activez « Afficher les archivées » dans la liste pour les voir.',
    // Claude CLI
    claudeCli: 'CLI Claude',
    claudeCliHint: 'Où Arboretum trouve le binaire `claude` et ses données. Utile quand le daemon tourne en service avec un PATH minimal qui n’inclut pas ~/.local/bin.',
    claudeBinStatusOk: 'Détecté',
    claudeBinStatusNotFound: 'Introuvable. Impossible de lancer une session tant que ce n’est pas résolu.',
    claudeBinStatusBadPath: 'Le chemin configuré n’est pas un fichier exécutable.',
    claudeBinSourceConfigured: 'configuré',
    claudeBinSourcePath: 'PATH',
    claudeBinPathLabel: 'Chemin du binaire (override)',
    claudeBinPathHint: 'Chemin absolu vers l’exécutable `claude`. Laisser vide pour l’auto-détection via le PATH. Prend effet à la prochaine session.',
    claudeBinPathPlaceholder: 'ex. /home/vous/.local/bin/claude',
    claudeHomeLabel: 'Répertoire ~/.claude',
    claudeHomeHint: 'Surcharge l’emplacement de ~/.claude (transcripts & registre des sessions). Prend effet au redémarrage du daemon.',
    claudeHomePlaceholder: 'ex. /home/vous/.claude',
    // Serveur (lecture seule)
    server: 'Serveur',
    serverHint: 'Définis au démarrage via des flags CLI. Les modifier nécessite de redémarrer le daemon.',
    version: 'Version',
    port: 'Port',
    bind: 'Adresse de liaison',
    allowedOrigins: 'Origines autorisées',
    dataDir: 'Répertoire de données',
    vapidPublicKey: 'Clé publique VAPID',
    vapidContact: 'Contact VAPID',
    none: 'aucune',
    flagHint: 'Flag CLI : {flag}',
    // Soutien
    support: 'Soutenir le projet',
    supportHint: 'Arboretum est un projet personnel libre et auto-financé. S’il vous fait gagner du temps, vous pouvez soutenir son développement.',
    supportCta: 'Offrez-moi un café',
  },
  help: {
    title: 'Aide',
    intro: 'Tout ce qu’Arboretum sait faire, et comment l’utiliser.',
    searchPlaceholder: 'Rechercher dans l’aide…',
    noMatch: 'Aucun sujet correspondant',
  },
};

export default fr;
