{
  "product": "YSK Server",
  "tagline": "AI-centric, security-first Linux server management platform",
  "company": "YSK Limited",
  "agents": {
    "title": "Runtimes d'agents IA",
    "body": "Installation et supervision OpenClaw / Hermes / IonClaw ; tous les appels d'outils passent par Allowlist et approbation.",
    "status": {
      "running": "En cours",
      "activating": "Départ",
      "stuck": "Commencez bloqué",
      "connected": "En ligne",
      "registered": "Enregistré uniquement",
      "stale": "Obsolète",
      "disconnected": "Hors ligne",
      "not_installed": "Non installé",
      "failed": "Échoué",
      "error": "Erreur",
      "unknown": "Non sondé",
      "fallback": "Inconnu"
    },
    "cmdStatus": {
      "queued": "En file d'attente",
      "acked": "Acquitté",
      "done": "Fait",
      "error": "Erreur"
    },
    "activatingStuckHint": "Activation de plus de 5 minutes : considérée comme un échec. Vérifiez le journal.",
    "noOnlineAgents": "Aucun agent en ligne",
    "journal": "journal",
    "writeUnit": "Unité d'écriture",
    "writeUnitConfirm": "Écrivez l'unité systemd pour {{kind}} sous /etc/systemd. Le service n'est pas démarré ou activé.",
    "liveN": "{{count}} en ligne",
    "registeredOnly": "Enregistré uniquement",
    "awaitProbe": "En attente de sondage",
    "runtimes": "Durées d'exécution",
    "running": "En cours",
    "liveAgents": "Agents en ligne",
    "fleet": "Flotte",
    "aiTasks": "Tâches IA",
    "expBanner": "Expérimental.",
    "expBody": "Enregistrement ≠ en ligne. Les opérations réelles passent par la CLI :",
    "expDocs": "Docs : dépôt",
    "expEdge": "Sur un bord :",
    "expPayload": "; recommandation de charge utile de commande",
    "fleetCan": "Ce que la flotte peut faire",
    "fleetCanDesc": "Pas une liste creuse — de vraies capacités du plan de contrôle pour les nœuds edge",
    "capRegister": "Enregistrer",
    "capRegisterD": "Écrit la liste du plan de contrôle (statut « enregistré uniquement ») — le processus peut ne pas tourner",
    "capCommand": "Commande",
    "capCommandD": "Préréglages CLI (readiness / host / projects…) ou personnalisé ; l'edge récupère, exécute ysk-server et accuse réception",
    "capHistory": "Historique des commandes",
    "capHistoryD": "en file / terminé / erreur, code de sortie, résultat JSON formaté",
    "capDelete": "Supprimer",
    "capDeleteD": "Supprime la session et les messages associés",
    "capStatus": "Statut",
    "capStatusD": "Enregistré uniquement → en ligne (heartbeat) → obsolète (>60 s sans heartbeat)",
    "statusFlowTitle": "Flux de statut",
    "statusFlow": "Enregistré uniquement → en ligne → obsolète (> 60 s) → hors ligne (déconnecté). Le filtre « Hors ligne » est déconnecté.",
    "colSession": "UUID de session",
    "copySession": "Copier l'UUID de session pour le cluster/CLI --session",
    "staleFor": "Invisible {{age}}",
    "commandTitle": "Mettre une commande en file d'attente pour cette session",
    "historyTitleShort": "Ouvrir l'historique des commandes (lecture seule)",
    "fleetTitle": "Flotte ({{count}})",
    "fleetDesc": "Registre du plan de contrôle · enregistré ≠ nœud en ligne",
    "registerPlus": "+ Enregistrer un agent",
    "colId": "ID",
    "colStatus": "Statut",
    "colGroup": "Groupe",
    "colLastSeen": "Dernière activité",
    "command": "Commande",
    "history": "Historique",
    "emptyAgents": "Aucun agent enregistré",
    "emptyAgentsDesc": "Enregistrez depuis la liste, ou attendez que les processus edge s'enregistrent seuls",
    "historyTitle": "Historique des commandes · {{id}}",
    "historyDesc": "en file jusqu'à ce que le nœud récupère ;",
    "refreshHistory": "Actualiser l'historique",
    "colTime": "Heure",
    "finishedAt": "Terminé {{at}}",
    "colCommand": "Commande",
    "colResult": "Résumé du résultat",
    "colExit": "Sortie",
    "hasResult": "A un résultat",
    "emptyCmds": "Aucune commande pour l'instant",
    "emptyCmdsDesc": "Mettez en file avec « Commande » ; reste en file tant que l'agent edge n'est pas en ligne",
    "edgeOnlineTitle": "Comment les agents edge passent en ligne",
    "edgeOnlineDesc": "Après l'enregistrement dans le panneau, le nœud doit exécuter la boucle sortante pour le heartbeat / récupérer les commandes",
    "controlPlaneApi": "API du plan de contrôle :",
    "controlPlaneHint": "(doit être accessible ; utilisez l'adresse réelle du panneau en production)",
    "queueNote": "Sans processus edge, « Commande » fonctionne toujours : elle reste en file jusqu'à ce que l'agent soit en ligne.",
    "runtimeTitle": "Runtimes IA",
    "runtimeDesc": "Sonder les chemins et les units ;",
    "emptyRuntime": "Aucun résultat de sonde pour l'instant",
    "emptyRuntimeDesc": "Actualisez pour charger les runtimes, ou sondez individuellement",
    "pathExists": "Existe",
    "pathMissing": "Non installé",
    "unitUnknown": "{{unit}} · inconnu",
    "unitFallback": "unité",
    "path": "Chemin",
    "probe": "Sonder",
    "install": "Installer",
    "recentOps": "Ops récentes",
    "registerTitle": "Enregistrer l'agent",
    "registerDesc": "Écrit uniquement la liste du plan de contrôle ; ne signifie pas que le nœud est en ligne",
    "register": "Enregistrer",
    "agentId": "ID agent",
    "agentIdHint": "ID unique, ex. edge-1 ou office-gateway",
    "group": "Groupe",
    "groupHint": "Pour le zonage / filtres de liste",
    "registerNote": "Le statut affiche « registered only » tant que le nœud n'exécute pas l'agent sortant et les heartbeats.",
    "cmdTitle": "Commande · {{id}}",
    "cmdTitlePlain": "Commande",
    "cmdDesc": "En file ; l'agent edge récupère, exécute et acquitte (reste en file hors ligne)",
    "enqueue": "Mettre en file",
    "cmdPreset": "Commande (CLI d'abord)",
    "cmdTypeAria": "Type de commande",
    "customCli": "CLI personnalisée",
    "cliArgs": "Arguments CLI",
    "cliArgsHint": "N'incluez pas ysk-server ; ex. logs journal --unit nginx.service",
    "cmdNote": "L'agent edge ysk-server run exécute le JSON CLI localement (ajoute --json). Les modifications hôte exigent toujours YSK_EXECUTE=1 sur l'edge. Voir le code de sortie et le JSON dans l'Historique.",
    "resultTitle": "Résultat de la commande · exit {{code}}",
    "resultTitlePlain": "Résultat de la commande",
    "codeComment": "# Concept : register → boucle heartbeat → pull des commandes → ack\n# Library : ysk-server-core runOutboundAgent / agentCycle",
    "resultOuter": "Externe : ack edge (exitCode / stderr). Résultat interne :",
    "deleteTitle": "Supprimer {{id}} ?",
    "deleteTitlePlain": "Supprimer l'agent ?",
    "deleteDesc": "L'historique des commandes associées sera également supprimé.",
    "fact": {
      "kind": "Taper",
      "name": "Nom",
      "status": "Statut",
      "unitActive": "Service",
      "unitName": "Unité",
      "pathExists": "Le chemin existe",
      "installPath": "Chemin d'installation"
    },
    "installBlocked": "Impossible de terminer l'installation dans le panneau d'administration",
    "registeredMsg": "Enregistré {{id}} (plan de contrôle uniquement ; le nœud doit exécuter l'agent sortant et le heartbeat pour passer en ligne)",
    "registerFailed": "Échec de l'enregistrement",
    "removedFleet": "Enregistrement de flotte supprimé",
    "enqueuedMsg": "Commande {{id}} mise en file… (s'exécute après le pull du nœud)",
    "enqueueFailed": "Échec de la mise en file d'attente",
    "loadCommandsFailed": "Échec du chargement des commandes",
    "probedMsg": "{{kind}} sondé",
    "probeFailed": "Échec du sondage",
    "wroteUnitMsg": "Paramètres d'unité {{kind}} écrits",
    "writeFailed": "Échec de l'écriture",
    "installedMsg": "{{kind}} installé",
    "installIncomplete": "Installation incomplète",
    "badgeDryRun": "essai à sec",
    "badgeBlocked": "bloqué",
    "labelStderr": "stderr",
    "labelAckCli": "accusé de réception + CLI JSON",
    "labelStdoutBody": "Corps stdout CLI",
    "resultOuterHint": "Le résultat externe est la sortie stdout de CLI --json.",
    "noteAllowlist": "Les appels à l'outil d'agent doivent passer la liste autorisée.",
    "noteRbacCap": "Le rôle de l'agent est limité à l'écriture faible."
  },
  "ai": {
    "status": {
      "completed": "Terminé",
      "done": "Fait",
      "executed": "Exécuté",
      "failed": "Échoué",
      "error": "Erreur",
      "rejected": "Rejeté",
      "pending": "En attente",
      "planned": "Planifié",
      "approved": "Approuvé",
      "running": "En cours",
      "cancelled": "Annulé"
    },
    "activeCount": "{{count}} actifs",
    "taskCount": "{{count}} tâches",
    "tasks": "Tâches",
    "active": "Actif",
    "tasksTab": "Tâches ({{count}})",
    "playbooksTab": "Manuels de jeu ({{count}})",
    "queueTitle": "File des tâches",
    "queueSub": "Sélectionnez pour voir le plan et les étapes · aucune action supplémentaire à l'état terminal",
    "createTaskPlus": "+ Créer une tâche",
    "emptyTasks": "Aucune tâche pour le moment",
    "emptyTasksDesc": "Créez une tâche depuis la liste, ou exécutez un playbook",
    "browsePlaybooks": "Parcourir les playbooks",
    "noPrompt": "(aucun prompt)",
    "stepsOf": "Étapes {{done}}/{{total}}",
    "noPlanSummary": "(aucun résumé du plan)",
    "pipelineAria": "Phases de la tâche",
    "phase": {
      "plan": "Plan",
      "approve": "Revue",
      "run": "Exécuter",
      "done": "Fait"
    },
    "approveRun": "Approuver et exécuter",
    "cancelTask": "Annuler la tâche",
    "terminalHint": "Tâche terminée — créez une nouvelle tâche ou exécutez un playbook",
    "stepsTitle": "Étapes ({{count}})",
    "noSteps": "Aucune étape pour le moment",
    "needsApproval": "Approbation requise",
    "noApproval": "Aucune approbation",
    "reject": "Rejeter",
    "selectTask": "Sélectionner une tâche",
    "selectTaskDesc": "Sélectionnez une tâche à gauche pour afficher le plan et les étapes",
    "playbooksTitle": "Manuels de jeu",
    "playbooksSub": "Ops prédéfinies · l'exécution crée une tâche et bascule vers Tâches",
    "countItems": "{{count}}",
    "searchPh": "Nom / description",
    "noPlaybooks": "Aucun playbook correspondant",
    "noPlaybooksDesc": "Modifiez les mots-clés ou effacez la recherche",
    "run": "Exécuter",
    "createTitle": "Créer une tâche IA",
    "createDesc": "Planification ≠ exécuté. Les outils restent sur la liste d'autorisation.",
    "generatePlan": "Générer le plan",
    "promptLabel": "Instruction en langage naturel",
    "promptHint": "ex. : vérifier la charge de l'hôte ; ou l'état de nginx",
    "promptPh": "Décrivez ce que vous souhaitez…",
    "createHint": "Ensuite : approuvez et exécutez dans le détail de la tâche, ou rejetez des étapes individuellement."
  },
  "apache": {
    "pageDesc": "Sites Apache (projets PHP + autonomes)",
    "pillSites": "{{count}} sites",
    "pillSitesSplit": "{{n}} sites · {{leftover}} restes",
    "listTitle": "Sites ({{count}})",
    "emptyTitle": "Aucun site",
    "createSite": "+ Créer un site",
    "createTitle": "Créer un site",
    "editTitle": "Modifier le site",
    "deleteTitle": "Supprimer le site ?",
    "deleteDesc": "Supprimer ce site Apache ?",
    "stopSites": "{{n}} le(s) site(s) cesseront de répondre à HTTP.",
    "colServerName": "Nom du serveur",
    "colSource": "Source",
    "colKind": "Taper",
    "colTarget": "Cible",
    "colStatus": "Statut",
    "filterSource": "Filtre source",
    "sourceAll": "Tous",
    "sourceProject": "Projet",
    "sourceStandalone": "Autonome",
    "sourceArtifact": "Sur disque",
    "sourceOrphan": "Restes",
    "orphanSite": "Projet terminé",
    "openProject": "Ouvrir le projet",
    "kindLabel": "Taper",
    "kindProxy": "Procuration",
    "kindStatic": "Statique",
    "kindPhp": "PHP",
    "upstreamLabel": "En amont",
    "rootLabel": "Racine des documents",
    "sslLabel": "SSL",
    "sslTerminatedUpstream": "TLS se termine à l'avant de Nginx",
    "apply": "Appliquer",
    "notInstalled": "Apache n'est pas installé",
    "globalSettings": "Paramètres globaux",
    "siteSettings": "Paramètres du site",
    "saveApply": "Enregistrer et postuler",
    "settingsSaved": "Enregistré",
    "setGzip": "Gzip",
    "setShowVersion": "Afficher la version",
    "setHttp2": "HTTP/2",
    "setBody": "Corps maximum",
    "setKeepalive": "Garder en vie",
    "setAccessLog": "Journal d'accès",
    "logOn": "Activé",
    "logOff": "Désactivé",
    "setForceHttps": "Forcer HTTPS",
    "setHsts": "HSTS",
    "setIndexes": "Liste d'annuaire",
    "bodyInherit": "Mondial",
    "conflict": "Conflit de nom",
    "conflictHint": "Le même ServerName a plusieurs sources. Conservez la ligne projet/autonome et supprimez les disques orphelins.",
    "removeArtifact": "Supprimer les résidus",
    "removeArtifactTitle": "Supprimer la configuration résiduelle ?",
    "removeArtifactDesc": "Supprimez cette configuration Apache non réclamée du répertoire de données du panneau et désactivez le jumeau système lorsque cela est possible. Ne supprime pas le projet.",
    "removeArtifactHint": "Supprime seulement ce conf disque reliquat. Ne supprime pas le projet.",
    "previewConf": "Aperçu de la conférence",
    "cleanupConflicts": "Nettoyer les résidus de conflit",
    "cleanupConflictsTitle": "Nettoyer tous les résidus de conflit ?",
    "cleanupConflictsDesc": "Supprimez toutes les configurations d'artefacts sur disque en conflit avec un projet ou un nom de serveur autonome. Les lignes du projet sont conservées.",
    "artifactRemovedOk": "Conf résiduel supprimé"
  },
  "applyStatus": {
    "draft": "Brouillon",
    "written": "Écrit (données du panneau)",
    "planned": "En cours",
    "applied": "Appliqué sur l'hôte",
    "failed": "Échoué",
    "pendingExecute": "Nécessite l'exécution sur l'hôte",
    "uploaded": "Téléversé",
    "issued": "Émis",
    "missing": "Fichier manquant"
  },
  "audit": {
    "recent": "Audit récent",
    "lastN": "Derniers {{n}}",
    "actions": {
      "protection.change": "Paramètres de protection modifiés",
      "auth.locale": "Langue de l'interface modifiée",
      "auth.login": "Connecté",
      "auth.logout": "Déconnecté",
      "system.firewall.allow_port": "Pare-feu : autoriser le port",
      "system.firewall.deny": "Pare-feu : refuser l'IP",
      "system.firewall.apply": "Appliquer le pare-feu",
      "project.deploy": "Déploiement du projet",
      "project.create": "Projet créé",
      "project.delete": "Projet supprimé",
      "ssl.request": "Demande SSL",
      "ssl.upload": "Téléversement SSL",
      "system.firewall.enable": "Activer/désactiver le pare-feu",
      "system.firewall.delete_rule": "Supprimer la règle de pare-feu",
      "system.firewall.delete_deny": "Retirer l'IP en refus permanent",
      "db.adminer.apply": "Projet explorateur BD",
      "project.goLive": "Mise en production du projet",
      "project.publish": "Publier Nginx",
      "project.suspend": "Suspendre le projet",
      "software.install": "Installer un logiciel",
      "software.update": "Mettre à jour un logiciel",
      "backup.restore": "Restauration de sauvegarde",
      "backup.run": "Exécution de sauvegarde",
      "backup.delete": "Sauvegarde supprimée"
    }
  },
  "backups": {
    "settingsSaved": "Paramètres de sauvegarde enregistrés",
    "saveFailed": "Échec de l'enregistrement",
    "downloadStarted": "Téléchargement démarré : {{name}}",
    "nothingToDo": "Rien à faire",
    "tarOkSideFail": "tar OK / étapes annexes en erreur",
    "success": "Succès",
    "hasFailures": "Échecs présents",
    "notYet": "Pas encore",
    "enabled": "Activé",
    "needPassword": "Mot de passe manquant",
    "off": "Désactivé",
    "lastRun": "Dernier {{label}}",
    "backupFiles": "Fichiers de sauvegarde",
    "projects": "Projets",
    "lastAll": "Dernier tout",
    "latestFile": "Dernières archives",
    "remote": "Distant",
    "withBackups": "Projets avec sauvegardes",
    "ops": "Actes",
    "remoteExclude": "Distant / exclusions",
    "about": "À propos",
    "noBackups": "Aucune sauvegarde pour l’instant",
    "noBackupsDesc": "Lancez « Sauvegarder tous les projets » ou Sauvegarder sur le détail d’un projet",
    "goOps": "Aller aux actions",
    "projectShort": "Projet",
    "download": "Télécharger",
    "preview": "Aperçu",
    "restoreWeb": "Restaurer le web",
    "restoreFull": "Restauration complète",
    "restoreFullTitle": "Écraser les fichiers de projet et les bases de données de cette archive — saisissez le nom du fichier pour confirmer",
    "restoreWebTitle": "Restaurer les fichiers du site Web uniquement à partir de cette archive",
    "previewTitle": "Aperçu de la restauration sans écrire",
    "partialSkipped": "Partiel – certains projets ignorés",
    "delete": "Supprimer",
    "opsTitle": "Actes",
    "opsHint": "0 projet ou tous ignorés = succès ;",
    "noProjects": "(aucun projet)",
    "successRatio": "· {{ok}}/{{total}} ok",
    "summary": "Résumé{{extra}}",
    "backupFailed": "Échec de la sauvegarde",
    "backupDone": "Sauvegarde terminée",
    "backupAll": "Sauvegarder tous les projets",
    "controlPlane": "Sauvegarder le plan de contrôle",
    "controlPlaneDone": "Sauvegarde du plan de contrôle terminée",
    "cronCmd": "Commande : ysk-server backup all --data-dir …",
    "cronHint": "Un POST de planification avec install=true charge le crontab hôte lorsque EXECUTE est activé ;",
    "dailyCronRegistered": "Planification quotidienne 03:00 enregistrée",
    "registerDailyCron": "Enregistrer la planification quotidienne (+ install)",
    "resticNeedConfig": "Activez d’abord restic et définissez le mot de passe sous Distant / exclusions",
    "resticFailed": "échec de restic",
    "resticDone": "sauvegarde incrémentale restic terminée",
    "resticOnly": "Exécuter restic uniquement",
    "listSnapshots": "Lister les instantanés restic",
    "lastAllDetail": "Détail de la dernière sauvegarde complète",
    "time": "Heure",
    "result": "Résultat",
    "nothingZero": "Rien à faire (0 projet)",
    "notes": "Remarques",
    "status": "Statut",
    "skipped": "Ignoré",
    "failed": "Échoué",
    "lastNoProjects": "Aucun projet n’avait besoin d’une sauvegarde la dernière fois.",
    "noPerProject": "Aucun résultat par projet.",
    "remoteSide": "Étapes annexes Distant / restic",
    "step": "Étape",
    "remoteStep": "Distant",
    "restoreProjectId": "Restaurer projectId (vide = tout lister)",
    "needProjectOrTag": "Renseigner projectId ou le snapshot doit avoir le tag project:",
    "dryRunDone": "dry-run terminé (aucune écriture)",
    "allSuccess": "Tout a réussi",
    "failOrSkip": "Échecs / ignorés",
    "noteN": "Remarque {{n}}",
    "enableRemote": "Activer le push distant",
    "targetKind": "Type de cible",
    "remoteKindAria": "Type de cible distante",
    "localPath": "Chemin local",
    "host": "Hôte",
    "port": "Port",
    "username": "Nom d'utilisateur",
    "password": "Mot de passe",
    "passwordSshHint": "Vide pour utiliser la clé SSH de l'hôte",
    "savedLeaveEmpty": "Laisser vide si déjà enregistré",
    "s3Bucket": "Chemin du bucket",
    "region": "Région",
    "endpointOptional": "Endpoint (facultatif)",
    "localMirror": "Chemin du miroir local",
    "remotePath": "Chemin distant",
    "remotePathHint": "Par rapport au domicile de l’utilisateur distant (ou chroot SFTP). \".\" est-ce que c'est la maison ?",
    "resticTitle": "Restique incrémentiel",
    "resticDesc": "Facultatif ; restic dans le PATH. Mot de passe requis si activé (pas de valeur par défaut)",
    "enableRestic": "Activer restic",
    "repoPath": "Chemin du dépôt",
    "repoPassword": "Mot de passe du dépôt",
    "repoPassSaved": "Enregistré ; vide = conserver. Requis si activé.",
    "repoPassRequired": "Requis lorsque restic est activé (pas de mot de passe par défaut)",
    "savedPlaceholder": "Enregistré (vide = conserver)",
    "required": "Requis",
    "s3RepoUrl": "Ou URL de dépôt S3",
    "excludeTitle": "Règles d'exclusion",
    "excludeSub": "chemins d'exclusion tar, un glob par ligne",
    "excludeList": "Liste d'exclusion",
    "saveAll": "Enregistrer tous les paramètres",
    "restoreFailed": "Échec de la restauration",
    "previewDone": "Aperçu terminé",
    "restoreDone": "Restauration terminée",
    "previewQ": "Aperçu du contenu de la sauvegarde ?",
    "restoreWebQ": "Restauration sélective (web) ?",
    "restoreFullQ": "Restauration complète ?",
    "previewDesc": "Lister {{name}} uniquement — aucune modification de fichier.",
    "restoreWebDesc": "Extraire {{name}} dans le répertoire du projet (plus sûr).",
    "restoreFullDesc": "Restauration tar complète de {{name}} ; peut écraser les fichiers existants.",
    "restore": "Restaurer",
    "cancel": "Annuler",
    "deleteFailed": "Échec de la suppression",
    "deleted": "Supprimé",
    "deleteTitle": "Supprimer le fichier de sauvegarde ?",
    "deleteDesc": "Supprimer définitivement {{name}}",
    "tabTrash": "Corbeille",
    "trashTitle": "Corbeille ({{count}})",
    "trashSub": "Les archives supprimées restent ici pendant 7 jours, puis elles sont définitivement supprimées.",
    "trashEmpty": "La corbeille est vide",
    "trashEmptyDesc": "Les fichiers de sauvegarde supprimés apparaissent ici pendant 7 jours.",
    "trashRestore": "Restaurer",
    "trashPurge": "Supprimer pour toujours",
    "trashEmptyAll": "Corbeille vide",
    "trashExpires": "Expire {{at}}",
    "trashPurgeTitle": "Supprimer définitivement cette sauvegarde ?",
    "trashPurgeDesc": "Supprimez définitivement {{name}}. Cela ne peut pas être annulé.",
    "trashEmptyTitle": "Corbeille vide ?",
    "trashEmptyDescConfirm": "Supprimez définitivement {{count}} archive(s). Tapez le nombre pour confirmer.",
    "trashRestored": "Restauré à partir de la corbeille",
    "trashPurged": "Supprimé définitivement",
    "trashedOk": "Déplacé vers la corbeille",
    "resticSafeTitle": "Restauration restic vers un répertoire sûr ?",
    "resticSafeDesc": "Restaurer {{snapshot}} vers le répertoire .restic-restore-* du projet {{project}}",
    "resticRestoreDone": "Restauration restic terminée",
    "overwriteTitle": "Danger : écrasement du home",
    "overwriteDesc": "Va écraser le home du projet {{project}}. Tapez OVERWRITE pour confirmer.",
    "confirmString": "Chaîne de confirmation",
    "overwriteHome": "Écraser le home",
    "resticOverwriteDone": "Écrasement restic du home terminé",
    "opsResult": "Résultat ops",
    "filesTitle": "Fichiers de sauvegarde ({{count}})",
    "filesSub": "Tar du répertoire de gestion · téléchargement nécessite une connexion · restauration : dry-run / web / full",
    "backupAllBtn": "Tout sauvegarder",
    "yes": "Oui",
    "no": "Non",
    "safeDir": "Répertoire sûr",
    "remotePushTitle": "Cible de push distant",
    "remotePushSub": "Après succès du tar local, envoyer vers SFTP, chemin local ou S3",
    "accessKey": "Clé d'accès",
    "secretKey": "Clé secrète",
    "overwriteConfirmHint": "Tapez OVERWRITE pour confirmer l'écrasement",
    "testRemote": "Tester la destination",
    "testRemoteHint": "Se connecte à l'hôte distant et écrit un petit fichier de sonde. Pas en lecture seule.",
    "testRemoteDone": "Sonde distante terminée",
    "testRemoteFailed": "Sonde distante échouée",
    "resticRepoPh": "Répertoire de données du panneau / restic-repo",
    "testDisabledHint": "Activez le push à distance avant de tester.",
    "identityId": "Identité SSH sortante",
    "identityHint": "Préféré. Même coffre-fort que /security SSH. Le mot de passe nécessite sshpass.",
    "identityNone": "Aucun — mot de passe ou clé par défaut",
    "skippedListHint": "Ces projets ont été ignorés :",
    "skippedPendingOs": "Ignoré : utilisateur/domicile du système d'exploitation non provisionné",
    "goLogs": "Journaux ouverts",
    "goAbout": "Notes de sauvegarde",
    "previewListingTitle": "Archiver le contenu",
    "restoreNamedDesc": "Restaurez {{name}} dans le projet {{project}}.",
    "overwriteNamedDesc": "Écrasez les fichiers du projet {{project}} à partir de l'instantané {{snapshot}}.",
    "resticSafeNamed": "Restaurez l'instantané {{snapshot}} du projet {{project}} dans un répertoire sécurisé."
  },
  "btTracker": {
    "title": "Traqueur BT",
    "sub": "Self-hosted BitTorrent / WebTorrent tracker for file shares",
    "pageDesc": "Seed panel file shares over BitTorrent. Start the tracker, set a public announce host, then create BT shares in Files.",
    "status": "Statut",
    "running": "En cours d'exécution",
    "stopped": "Arrêté",
    "installed": "Installed (bundled)",
    "start": "Start tracker",
    "stop": "Stop tracker",
    "stopTitle": "Arrêtez le tracker - l'amorçage et les téléchargements seront interrompus",
    "stopDesc": "Les torrents en cours d'exécution arrêtent d'annoncer. Les pairs se déconnectent jusqu'à ce que vous redémarriez le tracker.",
    "fillPublicHost": "Utilisez {{host}}",
    "fillPublicHostTitle": "Remplissez le nom d'hôte actuel du panneau en tant qu'hôte d'annonce publique",
    "refresh": "Rafraîchir",
    "settings": "Paramètres",
    "httpPort": "HTTP / WebSocket port",
    "udpPort": "UDP port (0 = off)",
    "listenHost": "Listen host",
    "listenHostHint": "0.0.0.0 écoute sur chaque adresse. Préférez 127.0.0.1 à moins que les pairs doivent atteindre cet hôte.",
    "listenAllWarn": "Tracker est lié à toutes les adresses. Avec le pare-feu désactivé, c'est public. Liez 127.0.0.1 pour le local uniquement ou restreignez le port dans le pare-feu.",
    "bindLoopback": "127.0.0.1 uniquement",
    "bindAll": "0.0.0.0 (tous)",
    "wsEnabled": "WebSocket tracker (browser WebTorrent)",
    "wsEnabledHint": "Required for browser WebTorrent clients",
    "autostart": "Autostart with panel",
    "autostartHint": "Start tracker when ysk-server serve boots",
    "publicAnnounceHost": "Public announce host",
    "publicAnnounceHostHint": "Host or host:port used in magnet announce URLs. Empty = 127.0.0.1 until you set a public hostname.",
    "maxSeeds": "Max concurrent seeds",
    "seederPorts": "Seeder peer ports",
    "seederPortMin": "Démarrage du port homologue",
    "seederPortMax": "Fin du port homologue",
    "seederPortsHint": "Local peer listen range for the in-process seeder",
    "saveSettings": "Save settings",
    "applyHint": "Saving ports does not open the firewall — use network exposure or Start after EXECUTE.",
    "torrents": "Tracked torrents",
    "torrentsEmpty": "No announce traffic yet",
    "torrentsEmptyHint": "Create a file share with BitTorrent mode in Files. This table fills as peers announce and the server seeds.",
    "torrentsDesc": "Live swarm from the tracker, plus local seeder status for panel shares.",
    "colName": "Nom",
    "colHash": "Info hash",
    "colSeeds": "Graines",
    "colLeechers": "Sangsues",
    "colStatus": "Statut",
    "announceUrls": "Announce URLs",
    "announceDesc": "Put these trackers in clients, or rely on magnets generated by the panel.",
    "copy": "Copie",
    "copied": "Copié",
    "statsTorrents": "Torrents",
    "statsLibrary": "Bibliothèque",
    "statsLibraryHint": "Torrents dans la bibliothèque du panneau / partages de fichiers",
    "statsTrackerLeftover": "Tracker leftover",
    "statsTrackerLeftoverHint": "Tracker announce hashes that are not library rows",
    "leftoverHashesTitle": "Traquer les hachages restants",
    "publicHostMissingLive": "Le tracker écoute mais l'hôte d'annonce publique n'est pas défini. Les pairs hors hôte ne peuvent pas trouver cette graine.",
    "leftoverHashesHint": "Lecture seule. Ces annonces ne sont pas des lignes de bibliothèque ou de partage.",
    "statsPeers": "Pairs",
    "statsAnnounces": "Annonce",
    "statsAnnouncesHint": "Annoncer les demandes vues par le processus de suivi",
    "statsJobs": "Active jobs",
    "openShares": "File shares",
    "needExecute": "Enable system-change permission (YSK_EXECUTE) to open ports and run production seeds.",
    "guideTitle": "What is this?",
    "guideBody": "When you create a BT file share, YSK builds a .torrent, seeds it, and announces peers via this tracker. Open the port if downloaders are off-host.",
    "restoreSeeds": "Re-seed BT shares",
    "restoreSeedsHint": "Start tracker if needed and re-seed shares that still have a .torrent on disk.",
    "bundledNote": "Bundled with YSK Server (Node). No apt install/uninstall — Start/Stop manages the process.",
    "stackTitle": "Logiciel",
    "jobs": "Torrent jobs",
    "jobsEmpty": "No background torrent jobs",
    "jobsEmptyHint": "Large shares (≥128 MiB) build .torrent files in the background so the Files dialog stays responsive.",
    "jobsDesc": "Background create-torrent queue for large file or folder shares.",
    "colJob": "Emploi",
    "colShare": "Partager",
    "colJobStatus": "Job status",
    "colEnqueued": "Enqueued",
    "refreshJobs": "Refresh jobs",
    "tabOverview": "Aperçu",
    "tabTorrents": "Torrents",
    "tabJobs": "Emplois",
    "tabSettings": "Paramètres",
    "tabAbout": "À propos",
    "heroRunning": "Tracker is live",
    "heroStopped": "Tracker is stopped",
    "heroRunningSub": "Peers can announce and discover seeds for panel shares.",
    "heroStoppedSub": "Start the tracker before sharing large files over BitTorrent.",
    "live": "En direct",
    "liveOff": "Inactif",
    "quickStart": "Quick start",
    "quickStartDesc": "Three steps to share files over BitTorrent.",
    "step1Title": "Set public announce host",
    "step1Hint": "Hostname clients use in magnets (Settings).",
    "step2Title": "Start the tracker",
    "step2Hint": "Open port exposure if peers are off this host.",
    "step3Title": "Create a BT share",
    "step3Hint": "In Files → Share, choose BitTorrent or both.",
    "stepDone": "Fait",
    "stepTodo": "Faire",
    "networkCard": "Réseau",
    "networkCardDesc": "Where the tracker listens and what host appears in magnets.",
    "seederCard": "Semoir",
    "seederCardDesc": "In-process WebTorrent seeder limits and peer ports.",
    "lifecycleCard": "Cycle de vie",
    "lifecycleCardDesc": "Boot behaviour and how the service is packaged.",
    "pid": "PID",
    "port": "Port",
    "announceHost": "Announce host",
    "goSettings": "Open settings",
    "searchTorrents": "Search name or hash…",
    "filterAll": "Tous",
    "filterSeeding": "Semis",
    "filterOther": "Autre",
    "noMatch": "No torrents match your filter",
    "seedStatusSeeding": "Semis",
    "seedStatusPending": "En attente",
    "seedStatusError": "Erreur",
    "seedStatusStopped": "Arrêté",
    "seedStatusNone": "Aucun",
    "notesTitle": "Service notes",
    "exposureTitle": "Network access",
    "protoHttp": "HTTP",
    "protoWs": "WS",
    "protoUdp": "UDP",
    "saveOk": "Settings saved",
    "saveOkRestart": "Enregistré - redémarrez le tracker pour appliquer les ports",
    "startedOk": "Tracker started",
    "stoppedOk": "Tracker stopped",
    "restoredOk": "Re-seed finished",
    "restoredCount": "Torrents réensemencés {{seeded}} sur {{attempted}}",
    "portInvalid": "Entrez un port compris entre 1 et 65535.",
    "extraTrackerRequired": "Saisissez une URL d'annonce.",
    "stopPort": "Le port Tracker {{port}} cessera d'écouter.",
    "stopPid": "Le processus PID {{pid}} se terminera.",
    "swarmLeftoverUnlisted": "{{count}} les annonces restantes supplémentaires n'ont pas de hachage dans cette liste.",
    "httpPortHint": "Default 8000 (YSK catalog / firewall chip). Open TCP if peers are off-host.",
    "udpPortHint": "Optional classic UDP announce. 0 = off (browser WebTorrent uses HTTP/WS). Prefer 6969 or the same port as HTTP if you open UDP on the firewall.",
    "udpPortOff": "0 · Off",
    "udpPortSameHttp": "Same as HTTP ({{port}})",
    "udpPortClassic": "6969 · Classic",
    "portSuggest8000": "8000 · Recommended",
    "announceHostUnset": "Non défini",
    "tabTrackers": "Traqueurs",
    "addTorrent": "Ajouter un torrent",
    "addTorrentTitle": "Ajouter un torrent",
    "addTorrentHint": "Téléchargez un .torrent ou collez un aimant. Choisissez un dossier Fichiers. WebTorrent télécharge les fichiers et les graines manquants une fois terminé.",
    "dropTorrent": "Déposez un .torrent ici",
    "chooseFile": "ou choisissez un fichier",
    "magnetLabel": "Aimant",
    "magnetPlaceholder": "aimant:?xt=urne:btih:…",
    "inspect": "Lire",
    "extraTrackersPreview": "Annoncera également à {{n}} tracker(s) supplémentaire(s)",
    "saveLocation": "Enregistrer l'emplacement",
    "saveRootPublic": "Fichiers publics",
    "newFolder": "Nouveau dossier",
    "destPreview": "Écrirai à",
    "startDownload": "Démarrer le téléchargement",
    "filterDownloading": "Téléchargement",
    "filterPaused": "En pause",
    "filterError": "Erreur",
    "emptyDrop": "Déposez un .torrent ici ou choisissez un fichier",
    "emptyHint": "Les fichiers vont dans le dossier que vous choisissez. S'ils sont déjà terminés, cet hôte héberge des graines. Moteur : WebTorrent — aucun logiciel de téléchargement supplémentaire.",
    "pause": "Pause",
    "resume": "CV",
    "openFolder": "Ouvrir le dossier",
    "remove": "Retirer",
    "removeKeep": "Supprimer, conserver les fichiers",
    "removeDelete": "Supprimer et supprimer des fichiers",
    "removeConfirm": "Supprimer ce torrent de la bibliothèque ?",
    "kindShare": "Partager",
    "filesInTorrent": "fichiers",
    "extraTrackersDesc": "URL d'annonce supplémentaires. Les téléchargements/graines de bibliothèque et les graines de partage de fichiers les utilisent en plus de la liste .torrent. Cela n’ouvre pas le tracker local aux essaims arbitraires.",
    "extraTrackersEmpty": "Pas de trackers supplémentaires. Ajoutez des URL d'annonce HTTP(S), UDP ou WS(S) afin que cet hôte puisse trouver des homologues.",
    "extraTrackerAdd": "Ajouter",
    "extraTrackerUrl": "Annoncer l'URL",
    "extraTrackerApply": "Appliquer sur les graines actuelles",
    "extraTrackerApplyOk": "Trackers supplémentaires appliqués",
    "extraEnabled": "Sur",
    "extraTrackerBad": "L'URL doit commencer par http://, https://, udp://, ws:// ou wss://",
    "extraTrackerDup": "Déjà répertorié",
    "extraTrackerLimit": "Maximum 32 trackers supplémentaires",
    "addOk": "Ajouté à la bibliothèque",
    "savedTo": "Sauvegarder",
    "folderEmpty": "Aucun sous-dossier",
    "needTorrentFile": "Choisissez un fichier .torrent",
    "torrentTooBig": ".torrent supérieur à 8 Mio",
    "seedStatusDownloading": "Téléchargement",
    "seedStatusChecking": "Vérification",
    "seedStatusPaused": "En pause",
    "seedStatusQueued": "En file d'attente",
    "swarmLeftover": "Le Tracker a {{count}} annonce(s) hors bibliothèque (source distincte de la liste des torrents)",
    "addSourceSection": "Source",
    "addSourceFile": "Fichier",
    "addSourceMagnet": "Aimant",
    "previewSection": "Aperçu",
    "saveRoot": "Racine",
    "clearFile": "Retirer le fichier",
    "extraTrackersTitle": "Announce supplémentaire",
    "extraTrackersEmptyTitle": "Aucun tracker pour l’instant",
    "extraEnabledCount": "{{count}} activé(s)",
    "extraApplyHint": "Activez-en au moins un pour l’appliquer aux seeds en cours",
    "destMode": "Utilisation de ce dossier",
    "seedExisting": "Seeder les fichiers existants",
    "downloadNewFolder": "Télécharger dans un nouveau dossier",
    "destFileConflict": "Un fichier {{name}} existe déjà ici. Choisissez un autre dossier, ou seedez le fichier existant s’il correspond.",
    "waitingPeers": "En attente de pairs. Si les fichiers sont déjà sur cet hôte, ajoutez à nouveau et choisissez de seeder les existants."
  },
  "catalog": {
    "sw": {
      "vsftpd": "vsftpd (FTPS)",
      "db_util": "db-util (base de données utilisateur FTP)",
      "nginx": "Nginx",
      "certbot": "Certbot (Let's Encrypt)",
      "mysql_client": "Client MySQL/MariaDB",
      "mysql_server": "Serveur MySQL",
      "mariadb_server": "Serveur MariaDB",
      "postgresql_client": "Client PostgreSQL",
      "postgresql": "Serveur PostgreSQL",
      "redis_tools": "Client Redis",
      "redis_server": "Serveur Redis",
      "ufw": "Pare-feu UFW",
      "fail2ban": "fail2ban",
      "postfix": "Postfix",
      "dovecot": "Dovecot",
      "opendkim": "OpenDKIM",
      "pdns_server": "PowerDNS",
      "git": "Git",
      "node": "Node.js",
      "php": "PHP",
      "python": "Python",
      "go": "Go",
      "rust": "Rust",
      "chromium": "Chromium / Chrome"
    },
    "php": {
      "session": "Session",
      "opcache": "OPcache"
    }
  },
  "cdn": {
    "fromProjectOk": "Site CDN créé depuis le projet — appliquer edges / DNS",
    "fromProjectUpdated": "Site CDN lié au projet mis à jour",
    "fromProjectFailed": "from-project a échoué",
    "nodeUpdated": "Nœud mis à jour",
    "nodeCreated": "Nœud créé",
    "saveFailed": "Échec de l'enregistrement",
    "geoMapInvalid": "JSON geoMap invalide, ex. {\"hkg\":[\"node-id\"]}",
    "siteUpdated": "Site mis à jour",
    "siteCreated": "Site créé",
    "probeOnline": "Sonde OK (en ligne)",
    "probeOffline": "Sonde échouée (hors ligne)",
    "probeFailed": "Échec du sondage",
    "batchProbeOk": "Tous les nœuds sondés",
    "batchProbePartial": "Certains/tous les nœuds en mauvaise santé",
    "batchProbeFailed": "Sonde par lot échouée",
    "drainingSet": "Mis en drainage",
    "drainCleared": "Drainage levé",
    "confirmDeleteNode": "Supprimer ce nœud CDN ?",
    "nodeDeleted": "Nœud supprimé",
    "deleteFailed": "Échec de la suppression",
    "confirmDeleteSite": "Supprimer ce site CDN ?",
    "siteDeleted": "Site supprimé",
    "blocked": "Bloqué (permission system-change requise)",
    "previewRender": "Aperçu du rendu ({{status}}) hash={{hash}}",
    "fanoutDone": "Fan-out terminé ({{status}})",
    "purgeDone": "Purge terminée ({{status}})",
    "dnsSyncDone": "Sync DNS terminée ({{status}})",
    "sslDone": "SSL terminé ({{status}})",
    "confWritten": "Conf écrite ({{status}})",
    "partialFail": "Pas entièrement réussi ({{status}}) — voir les notes",
    "statNodes": "Nœuds",
    "hitNoStats": "Pas encore de stats de bord",
    "loopbackOriginBlocked": "N’appliquera pas l’origin de bouclage {{url}} à un bord distant. Définissez un origin joignable.",
    "applyFailedHint": "Échec d’application — voir les notes ci-dessous",
    "applyFailedNoNote": "Aucune raison stockée. Réappliquez pour capturer l’erreur.",
    "applyStatus": {
      "draft": "Brouillon",
      "planned": "Planifié",
      "applying": "Application…",
      "applied": "Appliqué",
      "failed": "Échoué",
      "partial": "Partiel"
    },
    "statSites": "Sites",
    "statSitesCount": "{{n}} sites",
    "cacheMethod": {
      "none": "Aucune estimation",
      "access_log": "Journal d'accès",
      "cache_dir": "Répertoire cache",
      "log_format": "Besoin d'un format de journal"
    },
    "geoMapLabel": "Carte géographique (JSON)",
    "statApplyFailed": "L'application a échoué",
    "pillNodesSites": "{{n}} nœuds · {{s}} sites",
    "statOnline": "En ligne",
    "statHit": "Taux de réussite",
    "hitUnknown": "Inconnu",
    "lastHealthHint": "Dernière sonde {{at}} · {{ok}}",
    "lastHealthNever": "Pas encore sondé – exécutez Probe",
    "lastHealthFail": "la sonde a échoué",
    "healthLoopNeedSites": "Ajoutez d'abord un site",
    "nodeStatus": {
      "online": "en ligne",
      "offline": "hors ligne",
      "draining": "évacuation",
      "unknown": "inconnu"
    },
    "recentNotes": "Notes récentes",
    "previewOnlyNote": "Aperçu uniquement : rien n'a été écrit sur les bords.",
    "statByRegion": "Région:",
    "statByApply": "Appliquer le statut :",
    "col": {
      "origin": "Origine",
      "edges": "Bords",
      "apply": "Appliquer",
      "dns": "DNS",
      "edgesOnline": "Bords en ligne / appliqués",
      "dnsRr": "Enregistrements DNS CDN"
    },
    "mode": {
      "origin_pull": "Tirage d'origine",
      "reverse_proxy": "Proxy inverse",
      "static_edge": "Bord statique"
    },
    "dnsStrategy": {
      "multi_a": "Plusieurs enregistrements A",
      "cname": "CNAME",
      "geo": "Géo"
    },
    "edgesOnlineApplied": "{{online}}/{{total}} en ligne · {{applied}} appliqué",
    "hitMiss": "Clics {{hits}} / ratés {{misses}}",
    "cacheBytes": "Cache ≈ {{n}} B",
    "hitRateUnknown": "Aucun journal d'accès avec l'état du cache et aucun répertoire de cache, le taux de réussite ne peut donc pas être estimé.",
    "edgeConfPreview": "Aperçu de la conf edge Nginx",
    "tabs": {
      "nodes": "Nœuds",
      "sites": "Sites",
      "dashboard": "Tableau de bord",
      "about": "À propos"
    },
    "nodesTitle": "Nœuds CDN ({{count}})",
    "nodesDesc": "Enregistrer control / origin / edge / dns. La sonde met à jour le statut.",
    "offlineHint": "Hors ligne : la sonde a échoué. Supprimez le nœud s’il reste.",
    "colName": "Nom",
    "colRole": "Rôle",
    "colStatus": "Statut",
    "clearDrain": "Lever le drainage",
    "drain": "Vidange",
    "drainTitle": "Arrêtez d'envoyer du nouveau trafic CDN vers ce périphérique",
    "drainDesc": "Vider « {{name}} » ? Les connexions existantes restent jusqu'à leur fin.",
    "drainLastTitle": "C'est le dernier bord : le drainage laissera chaque site sans bord",
    "drainLastDesc": "«{{name}}» est le seul avantage. Égouttez-le et tous les sites n'ont aucun bord.",
    "clearDrainTitle": "Acceptez à nouveau le nouveau trafic sur ce bord",
    "clearDrainDesc": "Vider la vidange sur « {{name}} » ?",
    "deleteNodeTitle": "Supprimer ce bord CDN",
    "deleteLastNodeTitle": "Supprimez le dernier bord : tous les sites n'auront aucun bord",
    "purge": "Purge",
    "previewTitle": "Aperçu de la configuration nginx (pas d'écriture)",
    "writeConfTitle": "Écrire les fichiers de configuration Edge Nginx",
    "applyEdgesTitle": "Appliquer ce site aux bords (écrit nginx)",
    "purgeTitle": "Purger le cache sur les bords",
    "dnsSyncTitle": "Écrire des enregistrements DNS CDN",
    "probeDnsTitle": "Bords de sonde et DNS (lecture seule)",
    "distSslTitle": "Copier les matériaux TLS sur les bords",
    "leIssueTitle": "Émettez un certificat Let’s Encrypt et distribuez-le",
    "deleteSiteTitle": "Supprimer ce site CDN",
    "siteOpConfirmGeneric": "Exécuter cette action sur « {{name}} » ?",
    "siteOpConfirmDesc": "Site « {{name}} » · {{action}}. Cela peut modifier nginx, DNS ou les certificats.",
    "siteOpConfirm": {
      "apply": "Appliquer ce site aux bords ?",
      "render": "Écrire la configuration nginx pour ce site ?",
      "purge": "Vider le cache de ce site ?",
      "dns-sync": "Synchroniser le DNS pour ce site ?",
      "dist": "Distribuer TLS sur les bords ?",
      "issue": "Problème Chiffrons et distribuons ?"
    },
    "emptyNodesTitle": "Aucun nœud CDN pour l’instant",
    "emptyNodesDesc": "Utilisez « + Add node » pour enregistrer un edge, puis créez des sites.",
    "sitesTitle": "Sites CDN ({{count}})",
    "sitesDesc": "Domaine + origin + edges + cache + DNS multi-A. Appliquer edges / sync DNS / purge.",
    "healthLoopOk": "Boucle de santé terminée pour tous les sites",
    "healthLoopPartial": "Boucle de santé partiellement échouée",
    "healthLoopFailed": "health-loop échoué",
    "colDomain": "Domaine",
    "colMode": "Mode",
    "emptySitesTitle": "Aucun site CDN pour l’instant",
    "emptySitesDesc": "Utilisez « + Add site » dans la barre d’outils du tableau.",
    "emptySitesNoEdge": "Aucun edge pour l’instant : enregistrez d’abord des nœuds dans l’onglet Nœuds, puis créez un site.",
    "dashboardTitle": "Tableau de bord CDN",
    "updatedAt": "Mis à jour {{at}}",
    "dashboardEmpty": "Tableau de bord non chargé",
    "siteStatus": "Statut du site",
    "cacheHitEstimate": "Taux de succès du cache (estimation)",
    "dashboardNotes": "Notes du tableau de bord",
    "editNode": "Modifier le nœud CDN",
    "addNode": "Ajouter un nœud CDN",
    "nodeAddrHint": "Renseignez au moins un champ parmi IPv4 / IPv6 / healthUrl / baseUrl",
    "sshHostHint": "Vide = utiliser IPv4 ; 127.0.0.1 = application locale",
    "sshHostPlaceholder": "Laisser vide pour l'IPv4 public",
    "sshUser": "Utilisateur SSH",
    "fleetHint": "Flotte uniquement (sans SSH) : files fan-out pour l'agent ;",
    "fleetPlaceholder": "UUID de session de la page Agents",
    "editSite": "Modifier le site CDN",
    "addSite": "Ajouter un site CDN",
    "originHint": "Origine en URL pour l'instant ; liaison projet plus tard",
    "commaSeparated": "Séparés par des virgules",
    "originUrl": "URL d'origine edge",
    "edgeNodes": "Nœuds edge",
    "cache": "Cache",
    "dnsPolicy": "Politique DNS",
    "dnsPolicyHint": "multi_a = multi-IP ; failover = uniquement le plus sain",
    "zoneOptional": "Vide = correspondance auto de zone par domaine",
    "sslMode": "Mode SSL",
    "sslModeHint": "upload = certificat sur la page SSL ; le_http01 = ACME edge",
    "leEmailOptional": "E-mail LE (optionnel)",
    "leEmailHint": "Préremplir pour l'émission",
    "shieldHint": "Origine des edges non-shield via ce nœud",
    "geoMapHint": "Pour strategy=geo, ex. {\"hkg\":[\"id1\"],\"nrt\":[\"id2\"]}",
    "geoSubdomain": "Sous-domaine géo",
    "addNodeBtn": "+ Ajouter un nœud",
    "addSiteBtn": "+ Ajouter un site",
    "probeAll": "Sonder tout",
    "healthLoop": "Boucle de santé",
    "setDraining": "Mettre en drain",
    "fromProjectUpdatedAlt": "Site CDN lié au projet mis à jour",
    "refresh": "Actualiser",
    "closePreview": "Fermer l'aperçu",
    "probe": "Sonder",
    "preview": "Aperçu",
    "writeConf": "Écrire la conf",
    "applyEdges": "Appliquer les edges",
    "dnsSync": "Sync DNS",
    "probeDns": "Sonde+DNS",
    "distSsl": "Distribuer SSL",
    "leIssue": "Émettre LE",
    "reaggregate": "Actualiser l'agrégat",
    "createEdgeFirst": "Créez d'abord un nœud edge",
    "enableProxyCache": "Activer proxy_cache",
    "autoMatch": "(correspondance auto)",
    "none": "(aucun)",
    "writeRegionDns": "Écrire le sous-domaine de région A/AAAA (ex. hkg)",
    "workflowHint": "Flux : écrire conf → appliquer edges → sonde+DNS → SSL",
    "healthLoopAll": "Boucle de santé tous les sites",
    "deleteNodeDesc": "Supprime le nœud CDN « {{name}} ».",
    "deleteSiteDesc": "Supprime le site CDN « {{name}} ».",
    "deleteSiteC1": "Politique du site et associations edge",
    "deleteSiteC2": "Les configs nginx appliquées peuvent nécessiter un nettoyage ou une réapplication séparés",
    "statOnlineOf": "En ligne {{n}}/{{total}}",
    "colRegion": "Région",
    "statDraining": "Vidange {{n}}",
    "statOffline": "Hors ligne {{n}}",
    "localTest": "local / test",
    "statHitRate": "Taux de réussite {{v}}"
  },
  "cli": {
    "unknownCommand": "Commande inconnue : {{command}}\nExécutez `{{cli}} help`",
    "usagePrefix": "Utilisation :",
    "security": {
      "help": "Utilisation : ysk-server security status\n       ysk-server security sessions list|revoke|revoke-others [--user U]\n       ysk-server security api-keys list|create|delete …",
      "sessionsHelp": "Utilisation : ysk-server security sessions list [--user U]\n       ysk-server security sessions revoke --id PREFIX [--user U]\n       ysk-server security sessions revoke-others [--user U] [--keep-token T]",
      "apiKeysHelp": "Utilisation : ysk-server security api-keys list\n       ysk-server security api-keys create --name N [--user U] [--scope full|read]\n       ysk-server security api-keys delete --id KEY_ID",
      "noUser": "Aucun utilisateur trouvé. Créez d'abord un admin ou passez --user <name|id>",
      "tokenOnce": "jeton affiché une seule fois — stockez-le en sécurité",
      "sessionRevokeUsage": "Utilisation : ysk-server security sessions revoke --id <sessionIdPrefix> [--user U]",
      "apiKeyDeleteUsage": "Utilisation : ysk-server security api-keys delete --id KEY_ID"
    },
    "help": {
      "blurb": "CLI du plan de contrôle — préférez --json pour les agents IA.\nDocs : docs/agent/README.md · docs/cli/reference.md · docs/agent/commands.json",
      "main": "{{product}} ({{cli}}) v{{version}}\n\nCLI du plan de contrôle — préférez --json pour les agents IA.\nDocs : docs/agent/README.md · docs/cli/reference.md · docs/agent/commands.json\n\nUtilisation :\n  {{cli}} <command> [options]\n\nCommandes :\n  setup                 Init dataDir + admin\n  update                Vérif./appl. auto-mise à jour\n  serve                 API HTTP + interface Web\n  system unit-install   Installer ysk-server.service [--enable]\n  tools                 Lister les outils ; tools run --tool <name> [--dry-run]\n  ask                   NL → plan IA [--execute]\n  projects              list|get|create|deploy|stop|health|backup|template\n  backup                all|list|status|restore|delete|schedule|control-plane|settings|restic\n  templates             Modèles d'applications\n  hosting               aides nginx|dns|db|firewall\n  dns                   zone|zones (alias IA → hosting dns-*)\n  logs                  sources|query|journal|overview\n  host                  overview|metrics (lecture seule)\n  nginx                 status|list|test|sync\n  ssl                   list|get (certificats)\n  db-cluster            list|get|create|plan (HA plan d'abord)\n  ssh-key               list|create|import|public|export|install|delete (coffre d'identités SSH)\n  ssh-2fa               list|enroll|confirm|install|pam|retire (TOTP connexion SSH ≠ 2FA panneau)\n  services              Matrice des services hôte (sondage systemctl)\n  defense | protection  status|ban|unban|whitelist\n  security              status|sessions|api-keys (flags 2FA · révocation session · clés API)\n  cdn                   nodes|sites|render|apply|purge|probe|dashboard|health-loop|from-project\n  agents                runtimes|fleet list|commands|register (panneau + edge)\n  agent run             Sondeur de flotte sortant (expérimental)\n  store                 status|export|import|migrate (backends document json|sqlite|postgres)\n  files                 list|read|write|mkdir|rm|stat|rename|copy|move|chmod|trash|shares (bac à sable)\n  cron                  list|create|update|delete|enable|disable|run|install|status|host\n  email                 domains|mailboxes|deliverability|bootstrap|dns (parité panneau)\n  health                Instantané mode local ou --url http://host:port/health\n  readiness | doctor    Préparation production (honnête)\n  migrate               inventory|host|post|status|resume (migration hôte complète)\n  validators            list|chains|disk|get|checklist (Beta)\n  docker                status|ps|images|compose|prune (engine)\n  version | help\n\nGlobal :\n  --json                stdout JSON (IA)\n  --data-dir PATH\n  --config PATH\n  --help | --version\n\nSortie : 0 ok · 1 erreur · 2 validation · 3 bloqué · 4 introuvable · 5 erreur hôte\n\nSécurité :\n  Les ops dangereuses sont en dry-run par défaut (plan seulement).\n  Passez --execute (alias --apply) + env YSK_EXECUTE=1 pour modifier l'hôte.\n\nExemples :\n  {{cli}} readiness --json\n  {{cli}} host --json\n  {{cli}} nginx status --json\n  {{cli}} ssl list --json\n  {{cli}} projects get --id UUID --json\n  {{cli}} defense ban --ip 1.2.3.4 --json          # plan dry-run\n  {{cli}} projects list --json\n  {{cli}} logs query --source journal: --lines 100 --json\n  {{cli}} tools --json"
    },
    "usage": {
      "tools": {
        "run": {
          "--tool": {
            "name": {
              "--arg": {
                "cd327c": "Utilisation : ysk-server tools run --tool <name> [--arg key=val] [--dry-run]\n"
              }
            }
          }
        }
      },
      "email": {
        "domains": {
          "list": {
            "create": {
              "get": {
                "b94a62": "Utilisation : ysk-server email domains list|create|get …\n"
              }
            }
          },
          "create": {
            "--domain": {
              "example": {
                "bd4036": "Utilisation : ysk-server email domains create --domain example.com --ip A.B.C.D\n"
              }
            }
          }
        },
        "mailboxes": {
          "list": {
            "create": {
              "42b26c": "Utilisation : ysk-server email mailboxes list|create …\n"
            }
          },
          "create": {
            "--domain": {
              "example": {
                "7227f3": "Utilisation : ysk-server email mailboxes create --domain example.com --local user [--password P]\n"
              }
            }
          }
        },
        "dns": {
          "--domain": {
            "example": {
              "com": {
                "26b806": "Utilisation : ysk-server email dns --domain example.com\n"
              }
            }
          }
        },
        "sub": {
          "--data-dir": {
            "path": {
              "--json": {
                "73dad0": "Utilisation : ysk-server email <sub> [--data-dir PATH] [--json]\n  domains list|create|get [--q TEXT]\n    create --domain example.com --ip A.B.C.D\n    get --domain example.com | --id UUID\n  mailboxes list|create [--domain D | --id domainId]\n    create --domain D --local user [--password P]\n  deliverability --domain D | --id UUID\n  deliverability-overview\n  bootstrap --domain D --ip A.B.C.D [--install]\n  dns --domain D | --id UUID     # lot DNS pour le panneau\nAussi : hosting email-apply|email-mailbox|email-deliverability (alias)\n"
              }
            }
          }
        },
        "deliverability": {
          "--domain": {
            "example": {
              "com": {
                "b0dff0": "Utilisation : ysk-server email deliverability --domain example.com\n"
              }
            }
          }
        },
        "bootstrap": {
          "--domain": {
            "example": {
              "com": {
                "affc8d": "Utilisation : ysk-server email bootstrap --domain example.com --ip 1.2.3.4 [--install]\n"
              }
            }
          }
        }
      },
      "cron": {
        "delete": {
          "--id": {
            "job": {
              "id": {
                "f6aafe": "Utilisation : ysk-server cron delete --id JOB_ID\n"
              }
            }
          }
        },
        "sub": {
          "--id": {
            "job": {
              "id": {
                "99cfdf": "Utilisation : ysk-server cron {{sub}} --id JOB_ID\n"
              }
            }
          },
          "--data-dir": {
            "path": {
              "--json": {
                "0349e6": "Utilisation : ysk-server cron <sub> [--data-dir PATH] [--json]\n  list [--project-id ID] [--q TEXT]\n  create --schedule \"0 3 * * *\" --command CMD [--project-id ID] [--user USER]\n  update --id JOB_ID [--schedule S] [--command CMD] [--user USER] [--project-id ID] [--enable|--disable]\n  delete --id JOB_ID\n  enable|disable --id JOB_ID\n  run --id JOB_ID              # run-now (needs YSK_EXECUTE=1)\n  install                     # load managed crontab (needs EXECUTE)\n  status                      # probe managed file vs host crontab\n  host [list] [--user USER] [--jobs-only]\n  host edit --user USER --old-schedule S --old-command C --schedule S --command C --execute\n  host disable|enable|delete|adopt --user USER --old-schedule S --old-command C --execute\n  host run --user USER --command C --execute\nHonnêteté : install / host write blocked without YSK_EXECUTE=1.\n"
              }
            }
          }
        },
        "run": {
          "--id": {
            "job": {
              "id": {
                "a0a97f": "Utilisation : ysk-server cron run --id JOB_ID\n"
              }
            }
          }
        },
        "create": {
          "--schedule": {
            "0": {
              "3": {
                "9a8328": "Utilisation : ysk-server cron create --schedule \"0 3 * * *\" --command CMD [--project-id ID] [--user USER]\n"
              }
            }
          }
        }
      },
      "files": {
        "stat": {
          "--path": {
            "rel": {
              "17c8f2": "Utilisation : ysk-server files stat --path REL\n"
            }
          }
        },
        "read": {
          "--path": {
            "rel": {
              "e35f8d": "Utilisation : ysk-server files read --path REL\n"
            }
          }
        },
        "mkdir": {
          "--path": {
            "rel": {
              "ae0438": "Utilisation : ysk-server files mkdir --path REL\n"
            }
          }
        },
        "rm": {
          "--path": {
            "rel": {
              "--permanent": {
                "fe2051": "Utilisation : ysk-server files rm --path REL [--permanent]\n"
              }
            }
          }
        },
        "rename": {
          "--from": {
            "rel": {
              "--to": {
                "35a260": "Utilisation : ysk-server files rename --from REL --to REL\n"
              }
            }
          }
        },
        "copy": {
          "--from": {
            "rel": {
              "--to": {
                "5337f4": "Utilisation : ysk-server files copy --from REL --to REL\n"
              }
            }
          }
        },
        "move": {
          "--from": {
            "rel": {
              "--to": {
                "75cf5d": "Utilisation : ysk-server files move --from REL --to REL\n"
              }
            }
          }
        },
        "chmod": {
          "--path": {
            "rel": {
              "--mode": {
                "39f983": "Utilisation : ysk-server files chmod --path REL --mode 644\n"
              }
            }
          }
        },
        "trash": {
          "restore": {
            "--id": {
              "trash": {
                "c89ce9": "Utilisation : ysk-server files trash restore --id TRASH_ID\n"
              }
            }
          },
          "list": {
            "restore": {
              "purge": {
                "ef063d": "Utilisation : ysk-server files trash list|restore|purge\n"
              }
            }
          }
        },
        "shares": {
          "list": {
            "ac342c": "Utilisation : ysk-server files shares list\n"
          }
        },
        "webdav": {
          "status": {
            "token": {
              "disable": {
                "f8e94b": "Utilisation : ysk-server files webdav status|token|disable\n"
              }
            }
          }
        },
        "sub": {
          "--root": {
            "public": {
              "project": {
                "42ebd4": "Utilisation : ysk-server files <sub> [--root public|project:ID] [--data-dir PATH] [--json]\n  list   [--path DIR] [--q TEXT] [--sort name|size|mtime] [--order asc|desc]\n  stat   --path REL\n  read   --path REL\n  write  --path REL --content TEXT | --file LOCAL\n  mkdir  --path REL\n  rm     --path REL [--permanent]\n  rename --from REL --to REL\n  copy   --from REL --to REL\n  move   --from REL --to REL\n  chmod  --path REL --mode 644\n  trash  list|restore|purge [--id TRASH_ID]\n  shares list\n  favorites list\n  upload --dir REL --file LOCAL [--file LOCAL2…]\n  webdav status|token|disable\nBac à sable : uniquement la racine des fichiers public ou le home projet (chemins contraints).\n"
              }
            }
          }
        },
        "write": {
          "--path": {
            "rel": {
              "--content": {
                "0addb1": "Utilisation : ysk-server files write --path REL --content TEXT | --file LOCAL\n"
              }
            }
          }
        },
        "upload": {
          "--dir": {
            "rel": {
              "--file": {
                "f8c3bf": "Utilisation : ysk-server files upload --dir REL --file LOCAL [--file LOCAL2…]\n"
              }
            }
          }
        }
      },
      "store": {
        "import": {
          "--in": {
            "file": {
              "json": {
                "5b6fdd": "Utilisation : ysk-server store import --in FILE.json\n"
              }
            }
          }
        },
        "sub": {
          "--data-dir": {
            "path": {
              "--json": {
                "d580e4": "Utilisation : ysk-server store <sub> [--data-dir PATH] [--json]\n  status                         Afficher le type de backend + compteurs\n  export --out FILE.json         Exporter l'instantané document\n  import --in FILE.json          Écraser l'instantané depuis un fichier\n  migrate --to sqlite|json [--out PATH]\n    Copier le store actuel vers un autre fichier backend\nEnv : YSK_STORE=json|sqlite|postgres  YSK_DATABASE_URL=postgres://…\nHonnêteté : backends document-blob (pas encore de schéma relationnel complet).\n"
              }
            }
          }
        },
        "migrate": {
          "--to": {
            "json": {
              "sqlite": {
                "1c52a3": "Utilisation : ysk-server store migrate --to json|sqlite [--out PATH]\n  (postgres : exporter JSON puis importer sous YSK_DATABASE_URL)\n"
              }
            }
          }
        }
      },
      "cdn": {
        "nodes": {
          "delete": {
            "--id": {
              "node": {
                "0c6a1e": "Utilisation : ysk-server cdn nodes delete --id NODE_ID\n"
              }
            }
          },
          "drain": {
            "--id": {
              "node": {
                "a8aa81": "Utilisation : ysk-server cdn nodes drain --id NODE_ID [--off]\n"
              }
            }
          },
          "list": {
            "upsert": {
              "delete": {
                "52549e": "Utilisation : ysk-server cdn nodes list|upsert|delete|probe|drain …\n"
              }
            }
          },
          "upsert": {
            "--name": {
              "name": {
                "8f6f39": "Utilisation : ysk-server cdn nodes upsert --name NAME [--id ID] [--base-url U] [--fleet-agent-id S] [--ssh-host H] [--region R]\n"
              }
            }
          }
        },
        "sites": {
          "get": {
            "--id": {
              "site": {
                "3c3c35": "Utilisation : ysk-server cdn sites get --id SITE_ID\n"
              }
            }
          },
          "delete": {
            "--id": {
              "site": {
                "51ef8f": "Utilisation : ysk-server cdn sites delete --id SITE_ID\n"
              }
            }
          },
          "list": {
            "get": {
              "upsert": {
                "609da6": "Utilisation : ysk-server cdn sites list|get|upsert|delete …\n"
              }
            }
          },
          "upsert": {
            "--name": {
              "n": {
                "6ebb75": "Utilisation : ysk-server cdn sites upsert --name N --domains a.com,b.com [--edge-id ID]… [--origin-url U] [--origin-project ID]\n"
              }
            }
          }
        },
        "render": {
          "--site-id": {
            "id": {
              "--dry-run": {
                "2149eb": "Utilisation : ysk-server cdn render --site-id ID [--dry-run]\n"
              }
            }
          }
        },
        "apply": {
          "--site-id": {
            "id": {
              "--edge-id": {
                "a527b3": "Utilisation : ysk-server cdn apply --site-id ID [--edge-id EDGE]\n"
              }
            }
          }
        },
        "purge": {
          "--site-id": {
            "id": {
              "--edge-id": {
                "bc08ec": "Utilisation : ysk-server cdn purge --site-id ID [--edge-id EDGE]\n"
              }
            }
          }
        },
        "dns-sync": {
          "--site-id": {
            "id": {
              "--apply-zone": {
                "343068": "Utilisation : ysk-server cdn dns-sync --site-id ID [--apply-zone]\n"
              }
            }
          }
        },
        "sub": {
          "--data-dir": {
            "path": {
              "--json": {
                "092842": "Utilisation : ysk-server cdn <sub> [--data-dir PATH] [--json]\n  nodes list|upsert|delete|probe|drain\n  sites list|upsert|delete|get\n  render --site-id ID [--dry-run]\n  apply  --site-id ID [--edge-id ID]   # diffusion (file fleet OK sans EXECUTE)\n  purge  --site-id ID [--edge-id ID]\n  dns-sync --site-id ID [--apply-zone]\n  probe | dashboard | health-loop [--apply-zone]\n  from-project --project-id ID [--edge-id ID…]\nHonnêteté : apply_status written/queued ≠ nginx edge appliqué tant que l'agent n'a pas ack / EXECUTE reload.\n"
              }
            }
          }
        },
        "from-project": {
          "--project-id": {
            "id": {
              "--edge-id": {
                "a96f42": "Utilisation : ysk-server cdn from-project --project-id ID [--edge-id ID]…\n"
              }
            }
          }
        }
      },
      "agents": {
        "fleet": {
          "remove": {
            "--session": {
              "session": {
                "1827fe": "Utilisation : ysk-server agents fleet remove --session SESSION_ID\n"
              }
            }
          },
          "register": {
            "--id": {
              "agent": {
                "209b2d": "Utilisation : ysk-server agents fleet register --id AGENT_ID [--group g] [--edge]\n"
              }
            }
          },
          "commands": {
            "--session": {
              "session": {
                "f8067c": "Utilisation : ysk-server agents fleet commands --session SESSION_ID\n"
              }
            }
          }
        },
        "register": {
          "--id": {
            "agent": {
              "id": {
                "3c4477": "Utilisation : ysk-server agents register --id AGENT_ID [--group g]\n"
              }
            }
          }
        },
        "commands": {
          "--session": {
            "session": {
              "id": {
                "e620d2": "Utilisation : ysk-server agents commands --session SESSION_ID\n"
              }
            }
          }
        },
        "runtimes": {
          "probe": {
            "fleet": {
              "list": {
                "261fa4": "Utilisation : ysk-server agents [runtimes|probe|fleet list|fleet register|fleet commands|register|commands]\n"
              }
            }
          }
        }
      },
      "agent": {
        "run": {
          "--control-plane": {
            "url": {
              "--id": {
                "cfefbe": "Utilisation : ysk-server agent run --control-plane URL --id AGENT_ID [--group g]\n"
              }
            }
          }
        }
      },
      "ask": {
        "check": {
          "system": {
            "info": {
              "b0c781": "Utilisation : ysk-server ask \"check system info\"\n"
            }
          }
        }
      },
      "backup": {
        "delete": {
          "--project-id": {
            "id": {
              "--name": {
                "d66c29": "Utilisation : ysk-server backup delete --project-id ID --name ARCHIVE\n"
              }
            }
          }
        },
        "restic": {
          "list": {
            "run": {
              "restore": {
                "10402b": "Utilisation : ysk-server backup restic list|run|restore …\n"
              }
            }
          },
          "restore": {
            "--project-id": {
              "id": {
                "a8f133": "Utilisation : ysk-server backup restic restore --project-id ID --snapshot SNAP [--dry-run] [--overwrite-home --confirm PHRASE]\n"
              }
            }
          }
        },
        "sub": {
          "--data-dir": {
            "path": {
              "--json": {
                "777243": "Utilisation : ysk-server backup <sub> [--data-dir PATH] [--json]\n  all                         Sauvegarder tous les homes de projets (+ côté remote/restic si configuré)\n  list [--project-id ID] [--q TEXT]\n  status                      Dernière exécution + sonde de planification\n  restore --project-id ID --name ARCHIVE [--mode full|web|dry-run]\n  delete  --project-id ID --name ARCHIVE\n  schedule [--cron \"0 3 * * *\"] [--install]\n  control-plane               Instantané ysk.json + config.json\n  control-plane-restore --name ARCHIVE [--mode dry-run|full] [--confirm RESTORE-CONTROL-PLANE]\n  settings [get|set]          Remote / exclusions / restic\n    set --remote-kind local|sftp|s3 --remote-path P [--remote-host H] …\n    set --exclude a,b,c | --exclusions-file FILE\n    set --restic-enable --restic-password P [--restic-repo PATH]\n    set --from-json FILE      # patch complet {remote?,exclusions?,restic?}\n  restic list|run|restore     Aides restic incrémentales\n"
              }
            }
          }
        },
        "control-plane-restore": {
          "--name": {
            "archive": {
              "--mode": {
                "316a76": "Utilisation : ysk-server backup control-plane-restore --name ARCHIVE [--mode dry-run|full] [--confirm RESTORE-CONTROL-PLANE]\n"
              }
            }
          }
        },
        "restore": {
          "--project-id": {
            "id": {
              "--name": {
                "bc7041": "Utilisation : ysk-server backup restore --project-id ID --name ARCHIVE [--mode full|web|dry-run]\n"
              }
            }
          }
        }
      },
      "packages": {
        "list": {
          "--q": {
            "text": {
              "b8e16b": "Utilisation : ysk-server packages list [--q text]\n"
            }
          }
        }
      },
      "projects": {
        "stop": {
          "--id": {
            "projectid": {
              "b15409": "Utilisation : ysk-server projects stop --id <projectId>\n"
            }
          }
        },
        "backup": {
          "--id": {
            "projectid": {
              "e62846": "Utilisation : ysk-server projects backup --id <projectId>\n"
            }
          }
        },
        "health": {
          "--id": {
            "projectid": {
              "e816ec": "Utilisation : ysk-server projects health --id <projectId>\n"
            }
          }
        },
        "isolation": {
          "provision": {
            "--id": {
              "projectid": {
                "5aff44": "Utilisation : ysk-server projects isolation provision --id <projectId>\n       ysk-server projects isolation provision-all [--limit 20]\n"
              }
            }
          },
          "backfill-owners": {
            "--owner-user-id": {
              "id": {
                "8691da": "Utilisation : ysk-server projects isolation backfill-owners --owner-user-id <id>\n"
              }
            }
          },
          "list": {
            "provision": {
              "provision-all": {
                "8e9da3": "Utilisation : ysk-server projects isolation list|provision|provision-all|backfill-owners\n"
              }
            }
          }
        },
        "get": {
          "--id": {
            "projectid": {
              "name": {
                "b0d532": "Utilisation : ysk-server projects get --id <projectId|name> [--json]\n"
              }
            }
          }
        },
        "create": {
          "--name": {
            "name": {
              "--domain": {
                "66e857": "Utilisation : ysk-server projects create --name <name> [--domain d] [--runtime node|php|static|python|go|rust] [--template id]\n"
              }
            }
          }
        },
        "deploy": {
          "--id": {
            "projectid": {
              "--entry": {
                "339111": "Utilisation : ysk-server projects deploy --id <projectId> [--entry f] [--port N] [--fpm|--builtin] [--reload]\n"
              }
            }
          }
        },
        "git-deploy": {
          "--id": {
            "id": {
              "--git-url": {
                "a513f5": "Utilisation : ysk-server projects git-deploy --id ID [--git-url URL] [--branch main] [--no-redeploy] [--depth 1] [--entry f]\n"
              }
            }
          }
        },
        "template": {
          "--id": {
            "projectid": {
              "--template": {
                "591ce4": "Utilisation : ysk-server projects template --id <projectId> --template <id> [--force]\n"
              }
            }
          }
        },
        "list": {
          "get": {
            "create": {
              "deploy": {
                "253b48": "Utilisation : ysk-server projects list|get|create|deploy|git-deploy|stop|backup|template|health [options]\n  deploy --id UUID [--entry f] [--port N] [--fpm|--builtin] [--reload]\n  git-deploy --id UUID [--git-url URL] [--branch B] [--no-redeploy]\n"
              }
            }
          }
        }
      },
      "cli": {
        "name": {
          "db-cluster": {
            "get": {
              "--id": {
                "00f803": "Utilisation : {{CLI_NAME}} db-cluster get --id UUID [--json]\n"
              }
            },
            "plan": {
              "--id": {
                "483f52": "Utilisation : {{CLI_NAME}} db-cluster plan --id UUID [--json]\n"
              }
            },
            "artifacts": {
              "--id": {
                "6b33c4": "Utilisation : {{CLI_NAME}} db-cluster artifacts --id UUID [--json]\n"
              }
            },
            "bundle": {
              "--id": {
                "94ed27": "Utilisation : {{CLI_NAME}} db-cluster bundle --id UUID [--json]\n"
              }
            },
            "delete": {
              "--id": {
                "3de0e4": "Utilisation : {{CLI_NAME}} db-cluster delete --id UUID [--json]\n"
              }
            },
            "create": {
              "--name": {
                "e3b733": "Utilisation : {{CLI_NAME}} db-cluster create --name N --engine mariadb --kind mariadb-galera --member HOST=role[:access] ...\n"
              }
            },
            "apply": {
              "--id": {
                "4cddb8": "Utilisation : {{CLI_NAME}} db-cluster apply --id UUID [--execute] [--bootstrap] [--json]\n"
              }
            },
            "probe": {
              "--id": {
                "22870c": "Utilisation : {{CLI_NAME}} db-cluster probe --id UUID [--peers] [--json]\n"
              }
            },
            "install-peers": {
              "--id": {
                "600b02": "Utilisation : {{CLI_NAME}} db-cluster install-peers --id UUID [--execute] [--no-restart] [--identity ID] [--json]\n"
              }
            },
            "push": {
              "--id": {
                "697080": "Utilisation : {{CLI_NAME}} db-cluster push --id UUID [--member ID] [--identity ID] [--execute] [--json]\n"
              }
            },
            "fleet": {
              "--id": {
                "239462": "Utilisation : {{CLI_NAME}} db-cluster fleet --id UUID [--op apply|probe|plan] [--execute] [--edge-execute] [--json]\n"
              }
            },
            "list": {
              "get": {
                "3b9cfa": "Utilisation : {{CLI_NAME}} db-cluster list|get|create|plan|apply|probe|install-peers|artifacts|bundle|push|fleet|overview|delete [--peers] [--execute] [--json]\n"
              }
            }
          },
          "ssh-key": {
            "get": {
              "--id": {
                "292716": "Utilisation : {{CLI_NAME}} ssh-key get --id UUID [--json]\n"
              }
            },
            "public": {
              "--id": {
                "525d7d": "Utilisation : {{CLI_NAME}} ssh-key public --id UUID\n"
              }
            },
            "export": {
              "--id": {
                "0a6d81": "Utilisation : {{CLI_NAME}} ssh-key export --id UUID [--out PATH] [--json]\n"
              }
            },
            "delete": {
              "--id": {
                "a6e2f2": "Utilisation : {{CLI_NAME}} ssh-key delete --id UUID [--json]\n"
              }
            },
            "create": {
              "--name": {
                "8b1d79": "Utilisation : {{CLI_NAME}} ssh-key create --name N [--algo ed25519|rsa-4096] [--purpose user|panel|unbound] [--project ID] [--user U] [--home PATH] [--reveal] [--json]\n"
              }
            },
            "import": {
              "--name": {
                "6eb800": "Utilisation : {{CLI_NAME}} ssh-key import --name N --file PATH [--purpose panel|user] [--json]\n"
              }
            },
            "install": {
              "--id": {
                "b99c56": "Utilisation : {{CLI_NAME}} ssh-key install --id UUID [--execute] [--json]\n"
              }
            },
            "test": {
              "--id": {
                "e1aed3": "Utilisation : {{CLI_NAME}} ssh-key test --id UUID --target user@host[:port] [--execute] [--json]\n"
              }
            },
            "rotate": {
              "--id": {
                "9c3224": "Utilisation : {{CLI_NAME}} ssh-key rotate --id UUID [--reveal] [--json]\n"
              }
            },
            "authorize-self": {
              "--id": {
                "b7ea2e": "Utilisation : {{CLI_NAME}} ssh-key authorize-self --id UUID [--json]\n"
              }
            },
            "uninstall": {
              "--id": {
                "afcba0": "Utilisation : {{CLI_NAME}} ssh-key uninstall --id UUID [--execute] [--json]\n"
              }
            },
            "list": {
              "get": {
                "2c92c6": "Utilisation : {{CLI_NAME}} ssh-key list|get|create|import|public|export|install|test|rotate|authorize-self|uninstall|delete [--json]\n"
              }
            }
          },
          "ssh-2fa": {
            "reveal": {
              "--id": {
                "a6c27f": "Utilisation : {{CLI_NAME}} ssh-2fa reveal --id UUID [--json]\n"
              }
            },
            "retire": {
              "--id": {
                "6e1fa3": "Utilisation : {{CLI_NAME}} ssh-2fa retire --id UUID [--json]\n"
              }
            },
            "enroll": {
              "--user": {
                "081432": "Utilisation : {{CLI_NAME}} ssh-2fa enroll --user LINUX|--project ID [--home PATH] [--from-panel] [--json]\n"
              }
            },
            "confirm": {
              "--id": {
                "9ee8a2": "Utilisation : {{CLI_NAME}} ssh-2fa confirm --id UUID --code 123456 [--json]\n"
              }
            },
            "install": {
              "--id": {
                "dace06": "Utilisation : {{CLI_NAME}} ssh-2fa install --id UUID [--execute] [--json]\n"
              }
            },
            "uninstall": {
              "--id": {
                "0bb464": "Utilisation : {{CLI_NAME}} ssh-2fa uninstall --id UUID [--execute] [--json]\n"
              }
            },
            "list": {
              "enroll": {
                "802ed0": "Utilisation : {{CLI_NAME}} ssh-2fa list|enroll|confirm|install|uninstall|pam|reveal|retire [--json]\n"
              }
            }
          },
          "ssl": {
            "list": {
              "get": {
                "79c232": "Utilisation : {{CLI_NAME}} ssl list|get --domain X [--json]\n"
              }
            },
            "get": {
              "--domain": {
                "91c444": "Utilisation : {{CLI_NAME}} ssl get --domain example.com [--json]\n"
              }
            }
          },
          "dns": {
            "zone": {
              "--zone": {
                "ad30fa": "Utilisation : {{CLI_NAME}} dns zone --zone example.com --ip A.B.C.D [--ipv6 X:X::X] [--validate] [--reload]\n"
              }
            },
            "zones": {
              "zone": {
                "5b8bda": "Utilisation : {{CLI_NAME}} dns zones|zone --zone X --ip A.B.C.D [--ipv6 …] [--json]\n"
              }
            }
          },
          "nginx": {
            "status": {
              "list": {
                "d67a16": "Utilisation : {{CLI_NAME}} nginx status|list|test|sync [--execute] [--json]\n"
              }
            }
          },
          "host": {
            "overview": {
              "metrics": {
                "93c828": "Utilisation : {{CLI_NAME}} host overview|metrics|network [--path /] [--json]\n"
              }
            }
          },
          "logs": {
            "sources": {
              "overview": {
                "79058c": "Utilisation : {{CLI_NAME}} logs sources|overview|units|journal|query [--source id] [--json]\n"
              }
            }
          },
          "services": {
            "sub": {
              "--unit": {
                "4fe3fa": "Utilisation : {{CLI_NAME}} services {{sub}} --unit <systemd-unit> [--execute] [--json]\n"
              }
            },
            "matrix": {
              "start": {
                "4f3a35": "Utilisation : {{CLI_NAME}} services matrix|start|stop|restart|reload --unit NAME [--execute] [--json]\n"
              }
            }
          },
          "defense": {
            "ban": {
              "--ip": {
                "cc22de": "Utilisation : {{CLI_NAME}} defense ban --ip <ip> [--method fail2ban|ufw|both] [--reason t] [--execute]\n"
              }
            },
            "unban": {
              "--ip": {
                "46aa23": "Utilisation : {{CLI_NAME}} defense unban --ip <ip> [--method fail2ban|ufw|both] [--execute]\n"
              }
            },
            "whitelist": {
              "--action": {
                "c1cbdf": "Utilisation : {{CLI_NAME}} defense whitelist --action list|add|remove [--ip IP]\n"
              }
            },
            "status": {
              "bans": {
                "a8d96b": "Utilisation : {{CLI_NAME}} defense status|bans|suspects|ban|unban|whitelist|stack-apply|fail2ban|firewall|timeline|presets [--json]\n  bans [--q text] [--source fail2ban|panel|ufw|auto]\n  suspects [--q text]\n  stack-apply [--execute]   # UFW + fail2ban + preset actuel\n  fail2ban | firewall       # sondes approfondies (honnêtes)\n  timeline [--limit N] [--q text]\n  presets                   # liste + activePreset\n"
              }
            }
          }
        }
      },
      "system": {
        "unit-install": {
          "--enable": {
            "--data-dir": {
              "path": {
                "33daa1": "Utilisation : ysk-server system unit-install [--enable] [--data-dir PATH]\n"
              }
            }
          }
        }
      },
      "users": {
        "create": {
          "--username": {
            "u": {
              "--password": {
                "7145c7": "Utilisation : ysk-server users create --username <u> --password <p> [--role operator|viewer|admin] [--package-id id]\n"
              }
            }
          }
        },
        "list": {
          "--q": {
            "text": {
              "--role": {
                "544685": "Utilisation : ysk-server users list [--q text] [--role admin|operator|viewer]\n       ysk-server users create --username u --password p [--role operator]\n"
              }
            }
          }
        }
      },
      "rbac": {
        "list": {
          "policies": {
            "330ade": "Utilisation : ysk-server rbac list|policies\n       ysk-server rbac show --role operator\n       ysk-server rbac audit   # matrice d’échantillon route→cap\n"
          }
        }
      },
      "hosting": {
        "postgres-provision": {
          "--db": {
            "name": {
              "--user": {
                "2c8889": "Utilisation : ysk-server hosting postgres-provision --db NAME --user U --password P(min8) [--execute]\n  Simulation par défaut (aucun changement hôte). Passez --execute + YSK_EXECUTE=1 pour appliquer.\n"
              }
            }
          }
        },
        "mysql-provision": {
          "--db": {
            "name": {
              "--user": {
                "fc25aa": "Utilisation : ysk-server hosting mysql-provision --db NAME --user U --password P(min8) [--execute]\n  Simulation par défaut (aucun changement hôte). Passez --execute + YSK_EXECUTE=1 pour appliquer.\n"
              }
            }
          }
        },
        "dns-zone": {
          "--zone": {
            "example": {
              "com": {
                "bdaa0d": "Utilisation : ysk-server hosting dns-zone --zone example.com --ip A.B.C.D [--ipv6 X:X::X] [--validate] [--reload]\n"
              }
            }
          }
        },
        "powerdns-load": {
          "--zone": {
            "example": {
              "com": {
                "dba49c": "Utilisation : ysk-server hosting powerdns-load --zone example.com --ip A.B.C.D [--ipv6 X:X::X] [--load|--execute]\n"
              }
            }
          }
        },
        "email-apply": {
          "--domain": {
            "example": {
              "com": {
                "37d350": "Utilisation : ysk-server hosting email-apply --domain example.com [--install|--execute]\n"
              }
            }
          }
        },
        "email-mailbox": {
          "--domain": {
            "x": {
              "--local": {
                "3d9be3": "Utilisation : ysk-server hosting email-mailbox --domain X --local user [--password P] [--ip A.B.C.D]\n"
              }
            }
          }
        },
        "ftps-apply": {
          "--domain": {
            "files": {
              "example": {
                "284a7c": "Utilisation : ysk-server hosting ftps-apply --domain files.example.com [--install|--execute]\n"
              }
            }
          }
        },
        "webmail-apply": {
          "--domain": {
            "webmail": {
              "example": {
                "2ad5b5": "Utilisation : ysk-server hosting webmail-apply --domain webmail.example.com [--download]\n"
              }
            }
          }
        },
        "public-files": {
          "--domain": {
            "files": {
              "example": {
                "0e9013": "Utilisation : ysk-server hosting public-files --domain files.example.com [--reload]\n"
              }
            }
          }
        },
        "email-deliverability": {
          "--domain": {
            "example": {
              "com": {
                "8774a4": "Utilisation : ysk-server hosting email-deliverability --domain example.com\n       ysk-server hosting email-deliverability --id <domainId>\n"
              }
            }
          }
        },
        "email-bootstrap": {
          "--domain": {
            "example": {
              "com": {
                "796da5": "Utilisation : ysk-server hosting email-bootstrap --domain example.com --ip 1.2.3.4 [--admin postmaster] [--password P] [--install]\n"
              }
            }
          }
        }
      },
      "migrate": {
        "post": {
          "--job": {
            "id": {
              "--data-dir": {
                "6a73cd": "Utilisation : ysk-server migrate post --job <id> --data-dir PATH --execute\n"
              }
            }
          }
        },
        "host": {
          "--target": {
            "root": {
              "new": {
                "3e94a2": "Utilisation : ysk-server migrate host --target root@NEW_IP [--identity-file PATH|--identity-id ID] [--password] --execute --data-dir PATH\n"
              }
            }
          }
        }
      },
      "x": {
        "972912": "Utilisation :\n  ysk-server migrate inventory [--data-dir PATH] --json\n  ysk-server migrate host --target root@IP [--identity-file PATH|--identity-id ID|--password PW] --execute [--maintenance] [--force-wipe-target]\n  ysk-server migrate post --job ID --data-dir PATH --execute   # sur la cible\n  ysk-server migrate status [--job ID]\n  ysk-server migrate resume --job ID --execute\n  ysk-server migrate orphan-homes [--data-dir PATH] --json\n  ysk-server migrate orphan-homes --path /home/ysk-server-UUID --confirm PATH --execute\n"
      },
      "hostingHelp": "Utilisation : ysk-server hosting <sub>\n  Ops dangereuses en simulation par défaut ; ajoutez --execute (+ YSK_EXECUTE=1) pour appliquer\n  nginx | nginx-sync [--execute]\n  redis-provision | postgres-provision | mysql-provision [--execute]\n  dns-zone --zone X --ip A.B.C.D [--ipv6 X:X::X] [--validate] [--reload]\n  dns-zones | powerdns-status | powerdns-install [--install|--execute]\n  powerdns-load --zone X --ip A.B.C.D [--load|--execute]\n  email-apply --domain X [--install|--execute]\n  email-mailbox --domain X --local user [--password P] [--ip A.B.C.D] [--system]\n  ftps-apply --domain X [--install|--execute]\n  runtimes | runtime-install --kind node|php|python|go|rust --version V [--install|--execute]\n  dovecot-passdb --domain X | --all\n  webmail-apply --domain webmail.example.com [--download]\n  public-files --domain files.example.com [--reload]\n  email-bootstrap --domain example.com --ip A.B.C.D [--install|--execute]\n  email-deliverability --domain example.com   # pack PTR/DNSBL/warmup (honnête)\n  firewall-apply [--smtp] [--execute]\n",
      "logsQuery": "Utilisation : {{CLI_NAME}} logs query --source <id> [--lines N] [--grep G] [--since 1h] [--priority err]\n  exemples de source : journal:  journal:nginx.service  file:syslog  project:<uuid>\n  {{CLI_NAME}} logs sources --json\n  {{CLI_NAME}} logs journal [--unit nginx.service] --json\n"
    },
    "msg": {
      "domain": {
        "missing": {
          "pass": {
            "5be09b": "Domaine manquant — passez --ip pour créer d’abord le domaine\n"
          }
        }
      },
      "--root": {
        "must": {
          "be": {
            "a84834": "--root doit être public ou project:<id>\n"
          }
        }
      },
      "need": {
        "--content": {
          "or": {
            "4d7001": "Il faut --content ou --file\n"
          }
        },
        "at": {
          "least": {
            "7d311a": "Au moins un --member HOST[=role][:access] est requis\n"
          }
        }
      },
      "action": {
        "must": {
          "be": {
            "ba14c1": "l'action doit être list|add|remove\n"
          }
        }
      },
      "use": {
        "ysk-server": {
          "backup": {
            "ca67f4": "Utiliser : ysk-server backup control-plane-restore --name ARCHIVE (pas restore --project-id control-plane)\n"
          }
        }
      },
      "new": {
        "domain": {
          "requires": {
            "986b78": "Un nouveau domaine exige --ip A.B.C.D (pas de valeurs par défaut fictives)\n"
          }
        }
      },
      "import-sync": {
        "prefers": {
          "fleet": {
            "4d7590": "import-sync privilégie le payload clusterSync de la flotte ; ou --file snapshot.json\n"
          }
        }
      },
      "security": {
        "control": {
          "plane": {
            "f59a63": "SÉCURITÉ : plan de contrôle exposé publiquement (0.0.0.0/::). Préférer 127.0.0.1 + reverse proxy / UFW.\n"
          }
        }
      }
    },
    "err": {
      "unknown": {
        "email": {
          "sub": {
            "sub": {
              "e37257": "Sous-commande email inconnue : {{sub}}\nExécuter : ysk-server email help\n"
            }
          }
        },
        "cron": {
          "sub": {
            "sub": {
              "e1a9ed": "Sous-commande cron inconnue : {{sub}}\nExécuter : ysk-server cron help\n"
            }
          }
        },
        "files": {
          "sub": {
            "sub": {
              "07ad7e": "Sous-commande files inconnue : {{sub}}\nExécuter : ysk-server files help\n"
            }
          }
        },
        "store": {
          "sub": {
            "sub": {
              "b7a083": "Sous-commande store inconnue : {{sub}}\nExécuter : ysk-server store help\n"
            }
          }
        },
        "cdn": {
          "subcommand": {
            "sub": {
              "76664f": "Sous-commande cdn inconnue : {{sub}}\nExécuter : ysk-server cdn help\n"
            }
          }
        },
        "backup": {
          "subcommand": {
            "sub": {
              "4092ad": "Sous-commande backup inconnue : {{sub}}\nExécuter : ysk-server backup help\n"
            }
          }
        }
      }
    },
    "setup": {
      "dryRunOk": "Simulation de configuration {{product}} OK",
      "dryRunNext": "Relancer sans --dry-run pour écrire la configuration et initialiser la base de données",
      "weakPassword": "Le mot de passe administrateur est faible ou par défaut. Fournir un --admin-password fort (min. 8, pas « admin »/valeurs courantes), ou définir YSK_ALLOW_INSECURE_DEFAULTS=1 pour le dev local uniquement.",
      "weakPasswordShort": "Mot de passe administrateur faible ou par défaut refusé",
      "nextStart": "Démarrer (API + interface Web) : {{cli}} serve --config {{configPath}}",
      "nextOpen": "Ouvrir http://{{host}}:{{port}}/ et se connecter en tant que {{user}}",
      "nextUnit": "Modèle d'unité systemd : {{unitPath}}",
      "nextInstall": "Installer l'unité (root + YSK_EXECUTE) : {{cli}} system unit-install --enable --data-dir {{dataDir}}",
      "nextExecute": "Les mutations d'hôte en production exigent YSK_EXECUTE=1 et root",
      "nextGolive": "Mise en production : docs/deploy/go-live.md + ysk-server readiness --json",
      "secPassword": "SÉCURITÉ : changer immédiatement le mot de passe administrateur (amorçage avec un mot de passe faible/par défaut)",
      "sec2fa": "SÉCURITÉ : activer la 2FA administrateur sous Sécurité → Compte",
      "secListen": "SÉCURITÉ : écoute sur toutes les interfaces — placer derrière un pare-feu / reverse proxy ; préférer 127.0.0.1 + tunnel SSH pour l'admin",
      "ok": "Configuration {{product}} terminée (base de données initialisée)",
      "okInsecure": "Configuration {{product}} terminée (base de données initialisée) [AMORÇAGE NON SÉCURISÉ — changer le mot de passe]"
    }
  },
  "common": {
    "all": "Tous",
    "cancel": "Annuler",
    "confirm": "Confirmer",
    "refresh": "Actualiser",
    "loading": "Chargement…",
    "save": "Enregistrer",
    "apply": "Appliquer",
    "close": "Fermer",
    "copy": "Copier",
    "copied": "Copié",
    "expandAll": "Tout développer",
    "collapseAll": "Tout réduire",
    "empty": "Vide",
    "back": "Retour",
    "showTechnical": "Afficher les détails techniques",
    "hideTechnical": "Masquer les détails techniques",
    "needExecute": "Nécessite YSK_EXECUTE",
    "needRoot": "Nécessite root",
    "needExecuteRoot": "Nécessite YSK_EXECUTE et root",
    "writtenOnly": "Écrit dans les données du panneau ; non appliqué sur l'hôte",
    "applyToLive": "Appliquer pour prendre effet",
    "saveDraft": "Enregistrer le brouillon",
    "languageName": "Anglais",
    "languageNative": "Anglais",
    "language": "Langue",
    "switchLanguage": "Changer de langue",
    "showPassword": "Montrer",
    "hidePassword": "Cacher",
    "searchGlobal": "Rechercher…",
    "menu": "Menu",
    "processing": "Traitement…",
    "unavailable": "Non disponible pour le moment",
    "retry": "Réessayer",
    "success": "Succès",
    "ok": "OK",
    "failed": "Échoué",
    "blocked": "Exécution impossible",
    "status": "Statut",
    "port": "Port",
    "url": "URL",
    "actions": "Actes",
    "noData": "Aucune donnée",
    "input": "Entrée",
    "pleaseEnter": "Saisir {{value}}",
    "pleaseFill": "Merci de remplir ce champ",
    "required": "Obligatoire",
    "about": "À propos",
    "more": "Plus",
    "operation": "Actes",
    "delete": "Supprimer",
    "edit": "Modifier",
    "create": "Créer",
    "install": "Installer",
    "installing": "Installation…",
    "reprobe": "Revérifier",
    "search": "Rechercher",
    "yes": "Oui",
    "no": "Non",
    "on": "Activé",
    "off": "Désactivé",
    "open": "Ouvrir",
    "enabled": "Activé",
    "disabled": "Désactivé",
    "installed": "Installé",
    "notInstalled": "Non installé",
    "running": "En cours",
    "stopped": "Arrêté",
    "ready": "Prêt",
    "unknown": "Inconnu",
    "normal": "OK",
    "degraded": "Dégradé",
    "missing": "Manquant",
    "available": "Disponible",
    "applied": "Appliqué",
    "notApplied": "Non appliqué",
    "completed": "Terminé",
    "incomplete": "Incomplet",
    "probed": "Sondé",
    "notProbed": "Non sondé",
    "probe": "Sonder",
    "name": "Nom",
    "username": "Nom d'utilisateur",
    "password": "Mot de passe",
    "domain": "Domaine",
    "host": "Hôte",
    "version": "Version",
    "type": "Taper",
    "mode": "Mode",
    "notes": "Remarques",
    "time": "Heure",
    "steps": "Étapes",
    "target": "Cible",
    "package": "Paquet",
    "panel": "Panneau",
    "system": "Système",
    "user": "Utilisateur",
    "project": "Projet",
    "database": "Base de données",
    "mail": "Messagerie",
    "files": "Fichiers",
    "memory": "Mémoire",
    "custom": "Personnalisé",
    "static": "Statique",
    "lifecycle": "Cycle de vie",
    "loadFailed": "Échec du chargement",
    "saveFailed": "Échec de l’enregistrement",
    "opFailed": "Échec de l’opération",
    "installFailed": "Échec de l’installation",
    "createFailed": "Échec de la création",
    "deleteFailed": "Échec de la suppression",
    "applyFailed": "Échec de l’application",
    "startFailed": "Échec du démarrage",
    "statusLoadFailed": "Échec du chargement de l’état",
    "downloadFailed": "Échec du téléchargement",
    "uploadDone": "{{count}} fichier(s) téléversé(s)",
    "downloadStarted": "Téléchargement démarré : {{name}}",
    "savedOk": "Enregistré",
    "noneSelectedShort": "—",
    "unknownError": "Erreur inconnue",
    "writtenSettings": "Paramètres enregistrés",
    "panelBlocked": "Impossible de terminer cette action dans le panneau d'administration",
    "partialSuccess": "L'opération n'a pas entièrement réussi",
    "createdOk": "Créé",
    "updatedOk": "Mis à jour",
    "deletedOk": "Supprimé",
    "applyDone": "Application terminée",
    "applyIncomplete": "Application incomplète",
    "checking": "Vérification…",
    "dismiss": "Fermer",
    "hide": "Masquer",
    "show": "Afficher",
    "done": "Fait",
    "next": "Suivant",
    "previous": "Précédent",
    "redirectedTo": "Ouvert {{to}} (était {{from}})"
  },
  "cron": {
    "presetCdTrue": "application cd + vrai (test)",
    "presetCleanTmp": "Nettoyer temp (exemple)",
    "presetNpmCron": "npm run cron (le cas échéant)",
    "presetAppBin": "Exécuter le binaire de l'app",
    "presetRsync": "Synchroniser le statique (exemple rsync)",
    "noLinuxUser": "(aucun utilisateur linux) · {{name}}",
    "projectUser": "Utilisateur du projet",
    "panelUser": "ysk · panneau / système",
    "system": "Système",
    "rootCareful": "root · système (attention)",
    "customUser": "{{user}} · personnalisé",
    "success": "Succès",
    "failed": "Échoué",
    "noProjects": "Aucun projet pour le moment",
    "noProjectsHint": "Créez un projet (et de préférence un utilisateur système) avant d'enregistrer un cron",
    "userSuffix": " · utilisateur ",
    "mon": "Lun",
    "tue": "Mar",
    "wed": "Mer",
    "thu": "Jeu",
    "fri": "Ven",
    "sat": "Sam",
    "sun": "Dim",
    "everyNMin": "Toutes les N minutes",
    "fixedInterval": "Intervalle fixe",
    "hourly": "Toutes les heures",
    "atMinute": "À la minute",
    "daily": "Quotidien",
    "atTime": "À l'heure",
    "weekly": "Hebdomadaire",
    "weekdayTime": "Jour de la semaine + heure",
    "monthly": "Mensuel",
    "dayTime": "Jour + heure",
    "advanced": "Avancé",
    "customExpr": "Expression personnalisée",
    "everyMinute": "Toutes les minutes",
    "everyMinutes": "Toutes les {{n}} minutes",
    "hourlyAt": "Toutes les heures à la minute {{n}}",
    "dailyAt": "Quotidien {{time}}",
    "weeklyNone": "Hebdomadaire (aucun jour) {{time}}",
    "weeklyAt": "Hebdomadaire {{days}} {{time}}",
    "monthlyAt": "Mensuel jour {{day}} {{time}}",
    "customAt": "Personnalisé : {{expr}}",
    "frequency": "Fréquence de planification",
    "interval": "Intervalle",
    "fromHour": "À partir du début de l'heure",
    "intervalMinutes": "Minutes d'intervalle",
    "min1": "1 minute",
    "minN": "{{n}} minutes",
    "minuteOfHour": "Minute de chaque heure",
    "minPad": "{{n}} minutes",
    "hour": "Heure",
    "minute": "Minute",
    "pickWeekdays": "Choisir les jours de la semaine",
    "dayOfMonth": "Jour du mois",
    "dayOfMonthHint": "Ignoré si le mois n'a pas ce jour",
    "cronExpr": "Expression crontab",
    "cronExprHint": "Cinq champs : min heure jour mois jour_semaine (0=dim)",
    "cronExprPh": "expression crontab",
    "needLinuxUser": "Le projet sélectionné n'a pas d'utilisateur Linux — créez-en un d'abord sous Ressources du projet",
    "boundProject": "Lié au projet ; exécuté en tant que {{user}} (isolation runuser)",
    "systemJob": "Tâche système ; exécutée en tant que {{user}}",
    "writtenManage": "Écrit dans le crontab géré (pas encore installé sur l'hôte)",
    "needInstall": "Appuyez sur Installer dans le crontab système pour appliquer",
    "createdManageOnly": "Créé (gestion uniquement)",
    "installedSystem": "Installé sur le système",
    "hostSynced": "Hôte synchronisé",
    "hostNotInstalled": "Absent de l'hôte",
    "statusUnknown": "Statut inconnu",
    "systemCrontab": "Crontab système",
    "synced": "Synchronisé",
    "managedLines": "Lignes gérées",
    "jobsOnlyManage": "Les tâches sont en gestion uniquement. Le crontab système ",
    "hostHasYsk": "inclut des entrées YSK",
    "hostNoYsk": "non installé ou aucune entrée YSK",
    "pressInstall": "Les tâches enregistrées ne sont pas encore dans le crontab système — cliquez sur Installer sur le système.",
    "jobsTab": "Tâches ({{count}})",
    "jobsTabPending": "Emplois ({{count}}) · en attente {{pending}}",
    "registeredJobs": "Tâches enregistrées ({{count}})",
    "jobsSub": "Entrées de gestion · Installer sur le système après modification",
    "addJob": "+ Ajouter une tâche",
    "noCron": "Pas encore de cron",
    "noCronDesc": "Ajoutez une tâche (en haut à droite de la liste), puis installez dans le crontab système",
    "onceInstalled": "Installé auparavant",
    "manageOnly": "Gestion uniquement",
    "projectLabel": "Projet",
    "systemLevel": "Système",
    "runOnce": "Exécuter maintenant",
    "runOnceOk": "Exécuté une fois",
    "updatedManage": "Gestion mise à jour ; réinstallez dans le crontab système",
    "updatedManageShort": "Gestion mise à jour",
    "deletedManage": "Retiré de la gestion ; réinstallez pour synchroniser l'hôte",
    "installStatus": "Statut d'installation",
    "manageVsHost": "Gestion vs hôte",
    "hostYsk": "YSK hôte",
    "lastInstall": "Dernière installation",
    "installToSystem": "Installer dans le crontab système",
    "installHint": "L'installation fusionne le crontab hôte : conserve les lignes non-YSK et met à jour uniquement les tâches gérées par le panneau",
    "hostPreview": "Aperçu du crontab hôte",
    "cannotRead": "Lecture impossible ou non installé (privilèges requis)",
    "addJobTitle": "Ajouter une tâche",
    "addJobDesc": "Écrit dans la gestion ; installer sur le système pour que le crontab s'exécute",
    "createManageOnly": "Créer (gestion uniquement)",
    "whenRun": "Quand exécuter",
    "whenRunHint": "Choisir la fréquence ci-dessous ; mode avancé pour le crontab brut",
    "userPathHint": "Utilisateur + chemins de commande suivent le home/runtime du projet",
    "pickProject": "— sélectionner un projet —",
    "runAsUser": "Exécuter en tant qu'utilisateur",
    "runAsHint": "L'utilisateur projet synchronise le projet ci-dessus ; utilisateur système = cron système",
    "noProjectsYet": "(aucun projet pour l'instant)",
    "runInHome": "Exécuter sous le home du projet ({{home}}) ; encapsulé avec runuser à l'enregistrement",
    "absPath": "Préférer un chemin absolu",
    "commonCmds": "Commandes courantes ({{runtime}})",
    "actualPreview": "Ligne crontab réelle (aperçu)",
    "noLinuxName": "Ce projet n'a pas de nom d'utilisateur Linux — créez d'abord un utilisateur système sous Ressources.",
    "afterCreate": "Après création : ",
    "projectParen": "(projet {{name}})",
    "systemParen": "(niveau système, non lié)",
    "weekLabel": "Jour de la semaine",
    "willRun": "S'exécutera",
    "projectNoLinux": "(aucun utilisateur linux)",
    "createManageOnlyParen": "Créer (gestion uniquement)",
    "runAsHintFull": "L'utilisateur projet synchronise le projet ci-dessus ; utilisateur système = cron système",
    "systemParenFull": "(niveau système, non lié)",
    "hostOtherLines": "Lignes hôte non-YSK",
    "hostOtherLinesVal": "{{other}} autre(s) ({{total}} lignes de tâches hôte)",
    "deleteTitle": "Supprimer la tâche cron ?",
    "deleteDesc": "Supprime « {{name}} ». Plan de contrôle uniquement jusqu'à application au crontab système.",
    "hostJobs": "Tâches hôte",
    "hostJobsTitle": "Crontabs hôte ({{count}})",
    "usersScanned": "Utilisateurs",
    "filterUser": "Utilisateur",
    "filterAll": "Tous les utilisateurs",
    "sourceYsk": "Panneau",
    "sourceHost": "Hôte",
    "noHostJobs": "Aucune tâche crontab dans cette portée",
    "hostPartial": "Impossible de lire tous les crontabs utilisateur (root requis)",
    "pendingInstall": "Installation en attente ({{count}})",
    "pendingStale": "Non écrit dans la crontab système pendant {{days}} jour(s) — il ne fonctionnera pas.",
    "willNotRun": "Non écrit dans la crontab du système — ne fonctionnera pas.",
    "hourRange": "L'heure doit être comprise entre 0 et 23.",
    "minuteRange": "Les minutes doivent être comprises entre 0 et 59.",
    "hoursCommon": "Horaires communs",
    "hoursAll": "Toutes les heures",
    "invalidExpr": "Ce n'est pas une expression cron à 5 champs valide.",
    "needCommand": "Le commandement est requis.",
    "needUser": "Choisissez un projet ou un utilisateur système.",
    "hostCounts": "Lignes hôtes",
    "hostCountsVal": "{{ysk}} · autres {{other}} · total {{total}}",
    "hostYskYes": "lignes de panneaux présentes",
    "hostYskNo": "pas de lignes de panneaux",
    "emptyHostCrontab": "Pas de crontab pour {{user}}.",
    "writtenOnHost": "Écrit",
    "registeredJobsChip": "Inscrit",
    "registeredVsWritten": "Enregistré dans le panneau ou écrit sur l'hôte crontab",
    "installPreviewTitle": "Aperçu avant l'installation sur la crontab du système",
    "installPreviewDesc": "Cela fusionne le bloc YSK dans la crontab hôte. Les lignes non-YSK existantes restent.",
    "installPreviewMerge": "L'installation écrit un bloc de fusion crontab du serveur YSK. Cela ne remplace pas la crontab entière.",
    "installPreviewEmpty": "Aucune tâche gérée en attente : l'installation actualise toujours le bloc YSK.",
    "editJobTitle": "Modifier le travail",
    "editJobDesc": "Les modifications restent dans le panneau jusqu'à ce que vous les installiez sur la crontab du système.",
    "saveJob": "Enregistrer (gestion uniquement)",
    "panelLines": "Lignes de panneaux",
    "otherLines": "Autres lignes",
    "totalLines": "Total",
    "writtenOnHostHint": "Lignes déjà écrites dans la crontab hôte",
    "registeredJobsHint": "Travaux enregistrés dans le panel (y compris l'installation en attente)",
    "pendingInstallCount": "{{n}} installation en attente",
    "systemJobBadge": "Aucun projet · utilisateur du système",
    "hostEdit": "Modifier",
    "hostEditTitle": "Modifier la ligne crontab de l'hôte",
    "hostEditDesc": "Écrit maintenant la crontab en direct de cet utilisateur. Nécessite root et YSK_EXECUTE=1. Les autres lignes restent.",
    "hostSave": "Écrire crontab",
    "hostSaveTitle": "Écrivez cette ligne crontab ?",
    "hostSaveDesc": "Replaces the live line for {{user}}. Type EDIT to confirm.\n\nCurrent:\n{{from}}\n\nNext:\n{{to}}",
    "hostDisable": "Désactiver",
    "hostDisableTitle": "Désactiver la ligne crontab de l'hôte ?",
    "hostDisableDesc": "Commente la ligne pour {{user}}. Tapez DÉSACTIVER pour confirmer.",
    "hostEnable": "Activer",
    "hostEnableTitle": "Activer la ligne crontab de l'hôte ?",
    "hostEnableDesc": "Supprime le commentaire pour {{user}}. Tapez ENABLE pour confirmer.",
    "hostRunTitle": "Exécuter cette commande hôte une fois ?",
    "hostRunDesc": "Fonctionne comme {{user}} maintenant. Ne change pas la crontab. Tapez RUN pour confirmer.",
    "hostAdopt": "Prendre dans le panneau",
    "hostAdoptTitle": "Prendre cette ligne hôte dans le panneau ?",
    "hostAdoptDesc": "Marque la ligne live # ysk:id et l'enregistre. La prochaine installation ne le dupliquera pas. Tapez ADOPT pour confirmer.",
    "hostDeleteTitle": "Supprimer la ligne crontab de l'hôte ?",
    "hostDeleteDesc": "Supprime la ligne en direct pour {{user}}. Tapez la commande pour confirmer.",
    "hostUserLocked": "Propriétaire de Crontab (impossible de passer d'un utilisateur à l'autre ici)",
    "hostLinePreview": "Ligne qui sera écrite",
    "disabledJob": "Désactivé",
    "confirmMismatch": "Confirmer doit correspondre à la commande.",
    "writtenHost": "A écrit la crontab de l'hôte",
    "adoptedHost": "Pris dans le panneau",
    "keepDisabledHint": "Cette ligne est désactivée. Enregistrer le garde commenté.",
    "currentLine": "Actuel",
    "nextLine": "Suivant"
  },
  "dashboard": {
    "serviceAria": "{{name}} : {{state}}",
    "sev": {
      "ok": "OK",
      "warn": "Avertissement",
      "bad": "Problème"
    },
    "title": "Tableau de bord",
    "health": "Santé",
    "protection": "Mode protection",
    "welcome": "Bienvenue sur YSK Server",
    "audit": "Audit récent",
    "needLogin": "Connectez-vous pour voir les événements d'audit",
    "features": "Fonctionnalités",
    "featuresHint": "Badges : Prêt = logiciel installé ;",
    "badge": {
      "panel": "Panneau",
      "notInstalled": "Non installé",
      "ready": "Prêt",
      "installed": "Installé",
      "prodReady": "Prêt prod",
      "check": "Vérifier",
      "needPerm": "Droits requis"
    },
    "status": {
      "healthy": "Sain",
      "prodReady": "Prêt prod",
      "needsCheck": "À vérifier"
    },
    "stat": {
      "backups": "Sauvegardes",
      "notifications": "Alertes",
      "certExpiry": "Expiration du certificat"
    },
    "tabs": {
      "overview": "Vue d'ensemble",
      "wizard": "Création rapide",
      "notifications": "Alertes",
      "features": "Fonctionnalités"
    },
    "serviceHealth": "Santé des services",
    "serviceHealthDesc": "Sonde systemctl en direct",
    "fullServiceMatrix": "Matrice complète des services",
    "readinessCheck": "Préparation :",
    "prodOk": "Prêt pour la production",
    "notFullyReady": "Pas entièrement prêt",
    "readinessBlocked": "{{n}} bloqueur(s)",
    "modeScore": "Mode {{mode}} · score {{ready}}/{{total}}",
    "mode": {
      "degraded": "dégradé",
      "production_capable": "prêt pour la production",
      "blocked": "bloqué",
      "normal": "normale"
    },
    "details": "Détails",
    "certExpiryTitle": "Expiration du certificat :",
    "certExpired": "expiré",
    "certDays": "{{days}}d",
    "securityStrip": "Sécurité et état d'application",
    "securityStripDesc": "Alertes en direct + audit d'honnêteté d'application (écrit ≠ appliqué)",
    "notifCount": "Alertes {{count}}",
    "criticalCount": " · critique {{count}}",
    "warnCount": " · avert. {{count}}",
    "applyAuditBadge": "Audit d'application · ok {{ok}} · avert. {{warn}} · mauvais {{bad}}",
    "executeBadge": "EXÉCUTER {{state}}",
    "executeLabel": "EXECUTE",
    "publicNo2fa": "Ce panneau écoute sur toutes les interfaces et votre compte administrateur n'a pas de 2FA.",
    "go": "Ouvrir",
    "open": "Ouvrir",
    "noCriticalWarn": "Aucune alerte critique ou d'avertissement",
    "notifCenter": "Centre de notifications",
    "noHealthYet": "État de santé pas encore disponible",
    "sysChange": "Modifications système",
    "opened": "Activé",
    "closed": "Désactivé",
    "readinessLink": "Préparation →",
    "hostMetrics": "Métriques de l'hôte",
    "loadAvg": "Charge moyenne (1 · 5 · 15 min)",
    "memoryDash": "Mémoire —",
    "metricsLink": "Métriques →",
    "runningOf": "En cours {{running}}/{{total}}",
    "noProjects": "Aucun projet pour le moment",
    "wizardLink": "Création rapide →",
    "allProjects": "Tous les projets →",
    "recentN": "Derniers {{n}}",
    "runningCount": "En cours {{n}}",
    "securityLink": "Sécurité →",
    "wizardTitle": "Création rapide",
    "wizardDesc": "Créer un projet et éventuellement préparer DNS / mail / base de données (appliquer sur chaque page de fonctionnalité)",
    "projectName": "Nom du projet",
    "projectNameHint": "Nom d'affichage ; crée un répertoire correspondant",
    "nameRequired": "Entrez un nom de projet",
    "domainOptional": "Domaine (facultatif)",
    "domainHint": "Requis pour activer les options DNS et mail",
    "runtime": "Durée d'exécution",
    "runtimeHint": "Définit la version runtime et le style de déploiement par défaut",
    "runtimeVersion": "Version du runtime",
    "versionHint": "Écrit le réglage de version d’environnement d’exécution du projet",
    "serverIpv4": "IPv4 du serveur",
    "serverIpv4Hint": "DNS A / courrier SPF",
    "serverIpv4Ph": "IPv4 public de cet hôte",
    "serverIpv6": "IPv6 du serveur (facultatif)",
    "serverIpv6Hint": "Écrit AAAA / ip6: si défini",
    "serverIpv6Ph": "IPv6 public (facultatif)",
    "needDomainFirst": "Saisissez d’abord un domaine",
    "withDns": "Créer aussi la zone DNS",
    "withDnsDesc": "Domaine requis ; enregistrement uniquement — appliquer la zone sur la page DNS",
    "withMail": "Enregistrer aussi le domaine mail",
    "withMailDesc": "Domaine requis ; installer le logiciel et le DNS sur la page détail mail",
    "withDb": "Préparer aussi une base MySQL",
    "withDbDesc": "Enregistrement plan de contrôle ; appliquer sur la page moteur SQL",
    "wizardHint": "La création rapide ne bascule pas automatiquement en production",
    "wizardSubmit": "Créer",
    "wizardOk": "Créé",
    "wizardPartial": "Échec partiel",
    "notifCenterTitle": "Notifications ({{count}})",
    "notifCenterDesc": "Critique {{critical}} · avert. {{warn}} · info {{info}}",
    "noNotifs": "Aucune notification",
    "noNotifsDesc": "Les alertes système et les tâches apparaissent ici",
    "applyAuditTitle": "Audit de l’état d’application",
    "applyAuditDesc": "ok {{ok}} · avert. {{warn}} · erreur {{bad}}",
    "barTitle": "{{count}} alerte(s) hôte",
    "levelCritical": "Critique",
    "levelWarn": "Avertissement",
    "levelInfo": "Informations",
    "colTitle": "Alerte",
    "colDetail": "Détail",
    "colSource": "Source",
    "notifSearch": "Rechercher des alertes",
    "notifAll": "Tous",
    "notifDismiss": "Cacher",
    "goFix": "Réparer"
  },
  "dataTable": {
    "empty": "Aucune donnée",
    "actions": "Actes"
  },
  "db": {
    "serviceSettings": "Paramètres du service",
    "installedOk": "{{engine}} installé",
    "startedOk": "{{engine}} démarré",
    "installFirst": "Installer {{engine}} d’abord",
    "softwareMissing": "Le logiciel {{engine}} n’est pas installé",
    "serviceOverview": "Vue d’ensemble du service",
    "readonlyStatus": "État en lecture seule",
    "readonlyProbe": "Sonde en lecture seule",
    "systemChange": "Modifications système",
    "opened": "Activé",
    "notOpened": "Désactivé",
    "admin": "Administrateur",
    "client": "Client",
    "hasClient": "Oui",
    "noClient": "Non",
    "canProvision": "Peut créer des BDD",
    "dumpOk": "Dump terminé",
    "dumpFailed": "Échec du dump",
    "noDumpToImport": "Aucun fichier de dump à importer",
    "expiredTempUsersProcessed": "Utilisateurs temporaires expirés traités",
    "dumpFirstDb": "Dumper la première BDD",
    "importLatestDump": "Importer le dernier dump",
    "cleanupExpiredTempUsers": "Nettoyer les utilisateurs temporaires expirés",
    "adminerEntry": "Projet explorateur BD",
    "browserProjectTitle": "Créer un projet navigateur BDD",
    "browserTool": "Outil",
    "browserNameHint": "Crée un projet PHP ; le nom doit être unique",
    "browserNameTaken": "Le nom de projet existe déjà : {{name}}",
    "browserProjectCreated": "Projet navigateur BDD créé",
    "createBrowserProject": "Créer le projet et déployer",
    "downloadPhpMyAdmin": "Télécharger phpMyAdmin (nécessite modification système + réseau)",
    "createDatabase": "Créer une base de données",
    "installBannerHint": "Utilisez la bannière ci-dessus pour installer {{engine}}.",
    "exclusiveMariaHint": "Cet hôte exécute MariaDB. Utilisez la page MariaDB ou le basculement en un clic (type SWITCH).",
    "exclusiveMysqlHint": "Cet hôte exécute MySQL. Utilisez la page MySQL ou le basculement en un clic (type SWITCH).",
    "openMaria": "MariaDB",
    "openMysql": "MySQL",
    "openMariaService": "Service MariaDB",
    "openMysqlService": "Service MySQL",
    "startService": "Démarrer le service",
    "openServiceConsole": "Ouvrir la console du service",
    "opsResult": "Résultat ops",
    "tempPasswordOnce": "Mot de passe temporaire en lecture seule (affiché une seule fois) :",
    "tabDatabases": "Bases de données ({{count}})",
    "tabUsers": "Utilisateurs ({{count}})",
    "tabTemp": "Lecture seule temp. ({{count}})",
    "tabRemote": "Hôtes distants ({{count}})",
    "dbList": "Liste des bases de données",
    "charset": "Jeu de caractères",
    "noDatabasesYet": "Aucune base de données pour l'instant",
    "emptyDbInstallFirst": "Installez {{engine}} via la bannière, puis Créer une base de données",
    "emptyDbCannotProvision": "Impossible de créer des bases de données sur le serveur pour le moment",
    "emptyDbCreateHint": "Utilisez Créer une base de données, puis Appliquer",
    "emptyDbHostHasRows": "L'hôte possède déjà des bases de données qui ne figurent pas dans cette liste de plan de contrôle.",
    "registeredVsHostHint": "Enregistré dans le panneau / trouvé sur l’hôte",
    "registeredCount": "Inscrit",
    "hostCount": "Sur l'hôte",
    "registeredUsers": "Utilisateurs enregistrés",
    "registeredUsersHint": "Inscriptions au panel uniquement – ​​pas tous les comptes MySQL",
    "hostStillExists": "Toujours chez l'hôte",
    "expiresLabel": "Expire",
    "dumpNeedRegistered": "Enregistrez d’abord une base dans le panneau",
    "dumpFirstDbTitle": "Exporter la première base enregistrée",
    "importNeedRegistered": "Enregistrez d’abord une base dans le panneau",
    "importLatestNeedConfirm": "Confirmation requise — importe dans la base enregistrée",
    "hostHasUntracked": "{{count}} les bases de données hôtes ne sont pas enregistrées dans le panneau",
    "hostInventoryHint": "Le tableau contient uniquement des lignes du plan de contrôle. Les noms live proviennent de SHOW DATABASES.",
    "userList": "Utilisateurs",
    "userListDesc": "Accorder aux utilisateurs l'accès aux bases de données",
    "createUserBtn": "+ Créer un utilisateur",
    "noUsersYet": "Aucun utilisateur pour l'instant",
    "tempReadonlyUsers": "Utilisateurs temporaires en lecture seule",
    "tempReadonlyDesc": "Le plan de contrôle marque comme expiré après le TTL ;",
    "dbName": "Nom de la base de données",
    "ttlHours": "TTL (heures)",
    "ttlHoursHint": "Marqué invalide après expiration",
    "createReadonlyUser": "Créer un utilisateur en lecture seule",
    "tempUserCreated": "Utilisateur temporaire en lecture seule créé",
    "expiresAt": "Expire",
    "revokeRegistration": "Révoquer l'enregistrement",
    "remoteDbHosts": "Hôtes de bases de données distants",
    "remoteDbHostsDesc": "Enregistrer les cibles de connexion (le mot de passe n'est pas renvoyé)",
    "remoteTest": "Tester la connexion",
    "remoteTestDone": "Sonde d'hôte distant terminée",
    "remoteTestOk": "accessible",
    "remoteTestFail": "inaccessible",
    "remoteNotChecked": "non testé",
    "remoteDeleteTitle": "Retirer uniquement cet enregistrement",
    "remoteDeleteConfirm": "Retirer l’enregistrement {{name}} ? Le serveur distant n’est pas modifié.",
    "displayName": "Nom d'affichage",
    "prodReplicaPlaceholder": "Réplica de production",
    "remoteHostSaved": "Hôte distant enregistré",
    "createDbTitle": "Créer une base de données {{engine}}",
    "createDbDesc": "Après l'enregistrement du plan de contrôle, Appliquer pour écrire sur le serveur",
    "dbNameHint": "Alphanumériques minuscules et underscore ; appliquer au système après création",
    "alsoCreateUser": "Créer aussi un utilisateur",
    "alsoCreateUserDesc": "Créer un identifiant pouvant se connecter à cette base de données",
    "passwordMin8": "Au moins 8 caractères",
    "passwordMin8chars": "Au moins 8 caractères",
    "allowConnectHost": "Hôte autorisé",
    "allowConnectHostHint": "Souvent % (tous) ou localhost",
    "allowConnectHostHintShort": "Souvent % ou localhost",
    "createDbHint": "Écrit uniquement le plan de contrôle ; Appliquer exécute CREATE DATABASE sur le serveur.",
    "createUserTitle": "Créer un utilisateur {{engine}}",
    "createUserDesc": "Appliquer après création",
    "bindDatabase": "Lier une base de données",
    "bindDatabaseHint": "Facultatif ; accorder des privilèges sur cette BD",
    "noneOption": "— aucun —",
    "importDumpTitle": "Importer le dump ?",
    "importDumpDesc": "Importer {{dump}} dans {{db}}",
    "import": "Importer",
    "importOk": "Importation terminée",
    "importFailed": "Échec de l'importation",
    "deleteDbTitle": "Supprimer l'enregistrement de la base de données ?",
    "deleteDbDesc": "Supprime uniquement l'enregistrement du plan de contrôle ; ne fait pas de DROP de la base sur le serveur.",
    "deleteUserTitle": "Supprimer l'inscription de l'utilisateur ?",
    "deleteUserDesc": "Supprime uniquement l'enregistrement du plan de contrôle.",
    "adminerTitle": "Navigateur de base de données Adminer",
    "adminerDesc": "Télécharger Adminer + écrire la conf Nginx ; appliquer au système exécute nginx -t + reload",
    "adminerWritten": "Adminer écrit dans les fichiers de gestion",
    "adminerApplied": "Adminer appliqué",
    "writeOnly": "Écriture seule (écrit)",
    "applyToSystem": "Appliquer au système",
    "adminerRisk": "Adminer public est risqué — restreignez les IP sources ou ajoutez une authentification HTTP. Nécessite le socket PHP-FPM (par défaut php8.2).",
    "vhostName": "Nom de l'hôte virtuel",
    "vhostHint": "Pointez l'enregistrement DNS A vers cet hôte pour un accès externe",
    "downloadAdminer": "Télécharger Adminer PHP (nécessite YSK_EXECUTE + réseau sortant)",
    "downloadAdminerDesc": "Désactivé = utiliser uniquement le fichier déjà téléchargé",
    "adminerWriteHint": "Écriture seule = gestion écrite ;",
    "pgInstallBanner": "Installez d'abord PostgreSQL via la bannière",
    "pgEmptyCreateHint": "Après la création, Appliquer au système pour écrire sur le serveur",
    "pgNoDbs": "Aucune base de données PostgreSQL pour l'instant",
    "pgCreateTitle": "Créer une base de données PostgreSQL",
    "pgCreateDesc": "Inscription au plan de contrôle ; Appliquer au système exécute CREATE DATABASE",
    "pgAlsoCreateRole": "Créer aussi un rôle",
    "pgAlsoCreateRoleDesc": "Créer un rôle de connexion et accorder cette base de données",
    "roleName": "Nom du rôle",
    "roleHint": "Rôle PostgreSQL / utilisateur de connexion",
    "pgDeleteDbDesc": "Supprime l'enregistrement du plan de contrôle (ne fait pas de DROP automatique sauf si une application de révocation est exécutée).",
    "update": "Mettre à jour",
    "alsoCreateRole": "Créer aussi un rôle",
    "cluster": {
      "standaloneOtherEngines": "Ce moteur est autonome. D'autres moteurs ont des clusters : {{names}}.",
      "roleUnassigned": "Aucun rôle attribué",
      "title": "Grappe",
      "description": "Plan → écrire la gestion → appliquer → sonder → distribution aux pairs / flotte. Simulation par défaut.",
      "redirectedFromCluster": "Vous avez été redirigé ici depuis /cluster. Il s'agit de l'onglet du cluster de bases de données.",
      "notApplied": "Non appliqué",
      "plannedAt": "Créé {{when}}",
      "clearStalePlans": "Effacer les plans obsolètes",
      "clearStalePlansTitle": "Supprimer les clusters planifiés obsolètes ?",
      "clearStalePlansDesc": "Supprime {{n}} inscription(s) planifiée(s)/projet(s) datant de plus de 7 jours. Ne s'applique pas et ne pousse pas. La configuration du système n'est pas touchée.",
      "landingTitle": "Cluster de base de données",
      "landingDesc": "No database engine is installed on this host. Open an engine page to install, then return here.",
      "landingNoneInstalled": "MySQL, MariaDB, PostgreSQL, and Redis are not installed. /cluster does not open a MySQL tab when MySQL is missing.",
      "openEngine": "Ouvrir {{engine}}",
      "overviewPill": "Grappes {{n}}",
      "enginesInstalled": "Moteurs",
      "plannedCount": "Prévu",
      "overviewList": "Grappes ({{count}})",
      "overviewEmpty": "Aucune inscription de cluster pour l'instant.",
      "engine": "Moteur",
      "kind": "Gentil",
      "members": "Membres",
      "kindGalera": "Galera simple",
      "kindMysqlReplica": "MySQL primaire/réplica",
      "kindPgReplica": "Réplica en streaming PostgreSQL",
      "kindRedisReplica": "Redis primaire/réplica",
      "createGalera": "Créer un Galera simple",
      "createMysqlReplica": "Créer primaire/réplica",
      "createPgReplica": "Créer une réplica en streaming",
      "createSentinel": "Créer Sentinel",
      "createRedisReplica": "Créer une réplica Redis",
      "needRealIps": "Saisissez les IP/noms d'hôte locaux et pairs réels",
      "hostInvalid": "Entrez un IPv4, IPv6 ou un nom d'hôte valide.",
      "statusNote": "État : {{status}} (succès du plan ≠ santé du cluster)",
      "artifactNote": "Artefacts : {{dir}}",
      "planGenerated": "Plan généré (simulation)",
      "planUpdated": "Plan mis à jour",
      "manageWritten": "Fichiers de gestion écrits (simulation)",
      "bootstrapTried": "Amorçage tenté",
      "applyTried": "Application de la conf système tentée",
      "localOk": "OK local",
      "localProbeFail": "Sonde locale échouée",
      "probedWithPeers": "Sondé (y compris les pairs)",
      "probedLocal": "Sondé local",
      "peerTarNote": "Paquet pair téléchargé (.tar.gz) — extraire et installer la conf sur le pair",
      "downloaded": "Téléchargé",
      "peerPushed": "Poussé vers le pair",
      "pushPlanGenerated": "Plan de push généré",
      "registrationDeleted": "Enregistrement supprimé",
      "nodes": "Nœuds",
      "remoteInstallPlan": "Plan d'installation distante",
      "fleetSession": "Identifiant de session de l'agent de flotte",
      "fleetSessionHint": "Optional. Paste a session UUID from /agents. Then this peer uses fleet (no SSH). Leave empty for SSH scp.",
      "fleetSessionPh": "UUID de la session de la page Agents",
      "fleetSessionNone": "Aucun — utilisez SSH",
      "fleetSessionOpenAgents": "Ouvrir /agents pour enregistrer une session",
      "createWizardTitle": "Ouvre l'assistant de plan. Nécessite une adresse IP locale et ≥1 homologue. Écrit uniquement les artefacts du panneau (essai à sec). Ne redémarre pas le moteur jusqu'à ce que vous l'appliquiez.",
      "bootstrap": "Amorçage",
      "fleetApply": "Flotte postuler",
      "planTitle": "Régénérer le plan de cluster (pas de changement d'hôte)",
      "writeFileTitle": "Écrire les fichiers de gestion sous le répertoire de données du panneau (essai à sec)",
      "probeLocalTitle": "Sonder cet hôte uniquement",
      "probeAllTitle": "Sondez chaque membre enregistré",
      "bootstrapTitle": "Installez le drop-in local et amorcez le premier nœud",
      "remoteInstallPlanTitle": "Aperçu de l'installation à distance (pas d'exécution)",
      "downloadBundleTitle": "Téléchargez le bundle de configuration entre pairs (.tar.gz)",
      "pushPlanTitle": "Aperçu push to peer (pas de scp)",
      "fleetSyncPlanTitle": "Aperçu de la synchronisation de la flotte (pas d'exécution)",
      "fleetApplyTitle": "La mise en file d'attente s'applique-t-elle aux membres de la flotte ?",
      "status": {
        "healthy": "En bonne santé",
        "planned": "Prévu",
        "partial": "Partiel",
        "failed": "Échoué",
        "draft": "Brouillon",
        "degraded": "Dégradé",
        "applied": "Appliqué"
      },
      "fleetSyncPlan": "Plan de sync de flotte",
      "standaloneTitle": "Actuellement : autonome",
      "standaloneRepl": "Aucun réplica enregistré. Définir primary/master + réplica pour générer la conf et les scripts.",
      "standaloneHa": "Aucun HA enregistré. Ajouter des nœuds pairs pour générer le plan de conf, puis bootstrap / join.",
      "recentProbe": "Sonde récente (wsrep local)",
      "probeRequired": "healthy exige une sonde réussie",
      "planPreview": "Aperçu du plan",
      "planPreviewDesc": "dry-run · succès signifie uniquement que les étapes/conf ont été générées",
      "files": "Fichiers",
      "systemChangeNeed": "Requis à l'application",
      "planModalDesc": "Choisir les nœuds → générer le plan (ne modifie pas les systèmes pairs)",
      "generatePlan": "Générer le plan",
      "clusterName": "Nom du cluster",
      "localIp": "IP / hôte local",
      "primaryIpHint": "Hôte du plan de contrôle (primary/master + access=local)",
      "localIpHint": "Hôte du plan de contrôle (access=local)",
      "ipExample1": "ex. 10.0.0.1",
      "ipExample2": "ex. 10.0.0.2",
      "ipExample3": "ex. 10.0.0.3",
      "replicaIp": "IP / hôte du réplica",
      "peerIp": "IP / hôte du pair",
      "replicaHint": "Nœud réplica",
      "peerHint": "Deuxième nœud (Galera préfère 3)",
      "thirdNode": "3e nœud (optionnel)",
      "thirdNodeHint": "Recommandé pour Galera / multi-réplica",
      "sstMethod": "Méthode SST",
      "forbidDemoIp": "Pas d'IP de démo (203.0.113.x).",
      "fwGalera": "Ouvrir en interne 3306 / 4567 / 4444 / 4568.",
      "fwPg": "Le streaming nécessite 5432 en interne ; changer les mots de passe CHANGE_ME dans les scripts.",
      "fwRedis": "Redis interne 6379 (sentinel 26379).",
      "fwRepl": "Les réplicas doivent avoir les ports internes correspondants ; changer les mots de passe CHANGE_ME.",
      "needExecuteRoot": "L'application de la conf système nécessite YSK_EXECUTE=1 + root.",
      "topology": "Topologie : {{kind}}",
      "applyLocalTitle": "Appliquer la conf système locale ?",
      "applyBootstrapDesc": "Installe le drop-in Galera et le bootstrap (galera_new_cluster)",
      "applyJoinDesc": "Installe le drop-in Galera et systemctl restart mariadb",
      "confirmApply": "Confirmer l'application",
      "deleteClusterTitle": "Supprimer l'enregistrement du cluster ?",
      "remoteInstallTitle": "Installer à distance sur le pair ?",
      "pushTitle": "Pousser vers le pair ?",
      "fleetSyncTitle": "Sync de flotte ?",
      "confirmOp": "Confirmer",
      "deleteClusterDesc": "La conf système n'est pas effacée automatiquement (v1).",
      "remoteInstallDesc": "Installer la conf + redémarrer sur le pair. Nécessite YSK_EXECUTE + SSH.",
      "pushDesc": "scp des fichiers vers le pair /tmp ?",
      "fleetSyncDesc": "Synchroniser l'instantané du cluster vers le edge de la flotte, puis appliquer.",
      "fleetApplyDesc": "Mettre en file l'application vers les membres de la flotte.",
      "remoteInstalled": "Installé à distance",
      "fleetSynced": "Sync de flotte mise en file",
      "fleetApplyQueued": "Application flotte mise en file d'attente",
      "engineNotInstalled": "{{engine}} n'est pas installé sur cet hôte — installez-le d'abord ou ouvrez le moteur qui est réellement en cours d'exécution.",
      "plan": "Plan",
      "writeFile": "Écrire les fichiers",
      "applyLocal": "Appliquer en local",
      "probeAll": "Sonder tous les nœuds",
      "remoteInstall": "Installation distante",
      "downloadBundle": "Télécharger le bundle",
      "pushPlan": "Pousser le plan",
      "pushExecute": "Pousser l'exécution",
      "fleetSync": "Synchronisation de flotte",
      "localConfPreview": "Aperçu conf locale",
      "refresh": "Actualiser",
      "close": "Fermer",
      "cancel": "Annuler",
      "delete": "Supprimer",
      "probe": "Sonder",
      "name": "Nom",
      "type": "Taper"
    },
    "console": {
      "dataBrowse": "Parcourir les données",
      "dbManage": "Admin base de données",
      "realtime": "En direct",
      "reload": "Recharger",
      "needRestart": "Redémarrage requis",
      "affectsProjects": "Les sites et services qui utilisent ce moteur seront interrompus.",
      "lifecycle": "Cycle de vie",
      "overview": "Vue d'ensemble",
      "actionDone": "{{action}} terminé",
      "installDone": "Installation terminée",
      "noChanges": "Rien à appliquer",
      "settingsApplied": "Paramètres appliqués",
      "notReadFromService": "Non lu depuis le service",
      "applyMode": "Mode d'application : {{mode}}",
      "dirtyNotApplied": "Modifié, non appliqué",
      "highRisk": "Paramètres à haut risque",
      "engine": "Moteur",
      "bootEnabled": "Démarrer au démarrage",
      "uptimeSec": "Temps de disponibilité (s)",
      "currentConnections": "Connexions",
      "changes": "Modifications",
      "serviceTitle": "Service {{title}}",
      "softwareMissing": "Le logiciel {{title}} n'est pas installé",
      "overviewDesc": "Infos en lecture seule issues du probe (pas des champs de formulaire)",
      "lifecycleDesc": "Installer, démarrer, arrêter et activer au démarrage",
      "about": "À propos",
      "cluster": "Grappe",
      "noSettings": "Aucun paramètre dans cette catégorie (ou non pris en charge dans cette version)",
      "applyHint": "Live peut être modifié en ligne ;",
      "applyCategory": "Appliquer la catégorie",
      "applyAll": "Appliquer toutes les modifications",
      "applyCatCount": "Appliquer la catégorie ({{n}})",
      "applyAllCount": "Tout appliquer ({{n}})",
      "lifecycleNote": "Dans Paramètres, les changements Live s'appliquent en ligne ; un redémarrage requis nécessite un redémarrage Lifecycle après application.",
      "installEngine": "Utilisez la bannière ci-dessus pour installer {{title}}.",
      "reloadConfig": "Recharger la conf",
      "disableBoot": "Désactiver au démarrage",
      "disableBootConfirm": "Le moteur ne démarrera pas après le redémarrage tant que vous ne l'aurez pas réactivé.",
      "needRights": "Nécessite des droits de modification système et admin. Les échecs affichent les raisons — jamais de faux succès.",
      "noneFetched": "— aucun —"
    },
    "importEntry": "Entrée : {{url}}",
    "adminerRiskFull": "Adminer public est risqué — restreignez les IP sources ou ajoutez une authentification HTTP. Nécessite le socket PHP-FPM (par défaut php8.2).",
    "adminerWriteHintFull": "Écriture seule = gestion écrite ;",
    "pgInstalled": "PostgreSQL installé",
    "pgStarted": "PostgreSQL démarré",
    "notInstalledShort": "Non installé",
    "serviceConsole": "Console de service",
    "installPgFirst": "Installez d'abord PostgreSQL",
    "pgSoftwareMissing": "Le logiciel PostgreSQL n'est pas installé",
    "installPgBanner": "Utilisez la bannière ci-dessus pour installer PostgreSQL.",
    "createPlus": "+ Créer",
    "dbNameHintPg": "Minuscules alphanumériques et underscore ; appliquer après la création",
    "deleteNotePg": "La suppression de l'enregistrement ne DROP pas la BD du serveur ; un apply réussi signifie que le DDL a été exécuté sur l'hôte.",
    "tabDatabasesSimple": "Bases de données ({{count}})",
    "frozenTitle": "Le service de base de données nécessite une réparation",
    "frozenBody": "Problèmes détectés (mode freeze : {{mode}} ;",
    "unfreezeBtn": "Diagnostiquer et réparer",
    "unfreezeConfirmTitle": "Réparer {{engine}} ?",
    "unfreezeConfirmDesc": "Exécute un plan de réparation générique issu des diagnostics (arrêt, levée du freeze, assainissement de la config, init emp",
    "unfreezeConfirmBtn": "Confirmer la réparation",
    "unfreezeOk": "Réparation de {{engine}} terminée",
    "startAfterUnfreeze": "Démarrer le service (exécute automatiquement le plan de réparation en cas d'échec)",
    "serviceDownTitle": "Le service de base de données est arrêté",
    "serviceDownBody": "Le service est en mauvais état",
    "adoptHostDb": "S'inscrire {{name}}",
    "adoptHostDbTitle": "N’enregistre que le nom dans le plan de contrôle ; n’altère pas les données hôte.",
    "cleanupExpiredTempUsersTitle": "Supprime les utilisateurs temporaires du panneau déjà expirés",
    "invalidSqlIdent": "Utilisez un identifiant minuscule : commencez par une lettre, puis des lettres, des chiffres ou un trait de soulignement.",
    "remoteHostRequired": "Entrez un hôte distant.",
    "remoteTestUnsaved": "Enregistrez d'abord cet hôte, puis testez la connexion. Ou remplissez l'hôte et enregistrez.",
    "serverNotInstalled": "Ce moteur n'est pas installé sur le serveur.",
    "dumpNeedEngine": "Installez le moteur avant d'exporter une base de données.",
    "unboundDatabase": "Enregistrement de la base de données supprimé",
    "userGoneRefresh": "Cet utilisateur est parti. La liste a été rafraîchie."
  },
  "dialogs": {
    "confirmDefault": "Confirmer",
    "cancelDefault": "Annuler",
    "severity": {
      "consequencesTitle": "Cela va :",
      "typeToConfirm": "Saisissez « {{text}} » pour confirmer"
    }
  },
  "dns": {
    "templates": {
      "minimal": "Minimal — apex A uniquement",
      "web": "Web — sommet + www",
      "mail": "Courrier – sommet + courrier + MX + SPF",
      "full": "Complet — web + mail + ftp + SPF",
      "cdn": "CDN — apex + www + cdn (prêt multi-edge)"
    },
    "dnssecOk": "Clés DNSSEC générées (écrites — zone non signée / pas chez le registrar)",
    "dnssecNotOk": "Clés DNSSEC non générées (notes uniquement ou outils indisponibles — pas de faux succès)",
    "dnssecFailed": "Échec DNSSEC",
    "blocked": "Bloqué (permission system-change requise)",
    "clusterDone": "Terminé ({{status}})",
    "clusterPartial": "Pas entièrement réussi ({{status}}) — voir les détails ci-dessous",
    "clusterFailed": "Échec de l'opération cluster",
    "validateFailed": "Échec de la validation de l'enregistrement",
    "validateRequestFailed": "Échec de la requête de validation",
    "lookupFailed": "Échec de la recherche",
    "statRecords": "Enregistrements",
    "statSelected": "Sélectionné",
    "notInstalled": "Le logiciel DNS requis n'est pas installé",
    "dsForRegistrar": "DS (pour le registrar ; non publié automatiquement) :",
    "tabs": {
      "zones": "Zones",
      "records": "Enregistrements",
      "cluster": "Grappe",
      "dnssec": "DNSSEC",
      "tools": "Outils",
      "ddns": "DDNS",
      "about": "À propos"
    },
    "recentWrite": "Résultat d'écriture récent",
    "zonesTitle": "Zones ({{count}})",
    "zonesDesc": "Après la création, écrire/appliquer la zone",
    "createZone": "+ Créer une zone",
    "mailZonesMissing": "Les domaines de messagerie n'ont pas de zone DNS ici : {{domains}}.",
    "createMailZone": "Créer une zone de messagerie",
    "colZoneName": "Nom de zone",
    "colServerIp": "IP du serveur",
    "colTemplate": "Modèle",
    "colStatus": "Statut",
    "emptyZonesTitle": "Aucune zone DNS pour l'instant",
    "emptyZonesDesc": "Utilisez « Créer une zone » dans la barre d'outils de la liste",
    "applyZoneTitle": "Écrire le fichier de zone et l'enregistrer dans named.conf de PowerDNS + redécouvrir (write ≠ réponses dig)",
    "applyZone": "Écrire / appliquer",
    "recordsFor": "Enregistrements — {{zone}}",
    "recordsNeedSelect": "Enregistrements (sélectionnez d'abord une zone)",
    "statusLabel": "Statut",
    "addRecord": "+ Ajouter un enregistrement",
    "writeZoneFile": "Écrire et charger la zone",
    "healthLoaded": "Chargé",
    "stateLoaded": "Chargé",
    "healthPublicNs": "NS publics",
    "statePublicNs": "NS publics",
    "publicNsHere": "→ cet hôte",
    "requestLeTitle": "Demander Let’s Encrypt pour {{zone}}",
    "requestZoneSsl": "Demander un SSL pour la zone",
    "soaTitle": "SOA / TTL par défaut",
    "soaDesc": "Serveur de noms SOA et $TTL lors de l’écriture du fichier de zone ;",
    "soaBlockNs": "Serveurs de noms",
    "soaBlockTiming": "TTL et minuteries",
    "recordsListTitle": "Enregistrements DNS ({{count}})",
    "recordsListDesc": "Après modification, utilisez « Écrire le fichier de zone » ci-dessus pour mettre à jour le fichier sur disque de named.",
    "soaNsLabel": "Serveur de noms SOA",
    "soaNsHint": "Laisser vide → ns1.zone par défaut.",
    "defaultTtl": "TTL par défaut (secondes)",
    "min1": "1 minute",
    "min5": "5 minutes",
    "min10": "10 minutes",
    "hour1": "1 heure",
    "day1": "1 jour",
    "customSeconds": "Secondes personnalisées",
    "soaSaved": "SOA enregistré (plan de contrôle) — « Écrire le fichier de zone » pour appliquer",
    "soaSaveFailed": "Échec de l’enregistrement du SOA",
    "soaSavedAndWritten": "Enregistré et fichier de zone écrit",
    "soaWriteFailed": "Échec de l’écriture du SOA",
    "failed": "Échoué",
    "colType": "Taper",
    "colName": "Nom",
    "colValue": "Valeur",
    "emptyRecords": "Aucun enregistrement",
    "noZoneSelectedTitle": "Aucune zone sélectionnée",
    "noZoneSelectedDesc": "Choisissez une zone dans l’onglet Zones",
    "clusterTitle": "Cluster DNS",
    "clusterDesc": "Après SCP des fichiers de zone, rechargement distant (rndc / named / bind9 / pdns)",
    "peerHost": "Hôte pair",
    "peerHostHint": "Nom d’hôte ou IP du NS secondaire (connexion par clé SSH)",
    "sshUser": "Utilisateur SSH",
    "sshUserHint": "Nécessite l’écriture sur le chemin cible et la permission de rechargement",
    "labelOptional": "Libellé (facultatif)",
    "labelPlaceholder": "ex. ns2 / hkg-edge-dns",
    "opPerPeer": "Cette opération (par pair)",
    "registeredPeers": "Pairs enregistrés ({{count}})",
    "lastProbeHint": "lastProbe se met à jour après un probe ou un push",
    "noPeers": "Aucun pair enregistré pour l’instant",
    "zoneDirMissing": "· répertoire de zone manquant",
    "generateKeys": "Générer les clés ; ne passe pas en production automatiquement",
    "selectZoneFirst": "Sélectionnez d’abord une zone",
    "lookupTitle": "Recherche DNS (dig)",
    "lookupDesc": "Interroge les résolveurs publics ; vérifie multi-A / CDN. N’invente pas de réponses.",
    "lookupNamePlaceholder": "ex. example.com ou www.example.com",
    "lookupType": "Type de requête",
    "lookupResults": "Résultats ({{count}})",
    "lookupNoAnswerFail": "Aucune réponse / échec",
    "digNotInstalled": "dig n'est pas installé",
    "digNotInstalledHint": "Cet onglet nécessite le binaire dig (bind9-dnsutils). Ce n'est pas NXDOMAIN. Installez bind9-dnsutils à partir du gestionnaire de packages hôte ; cette page ne l'installe pas automatiquement.",
    "method": "Méthode : {{method}}",
    "noAnswers": "Aucune réponse",
    "noAnswersDesc": "NXDOMAIN, RRset vide ou échec de résolution",
    "lookupOkHint": "Résultats de requête en direct",
    "lookupFailHint": "Recherche échouée ou vide. Vérifiez le nom, le type et les résolveurs amont.",
    "validateTitle": "Validation d'enregistrement",
    "validateDesc": "La création/modification valide automatiquement (conflits CNAME, format A/AAAA, etc.).",
    "createZoneTitle": "Créer une zone DNS",
    "createZoneDesc": "Générer des enregistrements à partir d'un modèle",
    "createZoneNeedValid": "Entrez un nom de zone et une adresse IPv4 valides",
    "zoneNameHint": "ex. example.com (sans point final)",
    "invalidZone": "Nom de zone invalide. Utilisez un vrai domaine (par exemple exemple.com).",
    "invalidIpv4": "IPv4 invalide. Chaque octet doit être compris entre 0 et 255.",
    "serverIpv4": "IPv4 du serveur",
    "serverIpv4Hint": "Adresse utilisée pour les enregistrements A du modèle",
    "thisHostIpv4": "IPv4 public de cet hôte",
    "serverIpv6Optional": "IPv6 du serveur (facultatif)",
    "serverIpv6Hint": "Écrit AAAA si une IPv6 publique existe ; peut rester vide",
    "thisHostIpv6": "IPv6 publique de cet hôte (facultatif)",
    "soaNsCreateHint": "Laisser vide pour ns1.zone-name",
    "defaultTtlLabel": "TTL par défaut",
    "defaultTtlHint": "Par défaut pour le SOA et les nouveaux enregistrements",
    "recordTemplate": "Modèle d'enregistrement",
    "editRecord": "Modifier l'enregistrement",
    "addRecordTitle": "Ajouter un enregistrement",
    "recordModalDesc": "Zone {{zone}} · écrire le fichier de zone après enregistrement",
    "recordType": "Type d'enregistrement DNS",
    "nameHint": "@ = apex ; www = sous-domaine",
    "mxPlaceholder": "ex. 10 mail.example.com.",
    "spfPlaceholder": "ex. v=spf1 a mx ip4:… ip6:… ~all",
    "needIpv6": "Saisissez une adresse IPv6",
    "needIpv4": "Saisissez une adresse IPv4",
    "valueHint": "IP, nom d'hôte ou contenu d'enregistrement",
    "ipv6Address": "Adresse IPv6",
    "ipv4Address": "Adresse IPv4",
    "cacheTime": "Durée de cache",
    "deleteZoneTitle": "Supprimer la zone ?",
    "deleteZoneDesc": "Supprime également ses enregistrements DNS.",
    "deleteRecordTitle": "Supprimer l'enregistrement ?",
    "deleteRecordDesc": "Écrire le fichier de zone après suppression",
    "addPeer": "Ajouter un pair",
    "probe": "Sonder",
    "pushZones": "Pousser les zones",
    "reloadRemote": "Rechargement distant",
    "generateDnssec": "Générer les clés DNSSEC",
    "lookup": "Recherche",
    "saveSoa": "Enregistrer le SOA",
    "saveSoaAndWrite": "Enregistrer et écrire le fichier de zone",
    "saveSoaSettings": "Enregistrer les paramètres SOA",
    "saveSoaAndWriteBtn": "Enregistrer et écrire le fichier de zone",
    "goToZones": "Aller aux zones",
    "refresh": "Actualiser",
    "pushReload": "Pousser + recharger",
    "pushOnly": "Pousser uniquement (sans rechargement)",
    "reloadOnly": "Rechargement distant uniquement",
    "probePeers": "Sonder les pairs",
    "clusterDefaultHint": "Par défaut : pousser puis recharger le DNS sur les pairs ; nécessite les droits de modification système.",
    "notProbed": "Pas encore sondé",
    "probeHealthy": "Sonde : {{status}}",
    "pushReloadShort": "Pousser+recharger",
    "dnssecCardDesc": "Générer les clés/DS ;",
    "currentZone": "Zone actuelle :",
    "generateAndSign": "Générer les clés et tenter de signer la zone",
    "lookupName": "Nom",
    "fillCurrentZone": "Remplir la zone actuelle",
    "lookupToolHint": "Préfère dig de l'hôte ;",
    "validateExtra": "Les erreurs bloquent l'enregistrement ; les avertissements (p. ex. CNAME apex) notifient uniquement.",
    "createAfterHint": "Après création, vérifiez l'onglet Enregistrements et écrivez le fichier de zone sur le disque.",
    "valueLabel": "Valeur",
    "ttlHint": "Durée de cache",
    "soaSavedControl": "SOA enregistré (plan de contrôle) — écrire le fichier de zone pour appliquer",
    "soaNs2Label": "NS secondaire (optionnel)",
    "soaNs2Hint": "FQDN du second serveur de noms, p. ex. ns2.example.com.",
    "soaHostmaster": "Hostmaster SOA (RNAME)",
    "soaHostmasterHint": "Utilisez des points à la place de @, p. ex. hostmaster.example.com.",
    "soaRefresh": "Refresh (secondes)",
    "soaRetry": "Retry (secondes)",
    "soaExpire": "Expire (secondes)",
    "soaMinimum": "Minimum / TTL de cache négatif (secondes)",
    "soaTimingHint": "Paramètres de timing SOA en secondes.",
    "healthTitle": "Santé du service DNS",
    "healthDesc": "Vérité hôte : unit / port 53 / fichiers de zone écrits / réponses dig locales (écrit ≠ rechargé ≠",
    "healthPillOk": "DNS OK",
    "healthPillBad": "Problèmes DNS",
    "healthService": "Service",
    "healthServiceDown": "hors service",
    "healthListen": "Port 53",
    "healthWritten": "Fichiers de zone",
    "healthAnswering": "Réponse locale",
    "healthAnsweringYes": "Oui",
    "healthAnsweringNo": "non/refusé",
    "healthRefresh": "Re-sonder",
    "healthProbeLocal": "Sonder à nouveau l'état de santé",
    "healthOpen53": "Ouvrir le pare-feu 53 (TCP+UDP)",
    "healthOpened53": "Ouverture de 53 TCP+UDP demandée",
    "healthOpen53Failed": "Échec de l'ouverture du 53",
    "healthPortClosed": "n'écoute pas",
    "healthPortOpenAlready": "Le 53 semble ouvert",
    "healthHint": "Si dig est refusé, corrigez PowerDNS, ouvrez le port 53, puis écrivez les zones.",
    "stateService": "Service",
    "stateListen": "Écoute",
    "stateWritten": "Écrit",
    "stateAnswering": "Réponse locale active",
    "lookupServer": "Serveur (@)",
    "lookupServerHint": "127.0.0.1 = auth locale ; IP publique teste l'externe ; vide = résolveur système",
    "healthHealPdns": "Réparer le bind PowerDNS",
    "healNeedInstall": "PowerDNS n'est pas installé - installez-le d'abord dans l'onglet Logiciel",
    "applyNeedService": "Le service DNS n'est pas en cours d'exécution : démarrez-le ou installez-le avant de l'appliquer.",
    "goStartService": "Démarrer le service DNS",
    "startBindHint": "Si start revient à l'arrêt, le port 53 est souvent détenu par systemd-resolved. Utilisez Heal bind ci-dessous, puis recommencez.",
    "deleteZoneNeedName": "Supprimez cette zone — vous saisirez le nom de la zone pour confirmer",
    "healthHealPdnsHint": "Définir local-address sur l'IP publique pour éviter le conflit avec systemd-resolved sur 0",
    "healthHealPdnsOk": "PowerDNS lié à {{ip}} et démarrage tenté",
    "healthHealPdnsFailed": "Échec de la réparation PowerDNS",
    "startProbeFailed": "Impossible de revérifier l'état du DNS après le démarrage",
    "startNotListening": "Le démarrage PowerDNS est renvoyé, mais l'unité ne répond pas sur le port 53",
    "aboutTitle": "Essentiels DNS",
    "aboutSub": "Zones d'abord ; enregistrements, cluster et DNSSEC nécessitent un domaine sélectionné.",
    "aboutZonesTitle": "Zones et portée",
    "aboutZonesBody": "Choisissez une zone sous Zones, puis gérez les enregistrements, le cluster et DNSSEC pour ce domaine.",
    "aboutHealthTitle": "Santé des services",
    "aboutHealthBody": "Utilisez Outils pour sonder PowerDNS, réparer le bind et ouvrir le port 53.",
    "aboutStackTitle": "Logiciels",
    "aboutStackBody": "Vérifiez/mettez à jour le paquet PowerDNS sous Logiciels.",
    "aboutDdnsTitle": "DDNS",
    "aboutDdnsBody": "L'onglet DDNS met à jour les enregistrements nommés A/AAAA lorsque l'adresse WAN de cet hôte change. Elle ne remplace pas la zone CRUD. L'écrit n'est pas la même chose que la vérité publique du résolveur.",
    "ddns": {
      "honesty": "Une écriture réussie n'est pas encore un DNS public. Les caches de résolution et le registraire NS s'appliquent toujours. Les IP vides ou privées ne sont jamais publiées.",
      "needExecute": "Les mises à jour du fournisseur nécessitent root et YSK_EXECUTE=1. La détection fonctionne toujours.",
      "lastRun": "Dernière course",
      "nextRun": "Prochaine exécution",
      "wanRemembered": "Mémorisé WAN IPv4",
      "updateNow": "Mettre à jour maintenant",
      "updateTitle": "Publier les adresses WAN détectées ?",
      "updateDesc": "Calls Cloudflare, nsupdate, or the local zone for each enabled record. Type UPDATE to confirm.",
      "updated": "Mise à jour DDNS terminée",
      "updateFailed": "Échec de la mise à jour DDNS",
      "probe": "Sonder le réseau étendu",
      "probed": "Sonde WAN terminée",
      "probeFailedUi": "La sonde WAN a échoué",
      "forceHint": "La mise à jour republie désormais même lorsque l'adresse est inchangée. Probe n’appelle jamais un fournisseur.",
      "saved": "Enregistré",
      "saveFailed": "Impossible d'enregistrer",
      "deleted": "Enregistrement supprimé",
      "emptyTitle": "Aucun enregistrement DDNS",
      "emptyDesc": "Ajoutez un nom d'hôte ci-dessous. Cloudflare, RFC 2136 ou la zone PowerDNS de cet hôte (managedBy=ddns).",
      "colFqdn": "Nom d'hôte",
      "colProvider": "Fournisseur",
      "colPublished": "Publié",
      "colEnabled": "État",
      "colFrom": "Depuis",
      "colTo": "À",
      "colWhen": "Quand",
      "colNote": "Note",
      "pauseRecord": "Pause",
      "resumeRecord": "CV",
      "statusCard": "État du réseau étendu",
      "recordsCard": "Noms d'hôtes",
      "addCard": "Ajouter un nom d'hôte",
      "settingsCard": "Paramètres",
      "historyTitle": "Mises à jour récentes",
      "historyEmpty": "Pas d'historique DDNS pour l'instant",
      "paused": "Planificateur suspendu",
      "pausedHint": "Les mises à jour programmées sont désactivées. La sonde et la mise à jour sont toujours en cours d'exécution.",
      "schedulerOn": "Mises à jour programmées",
      "schedulerOnHint": "Planificateur en cours de processus. Pas crontab. Désactivé signifie pas d'insertion automatique.",
      "zone": "Zone",
      "zoneHint": "Leave empty to use the last two labels of the hostname",
      "zoneSelectHint": "Zones locales sur cet hôte. Cloudflare et RFC 2136 peuvent utiliser n'importe quel nom de zone.",
      "noLocalZones": "Aucune zone locale pour l'instant. Créez-en d'abord un dans l'onglet Zones si vous utilisez Local PowerDNS.",
      "providerLocal": "PowerDNS local",
      "proxied": "Cloudflare mandaté",
      "proxiedHint": "Nuage orange. Laissez de côté pour les noms d’hôtes VPN/WireGuard.",
      "proxiedWarnTitle": "Nuage orange Cloudflare ?",
      "proxiedWarnDesc": "Un enregistrement proxy masque l’adresse IP d’origine. Les noms d'hôte VPN et WireGuard doivent rester uniquement DNS. Tapez PROXY pour confirmer.",
      "addRecord": "Ajouter un nom d'hôte",
      "interval": "Intervalle (secondes)",
      "intervalHint": "60-86400. Planificateur en cours ; pas crontab.",
      "cfToken": "Jeton API Cloudflare",
      "cfTokenHint": "En écriture seule. Env CF_API_TOKEN est utilisé s'il est défini. Plus jamais montré.",
      "tokenConfigured": "Un jeton Cloudflare est stocké. Laissez vide pour le conserver.",
      "tokenMissing": "Aucun jeton Cloudflare stocké (env CF_API_TOKEN s'applique toujours).",
      "rfcServer": "Serveur RFC 2136",
      "rfcServerHint": "Les serveurs distants ont besoin d'un fichier de clé TSIG dans le répertoire de données. Le bouclage peut être non signé. Le secret n'est jamais transmis sur argv.",
      "rfcKeyFile": "Fichier de clé TSIG",
      "rfcKeyFileHint": "Par rapport au répertoire de données DDNS ou à un chemin absolu sous le répertoire de données.",
      "rfcKeyConfigured": "Un chemin de fichier clé est stocké. Laissez vide pour le conserver.",
      "primaryFqdn": "Nom d'hôte principal",
      "primaryFqdnHint": "Utilisé comme indice de point de terminaison VPN. Ne réécrit pas les pairs existants.",
      "updateIdentity": "N'oubliez pas le WAN IPv4",
      "updateIdentityHint": "Stocker la dernière IPv4 publique dans l'état DDNS pour cet hôte",
      "vpnHint": "Le point de terminaison VPN peut utiliser un nom d'hôte DDNS (non réécrit automatiquement).",
      "sslHint": "Let's Encrypt HTTP-01 a besoin du nom d'hôte pour être résolu ici. Les certificats ne sont pas réémis en cas de changement d'adresse IP.",
      "deleteTitle": "Supprimer le nom d'hôte DDNS ?",
      "deleteDesc": "Tapez {{fqdn}} pour confirmer. Les lignes locales gérées par = ddns ne sont pas supprimées de l'éditeur de zone.",
      "err": {
        "requiresExecute": "Nécessite root et YSK_EXECUTE=1 pour publier.",
        "missingToken": "Le jeton API Cloudflare est manquant.",
        "rfc2136NeedKey": "La RFC 2136 distante nécessite un fichier de clé TSIG dans le répertoire de données.",
        "rfc2136KeyMissing": "Le fichier de clé TSIG est manquant ou se trouve en dehors du répertoire de données.",
        "noPublicIpv4": "Aucune IPv4 publique détectée.",
        "noPublicIpv6": "Aucune IPv6 publique détectée.",
        "notPublicIpv4": "L'IPv4 détecté n'est pas public.",
        "notPublicIpv6": "L'IPv6 détecté n'est pas public.",
        "probeFailed": "La sonde IP publique a échoué.",
        "localNoZone": "Aucune zone DNS locale pour ce nom d'hôte.",
        "localNeedsDb": "Le fournisseur local a besoin de la base de données du plan de contrôle.",
        "managedByClash": "Ce nom appartient à une autre fonctionnalité (pas à DDNS).",
        "unknownProvider": "Fournisseur DDNS inconnu.",
        "nsupdateFailed": "nsupdate a échoué.",
        "updateFailed": "La mise à jour du fournisseur a échoué.",
        "invalidFqdn": "Nom d'hôte invalide.",
        "invalidType": "Le type doit être A ou AAAA.",
        "invalidProvider": "Fournisseur inconnu.",
        "notFound": "Enregistrement introuvable.",
        "confirmMismatch": "Confirmer doit correspondre au nom d'hôte.",
        "schedulerDisabled": "Le DDNS planifié est suspendu.",
        "provider": "Le fournisseur a renvoyé une erreur."
      }
    },
    "createMailZoneNow": "Zone de messagerie créée {{domain}}",
    "toolsFirewallTitle": "Pare-feu (UFW)",
    "toolsFirewallHint": "Autoriser ou refuser le port 53. N’arrête ni ne démarre PowerDNS.",
    "toolsUnitTitle": "Unité PowerDNS",
    "toolsUnitHint": "Unité systemd pdns — démarrer, arrêter, redémarrer, recharger.",
    "installConfirmTitle": "Installer PowerDNS ?",
    "installConfirmDesc": "Installe pdns-server et écrit la config gérée. Nécessite root et YSK_EXECUTE=1.",
    "installConfirmConsequence": "Après installation et démarrage, PowerDNS liera le port 53.",
    "installPort53Busy": "Le port 53 est déjà utilisé. PowerDNS peut échouer à se lier tant que cet écouteur n’est pas arrêté ou réparé.",
    "installPort53BusyConsequence": "Réparez la liaison ou arrêtez l’autre écouteur avant d’attendre des réponses sur 53."
  },
  "docker": {
    "title": "Docker",
    "subtitle": "Installez et contrôlez le moteur Docker, les conteneurs, images, projets Compose et le disque sur cet hôte.",
    "refresh": "Actualiser",
    "notInstalled": "Docker Engine n’est pas installé. Installez docker.io et docker-compose-v2 depuis cette page.",
    "protected": "Protégé",
    "pruneConfirm": "Saisissez PRUNE pour confirmer le nettoyage de volume ou du système",
    "needEngineTitle": "Installez d'abord Docker Engine",
    "stopEngineDesc": "Cela arrête le moteur Docker et tous les conteneurs {{n}} sur cet hôte.",
    "notInstalledValue": "Non installé",
    "nameHint": "Lettres, chiffres, trait de soulignement, point, trait d'union (max 128)",
    "volPlaceholder": "mes-données",
    "netPlaceholder": "mon-net",
    "runPorts": "Publier des ports",
    "runPortsHint": "hôte : conteneur par ligne, par ex. 8080:80",
    "runEnv": "Environnement",
    "runEnvHint": "KEY=valeur par ligne",
    "runRestart": "Politique de redémarrage",
    "runNetwork": "Réseau",
    "runVolumes": "Volumes",
    "runVolumesHint": "volume : dest par ligne",
    "runAdvancedHint": "Pour les piles multiservices, utilisez des nœuds de validation ou des fichiers Compose déjà sur cet hôte.",
    "daemonConfirmTitle": "Appliquer les paramètres du démon ?",
    "daemonConfirmDesc": "Écrit daemon.json et redémarre docker.service. Tous les conteneurs seront interrompus.",
    "settingsHint": "Sous-ensemble sûr de daemon.json uniquement. Appliquer écrit le fichier et redémarre docker.service.",
    "cli": {
      "usage": "Utilisation : ysk-server docker status|ps|images|volumes|networks|df|logs|inspect|exec|start|stop|restart|rm|pull|run|prune|engine|compose [--image IMG] [--name N] [--preset version|help|hostname] [--bin BIN] [--project P] [--execute] [--json]"
    },
    "tab": {
      "overview": "Aperçu",
      "containers": "Conteneurs",
      "images": "Images Docker",
      "compose": "Compose",
      "volumes": "Volumes",
      "networks": "Réseaux",
      "prune": "Nettoyer",
      "settings": "Paramètres",
      "about": "À propos"
    },
    "col": {
      "engine": "Moteur",
      "containers": "Conteneurs",
      "version": "Version du moteur",
      "dataRoot": "Répertoire de données",
      "disk": "Disque",
      "validators": "Piles validateur",
      "name": "Nom",
      "image": "Image du conteneur",
      "status": "État",
      "ports": "Ports publiés",
      "managed": "Géré par le panneau",
      "size": "Taille",
      "driver": "Pilote",
      "type": "Genre",
      "reclaimable": "Récupérable"
    },
    "state": {
      "up": "Actif",
      "down": "Arrêté",
      "running": "En cours d'exécution",
      "exited": "Quitté",
      "exitedCode": "Quitté ({{n}})",
      "restarting": "Redémarrage",
      "restartingCount": "Redémarrage · {{n}} fois",
      "paused": "En pause",
      "created": "Créé",
      "dead": "Mort",
      "removing": "Suppression",
      "unknown": "Inconnu"
    },
    "df": {
      "images": "Images",
      "containers": "Conteneurs",
      "volumes": "Volumes locaux",
      "builder": "Créer un cache",
      "other": "Autre"
    },
    "actions": {
      "start": "Démarrer",
      "stop": "Arrêter",
      "restart": "Redémarrer",
      "remove": "Supprimer",
      "logs": "Journaux",
      "inspect": "Inspecter",
      "exec": "Exec (version du client)",
      "run": "Exécuter une image",
      "pull": "Télécharger",
      "up": "Démarrer",
      "down": "Arrêter",
      "createVolume": "Créer un volume",
      "createNetwork": "Créer un réseau",
      "pruneContainers": "Nettoyer les conteneurs",
      "pruneImages": "Nettoyer les images",
      "pruneVolumes": "Nettoyer les volumes",
      "pruneSystem": "Nettoyage système",
      "startEngine": "Démarrer le moteur",
      "stopEngine": "Arrêter le moteur",
      "restartEngine": "Redémarrer le moteur",
      "applyDaemon": "Appliquer les paramètres du moteur"
    },
    "empty": {
      "containers": "Aucun conteneur",
      "images": "Aucune image",
      "compose": "Aucun projet Compose",
      "composeDesc": "Les projets proviennent de nœuds de validation ou de fichiers Compose déjà sur cet hôte. Cette page n'accepte pas les téléchargements YAML arbitraires.",
      "composeCta": "Ouvrir les nœuds de validation",
      "volumes": "Aucun volume",
      "networks": "Aucun réseau"
    },
    "logs": {
      "empty": "Pas encore de journaux",
      "follow": "Suivre"
    },
    "deleteRunningWarn": "Ce conteneur est toujours en cours d'exécution ou redémarre. Il sera supprimé de force.",
    "settings": {
      "logMaxSize": "Taille max. des journaux de conteneur",
      "liveRestore": "Restauration à chaud (conserver les conteneurs si le démon redémarre)",
      "mirrors": "Miroirs Registry (une URL par ligne)",
      "insecure": "Registries non chiffrés (un hôte par ligne)"
    },
    "about": {
      "body": "Docker est un service hôte de premier plan sur YSK Server, comme Nginx. Installation via le panneau (Ubuntu docker.io + docker-compose-v2). Les nœuds validateurs s’exécutent en projets Compose yskval-*.",
      "honesty": "Les changements d’hôte nécessitent root et YSK_EXECUTE=1. Le dry-run est la valeur par défaut. Cette page n’est pas Kubernetes.",
      "validators": "Ouvrir les nœuds validateurs"
    },
    "alerts": {
      "daemonTitle": "Le démon Docker est arrêté",
      "daemonBody": "Docker est installé mais docker.service n’est pas actif. Les piles validateur ne peuvent pas démarrer."
    },
    "errors": {
      "notInstalled": "Docker n’est pas installé",
      "daemonDown": "Le démon Docker n’est pas actif",
      "needCompose": "docker compose (greffon v2) est requis",
      "badImage": "Référence d’image invalide",
      "badName": "Nom invalide",
      "badPort": "Publication de port invalide",
      "badEnv": "Variable d’environnement invalide",
      "badVolume": "Montage de volume invalide",
      "badNetwork": "Réseau invalide",
      "protectedNetwork": "Impossible de supprimer un réseau Docker intégré",
      "badRestart": "Politique de redémarrage invalide",
      "badPrune": "Portée de nettoyage invalide",
      "needPruneConfirm": "Le nettoyage de volume ou du système exige confirm=PRUNE",
      "badDaemon": "Paramètre du moteur invalide",
      "composeMissing": "Fichier Compose de ce projet introuvable",
      "logsFailed": "Impossible de lire les journaux du conteneur",
      "mutateFailed": "La commande Docker a échoué",
      "engineFailed": "Impossible de contrôler docker.service",
      "badExec": "Exec est limité aux binaires et préréglages autorisés (pas de shell, pas de TTY)",
      "uninstallBusy": "Arrêtez les conteneurs gérés par le panneau (y compris les piles validateur) avant de désinstaller Docker",
      "badCommand": "Commande ou point d'entrée invalide",
      "portBusy": "Le port hôte {{bind}} : {{port}} est déjà utilisé",
      "nameInUse": "Un conteneur nommé {{name}} existe déjà. Supprimez-le ou choisissez un autre nom.",
      "unpublished": "Le conteneur ne s'est pas connecté à un réseau ni n'a publié de ports. Je ne considère pas cela comme commencé."
    },
    "notes": {
      "dryMutate": "Dry-run uniquement. Passez --execute et YSK_EXECUTE=1 pour modifier l’hôte.",
      "dryPrune": "Aperçu du nettoyage (non appliqué).",
      "dryEngine": "Le contrôle du moteur est un dry-run.",
      "dryDaemon": "Écrirait /etc/docker/daemon.json et redémarrerait docker.service.",
      "daemonWrote": "daemon.json écrit",
      "start": "Conteneur démarré",
      "stop": "Conteneur arrêté",
      "restart": "Conteneur redémarré",
      "remove": "Conteneur supprimé",
      "ran": "Conteneur démarré depuis une image",
      "leftoverRemoved": "Conteneur restant {{name}} supprimé après un échec de liaison",
      "pulled": "Image téléchargée",
      "exec": "Exec autorisé exécuté",
      "imageRemoved": "Image supprimée",
      "volumeCreated": "Volume créé",
      "volumeRemoved": "Volume supprimé",
      "networkCreated": "Réseau créé",
      "networkRemoved": "Réseau supprimé",
      "pruned": "Nettoyage terminé",
      "compose": {
        "up": "Projet Compose démarré",
        "down": "Projet Compose arrêté",
        "restart": "Projet Compose redémarré",
        "rm": "Projet Compose supprimé"
      },
      "engine": {
        "start": "docker.service démarré",
        "stop": "docker.service arrêté",
        "restart": "docker.service redémarré"
      }
    },
    "ui": {
      "whatYouGet": "Ce que fait cette page",
      "whatYouGetLead": "Installez d’abord Docker Engine. Ensuite vous pouvez lancer un conteneur, tirer des images et voir les piles Compose validateur déjà sur cet hôte.",
      "capEngine": "Moteur",
      "capEngineDesc": "Installation en un clic de docker.io et docker-compose-v2. Démarrez et arrêtez docker.service ici.",
      "capWork": "Conteneurs et images",
      "capWorkDesc": "Choisissez une image courante, tirez-la, lancez-la, puis lisez les journaux ou inspectez le conteneur.",
      "capStacks": "Piles validateur",
      "capStacksDesc": "Les piles multi-services sont des projets Compose validateur (yskval-*). Cette page n’accepte pas de YAML téléversé.",
      "cardEngine": "Moteur",
      "cardDisk": "Disque",
      "cardWork": "Sur cet hôte",
      "compose": "Compose",
      "cgroup": "groupe de contrôle",
      "used": "Utilisé",
      "free": "Libre",
      "running": "En cours",
      "images": "Images",
      "volumes": "Volumes",
      "networks": "Réseaux",
      "goImages": "Images",
      "goValidators": "Nœuds validateur",
      "imagePickHint": "Choisissez une image courante. Utilisez Autre seulement pour une autre référence.",
      "imageCustom": "Autre",
      "driver": "Pilote",
      "driverLocalOnly": "Ce panneau crée uniquement des volumes local.",
      "netDefaultDriver": "Les nouveaux réseaux utilisent le pilote bridge par défaut de Docker.",
      "pruneWhat": "Éléments à retirer",
      "pruneAck": "Je comprends que les données inutilisées seront supprimées et ne pourront pas être restaurées",
      "pruneAckDesc": "Le nettoyage des volumes ou du système est irréversible. Les conteneurs arrêtés et les images inutilisées du périmètre choisi sont retirés.",
      "pruneNow": "Nettoyer maintenant",
      "useMirrors": "Utiliser des miroirs de registre",
      "useInsecure": "Autoriser les registres non chiffrés",
      "publishPorts": "Publier des ports sur l’hôte",
      "attachVolume": "Attacher un volume",
      "setEnv": "Définir des variables d’environnement",
      "defaultNet": "Par défaut",
      "mountPath": "Chemin de montage",
      "restartNo": "Jamais",
      "restartUnless": "Sauf arrêt",
      "restartAlways": "Toujours",
      "restartOnFail": "En cas d’échec",
      "needAck": "Confirmez avant de nettoyer",
      "scopeContainers": "Conteneurs arrêtés",
      "scopeImages": "Images inutilisées",
      "scopeVolumes": "Volumes inutilisés",
      "scopeBuilder": "Cache de construction",
      "scopeSystem": "Tout ce qui est inutilisé",
      "noVolumesYet": "Aucun volume — créez-en un dans l’onglet Volumes d’abord.",
      "command": "Commande",
      "commandHint": "Facultatif. Jetons après l'image. Laissez vide pour utiliser l’image CMD.",
      "entrypoint": "Point d'entrée",
      "entrypointHint": "Binaire unique en option. Laissez vide pour utiliser l’image ENTRYPOINT.",
      "portMap": "hôte: conteneur",
      "portOccupied": "Ce port hôte est déjà utilisé",
      "validatorImage": "Géré par les nœuds validateurs",
      "newVolume": "Nouveau volume nommé",
      "loopbackUrl": "URL de test locale",
      "nginxProxy": "Créer un proxy inverse Nginx",
      "intentPorts": "Demandé (non publié)",
      "customPort": "Autre port hôte",
      "customPortHost": "Port hôte",
      "customPortContainer": "Port conteneur",
      "pctUsed": "{{n}} % utilisé",
      "customPortHint": "1-65535. Exemple : 9090 → 80.",
      "pickBridge": "Réseau de ponts"
    },
    "deleteTitle": "Supprimer {{id}}",
    "deleteDesc": "Cela ne peut pas être annulé.",
    "deleteC1": "La ressource est supprimée de cet hôte.",
    "deleteComposeVal": "Il s'agit d'une pile de validateur — l'instance de validateur est également supprimée.",
    "pruneTitle": "Élaguer les ressources Docker",
    "pruneDesc": "Tapez PRUNE pour confirmer. Les données inutilisées ne peuvent pas être restaurées.",
    "pruneC1": "Les ressources inutilisées dans la portée sélectionnée sont supprimées.",
    "pruneC2": "L’élagage des volumes et du système supprime définitivement les volumes de données inutilisés.",
    "pruneC3": "Les conteneurs arrêtés ou les images inutilisées dans cette étendue sont supprimés."
  },
  "email": {
    "title": "E-mail",
    "subtitle": "Domaines, DNS, boîtes mail et relais",
    "externalTodos": "Tâches à traiter en dehors du serveur",
    "ptr": "Le DNS inverse (PTR) doit être configuré par votre fournisseur VPS/cloud",
    "port25": "Le port 25 sortant peut être bloqué ; demandez le déblocage ou utilisez un relais",
    "create": "Créer un domaine mail",
    "createHint": "Après création, vérifiez le DNS, les boîtes mail et les contrôles de santé",
    "domains": "Domaines enregistrés",
    "empty": "Aucun domaine e-mail pour l’instant",
    "emptyHint": "Créez un domaine pour obtenir les enregistrements DNS et les tâches externes",
    "searchPlaceholder": "Rechercher un domaine…",
    "domain": "Domaine",
    "serverIp": "IP du serveur",
    "notFound": "Domaine e-mail introuvable",
    "backToList": "Retour aux domaines e-mail",
    "softwareNeeded": "Les logiciels e-mail requis ne sont pas installés",
    "applyApplied": "Appliqué",
    "applyWritten": "Écrit",
    "applyFailed": "Échoué",
    "applyDraft": "Brouillon",
    "queueMsgCount": "File d’attente : {{count}} message(s)",
    "queueLoadFailed": "Échec du chargement de la file d’attente",
    "queueFlushRequested": "Vidage de la file d’attente demandé",
    "queueFlushFailed": "Échec du vidage",
    "queueDeleted": "{{id}} supprimé",
    "queueDeleteFailed": "Échec de la suppression",
    "pillDomains": "{{count}} domaine(s)",
    "pillNoDomain": "Aucun domaine",
    "statDomains": "Domaines",
    "statHealthy80": "Santé ≥80",
    "statApplied": "Appliqué",
    "statDraft": "Brouillon",
    "tabDomains": "Domaines",
    "tabWebmail": "Webmail",
    "tabQueue": "File d’attente",
    "tabStack": "Logiciels",
    "tabOps": "Rôles",
    "webmailGlobalDesc": "Une seule application webmail pour tout le panneau — chaque domaine mail se connecte via la même URL.",
    "webmailGlobalHint": "Nécessite l’autorisation de modification système (YSK_EXECUTE) et un accès réseau sortant pour télécharger Roundcube/SnappyMail. Aucun projet partiel n’est créé sans EXECUTE.",
    "webmailMovedHint": "Le webmail est configuré globalement (pas par domaine).",
    "openGlobalWebmailSettings": "Ouvrir les paramètres webmail",
    "domainsTitle": "Domaines ({{filtered}}/{{total}})",
    "domainsListDesc": "Domaines de messagerie enregistrés sur cet hôte",
    "emptyFilterHint": "Aucun domaine ne correspond à la recherche",
    "emptyCreateHint": "Utilisez Créer dans la barre d’outils pour enregistrer un domaine ;",
    "queueLocalTitle": "File d’attente mail",
    "needExecute": "Nécessite YSK_EXECUTE",
    "viewQueue": "Voir la file d’attente",
    "flushQueue": "Vider la file d’attente",
    "flushQueueEmpty": "La file d'attente est vide",
    "flushQueueNeedExecute": "Le vidage de la file d'attente nécessite YSK_EXECUTE (autorisation d'exécution de l'hôte)",
    "queueHint": "File Postfix locale. La lecture est une sonde ; le vidage exige YSK_EXECUTE.",
    "deleteThisId": "Supprimer cet ID",
    "queueEmpty": "Aucun courrier différé",
    "queueEmptyHint": "Aucun message différé",
    "mtaTitle": "Logiciel MTA",
    "mtaBody": "La sonde et l’installation en un clic sont pilotées par la bannière ci-dessus",
    "mtaSmtp": "SMTP sortant / entrant",
    "mtaImap": "Boîtes mail IMAP / POP3",
    "mtaDkim": "Signature DKIM sortante",
    "mtaMissingHint": "Lorsque le logiciel manque, la bannière propose l’installation / une nouvelle sonde",
    "pathTitle": "Parcours de configuration du domaine",
    "path1": "Enregistrer un domaine (en haut à droite)",
    "path2": "Ouvrir le détail du domaine → configuration mail en un clic",
    "path3": "Ajouter MX / SPF / DKIM / DMARC sur la page DNS ou la checklist externe",
    "path4": "SSL pour les noms d’hôte mail / webmail",
    "viewDomainList": "Voir la liste des domaines",
    "opsPanelTitle": "Panneau vs externe",
    "opsThisPage": "Cette page : registre des domaines, vue de la file, sonde logicielle",
    "opsDetail": "Détail du domaine : bootstrap, boîtes mail, alias, relais, webmail",
    "opsHost": "Fournisseur d'hébergement : PTR, politique sortante du port 25",
    "opsRegistrar": "Registrar : publier MX / SPF / DKIM / DMARC",
    "statusTitle": "Statut",
    "statusDraft": "brouillon : panneau uniquement",
    "deliverabilityChecks": "Chèques",
    "statusWritten": "écrit : fichiers de gestion écrits, pas forcément en production",
    "statusApplied": "appliqué : déjà appliqué avec succès (vérifier encore service is-active)",
    "statusReputation": "La réputation de boîte de réception ne peut jamais être automatisée à 100 %",
    "createModalDesc": "",
    "registerDomain": "Créer",
    "domainApexHint": "Sans préfixe mail.",
    "serverIpv4Hint": "MX/A/SPF",
    "serverIpv4Ph": "IPv4 public",
    "serverIpv6": "IPv6 (facultatif)",
    "serverIpv6Hint": "AAAA/SPF ip6",
    "serverIpv6Ph": "Facultatif",
    "registerNote": "",
    "flushConfirmTitle": "Vider entièrement la file d'attente mail ?",
    "flushConfirmDesc": "Les messages en file seront supprimés. Action irréversible.",
    "flushConfirm": "Vider",
    "tabMailbox": "Boîtes mail",
    "tabAliases": "Alias / transfert",
    "tabHealth": "Santé",
    "tabRelay": "Relais",
    "tabSieve": "Filtre / SSO",
    "tabAdvanced": "Avancé",
    "pillApplied": "Appliqué",
    "pillManaged": "Fichiers gérés",
    "pillDraft": "Brouillon",
    "statHealth": "Santé",
    "statApply": "Appliquer",
    "statDomain": "Domaine",
    "pausedFlag": "En pause (flag)",
    "normal": "Normale",
    "statMailboxes": "Boîtes mail",
    "statDnsRecords": "Enregistrements DNS",
    "dnsTodosTitle": "DNS",
    "copyAllRecords": "Copier tous les enregistrements",
    "openDnsPage": "Ouvrir la page DNS",
    "healthScore": "Score de santé",
    "healthUnchecked": "Pas encore vérifié",
    "healthUncheckedHint": "DNS / PTR / port 25 n’ont pas encore été sondés.",
    "healthPartialScore": "Partiel {{n}}/100 (DNS uniquement)",
    "healthPartialHint": "Liste de contrôle DNS uniquement – ​​en direct et liste noire non sondée.",
    "deliverabilityScore": "Pack de délivrabilité",
    "opendkimNoReload": "OpenDKIM n’a pas de reload — redémarrez après un changement de clés ou de tables.",
    "opendkimNoReloadTitle": "systemctl reload opendkim n’est pas pris en charge sur cette pile",
    "healthChecklist": "Liste {{score}}/100",
    "healthChecklistHint": "Score de liste — DNS / PTR / port 25 pas encore sondés",
    "healthLiveHint": "Score de sonde réelle",
    "suggestedRecords": "Enregistrements suggérés",
    "externalTodosCount": "Tâches externes",
    "colType": "Taper",
    "colName": "Nom",
    "colValue": "Valeur",
    "colNote": "Note",
    "copy": "Copier",
    "noDnsRecords": "Aucun enregistrement DNS",
    "externalTodosHeading": "Tâches externes (le panneau ne peut pas les faire)",
    "externalTodosBody": "PTR, port 25 et DNS du registrar sont de votre responsabilité.",
    "copyExternalTodos": "Copier la liste des tâches externes",
    "todoDone": "Fait",
    "todoPending": "Tâche",
    "refreshDnsHint": "Cliquez sur Actualiser pour charger les suggestions DNS",
    "mailboxListTitle": "Boîtes mail ({{count}})",
    "createMailbox": "+ Créer une boîte mail",
    "writeDovecot": "Écrire la base de mots de passe Dovecot",
    "noMailboxes": "Aucune boîte mail pour l'instant — cliquez sur Créer une boîte mail",
    "mailboxOpsResult": "Résultat de l'opération sur la boîte mail",
    "aliasesTitle": "Alias / transfert / catch-all",
    "aliasType": "Taper",
    "aliasTypeAria": "Type d'alias",
    "typeForward": "Transfert",
    "typeAlias": "Alias",
    "localPart": "Partie locale",
    "localPartHint": "ex. sales",
    "targetMailbox": "Boîte mail cible",
    "targetMailboxHint": "Séparés par des virgules pour plusieurs",
    "addAlias": "Ajouter un alias",
    "noAliases": "Aucun alias / transfert pour l’instant",
    "aliasResult": "Résultat de l’alias",
    "autoreplyTitle": "Réponse automatique / suspension",
    "autoreplyDesc": "Réponse automatique",
    "autoreplyBodyHint": "Application optionnelle au système",
    "enableAutoreply": "Activer la réponse automatique",
    "enableAutoreplyDesc": "vacation.sieve ; après application système, monte .dovecot.sieve",
    "applyToSystem": "Appliquer au système (Postfix / Dovecot)",
    "applyToSystemDesc": "Nécessite YSK_EXECUTE=1 + root ; les échecs ne sont pas simulés en succès",
    "subject": "Objet",
    "body": "Corps",
    "saveApplyAutoreply": "Enregistrer et appliquer la réponse automatique",
    "saveAutoreplyWritten": "Enregistrer la réponse automatique (écrit)",
    "suspendApply": "Suspendre et appliquer REJECT",
    "suspendWritten": "Suspendre le domaine (écrit)",
    "resumeApply": "Reprendre et mettre à jour la map",
    "resumeWritten": "Reprendre le domaine (écrit)",
    "flagsResult": "Indicateurs / résultat d’application système",
    "defaultAutoreplySubject": "Réponse automatique",
    "defaultAutoreplyBody": "Nous avons bien reçu votre e-mail et vous répondrons plus tard.",
    "healthLiveTitle": "Santé de la livraison (sondes DNS / ports en direct)",
    "healthLiveDesc": "Contrôles en direct",
    "serverIpLabel": "IP du serveur",
    "liveCheck": "Contrôle en direct",
    "liveOk": "Globalement OK",
    "liveBad": "Problèmes détectés",
    "notTested": "Non testé",
    "blacklist": "Liste noire",
    "healthExternalNote": "Le PTR et le port 25 doivent être configurés chez l’hébergeur.",
    "runLiveCheck": "Lancer le contrôle en direct",
    "dnsblThisIp": "DNSBL (cette IP)",
    "multiIpRbl": "RBL multi-IP",
    "warmupAdvice": "Conseils de chauffe",
    "probeMatrix": "Résultats des sondes",
    "colItem": "Élément",
    "colStatus": "Statut",
    "pass": "Réussi",
    "fail": "Échec",
    "unknown": "Inconnu",
    "colDetail": "Détail",
    "outboundPort25": "Port 25 sortant",
    "noProbeResults": "Aucun résultat de sonde pour l'instant",
    "noLiveYet": "Contrôle en direct pas encore exécuté",
    "noLiveYetHint": "Exécutez d’abord un contrôle en direct",
    "mailSslTitle": "Certificats et TLS",
    "mailSslHint": "Le vrai problème est sur la page SSL ; accédez ici aux noms d’hôte mail / webmail / domaine",
    "openSslPage": "Ouvrir la page SSL",
    "webmailSsoSkeleton": "Squelette SSO webmail",
    "writeRoundcubeSso": "Écrire le squelette SSO Roundcube",
    "ssoSkeletonSymlink": "Squelette SSO + lien symbolique système",
    "rateLimitTitle": "Débit sortant / antispam",
    "rateLimitDesc": "Écrit les paramètres Postfix anvil et Rspamd (appliqués uniquement avec YSK_EXECUTE + root)",
    "hourlyMsgCap": "Plafond de messages horaire",
    "hourlyMsgCapHint": "Global utilise le minimum sur tous les domaines",
    "enableAntispam": "Activer le marquage antispam (multimap Rspamd)",
    "enableAntispamDesc": "Off désactive l'antispam du domaine",
    "writeControlOnly": "Écrire le panneau uniquement",
    "applyToSystemBtn": "Appliquer au système",
    "dnsblResult": "Résultat DNSBL",
    "warmupResult": "Résultat de warm-up",
    "policyResult": "Résultat de politique",
    "relayTitle": "Relais SMTP sortant",
    "relayHost": "Hôte de relais",
    "applyRelaySystem": "Appliquer au Postfix système",
    "applyRelaySystemDesc": "Écrire le relais Postfix système",
    "saveApplyRelay": "Enregistrer et appliquer au système",
    "saveOnly": "Enregistrer les paramètres uniquement",
    "relayResult": "Résultat du relais",
    "webmailSsoTitle": "Authentification unique webmail",
    "webmailSsoDesc": "Émettre un jeton à usage unique ;",
    "mailboxPasswordOptional": "Mot de passe de boîte aux lettres (facultatif)",
    "mailboxPasswordHint": "Facultatif",
    "mailboxPasswordPh": "Avec mot de passe, le jeton peut se connecter automatiquement à Roundcube",
    "ssoTokenHint": "Émettre un jeton de connexion à courte durée",
    "issueSsoToken": "Émettre un jeton SSO",
    "sieveTitle": "Filtres Sieve",
    "sieveDesc": "Filtres",
    "sieveTemplateHint": "Modèle de filtre par défaut",
    "writeDefaultSieve": "Écrire le Sieve par défaut",
    "listWrittenFiles": "Lister les fichiers écrits",
    "result": "Résultat",
    "domainSslTitle": "SSL pour ce domaine",
    "domainSslDesc": "SSL de l'hôte de messagerie",
    "requestCert": "Demander un certificat pour {{domain}}",
    "clientAutoTitle": "Autoconfiguration client",
    "clientAutoDesc": "Autoconfiguration client",
    "clientAutoHint": "Générer autodiscover/autoconfig",
    "generateCopyXml": "Générer et copier le XML de configuration",
    "queueTitle": "File d’attente mail",
    "queueDesc": "File d'attente locale",
    "publicAutoconfig": "Configuration publique",
    "bootstrapTitle": "Configuration messagerie en un clic",
    "bootstrapDesc": "Configuration en un clic",
    "adminPassword": "Mot de passe administrateur",
    "adminPasswordHint": "Mot de passe de la boîte admin",
    "adminPasswordPh": "Au moins 8 caractères",
    "adminPasswordRequired": "Définir un mot de passe admin d'au moins 8 caractères",
    "bootstrapBtn": "Configuration messagerie en un clic",
    "webmailInstallDesc": "Télécharger / appliquer Roundcube",
    "webmailHostname": "Nom d'hôte webmail",
    "webmailHostnameHint": "server_name du vhost, p. ex. webmail.example.com",
    "installWebmail": "Installer / appliquer le webmail",
    "bootstrapResult": "Résultat bootstrap / webmail",
    "createMailboxTitle": "Créer une boîte aux lettres",
    "createMailboxDesc": "L'adresse complète sera {{local}}@{{domain}}",
    "createMailboxBtn": "Créer une boîte aux lettres",
    "localPartLabel": "Partie locale",
    "localPartFullHint": "L'adresse complète sera {{local}}@{{domain}}",
    "passwordOptionalHint8": "Facultatif ; hachage écrit seulement si au moins 8 caractères",
    "live": {
      "noMx": "pas de MX",
      "mxLookupFailed": "Échec de la recherche MX",
      "noSpf": "pas de SPF TXT",
      "spfLookupFailed": "Échec de la recherche SPF",
      "noDkim": "aucun TXT DKIM",
      "dkimLookupFailed": "Échec de la recherche DKIM",
      "noDmarc": "aucun DMARC",
      "dmarcLookupFailed": "Échec de la recherche DMARC",
      "noPtr": "aucun PTR",
      "ptrLookupFailed": "Échec de la recherche PTR",
      "port25Open": "TCP 25 sortant semble ouvert (sonde vers gmail-smtp-in.l.google.com)",
      "port25Blocked": "Échec de la sonde TCP 25 sortante — peut être bloqué ; demander le déblocage ou utiliser un relais",
      "dnsblListed": "LISTÉ : {{list}}",
      "dnsblClean": "propre sur {{list}}"
    },
    "deliv": {
      "mx": "Enregistrement MX",
      "mxFix": "Ajouter un MX chez le fournisseur DNS pointant vers l’hôte mail",
      "spf": "TXT SPF",
      "spfFix": "Publier v=spf1 incluant cette IP",
      "dkim": "DKIM TXT",
      "dkimFix": "Publier le TXT selector._domainkey depuis le panneau",
      "dmarc": "DMARC TXT",
      "dmarcFix": "Publier la politique _dmarc (commencer par p=none)",
      "ptr": "DNS inverse (PTR)",
      "ptrFix": "Définir le PTR dans la console VPS/cloud pour qu’il corresponde au nom d’hôte mail — le panneau ne peut pas le définir",
      "port25": "Port 25 sortant",
      "port25Fix": "Demander le déblocage du port 25 à l’hébergeur, ou configurer un relais SMTP (soumission 587)",
      "dnsbl": "Réputation DNSBL",
      "dnsblFix": "Se faire retirer des listes concernées ; arrêter l’envoi jusqu’à être propre",
      "relay": "Relais SMTP (lorsque le port 25 est bloqué)",
      "relayOptional": "Sonde du port 25 ouverte — relais optionnel",
      "relayPresent": "Configuration de relais présente sous dataDir (l’application peut encore exiger EXECUTE)",
      "relayMissing": "Aucun relais configuré — requis si le port 25 reste bloqué",
      "relayFix": "Panneau E-mail → Relais, ou ysk-server hosting email-bootstrap avec relais",
      "warmup": "Plan de chauffe",
      "warmupDetail": "{{phases}} phases · jour1 max {{day1}} msgs",
      "warmupFix": "Respecter les limites de phase ; ne pas envoyer en masse à des listes froides depuis une nouvelle IP",
      "honesty1": "Le panneau ne garantit jamais la livraison mondiale en boîte de réception (le filtrage Gmail/Outlook est externe).",
      "honesty2": "Le PTR et le port 25 appartiennent au fournisseur VPS/réseau — pas au plan de contrôle YSK.",
      "honesty3": "Les DNS MX/SPF/DKIM/DMARC doivent être publiés chez le fournisseur DNS faisant autorité.",
      "honestyPortBlocked": "Le port 25 semble bloqué — utiliser un relais ou demander le déblocage avant un volume élevé.",
      "honestyPortOk": "Sonde du port 25 réussie — surveiller tout de même les rebonds et le DNSBL."
    },
    "catchall": "Fourre-tout",
    "webmailRoundcube": "Webmail",
    "warmup": {
      "p1g1": "Envoyer uniquement aux destinataires transactionnels / connus fiables",
      "p1g2": "Surveiller les rebonds ; maintenir le taux de plaintes près de zéro",
      "p1g3": "S’assurer que SPF/DKIM/DMARC/PTR sont actifs avant le volume",
      "p2g1": "Élargir lentement aux contacts engagés uniquement",
      "p2g2": "Vérifier le DNSBL quotidiennement ; suspendre si listé",
      "p2g3": "Préférer la soumission 587 au bulk sur le port 25 si restreint",
      "p3g1": "Doubler le volume seulement si les métriques restent propres",
      "p3g2": "Segmenter les listes ; retirer immédiatement les rebonds durs",
      "p4g1": "Approcher le volume normal s’il n’y a pas de blocages",
      "p4g2": "Garder le rua DMARC sous surveillance",
      "c1": "Le PTR correspond au HELO/EHLO (nom d’hôte mail)",
      "c2": "SPF + DKIM + DMARC publiés et alignés",
      "c3": "DNSBL propre sur Spamhaus / SpamCop / Barracuda",
      "c4": "Port sortant 25 ouvert ou relais configuré",
      "c5": "Pas de plages d’IP « bulk email » achetées",
      "c6": "Âge / historique du domaine pris en compte (nouveaux domaines = montée plus lente)",
      "noteNewIp": "Traiter cette IP comme nouvelle — commencer aux limites de la phase jours 1–3",
      "noteOldIp": "Une IP existante bénéficie encore d’une montée progressive après des changements de config",
      "noteProcess": "Le warm-up est un processus opérateur ; YSK suit les conseils + DNSBL, pas le volume marketing ESP"
    },
    "health": {
      "dnsUnconfirmed": "Enregistrements DNS (MX/SPF/DKIM) pas encore confirmés",
      "dmarcMissing": "DMARC manquant — fortement recommandé",
      "dmarcUnpublished": "DMARC est généré dans le panel mais n'est pas encore publié dans le DNS public",
      "ptrBad": "PTR (DNS inverse) manquant ou incorrect — demander au fournisseur VPS",
      "port25Blocked": "Le port sortant 25 semble bloqué — demander le déblocage ou utiliser un relais SMTP",
      "port25Unknown": "État du port 25 inconnu — lancer le test de connectivité"
    },
    "stack": {
      "tlsNote": "Certificats TLS via Let’s Encrypt pour SMTP/IMAP",
      "externalNote": "DNS/PTR/Port25 externes toujours requis pour la délivrabilité"
    },
    "test": {
      "defaultSubject": "Test mail YSK Server",
      "needMta": "Nécessite un MTA local (Postfix) installé et le port 25/relais configuré",
      "checkSpam": "Vérifier le dossier spam du destinataire et les journaux mail du serveur après l’envoi",
      "hintDeferred": "Si différé : vérifier le blocage du port 25 ou les identifiants du relais",
      "hintSpam": "Si accepté mais en spam : améliorer SPF/DKIM/DMARC/PTR et le warm-up",
      "hintLogs": "Inspecter /var/log/mail.log ou journalctl -u postfix"
    },
    "leMailHost": "Demander le certificat · {{host}}",
    "leWebmailHost": "Demander le certificat · {{host}} (webmail)",
    "leApexHost": "Demander le certificat · {{host}} (apex)",
    "applyMailTls": "Appliquer les chemins TLS mail",
    "applyMailTlsHint": "Le certificat doit exister ; écrit les chemins du service mail et recharge.",
    "probeMx": "MX",
    "probeSpf": "SPF",
    "probeDkim": "DKIM",
    "probeDmarc": "DMARC",
    "probePtr": "PTR",
    "probeDnsbl": "DNSBL",
    "dnsAuthRepairTitle": "L’auth DNS nécessite une correction",
    "dnsAuthRepairHint": "Copier les enregistrements depuis l’onglet DNS et les publier.",
    "fixHintSpf": "SPF échoué : publier un TXT v=spf1 sur @.",
    "fixHintDkim": "DKIM échoué : publier le TXT selector._domainkey.",
    "fixHintDmarc": "DMARC échoué : publier le TXT _dmarc.",
    "fixHintMx": "MX échoué : pointer le MX vers mail.<domain>.",
    "mailTls": {
      "needRootExecute": "Appliquer le TLS mail nécessite root et YSK_EXECUTE.",
      "certMissing": "Aucun fichier de certificat pour {{host}} ({{path}}).",
      "getCertFirst": "Émettre d’abord un certificat Let’s Encrypt pour {{host}} sur la page SSL.",
      "certFound": "Certificat trouvé pour {{host}}.",
      "postconfFailed": "postconf a échoué : {{detail}}",
      "postfixPathsSet": "Chemins de certificat TLS Postfix définis.",
      "postfixReloaded": "Postfix rechargé.",
      "postfixReloadFailed": "Échec du rechargement Postfix : {{detail}}",
      "dovecotApplied": "Snippet TLS Dovecot écrit et rechargement tenté.",
      "dovecotSkipped": "Dovecot ignoré (non installé ou doveconf indisponible).",
      "dovecotSslOmitted": "Le certificat de courrier est manquant ; a écrit ssl=no pour que Dovecot puisse démarrer sans les fichiers LE."
    },
    "policyApplySystemHint": "Cocher « appliquer au système » pour écrire les maps Postfix/Rspamd et recharger ;",
    "rateLimitAppliedNote": "Limite horaire sortante et drapeau antispam appliqués (quand l’application système est activée).",
    "bootstrapHonesty": "En un clic : écrit les fichiers du panneau ; appliquer au système nécessite des droits. DNS/PTR/port 25 sont manuels.",
    "bootstrapAfterSteps": "Suite : ① publier le DNS (MX/SPF/DKIM/DMARC) ② émettre le SSL mail ③ Appliquer les chemins TLS mail.",
    "bootstrapThenSsl": "Suite : émettre le SSL mail",
    "bootstrap": {
      "mtaOk": "Configs MTA écrites ({{count}} fichiers)",
      "mtaIncomplete": "MTA incomplet : {{detail}}",
      "seeNotes": "voir les notes",
      "mailboxOk": "Boîte mail {{address}} (statut {{status}})",
      "mailboxExists": "La boîte mail existe déjà (ignorée) : {{detail}}",
      "passdbOk": "Passdb Dovecot écrite ({{count}} boîtes mail)",
      "webmailOk": "Plan webmail {{mode}} pour {{host}}",
      "mailTlsTodo": "TLS mail : émettez un certificat pour {{mailHost}}, puis utilisez Appliquer les chemins TLS mail dans l'onglet santé.",
      "externalDns": "Externe (à la charge de l'opérateur) : configurez MX/SPF/DKIM/DMARC au DNS ; PTR chez le VPS ; port 25 ou relais SMTP.",
      "healthScore": "Score de santé {{score}}/{{max}} (DNS/PTR/port 25 non auto-complétés)",
      "webmailProjectOk": "Projet webmail {{tool}} @ {{host}} ({{status}})",
      "dovecotApplyOk": "Authentification virtuelle Dovecot appliquée"
    },
    "tabDeliverability": "Livraison",
    "pendingCount": "En attente",
    "externalTodosOneLiner": "Le PTR, le port 25 et le DNS du registrar doivent être faits par vous.",
    "runDeliverabilityPack": "Lancer le contrôle de livraison",
    "deliverabilityTitle": "Contrôle de livraison",
    "deliverabilityEmpty": "Pas encore vérifié",
    "deliverabilityEmptyDesc": "Lancer le contrôle de livraison pour DNS, PTR et port 25.",
    "panelReady": "Vérifiable par le panneau",
    "gaps": "Écarts",
    "checkOk": "OK",
    "checkExternal": "Externe",
    "checkFail": "Échec",
    "mailboxListDesc": "Écrire la base de mots de passe après création",
    "aliasesDesc": "Alias et redirections",
    "relayDesc": "Relais SMTP",
    "deliverabilityDesc": "Contrôles PTR / DNS / port 25",
    "dnsTodosDesc": "Copiez puis ajoutez chez votre hébergeur DNS",
    "deliverabilityHonesty": "Impossible de définir le PTR ou de débloquer le port 25 pour vous",
    "warmupSuggest": "Suggestions de préchauffage",
    "writeSsoSkeleton": "Écrire le squelette SSO Roundcube",
    "rateLimitPerHour": "Plafond de messages par heure",
    "rateLimitGlobalHint": "Le global prend le minimum de chaque domaine",
    "savePolicyWritten": "Écrit uniquement dans le plan de contrôle",
    "dnsblMultiIp": "RBL multi-IP",
    "webmailTool": "Logiciel webmail",
    "webmailToolRoundcube": "Roundcube (par défaut)",
    "webmailToolSnappy": "SnappyMail (léger)",
    "webmailProjectName": "Nom du projet",
    "installWebmailProject": "Créer et mettre en service",
    "openWebmail": "Ouvrir le webmail",
    "webmailRisk": "Le webmail public est risqué — activez HTTPS rapidement.",
    "webmailForceHttps": "Forcer HTTPS (Roundcube ; SSL requis)",
    "reinstallWebmail": "Réinstaller / mettre à niveau",
    "installWebmailTitle": "Créer le projet de webmail partagé (première installation)",
    "reinstallWebmailTitle": "Reconstruire/mettre à niveau le projet webmail existant",
    "reinstallNeedInstall": "Installez d'abord la messagerie Web",
    "webmailSsoAdvanced": "Avancé · plugin SSO",
    "tlsRoleMail": "courrier (IMAP/SMTP)",
    "tlsRoleMailHint": "Nom d'hôte du serveur de messagerie",
    "tlsRoleWebmail": "messagerie Web",
    "tlsRoleWebmailHint": "Hôte virtuel webmail",
    "tlsRoleApex": "Domaine apex",
    "tlsRoleApexHint": "Certificat web / apex",
    "tlsRequestLe": "Demander LE",
    "tlsRequestLeFor": "Demander LE pour {{host}}",
    "advancedToolsTitle": "File d'attente et clients",
    "flushQueueConfirm": "Vider la file d'attente MTA locale ? Cette action est irréversible.",
    "mailSslTitleShort": "Certificats et TLS",
    "deleteDomain": "Supprimer le domaine",
    "deleteDomainConfirmTitle": "Supprimer le domaine e-mail ?",
    "deleteDomainConfirm": "Supprime {{domain}} ainsi que ses boîtes mail, alias et données du plan de contrôle. La configuration système Postfix/Dovecot peut encore nécessiter un nettoyage.",
    "deleteDomainBtn": "Supprimer",
    "deleteMailbox": "Supprimer la boîte mail",
    "deleteMailboxTitle": "Supprimer la boîte mail ?",
    "deleteMailboxDesc": "Supprime {{address}}, les données du plan de contrôle et le Maildir local s’il est présent.",
    "deleteMailboxC1": "Connexion à la boîte mail et fichiers de messagerie",
    "deleteMailboxC2": "Réécrire la carte virtuelle du domaine (plan de contrôle)",
    "deleteMailboxC3": "Le système Dovecot/Postfix peut encore nécessiter un nettoyage",
    "deleteAliasTitle": "Supprimer l’alias/le transfert ?",
    "deleteAliasDesc": "Supprime {{source}}.",
    "deleteImpact": "{{mailboxes}} boîtes aux lettres · {{records}} enregistrements DNS · {{aliases}} alias",
    "deleteDomainC1": "Toutes les boîtes mail et alias",
    "deleteDomainC2": "DKIM du plan de contrôle, suggestions DNS et indicateurs",
    "deleteDomainC3": "Répertoire local dataDir/email s’il est présent",
    "deleteDomainC4": "Les cartes MTA système peuvent rester ; nettoyez-les séparément si nécessaire",
    "deleteDialogTitle": "Supprimer définitivement le domaine de messagerie",
    "deleteDialogDesc": "Vous allez supprimer {{domain}}. Cette action est irréversible.",
    "deletePermanent": "Supprimer définitivement",
    "deleteRemoveData": "Supprimer aussi les données de messagerie locales",
    "deleteRemoveDataDesc": "Décochez pour retirer uniquement du panneau ; le Maildir reste sur le disque",
    "deleteTypeName": "Saisissez le domaine pour confirmer",
    "deleteTypeNameHint": "Doit correspondre exactement : {{name}}",
    "deleteWillData": "Répertoire local dataDir/email s’il est présent",
    "deleteKeepData": "Conserver les données de messagerie locales dataDir",
    "deleteSystemWarn": "Les cartes système Postfix/Dovecot ne sont pas nettoyées automatiquement ; nettoyez-les séparément si nécessaire.",
    "hostIpPick": "IPv4 de l’hôte",
    "hostIpPickV6": "IPv6 de l’hôte",
    "editMailboxTitle": "Modifier la boîte aux lettres",
    "editMailboxDesc": "Modifier le mot de passe ou les paramètres de connexion pour {{address}}",
    "editMailboxSave": "Enregistrer les modifications",
    "newPassword": "Nouveau mot de passe",
    "newPasswordHint": "Laissez vide pour conserver le mot de passe actuel (min. 8 caractères si défini)",
    "confirmPassword": "Confirmez le mot de passe",
    "mailboxStatus": "Statut",
    "mailboxStatusActive": "Actif (connexion autorisée)",
    "mailboxStatusDisabled": "Désactivé (connexion bloquée)",
    "mailboxStatusHint": "Exportations désactivées * vers la base de données Dovecot, la connexion est donc refusée",
    "colAddress": "Adresse",
    "colLocalPart": "Partie locale",
    "colPassword": "Mot de passe",
    "colCreated": "Créé",
    "hasPassword": "Ensemble",
    "noPassword": "Non défini",
    "mailboxPager": "Pages de boîte aux lettres",
    "prevPage": "Précédent",
    "nextPage": "Suivant",
    "pageOf": "Page {{page}} / {{total}} · {{count}}",
    "mailboxEmptyTitle": "Pas encore de boîtes aux lettres",
    "passwordMismatch": "Les mots de passe ne correspondent pas",
    "passwordTooShort": "Le mot de passe doit comporter au moins 8 caractères",
    "mailboxUpdateNeedField": "Définir un nouveau mot de passe ou modifier le statut",
    "catchallHint": "Les parties locales inconnues vont à la boîte cible. Brouillon jusqu’à l’application.",
    "queueSearchPh": "Rechercher ID, expéditeur ou destinataire…",
    "queueId": "ID de file",
    "queueSender": "Expéditeur",
    "queueRecipients": "Destinataires",
    "queueSize": "Taille",
    "queueReason": "Raison",
    "queueActive": "Actif",
    "queueHeld": "Retenu",
    "queueDeferred": "Différé",
    "deleteQueueTitle": "Supprimer ce message en file ?",
    "deleteQueueDesc": "Retirer {{id}} de la file MTA locale. YSK_EXECUTE requis.",
    "openQueuePage": "Ouvrir la file mail",
    "dovecotFailedHint": "Dovecot failed. Open the Software tab for status; if the mail certificate is missing, issue it on the SSL page first.",
    "dovecotFailedStatus": "Le pigeonnier est {{status}}. Ouvrez l'onglet Logiciel pour le résumé de l'unité.",
    "mailCertMissing": "Pas de certificat pour {{hosts}}. Émettez-le sur la page SSL.",
    "mailCertPresent": "Un certificat de courrier est déjà émis : il ne s'agit pas d'un problème de certificat manquant.",
    "webmailNeedCert": "Aucun certificat pour {{host}} — émettez-le sur SSL avant de forcer HTTPS.",
    "domainRequired": "Entrez un domaine",
    "domainInvalid": "Entrez un domaine valide",
    "serverIpRequired": "Entrez une adresse IP de serveur",
    "serverIpInvalid": "Entrez une adresse IP valide",
    "serverIpv6Invalid": "Entrez une adresse IPv6 valide",
    "localPartRequired": "Entrez une pièce locale",
    "localPartInvalid": "La partie locale ne peut utiliser que des lettres, des chiffres, . _ + -",
    "aliasDestRequired": "Saisissez au moins une adresse de destination",
    "mailboxStatusManaged": "Géré",
    "mailboxStatusActiveShort": "Actif",
    "mailboxStatusDisabledShort": "Désactivé",
    "mailboxStatusSystem": "Système provisionné",
    "mailboxStatusPending": "Système en attente",
    "mailboxStatusFailed": "Le système a échoué",
    "dnsblCleanStatus": "Non répertorié",
    "dnsblListedStatus": "Inscrit",
    "deliverabilityDone": "Contrôle de livraison terminé ({{score}}/100)",
    "sieveEmpty": "Aucun fichier Sieve écrit",
    "sieveListed": "{{count}} fichier(s) écrit(s)",
    "webmailHostnameRequired": "Entrez un nom d'hôte de messagerie Web",
    "sieveFilesTitle": "Dossiers écrits"
  },
  "errors": {
    "YSK_UNAUTHORIZED": "Non autorisé",
    "YSK_FORBIDDEN": "Interdit",
    "YSK_NOT_FOUND": "Introuvable",
    "YSK_VALIDATION": "Entrée non valide",
    "YSK_ALLOWLIST_DENIED": "Absent de la liste d’autorisation",
    "YSK_APPROVAL_REQUIRED": "Approbation requise",
    "YSK_APPROVAL_PENDING": "Approbation en attente",
    "YSK_APPROVAL_REJECTED": "Approbation rejetée",
    "YSK_SANDBOX_VIOLATION": "Violation du bac à sable",
    "YSK_LLM_UNTRUSTED": "Sortie LLM non fiable",
    "YSK_CONFIG_INVALID": "Configuration non valide",
    "YSK_SETUP_INCOMPLETE": "Configuration incomplète",
    "YSK_UPDATE_FAILED": "Échec de la mise à jour",
    "YSK_INTERNAL": "Erreur interne",
    "YSK_NEED_EXECUTE": "Permission d’exécution sur l’hôte requise",
    "YSK_NEED_ROOT": "Root requis",
    "YSK_RATE_LIMITED": "Trop de tentatives ; réessayez plus tard",
    "YSK_TOTP_REQUIRED": "Code d’authentification requis",
    "auth": {
      "needCredentials": "Saisissez le nom d’utilisateur et le mot de passe",
      "rateLimited": "Trop de tentatives de connexion ; réessayez plus tard",
      "badCredentials": "Nom d’utilisateur ou mot de passe incorrect",
      "accountSuspended": "Compte suspendu",
      "adminTotpStrict": "Les administrateurs doivent activer la 2FA (strict). Utilisez un compte inscrit ou désactivez le mode strict.",
      "totpReplay": "Code déjà utilisé ; attendez la période suivante",
      "totpRequired": "Un code d’authentification valide est requis",
      "mustEnrollTotp": "Politique d’administration : activez dès maintenant l’authentification à deux facteurs",
      "userNotFound": "Utilisateur introuvable",
      "totpSetupNeedReauth": "L'activation de la 2FA nécessite votre mot de passe (ou un code de confirmation récent)",
      "totpBeginFirst": "Commencez d'abord la configuration de la 2FA",
      "totpInvalid": "Code d'authentification invalide",
      "stepUpRequired": "Cette action nécessite un code d'authentification récent",
      "missingCredential": "Identifiants manquants",
      "apiKeyUserMissing": "Propriétaire de la clé API introuvable",
      "apiKeyInvalid": "Clé API invalide",
      "sessionExpired": "Session expirée ; reconnectez-vous",
      "sessionIdle": "Délai d'inactivité dépassé ; reconnectez-vous",
      "totpNotEnabled": "La 2FA n'est pas activée",
      "totpSecretNoDataDir": "Le secret TOTP est chiffré mais dataDir n'est pas défini",
      "mustChangePassword": "Vous devez définir un nouveau mot de passe avant de continuer",
      "policyNeedsOwn2fa": "Activez 2FA pour ce compte et confirmez avec un code TOTP avant d'exiger 2FA pour les autres"
    },
    "http": {
      "notFoundRoute": "Introuvable : {{method}} {{path}}",
      "unauthorized": "Non connecté ou session expirée",
      "forbidden": "Vous n'avez pas l'autorisation pour cette action",
      "notFound": "Ressource introuvable",
      "unprocessable": "Requête rejetée par le serveur",
      "requestFailed": "Échec de la requête ({{status}})",
      "jsonInvalid": "JSON invalide",
      "internal": "Erreur interne",
      "payloadTooLarge": "Le corps de la requête est trop volumineux"
    },
    "YSK_HOST_BROWSE_SSRF": "Navigation d'hôte bloquée par la politique de sécurité",
    "YSK_HOST_BROWSE_SESSION": "Session de navigation de l'hôte introuvable ou expirée",
    "YSK_HOST_BROWSE_UPSTREAM": "Échec de la récupération en amont de la navigation de l'hôte",
    "YSK_HOST_BROWSE_NEED_CHROME": "Le vrai moteur de navigateur nécessite Chrome/Chromium sur l'hôte"
  },
  "fail2ban": {
    "backToProtection": "Protection",
    "statCurrentBan": "Bannissements actuels",
    "statTotal": "Total bannis",
    "statBanList": "Liste des bannissements",
    "statBoot": "Au démarrage",
    "startedOk": "fail2ban démarré",
    "startService": "Démarrer le service",
    "notInstalled": "fail2ban n'est pas installé",
    "toolHintPrefix": "Outils sous-jacents :",
    "toolHintBody": "fail2ban = après analyse des journaux,",
    "toolHintTemp": "temporaire",
    "toolHintBody2": "bannissements · pour la réponse aux attaques, utilisez",
    "toolHintUfw": "UFW = ports / règles permanentes",
    "tabs": {
      "bans": "Liste des bannissements",
      "whitelist": "Liste blanche",
      "jails": "Prisons",
      "policy": "Politique",
      "service": "Service",
      "about": "À propos"
    },
    "manualBanTitle": "Bannissement manuel (temporaire)",
    "ipPlaceholder": "IPv4 ou IPv6",
    "banipOk": "banip effectué",
    "manualBanHint": "Blocage temporaire ;",
    "currentBans": "Actuellement bannis",
    "bannedTableTitle": "IP bannies (fail2ban-client en direct)",
    "bannedTableDesc": "Nécessite l'accès client ; le débannissement nécessite YSK_EXECUTE",
    "unbanOk": "Débanni",
    "unban": "Débannir",
    "addWhitelistTitle": "Ajouter à la liste blanche ignoreip",
    "whitelistAdded": "Ajouté à la liste blanche",
    "addWhitelistShort": "+Liste blanche",
    "emptyBansTitle": "Aucune IP bannie",
    "emptyBansDesc": "Ou pas d'autorisation pour lire fail2ban-client",
    "ignoreipTitle": "liste blanche ignoreip",
    "ignoreipDesc": "IP jamais bannies (fichier du panneau + fail2ban-client live optionnel)",
    "whitelistEmptyWarn": "La liste blanche est vide ; les jails peuvent vous interdire. Ajoutez votre IP de connexion avant d’appliquer ignoreip.",
    "suggestIgnoreLogin": "Votre IP de connexion {{ip}}",
    "applyIgnoreEmptyWarn": "Appliquer avec une liste blanche vide vide ignoreip",
    "applyIgnoreNeedConfirm": "Réécrit ignoreip du jail et recharge fail2ban",
    "addIp": "Ajouter une IP",
    "addWhitelist": "Ajouter à la liste blanche",
    "applyPolicyIgnoreip": "Appliquer la politique (ignoreip inclus)",
    "applyIgnoreipOk": "ignoreip écrit dans jail.local et appliqué",
    "ignoreipHint": "Sans YSK_EXECUTE, seul le fichier du panneau est écrit (apply_status=written) ;",
    "whitelistTitle": "Liste blanche ({{count}})",
    "whitelistRemoved": "Retiré de la liste blanche",
    "remove": "Supprimer",
    "emptyWhitelistTitle": "Aucune IP en liste blanche pour l'instant",
    "emptyWhitelistDesc": "Ajoutez des IP d'admin pour ne pas être banni",
    "activeJails": "Jails actives",
    "colCurrent": "Actuel",
    "colTotal": "Total",
    "colDesc": "Description",
    "emptyJailsTitle": "Aucune jail",
    "emptyJailsDesc": "Service non démarré ou jail.local non appliqué",
    "policyTitle": "Politique des jails",
    "policyDesc": "Écrit le jail.local du panneau ; appliquer copie + recharge (pas via UFW)",
    "bantimeHint": "Durée de bannissement",
    "findtimeHint": "Fenêtre de comptage",
    "maxretryHint": "Échecs max dans la fenêtre",
    "customExample2h": "Personnalisé, ex. 2h",
    "customExample15m": "Personnalisé, ex. 15m",
    "customMaxretry": "Personnalisé 1–50",
    "min": "{{n}} minutes",
    "hour": "{{n}} heures",
    "week": "{{n}} sem",
    "enableJailsHint": "Activer les jails (cocher puis appliquer) :",
    "writtenOnlyMsg": "Fichier du panneau écrit (non appliqué sur l'hôte)",
    "writeOnly": "Écrire uniquement le fichier du panneau",
    "appliedOk": "fail2ban appliqué",
    "applyToSystem": "Appliquer au système",
    "systemdTitle": "Contrôle systemd",
    "enableAndStart": "Activer et démarrer",
    "serviceHint": "Pour la réponse aux attaques, utilisez",
    "serviceHintSuffix": "(appelle les jails de cette page + les limites de débit Nginx ;",
    "actionOk": {
      "enable": "fail2ban activé et démarré",
      "start": "fail2ban démarré",
      "reload": "fail2ban rechargé",
      "restart": "fail2ban redémarré",
      "stop": "fail2ban arrêté"
    },
    "statWhitelist": "Liste blanche",
    "invalidIp": "Entrez un IPv4, IPv6 ou CIDR valide.",
    "whitelistPendingApply": "Enregistré dans la liste des panneaux. Appuyez sur Appliquer la politique pour écrire jail.local.",
    "ignoreipFile": "dataDir/fail2ban/ignoreip.txt",
    "jailsTabHint": "Statut des prisons actives. Activez ou désactivez les prisons dans l'onglet Politique.",
    "colJail": "Prison",
    "colEnabled": "Sur",
    "serviceStateLine": "Unité {{unit}} · {{state}} · démarrage {{boot}}",
    "jail": {
      "sshd": "SSH force brute",
      "nginxHttpAuth": "Authentification HTTP Nginx",
      "nginxBotsearch": "Scanner Nginx / sondes de bots",
      "nginxBadbots": "Nginx a connu de mauvais robots",
      "nginxLimitReq": "Prison à limite de débit Nginx",
      "postfix": "Postfix mail force brute",
      "dovecot": "Connexion à la messagerie Dovecot",
      "recidive": "Récidivistes"
    },
    "cannotBanSelf": "Il s'agit de l'hôte ou de votre adresse IP de connexion : ajoutez-le à ignoreip au lieu de le bannir.",
    "suggestIgnoreHint": "Adresses IP d'administrateur suggérées (fichier de panneau uniquement jusqu'à ce que vous appliquiez la stratégie) :",
    "suggestIgnoreAdd": "Ajouter {{ip}}"
  },
  "featurePage": {
    "back": "Retour"
  },
  "files": {
    "pillFiles": "{{count}} fichiers",
    "pillTrash": "{{count}} dans la poubelle",
    "pillSpace": "{{used}} utilisé",
    "statFiles": "Fichiers",
    "statFolders": "Dossiers",
    "statUsage": "Utilisation",
    "statSelected": "Sélectionné",
    "statTrash": "Corbeille",
    "statShares": "Partages",
    "publicSiteSettings": "Paramètres du site public",
    "opsResultTitle": "Résultat de l'opération sur fichier",
    "closeResult": "Fermer le résultat",
    "tabBrowse": "Parcourir",
    "tabTrash": "Corbeille",
    "tabShares": "Partages",
    "spaceLabel": "Espace",
    "publicFiles": "Fichiers publics",
    "viewLabel": "Voir",
    "allFiles": "Tous les fichiers",
    "favorites": "Favoris",
    "upload": "Téléverser",
    "newFolder": "Nouveau dossier",
    "newTextFile": "Nouveau fichier texte",
    "download": "Télécharger",
    "copy": "Copier",
    "move": "Déplacer",
    "zip": "Fermeture éclair",
    "unzip": "Décompresser",
    "unzipDone": "Décompressé {{path}}",
    "unzipFailed": "Échec de la décompression",
    "delete": "Supprimer",
    "searchName": "Rechercher…",
    "sortAria": "Trier",
    "sortNameAsc": "Nom↑",
    "sortNameDesc": "Nom↓",
    "sortSizeAsc": "Petit↑",
    "sortSizeDesc": "Grand↓",
    "sortMtimeDesc": "Plus récent",
    "sortMtimeAsc": "Plus ancien",
    "viewList": "Liste",
    "viewIcons": "Icônes",
    "viewAria": "Mode d’affichage",
    "toolbarAria": "Actions sur les fichiers",
    "pathAria": "Chemin",
    "rootPublic": "Publique",
    "rootProject": "Projet",
    "emptyFavorites": "Aucun favori pour le moment",
    "emptyFolder": "Ce dossier est vide",
    "emptyFolderHint": "Déposez des fichiers ou dossiers ici pour téléverser, ou cliquez sur Téléverser",
    "selectItem": "Sélectionner {{name}}",
    "colName": "Nom",
    "colSize": "Taille",
    "colMtime": "Modifié",
    "rename": "Renommer",
    "unfavorite": "Retirer des favoris",
    "favorite": "Ajouter aux favoris",
    "share": "Partager",
    "versions": "Versions",
    "selectAllAria": "Tout sélectionner",
    "selectAll": "Tout sélectionner",
    "folder": "Dossier",
    "dirNamedLikeFile": "(dossier résiduel ; le nom ressemble à un fichier)",
    "dropToUpload": "Déposer pour téléverser",
    "trashTitle": "Corbeille ({{count}})",
    "trashDesc": "Les fichiers supprimés peuvent être restaurés ou définitivement effacés",
    "emptyTrash": "Vider la corbeille",
    "emptyTrashTitle": "Vider la poubelle ?",
    "emptyTrashDesc": "Chaque fichier dans la corbeille sera définitivement supprimé. Cela ne peut pas être annulé.",
    "purgeForeverDesc": "Ce fichier sera définitivement supprimé. Cela ne peut pas être annulé.",
    "emptyTrashDone": "Corbeille vidée",
    "colOrigPath": "Chemin d’origine",
    "colDeletedAt": "Supprimé le",
    "restore": "Restaurer",
    "restored": "Restauré",
    "purgeForever": "Supprimer définitivement",
    "purged": "Supprimé définitivement",
    "trashEmpty": "La corbeille est vide",
    "sharesTitle": "Liens de partage public ({{count}})",
    "colPath": "Chemin",
    "colLink": "Lien",
    "colDownloads": "Téléchargements",
    "unshare": "Arrêter le partage",
    "unshareDone": "Partage annulé",
    "sharesEmpty": "Aucun partage pour l'instant",
    "sharesEmptyHint": "Cliquez sur Partager sur une ligne de fichier",
    "webdavTitle": "Paramètres WebDAV",
    "webdavDesc": "Montez la racine des fichiers publics via HTTP Basic dans Finder, Windows ou rclone. Le jeton n'est affiché qu'une seule fois.",
    "enableIssueToken": "Activer et émettre un jeton",
    "webdavReissueToken": "Réémettre le jeton",
    "webdavReissueConfirm": "La réémission invalide immédiatement l'ancien mot de passe ; les clients montés se déconnecteront. Continuer ?",
    "webdavDisableConfirm": "La désactivation rejettera toutes les connexions /webdav. Continuer ?",
    "tokenIssued": "Jeton émis",
    "status": "Statut",
    "enabledMount": "Activé · {{path}}",
    "notEnabled": "Non activé",
    "disable": "Désactiver",
    "webdavAlreadyOff": "WebDAV est déjà désactivé",
    "webdavDisabled": "WebDAV désactivé",
    "webdavEnabledNoEcho": "Activé (le mot de passe ne sera plus affiché ; réémettez-le si nécessaire)",
    "webdavDefaultOff": "Désactivé par défaut — cliquez sur Activer et émettre un jeton pour commencer",
    "webdavAfterEnable": "Disponible après activation de WebDAV et émission d’un jeton.",
    "webdavOn": "Activé",
    "webdavOff": "Désactivé",
    "webdavOffNoToken": "Désactivé (pas de jeton actif)",
    "webdavTokenId": "Jeton n°{{id}}",
    "webdavTokenInactive": "Désactivé — le jeton #{{id}} n'est pas actif",
    "webdavUpdated": "Mis à jour {{at}}",
    "webdavTokenOnceTitle": "Copiez le mot de passe maintenant",
    "webdavTokenOnceHint": "Ce mot de passe n'est affiché qu'une seule fois ; il ne pourra pas être récupéré après avoir quitté cette page.",
    "webdavConnTitle": "Connexion",
    "webdavConnDesc": "Utilisez cette URL avec des identifiants HTTP Basic dans votre client",
    "webdavUrl": "URL du serveur",
    "webdavUsername": "Nom d'utilisateur",
    "webdavPassword": "Mot de passe (jeton)",
    "webdavPasswordHidden": "Émis précédemment et non réaffiché — réémettez-le ou utilisez un mot de passe enregistré",
    "webdavPasswordNone": "Pas encore émis",
    "webdavRoot": "Racine de montage",
    "webdavRootValue": "Racine des fichiers publics du panneau",
    "webdavAuth": "Authentification",
    "webdavAuthValue": "HTTP Basic · utilisateur ysk · mot de passe = jeton émis par le panneau",
    "webdavConnBundle": "détails de connexion",
    "webdavCopyAll": "Copier tous les détails de connexion",
    "webdavClientsTitle": "Configuration du client",
    "webdavClientsDesc": "Recettes de montage courantes (préférez HTTPS ; faites confiance aux certificats auto-signés dans le client si nécessaire)",
    "webdavClientFinder": "Recherche macOS",
    "webdavClientFinderHint": "Aller → Se connecter au serveur… (⌘K), collez l'URL, utilisateur ysk, mot de passe = jeton.",
    "webdavClientWin": "Fenêtres",
    "webdavClientWinHint": "Ce PC → Connecter un lecteur réseau → utiliser d'autres informations d'identification ; ou Cyberduck / WinSCP (WebDAV).",
    "webdavNotesTitle": "Remarques",
    "webdavNote1": "WebDAV mappe uniquement la racine des fichiers publics — pas l'ensemble du système de fichiers de l'hôte.",
    "webdavNote2": "Exposez le port du panneau via reverse proxy/pare-feu ; préférez HTTPS uniquement.",
    "webdavNote3": "La réémission invalide immédiatement l'ancien jeton ; la désactivation rejette toutes les requêtes /webdav.",
    "webdavNote4": "Prend en charge OPTIONS / PROPFIND / GET / PUT ; la suite LOCK complète peut être incomplète.",
    "copiedLabel": "« {{label}} » copié",
    "newFolderTitle": "Nouveau dossier",
    "willCreateAt": "Sera créé sous \"{{path}}\"",
    "nameRequired": "Saisissez un nom",
    "folderCreated": "Dossier créé",
    "create": "Créer",
    "folderName": "Nom du dossier",
    "noPathSepHint": "Ne doit pas contenir de séparateurs de chemin",
    "newTextTitle": "Nouveau fichier texte",
    "fileNameRequired": "Saisissez un nom de fichier",
    "textFileCreated": "Fichier texte créé",
    "fileName": "Nom du fichier",
    "fileNameHint": "ex. : readme.md ou notes.txt",
    "versionsTitle": "Historique des versions",
    "versionsDesc": "",
    "noVersions": "Aucun historique de versions pour le moment",
    "noVersionsHint": "",
    "versionRestored": "Restauré",
    "restoreVersionConfirm": "Restaurer {{version}} sur le fichier actuel {{file}} ? Cela écrase le fichier sur le disque.",
    "renameTitle": "Renommer",
    "renameCurrent": "Actuel : {{name}}",
    "renamed": "Renommé",
    "newName": "Nouveau nom",
    "newNameHint": "Renommage uniquement ; reste dans le même répertoire",
    "copyTo": "Copier vers…",
    "moveTo": "Déplacer vers…",
    "copyMoveDesc": "{{action}} {{count}} élément(s)",
    "actionCopy": "Copier",
    "actionMove": "Déplacer",
    "copied": "Copié",
    "moved": "Déplacé",
    "targetFolderPath": "Chemin du dossier cible",
    "targetFolderHint": "Relatif à la racine, ex. : docs ou docs/a ; vide = racine",
    "shareCreateTitle": "Partager le fichier",
    "shareCreateDesc": "Créer un lien de téléchargement public. Mot de passe optionnel.",
    "createLink": "Créer le lien",
    "sharePath": "Chemin : ",
    "passwordOptional": "Mot de passe (optionnel)",
    "passwordOptionalHint": "Laisser vide pour un accès libre",
    "passwordPlaceholder": "Facultatif",
    "linkCreated": "Lien créé : ",
    "chmodTitle": "Modifier les permissions (chmod)",
    "chmodDone": "chmod {{mode}} → {{count}} élément(s)",
    "chmodDoneShort": "chmod {{mode}} terminé",
    "chmodFailed": "Échec de chmod",
    "apply": "Appliquer",
    "chmodApplyHint": "Appliquer à {{count}} élément(s) sélectionné(s) (octal, ex. : 644 / 755)",
    "chmod644": "644 fichier",
    "chmod755": "755 exécutable",
    "chmod600": "600 privé",
    "chmod700": "700 répertoire privé",
    "chmod775": "775 écriture groupe",
    "chmodCustomPh": "Personnalisé 0644…",
    "mode": "Mode",
    "zipTitle": "Compresser en zip",
    "zipCreated": "Créé {{path}}",
    "zipDone": "Compressé → {{path}}",
    "zipFailed": "Échec du zip",
    "compress": "Compresser",
    "zipHint": "Compresser {{count}} élément(s) sélectionné(s) dans le dossier actuel (nécessite zip sur l'hôte)",
    "destFileName": "Nom du fichier de destination",
    "destPathHint": "Chemin : {{path}}",
    "movedToTrash": "Déplacé vers la corbeille",
    "moveToTrashTitle": "Déplacer vers la corbeille ?",
    "moveToTrashDesc": "Supprimer {{count}} élément(s) (récupérable depuis la corbeille)",
    "deleteMore": "et {{n}} de plus",
    "unshareTitle": "Révoquer ce partage ?",
    "unshareDesc": "Révoquer le lien pour {{name}} ({{url}}). Le lien cesse de fonctionner immédiatement.",
    "preview": "Aperçu",
    "imagePreviewNeedLogin": "L'aperçu d'image nécessite une connexion ; utilisez le téléchargement",
    "pdfDownloadHint": "Téléchargez le PDF pour l'ouvrir (nécessite des en-têtes d'auth)",
    "noEmbedPreview": "Ce type ne peut pas être intégré ; veuillez télécharger.",
    "uploadDone": "{{count}} fichier(s) téléversé(s)",
    "downloadFailedStatus": "Échec du téléchargement ({{status}})",
    "downloadFailed": "Échec du téléchargement",
    "uploadFolder": "Téléverser un dossier",
    "dropFolderOrFile": "Déposez des fichiers ou dossiers à téléverser",
    "uploadPanelTitle": "Téléversements",
    "uploadPanelStats": "{{done}}/{{total}} terminé(s) · {{err}} échec(s)",
    "uploadClearDone": "Effacer les terminés",
    "uploadInFolder": "Dossier {{folder}}",
    "uploadStatusDone": "Fait",
    "uploadStatusError": "Échoué",
    "uploadStatusQueued": "En file d'attente",
    "uploadNoFile": "Aucune donnée de fichier",
    "uploadSomeFailed": "{{count}} élément(s) en échec",
    "uploadTruncated": "Téléversement limité à {{max}} éléments ({{total}} sélectionnés ; le reste ignoré)",
    "previewFailed": "Échec de l'aperçu",
    "videoNotSupported": "Votre navigateur ne peut pas lire cette vidéo.",
    "audioNotSupported": "Votre navigateur ne peut pas lire cet audio.",
    "edit": "Modifier",
    "editorTitle": "Modifier · {{name}}",
    "editorSave": "Enregistrer",
    "editorSavedIdle": "Enregistré",
    "editorSaved": "{{name}} enregistré",
    "editorSaveFailed": "Échec de l'enregistrement",
    "editorDirty": "Non enregistré",
    "editorClean": "Enregistré",
    "editorChars": "{{count}} car.",
    "editorAria": "Éditeur pour {{name}}",
    "editorDiscardConfirm": "Abandonner les modifications non enregistrées ?",
    "shareReadyTitle": "Lien prêt",
    "shareReadyDesc": "Copiez et envoyez ce lien. Quiconque le possède peut télécharger.",
    "shareReadyBadge": "Créé",
    "shareProtected": "Protégé par mot de passe",
    "shareOpenAccess": "Sans mot de passe",
    "shareLinkLabel": "Lien public",
    "shareCopyHint": "Sélectionnez le champ ou utilisez Copier.",
    "shareAgain": "Nouveau lien",
    "shareCreatedToast": "Lien de partage créé",
    "linkCopied": "Lien copié",
    "linkCopyFailed": "Impossible de copier — sélectionnez et copiez manuellement",
    "shareExpireLabel": "Expiration du lien",
    "shareExpireHint": "Après cette heure, le lien ne fonctionnera plus",
    "shareExpireNever": "Jamais",
    "shareExpire1h": "1 heure",
    "shareExpire1d": "1 jour",
    "shareExpire7d": "7 jours",
    "shareExpire30d": "30 jours",
    "shareExpireCustom": "Personnalisé…",
    "shareExpireAt": "Expire le",
    "shareExpireInvalid": "Choisissez une date et une heure futures",
    "shareExpiresAt": "Expire le {{at}}",
    "colExpires": "Expire",
    "pdfInlineHint": "Si le PDF ne s'affiche pas, téléchargez-le.",
    "publicShareTitle": "Quelqu'un a partagé un fichier avec vous",
    "publicShareSub": "Téléchargez en toute sécurité via ce lien — aucun compte requis",
    "publicShareChecking": "Vérification du lien…",
    "publicShareDownloading": "Téléchargement…",
    "publicShareWait": "Veuillez patienter",
    "publicShareNeedPassword": "Ce lien nécessite un mot de passe pour télécharger",
    "publicSharePasswordPh": "Mot de passe de partage",
    "publicShareDownload": "Télécharger",
    "publicShareDownloadAgain": "Télécharger à nouveau",
    "publicShareDone": "Téléchargement démarré",
    "publicShareDoneHint": "Vérifiez les téléchargements de votre navigateur ; appuyez à nouveau si rien n'apparaît",
    "publicShareNotFound": "Partage introuvable ou expiré",
    "publicShareDenied": "Impossible d'accéder à ce partage",
    "publicShareBadPassword": "Mot de passe incorrect",
    "publicShareMissing": "Lien de partage non valide",
    "publicShareFailed": "Échec du téléchargement ({{status}})",
    "publicShareFailedGeneric": "Échec du téléchargement",
    "publicShareDefaultName": "télécharger",
    "publicSharePanelLogin": "Connexion au panneau",
    "publicShareLang": "Langue",
    "publicShareProgress": "{{loaded}} / {{total}} ({{pct}}%)",
    "publicShareProgressIndeterminate": "Reçu {{loaded}}…",
    "publicShareCancel": "Annuler",
    "publicShareCancelled": "Téléchargement annulé",
    "publicSharePoweredBy": "Propulsé par {{company}}",
    "publicSharePoweredPrefix": "Propulsé par ",
    "publicSharePoweredSuffix": "",
    "publicShareHasAccount": "Vous avez un compte ? Se connecter",
    "password": "Mot de passe",
    "editorLines": "{{count}} lignes",
    "editorLargeHint": "Fichier volumineux — l’édition peut être lente. Préférez le téléchargement pour les fichiers de plusieurs Mo (limite serveur ~2 Mo).",
    "editorLnCol": "Lig {{line}}, Col {{col}}",
    "editorSpaces": "Espaces : {{n}}",
    "copyLink": "Copier le lien",
    "versionsTitleShort": "Historique des versions",
    "versionsCount": "{{count}} / {{max}}",
    "versionN": "v{{n}}",
    "versionLatest": "Dernière",
    "shareModeLabel": "Méthode de téléchargement",
    "shareModeDirect": "Téléchargement direct",
    "shareModeBt": "BitTorrent (WebTorrent)",
    "shareModeBoth": "Direct + BitTorrent",
    "shareModeHint": "BT a besoin d'un tracker en cours d'exécution (Fichiers → BT Tracker). Les liens magnétiques peuvent être utilisés par toute personne disposant du lien.",
    "shareModeBtBlocked": "Tracker n'est pas en cours d'exécution : démarrez-le avant de créer des partages BT ou choisissez Direct uniquement.",
    "shareMagnet": "Lien aimanté",
    "shareTorrentFile": "Télécharger .torrent",
    "shareSeedStatus": "Statut de semis",
    "shareBtStats": "Statut BitTorrent",
    "btSeeds": "Graines",
    "btLeechers": "Sangsues",
    "btPeers": "Pairs",
    "btUploadSpeed": "Vitesse de téléchargement",
    "btDownloadSpeed": "Vitesse de téléchargement",
    "btUploaded": "Téléchargé",
    "btDownloaded": "Téléchargé",
    "btRatio": "Rapport",
    "btUpdatedAt": "Mis à jour",
    "btServerStats": "Semoir de serveur",
    "btClientStats": "Votre client",
    "btSeeding": "Semis",
    "btPending": "Semis en attente",
    "btStopped": "La graine s'est arrêtée",
    "btError": "Erreur de graine",
    "publicShareMethod": "Comment voulez-vous télécharger ?",
    "publicShareDirect": "Téléchargement direct",
    "publicShareBt": "BitTorrent",
    "openBtTracker": "Ouvrir le suivi BT",
    "publicShareBtInBrowser": "Télécharger dans le navigateur (WebTorrent)",
    "publicShareBtProgress": "Téléchargé {{pct}}% · {{peers}} pairs · ↓ {{down}} · ↑ {{up}}",
    "publicShareBtStarting": "Se connecter à ses pairs…",
    "publicShareBtFailed": "Échec de WebTorrent : {{detail}}",
    "publicShareBtNeedMagnet": "Pas d'URI magnétique pour ce partage",
    "publicShareBtUnsupported": "Ce navigateur ne peut pas exécuter WebTorrent ; utilisez plutôt magnet ou .torrent",
    "btNone": "—",
    "uploadStatusSkipped": "Ignoré",
    "uploadStatusCancelled": "Annulé",
    "conflict": {
      "titleFile": "Un élément nommé « {{name}} » existe déjà",
      "titleFolder": "Un dossier nommé « {{name}} » existe déjà",
      "descFile": "Choisissez l’action. Rien n’est écrasé tant que vous ne choisissez pas Remplacer.",
      "descFolder": "Choisissez l’action. Fusionner conserve le dossier existant et continue avec son contenu.",
      "incoming": "À ajouter",
      "existing": "Déjà ici",
      "kindFile": "Fichier",
      "kindFolder": "Dossier",
      "skip": "Ignorer",
      "skipHint": "Ne pas ajouter cet élément",
      "keepBoth": "Conserver les deux",
      "keepBothHint": "Enregistrer l’élément entrant sous {{name}}",
      "replace": "Remplacer",
      "replaceHint": "Écraser le fichier existant. Une instantané de version est conservé si possible.",
      "replaceFolderHint": "Écrase les fichiers du même nom dans ce dossier. Les autres fichiers restent.",
      "merge": "Fusionner",
      "mergeHint": "Conserver le dossier existant et y ajouter les fichiers entrants",
      "applyAll": "Appliquer à tous les conflits restants",
      "applyAllHint": "Utiliser cette action pour le reste de ce dépôt ou transfert",
      "cancelRest": "Annuler le reste",
      "progress": "{{current}} sur {{total}}",
      "typeMismatch": "Un {{destKind}} nommé « {{name}} » est déjà ici. L’élément entrant est un {{incomingKind}}.",
      "skipped": "Ignoré",
      "cancelled": "Annulé"
    },
    "webdavReissueUnchanged": "L'identifiant du jeton n'a pas changé après la réémission : l'écriture n'a peut-être pas persisté. Essayer à nouveau.",
    "webdavDisableFailed": "WebDAV est toujours activé après la désactivation : l'écriture n'a peut-être pas persisté. Essayer à nouveau."
  },
  "firewall": {
    "profiles": {
      "web": {
        "label": "Hébergement web",
        "short": "SSH · 80 · 443"
      },
      "mail": {
        "label": "Web + messagerie",
        "short": "Aussi 25/465/587/993"
      },
      "ftps": {
        "label": "Web + FTPS",
        "short": "21 + PASV 30 000–30 100"
      }
    },
    "appliedProfile": "Profil appliqué : {{label}}",
    "backToProtection": "Protection",
    "statRules": "Règles",
    "statDenyIps": "IP en refus permanent",
    "statAllow": "Autoriser",
    "statDeny": "Refuser",
    "statDefaultIn": "Entrant par défaut",
    "defaultNotApplied": "n/a (UFW désactivé)",
    "ufwOffHint": "Les messages entrants par défaut ne sont pas appliqués lorsque UFW est désactivé",
    "executeOn": "Activé",
    "executeOff": "Désactivé",
    "ufwDisabled": "UFW désactivé",
    "ufwEnabled": "UFW activé",
    "disableUfw": "Désactiver UFW",
    "enableUfw": "Activer UFW",
    "notInstalled": "UFW n’est pas installé",
    "toolHintPrefix": "Outils sous-jacents :",
    "toolHintBody": "UFW = ports / règles permanentes · pour la réponse aux attaques et le bannissement auto, utilisez",
    "toolHintfail2ban": "fail2ban = bannissements temporaires basés sur les journaux",
    "toolHintFail2ban": "fail2ban = bannissements temporaires basés sur les journaux",
    "executeOffHint": "Modifications système désactivées — le statut est lisible ;",
    "tabs": {
      "rules": "Règles",
      "ports": "Ports ouverts",
      "deny": "IP en refus permanent",
      "profiles": "Profils",
      "about": "À propos",
      "services": "Services"
    },
    "currentRules": "Règles actuelles",
    "rulesSourceHint": "Règles UFW numérotées (ufw status numbered)",
    "colAction": "Action",
    "colTo": "Vers",
    "colFrom": "Depuis",
    "deleteShort": "Supprimer",
    "denyBadge": "DENY",
    "emptyRulesTitle": "Aucune règle ou permission insuffisante pour lire",
    "emptyRulesInstalled": "UFW inactif ou nécessite root pour lire",
    "emptyRulesNotInstalled": "Installer UFW puis actualiser",
    "allowPortTitle": "Autoriser le port",
    "protocol": "Protocole",
    "protoBoth": "Les deux",
    "protoBothLabel": "TCP+UDP",
    "port": "Port",
    "portHint": "Choisissez un port courant, ou personnalisé ci-dessous",
    "portHintYsk": "Tous les ports des services YSK (Panel, Web, SSH, mail, FTP, DNS, DB, Redis) ;",
    "privatePortWarn": "{{service}} doit généralement rester privé ; l'autorisation publique est risquée. Préférez une IP/CIDR source.",
    "privatePortWarnWithFrom": "{{service}} n'autorisera que la source indiquée ; vérifiez bien l'IP/CIDR.",
    "allowFrom": "IP/CIDR source (facultatif)",
    "allowFromHint": "Vide = n'importe où ; indiquez une IP ou un CIDR pour n'autoriser que cette source sur ce port",
    "allowFromPlaceholder": "ex. 203.0.113.10 ou 10.0.0.0/8",
    "customPort": "Port personnalisé (ex. 8080 ou 30000:30100)",
    "allowedPort": "{{proto}}/{{port}} autorisé",
    "allowedPortFrom": "{{proto}}/{{port}} autorisé depuis {{from}}",
    "allowThisPort": "Autoriser ce port",
    "allowPortHint": "Conservez 22/80/443 pour un hôte web ;",
    "denyTitle": "IP en refus permanent",
    "denySub": "UFW DENY · différent des bannissements temporaires fail2ban",
    "denyPlaceholder": "IPv4 ou IPv6 à refuser",
    "deniedOk": "Refusé de façon permanente",
    "removedDeny": "DENY supprimé",
    "remove": "Supprimer",
    "noDenyRules": "Aucune règle de refus IP permanente",
    "oneClickProfiles": "Profils en un clic",
    "oneClickDesc": "Écrire le script du panneau et appliquer UFW (n'installe pas fail2ban — utilisez la page fail2ban)",
    "customApply": "Application personnalisée",
    "allowSmtp": "Autoriser les ports SMTP/IMAP",
    "extraTcp": "Ports TCP supplémentaires",
    "extraTcpHint": "Choisissez un préréglage ; ou personnalisé (virgules/plages)",
    "noExtra": "Aucun supplémentaire",
    "mailGroup": "Jeu mail",
    "customExtraPlaceholder": "Personnalisé : 8080,9000:9010",
    "appliedCustom": "Règles personnalisées appliquées",
    "applyToSystem": "Appliquer au système",
    "deletedRule": "Supprimé #{{n}}",
    "deleteRuleTitle": "Supprimer la règle #{{n}} ?",
    "deleteRuleDesc": "Supprime ce numéro de règle UFW (nécessite la permission system-change).",
    "servicesTitle": "Services gérés",
    "servicesHint": "Exposition réseau souhaitée pour les services YSK. L'ouverture d'un service synchronise automatiquement ces règles.",
    "servicesUfwOff": "UFW est éteint. Cette liste représente l'exposition souhaitée, et non les règles que l'hôte applique.",
    "servicesEmpty": "Aucune donnée d'exposition au service pour l'instant",
    "servicesEmptyDesc": "Démarrez un service géré (web, FTPS, VPN, DB…) pour remplir cette liste.",
    "servicesManualHint": "Les puces de port manuel se trouvent sous l'onglet Ports – préférez gérer l'accès ici afin que les règles restent étiquetées (ysk-svc).",
    "portsManualHint": "Règles manuelles avancées. Préférez l’onglet Services pour les logiciels gérés.",
    "colService": "Service",
    "colMode": "Mode",
    "colPorts": "Ports",
    "colSync": "Statut",
    "synced": "Synchronisé",
    "syncNow": "Synchroniser",
    "disableConfirmTitle": "Désactiver UFW ?",
    "disableConfirmDesc": "Le pare-feu de l’hôte cessera de filtrer le trafic. Sur un réseau public, SSH et le panneau peuvent être exposés.",
    "disableConfirmConsequence": "Les règles d’autorisation/refus restent enregistrées mais ne s’appliquent plus tant que UFW n’est pas réactivé.",
    "desiredOnlyUfwOff": "Souhaité : {{mode}} · UFW désactivé (non appliqué)",
    "syncNotApplied": "UFW désactivé · non appliqué"
  },
  "ftp": {
    "title": "Comptes FTPS",
    "accountsCount": "{{count}} compte(s)",
    "accounts": "Comptes",
    "applied": "Appliqué",
    "pendingApply": "Application en attente",
    "sftpKeys": "Clés SFTP",
    "softwareMissing": "Le logiciel du service FTPS n'est pas installé",
    "ftpAccounts": "Comptes FTP",
    "sftpPubkeys": "Clés publiques SFTP",
    "homeDir": "Répertoire personnel",
    "domain": "Domaine",
    "user": "Utilisateur",
    "keyFingerprint": "Empreinte de clé (préfixe)",
    "createHint": "Créez d'abord un compte FTP dans l'onglet Comptes, puis revenez ici pour enregistrer les clés.",
    "pubkeyHint": "Utilisez « + Ajouter une clé publique », choisissez un utilisateur FTP, et collez une ligne ssh-ed25519 ou ssh-rsa complète.",
    "sftpKeyInvalid": "Besoin d'un nom d'utilisateur et d'une clé publique commençant par ssh-.",
    "quickSelect": "Sélection rapide de compte",
    "quickSelectHint": "Cliquez sur un nom d'utilisateur pour remplir le formulaire de nouvelle clé",
    "editAccount": "Modifier le compte FTP",
    "createAccount": "Créer un compte FTP",
    "accountModalDesc": "Choisissez le domaine et le répertoire home dans les listes, ou saisissez librement. Enregistrez puis Appliquer pour écrire vsftpd",
    "usernameHintCreate": "Alphanumériques, point, souligné, tiret ; immuable après création",
    "usernameHint": "Alphanumériques, point, souligné, tiret",
    "newPasswordOptional": "Nouveau mot de passe (facultatif)",
    "passwordKeepHint": "Vide conserve l'actuel",
    "passwordMin8": "Au moins 8 caractères",
    "domainHint": "Domaine site ou mail pour regroupement et indications de chemin",
    "domainPh": "Créez d'abord le domaine site/mail, ou saisissez temporairement",
    "homeHint": "Racine après connexion (périmètre visible du chroot)",
    "addPubkey": "Ajouter une clé publique SFTP",
    "addPubkeyDesc": "Choisissez un compte, une note facultative, et collez une ligne complète de clé publique. L'écriture du fichier ne prouve pas que la connexion fonctionne.",
    "pubkeyAdded": "Clé publique ajoutée",
    "ftpUsername": "Nom d'utilisateur FTP",
    "ftpUsernameHint": "Doit correspondre à un compte FTP enregistré",
    "ftpUsernamePh": "Identique au compte FTP",
    "note": "Note",
    "noteHint": "Libellé de l'appareil, ex. portable / bureau",
    "notePh": "Hôte portable / bureau",
    "sshPubkey": "Clé publique SSH",
    "sshPubkeyHint": "Généralement depuis ~/.ssh/id_ed25519.pub, collez la ligne entière",
    "deleteAccountTitle": "Supprimer le compte FTP ?",
    "deleteAccountNamed": "Supprimer le compte FTP {{name}} ?",
    "deleteAccountDesc": "Réappliquer après suppression",
    "deleteKeyTitle": "Supprimer la clé publique SFTP ?",
    "deleteKeyDesc": "Retire du fichier de gestion ; authorized_keys système peut nécessiter un rechargement.",
    "serviceTitle": "Service vsftpd",
    "softwareMissingService": "Le logiciel FTPS n'est pas installé",
    "lifecycle": "Cycle de vie",
    "overview": "Vue d'ensemble",
    "network": "Réseau",
    "security": "Sécurité",
    "installStart": "Installer et démarrer",
    "listenPort": "Port d'écoute",
    "accountCount": "Comptes",
    "loginBanner": "Bannière de connexion",
    "sslDomain": "Domaine SSL",
    "plaintextInsecure": "FTP en texte clair (pas de TLS) – non sécurisé. Activez FTPS avant d’exposer le port 21.",
    "plaintextPublicLive": "vsftpd écoute sur une adresse publique sans FTPS. Les informations d’identification voyagent en clair. Activez FTPS, liez-vous à cet hôte uniquement ou confirmez PLAINTEXT pour conserver cette posture.",
    "bindAddress": "Portée d'écoute",
    "bindAddressHint": "Les nouvelles installations se lient uniquement à cet hôte. L'écoute publique sans FTPS nécessite une confirmation tapée.",
    "bindLocal": "Cet hôte uniquement",
    "bindLocalHint": "127.0.0.1 — très bien sans TLS pour les tests locaux",
    "bindPublic": "Publique",
    "bindPublicHint": "Toutes les interfaces : activez FTPS ou confirmez PLAINTEXT",
    "enableFtpsAndStart": "Activez FTPS et démarrez",
    "publicPlainNeedConfirm": "FTP public en texte clair nécessite une confirmation PLAINTEXT",
    "plainConfirmTitle": "Démarrer un FTP public sans FTPS ?",
    "plainConfirmDesc": "Le port 21 acceptera les connexions et les données en clair sur l'adresse publique.",
    "plainConfirmC1": "Les noms d'utilisateur et mots de passe sont visibles sur le réseau.",
    "plainConfirmC2": "PASV annoncera l’adresse IP publique configurée.",
    "plainConfirmC3": "Le pare-feu hôte et le groupe de sécurité cloud ne sont pas ouverts pour vous.",
    "plainConfirmAction": "Démarrer FTP en texte clair",
    "pasvRange": "Plage PASV",
    "forceTls": "Forcer TLS",
    "allowWrite": "Autoriser l'écriture",
    "networkTitle": "Paramètres réseau",
    "networkDesc": "Port d'écoute et PASV ;",
    "listenPortHint": "Par défaut 21 ; ouvrez le pare-feu si vous utilisez un autre port",
    "customPort": "Port personnalisé",
    "ipStack": "Pile IP",
    "ipStackHint": "La plupart des builds vsftpd : listen et listen_ipv6 sont mutuellement exclusifs ;",
    "listenConflictLive": "Live vsftpd.conf a Listen={{v4}} et Listen_ipv6={{v6}} — les deux OUI ne parviendront pas à démarrer.",
    "listenConflictNeedFix": "Corrigez d'abord Listen / Listen_ipv6 (ils ne peuvent pas tous les deux être OUI), puis appliquez.",
    "fixListenIpv4": "Utiliser uniquement IPv4 (listen=YES, Listen_ipv6=NO)",
    "liveFileValue": "Déposez maintenant : {{value}}",
    "startBlockedFailed": "Le service a échoué : appliquez une configuration valide avant de démarrer",
    "ftpsNeedCert": "Choisissez d'abord un domaine de certificat",
    "ipv4Only": "IPv4 uniquement",
    "ipv6Mapped": "IPv6 (mappé OK)",
    "bannerHint": "Message de bienvenue affiché aux clients après connexion",
    "pasvStart": "Port de début PASV",
    "pasvStartHint": "Début du canal de données passif",
    "customStart": "Début personnalisé",
    "pasvEnd": "Port de fin PASV",
    "pasvEndHint": "Doit être ≥ début ; le pare-feu doit autoriser la plage",
    "openFirewallPage": "Ouvrir la page pare-feu",
    "customEnd": "Fin personnalisée",
    "pasvPublicIp": "IP publique PASV",
    "detectPublicIp": "Détecter l'adresse IP publique",
    "detectPublicIpTitle": "Remplissez le premier IPv4 sans bouclage de cet hôte",
    "pasvPublicIpHint": "NAT/cloud : définir l'IP publique ; en local, laisser vide",
    "pasvIpRequired": "Indiquez une IP publique PASV avant d’appliquer (NAT/cloud). Détectez ou saisissez une adresse.",
    "optionalEmpty": "(facultatif)",
    "securityTitle": "Paramètres de sécurité",
    "securityDesc": "TLS, accès en écriture, chroot ; Appliquer et redémarrer pour prendre effet",
    "sslCertDomain": "Domaine du certificat SSL",
    "sslCertDomainHint": "Choisir un domaine de certificat téléversé/émis",
    "enableFtps": "Activer FTPS (SSL/TLS)",
    "enableFtpsDesc": "TLS sur le canal de contrôle ; recommandé",
    "forceTlsLogin": "Forcer la connexion TLS",
    "forceTlsLoginDesc": "Rejeter le FTP en clair ; les clients doivent utiliser FTPS",
    "allowWriteDesc": "Désactivé = téléchargement/liste uniquement",
    "chrootUsers": "Chroot des utilisateurs",
    "chrootUsersDesc": "Confiner au répertoire personnel après connexion",
    "writableChroot": "Autoriser un chroot accessible en écriture",
    "writableChrootDesc": "Conserver le chroot même si le home est accessible en écriture (besoin courant de vsftpd)",
    "settingsSaved": "Paramètres enregistrés",
    "installIncomplete": "L'installation n'a pas pu se terminer",
    "ftpsReady": "FTPS prêt",
    "settingsApplied": "Paramètres appliqués",
    "opsResult": "Résultat ops",
    "saved": "Enregistré",
    "accountsList": "Liste des comptes",
    "accountsListDesc": "Après création, Appliquer pour synchroniser vsftpd. Si le service est absent, installer ci-dessus puis ",
    "startService": " démarrer.",
    "createAccountPlus": "+ Créer un compte",
    "noFtpAccounts": "Aucun compte FTP pour le moment",
    "noFtpAccountsDesc": "Créer un compte (liste en haut à droite) ; définir le home et le domaine, puis appliquer.",
    "applyHint": "Note : Appliquer n'écrit que la gestion ; l'écoute nécessite vsftpd actif.",
    "sshdMatchNote": "; le Match sshd système doit être configuré pour prendre effet.",
    "addPubkeyPlus": "+ Ajouter une clé publique",
    "noPubkeys": "Aucune clé publique enregistrée",
    "pickDomain": "— choisir un domaine —",
    "currentDomain": "{{domain}} (actuel)",
    "pickHome": "— choisir le home —",
    "currentHome": "{{path}} (actuel)",
    "fullPath": "Chemin complet : ",
    "emptyHomes": "Si la liste est vide, créez d'abord un projet ou un site pour les options de home.",
    "pickAccount": "— choisir un compte —",
    "installFtpsBanner": "Utilisez la bannière ci-dessus pour installer FTPS, puis démarrez le service.",
    "applyRestart": "Appliquer et redémarrer",
    "afterInstall": "Après installation, vous pouvez vous connecter avec les comptes FTPS. Droits d'administrateur requis pour installer.",
    "saveSettings": "Enregistrer les paramètres",
    "saveApplyHint": "Enregistrer met à jour le panneau uniquement ; Appliquer et redémarrer écrit vsftpd.conf et recharge.",
    "installAndStart": "Installer et démarrer",
    "manageAccounts": "Comptes",
    "openFirewallPorts": "Ouvrir les ports du pare-feu",
    "firewallPortsApplied": "Pare-feu : TCP {{ports}} autorisé",
    "sftpTabDesc": "Enregistrez des clés publiques SSH pour les comptes FTP afin que les clients puissent se connecter en SFTP par clé. Choisissez un compte, collez une ligne de clé, puis enregistrez.",
    "sftpNeedAccountTitle": "Aucun compte FTP pour le moment",
    "sftpNeedAccount": "Créez d'abord au moins un compte FTP, puis enregistrez une clé publique pour cet utilisateur.",
    "sftpFilterLabel": "Compte",
    "sftpFilterAll": "Tous les comptes",
    "sftpKeyCount": "{{count}} clé(s)",
    "sftpEmptyFiltered": "Aucune clé pour ce compte",
    "sftpEmptyFilteredDesc": "« {{user}} » n'a pas encore de clés publiques SSH enregistrées.",
    "sftpRegister": "Enregistrer la clé",
    "sftpAddedAt": "Ajoutée {{time}}",
    "sftpTechSummary": "Détails techniques (avancé)",
    "sftpTechNote": "Les clés sont écrites sous le chemin géré",
    "filterProject": "Comptes FTP de ce projet uniquement",
    "clearProjectFilter": "Afficher tous les comptes",
    "vsftpdFailedHint": "vsftpd a échoué. Ouvrez l'onglet Service (listen et Listen_ipv6 ne peuvent pas être tous les deux OUI).",
    "vsftpdFailedGeneric": "vsftpd a échoué. Ouvrez l'onglet Service pour les paramètres en direct et le journal.",
    "stateFailed": "Échec du démarrage",
    "tabService": "Service"
  },
  "geo": {
    "continents": {
      "AS": "Asie",
      "EU": "Europe",
      "NA": "Amérique du Nord",
      "SA": "Amérique du Sud",
      "AF": "Afrique",
      "OC": "Océanie",
      "AN": "Antarctique"
    },
    "countries": {
      "CN": "Chine",
      "HK": "Hong Kong",
      "MO": "Macao",
      "TW": "Taïwan",
      "JP": "Japon",
      "KR": "Corée du Sud",
      "KP": "Corée du Nord",
      "SG": "Singapour",
      "MY": "Malaisie",
      "TH": "Thaïlande",
      "VN": "Viêt Nam",
      "PH": "Philippines",
      "ID": "Indonésie",
      "IN": "Inde",
      "AU": "Australie",
      "NZ": "Nouvelle-Zélande",
      "US": "États-Unis",
      "CA": "Canada",
      "MX": "Mexique",
      "BR": "Brésil",
      "AR": "Argentine",
      "GB": "Royaume-Uni",
      "IE": "Irlande",
      "DE": "Allemagne",
      "FR": "France",
      "NL": "Pays-Bas",
      "BE": "Belgique",
      "CH": "Suisse",
      "AT": "Autriche",
      "SE": "Suède",
      "NO": "Norvège",
      "DK": "Danemark",
      "FI": "Finlande",
      "PL": "Pologne",
      "CZ": "Tchéquie",
      "ES": "Espagne",
      "PT": "Portugal",
      "IT": "Italie",
      "RU": "Russie",
      "UA": "Ukraine",
      "TR": "Turquie",
      "IL": "Israël",
      "AE": "UAE",
      "SA": "Arabie saoudite",
      "EG": "Égypte",
      "ZA": "Afrique du Sud",
      "NG": "Nigeria",
      "PK": "Pakistan",
      "BD": "Bangladesh",
      "IR": "L'Iran",
      "IQ": "Irak",
      "RO": "Roumanie",
      "BG": "Bulgarie",
      "HU": "Hongrie",
      "GR": "Grèce",
      "LT": "Lituanie",
      "LV": "Lettonie",
      "EE": "Estonie",
      "BY": "Biélorussie",
      "KZ": "Kazakhstan",
      "UZ": "Ouzbékistan",
      "CL": "Chili",
      "CO": "Colombie",
      "PE": "Pérou",
      "VE": "Venezuela",
      "CU": "Cuba",
      "SC": "Seychelles",
      "PA": "Panama"
    },
    "regions": {
      "CN-BJ": "Pékin",
      "CN-SH": "Shanghai",
      "CN-TJ": "Tianjin",
      "CN-CQ": "Chongqing",
      "CN-GD": "Guangdong",
      "CN-ZJ": "Zhejiang",
      "CN-JS": "Jiangsu",
      "CN-SD": "Shandong",
      "CN-HN": "Hénan",
      "CN-HB": "Hubei",
      "CN-HU": "Hunan",
      "CN-SC": "Sichuan",
      "CN-HE": "Hebei",
      "CN-FJ": "Fujian",
      "CN-AH": "Anhui",
      "CN-JX": "Jiangxi",
      "CN-LN": "Liaoning",
      "CN-JL": "Jilin",
      "CN-HL": "Heilongjiang",
      "CN-SX": "Shanxi",
      "CN-SN": "Shaanxi",
      "CN-GS": "Gansu",
      "CN-QH": "Qinghai",
      "CN-HA": "Hainan",
      "CN-YN": "Yunnan",
      "CN-GZ": "Guizhou",
      "CN-GX": "Guangxi",
      "CN-NX": "Ningxia",
      "CN-XJ": "Xinjiang",
      "CN-XZ": "Tibet",
      "CN-NM": "Mongolie-Intérieure",
      "TW-TPE": "Taïpei",
      "TW-TXG": "Taichung",
      "TW-KHH": "Kaohsiung",
      "HK-HK": "Hong Kong",
      "MO-MO": "Macao",
      "US-CA": "CA",
      "US-NY": "NY",
      "US-TX": "TX",
      "US-FL": "FL",
      "US-WA": "WA",
      "US-IL": "IL",
      "US-VA": "VA",
      "US-OR": "OR",
      "US-GA": "GA",
      "US-NJ": "NJ",
      "US-MA": "MA",
      "US-OH": "OH",
      "US-PA": "PA",
      "US-AZ": "AZ",
      "US-CO": "CO",
      "US-NC": "NC",
      "US-MI": "MI",
      "US-NV": "NV",
      "JP-13": "Tokyo",
      "JP-27": "Ōsaka",
      "JP-14": "Kanagawa",
      "JP-23": "Aïchi",
      "KR-11": "Séoul",
      "KR-26": "Pusan",
      "SG-01": "SG",
      "AU-NSW": "NSW",
      "AU-VIC": "VIC",
      "GB-ENG": "ENG",
      "DE-BE": "BE",
      "DE-BY": "BY",
      "RU-MOW": "MOW",
      "RU-SPE": "SPE"
    }
  },
  "hostBrowse": {
    "tabBrowse": "Parcourir",
    "subtitle": "Naviguez sur Internet ou sur le réseau local via cet hôte. Les cibles ne voient jamais l’identité de votre navigateur de bureau.",
    "modeInternet": "Internet",
    "modeIntranet": "Intranet",
    "modeHint": "Internet bloque les adresses IP privées ; L'intranet autorise les cibles LAN. Les deux bloquent les métadonnées du cloud.",
    "urlPlaceholder": "https://example.com ou 192.168.1.1",
    "go": "Aller",
    "back": "Retour",
    "forward": "Transfert",
    "reload": "Recharger",
    "stop": "Arrêter",
    "clearCookies": "Effacer les cookies",
    "clearCookiesConfirm": "Cela efface les cookies stockés sur l'hôte pour cette session de navigation. Les sites qui ont été connectés devront être à nouveau connectés.",
    "closeSession": "Fermer la session",
    "copyUrl": "Copier l'URL",
    "newSession": "Nouvelle séance",
    "privacyOn": "Confidentialité activée",
    "viaHost": "via l'hôte",
    "emptyTitle": "Navigation via l'hôte",
    "emptyBody": "Saisissez une URL. DNS, TLS et sortie utilisent ce serveur, pas votre navigateur. Les cookies restent dans un pot côté serveur.",
    "needUrl": "Saisissez une URL ci-dessus pour démarrer une session.",
    "ssrfBlocked": "Bloqué par politique de sécurité (SSRF / mode)",
    "loadFailed": "La récupération a échoué sur l'hôte",
    "sessionReady": "Séance prête",
    "noSession": "Aucune séance",
    "statusLine": "{{status}} · {{ms}}ms · {{type}} · via l'hôte",
    "cookies": "Cookies",
    "latency": "Latence",
    "locked": "HTTPS",
    "insecure": "HTTP",
    "loading": "Chargement…",
    "modeSwitchHint": "Le mode de changement ouvre une nouvelle session et efface les cookies.",
    "copied": "URL copiée",
    "downloadHint": "Réponse non HTML : ouvrez le cadre de contenu ou naviguez à nouveau.",
    "engineLabel": "Moteur",
    "engineProxy": "Procuration",
    "engineBrowser": "Véritable navigateur",
    "engineSwitchHint": "Le changement de moteur ouvre une nouvelle session.",
    "needChrome": "Le vrai navigateur nécessite le système Chrome/Chromium (ou définit YSK_HOST_BROWSE_CHROME). Utiliser un proxy autrement.",
    "engineBrowserNeedChrome": "Véritable navigateur (Chrome non installé)",
    "egressHint": "Le site cible voit l'adresse sortante de ce serveur ({{host}}), pas votre ordinateur portable. Les cookies restent dans le pot de session du serveur.",
    "needChromeFallback": "Chrome indisponible – passage au moteur proxy.",
    "liveError": "Échec de la diffusion en direct",
    "liveWaiting": "Connexion du navigateur hôte…",
    "tabSettings": "Paramètres",
    "softwareNeeded": "Chrome / Chrome requis pour le vrai moteur de navigateur",
    "softwareHint": "Un clic installe la distribution Chromium via apt. Le binaire de Google Chrome est également détecté s'il est déjà présent. Nécessite root + YSK_EXECUTE=1.",
    "closeNoSession": "Pas encore de séance",
    "goInstallChrome": "Ouvrir l'onglet Logiciel",
    "settingsIntro": "Ces paramètres de panneau remplacent les variables d'environnement de processus pour Host Browse.",
    "settingsEngine": "Moteur par défaut",
    "engineAuto": "Auto",
    "settingsChromePath": "Chrome / Chemin Chrome",
    "settingsChromePathHint": "Vide = détection automatique. Exemple : /usr/bin/google-chrome",
    "settingsLoopback": "Autoriser le bouclage en mode intranet (127.0.0.1)",
    "settingsNoSandbox": "Chromium --pas de bac à sable (conteneurs uniquement)",
    "settingsSave": "Enregistrer les paramètres",
    "settingsSaved": "Paramètres de navigation de l'hôte enregistrés",
    "envHintsTitle": "Processus env (lecture seule ; les paramètres du panneau sont prioritaires lorsqu'ils sont définis)",
    "stream": {
      "label": "Qualité",
      "smooth": "Lisse",
      "balanced": "Équilibré",
      "sharp": "Pointu"
    },
    "zoom": {
      "label": "Zoom",
      "fit": "Ajuster",
      "fill": "Remplir"
    },
    "retryNav": "Réessayer la navigation",
    "retryLive": "Reconnecter le flux",
    "tryProxy": "Passer au moteur proxy",
    "err": {
      "LIVE_NO_FRAME": "Le flux a expiré : aucune trame reçue. Reconnectez-vous ou réessayez la navigation.",
      "LIVE_WS_FAIL": "La connexion en direct a échoué. Reconnectez le flux.",
      "SSRF_BLOCKED": "Cible bloquée par la politique de sécurité.",
      "BOT_CHALLENGE": "La cible peut nécessiter une vérification humaine ou bloquer l’automatisation. Terminez le défi à l'écran s'il est affiché.",
      "TIMEOUT": "Le délai de chargement a expiré. Veuillez réessayer.",
      "DNS_FAIL": "La résolution DNS a échoué.",
      "TLS_FAIL": "La connexion TLS/SSL a échoué.",
      "NAV_FAIL": "La navigation a échoué.",
      "CHROME_LAUNCH": "Impossible de démarrer l'hôte Chromium. Vérifiez les paramètres d'installation et de non-sandbox.",
      "SESSION_GONE": "Session expirée. Naviguez à nouveau.",
      "NEED_CHROME": "Chrome/Chrome est requis."
    },
    "home": "Maison",
    "bookmark": "Signet",
    "bookmarkAdd": "Ajouter ou supprimer un signet",
    "bookmarkList": "Liste de favoris",
    "bookmarks": "Signets",
    "history": "Historique",
    "bookmarkToggled": "Favoris mis à jour",
    "newTab": "Nouvel onglet",
    "fullscreen": "Plein écran",
    "mediaNote": "Véritable navigateur : la vidéo est diffusée en streaming ; l'audio n'est pas encore ponté vers le panneau (phase 2).",
    "isolationNote": "Un vrai navigateur crée un utilisateur Linux éphémère pour Chrome ; quitter la page ou le délai d'inactivité détruit cet utilisateur.",
    "resumeHint": "Reprendre la session précédente ({{count}} onglets)",
    "resumeHintDetail": "Reprendre la session précédente ({{count}} onglets) · {{url}} · {{when}}",
    "resumeHintOwned": "Reprendre la dernière navigation pour {{user}} ({{count}} onglets) · {{url}} · {{when}}",
    "clearSessionData": "Effacer les données de la session",
    "clearSessionConfirm": "Cela supprime l’instantané de reprise de la session de navigation précédente. Vous ne pourrez pas restaurer ces onglets par la suite.",
    "resume": "CV",
    "resumeDismiss": "Rejeter",
    "resumeDone": "Reprise de la séance",
    "settingsSafety": "Sécurité de la navigation",
    "settingsSafetyHint": "Bloque strictement les hôtes les plus risqués ; La version décontractée permet des cibles intranet plus larges. Ne désactive pas les protections SSRF pour les métadonnées cloud.",
    "safetyStrict": "Strict",
    "safetyStandard": "Standard",
    "safetyRelaxed": "Détendu",
    "settingsBlockHosts": "Suffixes d'hôtes bloqués",
    "settingsBlockHostsHint": "Un nom d'hôte ou un suffixe par ligne (par exemple malware.test). Les correspondances exactes et suffixes sont bloquées.",
    "settingsAllowDangerousDownloads": "Autoriser les téléchargements à haut risque (exe/scripts)",
    "settingsAudioBridge": "Ponter l'audio de la page vers le panneau",
    "settingsAudioBridgeHint": "Diffuse l'audio Chrome de l'hôte dans ce navigateur. Certains sites nécessitent un clic pour déverrouiller la lecture.",
    "downloads": "Téléchargements",
    "downloadsEmpty": "Aucun téléchargement dans cette session",
    "downloadReady": "Prêt",
    "downloadBlocked": "Bloqué",
    "downloadPending": "En attente",
    "downloadFailed": "Échoué",
    "downloadSave": "Sauvegarder",
    "audioUnlock": "Activer le son",
    "audioUnlockHint": "Cliquez pour déverrouiller la lecture audio dans cet onglet",
    "audioUnlocked": "Audio débloqué",
    "audioPlaying": "Lecture audio",
    "audioNeedsUnlock": "L'audio doit être déverrouillé",
    "audioBridgedHint": "L'audio de la page est ponté depuis le navigateur hôte",
    "audioNotBridged": "Audio désactivé",
    "audioNotBridgedHint": "Activez le pont audio dans Paramètres pour entendre la page",
    "mediaPolicyTitle": "Médias dans un vrai navigateur",
    "mediaVideoLabel": "Vidéo",
    "mediaVideoDesc": "Rendu sur l'hôte et diffusé sous forme d'images dans le panneau.",
    "mediaAudioLabel": "Audio",
    "mediaAudioDesc": "Pont facultatif depuis l'hôte Chrome ; peut nécessiter un clic de déverrouillage.",
    "mediaPolicyLabel": "Politique",
    "mediaPolicyDesc": "Les téléchargements et la lecture automatique suivent les paramètres de sécurité et de téléchargement ci-dessus.",
    "frameBlocked": "La page n'a pas pu être affichée dans le cadre du panneau.",
    "historyEmpty": "Aucun historique dans cette session.",
    "bookmarksEmpty": "Aucun favori pour l'instant.",
    "closeSessionHint": "Efface les cookies pour cette session de navigation. Les signets restent.",
    "envUnset": "pas réglé",
    "envPanelValue": "panneau : {{value}}",
    "envColVar": "Variable",
    "envColHost": "Processus hôte",
    "envColPanel": "Réglage du panneau",
    "envColEffective": "Effectif",
    "settingsNoSandboxWarn": "Désactive le bac à sable Chromium. À utiliser uniquement dans un conteneur approuvé. S'applique à la prochaine session de navigateur réel.",
    "settingsDangerDlWarn": "Permet les téléchargements d'exécutables et de scripts via le navigateur hôte. Confirmez que vous en avez besoin.",
    "settingsDangerConfirmTitle": "Activer un paramètre de navigation à haut risque ?"
  },
  "legal": {
    "hubTitle": "Mentions légales",
    "hubSub": "Conditions d’utilisation, politique de confidentialité et clause de non-responsabilité de YSK Server",
    "terms": "Conditions d’utilisation",
    "privacy": "Politique de confidentialité",
    "disclaimer": "Clause de non-responsabilité",
    "updated": "Dernière mise à jour {{date}}",
    "englishPrevails": "Langues officielles : anglais et chinois écrit de Hong Kong. En cas de divergence, l’anglais prévaut.",
    "notOfficialLocale": "La langue d’affichage n’est pas une langue juridique officielle. Le texte contraignant ci-dessous est l’anglais, sauf si vous le changez.",
    "officialLang": "Texte officiel",
    "officialEn": "Anglais",
    "officialZh": "繁體中文（香港）",
    "signIn": "Connexion",
    "mitNote": "Le code source est sous licence MIT. Ces pages sont des conditions d’utilisation supplémentaires.",
    "backToIndex": "Tous les documents juridiques"
  },
  "listToolbar": {
    "searchPlaceholder": "Rechercher…",
    "searchAria": "Rechercher dans la liste",
    "clearSearch": "Effacer la recherche",
    "clearAll": "Effacer les filtres",
    "resultCount": "{{count}} résultats",
    "showingOf": "Affichage de {{shown}} sur {{total}}",
    "activeFilters": "{{count}} filtres actifs",
    "noResults": "Aucune correspondance",
    "noResultsHint": "Essayez un autre mot-clé ou effacez les filtres.",
    "searching": "Recherche…",
    "emptyChip": "Aucun élément dans ce filtre"
  },
  "logViewer": {
    "banIpTitle": "Bannir {{ip}} dans Protection",
    "filter": "Filtre",
    "filterPh": "Mot clé",
    "levels": "Niveaux",
    "wrap": "Envelopper",
    "follow": "Suivre",
    "download": "Télécharger",
    "nextError": "Erreur suivante",
    "prevError": "Erreur précédente",
    "lines": "{{n}} lignes",
    "shown": "{{n}} affiché",
    "errors": "Euh {{n}}",
    "warnings": "Avertir {{n}}",
    "all": "Tous",
    "empty": "Aucune ligne de journal"
  },
  "login": {
    "title": "Connexion à YSK Server",
    "subtitle": "Console serveur",
    "username": "Nom d’utilisateur",
    "password": "Mot de passe",
    "submit": "Se connecter",
    "failed": "Échec de la connexion. Vérifiez le nom d’utilisateur ou le mot de passe.",
    "footer": "Un produit de YSK Limited",
    "totpRequired": "La 2FA est activée pour ce compte. Saisissez le code à 6 chiffres.",
    "totpLabel": "Code d’authentification",
    "totpHint": "Code à 6 chiffres de votre application d’authentification",
    "submitting": "Connexion…",
    "sessionExpired": "Session expirée ; reconnectez-vous",
    "newPassword": "Nouveau mot de passe",
    "newPasswordAgain": "Confirmer le nouveau mot de passe",
    "changePassword": "Changer le mot de passe",
    "passwordMismatch": "Les mots de passe ne correspondent pas",
    "passwordChanged": "Mot de passe mis à jour"
  },
  "logs": {
    "catSystem": "Fichiers système",
    "catMail": "Messagerie",
    "catSecurity": "Sécurité",
    "catApp": "Application",
    "catOther": "Autre",
    "journalService": "Unité Journal",
    "unavailable": "Indisponible",
    "compressed": " · compressé",
    "noLogFileYet": "(pas encore de fichier journal)",
    "afterDeploy": "Apparaît après le déploiement",
    "logsLoaded": "Journaux chargés",
    "sseFailed": "Échec SSE, bascule vers le sondage",
    "sseInterrupted": "SSE interrompu",
    "settingsSaved": "Paramètres enregistrés",
    "exportedJsonl": "JSONL exporté",
    "exported": "Exporté",
    "bookmarkSaved": "Signet enregistré",
    "title": "Centre de journaux",
    "fullAccess": "Accès complet",
    "nonRoot": "Non-racine",
    "noExecute": "Pas d'EXECUTE",
    "error": "Erreur",
    "projectLog": "Journaux du projet",
    "filesCount": "{{count}} fichier(s)",
    "tabExplore": "Explorer",
    "tabMaint": "Entretien",
    "tabSettings": "Paramètres",
    "tabAbout": "À propos",
    "sources": "Sources de journaux",
    "filterPlaceholder": "Filtrer unité / fichier…",
    "filterSources": "Filtrer les sources",
    "noProjectLogs": "Aucun journal de projet — apparaissent après le déploiement",
    "noMatchSources": "Aucune source correspondante",
    "projectPrefix": "Projet · ",
    "timeRange": "Plage temporelle",
    "unlimited": "Illimité",
    "priority": "Priorité",
    "all": "Tous",
    "keywordIp": "Mot-clé / IP…",
    "custom": "Personnalisé",
    "copied": "Copié",
    "truncated": " · tronqué",
    "following": " · suivi en direct",
    "followingSse": " · suivi en direct (SSE)",
    "loadingSources": "Chargement des sources…",
    "pickSource": "Choisissez une source à gauche, ou un raccourci · puis Interroger",
    "noRowsInWindow": "Aucun enregistrement dans cette fenêtre horaire",
    "showInactiveUnits": "Afficher les unités inactives",
    "sseNeedFollow": "Activez d'abord le suivi – SSE est uniquement destiné à la queue en direct",
    "maintOverview": "Aperçu de la maintenance",
    "executable": "Exécutable",
    "restricted": "Restreint",
    "needRootExecute": "Nécessite root+EXECUTE",
    "retention": "Rétention",
    "retentionHint": "ex. 7d · 14d · 30d",
    "defaultLines": "Lignes par défaut",
    "followInterval": "Intervalle de suivi",
    "maxBytes": "Octets max",
    "maskSecrets": "Masquer les secrets",
    "defaultVacuumDays": "Jours de vacuum par défaut",
    "d7": "7 jours",
    "d14": "14 jours",
    "d30": "30 jours",
    "d90": "90 jours",
    "journalAlerts": "Alertes journal",
    "autoVacuum": "Vacuum automatique",
    "deleted": "Supprimé",
    "bookmarkDeleted": "Signet supprimé",
    "opsResult": "Résultat ops",
    "saveBookmark": "Enregistrer le signet",
    "bookmarkNamePrompt": "Nom de la requête actuelle",
    "query": "Requête",
    "follow": "Suivre",
    "export": "Exporter",
    "vacuum": "Vide",
    "loadFailed": "Échec du chargement",
    "projectLogsLink": "Projet → Journaux",
    "projectLogsDesc": " — raccourci par site + lien profond",
    "queryFollow": "Requête et suivi",
    "queryFollowDesc": "Lignes par défaut, intervalle de suivi, plafond de réponse sur Explorer",
    "retentionAlerts": "Rétention et alertes",
    "retentionAlertsDesc": "valeurs vacuum par défaut, alertes disque journal, fenêtres de nettoyage auto",
    "dailyNeedRoot": "Quotidien (nécessite root + EXECUTE)",
    "customAllow": "Chemins autorisés personnalisés",
    "customAllowDesc": "Uniquement /var/log ou /run/log · rejeter .ssh, clés, /etc",
    "pathsCount": "{{n}} chemin(s)",
    "noCustomPaths": "Aucun chemin personnalisé pour l'instant",
    "bookmarks": "Signets",
    "bookmarksDesc": "Filtres Explorer courants ; l'ouverture bascule vers Explorer et applique la source",
    "noBookmarks": "Aucun signet — interrogez sur Explorer puis Enregistrer le signet",
    "settingsWriteNote": "Les paramètres s'écrivent dans la BD du panneau ; le vacuum auto vérifie la fenêtre toutes les 15 minutes.",
    "saveSettings": "Enregistrer les paramètres",
    "vacuumDaysQ": "Vacuum temps {{days}} ?",
    "vacuumSizeQ": "Vacuum taille 500M ?",
    "vacuumDesc": "journalctl vacuum supprime définitivement les anciens journaux.",
    "vacuumRequested": "Vacuum demandé",
    "vacuumSizeRequested": "Vacuum taille demandé",
    "scLogs": "Observer journal / fichiers / projets",
    "scProtection": "Réponse aux incidents, bannissement auto (cliquer IP)",
    "shortcuts": "Raccourcis",
    "projectsOnly": "Projets uniquement",
    "filesTitle": "{{n}} fichier(s)",
    "bookmarksLabel": "Signets",
    "filter": "Filtrer",
    "followSec": "Suivre {{sec}}s",
    "wrap": "Retour à la ligne",
    "bookmark": "Signet",
    "standby": "Inactif",
    "partialFail": "Partiel / échoué",
    "lines": "{{n}} lignes",
    "followingSseDyn": " · suivi{{sse}}",
    "ipBan": "IP → bannir",
    "vacuumNote": "Libérer l'espace disque de systemd-journal. Sans EXECUTE → bloqué, pas de faux succès.",
    "vacuumTime": "Durée du vacuum",
    "vacuumNeedRetention": "Saisissez d’abord une fenêtre de conservation (ex. 14d)",
    "vacuumNeedConfirm": "Confirmation requise — supprime d’anciens journaux journal",
    "vacuumSizeNeedConfirm": "Confirmation requise — plafonne l’usage disque de journal",
    "vacuumHint": "Conserver ≥7 jours recommandé ; re-sonder le disque après.",
    "logrotateStatus": "État de logrotate système (sonde en lecture seule)",
    "logrotateMissing": "Fichier d'état absent ou illisible — vérifier le paquet logrotate dans la matrice des services",
    "relatedOps": "Ops associées",
    "relatedOpsDesc": "Observation des journaux vs réponse aux incidents",
    "scLogsLine": "Observer journal / fichiers / projets",
    "scProtLine": "Réponse aux incidents, bannissement auto (cliquer IP)",
    "journalVacuumTitle": "Vacuum du journal",
    "journalSection": "Journal",
    "sseLabel": "SSE",
    "logrotateLabel": "logrotation",
    "srcNginx": "nginx",
    "srcSsh": "chut",
    "srcfail2ban": "échec2ban",
    "srcFail2ban": "échec2ban",
    "srcAuthLog": "auth.log",
    "srcNginxError": "erreur nginx",
    "srcLetsEncrypt": "chiffrons",
    "groupJournal": "Journal",
    "groupVarLog": "/var/log",
    "prioErr": "euh+",
    "prioWarn": "avertir+",
    "prioInfo": "infos+",
    "vacuumSize": "Limité à 500 Mo",
    "logrotateNoStatus": "Pas encore de fichier d'état de rotation (normal s'il n'a jamais été exécuté).",
    "autoVacuumOff": "Le nettoyage automatique est désactivé. Le temps n'est pas utilisé jusqu'à ce que vous l'activiez.",
    "aboutAllowlist": "Explore ne peut lire que les unités de journal et les chemins /var/log sur liste autorisée. Les chemins d’hôtes arbitraires ne sont pas proposés.",
    "aboutCustomPath": "Ajoutez un chemin personnalisé dans Paramètres (uniquement /var/log ou /run/log). Ensuite, ouvrez-le depuis Explorer.",
    "vacuumSizeAlreadyBelow": "L’usage actuel est déjà sous le plafond ; généralement rien n’est supprimé.",
    "vacuumSizeNoopDesc": "Le journal est déjà sous 500 Mo. vacuum --size=500M s’exécute quand même et ne supprime généralement rien.",
    "journalDiskHint": "Usage actuel de systemd-journald (journal actif). N’inclut pas les fichiers rotés sous /var/log.",
    "varLogDiskHint": "Estimation de /var/log, y compris les fichiers rotés.",
    "queryFirst": "Interrogez d’abord",
    "errorsWindowHint": "Erreurs récentes de la dernière sonde de présentation (pas de mise à jour en direct lorsque vous changez d'onglet)",
    "sourceCount": "{{shown}} affiché",
    "sourceUnavailable": "Cette source n'a pas encore produit de journal",
    "sourceNoLog": "Pas encore de journal",
    "projectSourcesTitle": "{{n}} source(s) (fichiers + journal)",
    "logrotatePath": "Chemin",
    "logrotateLast": "Dernière rotation",
    "exportJsonl": "Exportation JSONL",
    "sseLive": "(diffusion en direct)",
    "logrotateExpand": "Afficher {{n}} plus",
    "logrotateCollapse": "Afficher moins",
    "logrotateVersion": "Version d'état {{v}}"
  },
  "metrics": {
    "alert": {
      "memory_high": "Mémoire élevée",
      "load_high": "Charge élevée",
      "disk_high": "Disque élevé"
    },
    "loadFailed": "Échec du chargement des métriques",
    "projectUsageFailed": "Échec du chargement de l'utilisation des projets",
    "procListFailed": "Échec de la liste des processus",
    "streamEnded": "Flux terminé ({{reason}})",
    "streamOpenFailed": "Impossible d'ouvrir le flux",
    "signalFailed": "Échec du signal",
    "detailFailed": "Impossible de charger les détails",
    "alertCount": "{{count}} alerte(s)",
    "attention": "Nécessite une attention",
    "normal": "OK",
    "disk": "Disque",
    "alerts": "Alertes",
    "auto5s": "Automatique 5s",
    "hostSettings": "Paramètres de l'hôte",
    "loading": "Chargement des métriques…",
    "tabs": {
      "overview": "Vue d'ensemble",
      "live": "Processus en direct",
      "disk": "Disque",
      "projectUsage": "Utilisation des projets",
      "alerts": "Alertes"
    },
    "load": "Charge",
    "load1m": "Charge 1m",
    "uptime": "Temps de disponibilité",
    "filterCpu5": "≥5 % du processeur",
    "filterMem5": "≥5% de mémoire",
    "signalHint": "Sélectionnez un processus, puis envoyez TERM ou KILL.",
    "signalFromRow": "Sélectionnez ce processus pour TERM / KILL",
    "selectForSignal": "Sélectionner",
    "forceKillTitleNamed": "TUER LE PID {{pid}} ({{cmd}}) ?",
    "sendSigTitleNamed": "Envoyer TERM au PID {{pid}} ({{cmd}}) ?",
    "min1": "1m",
    "min5": "5m",
    "min15": "15m",
    "loadHint": "Relatif à {{cpus}} CPU ; au-dessus de 1,0× peut mettre en file d'attente.",
    "memory": "Mémoire",
    "total": "Total",
    "available": "Disponible",
    "mainDisk": "Disque racine",
    "path": "Chemin",
    "diskReadFail": "Impossible de lire le disque",
    "viewAllMounts": "Voir les {{count}} points de montage →",
    "nAlerts": "{{count}} alertes",
    "details": "Détails",
    "noThresholdAlerts": "Aucune alerte de seuil mémoire / charge / disque",
    "projectDisk": "Disque des projets (du réel)",
    "viewAllProjectUsage": "Voir toute l'utilisation des projets →",
    "loadProjectDisk": "Charger l'utilisation disque des projets (du réel) →",
    "followSse": "Suivre (SSE)",
    "interval": "Intervalle",
    "sort": "Trier",
    "rows": "Lignes",
    "onceQuery": "Requête ponctuelle",
    "procSearchPh": "Rechercher PID / USER / COMMAND",
    "procSearchAria": "Rechercher des processus",
    "filterAll": "Tous",
    "filterMine": "Non système",
    "selectedN": "{{count}} sélectionné(s)",
    "showOf": " · affichage {{shown}}/{{total}}",
    "topLoading": "Chargement du résumé top… (double échantillon /proc/stat)",
    "topAria": "résumé top",
    "perCore": "Par cœur",
    "noPerCore": "Aucune donnée par cœur",
    "uptimeDays": "{{d}} jours, {{h}}:{{m}}",
    "used": "Utilisé",
    "free": "Libre",
    "signal": "Signal",
    "kill": "Tuer",
    "send": "Envoyer",
    "procDetail": "Détail du processus",
    "refreshProc": "Actualiser les processus",
    "noProcs": "Aucun processus",
    "noProcsFilter": "Aucun processus ne correspond aux filtres",
    "mounts": "Montages",
    "fs": "Système de fichiers",
    "mount": "Montage",
    "size": "Taille",
    "usage": "Utilisation",
    "project": "Projet",
    "quota": "Quota",
    "ratio": "Partager",
    "unlimited": "Illimité",
    "noProjects": "Aucun projet pour le moment",
    "noProjectsDesc": "Créez un projet pour voir ici l’utilisation réelle du home",
    "usageNote": "Utilisation via du local (non estimée). Le quota est une limite souple du plan de contrôle ; un setquota dur nécessite apply-to-host.",
    "thresholdAlerts": "Alertes de seuil",
    "alertsBuiltinOnly": "Seuils intégrés CPU/mémoire/disque uniquement. Pas de courrier électronique, de webhook ou de canal Slack.",
    "lastEvaluated": "Dernière vérification",
    "alertsOkTitle": "Tout est clair",
    "alertsOkDesc": "Aucune alerte de seuil mémoire / charge / disque.",
    "cpu": "CPU",
    "command": "Commande",
    "user": "Utilisateur",
    "clearSelection": "Effacer la sélection",
    "batchSignal": "Signal groupé",
    "liveHint": "Liste de processus en direct (SSE ou poll). Les signaux nécessitent root + YSK_EXECUTE.",
    "signalTo": "Signal {{sig}} → PID {{pid}}",
    "procAlive": "Processus toujours actif (kill -0 ok)",
    "procGone": "Processus terminé",
    "procTable": "Processus ({{count}}{{more}})",
    "procTableDesc": "liste ps · sélectionner pour TERM/KILL (nécessite YSK_EXECUTE)",
    "selectAllAria": "Sélectionner tous les filtrés",
    "selectPidAria": "Sélectionner le PID {{pid}}",
    "controlPlane": "Plan de contrôle",
    "controlPlaneNoSignal": "Le processus du plan de contrôle ne peut pas être signalé",
    "protectedPid": "PID 1 / init / systemd ne peut pas être signalé depuis le panneau",
    "sigTermTitle": "Envoyer SIGTERM (demander au processus de quitter)",
    "sigKillTitle": "Envoyer SIGKILL (force kill – ne peut pas être attrapé)",
    "batchTerm": "TERM",
    "batchKill": "KILL",
    "rawTopLabel": "Haut brut (non traduit)",
    "followSseLabel": "Suivre (diffusion en direct)",
    "alertsReadOnly": "Seuils intégrés CPU/mémoire/disque uniquement. Pas de courrier électronique, de webhook ou de canal Slack.",
    "alertsGoNotifications": "Ouvrir le centre de notifications",
    "lastCheck": "Dernière vérification",
    "rawTopHint": "Sortie top(1) non traduite",
    "detailShort": "Informations",
    "procUnavailable": "Impossible d’obtenir les processus",
    "noProcData": "Aucune donnée de processus pour l’instant",
    "noProcFilter": "Aucun processus ne correspond aux filtres",
    "clickOnceOrFollow": "Lancer une requête ponctuelle ou activer le suivi",
    "liveFootnote": "Comme top en SSH : double échantillon /proc/stat pour %Cpu (par cœur = « 1 » de top), Mem/Swap, Tasks ; table des processus via ps. Pas un PTY interactif. Kill nécessite YSK_EXECUTE ; le PID 1 et le plan de contrôle sont protégés par défaut.",
    "forceKillTitle": "Forcer la fin du PID {{pid}} (SIGKILL)",
    "sendSigTitle": "Envoyer SIG{{sig}} au PID {{pid}}",
    "forceKillDesc": "Ne peut pas être intercepté ; risque de perte de données. Commande : {{cmd}}",
    "termDesc": "Le processus peut se nettoyer et se terminer. Commande : {{cmd}}",
    "forceKillBtn": "Forcer KILL",
    "sendTermBtn": "Envoyer TERM",
    "procPidTitle": "Processus PID {{pid}}",
    "readingProc": "Lecture de /proc…",
    "applyRenice": "Appliquer renice",
    "reniceHint": "-20 le plus élevé · 19 le plus bas (nécessite EXECUTE)",
    "noData": "Aucune donnée",
    "shareOfMeasured": "{{pct}}% de la mesure",
    "mountsTitle": "Points de montage disque ({{count}})",
    "mountsDesc": "df -P -B1 réel (tmpfs filtrés)",
    "noMounts": "Aucune liste de montages",
    "noMountsDesc": "df indisponible ou filtré. Le disque racine reste sur l’aperçu.",
    "seeProjectUsage": "L’usage des home projets est dans l’onglet Utilisation des projets (du réel · {{size}})",
    "measuringDu": "Mesure des home projets (du)…",
    "projectUsageTitle": "Utilisation disque des projets ({{count}})",
    "projectUsageDesc": "du réel · total {{total}} · {{at}}",
    "projectUsageDescEmpty": "Exécuter du sur chaque home_dir de projet",
    "remeasure": "Remesurer",
    "usageNoteFull": "Utilisation via du local (non estimée). Le quota est une limite souple du plan de contrôle ; un setquota dur nécessite apply-to-host.",
    "sseNeedLogin": "Non connecté ; impossible d’ouvrir le SSE",
    "sseSessionExpired": "Non connecté ou session expirée ; impossible d’ouvrir le SSE",
    "sseHttpError": "flux HTTP {{status}}",
    "colFilesystem": "Système de fichiers",
    "colMount": "Monter",
    "colSize": "Taille",
    "colUsed": "Utilisé",
    "colAvail": "Disponible",
    "colUsePct": "Utilisé %",
    "colHome": "Maison",
    "usageNoteLink": "Quota souple du plan de contrôle. Appliquez des limites strictes dans l’onglet Isolation du projet.",
    "shareNoQuotaHint": "Sans quota, la part n’est pas un pourcentage. Définissez-la dans l’onglet Isolation du projet.",
    "setQuotaLink": "Définir le quota",
    "unusualHome": "Chemin inhabituel",
    "unusualHomeHint": "Pas une maison de projet /home/…. L'isolement canonique est /home/ysk-server-{id}."
  },
  "migrate": {
    "tabInventory": "Inventaire",
    "tabTarget": "Cible",
    "tabRun": "Exécuter",
    "tabDone": "Fait",
    "refreshFailed": "Échec de l’actualisation",
    "migrateIncomplete": "Migration incomplète",
    "requestFailed": "Échec de la demande de migration",
    "title": "Migration complète de l’hôte",
    "subtitle": "Plan de contrôle source → copie complète vers le nouvel hôte. Ensuite, ne changer que l’IP/DNS public ; comptes, chemins et projets restent identiques.",
    "inventorying": "Inventaire en cours",
    "inventoried": "Inventorié",
    "inventoriedWarn": "Inventaire · {{n}} avertissements",
    "inventoriedOrphans": "Inventorisé · {{n}} maisons restantes",
    "inventoriedWarnAndOrphans": "Inventaire · {{w}} avertissements · {{n}} reste",
    "inventoryFailed": "Échec de l’inventaire",
    "pendingInventory": "Inventaire en attente",
    "projects": "Projets",
    "mailboxes": "Boîtes mail",
    "users": "Utilisateurs",
    "software": "Logiciels",
    "jobs": "Tâches",
    "notFound": "Introuvable",
    "wizard": "Assistant de migration",
    "jobLog": "Historique des tâches",
    "about": "À propos",
    "steps": "Étapes de migration",
    "sourceInventory": "Inventaire source",
    "sourceInventoryDesc": "Analyse en lecture seule du plan de contrôle et des chemins projets ; ne modifie pas le système",
    "inventoryRunning": "Inventaire de cet hôte…",
    "host": "Hôte",
    "projectHome": "Projets / home",
    "needSoftware": "Logiciels à installer",
    "noInventory": "Aucun inventaire pour l’instant",
    "noInventoryHint": "Utilisez Actualiser (en haut à droite) pour analyser l’état de l’hôte et les tâches",
    "targetHost": "Hôte cible",
    "targetHostDesc": "SSH root uniquement ; le mot de passe sert uniquement à cette requête et n’est pas stocké",
    "sshTarget": "Cible SSH",
    "sshPort": "Port SSH",
    "targetDataDir": "dataDir cible",
    "authMethod": "Méthode d’authentification",
    "rootPassword": "Mot de passe root",
    "notPersisted": "Non conservé",
    "passwordNotStored": "Le mot de passe est utilisé uniquement pour cette session SSH et n'est pas enregistré sur le disque.",
    "overwriteDanger": "L'écrasement remplacera les données YSK existantes sur la cible. Cela ne peut pas être annulé à partir du panneau.",
    "outboundIdentity": "Identité sortante dans le coffre",
    "dryRun": "Précontrôle dry-run",
    "startMigrate": "Démarrer la migration complète de l’hôte",
    "needSshTarget": "Saisir la cible SSH",
    "needMaintWindow": "Vérifier la fenêtre de maintenance",
    "needRootPassword": "Saisir le mot de passe root",
    "needRequired": "Renseigner les champs obligatoires",
    "result": "Résultat de la migration",
    "blocked": "Bloqué",
    "failed": "Échoué",
    "detail": "Détails",
    "jobsTitle": "Tâches de migration ({{count}})",
    "jobsDesc": "État sous dataDir/migrate/ ;",
    "phase": "Phase",
    "jobPhase": "Emploi {{id}} · {{phase}}",
    "phaseName": {
      "failed": "Échoué",
      "done": "Fait",
      "running": "En cours d'exécution",
      "queued": "En file d'attente",
      "cancelled": "Annulé"
    },
    "target": "Cible",
    "updated": "Mis à jour",
    "notes": "Remarques",
    "noJobs": "Aucune tâche de migration pour l’instant",
    "noJobsHint": "Les tâches apparaissent après un dry-run ou une migration complète dans l’assistant.",
    "confirmTitle": "Confirmer la migration complète de l’hôte",
    "confirmDesc": "Va rsync et amorcer {{target}}",
    "confirmStart": "Confirmer le démarrage",
    "cancel": "Annuler",
    "success": "Succès",
    "unfilledTarget": "(aucune cible)",
    "restartApiHint": "Si vous venez de déployer une nouvelle version, redémarrez l’API (",
    "afterRestart": ") puis Actualiser.",
    "inventoryWarnings": "Avertissements d’inventaire ({{count}})",
    "orphanHomesHint": "Restes de maisons du projet (pas dans le magasin). Supprimez-les uniquement après avoir confirmé qu'ils ne sont pas utilisés.",
    "orphanHomesTitle": "Restes de maisons du projet ({{count}})",
    "orphanHomesSummary": "{{count}} le(s) chemin(s) sur le disque ne sont pas dans le magasin. Sauvegardez d’abord en cas de doute, puis supprimez les chemins inutilisés.",
    "orphanColHome": "Maison",
    "orphanColModified": "Modifié",
    "orphanColEntries": "Entrées",
    "orphanEntries": "{{n}} entrées de niveau supérieur dans le répertoire",
    "orphanKpi": "Restes",
    "sourceOs": "OS",
    "sourceDataDir": "dataDir",
    "sourceDbRedis": "Bases de données / Redis",
    "sourceDbRedisValue": "{{db}} bases de données · {{redis}} Redis",
    "orphanRemove": "Supprimer les restes de la maison",
    "orphanRemoveTitle": "Supprimer l'accueil du projet restant ?",
    "orphanRemoveDesc": "Supprimez définitivement {{path}} du disque. Ce n'est pas un projet de magasin. Nécessite YSK_EXECUTE=1.",
    "orphanRemovePhrase": "Saisissez DELETE pour confirmer.",
    "orphanRemoveNeedConfirm": "Confirmation requise",
    "orphanBackupFirst": "Sauvegardez d'abord (ouvrez les sauvegardes)",
    "orphanMtime": "Dernière modification {{at}}",
    "expandAllWarnings": "Afficher tous les {{n}} avertissements",
    "collapseWarnings": "Afficher moins",
    "moreWarnings": "…et {{n}} de plus",
    "authPassword": "mot de passe root (passer à une clé après l’installation de la clé temporaire)",
    "authIdentity": "identityId du coffre d’identité SSH",
    "authAgent": "Agent / clé local par défaut",
    "confirmMaint": "Confirmer la fenêtre de maintenance",
    "confirmMaintDesc": "· La source se met brièvement en pause pour un dump cohérent (requis pour une migration réelle)",
    "allowOverwrite": "Autoriser l’écrasement des données YSK existantes sur la cible",
    "allowOverwriteDesc": "· Requis si la cible a déjà ysk.json",
    "dryRunOnly": "Dry-run uniquement",
    "dryRunOnlyDesc": "· Inventaire + précontrôle uniquement ; pas de rsync ni d’écritures sur la cible",
    "executeNote": "L’hôte nécessite YSK_EXECUTE=1 et l’API root. Après la migration, mettez à jour les DNS A/AAAA et vérifiez le pare-feu cloud + le PTR mail.",
    "dnsCutover": "Basculement DNS (manuel)",
    "dnsCutoverDesc": "Pointez les A/AAAA de ces noms vers la nouvelle IP publique ;"
  },
  "multiCheck": {
    "customPlaceholder": "Code personnalisé",
    "searchPlaceholder": "Rechercher…",
    "emptyText": "Aucun élément correspondant",
    "removeTitle": "Cliquer pour retirer",
    "noneSelected": "Aucune sélection",
    "optionsAria": "Possibilités",
    "showingCapped": "Affichage des {{shown}} premiers sur {{total}} — utilisez la recherche pour affiner",
    "add": "Ajouter",
    "bulkAria": "Sélection groupée",
    "selectAll": "Tout sélectionner",
    "selectAllTitle": "Sélectionner les {{n}} éléments",
    "selectFiltered": "Sélectionner le filtre ({{n}})",
    "selectFilteredTitle": "Sélectionner les {{n}} résultats de recherche",
    "clearAll": "Tout effacer",
    "clearFiltered": "Effacer le filtre",
    "selectedCount": "{{n}} / {{total}} sélectionné(s)",
    "chipsCollapsed": "{{n}} sélectionné(s) — développer",
    "chipsCollapse": "Réduire"
  },
  "nav": {
    "dashboard": "Tableau de bord",
    "ai": "Tâches IA",
    "projects": "Projets",
    "security": "Sécurité du compte",
    "email": "E-mail",
    "files": "Fichiers",
    "system": "Application système",
    "updates": "Mises à jour",
    "agents": "Agents IA (exp.)",
    "login": "Connexion",
    "logout": "Déconnexion",
    "publicFiles": "Fichiers publics",
    "ftp": "FTPS",
    "ftpService": "FTPS",
    "mysql": "MySQL",
    "mysqlService": "Service MySQL",
    "mariadb": "MariaDB",
    "mariadbService": "Service MariaDB",
    "postgres": "PostgreSQL",
    "postgresService": "Service PostgreSQL",
    "redis": "Redis",
    "redisService": "Service Redis",
    "cluster": "Groupes",
    "dns": "DNS",
    "ssl": "Certificats SSL",
    "nginx": "Nginx",
    "node": "Node.js",
    "php": "PHP",
    "python": "Python",
    "go": "Go",
    "rust": "Rust",
    "protection": "Centre de défense",
    "firewall": "Pare-feu",
    "fail2ban": "fail2ban",
    "users": "Utilisateurs et paquets",
    "services": "Services",
    "metrics": "Métriques",
    "network": "Réseau",
    "logs": "Centre de journaux",
    "cron": "Cron",
    "backups": "Sauvegardes",
    "migrate": "Migration d'hôte",
    "systemd": "systemd",
    "readiness": "Disponibilité",
    "systemIndex": "Outils système",
    "sections": {
      "overview": "Vue d'ensemble",
      "sites": "Compte et sites",
      "mail": "E-mail",
      "files": "Fichiers et FTP",
      "databases": "Bases de données",
      "dnsSsl": "DNS et SSL",
      "runtimes": "Durées d'exécution",
      "security": "Sécurité",
      "system": "Système",
      "ai": "IA",
      "validators": "Validateurs",
      "containers": "Conteneurs"
    },
    "java": "Java",
    "kotlin": "Kotlin",
    "bun": "Bun",
    "software": "Logiciels",
    "terminal": "Terminal",
    "hostBrowse": "Parcourir les hôtes",
    "cdn": "CDN",
    "vpn": "VPN",
    "vnc": "VNC",
    "apache": "Apache",
    "bookmarkedProjects": "Projets favoris",
    "bookmarkedEmailDomains": "Domaines favoris",
    "bookmark": "Épingler à la barre latérale",
    "unbookmark": "Retirer de la barre latérale",
    "bookmarkPinned": "Épinglé",
    "bookmarkAdded": "Épinglé sur la barre latérale",
    "bookmarkRemoved": "Supprimé de la barre latérale",
    "btTracker": "BT Tracker",
    "support": "Soutien",
    "noAccessTitle": "Accès refusé",
    "noAccessDesc": "Votre rôle n’inclut pas cette page. Demandez à un administrateur si vous en avez besoin.",
    "backToDashboard": "Retour au tableau de bord",
    "validators": "Validateurs (Beta)",
    "docker": "Docker"
  },
  "network": {
    "title": "Interfaces réseau",
    "canMutate": "Modifiable",
    "readOnlyBlocked": "Lecture seule / bloqué",
    "statIfaces": "Interfaces",
    "statUp": "En haut",
    "oper": {
      "up": "En haut",
      "down": "Vers le bas",
      "unknown": "Inconnu",
      "loopback": "Toujours allumé",
      "loopbackHint": "Le bouclage est toujours disponible et ne peut pas être modifié.",
      "other": "Autre"
    },
    "statGateway": "Passerelle",
    "pageActions": "Actions de la page",
    "loadingSnap": "Chargement de l'instantané réseau…",
    "mutateHint": "Les modifications s'appliquent en direct ; peuvent être réinitialisées au redémarrage.",
    "cannotMutate": "Modification impossible : nécessite EXECUTE et root.",
    "tabs": {
      "ifaces": "Interfaces",
      "routes": "Itinéraires",
      "dns": "DNS",
      "advanced": "Avancé",
      "about": "À propos",
      "realip": "IP réelle / CDN"
    },
    "ifaceSummary": "{{count}} interface(s) · {{up}} UP",
    "noIfaces": "Aucune interface",
    "noIfacesDesc": "ip indisponible ou permission refusée",
    "colName": "Nom",
    "colStatus": "Statut",
    "ifaceOps": "Actions {{name}}",
    "routeTable": "Table de routage",
    "defaultGw": "Passerelle par défaut {{gw}}",
    "liveIpRoute": "ip route en direct",
    "noRoutes": "Aucune route",
    "colDest": "Destination",
    "addRoute": "Ajouter une route",
    "persistNm": "Enregistrer dans la connexion NetworkManager (persiste après redémarrage)",
    "ephemeralRoute": "Route ip live uniquement (peut disparaître au redémarrage)",
    "destPlaceholder": "default ou 10.0.0.0/8",
    "devOptional": "Dev (facultatif)",
    "defaultDev": "Sortie par défaut : {{dev}}",
    "saveNm": "Enregistrer (NetworkManager, persiste après redémarrage)",
    "ephemeralHint": "Décoché = ip route add live uniquement",
    "nmUnavailable": "NetworkManager n'est pas en cours d'exécution — seule une route en direct peut être ajoutée",
    "defaultRouteDownNeedName": "Il s'agit de la sortie de route par défaut. Tapez le nom de l’interface pour confirmer – le panneau peut se déconnecter.",
    "saveRoute": "Enregistrer la route",
    "dnsSettings": "Paramètres DNS",
    "dnsNmHint": "Écrit la connexion NM « {{conn}} » et se reconnecte (persistant)",
    "dnsCannotApply": "Impossible d'appliquer : connexion NM active + EXECUTE + root requis",
    "mode": "Mode",
    "connection": "Connexion",
    "source": "Source",
    "ignoreAutoDns": "ignore-auto-dns actuel",
    "ignoreYes": "oui (ignorer le DNS DHCP)",
    "ignoreNo": "non (suivre le DHCP)",
    "nameserverEditHint": "Ajouter/supprimer des serveurs ; l'application écrit NetworkManager et se reconnecte",
    "routerDns": "Routeur {{dns}}",
    "current": "Actuel",
    "serverList": "Liste des serveurs",
    "emptyDnsTitle": "Aucun serveur DNS pour l'instant",
    "emptyDnsDesc": "Cliquez sur « Ajouter un serveur » pour commencer",
    "keepOneRow": "Conservez au moins une ligne (vider puis supprimer)",
    "removeServer": "Supprimer ce serveur",
    "searchDomainsPlaceholder": "Facultatif, séparé par des espaces",
    "ignoreDhcpDns": "Ignorer le DNS auto DHCP (ipv4.ignore-auto-dns=yes)",
    "restoreDhcpHint": "« Restaurer le DNS DHCP » rend le contrôle au routeur",
    "noNmConnection": "Aucune connexion NM — ne modifiera pas aveuglément /etc/resolv.conf (pas de faux succès).",
    "needExecuteRoot": "Nécessite YSK_EXECUTE=1 et root pour les écritures réelles.",
    "resolveTest": "Test de résolution",
    "resolveTestDesc": "getent ahosts (résolution locale réelle)",
    "hostname": "Nom d'hôte",
    "testFailed": "Échec du test",
    "stackDetect": "Détection de la pile réseau locale",
    "available": "Disponible",
    "unavailable": "Indisponible",
    "persistNmCap": "Persistant (NM)",
    "ifaceDetail": "Interface {{name}}",
    "type": "Taper",
    "addresses": "Adresses",
    "noAddresses": "Aucune adresse",
    "ifaceAdjust": "Ajustement d'interface",
    "addIpTitle": "Ajouter une IP · {{name}}",
    "saveIp": "Enregistrer l'IP",
    "add": "Ajouter",
    "cidrPlaceholder": "ex. 10.0.0.5/24 ou 2001:db8::5/64",
    "saveIpHint": "Écrire la connexion +ipv4/ipv6.addresses et activer la connexion",
    "confirmIfaceName": "Saisissez le nom d'interface « {{name}} » pour confirmer",
    "deleteRouteTitle": "Supprimer la route ?",
    "deleteRouteNamed": "Supprimer l'itinéraire {{dst}} ?",
    "deleteRouteBody": "Supprimez {{dst}}{{via}}{{dev}} de la table de routage en direct.",
    "viaGw": "via {{gw}}",
    "onDev": "le {{dev}}",
    "deleteDefaultWarn": "— la suppression de default peut couper la connectivité.",
    "alsoRemoveNm": "Retirer aussi de la connexion NetworkManager (disparu après redémarrage)",
    "loadFailed": "Échec du chargement",
    "loadNetworkFailed": "Échec du chargement du réseau",
    "on": "Activé",
    "off": "Désactivé",
    "addServer": "Ajouter un serveur",
    "applyDns": "Appliquer le DNS",
    "restoreDhcpDns": "Restaurer le DNS DHCP",
    "test": "Tester",
    "refresh": "Actualiser",
    "hostSettings": "Paramètres de l'hôte",
    "protection": "Protection",
    "defaultEgressBadge": "Par défaut",
    "opsAria": "Actions {{name}}",
    "details": "Détails",
    "addIp": "Ajouter une IP",
    "reset": "Réinitialiser",
    "ephemeralOnly": "En direct uniquement",
    "saveRouteHint": "Enregistrer écrit la connexion NM + connection up ;",
    "deleteShort": "Suppr.",
    "resetForm": "Réinitialiser le formulaire",
    "applyDnsNotes": "Appliquer exécute nmcli connection modify + up ; une brève coupure est normale. Le stub 127.0.0.53 n’est pas écrit (resolved local).",
    "testResolve": "Tester la résolution",
    "loadRaw": "Charger la sortie brute",
    "hideRaw": "Masquer la sortie brute",
    "rawLoadedAt": "Chargé {{time}}",
    "confirmDown": "Confirmer Down",
    "linkDownTitle": "Mettez {{name}} hors ligne",
    "linkDownNeedConfirm": "Tapez le nom de l'interface pour confirmer",
    "defaultRouteDownWarn": "Cette interface est la sortie de la route par défaut ; la passer Down peut couper l’accès au panneau.",
    "deleteDefaultMayDrop": " — supprimer la route par défaut peut couper la connectivité.",
    "deleteDefaultPanelWarn": "La suppression de l'itinéraire par défaut peut abandonner cette session de panneau. Tapez DEFAULT pour confirmer.",
    "deleteDefaultNeedConfirm": "Confirmation requise — saisissez DEFAULT (peut couper ce panneau)",
    "deleteRouteNeedConfirm": "Confirmation requise",
    "typeDefaultToConfirm": "Tapez DEFAULT pour confirmer",
    "gateway": "Passerelle",
    "nameservers": "Serveurs de noms",
    "searchDomains": "Domaines de recherche",
    "backend": "Back-end",
    "cidr": "CIDR",
    "realip": {
      "title": "CDN / IP client réelle",
      "desc": "Restaurer l’IP du visiteur derrière le CDN ; ne faire confiance qu’aux CIDR de bordure.",
      "provider": "Fournisseur par défaut",
      "providerHint": "none = origine directe ; choisir le CDN lorsqu’on est derrière un edge.",
      "mode": "Mode de confiance",
      "modeSingle": "En-tête d’un seul fournisseur (recommandé)",
      "modeXff": "X-Forwarded-For + CIDR CDN fusionnés",
      "customCidrs": "CIDR de confiance supplémentaires",
      "customCidrsHint": "Un CIDR par ligne.",
      "lastRefresh": "Dernier rafraîchissement des CIDR",
      "active": "Par défaut actif",
      "republishHint": "Republier le Nginx du projet après l’enregistrement.",
      "refresh": "Actualiser les listes d’IP CDN",
      "refreshOk": "Listes CIDR actualisées",
      "providers": {
        "none": "Aucun (origine directe)",
        "cloudflare": "Flare nuageuse",
        "fastly": "Rapidement",
        "bunny": "Lapin CDN",
        "cloudfront": "AWS CloudFront",
        "azure_frontdoor": "Porte d'entrée azur",
        "gcore": "CDN Gcore",
        "custom": "Proxys personnalisés"
      },
      "needProvider": "Choisissez un fournisseur CDN avant de récupérer sa liste IP.",
      "spoofWarn": "Faire confiance au mauvais CIDR permet aux clients d'usurper les en-têtes X-Forwarded-For / CDN comme adresse IP."
    },
    "linkUp": "En haut",
    "linkDown": "Vers le bas",
    "linkDownDefault": "Itinéraire par défaut vers le bas",
    "loopbackImmutable": "Le bouclage ne peut pas être modifié",
    "operUnknownHint": "Le noyau n'a pas signalé UP/DOWN (commun pour lo). L'interface est toujours utilisable.",
    "persistNmHint": "Persistant signifie que les modifications peuvent survivre au redémarrage via NetworkManager."
  },
  "nginx": {
    "pillSites": "{{count}} site(s)",
    "statSites": "Sites",
    "statSslFlag": "Indicateur SSL",
    "purgeOk": "Purgé",
    "projectSitesHint": "Les sites de projet (conf gérée) et les sites autonomes sont listés séparément. Modifier le Nginx du projet sous Projets → Réseau.",
    "purgeCache": "Purger le cache + recharger",
    "purgeCacheTitle": "Purger le cache Nginx et recharger ?",
    "purgeCacheDesc": "Efface le cache sur disque et recharge Nginx. Les sites en direct restent actifs.",
    "notInstalled": "Nginx n’est pas installé",
    "listTitle": "Sites ({{count}})",
    "listDesc": "Après la création, cliquez sur Appliquer pour synchroniser avec le système",
    "createSite": "+ Créer un site",
    "colServerName": "Nom du serveur",
    "colKind": "Taper",
    "kindProxy": "Proxy inverse",
    "kindStatic": "Statique",
    "kindPhp": "PHP-FPM",
    "colTarget": "Upstream / racine",
    "colStatus": "Statut",
    "emptyTitle": "Aucun site",
    "emptyDesc": "Utilisez « Créer un site » dans la barre d'outils de la liste ; puis Appliquer",
    "applyTitle": "Écrire les données du panneau et tenter sync + nginx -t + reload",
    "applyToSystem": "Synchroniser vers le système",
    "createTitle": "Créer un site Nginx",
    "createDesc": "Application requise après la création",
    "editTitle": "Modifier le site Nginx",
    "editDesc": "Application requise après l'enregistrement",
    "deleteTitle": "Supprimer le site ?",
    "deleteDesc": "Supprimer ce site ?",
    "deleteTitleNamed": "Supprimer le site {{name}} ?",
    "deleteDescNamed": "Supprimez {{name}} du panneau. Les sites appliqués supprimeront également leur configuration nginx gérée.",
    "invalidServerName": "Entrez un nom d'hôte valide (par exemple app.example.com).",
    "needUpstream": "L’amont est requis pour les sites proxy inverse.",
    "needRoot": "La racine du document est requise pour les sites statiques et PHP.",
    "serverNameHint": "server_name, ex. app.example.com",
    "kindLabel": "Type de site",
    "upstreamLabel": "En amont",
    "upstreamHint": "ex. 127.0.0.1:3000 ou http://backend:8080",
    "rootLabel": "Racine des documents",
    "rootHintPhp": "Racine des documents du projet PHP, ex. /var/www/app/public",
    "rootHintStatic": "Chemin absolu vers les fichiers statiques",
    "sslLabel": "Activer le bloc SSL",
    "sslDesc": "Émet listen 443 ssl ; lie les certificats depuis la page SSL lorsqu'ils sont prêts",
    "saveThenApply": "Après l'enregistrement, cliquez sur Appliquer pour écrire la config nginx",
    "statProjectSites": "Projets",
    "projectListTitle": "Sites du projet ({{count}})",
    "projectListDesc": "Conf gérée par le panneau depuis publish / goLive du projet — ouvrez l'onglet Réseau du projet pour modifier.",
    "colProject": "Projet",
    "colRuntime": "Durée d'exécution",
    "colConf": "Conf",
    "confWritten": "Écrit",
    "confMissing": "Aucun chemin",
    "projectEmptyTitle": "Aucun Nginx de projet pour le moment",
    "projectEmptyDesc": "Publiez Nginx depuis l'onglet Réseau d'un projet après le déploiement",
    "preview": "Aperçu",
    "openProject": "Ouvrir le projet",
    "projectPager": "Pages des sites du projet",
    "prevPage": "Précédent",
    "nextPage": "Suivant",
    "pageOf": "Page {{page}} / {{total}} · {{count}}",
    "projectConfEmpty": "(fichier conf vide)",
    "projectConfReadFail": "Échec de la lecture de la conf du projet",
    "projectPreviewPath": "{{path}}",
    "pageDesc": "Sites Nginx",
    "filterSource": "Source",
    "sourceAll": "Tous",
    "sourceProject": "Projet",
    "sourceStandalone": "Autonome",
    "colSource": "Source",
    "filterProject": "Filtré par projet",
    "globalSettings": "Paramètres globaux",
    "siteSettings": "Paramètres du site",
    "saveApply": "Enregistrer et postuler",
    "settingsSaved": "Enregistré",
    "setGzip": "Gzip",
    "setShowVersion": "Afficher la version du serveur",
    "setShowVersionDesc": "Désactivé = server_tokens désactivé",
    "setHttp2": "HTTP/2 (SSL)",
    "setBody": "Corps maximum",
    "setKeepalive": "Garder en vie",
    "setAccessLog": "Journal d'accès",
    "logOn": "Activé",
    "logBuffered": "Tamponné",
    "logOff": "Désactivé",
    "setForceHttps": "Forcer HTTPS",
    "setHsts": "HSTS",
    "setCfRealIp": "IP réelle de Cloudflare",
    "setIndexes": "Liste d'annuaire",
    "bodyInherit": "Mondial",
    "stopSites": "{{n}} le(s) site(s) cesseront de répondre à HTTP."
  },
  "notFound": {
    "title": "Page introuvable",
    "body": "Pas de page de panneau à {{path}}.",
    "hint": "Les URL inconnues ne vous renvoient plus au tableau de bord.",
    "home": "Tableau de bord"
  },
  "notes": {
    "agents": {
      "sessionNotFound": "Session introuvable : {{sessionId}}"
    },
    "notFound": "Introuvable",
    "needPath": "Indiquez un chemin",
    "needName": "Saisissez un nom",
    "needHost": "Entrez un hôte",
    "needDomain": "Saisissez un domaine",
    "needProjectName": "Saisissez un nom de projet",
    "needServerIp": "Indiquez une IP de serveur",
    "passwordMin8": "Le mot de passe doit comporter au moins 8 caractères",
    "invalidPath": "Chemin invalide",
    "invalidIp": "IP invalide",
    "invalidIp46": "IPv4/IPv6 invalide",
    "invalidPackageName": "Nom de paquet invalide",
    "fileMissing": "Le fichier n'existe pas",
    "notRegularFile": "N'est pas un fichier ordinaire",
    "readFailed": "Échec de la lecture",
    "pathResolveFailed": "Échec de la résolution du chemin",
    "fieldInvalid": "Champ invalide {{field}} : {{value}}",
    "apt": {
      "updateIndex": "Mettre à jour l'index des paquets"
    },
    "state": {
      "closed": "Fermé",
      "active": "Actif"
    },
    "cat": {
      "security": "Sécurité",
      "mail": "Messagerie",
      "database": "Base de données",
      "runtime": "Durées d'exécution"
    },
    "ssh": {
      "identityNotFound": "Identité introuvable",
      "registrationNotFound": "Enregistrement introuvable",
      "keyOkNologin": "Key accepted. Account has no login shell (nologin) — use SFTP. Treated as PASS.",
      "keyOkSftp": "SFTP pwd a réussi après le refus du shell SSH."
    },
    "cdn": {
      "siteNotFound": "Site CDN introuvable",
      "nodeMissing": "Le nœud n'existe pas",
      "loopbackOriginRemote": "L'origine est 127.0.0.1 : il s'agit de cet hôte, et non d'un périphérique distant. Définissez une adresse IP d'origine accessible ou bind_ip.",
      "originRemoteRewrite": "Les bords distants utiliseront l'origine accessible {{url}} au lieu du bouclage.",
      "originRemoteUnknown": "L'origine est un bouclage et aucune adresse IP publique/LAN ou bind_ip n'est connue — apply refusera les bords distants jusqu'à ce qu'il y en ait un.",
      "needSshOrFleet": "Le dispositif Edge distant a besoin d’une identité SSH sortante (ou d’un nom d’utilisateur) ou d’une session de flotte /agents. L'URL de santé à elle seule n'applique pas le transport.",
      "probe": {
        "timeout": "Délai d'expiration de la connexion après {{ms}}ms ({{detail}}). Le homologue peut être protégé par un pare-feu.",
        "dns": "La recherche DNS a échoué ({{detail}}).",
        "refused": "Connexion refusée après {{ms}}ms ({{detail}}). Port fermé ou blocage à sens unique.",
        "tls": "Échec de la vérification TLS ({{detail}}).",
        "unreach": "Hôte inaccessible après {{ms}}ms ({{detail}}).",
        "http": "La sonde HTTP a échoué après {{ms}}ms ({{detail}})."
      }
    },
    "backup": {
      "testUnsaved": "Test des valeurs de formulaire non enregistrées (non écrites dans les paramètres).",
      "testIdentity": "ssh (identity) to {{spec}} ok",
      "sshAuthFailed": "Clé SSH ou mot de passe rejeté (publickey). Choisissez une identité sortante ou installez sshpass.",
      "remotePathIsFile": "Le chemin distant {{path}} est un fichier. Utilisez un répertoire.",
      "remoteMkdirFailed": "Impossible de créer le répertoire distant : {{detail}}",
      "sidecarPushed": "A également poussé le side-car SQL {{name}}",
      "fileNotFound": "Fichier de sauvegarde introuvable",
      "resticNoPassword": "restic est activé mais le mot de passe n'est pas défini",
      "resticNotInPath": "restic absent du PATH",
      "dbEnvUnreadable": "Impossible de lire .db.env ; dump SQL ignoré.",
      "dbEnvNoName": ".db.env n'a pas de nom de base de données ; dump SQL ignoré.",
      "targetOutside": "La cible de restauration doit se trouver dans le répertoire d'accueil du projet ou dans la racine des fichiers publics.",
      "controlPlaneDryRun": "Aperçu uniquement – ​​rien d’écrit. Dans le panneau, utilisez Restaurer et confirmez la phrase à écrire.",
      "controlPlaneNeedConfirm": "La restauration complète du plan de contrôle nécessite la phrase de confirmation RESTORE-CONTROL-PLANE.",
      "controlPlaneRestartAfter": "Redémarrez l'API après une restauration réussie.",
      "movedToTrash": "Déplacement {{name}} vers la corbeille. Suppression définitive après {{days}} jours.",
      "restoreNameExists": "Impossible de restaurer {{name}} — une archive active portant ce nom existe déjà.",
      "restoredFromTrash": "Restauré {{name}} depuis la corbeille.",
      "trashEmptied": "{{n}} archive(s) définitivement supprimée(s) de la corbeille.",
      "partialOk": "Succès partiel — {{n}} projet(s) ignoré(s)"
    },
    "health": {
      "portListening": "Le port {{port}} écoute",
      "portNotListening": "Le port {{port}} n'écoute pas",
      "httpOk": "HTTP OK {{status}}",
      "httpFail": "Échec du HTTP : {{detail}}"
    },
    "redis": {
      "cliMissing": "redis-cli n'est pas installé",
      "requirepassAlreadySet": "Redis a déjà requirepass – non écrasé.",
      "requirepassApplied": "requirepass appliqué au moment de l'exécution",
      "requirepassApplyFailed": "Impossible de CONFIG SET requirepass (se fondera sur restart + conf)",
      "generatedRequirepass": "Mot de passe Redis généré (affiché une fois) : {{password}}"
    },
    "nginx": {
      "reloaded": "nginx rechargé",
      "configOk": "Vérification de la configuration Nginx réussie",
      "reloadExit": "Code de sortie du rechargement Nginx={{code}}",
      "managedDir": "Répertoire de configuration géré : {{path}}",
      "includeHint": "Dans nginx : include {{path}}/*.conf ;",
      "removedOrphan": "Suppression de la configuration nginx orpheline {{path}}",
      "keptLiveSsl": "Bloc HTTPS actif conservé dans {{path}} (le modèle géré n'avait pas d'écoute 443)",
      "orphanCleanupFailed": "Échec du nettoyage de Nginx orphelin : {{detail}}",
      "settingsWritten": "Extrait global Nginx écrit",
      "settingsNeedExecute": "Appliquer les besoins YSK_EXECUTE",
      "reloadFailed": "rechargement nginx échoué"
    },
    "ssl": {
      "requestCert": "Demander un certificat"
    },
    "ftp": {
      "startVsftpd": "Démarrer vsftpd",
      "writeVsftpd": "Écrire la configuration vsftpd",
      "vsftpdStarted": "vsftpd démarré",
      "openPortsStep": "Ports du pare-feu (manuel)",
      "openPortsReminder": "Ouvrez les ports TCP sur le pare-feu hôte et le groupe de sécurité cloud : {{ports}}. L'application FTPS n'ouvre pas les ports pour vous.",
      "openPortsPasvHint": "Si la connexion fonctionne mais que le LIST du répertoire expire, la plage de données PASV est bloquée — ouvrez le ful",
      "publicPlaintextBlocked": "Refus de démarrer un FTP public sans FTPS. Liez-vous à cet hôte uniquement, activez FTPS avec un certificat ou confirmez PLAINTEXT pour exposer le texte en clair sur l'adresse publique."
    },
    "deploy": {
      "nodeMissingIsolated": "Binaire Node manquant pour le déploiement isolé : {{path}} — installez la chaîne d'outils Node {{version}} puis redéployez. Refus d'écrire une unit qui provoquerait un 203/EXEC.",
      "nodeMissing": "Binaire Node manquant : {{path}} — installez la chaîne d'outils (Node {{version}}) puis redéployez",
      "nodeRejectedPath": "Binaire Node rejeté pour l'utilisateur du projet : {{path}} — utilisez {{planned}}",
      "unitUnhealthy": "Unit systemd non saine ({{detail}}). journalctl -u {{unit}} — 203/EXEC signifie souvent que le binaire n'est pas exécutable par l'utilisateur du projet",
      "skippedPanelNode": "Node du panneau ignoré à {{path}} (non exécutable par l'utilisateur du projet ; provoquerait un systemd 203/EXEC)",
      "usingFallback": "Binaire Node : utilisation de {{path}} ({{planned}} prévu introuvable)",
      "usingPanelExec": "Binaire Node : repli sur execPath du panneau {{path}}",
      "usingPanelDegraded": "Binaire Node : déploiement dégradé via le panneau {{path}} (pas pour systemd User=ysks_*)",
      "nodeNotFoundPlanned": "Binaire Node {{version}} introuvable sur l'hôte — l'unit utilisera {{planned}} ; installez la chaîne d'outils puis redéployez"
    },
    "files": {
      "needSrcDst": "Indiquez les chemins source et destination",
      "pathOutsideSandbox": "Chemin hors bac à sable : {{target}}",
      "notFoundRel": "Introuvable : {{relPath}}",
      "fileNotFoundRel": "Fichier introuvable : {{relPath}}",
      "notFoundFrom": "Introuvable : {{fromPath}}",
      "alreadyExists": "Existe déjà : {{name}}"
    },
    "dns": {
      "needZoneServerIp": "Saisissez la zone et l'IP du serveur",
      "noClusterPeer": "Aucun pair de cluster enregistré",
      "planOnly": "Plan uniquement — définissez apply=true (root + YSK_EXECUTE) pour installer dans /etc/powerdns et redécouvrir",
      "needRootNamed": "Root + EXECUTE requis pour mettre à jour /etc/powerdns/named.conf et redécouvrir les zones",
      "noManagedZonesClear": "Aucun fichier de zone géré sous dataDir/dns/zones — suppression de l'include PowerDNS YSK",
      "bindRegistered": "PowerDNS BIND : {{count}} zone(s) enregistrée(s) (list-zones confirmé)",
      "listZonesIncomplete": "Zones named.conf/runtime mises à jour mais list-zones n'a pas confirmé toutes les zones — non marquées comme chargées (vérifiez les journaux pdns / bind-config)",
      "noLaunchDefaultBind": "aucun launch= trouvé — chemin bind par défaut",
      "writeNotAnswerDig": "Écrire le fichier de zone seul ne répond pas à dig — chargez dans PowerDNS (bind named.conf + redécouverte)",
      "bindDigFailed": "Zone listée mais dig SOA a échoué — non déclarée comme chargée",
      "bindLoadedOk": "Zone {{zone}} enregistrée via PowerDNS BIND named.conf + dig OK",
      "bindSyncFailed": "Échec de la synchronisation BIND named.conf ou dig ne répond pas",
      "bindSkipPdnsutil": "Chemin BIND ignoré (le backend préfère pdnsutil)",
      "pdnsCtlNoConfirm": "pdns_control présent mais zone non confirmée ; vérifier /etc/powerdns/named.conf ou utiliser le backend pdnsutil",
      "usingExistingZone": "Utilisation du fichier de zone existant : {{path}}",
      "healNeedRoot": "Root + EXECUTE requis pour réécrire pdns local-address",
      "pdnsUnitActive": "unité pdns : active",
      "pdnsUnitInactive": "unité pdns : inactive",
      "udp53Listening": "UDP/53 : en écoute",
      "udp53NotListening": "UDP/53 : toujours pas en écoute",
      "healResyncOk": "Écouteur réparé + zones gérées re-synchronisées dans PowerDNS BIND",
      "healResyncPartial": "Écouteur réparé mais re-sync des zones incomplète — cliquer Write & load zone / powerdns load",
      "installAfterLoad": "Après installation, appliquer les zones DNS (écrit named.conf + rediscover) ou POST powerdns/load",
      "bindFileNotEnough": "Backend BIND : les fichiers de zone seuls ne répondent pas à dig tant qu'ils ne sont pas inclus dans named.conf",
      "zeroDomainsHint": "PowerDNS list-zones : 0 — les fichiers de zone sur disque ne sont pas chargés (named",
      "localAFailed": "Sonde A locale échouée pour www/ftp/@ sous {{zone}}",
      "publicNsCloudflare": "Les NS publics sont un DNS/CDN tiers (p. ex. Cloudflare) — dig public n'utilisera PAS la zone de cet hôte",
      "publicNsOther": "Les NS publics ne sont pas cet hôte — les contrôles mondiaux ignorent le PowerDNS local jusqu'au changement de NS chez le registrar",
      "publicNsHere": "Les NS publics ressemblent à des nameservers in-zone (ns1/ns2.zone) — le monde peut vous interroger",
      "firewall53Hint": "UDP/53 non en écoute selon ss — ouvrir le pare-feu 53 les deux (TCP+UDP) si dig externe échoue",
      "applyDigOk": "PowerDNS BIND : list-zones + dig OK",
      "applyDigFail": "Zone enregistrée dans conf mais dig encore vide/REFUSED — non marquée comme appliquée",
      "applySyncIncomplete": "Sync PowerDNS bind incomplète — fichier de zone sur disque uniquement (non appliqué). Corriger EXECUTE/root ou les logs pdns.",
      "writeOnlyHint": "Fichier de zone écrit uniquement — PowerDNS ne répondra pas tant que load/apply n'enregistre pas named",
      "noActiveUnit": "Aucune unité nommée/bind9/pdns active",
      "pdnsUnitRestarts": "État de l'unité pdns/redémarrage : {{detail}}",
      "port53LoopbackOnly": "Le port 53 est uniquement en bouclage (résolu par systemd 127.0.0.53) — il ne s'agit pas d'un serveur de noms faisant autorité sur le produit.",
      "port53Closed": "Le port 53 n'écoute pas (UDP/TCP)",
      "udp53NotPublic": "UDP/53 n'écoute pas sur une adresse publique",
      "tcp53NotPublic": "TCP/53 n'écoute pas sur une adresse publique",
      "noManagedZones": "Aucun fichier de zone gérée sous dataDir/dns/zones",
      "pdnsListZones": "Zones de liste PowerDNS : {{n}}",
      "lookupIgnoredAt": "dig n'est pas disponible — @{{server}} a été ignoré. Ne pas utiliser le résolveur système comme réponse de ce serveur.",
      "digNotInstalled": "dig n'est pas installé",
      "digEmpty": "creuser : pas de réponse",
      "localAOk": "local A {{name}} → {{ip}}"
    },
    "db": {
      "needExecuteCreate": "L'exécution hôte est désactivée ; impossible de créer la base depuis le panneau",
      "dryRunMysql": "dry-run : base non créée. Utiliser --execute avec YSK_EXECUTE=1 pour provisionner",
      "remoteNoCreds": "Aucun nom d'utilisateur/mot de passe stocké — TCP uniquement (l'enregistrement n'est pas une connexion).",
      "remoteReachable": "TCP {{host}} : {{port}} ouvert ({{ms}}ms).",
      "remoteUnreachable": "TCP {{host}} :{{port}} fermé ou filtré ({{ms}}ms)."
    },
    "net": {
      "invalidIface": "Nom d'interface invalide",
      "invalidDev": "Nom d'appareil invalide",
      "needNmActive": "Impossible de persister : une connexion NetworkManager active est requise"
    },
    "project": {
      "notFound": "Projet introuvable : {{id}}",
      "docRootMustBeRelative": "La racine document doit être relative au répertoire du projet (pas un chemin absolu).",
      "docRootInvalid": "Racine document invalide (pas de .. ni de caractères illégaux).",
      "domainInvalid": "Nom de domaine invalide : {{domain}}",
      "domainInUse": "Le domaine {{domain}} est déjà utilisé par le projet « {{other}} »."
    },
    "email": {
      "domainNotFound": "Domaine mail introuvable : {{id}}",
      "wroteNginx": "Config Nginx écrite : {{nginxPath}}",
      "wrotePath": "Écrit {{path}}",
      "domainDeleted": "Domaine {{domain}} supprimé ({{mailboxes}} boîtes mail, {{aliases}} alias)",
      "domainDataDirRemoved": "Répertoire de données local supprimé {{path}}",
      "domainDataDirRemoveFailed": "Impossible de supprimer le répertoire de données {{path}} : {{detail}}",
      "domainDeleteSystemHint": "Plan de contrôle retiré ; réappliquer les domaines restants ou nettoyer les maps MTA système si besoin",
      "mailboxDeleted": "Boîte mail {{address}} supprimée",
      "mailboxNotFound": "Boîte mail introuvable",
      "mailboxDataRemoved": "Chemin local supprimé {{path}}",
      "domainDeleteConfirmMismatch": "Le nom de confirmation ne correspond pas au domaine ; suppression refusée",
      "domainDataKept": "Données mail dataDir locales conservées (removeData=false)",
      "mailboxPasswordUpdated": "Mot de passe mis à jour pour {{address}}",
      "mailboxStatusUpdated": "Statut pour {{address}} défini sur {{status}}",
      "mailboxUpdateEmpty": "Rien à mettre à jour : fournissez le mot de passe et/ou le statut",
      "mailboxStatusInvalid": "Statut de boîte aux lettres invalide",
      "mailboxNoChanges": "Aucune modification appliquée",
      "dovecotApplyNeedRoot": "L'application d'authentification virtuelle Dovecot nécessite root + YSK_EXECUTE",
      "dovecotNotInstalled": "Dovecot n'est pas installé sur cet hôte",
      "dovecotNoPassdbSnippets": "Aucun extrait de passe de domaine trouvé sous dataDir/email",
      "dovecotApplyFailed": "Échec de l'application de l'authentification virtuelle Dovecot : {{detail}}",
      "dovecotApplyOk": "Authentification virtuelle Dovecot installée ({{conf}}, {{count}} extrait(s) de domaine)",
      "dovecotPassdbWrittenNeedApply": "Fichier Passwd écrit sous dataDir - exécutez apply (EXECUTE + root) pour que Dovecot le charge",
      "postqueueSetgidBroken": "Les outils de file d'attente Postfix ont échoué : setgid_group est vide dans main.cf. Définissez setgid_group=postdrop (le panneau essaie de corriger lorsque YSK_EXECUTE est activé).",
      "postqueueMailDown": "Postfix ne fonctionne pas (showq indisponible). Le panneau a essayé de le démarrer lorsque YSK_EXECUTE est activé - vérifiez l'onglet Logiciel / le suffixe d'état systemctl.",
      "postqueueSpoolMissing": "Les répertoires de file d'attente Postfix sont manquants (par exemple hold/). Le panneau a essayé de créer l'arborescence de spool et de démarrer Postfix lorsque YSK_EXECUTE est activé.",
      "invalidDomain": "Entrez un domaine de messagerie valide",
      "invalidServerIp": "Entrez une adresse IP de serveur valide",
      "mailboxLocalPartInvalid": "La partie locale de la boîte aux lettres ne peut utiliser que des lettres, des chiffres, . _ + -",
      "passwordTooShort": "Le mot de passe doit contenir au moins 8 caractères"
    },
    "software": {
      "startUnit": "Démarrer {{u}}",
      "installedSpec": "{{title}} installé",
      "installPkg": "Installer {{p}}",
      "npmGlobal": "npm install -g {{pkgs}}",
      "needNodeForNpm": "node/npm introuvable — installer Node.js avant {{title}}",
      "uninstallNoTargets": "Aucun logiciel sélectionné pour la désinstallation",
      "uninstallNothingInstalled": "Rien d'installé pour la portée sélectionnée",
      "uninstallProtected": "Composants protégés ignorés : {{ids}}",
      "uninstallConfirmMismatch": "La phrase de confirmation ne correspond pas",
      "uninstallOk": "Composant(s) {{n}} désinstallé(s)",
      "uninstallPartial": "Désinstallation terminée avec des erreurs – vérifiez les étapes"
    },
    "php": {
      "aptPackages": "Installation de {{count}} paquets : {{list}}"
    },
    "runtime": {
      "plugins": "Outils associés : {{list}}",
      "pluginsOk": "Outils associés installés",
      "pluginsFailed": "Certains outils ont échoué ou ont été ignorés : {{list}}",
      "pluginsUninstall": "Désinstallation des outils : {{list}}",
      "pluginsUninstallOk": "Outils associés désinstallés",
      "pluginsUninstallFailed": "Certains outils n’ont pas pu être désinstallés ou ont été ignorés : {{list}}",
      "pluginsNoneToUninstall": "Aucun outil à désinstaller (déjà absent ou requis)"
    },
    "approval": {
      "notFound": "Approbation introuvable : {{id}}"
    },
    "readiness": {
      "core": "Plan de contrôle",
      "security": "Autorisations et sécurité",
      "binaries": "Binaires / paquets",
      "hosting": "Hébergement",
      "dns": "DNS",
      "email": "E-mail",
      "isolation": "Isolation de projet",
      "ops": "Opérations",
      "runtimesNode": "Noeud.js",
      "runtimesPhp": "PHP",
      "runtimesPython": "Python",
      "runtimesGo": "Go",
      "pm2": "PM2",
      "runtimesNodeFix": "Installer Node à partir de /runtimes/node",
      "runtimesPhpFix": "Installer PHP depuis /runtimes/php",
      "runtimesPythonFix": "Installer Python depuis /runtimes/python",
      "runtimesGoFix": "Installer Go à partir de /runtimes/go",
      "pm2Fix": "Installez PM2 à partir de la page d'exécution du nœud"
    },
    "needAdmin": "Autorisation administrateur requise",
    "notInstalled": "Non installé",
    "unknown": "Inconnu",
    "failed": "Échoué",
    "running": "En cours",
    "stopped": "Arrêté",
    "probe": "Sonder",
    "install": "Installer",
    "port": "Port",
    "git": {
      "missingBin": "git n'est pas sur PATH",
      "auth": "L'authentification a échoué. Ajoutez une clé de déploiement ou un jeton HTTPS.",
      "hostkey": "La vérification de la clé de l'hôte SSH a échoué. Confirmez et épinglez la clé hôte.",
      "dirty": "L'arbre de travail a {{count}} changement(s) local(s). La traction est bloquée.",
      "diverged": "Impossible d'avancer rapidement. Réinitialisez la référence distante si vous avez l’intention de supprimer l’historique Git local.",
      "missingRef": "Cette branche, cette balise ou ce commit ne se trouve pas sur la télécommande.",
      "shallow": "Ce clone est peu profond. Récupérez l’historique complet avant d’épingler un ancien commit.",
      "notRepo": "app/ n'est pas encore un référentiel Git.",
      "diffEmpty": "Aucune différence non mise en scène (le fichier .env protégé est exclu).",
      "unrelated": "Des histoires sans rapport. Reclonez uniquement après confirmation - les fichiers personnalisés seront perdus.",
      "lock": "Git index.lock est présent. Supprimez-le uniquement si aucun processus git n'est en cours d'exécution.",
      "disk": "Disque plein ou quota dépassé.",
      "timeout": "Git a expiré.",
      "network": "Erreur réseau lors de la conversation avec la télécommande.",
      "lfs": "Ce dépôt utilise Git LFS et git-lfs n'est pas disponible.",
      "submodule": "La mise à jour du sous-module a échoué.",
      "unknown": "Git a échoué. Voir le résultat de la commande.",
      "fetchOk": "Récupéré de l'origine.",
      "checkoutOk": "J'ai vérifié {{ref}}.",
      "resetOk": "Réinitialisez difficilement à {{ref}}.",
      "envRestored": "App/.env restauré à partir du plan de contrôle.",
      "needPinHost": "La clé d'hôte SSH n'est pas épinglée. Scannez-le et épinglez-le avant de le cloner ou de le récupérer.",
      "tokenSaved": "Jeton HTTPS stocké (plus jamais affiché).",
      "tokenCleared": "Jeton HTTPS supprimé.",
      "tokenInvalid": "Le jeton doit comporter au moins 8 caractères.",
      "deployKeyCreated": "Clé de déploiement créée. Ajoutez la clé publique sur l'hôte Git.",
      "deployKeyCleared": "Clé de déploiement détachée de ce projet.",
      "hostPinned": "Clés d'hôte SSH épinglées pour {{host}}.",
      "hostUnpinned": "Clés d'hôte SSH épinglées effacées.",
      "hostScanFailed": "ssh-keyscan n'a renvoyé aucune clé pour cet hôte.",
      "hookEnabled": "Le hook Git entrant est activé. Collez vous-même l'URL dans GitHub, Gitea ou GitLab.",
      "hookDisabled": "Le hook Git entrant est désactivé. L'URL ne sera pas synchronisée.",
      "hookSecretOnce": "Copiez ce secret de hook maintenant. Il n'est plus affiché.",
      "refsNeedUrl": "Entrez d'abord une URL Git.",
      "refsOk": "Chargé {{branches}} branche(s) et {{tags}} balise(s).",
      "refsEmpty": "La télécommande n'a annoncé aucune branche ni balise."
    },
    "auto": {
      "n0001": "Statut : appliqué",
      "n0002": "Utilisateur introuvable",
      "n0003": "bloqué : nécessite YSK_EXECUTE=1",
      "n0004": "Ressource introuvable",
      "n0005": "Impossible d’appliquer sur l’hôte : YSK_EXECUTE + root requis",
      "n0006": "Exécution hôte requise",
      "n0007": "Statut : écrit",
      "n0008": "Les privilèges root sont requis pour terminer cette opération",
      "n0009": "base de données créée",
      "n0010": "terminé",
      "n0011": "Introuvable",
      "n0012": "Statut : échec",
      "n0013": "non en cours d’exécution",
      "n0014": "démarrer",
      "n0015": "mysql non installé",
      "n0016": "psql non installé",
      "n0017": "Pare-feu UFW",
      "n0018": "Durées d'exécution",
      "n0019": "cron introuvable",
      "n0020": "",
      "n0021": "Politique non appliquée : 0/1 admin a la 2FA activée",
      "n0022": "Authentification à deux facteurs administrateur",
      "n0023": "Journal binaire (réplication)",
      "n0024": "Introuvable",
      "n0025": "Modifications système désactivées",
      "n0026": "Disjoncteur d’auto-ban déclenché",
      "n0027": "Veuillez indiquer agentId",
      "n0028": "Projet introuvable",
      "n0029": "nom requis",
      "n0030": "Urgence",
      "n0031": "ban non activé",
      "n0032": "dry-run : thisnot system",
      "n0033": "dry-run : not system",
      "n0034": "1 réplica",
      "n0035": "sondage nœud réussi",
      "n0036": "serverHost execute n’est pas activé, impossible d’exécuter rsync",
      "n0037": "réappliquer les étapes clés a échoué",
      "n0038": "impossible d’amorcer : YSK_EXECUTE non activé",
      "n0039": "bootstrap nécessite YSK_EXECUTE=1",
      "n0040": "Connexions max",
      "n0041": "Adresse de liaison",
      "n0042": "domaine",
      "n0043": "drainage",
      "n0044": "Nœud CDN introuvable",
      "n0045": "(dernière version GitHub Releases)",
      "n0046": "exécuter (répertoire système YSK_EXECUTE)",
      "n0047": "dry-run : ajoutez d'abord --execute au nginx système",
      "n0048": "nécessite admin",
      "n0049": "projectId et nom",
      "n0050": "^.*compte ou mot de passe.*$",
      "n0051": "^.*nécessite une vérification.*$",
      "n0052": "echo \"pdnsutil introuvable : \" >&2",
      "n0053": ": ''}(Peut ne pas persister après redémarrage ; utilisez Enregistrer pour persister)",
      "n0054": "# rsa_cert_file= (pas certificate)",
      "n0055": "$_GET / $_POST / $_COOKIE",
      "n0056": "--password, ou YSK_MIGRATE_SSH_PASSWORD",
      "n0057": "-1 désactiver ; 0",
      "n0058": "/proc/meminfo peut",
      "n0059": "/proc/stat peut — CPU% ne peut pas",
      "n0060": "0 = limites ; peut 256mb",
      "n0061": "0 = utiliser tous les CPU",
      "n0062": "0 (désactivé)",
      "n0063": "charge 1 minute supérieure à CPU × 2",
      "n0064": "1. créer la base MySQL via le panneau",
      "n0065": "1 = plus sûr ; 2 = meilleures performances",
      "n0066": "2. WordPress vers app/public",
      "n0067": "3. paramètres wp-config.php",
      "n0068": "4. PHP + Nginx/SSL",
      "n0069": "Un IPv4",
      "n0070": "Un IPv4",
      "n0071": "AAAAIPv6",
      "n0072": "AAAAIPv6",
      "n0073": "persistance AOF",
      "n0074": "Le fichier Adminer n'existe pas ; veuillez télécharger : true",
      "n0075": "L'agent ne peut pas écrire",
      "n0076": "Agent en cours d'exécution",
      "n0077": "Liste d'autorisation",
      "n0078": "Axum + Tokio ; cargo build crates ()",
      "n0079": "Axum : cargo build --release crates.io",
      "n0080": "Ignorer la résolution de nom",
      "n0081": "Collation du serveur",
      "n0082": "Jeu de caractères du serveur",
      "n0083": "Nœud bootstrap ()",
      "n0084": "Scan de bots",
      "n0085": "OPcache CLI",
      "n0086": "CONFIG SET databases échec (peut redémarrer)",
      "n0087": "CPU pour 1–10000",
      "n0088": "UA Cloudflare échec",
      "n0089": "Cloudflare Under Attack veuillez",
      "n0090": "Cookie sécurisé (HTTPS)",
      "n0091": "Index DB pour 0–15",
      "n0092": "Utilisateur système non créé pour ce projet",
      "n0093": "Utilisateur id DB introuvable — veuillez createsystemuser",
      "n0094": "DB_PASSWORD pour — veuillez créer MySQL via la page ou WP_DB_*",
      "n0095": "DDoS",
      "n0096": "DKIM",
      "n0097": "DMARC",
      "n0098": "DNS écrit ≠ résolveur ( TTL/)",
      "n0099": "DS chez le registrar, s'il vous plaît.",
      "n0100": "Django : pip install django/gunicorn",
      "n0101": "Arrêt confirmName etcinterface",
      "n0102": "EmailService dataDir — base de données ( dataDir Maildir)",
      "n0103": "FPM rechargementÉchoué",
      "n0104": "FTPS nécessitedomaine",
      "n0105": "FastAPI + uvicorn ; requirements.txt ; / et /health",
      "n0106": "Flask app.py ; requirements.txt ; / et /health",
      "n0107": "GTID : conf gtid_mode=ON",
      "n0108": "Galera prend en charge mariadb",
      "n0109": "URL Git invalide",
      "n0110": "GitHub package.json version manquante",
      "n0111": "GitHub release tag manquant",
      "n0112": "Runtime Go",
      "n0113": "robot de certification",
      "n0114": "Conf HTTP avec webroot ACME (pas TLS)",
      "n0115": "HTTP échoué",
      "n0116": "Activer HTTPS",
      "n0117": "IMAP/POP échoué",
      "n0118": "IP non (/enrich)",
      "n0119": "IP invalide",
      "n0120": "IPv4 0–32",
      "n0121": "IPv6 0-128",
      "n0122": "Journal de vidage InnoDB lors de la validation trx",
      "n0123": "Taille du fichier journal InnoDB",
      "n0124": "Taille du buffer pool InnoDB",
      "n0125": "Installer et publier via le panneau d'administration (installation Webmail).",
      "n0126": "Flood L7 / trafic anormal",
      "n0127": "LLM anormal (manquant)",
      "n0128": "Let’s Encrypt HTTP-01 nécessite le port 80 accessible ; DNS-01 jeton API.",
      "n0129": "LimitNOFILE pour 64–10000000",
      "n0130": "MTU 68-65535",
      "n0131": "MX hôte mail",
      "n0132": "MX : premier hôte ( 10 mail.example.com.)",
      "n0133": "Serveur MariaDB",
      "n0134": "Exiger que les clients utilisent TLS",
      "n0135": "Serveur MySQL",
      "n0136": "Client MySQL/MariaDB",
      "n0137": "NetworkManager indisponible, impossible d'écrire le DNS",
      "n0138": "Limite de débit Nginx plus stricte (~8 req/s)",
      "n0139": "Limite de débit Nginx stricte (~3 req/s)",
      "n0140": "Limite de débit Nginx douce (~20 req/s)",
      "n0141": "échec2ban",
      "n0142": "Installation Node échouée",
      "n0143": "Noeud.js",
      "n0144": "OPcache (Mo)",
      "n0145": "Docroot PHP + wp-config ()",
      "n0146": "pare-feu (UFW)",
      "n0147": "Processus PHPstartnot process",
      "n0148": "PHP dégradé — pas avec l'utilisateur Linux du projet (nécessite root + createsystemuser)",
      "n0149": "PID pour",
      "n0150": "PID invalide",
      "n0151": "PING réussi",
      "n0152": "Échec du démarrage PM2 — démarrage pidfile",
      "n0153": "suffixe",
      "n0154": "POST",
      "n0155": "Par expéditeur : domaine de l'expéditeur d'enveloppe msgs/heure ; DEFER_IF_PERMIT",
      "n0156": "Carte de suspension Postfix appliquée (check_recipient_access REJECT)",
      "n0157": "Serveur PostgreSQL",
      "n0158": "Serveur PostgreSQL non installé",
      "n0159": "Client PostgreSQL",
      "n0160": "Service PostgreSQL non démarré",
      "n0161": "Outils PowerDNS",
      "n0162": "Primaire : créer l'utilisateur de réplication (SQL )",
      "n0163": "PythonDjango ()",
      "n0164": "serveur Redis",
      "n0165": "Comportement Python",
      "n0166": "Règle RDB",
      "n0167": "RDB",
      "n0168": "RUSTFLAGS (construction)",
      "n0169": "dbIndex Redis pour 0–15",
      "n0170": "Dump Redis nécessite YSK_EXECUTE=1",
      "n0171": "Serveur Redis",
      "n0172": "Serveur Redis non installé ou connexion impossible",
      "n0173": "Démarrage Redis : PING impossible",
      "n0174": "Client Redis",
      "n0175": "Démarrage Redis",
      "n0176": "Restauration Redis nécessite YSK_EXECUTE",
      "n0177": "Renouvellement via certbot.timer (dns-01 )",
      "n0178": "Build / exécution Rust",
      "n0179": "Bucket/chemin S3 non configuré",
      "n0180": "SFTP.ssh chown nécessite root + YSK_EXECUTE",
      "n0181": "Confirmation SIGKILL Kill: true",
      "n0182": "SMTP/",
      "n0183": "SPF",
      "n0184": "SRV : priorité poids port cible",
      "n0185": "SSH",
      "n0186": "Connexion SSH échouée",
      "n0187": "SSH nécessite YSK_EXECUTE=1",
      "n0188": "Vérification SSO ()· mot de passe",
      "n0189": "Vérification SSO ()· mot de passe",
      "n0190": "SST=mariabackup : nœud mariadb-backup",
      "n0191": "Session",
      "n0192": "Session",
      "n0193": "Session",
      "n0194": "TCP (en cours d'utilisation)",
      "n0195": "TOTP réussi",
      "n0196": "TasksMax pour 1–1000000",
      "n0197": "UFW non installé",
      "n0198": "Échec de lecture du statut UFW",
      "n0199": "VACUUM",
      "n0200": "WAL, etc.",
      "n0201": "Web + messagerie",
      "n0202": "Interface Web : introuvable : (compiler apps/web ou définir YSK_WEB_ROOT)\\n",
      "n0203": "Hébergement web",
      "n0204": "Interface web",
      "n0205": "Échec de la vérification WebAuthn",
      "n0206": "WebDAV non",
      "n0207": "Webmail : domaine invalide",
      "n0208": "Wildcard/dns-01 : certbot TXT ; le panneau démarrera DS/TXT une fois le DNS terminé",
      "n0209": "WordPress (PHP)",
      "n0210": "YSK PHP OK — WordPress non installé\\\\n",
      "n0211": "YSK_EXECUTE est activé mais le processus n'est pas root — certains rechargements systemctl/nginx seront bloqués",
      "n0212": "Activer YSK_EXECUTE",
      "n0213": "YSK_EXECUTE est désactivé — écrit ≠ appliqué",
      "n0214": "YSK_EXECUTE est désactivé — les mutations hôte restent écrites/brouillon jusqu'à YSK_EXECUTE=1",
      "n0215": "Échec du journal d'accès",
      "n0216": "access=fleet nécessite fleetAgentId",
      "n0217": "action pour reboot | poweroff | annuler",
      "n0218": "apex + www ( edge )+ hôte cdn",
      "n0219": "serveur CNAME apex/",
      "n0220": "app.py — ignoré",
      "n0221": "applied ≠ healthy — veuillez sonder wsrep",
      "n0222": "appliquer reload sshd ; Error Match possible — d'abord dry-run",
      "n0223": "applySystem modification suspend/autoreply",
      "n0224": "apply_status=written (Success ≠ MTA système ; ajouter applySystem:true d'abord apply)",
      "n0225": "apps/web/dist existe",
      "n0226": "apt list --upgradable : (mise à jour possible ou apt non Ready)",
      "n0227": "apt Install échoué",
      "n0228": "apt-get disponible",
      "n0229": "désactivation auto vacuum",
      "n0230": "bloqué : nécessite HostExecutor + YSK_EXECUTE=1",
      "n0231": "bootstrap : Node échoué",
      "n0232": "bootstrap : apt échoué",
      "n0233": "bootstrap étapes clés échouées",
      "n0234": "candidateVersion absent",
      "n0235": "cargo / rouille",
      "n0236": "certbot exit 0 — vérifier /etc/letsencrypt/live/",
      "n0237": "chown nécessite YSK_EXECUTE + root",
      "n0238": "clone (scaffold / stub YSK)",
      "n0239": "cluster_size Inconnu ou 0",
      "n0240": "commande ysk-server / ysk-server",
      "n0241": "fichier control plane terminé",
      "n0242": "cwd possible",
      "n0243": "dataDir",
      "n0244": "dataDir ysk.json — Status terminé",
      "n0245": "dataDir/email existe",
      "n0246": "dataDir/web existe",
      "n0247": "base de données introuvable :",
      "n0248": "db-util (base utilisateurs FTP)",
      "n0249": "deployNode projet Node",
      "n0250": "df montage Available ( ou )",
      "n0251": "dig indisponible, dns node",
      "n0252": "dig : pas de réponse (NXDOMAIN ou vide)",
      "n0253": "dns-01 : panel TXT — done\" SSL\"",
      "n0254": "dnssec-dsfromkey pas de DS",
      "n0255": "CHEMIN dnssec-keygen (apt install bind9-dnsutils)",
      "n0256": "dnssec-keygen échoué",
      "n0257": "dnssec-signzone indisponible — key/DS conservés",
      "n0258": "dnssec-signzone non signé",
      "n0259": "domaine",
      "n0260": "domaine introuvable :",
      "n0261": "dovecot reload échoué ou service absent (sieve Wrote ; reload Success)",
      "n0262": "essai de répartition de flotte (non mis en file)",
      "n0263": "dry-run push pair (pas scp)",
      "n0264": "dry-run install distant (pas ssh)",
      "n0265": "dry-run transfert terminé ( bootstrap complet)",
      "n0266": "dry-run — passer apply/execute home",
      "n0267": "dry-run — passer apply/execute vraiment ssh",
      "n0268": "dry-run — n'écrit pas /etc",
      "n0269": "dry-run : ajoutez d'abord --execute pour appliquer ufw",
      "n0270": "dry-run : inventaire + prévol OK, pas de package/transfert",
      "n0271": "Exécution à sec : sonde/plan uniquement. Passez --execute avec YSK_EXECUTE=1 pour effectuer le provisionnement.",
      "n0272": "Exécution à sec : écriture du fichier géré (dataDir). Passez --execute avec YSK_EXECUTE=1 en tant que root pour installer le système drop-in.",
      "n0273": "Exécution à sec : non interdite. Passez --execute avec YSK_EXECUTE=1 pour réellement interdire.",
      "n0274": "Exécution à sec : non interdite. Passez --execute avec YSK_EXECUTE=1 pour débloquer réellement.",
      "n0275": "dryRun=true — API de modification",
      "n0276": "dryRun : n'écrit pas",
      "n0277": "dump écrit dans dataDir, pas de transfert",
      "n0278": "activation échouée",
      "n0279": "exécuter ( YSK_EXECUTE=1 + racine)",
      "n0280": "execute nécessite enqueue",
      "n0281": "administrateur d'exportation",
      "n0282": "fail2ban : application échouée",
      "n0283": "service fail2ban",
      "n0284": "fail2ban non actif",
      "n0285": "fail2ban non",
      "n0286": "échec2ban",
      "n0287": "fail2ban : lecture du statut échouée",
      "n0288": "fail2ban : sshd, nginx-http-auth et jails standard",
      "n0289": "fd indisponible",
      "n0290": "fichiers (file)",
      "n0291": "purge fleet bloquée — enqueue ou SSH",
      "n0292": "fleet : veuillez db-cluster fleet --op probe --execute",
      "n0293": "Administrateur du Panel",
      "n0294": "fromPanel nécessite un step-up : POST /api/v1/auth/totp/step-up",
      "n0295": "certificat PEM fullchain",
      "n0296": "passerelle pour IP",
      "n0297": "geo apex : écriture EDNS geo edge multi-A (·user Anycast)",
      "n0298": "bord géoMap — bord",
      "n0299": "geo : pas de paramètres geoMap — etc multi_a ( edge). veuillez dns.geoMap region→nodeIds",
      "n0300": "binaire git introuvable : dans le PATH",
      "n0301": "binaire git",
      "n0302": "binaire go",
      "n0303": "healthUrl URL http(s)",
      "n0304": "http-01 webroot — le port 80 peut conf ACME fan-out",
      "n0305": "identité non linuxUser/project — impossible authorized_keys",
      "n0306": "ignoreip : dataDir/fail2ban/ignoreip.txt",
      "n0307": "index.html + CSS, root Nginx ou",
      "n0308": "install conf → systemctl restart mariadb (pas le nœud bootstrap)",
      "n0309": "interface d'adresse ip -j",
      "n0310": "manifeste de job",
      "n0311": "journal ; permission possible",
      "n0312": "journalctl peut exiger root ou l'utilisateur systemd-journal/adm",
      "n0313": "clé",
      "n0314": "Clé manquante ou non supprimée",
      "n0315": "kill -0 Succès : possible pour zombie ou permission",
      "n0316": "kill -0 échoué",
      "n0317": "Application échouée sur l'hôte",
      "n0318": "Application bloquée sur l'hôte",
      "n0319": "répertoire de cache local/",
      "n0320": "localhost ou *",
      "n0321": "DB logique 0... N-1 ; redémarrage",
      "n0322": "logrotate installé",
      "n0323": "logrotate non installé ou PATH",
      "n0324": "main.py — ignoré",
      "n0325": "manage.py + settings/urls/wsgi minimaux ; pip install django",
      "n0326": "manifest dumpRelPath — non ？",
      "n0327": "manifeste rdbRelPath",
      "n0328": "memoryMax 512M ou 1G",
      "n0329": "migrate host --execute + YSK_EXECUTE=1, ou --dry-run ( inventory+preflight)",
      "n0330": "migrer post --execute YSK_EXECUTE=1 (cible)",
      "n0331": "migrate post nécessite YSK_EXECUTE=1",
      "n0332": "migrate post nécessite YSK_EXECUTE=1 ( target)",
      "n0333": "amorçage minimal échoué",
      "n0334": "client mysql / mariadb",
      "n0335": "mysql-replica prend en charge mysql",
      "n0336": "nom mysql_databases",
      "n0337": "named-checkzone PATH — écrit, non vérifié",
      "n0338": "nginx -t ou rechargement échoué",
      "n0339": "nginx -t non réussi, pas de rechargement",
      "n0340": "rechargement nginx ok · Statut : appliqué",
      "n0341": "rechargement nginx échoué",
      "n0342": "binaire nginx",
      "n0343": "nginx introuvable",
      "n0344": "service nginx",
      "n0345": "Binaire absent du PATH ; le service ne peut pas devenir prêt",
      "n0346": "node peut",
      "n0347": "npm latest version manquante",
      "n0348": "npm exit 0 binaire introuvable — le package n’est pas un CLI ou PATH non mis à jour",
      "n0349": "nullok pas utilisateur",
      "n0350": "nullok:.google_authenticator clé utilisateur disponible",
      "n0351": "chemin open_basedir",
      "n0352": "openssl indisponible, hachage YSK-SCRYPT",
      "n0353": "binaire openssl",
      "n0354": "optionalEtc échec du transfert (peut cibler le certificat)",
      "n0355": "origin shield : ce nœud pour shield, origin",
      "n0356": "origin.kind project ou url",
      "n0357": "origin.project nécessite projectId",
      "n0358": "origin.url URL http(s)",
      "n0359": "originShieldNodeId edgeNodeIds",
      "n0360": "dump du package incomplet — transfert",
      "n0361": "package échoué — transfert",
      "n0362": "package nécessite YSK_EXECUTE=1",
      "n0363": "pam.d/sshd sans pam_google_authenticator (non appliqué)",
      "n0364": "panneau sans paramètres 2FA ou secret — veuillez d’abord \"\" TOTP",
      "n0365": "secret TOTP du panneau — d’abord Web 2FA ou --from-panel",
      "n0366": "échec de connexion panneau, l’écriture peut échouer dans le journal fail2ban (journal ou )",
      "n0367": "mot de passe",
      "n0368": "passkey échoué",
      "n0369": "Succès passkey",
      "n0370": "pdnsutil introuvable : — installez les outils PowerDNS ou exécutez le script d'aide en root après l'installation",
      "n0371": "sonde SSH pair YSK_EXECUTE=1 (local)",
      "n0372": "pair non sondé ( sonde locale)",
      "n0373": "pair appliquer conf nœud et rejoindre",
      "n0374": "binaire php introuvable : — installez php-cli",
      "n0375": "binaire php",
      "n0376": "php hors PATH",
      "n0377": "pidfile avec démarrage utilisateur (dégradé)",
      "n0378": "pidfile démarrage sans pid",
      "n0379": "pm2 PATH (pidfile/systemd disponible)",
      "n0380": "pm2 introuvable : dans le PATH — installation : npm i -g pm2",
      "n0381": "réappliquer post-transfert",
      "n0382": "restaurer post-transfert",
      "n0383": "postconf sans message_rate_limit (application complète)",
      "n0384": "postgres-replica prend en charge postgres",
      "n0385": "nom postgres_databases",
      "n0386": "postqueue indisponible ou mail non installé",
      "n0387": "Installez nginx sur l'hôte, ou utilisez l'installation logicielle / runtime du panneau",
      "n0388": "Installez nginx sur le système, ou utilisez l'installation logicielle / runtime du panneau",
      "n0389": "clé privée PEM",
      "n0390": "productionReady non (datacan )",
      "n0391": "ps",
      "n0392": "ps dégradé : --sort/",
      "n0393": "ps dégradé : pri/vsz/stat etc",
      "n0394": "client psql",
      "n0395": "purge échouée ou cible",
      "n0396": "binaire python3",
      "n0397": "en file ≠ purge edge",
      "n0398": "en file ≠ rechargement edge — agent et cdn.edge.apply",
      "n0399": "en file ≠ edge — sortie/JSON des agents",
      "n0400": "chemin réel",
      "n0401": "chemin réel",
      "n0402": "réappliquer nécessite YSK_EXECUTE=1",
      "n0403": "cluster redis prend en charge redis",
      "n0404": "shasum du registre n'est pas sha256 (npm sha1)— avec intégrité npm pour",
      "n0405": "rechargement/redémarrage échoué",
      "n0406": "post distant échoué — peut cibler migrer post",
      "n0407": "sauvegarde restic terminée (écrit/appliqué sortie restic)",
      "n0408": "restic est activé mais le mot de passe n'est pas défini — denypassword (veuillez paramètres de sauvegarde)",
      "n0409": "restic absent",
      "n0410": "restic absent — impossible snapshots",
      "n0411": "restic absent — veuillez d'abord « / » activer et définir le mot de passe",
      "n0412": "restic désactivé (tar uniquement)",
      "n0413": "restic absent (ignoré)",
      "n0414": "restic non installé ( PATH), veuillez installer restic système",
      "n0415": "restauration ok ; réappliquer/vérifier",
      "n0416": "restauration terminée",
      "n0417": "restauration échouée",
      "n0418": "restauration non réussie",
      "n0419": "restauration nécessite YSK_EXECUTE=1",
      "n0420": "restore+reapply ok ; vérifier",
      "n0421": "échec rsync dataDir",
      "n0422": "rsync nécessite YSK_EXECUTE=1",
      "n0423": "scp écrit — impossible de recharger : rndc/named/bind9/pdns",
      "n0424": "scp réussi ≠ redémarrage / jointure du pair",
      "n0425": "clé secrets disponible",
      "n0426": "clé maître secrets",
      "n0427": "sentinel n'est pas sentinel",
      "n0428": "sentinel : INFO replication ; veuillez sentinel masters",
      "n0429": "IP serveur IPv4",
      "n0430": "IPv6 serveur invalide",
      "n0431": "setquota PATH — (déployer du )",
      "n0432": "chemin shell invalide",
      "n0433": "signal pour TERM | KILL | HUP | USR1",
      "n0434": "ssh true réussi → vérifié",
      "n0435": "activer sshd keyboard-interactive / challenge-response",
      "n0436": "sshd ne peut pas KbdInteractiveAuthentication — TOTP impossible en SSH",
      "n0437": "sshpass disponible (mot de passe)",
      "n0438": "Match strict utilisateur écrit (mot de passe désactivé)",
      "n0439": "chemin du lien symbolique",
      "n0440": "lien symbolique du répertoire de logs",
      "n0441": "lien symbolique du home du projet",
      "n0442": "échec systemctl",
      "n0443": "échec systemd — PM2/pidfile",
      "n0444": "systemd non : permission d'exécution hôte et admin requises",
      "n0445": "cible : user@host ou user@host:port",
      "n0446": "jeton",
      "n0447": "jeton",
      "n0448": "top -b indisponible ( avec ps pour )",
      "n0449": "transfert : échec rsync dataDir",
      "n0450": "transfert : impossible de créer le répertoire",
      "n0451": "transfert terminé ( bootstrap complet)",
      "n0452": "transfert terminé, échec restore/reapply/verify sur la cible",
      "n0453": "échec du transfert",
      "n0454": "échec du transfert",
      "n0455": "transfert nécessite YSK_EXECUTE=1",
      "n0456": "échec transfer/bootstrap",
      "n0457": "échec ufw",
      "n0458": "unité et action",
      "n0459": "useradd nécessite YSK_EXECUTE + root",
      "n0460": "valeur ( 256KB)",
      "n0461": "vérification désactivée",
      "n0462": "vérification non réussie — pour terminé",
      "n0463": "vérification réussie — job=done",
      "n0464": "échec du démarrage de vsftpd",
      "n0465": "vsftpd démarrage non réussi",
      "n0466": "pondéré : edge",
      "n0467": "wp-config.php — ignoré",
      "n0468": "écrit ≠ Dovecot Pigeonhole — ManageSieve ou lien symbolique vers le sieve utilisateur",
      "n0469": "écrit ≠ Roundcube — enableSystem ou lien symbolique",
      "n0470": "Écrit ≠ appliqué : synchroniser vers conf.d système, exécuter nginx -t, puis recharger",
      "n0471": "écrit ≠ possible — reverse proxy vers le panneau /webdav",
      "n0472": "écrit ≠ processreload",
      "n0473": "Installation CLI ysk-server échouée — peut npm i -g ysk-server",
      "n0474": "ysk-web Nginx/www-data (non lisible par tous)",
      "n0475": "ysk-web YSK_EXECUTE + root (Nginx ne peut pas home en 750)",
      "n0476": "empreinte ysk.json (peut réappliquer )local≠source",
      "n0477": "empreinte ysk.json et",
      "n0478": "empreinte ysk.json et ( bind_ip )",
      "n0479": "ysk.json",
      "n0480": "ysk.json échoué",
      "n0481": "application de zone bloquée ( EXECUTE)— mettre à jour",
      "n0482": "rectification de zone terminée",
      "n0483": "zone invalide",
      "n0484": "zone introuvable :",
      "n0485": "zone échouée",
      "n0486": "Format binlog",
      "n0487": "installer",
      "n0488": "création terminée (brouillon, allez à la page « apply »)",
      "n0489": "et POST",
      "n0490": "La dernière sauvegarde complète a rencontré des échecs",
      "n0491": ": écrire conf → appliquer edges → DNS ( et peut SSL)",
      "n0492": ": PAM /etc/pam.d/sshd (nullok)",
      "n0493": ": installation système libpam-google-authenticator + PAM ()",
      "n0494": "peut supprimer le répertoire",
      "n0495": "peut supprimer le répertoire ou le chemin",
      "n0496": "",
      "n0497": "cette opération",
      "n0498": "Prend en charge (autorise TERM / KILL / HUP / USR1)",
      "n0499": "données",
      "n0500": "supprimer admin",
      "n0501": "port invalide",
      "n0502": "Appliqué au système",
      "n0503": "paramètres écrits dataDir (appliquer au système active le changement système)",
      "n0504": "L'utilisation mémoire de l'hôte dépasse 90 %",
      "n0505": "Métriques de l'hôte",
      "n0506": "Cache de données InnoDB principal",
      "n0507": "Le binaire n'est pas dans le PATH ; le service ne peut pas être prêt",
      "n0508": "Expiration binlog (secondes)",
      "n0509": "Délai d'inactivité interactif",
      "n0510": ": pare-feu, mail PTR/rDNS, conservé",
      "n0511": "vide",
      "n0512": "vers la page Cron « install to system crontab » appliquera réellement",
      "n0513": "avec Nginx root ou \"\" public/",
      "n0514": "Démarrer le service ysk-server en tant que root (systemctl / unité control-plane)",
      "n0515": "Démarrer en tant que root et définir YSK_EXECUTE=1 (voir paramètres hôte / docs de déploiement)",
      "n0516": "avec l'utilisateur (dégradé — pas l'utilisateur Linux du projet)",
      "n0517": "shell — refuser",
      "n0518": "Journal des requêtes lentes",
      "n0519": "serveur non installé (command -v )",
      "n0520": "Durée des requêtes longues (secondes)",
      "n0521": "serveur non installé MySQL",
      "n0522": "serveur non installé PostgreSQL",
      "n0523": "serveur non installé Redis",
      "n0524": "Serveur non installé, impossible de terminer depuis le panneau de gestion",
      "n0525": "serveur : YSK_EXECUTE non activé",
      "n0526": "L'exécution hôte n'est pas activée ou root manquant, impossible de terminer l'installation du panneau",
      "n0527": "L'exécution hôte n'est pas activée, impossible Redis",
      "n0528": "L'exécution hôte n'est pas activée, impossible d'installer Webmail via le panneau",
      "n0529": "L'exécution hôte n'est pas activée, impossible d'appliquer",
      "n0530": "L'exécution hôte n'est pas activée, impossible de créer une connexion SSH",
      "n0531": "L'exécution hôte n'est pas activée, impossible d'effectuer le dump",
      "n0532": "L'exécution hôte est désactivée ; le panneau ne peut pas terminer les opérations système",
      "n0533": "L'exécution hôte n'est pas activée : fichier géré écrit, impossible named-checkzone / recharger",
      "n0534": "Port TCP d'écoute du serveur",
      "n0535": "pour",
      "n0536": "",
      "n0537": "Hash YSK-SCRYPT (pour hash openssl)",
      "n0538": "YSK_SECRETS_KEY",
      "n0539": "chemin baseUrl/.ysk-cdn-health (emplacement health C2)",
      "n0540": "version (dernière Override)",
      "n0541": "YSK_LATEST_VERSION (/)",
      "n0542": "indisponible",
      "n0543": "mysqldump — paquet MySQL impossible",
      "n0544": "pg_dump — paquet Postgres impossible",
      "n0545": "redis-cli — paquet Redis RDB impossible",
      "n0546": "sshpass",
      "n0547": "nécessite rsync (non installé)",
      "n0548": "non validé",
      "n0549": "validé",
      "n0550": "128M, 256M, 512M, -1 ()",
      "n0551": "ex. 512MiB ; laisser vide pour annuler",
      "n0552": "900 1 300 10 ; désactiver",
      "n0553": ": --member 10.0.0.3=réplica:flotte:SESSION_UUID",
      "n0554": "= ASN (système), pas",
      "n0555": "22/80/443 ; peut désactiver le port",
      "n0556": "conservés : 10",
      "n0557": "processus du serveur ysk.pid",
      "n0558": "",
      "n0559": "détecter pam_google_authenticator",
      "n0560": "Sauvegarde tar réussie mais problèmes remote/restic",
      "n0561": "administrateur",
      "n0562": "usurpation admin",
      "n0563": "admin peut opérer",
      "n0564": "sommet A",
      "n0565": "Confs gérées listées (non écrites sur le système)",
      "n0566": "écrire les paramètres PM2, ne pas démarrer",
      "n0567": "écrire le fichier géré (sans recharger)",
      "n0568": "écrire les paramètres gérés — prêt et recharger",
      "n0569": "écrire (ne pas activer)",
      "n0570": "(apply:false) ; mot de passe",
      "n0571": "Prend en charge postgres + postgres-replica",
      "n0572": "Prend en charge redis + redis-replica|redis-sentinel",
      "n0573": ", FRAPPER",
      "n0574": "resolv stub (127.0.0.53) ; DNS via resolvectl",
      "n0575": "Attention, peut",
      "n0576": "pour ; / statut cache des journaux d'accès edge CDN",
      "n0577": "écrira Environment systemd / env du processus",
      "n0578": "autoriser inclusion d’URL",
      "n0579": "autoriser fichier URL",
      "n0580": "fichier autorisé",
      "n0581": ": + / + (enrich)+ ASN ; politique ville désactivée",
      "n0582": "fan-out edge appliqué",
      "n0583": "fan-out edge échoué",
      "n0584": "purge edge réussie",
      "n0585": "rechargement nameserver pair",
      "n0586": "rechargement pair échoué — fichier impossible",
      "n0587": "pair échoué",
      "n0588": "pair : zone et rechargement distant réussis",
      "n0589": "Tout a réussi",
      "n0590": "Tous ignorés (aucun home sauvegardable) — non traité comme échec",
      "n0591": "",
      "n0592": "RDB, restauration",
      "n0593": "Autres variables d’exécution",
      "n0594": "",
      "n0595": "ou",
      "n0596": "— application manuelle\"\" (jamais automatique)",
      "n0597": "Score très élevé — le préréglage d’urgence nécessite une confirmation manuelle (jamais automatique)",
      "n0598": "répertoire",
      "n0599": "processus",
      "n0600": "supprimer confirmation par défaut confirmDefault: true",
      "n0601": "supprimer fichier ou répertoire",
      "n0602": "supprimer utilisateur système — refuser",
      "n0603": "supprimer : l’exécution hôte n’est pas activée, chemin répertoire managedata",
      "n0604": "vers fail2ban appliquer et activer le service",
      "n0605": "vers page activer (soft/normal)",
      "n0606": "Durci",
      "n0607": "ou",
      "n0608": "Sous attaque",
      "n0609": "21 et PASV",
      "n0610": "Écrire uniquement le fichier du panneau",
      "n0611": "Peut s’appliquer au système",
      "n0612": "peut dataDir/clusters/<id>/",
      "n0613": "Vous pouvez consulter les paramètres ; l’installation, le redémarrage et l’écriture des paramètres système nécessitent la permission d’exécution hôte",
      "n0614": "peut \"\" ou \"add\"",
      "n0615": "Installer et configurer Postfix depuis Email",
      "n0616": "peut : SSL, WP-CLI,",
      "n0617": "",
      "n0618": "autoriser restauration vers le répertoire .restic-restore-*",
      "n0619": "Démarrer, arrêter, redémarrer, activer au démarrage",
      "n0620": "démarrer processus pas processus",
      "n0621": "OPcache",
      "n0622": "SSL",
      "n0623": "Actif",
      "n0624": "fichier",
      "n0625": "fichier",
      "n0626": "nœud wsrep, HA ≥2 nœuds",
      "n0627": "\"\"créer MySQL ( ou DB) et WP_DB_*",
      "n0628": "domaine — vacation au niveau domaine conservée",
      "n0629": "Domaine invalide",
      "n0630": "domainStatus : actif ()",
      "n0631": "domainStatus : suspendu (; etc Postfix )",
      "n0632": "Port, adresse de liaison, limites de connexion",
      "n0633": "portcheckAnormal",
      "n0634": "Durée d'exécution",
      "n0635": "Exiger un transport sécurisé (TLS)",
      "n0636": "(.gz, etc.)",
      "n0637": "Bot",
      "n0638": "sonde",
      "n0639": "Dernier recours en cas de perte de contrôle",
      "n0640": "paquet",
      "n0641": "packageinstallnot : autorisation d'exécution hôte requise",
      "n0642": "la mise à jour du package nécessite l'autorisation de l'administrateur système",
      "n0643": "appliquer à vsftpd",
      "n0644": "appliquer au système",
      "n0645": "apply écrira le fichier géré ; YSK_EXECUTE=1 + root appliqué",
      "n0646": "",
      "n0647": "interne (Mo)",
      "n0648": "mot de passe",
      "n0649": "Erreur, veuillez appliquer",
      "n0650": "Sécurité → Ma sécurité → activer la 2FA ; la politique peut définir requireAdminTotp",
      "n0651": "et chemin",
      "n0652": "installer PAM",
      "n0653": "installer vsftpd",
      "n0654": "Échec de l’installation",
      "n0655": "paquet d'installation",
      "n0656": "installation terminée",
      "n0657": "installer",
      "n0658": "installer les paramètres du système",
      "n0659": "",
      "n0660": "",
      "n0661": "mot de passe",
      "n0662": "mot de passe SQL CHANGE_ME",
      "n0663": "Mot de passe stocké en hachage crypt (pas en clair)",
      "n0664": "mot de passe pour",
      "n0665": "mot de passe nécessite sshpass",
      "n0666": "mot de passe nécessite l'installation locale de sshpass",
      "n0667": "mot de passe nécessite 8",
      "n0668": "mot de passe ( 8 )— création sans écriture du hash",
      "n0669": "paramètres du mot de passe",
      "n0670": "etc.",
      "n0671": "et veuillez",
      "n0672": "refuser",
      "n0673": "Écrit NODE_OPTIONS=--max-old-space-size=N",
      "n0674": "écrire le drop-in Nginx",
      "n0675": "écrire home ≠ PAM",
      "n0676": "Échec de l'écriture",
      "n0677": "écrire",
      "n0678": "écrire un fichier",
      "n0679": "",
      "n0680": "Include dans sshd_config, ou POST /api/v1/sftp/sshd-snippet/apply install",
      "n0681": "Isolation utilisateur Linux du projet",
      "n0682": "id projet",
      "n0683": "id projet invalide, impossible home",
      "n0684": "id projet, cannotsystemuser",
      "n0685": "projet internal-sftp Match user shell interactif — TOTP SSH shell/scp",
      "n0686": "journal géré du projet invalide",
      "n0687": "projet",
      "n0688": "projet ou home non configuré",
      "n0689": "le projet ne peut pas être utilisateur système",
      "n0690": "projet",
      "n0691": "projet (503)",
      "n0692": "Échec de la création du projet,",
      "n0693": "domaine du projet — veuillez d'abord configurer le domaine",
      "n0694": "linux_user du projet",
      "n0695": "projet : purger le répertoire cache nginx de l'hôte (pas la zone par vhost)",
      "n0696": "projet : linuxUser manquant — impossible de créer le FTP",
      "n0697": "projetManquant linux_user",
      "n0698": "projet ; ＝",
      "n0699": "Détail du projet → Ressources → créer un utilisateur système / migrer vers /home/ysk-server-{id} (nécessite YSK_EXECUTE + root)",
      "n0700": "prison",
      "n0701": "Répertoire personnel manquant ou hors de la disposition d'isolation du projet",
      "n0702": "pas GeoIP — veuillez « IP » mettre à jour",
      "n0703": "pas un port, veuillez d'abord le projet",
      "n0704": "pas vers le Nginx système (fichier géré)",
      "n0705": "pas créer Redis serveur, veuillez redis-cli, TCP et YSK_EXECUTE=1",
      "n0706": "Non appliqué au service vsftpd — veuillez « apply » ou la page service vsftpd ne démarre pas",
      "n0707": "Non appliqué domaine mail",
      "n0708": "pas l'interface Web — API",
      "n0709": "pas GeoIP — veuillez mettre à jour",
      "n0710": "pas une clé DNSSEC",
      "n0711": "pas un nœud CDN",
      "n0712": "pas une passkey",
      "n0713": "pas (le paquet va)",
      "n0714": "pas les paramètres de connexion LLM",
      "n0715": "pas une zone : veuillez le panneau",
      "n0716": "CDN",
      "n0717": "Pas encore de conf Nginx gérée",
      "n0718": "HIT/MISS disponibles — taux de hit global Inconnu",
      "n0719": "Aucun projet pour le moment",
      "n0720": "— veuillez d'abord le plan",
      "n0721": "Prêt",
      "n0722": "et cookie",
      "n0723": "activer --now fail2ban",
      "n0724": "galera_new_cluster (amorçage)",
      "n0725": "fail2ban rechargé",
      "n0726": "recharger nginx",
      "n0727": "fail2ban redémarré",
      "n0728": "scp zone (écrit sur le pair ≠ named rechargé)",
      "n0729": "scp vers le pair /tmp (écrit sur le pair ≠ service redémarré)",
      "n0730": "systemctl recharger nginx",
      "n0731": "et Roundcube",
      "n0732": "UFW désactivé (Avertissement : hostport)",
      "n0733": "php.ini du projet ; appliquer FPM/",
      "n0734": "paramètres de gestion (Non appliqué au service système)",
      "n0735": "paramètres (non appliqué au système)",
      "n0736": "Supprimé",
      "n0737": "Clé supprimée · authorized_keys",
      "n0738": "Cluster supprimé ; conf système manuelle (v1 )",
      "n0739": "Clé locale supprimée",
      "n0740": "ip addr add (paramètres écrits, redémarrage )",
      "n0741": "appliquer les bases de données (redémarrage)",
      "n0742": "arrêt/redémarrage",
      "n0743": "vers le système et recharger",
      "n0744": "démarrer",
      "n0745": "HSTS activé",
      "n0746": "Synchronisation NTP activée",
      "n0747": "UFW activé",
      "n0748": "WebDAV activé · utilisateur Basic ysk · mot de passe pour le jeton ()",
      "n0749": "Service systemd activé",
      "n0750": "arrêter Redis",
      "n0751": "répertoire de cache nginx et recharger (hôte pas proxy_cache peut )",
      "n0752": "serveur terminé certificat veuillez",
      "n0753": "UFW CF uniquement appliqué (origine CF + keptport)",
      "n0754": "fail2ban appliqué",
      "n0755": "Paramètres appliqués au Postfix système",
      "n0756": "Appliqué à Nginx système",
      "n0757": "Règle de pare-feu appliquée",
      "n0758": "Installé et ysk-server.service",
      "n0759": "Installé dans le crontab système de l'utilisateur",
      "n0760": "Écrit .google_authenticator ( 5 codes de secours)",
      "n0761": "Écrit multimap rspamd + extrait postfix",
      "n0762": "Installation écrite",
      "n0763": "Écrit ; veuillez « applylimits to OS » ou Deploy write unit",
      "n0764": "jail.local de gestion écrit (non appliqué au système)",
      "n0765": "Écrit dans les fichiers gérés ; pas encore appliqué au conf.d système",
      "n0766": "Paramètres écrits (pas le paquet)",
      "n0767": "Écrit ; le projet traitera",
      "n0768": "Fichier géré écrit, conf système non appliquée : YSK_EXECUTE=1",
      "n0769": "Fichier géré écrit, conf système non appliquée : nécessite root",
      "n0770": "blocage : candidateVersion",
      "n0771": "blocage : mise à jour",
      "n0772": "blocage : permission administrateur requise",
      "n0773": "créer le répertoire DNSSEC ()",
      "n0774": "depuis",
      "n0775": "depuis (installation disque non ; uninstall --purge)",
      "n0776": "depuis ; compte système DROP USER (: ne pas supprimer)",
      "n0777": "depuis la connexion",
      "n0778": "refuser",
      "n0779": "refusé par liste d'autorisation",
      "n0780": "refus : raisetarget",
      "n0781": "analyser le journal d'accès nginx",
      "n0782": "Créer un utilisateur MySQL/MariaDB",
      "n0783": "Création PostgreSQL",
      "n0784": "version ()",
      "n0785": "",
      "n0786": "",
      "n0787": "fourre-tout",
      "n0788": "DS (veuillez registrar — le panneau fera)",
      "n0789": "ajouter sauvegarde ( dataDir clé maître peut )",
      "n0790": "hash mot de passe SHA512-CRYPT (Dovecot)",
      "n0791": "vérification des paramètres Nginx ignorée (non installé ou pas de permission de modification système)",
      "n0792": "chemin du certificat (fichier /etc/ysk-server/certs)",
      "n0793": "UA",
      "n0794": "",
      "n0795": "",
      "n0796": "Supprimé",
      "n0797": "Supprimé",
      "n0798": ",",
      "n0799": "version = candidat apt, Available raise",
      "n0800": "Copié vers /etc/fail2ban/jail.local",
      "n0801": "(fichier absent ; peut désinstaller)",
      "n0802": "redémarrer",
      "n0803": "désactivé",
      "n0804": "redémarrer postgresql",
      "n0805": "redémarrer redis-server",
      "n0806": "redémarrer redis-server avec applyrestart",
      "n0807": "redémarrer (recharger)",
      "n0808": "Connexion réactivée (persiste après redémarrage)",
      "n0809": "Conf. edge TLS ()",
      "n0810": "Nginx rechargé (site statique en ligne si le DNS pointe ici)",
      "n0811": "Nginx rechargé",
      "n0812": "Permission de modification système activée (YSK_EXECUTE)",
      "n0813": "mot de passe — Roundcube peut se connecter",
      "n0814": "gérer ; permission système service FTP",
      "n0815": "compte (usermod -U)",
      "n0816": "compte (usermod -L)",
      "n0817": "analyse de chemin",
      "n0818": "cette IP",
      "n0819": "création d'utilisateur système nécessite la permission d'admin système",
      "n0820": "créer le domaine mail et appliquer la page",
      "n0821": "terminé",
      "n0822": "\"\"",
      "n0823": "Vérifier SSH et les ports non essentiels",
      "n0824": "",
      "n0825": "1 réplica ; peut conf. primaire",
      "n0826": "2 nœuds ( 3) ; peut",
      "n0827": "Envisager le mode Under Attack du CDN",
      "n0828": "activer le ban",
      "n0829": "HTTPS (HTTP→301)",
      "n0830": "Plugin d'authentification par défaut",
      "n0831": "",
      "n0832": ": statut=actif",
      "n0833": "Chemin du journal d'erreurs",
      "n0834": "(MS)",
      "n0835": "Journal général",
      "n0836": "certificat veuillez — Échec",
      "n0837": "≥ fichier",
      "n0838": "paramètres conservés sauvegarde",
      "n0839": "Le succès signifie que cette cible accepte BatchMode SSH (non interactif). Il ne s’agit pas d’une concession d’accès mondial.",
      "n0840": "ou 32767",
      "n0841": "logiciel installé",
      "n0842": "autorisation/",
      "n0843": "",
      "n0844": "Binaire CLI introuvable — systemd activera un placeholder silencieux",
      "n0845": "Zone DNS introuvable — veuillez dns.zoneId, ou créer d'abord la zone du domaine",
      "n0846": "PowerDNS introuvable — veuillez installer pdns-server / pdns-tools",
      "n0847": "Répertoire des plugins Roundcube introuvable — Écrit ; veuillez installer Roundcube ou roundcubePluginsDir",
      "n0848": "SQL introuvable",
      "n0849": "Sieve introuvable",
      "n0850": "config.inc.php introuvable — veuillez : $config[\\'plugins\\'][] = \\'ysk_sso\\';",
      "n0851": "edge.conf introuvable — veuillez d'abord",
      "n0852": "Introuvable : clé",
      "n0853": "Introuvable : tâche de migration",
      "n0854": "pm2 introuvable — impossible d'arrêter avec PM2",
      "n0855": "Introuvable",
      "n0856": "Cluster introuvable",
      "n0857": "Introuvable — peut recharger le serveur de noms local (rndc/named/bind9/pdns)",
      "n0858": "Certificat disponible introuvable — veuillez d'abord la page SSL, ou LE",
      "n0859": "Connexion NetworkManager disponible introuvable",
      "n0860": "Introuvable",
      "n0861": "Introuvable",
      "n0862": "Journal d'accès du projet introuvable — veuillez le chemin nginx access_log ou le journal",
      "n0863": "Introuvable",
      "n0864": "Introuvable",
      "n0865": "version introuvable",
      "n0866": "nœud introuvable",
      "n0867": "base de données introuvable",
      "n0868": "refuser",
      "n0869": "refuser down loopback",
      "n0870": "refuser renice",
      "n0871": "refus systemctl enable : CLI agent non installé (placeholder en cours d'exécution)",
      "n0872": "refus loopback ()",
      "n0873": "refus suppression loopback",
      "n0874": "refus homeDir — veuillez overwriteHome + confirmPhrase ou targetdirectory",
      "n0875": "refus PID 1 (init/systemd )",
      "n0876": "refus ysk ; forceControlPlane possible",
      "n0877": "refus (ysk-server) ; requiresplease forceSelf",
      "n0878": "refusreadpath",
      "n0879": "refuspath ou non",
      "n0880": "persist default nécessite Gateway",
      "n0881": "Persistance",
      "n0882": "pour",
      "n0883": "Commande bloquée : le changement d'hôte nécessite la permission system-change (YSK_EXECUTE)",
      "n0884": "balayage",
      "n0885": "chemin de numérisation",
      "n0886": "sonde INFO réplication",
      "n0887": "sonde AFFICHER L'ÉTAT MAÎTRE / RÉPLIQUE",
      "n0888": "sonde pg_is_in_recovery / pg_stat_replication",
      "n0889": "sonde wsrep (AFFICHER LE STATUT COMME 'wsrep%')",
      "n0890": "Le plan de contrôle a écrit la config mais elle n'est pas appliquée sur l'hôte — utilisez Appliquer sur chaque page de fonctionnalité",
      "n0891": "Le plan de contrôle reste en mode normal",
      "n0892": "Dégradation d'urgence du plan de contrôle (ops locales)",
      "n0893": "Répertoire de données du plan de contrôle",
      "n0894": "Le plan de contrôle active l'indication ddos-protection",
      "n0895": "terminé (partiel/échec)",
      "n0896": "Auth plus rapide lorsque les clients n'utilisent que des IP",
      "n0897": ": zones Cloudflare + CF_API_TOKEN d'abordcan Under Attack API",
      "n0898": "je ne peux pas faire",
      "n0899": "Nginx et fail2ban",
      "n0900": "Performances et ressources",
      "n0901": "IP/domaine. veuillez vérifier Spamhaus etc, et.",
      "n0902": "A/AAAA (apex et www)",
      "n0903": "DMARC TXT",
      "n0904": "DNS MX/SPF/DKIM",
      "n0905": "_dmarc TXT avec et.",
      "n0906": "Méthode + seuils",
      "n0907": "DNS MX, SPF (TXT) et DKIM (TXT). Cloudflare : mailoffplease DNS ().",
      "n0908": "Installer les outils PowerDNS depuis la page DNS",
      "n0909": "Installer certbot depuis la page SSL",
      "n0910": "Installer fail2ban depuis le Centre de défense ou la bannière logicielle",
      "n0911": "Installer et activer UFW depuis le Centre de défense",
      "n0912": "Installer Redis depuis la page Redis",
      "n0913": "Installer les paquets requis pour cette vérification",
      "n0914": "Quotidien",
      "n0915": "Journaux",
      "n0916": "répertoire des journaux logwriteproject",
      "n0917": "enregistrer",
      "n0918": "enregistrer",
      "n0919": "logpathallow",
      "n0920": "journal, etc.",
      "n0921": "logpathinvalide",
      "n0922": "",
      "n0923": "et",
      "n0924": "Cache d'ouverture de tables",
      "n0925": "Version PHP",
      "n0926": "Plus de jails fail2ban, bannissements plus rapides",
      "n0927": "veuillez Redis",
      "n0928": "mettre à jour la jail fail2ban (fichier géré)",
      "n0929": "mise à jourIncomplète",
      "n0930": "Limites Nginx les plus strictes (~1 req/s)",
      "n0931": "12 répertoire",
      "n0932": "8 serveur de noms",
      "n0933": "fichier",
      "n0934": "",
      "n0935": "WAL",
      "n0936": "",
      "n0937": "",
      "n0938": "Erreurs de connexion max",
      "n0939": "",
      "n0940": "Serveur HTTP (/health) + répertoire public",
      "n0941": "",
      "n0942": "",
      "n0943": "Augmentation disponible",
      "n0944": "Lorsque des scans / force brute apparaissent",
      "n0945": "",
      "n0946": "Échec du dump base de données/Redis, (sera transféré)",
      "n0947": "service invalide",
      "n0948": "pas WordPress (/)— WORDPRESS_INSTALL.txt",
      "n0949": "pas avec le démarrage d’unité système (nécessite root + )— pidfile",
      "n0950": "pas vers pam_google_authenticator — apt install libpam-google-authenticator",
      "n0951": "pas de 2FA",
      "n0952": "Résumé du plan de contrôle exporté uniquement (Nginx non synchronisé)",
      "n0953": "Non appliqué au nginx système ( YSK_EXECUTE + root)— Statut : écrit",
      "n0954": "Non appliqué au système : YSK_EXECUTE + root",
      "n0955": "redis-cli n'est pas installé",
      "n0956": "pas writefile",
      "n0957": "le système ne peut pas vérifier le changement — sera ok",
      "n0958": "pas vers postgresql conf.d — conf dataDir ; sera appliqué au système",
      "n0959": "pas vers secrets/ssh/.master.key YSK_SECRETS_KEY — la cible ne peut pas vault/2FA",
      "n0960": "pas",
      "n0961": "Non sondé",
      "n0962": "pas de cron certbot/LE (certbot.timer système disponible)",
      "n0963": "pas de conf nginx",
      "n0964": "Passkey inconnue",
      "n0965": "Source inconnue (journal:... / file:... / project:...)",
      "n0966": "Inconnu",
      "n0967": "Logiciel inconnu",
      "n0968": "ID logiciel inconnu",
      "n0969": "Logiciel inconnu",
      "n0970": "Inconnu",
      "n0971": "non, refuser ( dump )",
      "n0972": "pas le home du projet — écrire ftps/ssh ; sshd Match",
      "n0973": "mise à jour non appliquée : veuillez le répertoire git YSK_SOURCE_ROOT, ou publier le paquet npm YSK_NPM_PACKAGE",
      "n0974": "pas — sera\"\"",
      "n0975": "pas — sera",
      "n0976": "pas City Lite — /ASN ; mise à jour possible DB-IP ( CC BY)",
      "n0977": "pas City Lite — / ; veuillez mettre à jour ( DB-IP)",
      "n0978": "pas vers /etc/nginx (pas root ou pas EXECUTE)— conf gérée dataDir",
      "n0979": "paramètre CF_API_TOKEN manquant — API Cloudflare impossible",
      "n0980": "paramètre Cloudflare API Token manquant — dry-run",
      "n0981": "paramètres manquants (désactiver)",
      "n0982": "Fait",
      "n0983": "non, veuillez installer sur le système (installSystem=false)",
      "n0984": "YSK_EXECUTE n’est pas activé",
      "n0985": "Modification système désactivée (le plan de contrôle peut uniquement écrire les paramètres)",
      "n0986": "modification système non activée : dnssec-keygen impossible",
      "n0987": "pas de mot de passe — vérifier l’e-mail ()",
      "n0988": "vérification/rechargement impossible : l’exécution serverHost n’est pas activée (écrire le fichier géré)",
      "n0989": "conf, veuillez d’abord planifier",
      "n0990": "sauvegarde",
      "n0991": "zone",
      "n0992": "certificat ( ou depuis non )",
      "n0993": "invalide",
      "n0994": "Limite de ban atteinte cette heure — consultez le Defence Center",
      "n0995": "ip locale peut prendre en charge -j ; veuillez mettre à niveau iproute2 ( notes)",
      "n0996": "nginx local -t OK ( conf gérée, ≠ edge appliqué)",
      "n0997": "wsrep local possible, taille pas nœud",
      "n0998": "ysk.json local illisible / empreinte",
      "n0999": "Le nœud local est OK ; un état de santé complet nécessite une sonde par les pairs (non effectuée).",
      "n1000": "nginx local — conf écrite, pas de rechargement",
      "n1001": "connexion NM localeDisponible ; réussira. peut \"\" ou NetworkManager.",
      "n1002": "ps localDisponible — impossible ()",
      "n1003": "connexion NM locale ; réussira. peut \"\" ou NetworkManager.",
      "n1004": "peut ban",
      "n1005": "invalide",
      "n1006": "étatService",
      "n1007": "Utilisation du système de fichiers racine supérieure à 90 %",
      "n1008": "répertoireinvalide",
      "n1009": "Espace disque racine",
      "n1010": "Vue d'ensemble",
      "n1011": "TcpListener ( crate) ; Cargo.toml",
      "n1012": "net/http ; go.mod ; / et /health",
      "n1013": "Mode : prêt pour la production",
      "modeProductionCapable": "prêt pour la production",
      "modeDegraded": "dégradé",
      "n1014": ": non",
      "n1015": "Dry-run terminé — rien copié ni rechargé (désactivez le dry-run pour une sync réelle)",
      "n1016": "Dry-run terminé — la sync réelle nécessite root et YSK_EXECUTE",
      "n1017": "with.conf",
      "n1018": "with.sieve",
      "n1019": "Fichiers",
      "n1020": "fichier et POST",
      "n1021": "Le fichier n’existe pas ou peut",
      "n1022": "Le fichier n’existe pas ou Supprimé",
      "n1023": "vérifierprocessus ; hôte",
      "n1024": "vérifierfichier",
      "n1025": "vérifier ()",
      "n1026": "vérifier",
      "n1027": "pour, impossibleécrire",
      "n1028": "permission pour 3–4",
      "n1029": "permission et",
      "n1030": "OK",
      "n1031": "Opérations quotidiennes",
      "n1032": "veuillez SECRET_KEY/DEBUG et configbase de données",
      "n1033": "le planificateur prend en charge mariadb + mariadb-galera",
      "n1034": "le planificateur prend en charge mysql + mysql-replica",
      "n1035": "cethôte service systemd gère",
      "n1036": "ceprojet runtime Node, veuillez Node",
      "n1037": "ceprojet runtime Node, veuillez Node ( ou runtime pour statique)",
      "n1038": "cettemise à jour (/). veuillez appliquer.",
      "n1039": "ceci pour (DNS /IP ) ; impossible PTR/ 25",
      "n1040": "ceciappliquer au système",
      "n1041": "celogiciel paquet apt",
      "n1042": "paramètres ;,, limites",
      "n1043": "projet avec utilisateur Linux/actif",
      "n1044": "Plafond horaire d’auto-ban",
      "n1045": "(IPinfo Lite)",
      "n1046": "Bannissement permanent",
      "n1047": "nœud edge — veuillez d'abord la page edge CDN",
      "n1048": "peut appliquer raise (candidat ou et version)",
      "n1049": "project peut restic",
      "n1050": "project peut backup (0 )— pour Failed",
      "n1051": "peut pour",
      "n1052": "log/backup ; hostsettings",
      "n1053": "règle de pare-feu – refuser",
      "n1054": "requiert et",
      "n1055": "créer un utilisateur système...",
      "n1056": "browserenabledone installation WP",
      "n1057": ".zone peut",
      "n1058": "HostExecutor — veuillez chown le fichier",
      "n1059": "HostExecutor — chown (veuillez chown)",
      "n1060": "IP écrit DNS",
      "n1061": "NM connection peut ;",
      "n1062": "NM connection peut ;",
      "n1063": "Dump Redis",
      "n1064": "Dump base SQL",
      "n1065": "Cible SSH",
      "n1066": "cible SSH/fleet",
      "n1067": "statut cache access log, répertoire cache — hit-rate Unknown (veuillez log_format ou d'abord apply edge)",
      "n1068": "access=flotte FleetAgentId",
      "n1069": "access=ssh — veuillez create:ssh ou members",
      "n1070": "Écrit sur le control plane ; non appliqué sur l'hôte",
      "n1071": "apt-obtenir",
      "n1072": "défi d'authentification",
      "n1073": "liaison_ip",
      "n1074": "dataDir — base de données mise à jour",
      "n1075": "domaine vacation.sieve — ignoré par boîte aux lettres",
      "n1076": "edge peut apply ( skip/drain)— conf écrite",
      "n1077": "galera_new_cluster ; restart mariadb",
      "n1078": "rép_accueil",
      "n1079": "install — Status pour stocké",
      "n1080": "LinuxUtilisateur",
      "n1081": "clé maître / YSK_SECRETS_KEY",
      "n1082": "nameserver (ne peut pas config)",
      "n1083": "rdbRelPath",
      "n1084": "défi d'enregistrement",
      "n1085": "pair ssh",
      "n1086": "pair ssh peut",
      "n1087": "sshpass ( clé/agent )",
      "n1088": "vacation.sieve peut",
      "n1089": "vhost requiresupdate ( ou conf server )",
      "n1090": "wsrep Status (pas Galera ou service non )",
      "n1091": "jail active ou fail2ban non démarré",
      "n1092": "enregistrer",
      "n1093": "peut system ( écrit)",
      "n1094": "peut target ( healthUrl / baseUrl / publicIpv4)",
      "n1095": "Access log disponible ( ou )",
      "n1096": "Access log disponible (Available / ban)",
      "n1097": "Access/auth log disponible",
      "n1098": "IP edge disponible — DNS (reste géré )",
      "n1099": "Utilisateur strict disponible ( ou non )",
      "n1100": "conf invalide",
      "n1101": "Identifiant d'export invalide",
      "n1102": "export invalide",
      "n1103": "linux_user invalide",
      "n1104": "Clé publique invalide",
      "n1105": "Identifiant de snapshot invalide",
      "n1106": "Jeton invalide",
      "n1107": "Unité invalide",
      "n1108": "unité invalide",
      "n1109": "vacuum-size invalide (: 500M)",
      "n1110": "vacuum-time invalide (: 7d)",
      "n1111": "sauvegardeinvalide",
      "n1112": "sauvegardeinvalide",
      "n1113": "portinvalide",
      "n1114": "clé invalide",
      "n1115": "projectId invalide",
      "n1116": "sauvegarde invalide",
      "n1117": "motif invalide",
      "n1118": "règleinvalide",
      "n1119": "baseinvalide",
      "n1120": "domaine — map pour (systemapplywill postmap )",
      "n1121": "IP",
      "n1122": "Enrichissement auto-ban disponible",
      "n1123": "impossible de bannir vers le système : YSK_EXECUTE ; bannir via le panneau",
      "n1124": "impossible de dump Redis : redis-cli",
      "n1125": "impossible de dump : l'exécution serverHost n'est pas activée",
      "n1126": "impossible de diffuser : l'exécution Host n'est pas activée",
      "n1127": "impossible d'importer : l'exécution serverHost n'est pas activée",
      "n1128": "impossible de lister : l'exécution Host n'est pas activée",
      "n1129": "impossible de sonder le cluster DNS : l'exécution Host n'est pas activée",
      "n1130": "impossible de sonder : l'exécution Host n'est pas activée (SSH EXECUTE)",
      "n1131": "impossible de purger le cache : l'exécution Host n'est pas activée (YSK_EXECUTE)",
      "n1132": "impossible de purger : l'exécution Host n'est pas activée",
      "n1133": "impossible de recharger à distance : l'exécution Host n'est pas activée",
      "n1134": "impossible d'utiliser restic : l'exécution Host n'est pas activée",
      "n1135": "impossible de restaurer : l'exécution Host n'est pas activée",
      "n1136": "impossible d'utiliser scp : YSK_EXECUTE=1",
      "n1137": "impossible d'obtenir le stat du home",
      "n1138": "impossible de créer le lien symbolique : l'exécution Host n'est pas activée",
      "n1139": "impossible de débannir : l'exécution Host n'est pas activée",
      "n1140": "impossible de débannir : YSK_EXECUTE",
      "n1141": "impossible d'utiliser Adminer : l'exécution Host n'est pas activée",
      "n1142": "impossible d'utiliser WordPress : l'exécution serverHost n'est pas activée",
      "n1143": "impossible d'utiliser PM2, localprocessmanage",
      "n1144": "impossible : YSK_EXECUTE non activé",
      "n1145": "impossible d'arrêter PM2 : l'exécution serverHost n'est pas activée",
      "n1146": "impossible d'utiliser SSL : l'exécution Host n'est pas activée",
      "n1147": "Sync bloquée : YSK_EXECUTE requis",
      "n1148": "impossible vers le Nginx système : permission d'exécution Host requise",
      "n1149": "impossible de démarrer PM2 : l'exécution serverHost n'est pas activée",
      "n1150": "impossible Apache : permission d'exécution Host requise",
      "n1151": "impossible NTP : permission d'exécution Host et root requis",
      "n1152": "impossible PHP-FPM : permission d'administration système requise",
      "n1153": "impossible service systemd (veuillez accorder la permission)",
      "n1154": "impossible service systemd : permission d'administration système requise",
      "n1155": "impossible service : permission d'administration système requise",
      "n1156": "impossible d'installer rsync sur la cible, rsync cible",
      "n1157": "impossible de créer le compte système : YSK_EXECUTE + root requis ; (écrit/bloqué)",
      "n1158": "impossible certbot : l'exécution Host n'est pas activée",
      "n1159": "opération impossible : permission d'exécution Host requise (YSK_EXECUTE) et root",
      "n1160": "impossible d'appliquer au système : YSK_EXECUTE + root requis",
      "n1161": "impossible d'appliquer les paramètres système : permission d'exécution Host requise",
      "n1162": "impossible d'appliquer : échec",
      "n1163": "impossible d'installer PowerDNS : permission d'administration système requise",
      "n1164": "impossible d'installer dans /etc/ssh : YSK_EXECUTE + root requis",
      "n1165": "impossible d'installer sur le système : l'exécution serverHost n'est pas activée (écriture du fichier géré)",
      "n1166": "impossible : l'exécution serverHost n'est pas activée ou service mail non installé",
      "n1167": "impossible de créer la base d'utilisateurs virtuels (db_load)",
      "n1168": "impossible de créer la base de données, échec possible",
      "n1169": "impossible de créer l'utilisateur mail système : permission d'administration système requise",
      "n1170": "impossible depuis npm ou version GitHub (non )",
      "n1171": "impossible de sonder systemctl",
      "n1172": "impossible cluster DNS : l'exécution Host n'est pas activée",
      "n1173": "impossible : l'exécution Host n'est pas activée (backupSuccess)",
      "n1174": "impossible métriques",
      "n1175": "impossible : l'exécution serverHost n'est pas activée",
      "n1176": "impossible ACME : l'exécution Host n'est pas activée",
      "n1177": "impossible de chiffrer le hash du mot de passe (openssl passwd requis)",
      "n1178": "impossible : l'exécution serverHost n'est pas activée",
      "n1179": "impossible Tâches (état ps en échec)",
      "n1180": "impossible zone vers le répertoire dnssec",
      "n1181": "impossible empreinte ysk.json",
      "n1182": "impossible /etc/resolv.conf",
      "n1183": "impossible de lire cmdline (possible ou permission)",
      "n1184": "impossible de lire la règle numérotée",
      "n1185": "impossible de lire statfs",
      "n1186": "impossible de lire : l'exécution serverHost n'est pas activée",
      "n1187": "impossible de lire l'utilisateur avec vérification 2FA",
      "n1188": "impossible de lire la cible",
      "n1189": "impossible de modifier UFW : YSK_EXECUTE=1",
      "n1190": "impossible de modifier host/ : permission d'exécution Host et root requis",
      "n1191": "impossible de modifier : permission d'exécution Host requise (YSK_EXECUTE) et root",
      "n1192": "impossible zone PowerDNS : l'exécution serverHost n'est pas activée",
      "n1193": "impossible IPv4/IPv6",
      "n1194": "impossible connexion 127.0.0.1:6379",
      "n1195": "impossible connexion cible",
      "n1196": "",
      "n1197": "Aucun bloqueur dur dans cette sonde",
      "n1198": "répertoire des clés",
      "n1199": "utilisateur",
      "n1200": "— sieve système",
      "n1201": "créer un répertoire",
      "n1202": "Disjoncteur",
      "n1203": "Écrit dataDir/security/fail2ban (pas dans /etc)",
      "n1204": " ; veuillez recharger",
      "n1205": "Statut brouillon — veuillez aller à la page service FTP « apply » pour écrire vsftpd",
      "n1206": "Statut et version",
      "n1207": "Statut :",
      "n1208": "Statut : appliqué (anvil + politique par expéditeur + maps)",
      "n1209": "Statut : appliqué (lien symbolique + config plugins[] Enabled)",
      "n1210": "Statut : appliqué (répertoire)",
      "n1211": "Statut : appliqué ( homeDir)",
      "n1212": "Statut : appliqué (systemSuccess)",
      "n1213": "Statut : appliqué (clé + zone ; pas le registrar )",
      "n1214": "Statut : bloqué — fichier géré écrit ; pas Postfix/Dovecot",
      "n1215": "Statut : bloqué (espace réservé écrit)",
      "n1216": "Statut : bloqué (démon de politique ; systemapply EXECUTE+root)",
      "n1217": "Statut : exécuté ≠, rechargement certbot effectué",
      "n1218": "Statut : échec (nginx -t ou rechargement échoué)",
      "n1219": "Statut : partiel — sera appliqué (Success)",
      "n1220": "Statut : partiel — systemFailed",
      "n1221": "Statut : partiel (lien symbolique Success ; ajout config plugins)— application sera complétée",
      "n1222": "Statut : aperçu uniquement",
      "n1223": "Statut : écrit/partiel (system/reload/verify pas Success)",
      "n1224": "Statut : écrit/partiel (étapes clés Failed — appliqué)",
      "n1225": "Statut : écrit (apply=false ; non appliqué au système)",
      "n1226": "Statut : écrit (application système bloquée)",
      "n1227": "Statut : écrit (conf écrite ; rechargement bloqué)",
      "n1228": "Statut : écrit ()— edge non appliqué ; fan-out PR-C3 + nginx -t/reload",
      "n1229": "Statut : écrit (non appliqué au système Postfix/Rspamd)",
      "n1230": "Statut : écrit (pas vers le système Nginx ; applySystem tentera le rechargement)",
      "n1231": "Statut : écrit (géré ; fail2ban-client live YSK_EXECUTE, ou « →apply to system » jail.local)",
      "n1232": "Statut : écrit (clé/DS ; zone absente ou pas de zone )",
      "n1233": "Statut : écrit (pas SSO)",
      "n1234": "Statut : écrit (pas /pas )— Success",
      "n1235": "Statut : écrit (/fichier géré)",
      "n1236": "Statut : écrit et rechargement nameserver réussi",
      "n1237": "Statut : zone gérée écrite (pas pour DNS, pas de rechargement nameserver)",
      "n1238": "Statut : fichier géré écrit (non appliqué au système)",
      "n1239": "Statut : données (pas )",
      "n1240": "TOTP ( et 2FA opérateur du panneau )",
      "n1241": "2FA opérateur du panneau",
      "n1242": "Cycle de vie",
      "n1243": "peut désactiver et recharger",
      "n1244": "veuillez désactiver",
      "n1245": "Porte de production : non entièrement satisfaite — examinez les éléments ci-dessous",
      "n1246": "Porte de production : réussie (permissions, Nginx, Node prêts)",
      "n1247": "Isolation de production : ouvrez l’onglet Ressources du projet pour créer un utilisateur Linux et un home",
      "n1248": "utilisateur 2–32 [a-z0-9._-]",
      "n1249": "veuillez SSL nécessite un domaine et",
      "n1250": "limites ; chemin :",
      "n1251": "système ; chemin possible",
      "n1252": "",
      "n1253": "Ignorer la résolution de nom DNS",
      "n1254": "chown ignoré (pas avec root )",
      "n1255": "chown ignoré ( YSK_EXECUTE + root)— filecan pour l'utilisateur",
      "n1256": "nœud en drain",
      "n1257": "rechargement ignoré : zone verifyFailed",
      "n1258": "rechargement distant (reload=false)— écrit ≠ appliqué",
      "n1259": "usermod (pas os_provisioned)",
      "n1260": "application de zone ignorée (applyZone=false)— mettre à jour les enregistrements",
      "n1261": "Nom d'utilisateur invalide ignoré",
      "n1262": "DDoS — Dégradé actif",
      "n1263": "IP : deny",
      "n1264": ": ignoré",
      "n1265": "IP/domaine et",
      "n1266": "Adresses à lier (0.0.0.0 = toutes)",
      "n1267": "",
      "n1268": "avec localprocess",
      "n1269": "avec PHP",
      "n1270": "permission pour firewallStatus (pas )",
      "n1271": "Exécution non root ; certains paramètres système ne peuvent pas être appliqués",
      "n1272": "cible ysk.json Échec",
      "n1273": "cible CLI ysk-server — veuillez bootstrap ou npm i -g ysk-server",
      "n1274": "données YSK cibles, forceWipeTarget",
      "n1275": "rsync cible",
      "n1276": "pour root",
      "n1277": "utilisateur cible",
      "n1278": "rsync cible ( installation bootstrap)",
      "n1279": "cible nécessite sshpass (Non installé)",
      "n1280": "cible Échec",
      "n1281": "cible non validée",
      "n1282": "cible validée",
      "n1283": "avec .zip",
      "n1284": "exécuter vraiment + YSK_EXECUTE=1",
      "n1285": "<?",
      "n1286": "ignoré : pas os_provisioned",
      "n1287": "utilisateur invité",
      "n1288": "80/443 accessible de vers (LE HTTP-01)",
      "n1289": "Runtime PHP et FPM prêts",
      "n1290": "Port 25",
      "n1291": "Disque, sauvegardes, AOF/WAL",
      "n1292": "Espace disque faible",
      "n1293": "",
      "n1294": "/local, appliquer geo",
      "n1295": "",
      "n1296": "; 0 = (CLI)",
      "n1297": "; veuillez",
      "n1298": "paquet",
      "n1299": "Durée de conservation des journaux binaires",
      "n1300": "invalide",
      "n1301": "nœud edge",
      "n1302": "version hôte",
      "n1303": "hôte du nœud invalide",
      "n1304": "nœud invalide",
      "n1305": "nœud en drain —, Statut draining",
      "n1306": "application système YSK_EXECUTE + root",
      "n1307": "utilisateur système (pas provision ou )",
      "n1308": "Administrateur système (root)",
      "n1309": "Pas root — chemins système useradd / systemd / nginx restreints",
      "n1310": "Permission de modification système",
      "n1311": "Charge système",
      "n1312": "Logiciels système",
      "n1313": "",
      "n1314": "",
      "n1315": "",
      "n1316": "(vérifier le port ne peut pas)",
      "n1317": "impossible de se connecter",
      "n1318": "Internet",
      "n1319": "rsync",
      "n1320": "chut",
      "n1321": "ysk.json",
      "n1322": "Conf manquante, veuillez d'abord planifier",
      "n1323": "dataDir manquant, impossible d'installer le runtime",
      "n1324": "linuxUser/homeDir manquant",
      "n1325": "Bannissement temporaire",
      "n1326": "cléÉchec",
      "n1327": "Échec de l'installation de la clé",
      "n1328": "VACUUM",
      "n1329": "interdire → désactivé ()",
      "n1330": "ban : enablesystemchange non activé (YSK_EXECUTE)",
      "n1331": "interdire",
      "n1332": "Basculement auto ou manuel",
      "n1333": "désactiver",
      "n1334": "IP : deny",
      "n1335": "",
      "n1336": ": Statut écrit — pas Dovecot/Pigeonhole ( ManageSieve ou lien symbolique)",
      "n1337": "auto-escaladé",
      "n1338": "chemin autorisé",
      "n1339": "cible",
      "n1340": "nœud edge",
      "n1341": "nécessite un domaine",
      "n1342": "nécessite un nœud",
      "n1343": "requiert (control/origin/edge/dns)",
      "n1344": "et 2FA de l'opérateur du panneau",
      "n1345": "authorized_keys distant, mettre à jour ou authorize-self",
      "n1346": "Domaine invalide",
      "n1347": "Taille de la table tmp",
      "n1348": "filtre/prison systemctl recharge fail2ban",
      "n1349": "Échec jail.local",
      "n1350": "Voir le journal d'audit",
      "n1351": "Succès (secret )",
      "n1352": "limite_req",
      "n1353": "invalide",
      "n1354": "Somme des signaux 0–100 → niveau de menace",
      "n1355": "Mémoire, tampons, concurrence",
      "n1356": "",
      "n1357": "Forte utilisation mémoire",
      "n1358": "Pression mémoire",
      "n1359": "",
      "n1360": "Mémoire et V8",
      "n1361": "Taille max. de la table heap",
      "n1362": "peut pour",
      "n1363": "",
      "n1364": "Erreur vers le journal",
      "n1365": "",
      "n1366": "paramètres DNS (PTR)",
      "n1367": "gestion des paramètres ; conf système/permission de redémarrage",
      "n1368": "Écriture des paramètres — application échouée",
      "n1369": "Écriture paramètres connexion — redémarrage échoué ; veuillez nmcli connection up",
      "n1370": "Écriture paramètres connexion échouée, veuillez nmcli connection up",
      "n1371": "paramètres produit ysk-server",
      "n1372": "Erreur paramètres ( pour )",
      "n1373": "paramètres dataDir manquant",
      "n1374": "bloquer TCP 25. veuillez, ou SMTP.",
      "n1375": "Score",
      "n1376": ": créer, etc. CDN",
      "n1377": ": le résolveur fera A — ; IP edge ou Anycast",
      "n1378": "veuillez indiquer le CIDR, 192.168.1.10/24",
      "n1379": "veuillez utiliser POST /api/v1/ssl/upload ou POST /api/v1/ssl/letsencrypt",
      "n1380": "veuillez d'abord le nœud CDN (PR-C1)",
      "n1381": "veuillez d'abord maintenanceAccepted",
      "n1382": "Ouvrir les ops de sauvegarde et vérifier sideResults",
      "n1383": "Ouvrir la page Sauvegardes pour plus de détails",
      "n1384": "Ouvrir Alertes → audit apply-status",
      "n1385": "Ouvrir le Centre de défense pour examiner les signaux et changer le préréglage de protection",
      "n1386": "veuillez installer la conf pair et redémarrer / rejoindre",
      "n1387": "Veuillez saisir serverName",
      "n1388": "veuillez indiquer serverName et upstream",
      "n1389": "veuillez indiquer serverName et le répertoire",
      "n1390": "veuillez indiquer serverName, le répertoire et le socket FPM",
      "n1391": "Veuillez saisir la zone",
      "n1392": "veuillez indiquer la zone",
      "n1393": "veuillez indiquer l'hôte",
      "n1394": "veuillez indiquer le cluster (≤64)",
      "n1395": "veuillez",
      "n1396": "veuillez indiquer l'utilisateur, et",
      "n1397": "veuillez indiquer le nœud (IP indisponible)",
      "n1398": "veuillez indiquer l'IP DNS A/AAAA ; vérifier le pare-feu et le PTR mail",
      "n1399": "veuillez mapper le XML vers le nom d'hôte, ou vers l'hôte DNS",
      "n1400": "Veuillez spécifier l'IP",
      "n1401": "veuillez indiquer l'action ou mtu",
      "n1402": "Veuillez spécifier dataDir",
      "n1403": "Veuillez spécifier listenHost",
      "n1404": "veuillez indiquer le chemin zip",
      "n1405": "veuillez indiquer la sauvegarde",
      "n1406": "veuillez indiquer le statut (/)",
      "n1407": "veuillez",
      "n1408": "veuillez",
      "n1409": "veuillez indiquer settingspath",
      "n1410": "Spécifier un chemin et une permission",
      "n1411": "Spécifier un chemin et une version",
      "n1412": "Spécifier un chemin et",
      "n1413": "veuillez indiquer DKIM",
      "n1414": "veuillez indiquer l'URL Git ( ou d'abord projectsettings)",
      "n1415": "veuillez indiquer l'IP",
      "n1416": "veuillez indiquer le paquet",
      "n1417": "veuillez indiquer le paquet et la version",
      "n1418": "veuillez indiquer le mot de passe ( 8 )",
      "n1419": "veuillez",
      "n1420": "veuillez",
      "n1421": "veuillez — Activé",
      "n1422": "veuillez « apply to system » ou le projet PHP (pool php_admin_*)",
      "n1423": "veuillez /etc/default/ufw IPV6=yes",
      "n1424": "Assurez-vous que dataDir existe et que le processus peut y écrire",
      "n1425": "veuillez indiquer le nameserver, ou « restore DHCP DNS »",
      "n1426": "veuillez indiquer publicIpv4 / publicIpv6 / healthUrl / baseUrl",
      "n1427": "veuillez",
      "n1428": "veuillez indiquer le fichier",
      "n1429": "veuillez indiquer les limites IP ou l'auth HTTP",
      "n1430": "Avertissement : manifest packagedAt — veuillez d'abord packager la BD",
      "n1431": "Avertissement : unit pour active — binaire CLI introuvable (unit placeholder possible)",
      "n1432": "Avertissement : données YSK cibles",
      "n1433": "Avertissement : cette interface peut mettre le panneau hors service",
      "n1434": "Avertissement : secrets/ssh/.master.key YSK_SECRETS_KEY (vault/2FA peut être indisponible)",
      "n1435": "Avertissement : config.json (configuration possible )",
      "n1436": "échec de lecture des bannis",
      "n1437": "lecture des bannis : permission requise ; unban/ban nécessite YSK_EXECUTE",
      "n1438": "échec de lecture des bannis (permission ou service)",
      "n1439": "échec de lecture des bans fail2ban",
      "n1440": "échec de lecture",
      "n1441": "échec de lecture du journal",
      "n1442": "lire le fichier",
      "n1443": "lire le système",
      "n1444": "modifier la valeur par défaut confirmDefault : true",
      "n1445": "la modification écrira le fichier géré ; « apply to system » écrira /etc/php/.../conf.d et rechargera FPM",
      "n1446": "Charge élevée",
      "n1447": "données disponibles ; install/restart du service — permission d'exécution Host requise",
      "n1448": "base de données disponible (>7 )— mettre à jour",
      "n1449": "impossible de créer la base de données. mysql et YSK_EXECUTE=1 requis.",
      "n1450": "impossible de créer la base de données. psql, TCP et YSK_EXECUTE=1 requis.",
      "n1451": "base de données",
      "n1452": "nom de la base de données",
      "n1453": "base de données",
      "n1454": "répertoire de données",
      "n1455": "Ouvrez l'onglet Resources du projet pour créer l'utilisateur système",
      "n1456": "limites",
      "n1457": "",
      "n1458": "chemin autorisé",
      "n1459": "chemin autorisé pour le répertoire de journaux",
      "n1460": "chemin refusé",
      "n1461": "",
      "n1462": "home : cible canonique complète",
      "n1463": " ; pour setquota, utilisez « applylimits to OS »",
      "n1464": "",
      "n1465": "données invalides",
      "n1466": " ; packaging possible",
      "n1467": "pour 25 % de RAM",
      "n1468": "Connexions et réseau",
      "n1469": "(KILL possible)",
      "n1470": "(kill -0 échoué)",
      "n1471": "Avancé",
      "n1472": " : panneau secret ( et 2FA opérateur — )",
      "n1473": "Opérations",
      "n1474": "paramètres SFTP incomplets (host/username/path)",
      "n1475": "appliqué ≠ cluster sain — veuillez exécuter probe --peers",
      "n1476": "échec du post de migration",
      "n1477": "échec de mkdir",
      "n1478": "message ok = faux",
      "n1479": "sauvegarde absente (ignorée)",
      "n1480": "installer YSK_EXECUTE=1",
      "n1481": "rndc introuvable / named|bind9|pdns inactif",
      "n1482": "Échec du push distant ou de restic — le tar local a peut-être réussi ; voir sideResults",
      "n1483": "fichier,,",
      "n1484": "named/bind9/pdns actif (scp du fichier possible)",
      "n1485": "nginx — conf scp (écrit sur le pair)",
      "n1486": "Étapes distantes / restic traitées",
      "n1487": "nécessite YSK_EXECUTE + root",
      "n1488": "restore sans chown (Nécessite root + YSK_EXECUTE)",
      "n1489": "DNSBL incomplet. Prend en charge IPv6 ;",
      "n1490": "pair appliqué ; écrit ou Échec — rechargement du cluster",
      "n1491": "rechargement du pair Réussi (partiel)",
      "n1492": "Certaines ou toutes les sauvegardes ont échoué — voir les résultats",
      "n1493": "ou Non appliqué au système ( YSK_EXECUTE)",
      "n1494": "Échec — vérifier la clé SSH / le pare-feu",
      "n1495": "Échec — étapes",
      "n1496": "échec système",
      "n1497": "",
      "n1498": "PHP + Nginx (application/public)",
      "n1499": "Peut être remplacé au moment du déploiement",
      "n1500": "exécutera go build -o app. ; toolchain Go installée sur l'hôte",
      "n1501": "exécutera venv + pip ; ExecStart uvicorn main:app",
      "n1502": "exécutera venv + pip ; entrée app.py (pas ASGI)",
      "n1503": "/apply écrit php_admin_value dans le pool FPM",
      "n1504": ": panneau\"\"démarrera server.js ; écrit ≠",
      "n1505": "hôte de messagerie A",
      "n1506": "hôte de messagerie AAAA (IPv6)",
      "n1507": "Répertoire des paramètres de gestion du courrier",
      "n1508": "ID invalide",
      "n1509": "invalide",
      "n1510": "pour 1–1000000 MiB",
      "n1511": "1 Mo",
      "n1512": "redémarrer le service système",
      "n1513": "ajouter un ban",
      "n1514": "recharger vsftpd",
      "n1515": "recharger le service",
      "n1516": "Erreur etc",
      "n1517": "Journal d'erreurs, journal des requêtes lentes",
      "n1518": "Erreur et journal",
      "n1519": "Valeurs de seuil",
      "n1520": "ROW recommandé pour la réplication",
      "n1521": "Délai d'attente",
      "n1522": "Désactivé",
      "n1523": "pare-feu ( UFW non appliqué au système)",
      "n1524": "pare-feu () : TCP 3306, 4567, 4444, 4568",
      "n1525": "Le préréglage écrit nginx limit_req",
      "n1526": "(maintien), inférieur",
      "n1527": "Défense : critique",
      "n1528": "Défense : préréglage d'urgence suggéré",
      "n1529": "Défense : attaque possible",
      "n1530": "limites écrites ; appliquer à l'OS YSK_EXECUTE + root",
      "n1531": "Limitation de débit",
      "n1532": "",
      "n1533": "/ DB ; Postfix/Rspamd veuillez « apply/ to system »",
      "n1534": ": dégradé — build/processus possible avec l'utilisateur ; veuillez créer l'utilisateur système",
      "n1535": ": dégradé — processus possible avec l'utilisateur ; veuillez root + YSK_EXECUTE et créer l'utilisateur système",
      "n1536": "enregistrer ; secret TOTP. L'authenticator peut.",
      "n1537": "EXECUTE + root d'abord pour vacuum",
      "n1538": "NetworkManager actif persiste le DNS (écrira /etc/resolv.conf)",
      "n1539": "YSK_EXECUTE d'abord pour appliquer ufw",
      "n1540": "YSK_EXECUTE activera réellement l'auto-ban",
      "n1541": "YSK_EXECUTE bannir",
      "n1542": "Service fail2ban YSK_EXECUTE",
      "n1543": "YSK_EXECUTE=1 peut d'abord vacuum le journal",
      "n1544": "execute:true ou dryRun:true",
      "n1545": "nginx log_format $upstream_cache_status (ou X-YSK-Cache) d'abord HIT/MISS",
      "n1546": "Nécessite root + YSK_EXECUTE pour réellement useradd ; succès",
      "n1547": "Nécessite root journalctl --vacuum",
      "n1548": "Nécessite root pour pouvoir d'abord UFW",
      "n1549": "cargo/rustc installé sur l'hôte",
      "n1550": "Python et pip sur l'hôte",
      "n1551": "Python et pip sur l'hôte (échec de l'installation)",
      "n1552": "Installer bind9-dnsutils et activer le changement de permission système, peut réellement dnssec-keygen.",
      "n1553": "Nécessite la chaîne de confirmation EMERGENCY ; évitez de vous verrouiller",
      "n1554": "Paramètres système sshd Match/User réellement",
      "n1555": "nécessite --target ou resume --job",
      "n1556": "nécessite les permissions admin MySQL/MariaDB",
      "n1557": "nécessite YSK_EXECUTE",
      "n1558": "nécessite YSK_EXECUTE Adminer",
      "n1559": "nécessite admin",
      "n1560": "nécessite aws CLI (ou dépôt restic s3)",
      "n1561": "nécessite id ou all",
      "n1562": "nécessite ip",
      "n1563": "nécessite jobId",
      "n1564": "nécessite linuxUser ou projectId",
      "n1565": "nécessite le nœud master",
      "n1566": "nécessite nginx geoip2 (libnginx-mod-http-geoip2) d'abord pour HTTP",
      "n1567": "nécessite le nœud primary",
      "n1568": "nécessite privateKey",
      "n1569": "nécessite projectId",
      "n1570": "nécessite root",
      "n1571": "nécessite source",
      "n1572": "nécessite sshpass, clé YSK (identityId), ou clé SSH locale",
      "n1573": "nécessite target (root@host) ou jobId avec resume",
      "n1574": "nécessite target, ou target jobId",
      "n1575": "nécessite username et ssh-",
      "n1576": "nécessite le domaine de zone",
      "n1577": "nécessite un mot de passe",
      "n1578": "nécessite un e-mail",
      "n1579": "nécessite un e-mail et un domaine",
      "n1580": "nécessite version et version",
      "n1581": "nécessite candidateVersion (peut etc. current ou )",
      "n1582": "nécessite les permissions d'admin système pour terminer l'installation",
      "n1583": "Root est requis pour le cycle de vie et les écritures système",
      "n1584": "Permission d'exécution hôte requise/reload",
      "n1585": "Permission d'exécution hôte requise pour system et recharger Nginx",
      "n1586": "Permission d'exécution hôte requise check_policy_service",
      "n1587": "Permission d'exécution hôte requise pour conf nginx et reload",
      "n1588": "Sync bloquée : root requis",
      "n1589": "nécessite le nœud primary",
      "n1590": "",
      "n1591": "Pas root — chemins système useradd / systemd / nginx restreints",
      "n1592": "sans seccomp nécessite runAsUser",
      "n1593": "Requêtes publiques / min",
      "n1594": "connexion panneau ; Disponible\"\" ( )",
      "n1595": "Le panneau ne s'exécute pas en tant que root",
      "n1596": "Disponible apply:false",
      "n1597": "— pas writefile",
      "n1598": "Workers uvicorn par défaut",
      "n1599": "avec base Redis",
      "n1600": "",
      "n1601": "Fichier local",
      "n1602": "logpathinvalide",
      "n1603": "erreurDémarrage",
      "n1604": "Erreur, etc.",
      "n1605": "Erreur ()",
      "n1606": "build possible ; notes/journal d'échec",
      "n1607": "",
      "n1608": "vérificationinvalide",
      "n1609": "validé",
      "n1610": "Index des paquets non actualisé (YSK_EXECUTE désactivé) — affichage de la liste apt uniquement ; activez execute pour lancer apt-get update",
      "n1611": "UFW est inactif : {{n}} les règles de refus permanents sont stockées dans user.rules mais le noyau ne les applique pas.",
      "n1612": "UFW est inactif. Une règle de refus serait écrite uniquement dans user.rules — le noyau ne supprimerait pas de paquets. Activez d’abord UFW. Ne s'active pas automatiquement.",
      "t0001": "listenPort invalide : {{v0}}",
      "t0002": "version de restauration {{v0}}",
      "t0003": "fichier (>{{v0}} octets)",
      "t0004": " : {{v0}}",
      "t0005": "cible : {{v0}}",
      "t0006": "introuvable : {{v0}}",
      "t0007": "Échec : {{v0}}",
      "t0008": "{{v0}} → {{v1}}",
      "t0009": "introuvable : {{v0}}",
      "t0010": "Échec : {{v0}}",
      "t0011": "{{v0}} → {{v1}}",
      "t0012": "impossible depuis le statut {{v0}} pour",
      "t0013": "cette opération nécessite : {{v0}}",
      "t0014": "Statut invalide : {{v0}}",
      "t0015": "{{v0}}",
      "t0016": "Inconnu : {{v0}}",
      "t0017": "{{v0}} ne peut pas {{v1}} ( {{v2}})",
      "t0018": "{{v0}} lecture impossible — l'opération nécessite un id",
      "t0019": "hôte : {{v0}}",
      "t0020": "autoriser : {{v0}}",
      "t0021": "refuser : {{v0}}",
      "t0022": "Playbook introuvable : {{v0}}",
      "t0023": "ip -j addr a échoué : {{v0}}",
      "t0024": "ip -j route a échoué : {{v0}}",
      "t0025": "échec d'écriture nmcli : {{v0}}",
      "t0026": "{{v0}} → connexion\"{{v1}}\"",
      "t0027": "avertissement activation connexion : {{v0}}",
      "t0028": "Connexion réactivée (persiste après redémarrage)",
      "t0029": "{{v0}} → {{v1}} (; un redémarrage peut le faire disparaître)",
      "t0030": "depuis la connexion\"{{v0}}\" {{v1}}",
      "t0031": "NM : {{v0}}",
      "t0032": "Supprimé {{v0}} ← {{v1}}",
      "t0033": "échec de descente de liaison : {{v0}}",
      "t0034": "a désactivé {{v0}}",
      "t0035": "échec de montée de liaison : {{v0}}",
      "t0036": "a activé {{v0}}",
      "t0037": "Échec MTU : {{v0}}",
      "t0038": "échec d'écriture de la passerelle nmcli : {{v0}}",
      "t0039": "enregistrer la passerelle par défaut {{v0}} → connexion\"{{v1}}\" (redémarrage )",
      "t0040": "échec d'écriture des routes nmcli : {{v0}}",
      "t0041": "enregistrer {{v0}} →\"{{v1}}\" (redémarrage )",
      "t0042": "échec de ip route add : {{v0}}",
      "t0043": "ajouter {{v0}}${gw?",
      "t0044": ": ''}(Peut ne pas persister après redémarrage ; utilisez Enregistrer pour persister)",
      "t0045": "depuis la connexion\"{{v0}}\" ipv4.gateway",
      "t0046": "passerelle NM : {{v0}}",
      "t0047": "depuis \"{{v0}}\" {{v1}}",
      "t0048": "routes NM : {{v0}}",
      "t0049": "échec de ip route del : {{v0}}",
      "t0050": "{{v0}}",
      "t0051": "{{v0}}",
      "t0052": "DNS invalide : {{v0}}",
      "t0053": "IP DNS : {{v0}}",
      "t0054": "échec de nmcli modify : {{v0}}",
      "t0055": "restaurer DNS DHCP {{v0}} (ignore-auto-dns=no)",
      "t0056": "échec de nmcli modify : {{v0}}",
      "t0057": "Écrit {{v0}} : DNS {{v1}}${search.length?",
      "t0058": "Échec : {{v0}}",
      "t0059": "{{v0}} → {{v1}}",
      "t0060": "{{v0}}",
      "t0061": "jeton SSO ({{v0}} )",
      "t0062": "échec d'installation Webmail : {{v0}}",
      "t0063": "{{v0}}",
      "t0064": "échec système : {{v0}}",
      "t0065": "vacation vers le répertoire sieve {{v0}} (écrit)",
      "t0066": "tamis +.dovecot.sieve → {{v0}}@{{v1}}",
      "t0067": "Lien sieve actif désactivé → {{v0}}@{{v1}}",
      "t0068": "échec sieve {{v0}}@{{v1}} : {{v2}}",
      "t0069": "Écrit le démon de politique par expéditeur ({{v0}} domaines)",
      "t0070": "échec de {{v0}} (exit {{v1}}) : {{v2}}",
      "t0071": "Écrit le plugin {{v0}}",
      "t0072": "échec du lien symbolique : {{v0}}",
      "t0073": "lien symbolique créé {{v0}} → {{v1}}",
      "t0074": "échec de config : {{v0}}",
      "t0075": "config plugin {{v0}} : {{v1}}",
      "t0076": "Écrit {{v0}} : {{v1}}",
      "t0077": "{{v0}} et www.{{v1}} vers l'IP du serveur. CDN (Cloudflare)can or.",
      "t0078": "paramètres PTR VPS/ IP, et et HELO/EHLO ({{v0}}). veuillez (AWS/GCP ).",
      "t0079": "{{v0}}",
      "t0080": "échec de postsuper : {{v0}}",
      "t0081": "domaine : {{v0}}",
      "t0082": " : {{v0}}",
      "t0083": "créer Maildir : {{v0}}",
      "t0084": "créer un utilisateur système {{v0}}",
      "t0085": "échec de createsystemuser : {{v0}}",
      "t0086": " : {{v0}}",
      "t0087": "échec d'écriture passdb : {{v0}}",
      "t0088": " : {{v0}}",
      "t0089": "créer {{v0}} : {{v1}} → {{v2}}",
      "t0090": "Domaine mail introuvable : {{v0}}",
      "t0091": "Écrit vacation {{v0}}",
      "t0092": "Écrit {{v0}}",
      "t0093": "virtual_alias : {{v0}} ({{v1}} )",
      "t0094": "Postfix anvil : smtpd_client_message_rate_limit={{v0}} / 3600s (; débit domaine )",
      "t0095": "postconf : {{v0}}",
      "t0096": "Écrit rspamd ratelimit.conf (~{{v0}}/h)",
      "t0097": "map ({{v0}} domaines)",
      "t0098": "{{v0}} : bloquer (autoriser LLM local)",
      "t0099": "échec LLM veuillez : {{v0}}",
      "t0100": "{{v0}}–{{v1}} port non trouvé / non disponible",
      "t0101": "veuillez confirmer : {{v0}}",
      "t0102": "{{v0}}s sera avec 1 (arrêt +N avec )",
      "t0103": "redémarrer ( {{v0}} )",
      "t0104": "arrêt ( {{v0}} )",
      "t0105": "Échec de lecture : {{v0}}",
      "t0106": "Échec : {{v0}}",
      "t0107": "service invalide : {{v0}}",
      "t0108": "chemin d'accès : {{v0}}",
      "t0109": "échec de purge/rechargement : {{v0}}",
      "t0110": "BD {{v0}} : clé {{v1}}",
      "t0111": "(tapez {{v0}} — )",
      "t0112": "Écrit {{v0}}",
      "t0113": "Échec d'écriture : {{v0}}",
      "t0114": "Clé manquante ou non supprimée",
      "t0115": "home : {{v0}}",
      "t0116": "impossible de lire le JSON des snapshots : {{v0}}",
      "t0117": "{{v0}} restic",
      "t0118": "accueil confirmPhrase=\"{{v0}}\" ()",
      "t0119": "dry-run : snapshot {{v0}} {{v1}} chemin ( 100)",
      "t0120": "échec du dry-run : {{v0}}",
      "t0121": "restaurer le snapshot {{v0}} → {{v1}}",
      "t0122": "échec de restauration exit={{v0}}",
      "t0123": "Wrotemanage : {{v0}}",
      "t0124": "utilisateur Linux du projet {{v0}} (Match User ysks_*,ysk_*)",
      "t0125": "veuillez : cp {{v0}} /etc/ssh/sshd_config.d/ && systemctl reload sshd",
      "t0126": "sshd -t a échoué, pas de rechargement : {{v0}}",
      "t0127": "{{v0}} installé et sshd rechargé",
      "t0128": "Échec du rechargement après installation : {{v0}}",
      "t0129": "Écrit {{v0}} ({{v1}} octets)",
      "t0130": "Confs Nginx gérées : {{v0}} (panel dataDir nginx/conf.d)",
      "t0131": "Inconnu : {{v0}}",
      "t0132": "{{v0}} : {{v1}}",
      "t0133": "{{v0}} — ignoré (force can )",
      "t0134": "Installation WordPress — {{v0}}",
      "t0135": "domaine : {{v0}}",
      "t0136": "entrée {{v0}}.wsgi:application (gunicorn)",
      "t0137": "exécutera cargo build --release;./target/release/{{v0}}",
      "t0138": "Axum : cargo build --release crates.io",
      "t0139": "./target/release/{{v0}}",
      "t0140": "créer {{v0}}, {{v1}}, Erreur {{v2}}",
      "t0141": "{{v0}}doneproject Utilisateur Linux (page → createsystemuser).",
      "t0142": "home : /home/ysk-server-{{v0}} · utilisateur : {{v1}}",
      "t0143": "chown effectué {{v0}}:{{v1}} → {{v2}}",
      "t0144": "avec projectuser {{v0}}",
      "t0145": "pidfile avec runuser -u {{v0}} start",
      "t0146": "Pool FPM écrit : {{v0}}",
      "t0147": "Pool activé : {{v0}}",
      "t0148": "/etc/php/{{v0}}/fpm introuvable — installer php{{v1}}-fpm",
      "t0149": "{{v0}} installé",
      "t0150": "installer {{v0}}",
      "t0151": "ne pas installer {{v0}}",
      "t0152": "Échec de la sonde SSH : {{v0}}",
      "t0153": "nameserver : {{v0}}",
      "t0154": "répertoire de zone ({{v0}}.zone)",
      "t0155": "répertoire de zone : {{v0}}",
      "t0156": "échec du rechargement distant : {{v0}}",
      "t0157": "{{v0}} : échec scp {{v1}}",
      "t0158": "scp {{v0}} OK → {{v1}}",
      "t0159": "scp /Échec (ok={{v0}} fail={{v1}})",
      "t0160": "activation échouée : {{v0}}",
      "t0161": "désactivation échouée : {{v0}}",
      "t0162": "UFW DENY depuis {{v0}} (règle, )",
      "t0163": "refus échoué : {{v0}}",
      "t0164": "UFW REFUSER {{v0}}",
      "t0165": "suppression échouée : {{v0}}",
      "t0166": "règle #{{v0}}",
      "t0167": "#{{v0}} Échec : {{v1}}",
      "t0168": "autoriser {{v0}}/{{v1}}",
      "t0169": "autorisation échouée : {{v0}}",
      "t0170": "rechargement échoué ({{v0}}) : {{v1}}",
      "t0171": ": avec l'utilisateur projet {{v0}} actif",
      "t0172": "Node : {{v0}}",
      "t0173": "port : {{v0}}",
      "t0174": "Panneau Node appliqué ({{v0}})",
      "t0175": "application introuvable : {{v0}}",
      "t0176": "avec l'unité systemd : {{v0}}",
      "t0177": "avec PM2 : {{v0}}",
      "t0178": "démarrage du processus échoué : {{v0}}",
      "t0179": "démarrage pid={{v0}}, pidfile={{v1}}",
      "t0180": "Paramètres Nginx (fichier géré) : {{v0}}",
      "t0181": "création de page : {{v0}}",
      "t0182": " : {{v0}}",
      "t0183": "Paramètres Nginx : {{v0}}",
      "t0184": "répertoire : {{v0}}",
      "t0185": "HTTP : {{v0}} ({{v1}})",
      "t0186": " : {{v0}}",
      "t0187": "→ {{v0}}",
      "t0188": "certificat : {{v0}}",
      "t0189": "SSL activé (chemin Let’s Encrypt ; ou certificat page SSL {{v0}})",
      "t0190": "rechargement Nginx échoué : {{v0}}",
      "t0191": "hôte écrit : {{v0}}",
      "t0192": "Runtime {{v0}} — Git, redémarrage du processus",
      "t0193": "Écrit {{v0}} ({{v1}} )",
      "t0194": "utilisateur du pool PHP-FPM : {{v0}} (projet)",
      "t0195": "version runtime → {{v0}}",
      "t0196": "php.ini du panneau ({{v0}} php_admin_*)",
      "t0197": "Paramètres Nginx PHP-FPM : {{v0}}",
      "t0198": "rechargement Nginx ={{v0}} : {{v1}}",
      "t0199": "serveur PHP pid={{v0}} @ 127.0.0.1:{{v1}}",
      "t0200": "SIGTERM {{v0}}",
      "t0201": "SIGKILL {{v0}}",
      "t0202": "pid {{v0}}",
      "t0203": "déploiement du processus runtime\"{{v0}}\"",
      "t0204": ": avec l'utilisateur projet {{v0}} et démarrage",
      "t0205": "Runtime : {{v0}} · port {{v1}} · entrée {{v2}}",
      "t0206": " : {{v0}}",
      "t0207": "Échec : {{v0}}",
      "t0208": "Panneau appliqué {{v0}} ({{v1}})",
      "t0209": "systemd écrit : {{v0}}",
      "t0210": "enable --now unité projet (User={{v0}})",
      "t0211": "systemctl Start échoué : {{v0}}",
      "t0212": "écriture de l'unité system échouée : {{v0}}",
      "t0213": "pidfile démarrage pid={{v0}}${mode === 'isolated'?",
      "t0214": "pidfile Échec du démarrage : {{v0}}",
      "t0215": "vérification non réussie ({{v0}} ms) : {{v1}}",
      "t0216": "vérification réussie ({{v0}} ms)",
      "t0217": "Nginx écrit : {{v0}}",
      "t0218": "IP bannie {{v0}}",
      "t0219": "a débanni {{v0}} @ {{v1}}",
      "t0220": "échec du débanissement : {{v0}}",
      "t0221": "gestion : {{v0}} ({{v1}} )",
      "t0222": "sshd ignoreip {{v0}} {{v1}} · Statut : appliqué",
      "t0223": "fail2ban-client ignoreip Échec : {{v0}} (fichier géré écrit ; appliqué)",
      "t0224": "jails fail2ban : {{v0}}",
      "t0225": "Unité écrite {{v0}}",
      "t0226": "Le statut est toujours {{v0}} (non appliqué)",
      "t0227": "apply_status inattendu : {{v0}}",
      "t0228": "base de données : {{v0}} ( 0–{{v1}})",
      "t0229": "vers {{v0}}",
      "t0230": "impossible vers le répertoire de conf système : {{v0}}",
      "t0231": "conf Échec : {{v0}}",
      "t0232": "redémarrer {{v0}}",
      "t0233": "vers {{v0}} Échec : {{v1}}",
      "t0234": "répertoire refusé : {{v0}}",
      "t0235": "répertoire : {{v0}}",
      "t0236": "répertoire ignoré (scan) : {{v0}}",
      "t0237": "{{v0}} (non )",
      "t0238": "journal php{{v0}}-fpm (journal du pool non )",
      "t0239": "grep\"{{v0}}\" : {{v1}} (scan {{v2}} octets)",
      "t0240": "{{v0}} (fichier {{v1}} octets, )",
      "t0241": "{{v0}} (fichier {{v1}} octets)",
      "t0242": "vers le journal {{v0}} (non désactivé)",
      "t0243": "lecture impossible : {{v0}}",
      "t0244": "\"{{v0}}\" : {{v1}}, {{v2}} ()",
      "t0245": "{{v0}} serveur non installé",
      "t0246": "{{v0}} service non démarré",
      "t0247": "{{v0}} Non installé",
      "t0248": " : {{v0}}",
      "t0249": "serveur : {{v0}}",
      "t0250": "{{v0}} Prêt",
      "t0251": "{{v0}} Installation incomplète",
      "t0252": "{{v0}} démarrage du service",
      "t0253": "Échec du démarrage : {{v0}}",
      "t0254": "Prend en charge Node.js {{v0}} ; versions disponibles : {{v1}}",
      "t0255": "Prend en charge PHP version {{v0}} ; Disponible : {{v1}}",
      "t0256": "Prend en charge Python version {{v0}} ; Disponible : {{v1}}",
      "t0257": "Prend en charge Go version {{v0}} ; Disponible : {{v1}}",
      "t0258": "Runtime inconnu : {{v0}}",
      "t0259": "dig : pas de réponse (NXDOMAIN ou vide)",
      "t0260": "{{v0}}",
      "t0261": "PostgreSQL a échoué : {{v0}}",
      "t0262": "MySQL a échoué : {{v0}}",
      "t0263": "{{v0}} : impossible de DROP — EXECUTE+root ( expiré)",
      "t0264": "{{v0}} : échec du DROP {{v1}}",
      "t0265": "{{v0}} : échec du DROP {{v1}}",
      "t0266": "{{v0}} : expiré (ne pas DROP le compte système)",
      "t0267": "Utilisateur FTP : {{v0}}",
      "t0268": "créer FTP {{v0}}",
      "t0269": "Chemin du jail : {{v0}}",
      "t0270": "Mot de passe stocké en hachage crypt (pas en clair)",
      "t0271": "avec l'utilisateur Linux du projet : {{v0}} (appliquer vsftpd )",
      "t0272": "Nom d'utilisateur invalide ignoré",
      "t0273": "{{v0}} : mot de passe → hash crypt",
      "t0274": "{{v0}} hash non crypt (openssl indisponible)— peut échouer",
      "t0275": "{{v0}} hash du mot de passe, impossible",
      "t0276": "{{v0}} utilisateur Linux du projet — invité\"{{v1}}\" (veuillez FTP )",
      "t0277": "Paramètres {{v0}} écrits",
      "t0278": "{{v0}}",
      "t0279": "{{v0}} appliqué, vsftpd en cours d'exécution",
      "t0280": "chown ignoré {{v0}} : utilisateur système\"{{v1}}\" (veuillez d'abord créer l'utilisateur système du projet)",
      "t0281": "échec de chown {{v0}} : {{v1}}",
      "t0282": "Répertoire FTP ({{v0}})",
      "t0283": "répertoire du projet {{v0}}",
      "t0284": "public du projet {{v0}}",
      "t0285": "mail {{v0}}",
      "t0286": "ne crée pas l'utilisateur système (nécessite les droits d'administrateur système). home : {{v0}} ; répertoire.",
      "t0287": "{{v0}} ; home {{v1}}",
      "t0288": "arrêter {{v0}}",
      "t0289": "Home supprimé : {{v0}}",
      "t0290": "home absent (peut ) : {{v0}} — {{v1}}",
      "t0291": "suppression du chemin home refusée : {{v0}}",
      "t0292": "pas un home OS (nécessite root) : {{v0}} ; l'utilisateur système {{v1}} peut",
      "t0293": "échec de pdnsutil load-zone : {{v0}}",
      "t0294": "zone pdnsutil {{v0}}",
      "t0295": "systemctl {{v0}} fail2ban ok",
      "t0296": "échec de {{v0}} : {{v1}}",
      "t0297": "bannissement fail2ban {{v0}} @ {{v1}} (, limites bantime)",
      "t0298": "échec de banip : {{v0}}",
      "t0299": "jails : {{v0}}",
      "t0300": "ignoreip : dataDir/fail2ban/ignoreip.txt",
      "t0301": "vérification d'installation : {{v0}}",
      "t0302": "projet {{v0}} (paquet : {{v1}})",
      "t0303": "{{v0}} (paquet : {{v1}})",
      "t0304": "base de données {{v0}} (paquet : {{v1}})",
      "t0305": "Écrit {{v0}} (BD {{v1}}@{{v2}} ; disponible)",
      "t0306": "échec de pm2 start : {{v0}}",
      "t0307": "début pm2 {{v0}}",
      "t0308": "{{v0}} n'est pas installé",
      "t0309": "{{v0}}",
      "t0310": "{{v0}} appliqué",
      "t0311": "redémarrage possible avec : {{v0}}",
      "t0312": "appliquer {{v0}}",
      "t0313": "redémarrer (veuillez redémarrer) : {{v0}}",
      "t0314": "ALTER SYSTEM {{v0}} et recharger",
      "t0315": "redémarrer : {{v0}}",
      "t0316": "a effectué {{v0}} {{v1}}",
      "t0317": "ini : {{v0}}",
      "t0318": "/etc/php/{{v0}}/fpm — veuillez d'abord installer php{{v1}}-fpm",
      "t0319": "{{v0}} appliqué et rechargement de php{{v1}}-fpm",
      "t0320": "ini ; échec du rechargement : {{v0}}",
      "t0321": "Brouillon de zone DNS {{v0}} ( pour écrire/appliquer DNS)",
      "t0322": "IPv6 {{v0}}",
      "t0323": "domaine mail {{v0}}",
      "t0324": "Brouillon BD MySQL {{v0}} ( vers databaseapply)",
      "t0325": "ignoré : répertoire {{v0}}",
      "t0326": "Sauvegarde de {{v0}}/{{v1}} projet(s)",
      "t0327": " ({{v0}} ignoré(s) sans répertoire home)",
      "t0328": "répertoire du projet : {{v0}}",
      "t0329": "échec de tar : {{v0}}",
      "t0330": "Sauvegarde écrite {{v0}}",
      "t0331": "simulation : fichier {{v0}}+ ( {{v1}})",
      "t0332": "impossible : {{v0}}",
      "t0333": "restauration (web) vers {{v0}}",
      "t0334": "échec restauration web : {{v0}}",
      "t0335": "échec de restauration : {{v0}}",
      "t0336": "depuis {{v0}} restauration vers projectdirectory",
      "t0337": "chown effectué {{v0}}:{{v1}} → {{v2}}",
      "t0338": " : {{v0}}",
      "t0339": "gestion crontab : {{v0}}",
      "t0340": "échec de crontab : {{v0}}",
      "t0341": "échec de pg_dump : {{v0}}",
      "t0342": "échec du dump : {{v0}}",
      "t0343": "échec de psql : {{v0}}",
      "t0344": "échec de l'import : {{v0}}",
      "t0345": "cible {{v0}} n'est pas git — clone avec données refusé (.ysk-scaffold )",
      "t0346": "clone effectué {{v0}} → {{v1}}",
      "t0347": "mise à jour pull : {{v0}}",
      "t0348": "linuxUser invalide : {{v0}}",
      "t0349": "Appliqué {{v0}} : {{v1}} + www-data/nginx ; home 750, public g+rX",
      "t0350": "ysk-web échec d'application : {{v0}}",
      "t0351": "chemin {{v0}}",
      "t0352": "conf nginx : {{v0}}",
      "t0353": "Échec du téléchargement : {{v0}}",
      "t0354": "Administrateur → {{v0}}",
      "t0355": "{{v0}}",
      "t0356": "conf nginx : {{v0}}",
      "t0357": "→ {{v0}}",
      "t0358": "port invalide : {{v0}}",
      "t0359": "installation crontab avec l'utilisateur {{v0}}",
      "t0360": "clé {{v0}}",
      "t0361": "zone → {{v0}} ( recharger DNS ; DS manuel chez le registrar)",
      "t0362": "pas vers une zone gérée ( dns/zones/{{v0}}.zone)—",
      "t0363": "fichier {{v0}} sous {{v1}}",
      "t0364": "TCP {{v0}} :{{v1}} OK ({{v2}}ms)",
      "t0365": "TCP {{v0}}:{{v1}} échec : {{v2}}",
      "t0366": "échec PING : {{v0}}",
      "t0367": ": {{v0}}Mo > {{v1}}Mo",
      "t0368": "({{v0}} / {{v1}} MiB), impossible{{v2}}",
      "t0369": "Le chemin home n'est pas prêt ({{v0}})",
      "t0370": "Utilisateur Linux {{v0}} non provisionné",
      "t0371": "Prêt {{v0}} / dégradé {{v1}} / non isolé {{v2}} ({{v3}} au total)",
      "t0372": " · En attente : {{v0}}{{v1}}",
      "t0373": "Isolation du projet \"{{v0}}\"",
      "t0374": "vers le chemin local {{v0}}",
      "t0375": "identité {{v0}} : {{v1}}",
      "t0376": "sftp (identité) vers {{v0}} réussi",
      "t0377": "échec sftp (identité) : {{v0}}",
      "t0378": "sftp vers {{v0}} réussi",
      "t0379": "échec sftp : {{v0}}",
      "t0380": "sftp vers {{v0}} réussi",
      "t0381": "échec sftp : {{v0}} (vous pouvez définir backup remote identityId)",
      "t0382": "S3 {{v0}}",
      "t0383": "échec S3 : {{v0}}",
      "t0384": " : {{v0}}/{{v1}} admin 2FA activée",
      "t0385": "Politique non appliquée : {{v0}}/{{v1}} admin(s) ont la 2FA activée",
      "t0386": "{{v0}} CHEMIN",
      "t0387": "{{v0}} introuvable",
      "t0388": "Installez {{v0}} ou ajoutez-le au PATH",
      "t0389": "Versions disponibles : {{v0}}",
      "t0390": "{{v0}} % ( {{v1}} Mo)",
      "t0391": "{{v0}} % ({{v1}})",
      "t0392": "démarrage du service {{v0}}",
      "t0393": "Mode : {{v0}}",
      "t0394": "Prêt {{v0}} / Dégradé {{v1}} / Manquant {{v2}} ({{v3}} au total)",
      "t0395": "Introuvable ( {{v0}})",
      "t0396": "nœud hôte : {{v0}}",
      "t0397": "php hôte : {{v0}}",
      "t0398": "python hôte : {{v0}}",
      "t0399": "go hôte : {{v0}}",
      "t0400": "cargo hôte : {{v0}}",
      "t0401": "Node disponible : {{v0}}",
      "t0402": "PHP disponible : {{v0}}",
      "t0403": "Python disponible : {{v0}}",
      "t0404": "Go disponible : {{v0}}",
      "t0405": "Rust disponible : {{v0}}",
      "t0406": "installer Node {{v0}}",
      "t0407": "installer PHP {{v0}}",
      "t0408": "installer Python {{v0}}",
      "t0409": "installer Go {{v0}} vers /usr/local/ysk/go",
      "t0410": "installer Rust ({{v0}}) vers /usr/local/ysk/rust",
      "t0411": "échec de l'installation : {{v0}}",
      "t0412": "Script d'installation OpenJDK {{v0}} préparé",
      "t0413": "Script d'installation Kotlin {{v0}} préparé (JDK requis)",
      "t0414": "Script d'installation Bun ({{v0}}) préparé",
      "t0415": "répertoire du projet : {{v0}}",
      "t0416": "utilisateur cible {{v0}} (répertoire du projet) ; veuillez faire chown via ssh (l'API le fera)",
      "t0417": "chown effectué {{v0}} → {{v1}}",
      "t0418": "échec chown.ssh : {{v0}}",
      "t0419": "Clé supprimée · authorized_keys",
      "t0420": "Prend en charge : {{v0}}",
      "t0421": "TTL {{v0}} 30–604800",
      "t0422": "{{v0}} CNAME et ()",
      "t0423": "cible CNAME {{v0}}",
      "t0424": "échec des paramètres : {{v0}}",
      "t0425": "{{v0}} paramètres de gestion incorrects",
      "t0426": "fichier impossible : {{v0}}",
      "t0427": "{{v0}} paramètres vers le répertoire système",
      "t0428": "{{v0}} invalide",
      "t0429": "home n'est pas un chemin ( {{v0}})",
      "t0430": "usermod -s a échoué : {{v0}}",
      "t0431": "Échec : {{v0}}",
      "t0432": "Échec : {{v0}}",
      "t0433": "set-property a échoué : {{v0}} (le déploiement écrira l’unité)",
      "t0434": "unité {{v0}} inactive — limite la base, le déploiement écrit l’unité",
      "t0435": "setquota non réussi (le système de fichiers ne prend pas en charge user_xattr/quota) : {{v0}}",
      "t0436": "home : {{v0}}",
      "t0437": "chown effectué {{v0}} → {{v1}}",
      "t0438": "échec de l’en-tête top : {{v0}}",
      "t0439": "ps a complètement échoué : {{v0}}",
      "t0440": "NI={{v0}}",
      "t0441": "PID {{v0}} (process.pid)",
      "t0442": "ou sonde (kill -0 exit {{v0}})",
      "t0443": "kill -s {{v0}} a échoué : ${err ||",
      "t0444": "{{v0}} → PID {{v1}}",
      "t0445": "{{v0}} projet(s) suspendu(s)",
      "t0446": "{{v0}} projet(s) sans utilisateur système",
      "t0447": "{{v0}} approbation(s) en attente",
      "t0448": "Certificat expiré : {{v0}}",
      "t0449": "Le certificat expire dans {{v0}} jour(s) : {{v1}}",
      "t0450": "Heure : {{v0}}",
      "t0451": "Listage DNSBL : {{v0}}",
      "t0452": "{{v0}} échec(s) d’application / bloqué(s)",
      "t0453": "{{v0}} élément(s) encore écrit(s)/brouillon",
      "t0454": "Préréglage de défense auto : {{v0}}",
      "t0455": "Opération échouée : {{v0}}",
      "t0456": "Utilisation disque du journal élevée : ≈{{v0}} Mo",
      "t0457": "Seuil {{v0}} Mo — vacuum dans le centre de journaux ou ajuster la rétention",
      "t0458": "df a échoué : {{v0}}",
      "t0459": "{{v0}} projet ( {{v1}})",
      "t0460": "version {{v0}} → {{v1}}",
      "t0461": "mettre à jour {{v0}}",
      "t0462": "Échec exit={{v0}}",
      "t0463": "apt list --upgradable : {{v0}} peut être mis à jour",
      "t0464": "apt list --upgradable indisponible (exit {{v0}}) ; apt-cache policy",
      "t0465": "dpkg+apt-cache policy : {{v0}} paquet",
      "t0466": "dpkg/apt-cache policy a échoué ou (exit {{v0}}) — apt ou permission possible",
      "t0467": "Node {{v0}} (pas le paquet apt nodejs pouvant être mis à jour)",
      "t0468": "peut être mis à jour (candidat ≠ actuel) : {{v0}}",
      "t0469": "registre npm HTTP {{v0}}",
      "t0470": "GitHub publie HTTP {{v0}}",
      "t0471": "Package GitHub.json HTTP {{v0}}",
      "t0472": "npm : {{v0}}@{{v1}}",
      "t0473": "npm {{v0}} indisponible : {{v1}}",
      "t0474": "GitHub releases indisponible : {{v0}}",
      "t0475": "GitHub package.json ({{v0}}) : {{v1}}",
      "t0476": "GitHub package.json indisponible : {{v0}}",
      "t0477": "mise à jour : {{v0}} → {{v1}}",
      "t0478": "répertoire {{v0}} dépôt git — YSK_SOURCE_ROOT possible, ou npm (YSK_NPM_PACKAGE)",
      "t0479": "Échec du téléchargement du tarball GitHub : {{v0}}",
      "t0480": "vers {{v0}} (staging uniquement) — installation non en cours ; veuillez terminer le répertoire /git",
      "t0481": "git : {{v0}}",
      "t0482": "git apply {{v0}} a échoué (exit {{v1}}) : {{v2}}",
      "t0483": "cible de mise à jour {{v0}} et compilation — veuillez redémarrer ysk-server version",
      "t0484": "Installé {{v0}}",
      "t0485": "Échec de la mise à jour npm : {{v0}}",
      "t0486": "Installation YSK_NPM_PACKAGE {{v0}}",
      "t0487": "Échec de l'installation YSK_NPM_PACKAGE : {{v0}}",
      "t0488": "peut élever {{v0}} → {{v1}} (CVE CRITIQUE, )",
      "t0489": "peut élever {{v0}} → {{v1}} (CVE ÉLEVÉE, )",
      "t0490": "peut élever {{v0}} → {{v1}} (peut, )",
      "t0491": "peut élever {{v0}} → {{v1}} ()",
      "t0492": "peut élever {{v0}} → {{v1}} (candidat apt)",
      "t0493": "Élévation disponible, OSV {{v0}}",
      "t0494": "serviceStatus : {{v0}}",
      "t0495": "détecter pour pouvoir : {{v0}}",
      "t0496": "Agent inconnu en cours d'exécution : {{v0}}",
      "t0497": "Agent pris en charge : {{v0}}",
      "t0498": "installFailed (willSuccess) : {{v0}}",
      "t0499": "Session agent introuvable : {{v0}}",
      "t0500": "Introuvable : {{v0}}",
      "t0501": "utilisateur : {{v0}}",
      "t0502": "utilisateur : {{v0}}",
      "t0503": "utilisateur SFTP projet (ysks_/ysk_, internal-sftp kbd-interactive) : {{v0}}",
      "t0504": "depuis utilisateur strict : {{v0}}",
      "t0505": "utilisateur {{v0}} publickey+TOTP, désactiver le mot de passe",
      "t0506": "fichier géré : {{v0}}",
      "t0507": "{{v0}} installé et sshd rechargé",
      "t0508": "install/sshd -t échoué : {{v0}}",
      "t0509": "PAM fichier géré : {{v0}}",
      "t0510": "Échec de chown : {{v0}}",
      "t0511": "Avertissement : mode 400 (stat : {{v0}})",
      "t0512": "PAM (fichier géré) : {{v0}}",
      "t0513": "sshd (fichier géré) : {{v0}}",
      "t0514": "brouillon (ceci) : {{v0}} — veuillez enregistrer",
      "t0515": "pam.d/sshd : {{v0}}",
      "t0516": "utilisateur {{v0}} 2FA SSH ({{v1}}). désactiver/retirer.",
      "t0517": "clé maître des secrets : {{v0}}",
      "t0518": "Échec de chown : {{v0}}",
      "t0519": "échec ssh : {{v0}}",
      "t0520": "clé maître : {{v0}} (veuillez sauvegarder)",
      "t0521": "clé maître : {{v0}}",
      "t0522": "empreinte : {{v0}} ({{v1}})",
      "t0523": "UFW CF uniquement écrit : {{v0}}",
      "t0524": "port : {{v0}}",
      "t0525": "CF IPv4 : {{v0}}",
      "t0526": "CF IPv6 : {{v0}}",
      "t0527": "Échec ufw : {{v0}}",
      "t0528": "IP échec d'authentification : {{v0}}",
      "t0529": "Meilleure IP {{v0}}",
      "t0530": "{{v0}} · {{v1}}",
      "t0531": "Préréglage de défense basculé automatiquement → {{v0}}{{v1}}",
      "t0532": "Préréglage de défense basculé automatiquement : {{v0}}",
      "t0533": "Échecs SSH×{{v0}}",
      "t0534": "Échec d'authentification {{v0}} IP",
      "t0535": "veuillez ×{{v0}}",
      "t0536": "numérisation×{{v0}}",
      "t0537": "{{v0}}/{{v1}}",
      "t0538": "terminé {{v0}} IP : Succès {{v1}}",
      "t0539": ": auto-bannissement {{v0}}",
      "t0540": " : {{v0}}",
      "t0541": "bannir {{v0}} IP",
      "t0542": "impossible de zoner {{v0}} (HTTP {{v1}})",
      "t0543": ": {{v0}} niveau_sécurité → {{v1}}",
      "t0544": ": {{v0}} → niveau_sécurité={{v1}}",
      "t0545": "({{v0}})",
      "t0546": "{{v0}}",
      "t0547": "confirmer=\"{{v0}}\"",
      "t0548": "Limites de débit Nginx écrites : {{v0}}",
      "t0549": "Marqueurs de limite de débit injectés dans {{v0}} vhost(s)",
      "t0550": "Préréglage de défense actif → {{v0}}",
      "t0551": "bannissement → {{v0}} ({{v1}} / {{v2}})",
      "t0552": "Préréglage de défense appliqué : {{v0}}",
      "t0553": "fail2ban a échoué : {{v0}}",
      "t0554": "ufw a échoué : {{v0}}",
      "t0555": "{{v0}}",
      "t0556": "suppression ufw a échoué : {{v0}}",
      "t0557": "{{v0}}",
      "t0558": "{{v0}} : {{v1}}",
      "t0559": "vers le vhost {{v0}}",
      "t0560": "cluster_size={{v0}} < nœud {{v1}}",
      "t0561": "cluster de {{v0}} nœuds",
      "t0562": "sonde Prend en charge {{v0}}",
      "t0563": "mysql/mariadb Échec : {{v0}}",
      "t0564": "SHOW REPLICA/SLAVE a échoué : {{v0}}",
      "t0565": "SHOW MASTER a échoué : {{v0}}",
      "t0566": "réplica pour récupération, ={{v0}}",
      "t0567": "récupération primaire, ={{v0}}",
      "t0568": "réplica Rôle anormal={{v0}}",
      "t0569": "master, rôle={{v0}}",
      "t0570": "{{v0}} · {{v1}}",
      "t0571": "échec de tar : {{v0}}",
      "t0572": "{{v0}} ({{v1}} octets)",
      "t0573": "cible pair {{v0}}",
      "t0574": "{{v0}} : identité {{v1}} indisponible — clé",
      "t0575": "{{v0}} : ssh mkdir a échoué {{v1}}",
      "t0576": "{{v0}} : {{v1}}",
      "t0577": "{{v0}}/{{v1}} : scp a échoué {{v2}}",
      "t0578": "{{v0}} agent · op={{v1}}",
      "t0579": "{{v0}} : mise en file a échoué {{v1}}",
      "t0580": "Inconnu {{v0}}",
      "t0581": "Conf Galera ({{v0}})",
      "t0582": "{{v0}} installer conf et rejoindre ( / SSH / fleet)",
      "t0583": "install conf → systemctl restart mariadb (pas le nœud bootstrap)",
      "t0584": "Conf introuvable : {{v0}}",
      "t0585": "application locale Prend en charge {{v0}}",
      "t0586": "Drop-in system installé : {{v0}}",
      "t0587": "écriture conf system Échec : {{v0}}",
      "t0588": "galera_new_cluster a échoué : {{v0}}",
      "t0589": "systemctl restart {{v0}} ( depuis /slot/sentinel scripts/)",
      "t0590": "systemctl restart {{v0}} effectué",
      "t0591": "sonde ssh a échoué : {{v0}}",
      "t0592": "sonde réplica a échoué : {{v0}}",
      "t0593": "sonde primaire a échoué : {{v0}}",
      "t0594": "sonde nœud {{v0}} OK · size={{v1}}",
      "t0595": "sonde nœud {{v0}} OK",
      "t0596": "installer vers {{v0}} et {{v1}}",
      "t0597": "échec scp {{v0}}",
      "t0598": "échec installation conf : {{v0}}",
      "t0599": "conf écrite redémarrage {{v0}} échoué",
      "t0600": "Écrit {{v0}}${restart?",
      "t0601": "Prend en charge : {{v0}}",
      "t0602": "Prend en charge le cluster : {{v0}}",
      "t0603": "arrêt de l'unité projet {{v0}} (ok-ish {{v1}})",
      "t0604": "arrêt sans sortie ( {{v0}})— dump",
      "t0605": "et RDB {{v0}} (dump ignoré)",
      "t0606": "terminé → {{v0}}",
      "t0607": "createuser {{v0}} uid={{v1}}",
      "t0608": "utilisateur {{v0}}",
      "t0609": "échec useradd : {{v0}}",
      "t0610": "échec chown : {{v0}}",
      "t0611": "home, chown ignoré : {{v0}}",
      "t0612": "dump ou : {{v0}}",
      "t0613": "RDB : {{v0}}",
      "t0614": "restauration RDB → {{v0}}",
      "t0615": "échec RDB : {{v0}}",
      "t0616": "démarrage/ping redis : {{v0}}",
      "t0617": ": {{v0}} — dump dataDir rsync vers (dumpRelPath)",
      "t0618": "cible inaccessible sha256 : {{v0}}",
      "t0619": "ysk.json sha256 {{v0}}...",
      "t0620": "ysk.json local={{v0}} distant={{v1}}",
      "t0621": "dataDir local : {{v0}}",
      "t0622": "dataDir : {{v0}}",
      "t0623": "home ignoré : {{v0}}",
      "t0624": "home dataDir, dataDir : {{v0}}",
      "t0625": "échec rsync home {{v0}}",
      "t0626": "transfert : échec rsync home {{v0}}",
      "t0627": "ignoré : {{v0}}",
      "t0628": "transfert terminé → {{v0}}:{{v1}}",
      "t0629": "projet {{v0}} home : {{v1}}",
      "t0630": "projet {{v0}} bind_ip={{v1}} — possible ( IP )",
      "t0631": "projet {{v0}} home n'est pas un chemin : {{v1}}",
      "t0632": "Accueil orphelin sur disque (aucun projet de magasin correspondant) : {{v0}}",
      "t0633": "Maildir : {{v0}}",
      "t0634": "{{v0}} — impossible vers la cible",
      "t0635": "sondage impossible {{v0}}",
      "t0636": "{{v0}} · {{v1}}",
      "t0637": "projet {{v0}} · {{v1}} · DB {{v2}} · Redis {{v3}}",
      "t0638": "Installer le logiciel {{v0}} · homes {{v1}}",
      "t0639": "bascule hôte {{v0}}",
      "t0640": "{{v0}} avertissement(s) — examen avant le basculement.",
      "t0641": "clé {{v0}}",
      "t0642": "clé impossible : {{v0}}",
      "t0643": "cible : écriture authorized_keys impossible : {{v0}}",
      "t0644": "{{v0}} installation ( clé )",
      "t0645": "échec suppression clé : {{v0}}",
      "t0646": "{{v0}} disponible",
      "t0647": "dataDir : {{v0}}",
      "t0648": "~{{v0}}",
      "t0649": "Disponible {{v0}} (dump )",
      "t0650": ": Disponible {{v0}}, ≥ {{v1}}",
      "t0651": "Avertissement {{v0}} (non )",
      "t0652": "Connexion SSH {{v0}}",
      "t0653": "utilisateur {{v0}} n'est pas root (MVP exige root)",
      "t0654": "OS pris en charge ({{v0}}) ; exige Debian/Ubuntu",
      "t0655": "cible disponible {{v0}} ≥ {{v1}}",
      "t0656": "cible : disponible {{v0}}, exige {{v1}}",
      "t0657": "cible {{v0}}/ysk.json — refus ( forceWipeTarget)",
      "t0658": "répertoire cible ysk.json : {{v0}}",
      "t0659": "création du répertoire cible : {{v0}}",
      "t0660": "{{v0}}s",
      "t0661": "{{v0}}s ≥ 120s (TLS/TOTP)",
      "t0662": "projet {{v0}} bind_ip={{v1}} — pour (interface)",
      "t0663": "{{v0}} projet.bind_ip",
      "t0664": "impossible de persister bind_ip : {{v0}}",
      "t0665": "sync nginx : {{v0}}",
      "t0666": " : {{v0}}",
      "t0667": "identité {{v0}} indisponible",
      "t0668": "échec SSH exit={{v0}} : {{v1}}",
      "t0669": "chemin : {{v0}}",
      "t0670": "échec rsync exit={{v0}} : {{v1}}",
      "t0671": "Redis RDB écrit {{v0}} (--rdb)",
      "t0672": "échec --rdb : {{v0}}",
      "t0673": "échec BGSAVE : {{v0}}",
      "t0674": "Redis RDB {{v0}} → {{v1}} (BGSAVE)",
      "t0675": "impossible Redis RDB (src={{v0}})",
      "t0676": "{{v0}} {{v1}} {{v2}}",
      "t0677": "home, ignoré : {{v0}}",
      "t0678": "Accueil {{v0}}",
      "t0679": "Maildir : {{v0}}",
      "t0680": "maildir {{v0}}",
      "t0681": "empreinte ysk.json (peut réappliquer )local≠source",
      "t0682": "erreur de readiness : {{v0}}",
      "t0683": "bascule DNS : avec IP A/AAAA → {{v0}}{{v1}}",
      "t0684": "vérification échouée : discordance {{v0}}",
      "t0685": "vérification réussie (discordances={{v0}})",
      "t0686": "cible invalide : {{v0}} (exige root@host ou host)",
      "t0687": "job introuvable {{v0}}",
      "t0688": ": cible YSK_EXECUTE=1 ysk-server migrate post --job {{v0}} --data-dir {{v1}}",
      "t0689": "terminé → {{v0}}",
      "t0690": "hôte de bascule : {{v0}}",
      "t0691": "post terminé @ {{v0}}",
      "t0692": "Job introuvable {{v0}} ( rsync dataDir)",
      "t0693": "pas Success ({{v0}})",
      "t0694": "bootstrap terminé → {{v0}}",
      "t0695": "pas Failed : {{v0}}",
      "t0696": "mode pris en charge : {{v0}}",
      "t0697": "nœud edge introuvable : {{v0}}",
      "t0698": "nœud {{v0}} edge ( ou origin)",
      "t0699": "DNS pris en charge : {{v0}}",
      "t0700": "mode SSL pris en charge : {{v0}}",
      "t0701": "CDN {{v0}}",
      "t0702": "nœud origin shield inexistant : {{v0}}",
      "t0703": "edges : {{v0}}",
      "t0704": "URL d'origine (depuis la liaison du projet) : {{v0}}",
      "t0705": "mise à jour CDN {{v0}}",
      "t0706": "création CDN {{v0}}",
      "t0707": "origin shield : edge shield {{v0}} → {{v1}}",
      "t0708": "origin.kind=project et non projectOriginUrl — {{v0}}",
      "t0709": "edge {{v0}} ({{v1}}) : planifié (pas de fan-out — PR-C3)",
      "t0710": "edge {{v0}} : nœud",
      "t0711": "nginx géré écrit : {{v0}}",
      "t0712": "edge écrit : {{v0}}",
      "t0713": "nginx -t local a échoué (proxy_cache_path peut http{}) : {{v0}}",
      "t0714": "certId={{v0}} domaine={{v1}}",
      "t0715": "certId={{v0}} Fichier introuvable : {{v1}}",
      "t0716": "certId introuvable={{v0}}",
      "t0717": "certificat dataDir {{v0}}",
      "t0718": "Let’s Encrypt local {{v0}}",
      "t0719": "échec scp {{v0}}",
      "t0720": "échec mkdir {{v0}}",
      "t0721": "échec certbot : {{v0}}",
      "t0722": "originShieldNodeId={{v0}} — bouclier",
      "t0723": "{{v0}} : cible SSH — application SSH (flotte ignorée )",
      "t0724": "flotte impossible (bloqué={{v0}})— file d’attente ou SSH",
      "t0725": "flotte {{v0}} edge — en file ≠ rechargement nginx agent ; Agents",
      "t0726": "fleetAgentId={{v0}} — nécessite mise en file flotte (API le fera) ; ou application SSH",
      "t0727": "conf introuvable : {{v0}}",
      "t0728": "conf Échec : {{v0}}",
      "t0729": "échec mise en file flotte : {{v0}}",
      "t0730": "nginx -t a échoué : {{v0}}",
      "t0731": "échec mkdir SSH : {{v0}}",
      "t0732": "échec scp : {{v0}}",
      "t0733": "échec du rechargement distant : {{v0}}",
      "t0734": "fleetAgentId={{v0}} — purge mise en file flotte ou SSH",
      "t0735": "échec mise en file : {{v0}}",
      "t0736": "échec purge : {{v0}}",
      "t0737": "échec purge distante : {{v0}}",
      "t0738": "purge flotte {{v0}} — en file ≠ purge edge",
      "t0739": "geo {{v0}} : nœud inconnu {{v1}}",
      "t0740": "pondéré maxRr={{v0}} ( {{v1}})",
      "t0741": "minHealthyEdges={{v0}} {{v1}} edge — : IP edge ( hors ligne)",
      "t0742": "edge {{v0}} — ignoré",
      "t0743": "sonde {{v0}} : {{v1}}",
      "t0744": "zoneId={{v0}} ({{v1}})",
      "t0745": "{{v0}} gestion utilisateur {{v1}} — écriture CDN managedBy=cdn (peut et ; veuillez vérifier la zone)",
      "t0746": "sous-domaine geo {{v0}} : IP — ignoré",
      "t0747": "access_log {{v0}} (jeton d’état de cache {{v1}})",
      "t0748": "lecture journal {{v0}}",
      "t0749": "répertoire cache {{v0}} ≈ {{v1}} octets (pas )",
      "t0750": "cache {{v0}}/{{v1}}",
      "t0751": "IPv4 invalide : {{v0}}",
      "t0752": "IPv6 invalide : {{v0}}",
      "t0753": "nœud CDN {{v0}}",
      "t0754": "HTTP {{v0}} ( pour ){{v1}}",
      "t0755": "HTTP échoué : {{v0}}",
      "t0756": "TCP {{v0}}:443/80 connexion impossible",
      "t0757": "{{v0}}/{{v1}}",
      "t0758": "échec list-units : {{v0}}",
      "t0759": "unités de service {{v0}}",
      "t0760": "unité {{v0}}",
      "t0761": "{{v0}} octets",
      "t0762": "journalctl · {{v0}}",
      "t0763": "vacuum effectué : {{v0}}",
      "t0764": "échec du vacuum : {{v0}}",
      "t0765": "filtre : {{v0}}",
      "t0766": "fichier {{v0}} · {{v1}} octets · {{v2}}",
      "t0767": "liste blanche des chemins : {{v0}}",
      "t0768": "Journal : ≈{{v0}} Mo ( {{v1}} Mo)",
      "t0769": "projet {{v0}} · journal {{v1}} (répertoire)",
      "t0770": "Exporté {{v0}} ({{v1}})",
      "t0771": "pas vers {{v0}}",
      "t0772": "(DB-IP City Lite {{v0}} ; Échec)",
      "t0773": "repli {{v0}}",
      "t0774": ": {{v0}} · {{v1}} · {{v2}} · {{v3}}{{v4}} · ASN {{v5}}",
      "t0775": "fichier ({{v0}} o), échec du téléchargement",
      "t0776": "repli {{v0}} (Succès)",
      "t0777": "mise à jour {{v0}} ({{v1}} o)",
      "t0778": "Échec de la mise à jour {{v0}} : {{v1}}{{v2}}",
      "t0779": "Paramètres introuvables : {{v0}}",
      "t0780": "Impossible d'appliquer les paramètres : {{v0}}",
      "t0781": "Certificat introuvable : {{v0}}",
      "t0782": "dry-run : pas de systemctl {{v0}}. ajouter --execute YSK_EXECUTE=1 + root d'abord vraiment",
      "t0783": "job introuvable {{v0}}",
      "t0784": "Interface web : introuvable (compiler apps/web ou définir YSK_WEB_ROOT)\\n",
      "t0785": "Création de zone DNS (brouillon) : {{v0}}",
      "t0786": "Échec de création de zone DNS : {{v0}}",
      "t0787": "domaine mail : {{v0}}",
      "t0788": "Échec de création du domaine mail : {{v0}}",
      "t0789": "vers {{v0}} peut désactiver le cron",
      "t0790": "restic {{v0}}/{{v1}} ok",
      "t0791": ": {{v0}} {{v1}}",
      "t0792": "paramètres {{v0}}. --force.",
      "t0793": "paramètres {{v0}}",
      "t0794": "Interface introuvable {{v0}}",
      "t0795": "échec du hostname : {{v0}}",
      "t0796": "échec du pretty hostname : {{v0}}",
      "t0797": "échec du fuseau horaire : {{v0}}",
      "tScoreFrom": "score={{score}} de={{from}}",
      "appliedTag": " (appliqué)",
      "writtenTag": " (écrit seulement)",
      "selfDestMissing": "Répertoire d'installation en cours introuvable (systemd ExecStart ou cli.js)",
      "selfDestUnwritable": "Impossible d'écrire dans le répertoire d'installation en cours {{v0}}",
      "selfApplied": "{{v0}} appliqué sur {{v1}}",
      "selfVerifyFail": "Le fichier de version ne contient pas {{v0}} après application",
      "selfDownloadFail": "Impossible de télécharger ou extraire le paquet officiel {{v0}} : {{v1}}",
      "selfOverlayFail": "Impossible d'appliquer le paquet officiel au répertoire en cours : {{v0}}",
      "selfUpgradeHint": "Échec de l'application du panneau. En root : curl -fsSL https://raw.githubusercontent.com/yanshekki/ysk-server/main/install.sh | bash -s -- --upgrade"
    },
    "tpl": {
      "deleted": "Supprimé {{name}}",
      "removed": "Retiré {{name}}",
      "failedDetail": "Échec : {{detail}}",
      "failedColon": "Échec : {{detail}}",
      "actionFailed": "échec de {{action}} : {{detail}}",
      "restartFailed": "Échec du redémarrage : {{detail}}",
      "chownFailed": "échec de chown : {{detail}}",
      "available": "Disponible : {{detail}}",
      "supportedNotProbed": "Prend en charge {{name}} — pas encore sondé",
      "wrote": "Écrit {{path}}",
      "wroteSettings": "Paramètres écrits {{path}}",
      "wroteManaged": "Fichier géré écrit {{path}}",
      "copyFailed": "Échec de la copie : {{detail}}",
      "copyFailed2": "Échec de la copie : {{detail}}",
      "reloadFailed": "Échec du rechargement : {{detail}}",
      "reloadFailed2": "Échec du rechargement : {{detail}}",
      "nginxReloadFailed": "Échec du rechargement nginx : {{detail}}",
      "nginxTestFailed": "Échec de nginx -t : {{detail}}",
      "nginxConfigFailed": "Échec de la vérification de la config Nginx : {{detail}}",
      "psqlFailed": "Échec de psql : {{detail}}",
      "redisCliFailed": "Échec de redis-cli : {{detail}}",
      "restartFailed2": "Échec du redémarrage : {{detail}}",
      "missing": "{{name}} manquant",
      "project": "Projet {{name}}",
      "logNotFound": "Journal introuvable : {{path}}",
      "clusterNotFound": "Cluster introuvable : {{id}}",
      "domainInvalid": "Domaine invalide : {{domain}}",
      "exported": "Exporté {{path}}",
      "reenabledLink": "Connexion {{name}} réactivée",
      "installed": "Installé",
      "missingDataDir": "dataDir manquant",
      "installIncomplete": "Installation incomplète",
      "noPackages": "Aucun paquet",
      "recentlyUpdated": "Récemment mis à jour",
      "needRootRead": "Nécessite root pour la lecture",
      "reenabledPersist": "Connexion réactivée (persiste après redémarrage)",
      "runtimeOnlyHint": "(Peut ne pas persister après redémarrage ; utilisez Enregistrer pour persister)",
      "statusWrittenPartial": "Statut : écrit/partiel",
      "keyMissingOrNotDeleted": "Clé manquante ou non supprimée",
      "passwordCryptStored": "Mot de passe stocké en hachage crypt (pas en clair)",
      "skipInvalidUsername": "Nom d'utilisateur invalide ignoré",
      "digNoAnswer": "dig : pas de réponse (NXDOMAIN ou vide)",
      "ipAddrAddFailed": "Échec de ip addr add : {{detail}}",
      "ipAddrDelFailed": "Échec de ip addr del : {{detail}}",
      "connUpWarn": "Avertissement connection up : {{detail}}",
      "ntpEnableFailed": "Échec de l'activation NTP : {{detail}}",
      "cancelFailed": "Échec de l'annulation : {{detail}}",
      "powerCmdFailed": "Échec de la commande d'alimentation : {{detail}}",
      "reniceFailed": "Échec de renice : {{detail}}",
      "pgIncludeHint": "Incluez ce fichier dans postgresql.conf, ou copiez-le lors de l'application",
      "none": "aucun",
      "success": "Succès",
      "on": "activé",
      "off": "désactivé",
      "continueOp": "continuer",
      "unavailable": "indisponible",
      "unknownError": "erreur inconnue",
      "noParen": "(aucun)",
      "keepOldDb": "(ancienne BD conservée)",
      "ufwNotDetected": "UFW non détecté sur cet hôte",
      "fail2banStartHint": "Démarrez-le sur la page fail2ban",
      "hasExecuteNotRoot": "EXECUTE est activé mais le processus n'est pas root",
      "notRootTarget": "Pas root (useradd/apt cibles seront bloqués)",
      "reapplyDone": "étapes clés de réapplication terminées",
      "someFailed": "Certains ont échoué — voir les résultats",
      "securityDesc": "Mots de passe, TLS, limites locales",
      "yskControlPlane": "Plan de contrôle YSK",
      "sslDistributeNote": "Distribution SSL : le certificat sur l'edge ≠ chaîne de confiance navigateur complète ; vérifiez avec dig / curl -vI https://",
      "autoNever": "Jamais automatique",
      "autoManualEmergency": "Manuel URGENCE uniquement",
      "probeMech": "TCP public, req/min panneau, TCP en cours, fail2ban, UFW",
      "probeTunable": "Augmenter / abaisser les seuils",
      "priorityBlockers": "Traitez d'abord {{count}} bloqueur(s) : {{list}}",
      "readinessNotProduction": "La préparation n'est pas prête pour la production : {{list}}",
      "noRestart": "pas de redémarrage",
      "cityPolicyOff": "(politique city désactivée)",
      "pidStarted": "Processus démarré pid={{pid}} {{extra}}",
      "pidUser": "(utilisateur = {{user}})",
      "pidDegraded": "(dégradé)",
      "killFailed": "kill -s {{sig}} a échoué : {{detail}}",
      "routeAdded": "Route ajoutée {{dst}}{{via}}{{dev}}",
      "dnsWritten": "Écrit {{conn}} : DNS {{dns}}{{search}}",
      "peerInstalled": "Installé vers {{dest}}{{restart}}"
    },
    "installedTool": "Installé (outil)",
    "cron": {
      "preserveHostLines": "{{count}} ligne(s) crontab hôte non-YSK conservée(s) (pas d’effacement complet).",
      "noHostLinesOrEmpty": "Aucune ligne crontab hôte non-YSK supplémentaire (ou vide).",
      "installReplacesYskOnly": "L’installation met à jour uniquement les tâches marquées YSK ; les autres tâches hôte ont été fusionnées et conservées.",
      "hostScanNeedRoot": "La lecture des crontabs des autres utilisateurs nécessite le plan de contrôle en root ; seule la crontab de l’utilisateur du processus est listée.",
      "hostScanSkipUser": "Utilisateur {{user}} ignoré (pas de permission)",
      "hostUserInvalid": "Utilisateur crontab invalide.",
      "hostScheduleInvalid": "Planification cron de l'hôte non valide.",
      "hostLineNotJob": "Cette ligne crontab n'est pas un travail.",
      "hostLineMissing": "Aucune ligne crontab correspondante (la crontab hôte peut avoir changé).",
      "hostLineDuplicate": "Cette ligne d'emploi apparaît {{count}} fois ; modifiez d'abord une ligne unique.",
      "hostReadFailed": "Impossible de lire la crontab : {{detail}}",
      "hostWriteFailed": "Échec de l'écriture de crontab : {{detail}}",
      "hostRewriteNeedExecute": "L'écriture d'une ligne crontab hôte nécessite root et YSK_EXECUTE=1. Aperçu uniquement.",
      "hostRewriteNeedRoot": "La modification de la crontab d'un autre utilisateur nécessite le plan de contrôle en tant que root.",
      "hostPreview": "Ligne suivante : {{line}}",
      "hostPreviewDelete": "Ensuite : supprimez cette ligne.",
      "hostRewritten": "J'ai écrit crontab pour {{user}}.",
      "hostRunNeedExecute": "L’exécution d’une commande cron hôte nécessite YSK_EXECUTE=1.",
      "hostRan": "Exécution de la commande cron de l'hôte sous la forme {{user}}.",
      "hostAdoptNeedExecute": "L'adoption d'une ligne hôte dans le panneau nécessite YSK_EXECUTE=1 (sinon l'installation la dupliquerait).",
      "hostAdopted": "Ligne hôte étiquetée #ysk:{{id}} et enregistrée dans le panel.",
      "hostConfirmMismatch": "Confirmer doit correspondre à la commande.",
      "hostAdoptOnlyInstallUser": "À intégrer dans le panneau uniquement pour les écritures d'installation de crontab (utilisateur racine/ce processus). Les autres utilisateurs seraient dupliqués lors de l'installation.",
      "hostAdoptEnableFirst": "Activez la ligne hôte avant de l'introduire dans le panneau.",
      "hostPercentNewline": "crontab traite les % non échappés comme une nouvelle ligne. Écrivez les formats de date sous la forme \\%Y (ou évitez %)."
    },
    "dbBrowser": {
      "pmaInstalled": "phpMyAdmin installé dans {{path}}",
      "pmaConfigWritten": "Config et tmp phpMyAdmin écrits (auth par cookie ; HTTPS recommandé)",
      "pmaExtractFailed": "Échec du téléchargement/extraction de phpMyAdmin : {{detail}}",
      "projectCreated": "Projet créé {{id}} ({{name}})"
    },
    "firewallAllow": {
      "already": "{{port}}/{{proto}}{{from}} : déjà autorisé",
      "partial": "Partiel : {{ok}} ok, {{fail}} échec(s)",
      "fromLabel": " depuis {{from}}"
    },
    "firewallDeleteByComment": {
      "removed": "Suppression des règles de pare-feu {{n}} correspondant à {{prefix}}",
      "none": "Aucune règle de pare-feu ne correspond à {{prefix}}"
    },
    "serviceExposure": {
      "needsDecision": "{{service}} : confirmez s'il faut exposer ce service sur le réseau",
      "private": "{{service}} : gardé privé (aucun pare-feu public n'est autorisé)",
      "restrictedEmpty": "Le mode restreint nécessite au moins une adresse IP/CIDR autorisée",
      "badCountry": "Code pays invalide : {{cc}}",
      "zoneDownloadFail": "Échec du téléchargement de la zone de pays pour {{cc}} : {{detail}}",
      "zoneEmpty": "La zone de pays pour {{cc}} est vide",
      "zoneDownloaded": "{{n}} CIDR téléchargés pour {{cc}}",
      "zoneMissing": "Aucun fichier de zone pour {{cc}} — placer sous geoip/country-zones ou autoriser le téléchargement",
      "zoneCidrCap": "Liste CIDR des pays limitée à {{n}} entrées",
      "geoNeedExecute": "La liste d'autorisation du pays nécessite YSK_EXECUTE",
      "geoNeedRoot": "La liste d'autorisation du pays nécessite la racine",
      "geoNoCidrs": "Aucun CIDR de pays chargé : impossible d'appliquer la liste d'autorisation géographique",
      "ipsetMissing": "ipset non installé – liste autorisée des pays ignorée",
      "ipsetApplyFail": "L'application ipset/iptables a échoué : {{detail}}",
      "ipsetApplied": "Liste d'autorisation de pays définie {{set}} ({{countries}}, {{n}} CIDR)",
      "ipsetCleared": "IPset du pays effacé {{set}}",
      "geoBestEffort": "Le filtrage par pays s'effectue au mieux (ipset) ; les groupes de sécurité cloud sont distincts"
    },
    "goLive": {
      "deployIncomplete": "goLive : déploiement incomplet",
      "deployFailed": "Échec du déploiement goLive : {{detail}}",
      "publishIncomplete": "goLive : publication incomplète",
      "publishFailed": "Échec de la publication goLive : {{detail}}"
    },
    "ops": {
      "projectNameExists": "Le nom de projet existe déjà : {{name}}",
      "sslNotReady": "SSL non prêt : aucun certificat pour {{domain}}.",
      "sslNotReadyDetail": "SSL non prêt : aucun certificat pour {{domain}} (SSL du panneau ou chemin live Let’s Encrypt).",
      "sslGoToPage": "Émettez ou téléversez un certificat dans SSL, puis publiez + SSL.",
      "sslRejectWrite": "Écriture de la conf SSL nginx refusée pour éviter l’échec de nginx -t.",
      "installAborted": "Installation abandonnée (client déconnecté ou annulé)",
      "phpPackagesPartialFail": "Certains paquets PHP ont échoué : {{list}} (le CLI principal peut encore fonctionner)",
      "pdnsBindConflict": "PowerDNS ne peut pas se lier à 0.0.0.0:53 (déjà utilisé) ; souvent en conflit avec systemd-resolved. Liez l’IP publique (panneau : Fix PowerDNS)."
    },
    "webmail": {
      "notInstalled": "Le webmail n’est pas installé ; activez le téléchargement et relancez",
      "needExecute": "Le téléchargement du webmail nécessite la permission de modification système (YSK_EXECUTE) et un accès réseau sortant",
      "needExecuteBeforeCreate": "Aucun projet partiel ne sera créé tant que EXECUTE n’est pas activé",
      "notRoundcubeTree": "La racine document n’est pas une arborescence Roundcube complète (peut encore être php-hello)",
      "notSnappyTree": "La racine document n’est pas une arborescence SnappyMail complète",
      "installIncompleteHint": "Le projet existe mais le webmail est incomplet — activez EXECUTE puis Réinstaller/Mettre à niveau",
      "extractFailed": "Échec du téléchargement ou de l’extraction de {{tool}} : {{detail}}",
      "roundcubeInstalled": "Roundcube {{version}} installé → {{path}}",
      "roundcubeReuse": "Réutilisation de Roundcube installé → {{path}}",
      "roundcubeConfigWritten": "Config Roundcube écrite (SQLite, IMAP 993, SMTP 587)",
      "snappyInstalled": "SnappyMail {{version}} installé → {{path}}",
      "snappyReuse": "Réutilisation de SnappyMail installé → {{path}}",
      "snappyAdminHint": "À la première ouverture, terminez la configuration admin SnappyMail et ajoutez le domaine IMAP local",
      "imapSmtpHint": "IMAP {{imap}}:993 · SMTP {{smtp}}:587 (connexion avec l’adresse complète de la boîte et le mot de passe)",
      "projectCreated": "Projet PHP créé {{name}} ({{tool}}, {{id}})",
      "domainRequired": "Le nom d’hôte webmail est requis",
      "openHint": "Connectez-vous avec l’adresse de la boîte et le mot de passe ; ouvrez l’URL depuis Projets ou cette page après la mise en ligne",
      "sslHint": "Recommander Let’s Encrypt pour {{domain}} (page SSL)",
      "bootstrapLegacyHint": "Le bootstrap n’avait pas de service projet — squelette dataDir écrit ; utilisez Créer et mettre en ligne dans le panneau pour le chemin du projet PHP",
      "ssoPluginInstalled": "Plugin SSO installé → {{path}}",
      "forceHttpsOn": "Roundcube force_https activé (HTTPS requis)",
      "forceHttpsOff": "force_https désactivé — après le SSL, réinstallez avec forcer HTTPS coché",
      "reinstallHint": "Le projet existe — utilisez Réinstaller/Mettre à niveau ou reinstall:true",
      "reinstalling": "Réinstallation du webmail dans le projet {{name}} ({{id}})",
      "reinstallStart": "Démarrage de la réinstallation/mise à niveau (version figée {{version}}, projet {{id}})",
      "projectNotFound": "Projet webmail introuvable",
      "snappyAdminOnce": "Admin SnappyMail {{user}} — mot de passe affiché une seule fois (voir résultat / fichier ONCE)",
      "snappyAdminPassword": "Mot de passe admin SnappyMail (copier maintenant) : {{password}}",
      "publicHtmlStub": "La racine du document contient toujours le stub du package SnappyMail/RainLoop. HTTP doit servir l'arborescence des applications public_html - réinstallez la messagerie Web après ce correctif.",
      "goLiveFailed": "Fichiers de messagerie Web installés, mais la mise en service/le déploiement du projet a échoué : développez les détails.",
      "forceHttpsNeedsSsl": "Roundcube force_https est activé : liez SSL pour ce nom d'hôte avant de vous fier au HTTPS public, ou décochez forcer HTTPS d'ici là.",
      "roundcubePublicHtmlDocRoot": "Racine du document HTTP définie sur Roundcube public_html ({{path}})",
      "docRootUpdated": "Racine du document de projet mise à jour à {{path}}",
      "docRootUpdateFailed": "Impossible de mettre à jour la racine du document de projet : {{detail}}",
      "sqliteSchemaReady": "Schéma Roundcube SQLite initialisé",
      "sqliteSchemaFailed": "Échec de l'initialisation du schéma Roundcube SQLite : {{detail}}",
      "snappyFullEmailLogin": "La connexion à la boîte aux lettres doit utiliser l'adresse e-mail complète (utilisateur@domaine) ; la partie locale courte est désactivée",
      "removedBogusPublicHtml": "Suppression du public_html restant (php-hello) afin que le webmail ne soit pas servi à partir de la mauvaise arborescence",
      "snappyDocRoot": "Racine du document HTTP SnappyMail : {{path}}",
      "phpHelloStillPresent": "Installez le php-hello gauche (YSK PHP OK) en tant que racine du site — l'extrait du webmail ne l'a pas remplacé"
    },
    "vpn": {
      "needInstall": "Installer {{engine}}",
      "openvpnComing": "Le chemin complet d’OpenVPN est prévu pour la prochaine version.",
      "outlineComing": "Outline / Shadowsocks est prévu pour une version ultérieure.",
      "needExecuteServer": "La configuration du serveur VPN nécessite root et YSK_EXECUTE=1.",
      "serverStopped": "{{engine}} serveur arrêté.",
      "serverStopFailed": "Impossible d'arrêter le serveur {{engine}} : {{detail}}",
      "needExecuteClient": "La connexion du client VPN nécessite root et YSK_EXECUTE=1.",
      "keygenFailed": "La génération de la clé WireGuard a échoué (wg est-il installé ?).",
      "serverKeysCreated": "Clés du serveur WireGuard créées.",
      "applyFailed": "Échec de l'application de la configuration WireGuard : {{detail}}",
      "serverActive": "Serveur WireGuard appliqué (UDP {{port}}).",
      "serverMissing": "Le serveur WireGuard n'est pas initialisé : exécutez d'abord Démarrer le serveur.",
      "peerCreated": "Client «{{name}}» créé.",
      "peerNotFound": "Client introuvable.",
      "peerRemoved": "Client supprimé.",
      "peersSynced": "Liste de pairs rechargée sur l’interface WireGuard en cours d’exécution.",
      "setEndpointHint": "Définissez le point de terminaison public (hôte: port) pour que les clients mobiles puissent atteindre ce serveur.",
      "invalidConf": "Conf doit inclure [Interface] et PrivateKey.",
      "clientImported": "Profil «{{name}}» importé.",
      "profileNotFound": "Profil client introuvable.",
      "clientUpFailed": "Échec de la connexion : {{detail}}",
      "clientUp": "Connecté : {{name}}",
      "clientDown": "Déconnecté : {{name}}",
      "clientDeleted": "Profil supprimé : {{name}}",
      "autostartOn": "Démarrage automatique sur : {{name}}",
      "autostartOff": "Démarrage automatique désactivé : {{name}}",
      "ovpnPkiStart": "Génération d'OpenVPN PKI (peut prendre une minute pour les paramètres DH)…",
      "ovpnPkiDone": "Prêt pour OpenVPN PKI.",
      "ovpnServerActive": "Serveur OpenVPN appliqué ({{proto}} {{port}}).",
      "invalidOvpn": "La configuration OpenVPN doit inclure des directives client/distant.",
      "ssHonest": "Utilise le serveur SS shadowsocks-libev – et non Outline Manager complet.",
      "ssKeysCreated": "Mot de passe du serveur Shadowsocks généré.",
      "ssServerActive": "Serveur Shadowsocks appliqué (port {{port}}).",
      "ssSharedPassword": "Toutes les étiquettes ss:// partagent un mot de passe de serveur (rotation en ré-assurant le serveur).",
      "ssPackageYielded": "Unité par défaut Debian shadowsocks-libev arrêtée/masquée afin que YSK puisse lier le {{port}} public sur cet hôte.",
      "ssEndpointAutofilled": "Point de terminaison public défini sur {{endpoint}}.",
      "ssClientsRewritten": "URI(s) ss:// client {{n}} régénéré pour le point de terminaison/mot de passe actuel.",
      "ssUfwOpened": "Ouverture d'UFW {{port}}/tcp+udp pour Shadowsocks (si ufw est installé).",
      "endpointAutofilled": "Point de terminaison public défini sur {{endpoint}}.",
      "ovpnClientsRewritten": "Remote = mis à jour dans {{n}} profil(s) client OpenVPN pour téléchargement/QR.",
      "accessFullNat": "Internet complet activé (transfert IP + NAT)",
      "accessLanOnly": "Mode LAN uniquement (pas de NAT Internet)",
      "accessReconnectHint": "Les clients déjà connectés doivent se reconnecter pour prendre de nouveaux itinéraires",
      "ovpnNatDurable": "OpenVPN NAT/forward installé pour le redémarrage (systemd ExecStartPost).",
      "clientFullTunnelProtect": "Client tunnel complet détecté (AllowedIPs 0.0.0.0/0). Protection de l'hôte appliquée afin que les réponses du panneau/SSH restent sur la carte réseau LAN.",
      "clientFullTunnelHint": "Astuce : pour un accès partagé uniquement, définissez AllowedIPs sur les CIDR VPN/LAN (et non 0.0.0.0/0) dans la configuration, puis reconnectez-vous."
    },
    "vnc": {
      "needInstall": "Installer {{stack}}",
      "needExecute": "YSK_EXECUTE est désactivé : impossible d'installer des packages ou de provisionner des utilisateurs Linux.",
      "needRoot": "Ne s'exécute pas en tant que root - l'ajout d'utilisateur système et l'application de vncserver sont bloqués.",
      "hostnameResolves": "Le nom d'hôte {{hostname}} est résolu.",
      "hostnameUnresolvable": "Cet hôte ne peut pas résoudre son propre nom d'hôte ({{hostname}}). Le démarrage de la session VNC échouera jusqu'à ce que /etc/hosts soit corrigé.",
      "hostnameAlreadyResolves": "Le nom d'hôte {{hostname}} est déjà résolu — /etc/hosts inchangé.",
      "hostnameWouldAppend": "S'ajouterait à /etc/hosts : {{line}}",
      "hostnameAppended": "Ajouté à /etc/hosts : {{line}}",
      "hostnameAppendFailed": "Impossible d'écrire /etc/hosts : {{detail}}",
      "hostnameAliasPresent": "Le nom d'hôte {{hostname}} est déjà un alias exact /etc/hosts — qui n'est pas ajouté à nouveau.",
      "hostnameStillUnresolvable": "J'ai écrit /etc/hosts mais {{hostname}} ne résout toujours pas. Vérifiez que les hôtes nsswitch incluent des fichiers.",
      "skipStartHostname": "L'affichage n'a pas démarré : corrigez d'abord la résolution du nom d'hôte.",
      "novncAssetsOnly": "Actifs Web noVNC trouvés ; Le binaire websockify est toujours manquant.",
      "viewerNeedExecute": "Le démarrage d'un bureau VNC local pour la vue du navigateur nécessite root + YSK_EXECUTE",
      "browserSessionReady": "Session VNC du navigateur prête : {{name}}",
      "clientPathUserReachable": "Chemin : point de terminaison accessible par l'utilisateur – {{name}} → {{target}} (navigateur via le panneau)",
      "clientPathServerProxy": "Chemin : proxy du serveur — {{name}} → {{target}} (sortie via ce serveur)",
      "clientOpenInBrowserHint": "Utilisez « Ouvrir dans le navigateur » sur la liste des clients pour le client VNC intégré",
      "probeOk": "Accessibilité OK : le plan de contrôle peut ouvrir TCP à {{target}}",
      "probeRefused": "Rien n'écoute sur {{target}} (connexion refusée). VNC fonctionne-t-il sur cet hôte ?",
      "probeTimeout": "Le délai de connexion à {{target}} à partir de ce serveur a expiré. Vérifiez le pare-feu/le routage.",
      "probeDns": "Impossible de résoudre le nom d'hôte «{{host}}».",
      "probeNet": "Réseau inaccessible pour {{target}} depuis ce serveur.",
      "probeFailed": "Impossible d'atteindre {{target}} : {{detail}}",
      "probeInvalid": "Cible VNC non valide {{host}} : {{port}}",
      "probeHintUserReachable": "Le chemin est « accessible à l'utilisateur » : ce panneau doit toujours ouvrir TCP à l'hôte public (le navigateur ne peut pas parler seul RFB).",
      "probeHintServerProxy": "Le chemin est « serveur proxy » : la cible doit être accessible depuis le réseau de cet hôte du plan de contrôle.",
      "connectHostOverride": "Proxy du serveur : affiche l'hôte {{display}}, TCP se connecte à {{connect}}",
      "probeConnectHostHint": "Afficher la cible {{display}}, l'adresse de sonde/connexion {{connect}} (remplacement de l'hôte de connexion).",
      "accountNotFound": "Compte VNC introuvable",
      "accountExists": "Un compte VNC portant ce nom ou cet utilisateur Linux existe déjà",
      "accountCreated": "Compte VNC créé {{name}} ({{user}}, affichage :{{display}})",
      "accountUpdated": "Compte VNC mis à jour {{name}}",
      "accountDeleted": "Compte VNC supprimé {{name}}",
      "invalidName": "Nom de compte invalide",
      "invalidGeometry": "Résolution invalide (utilisez par exemple 1920x1080)",
      "displayBusy": "Le numéro d'affichage n'est pas valide ou est déjà utilisé",
      "displayExhausted": "Aucun numéro d'affichage VNC libre restant à portée",
      "userWrittenOnly": "Utilisateur Linux {{user}} enregistré dans le plan de contrôle uniquement (besoin de root + YSK_EXECUTE pour useradd)",
      "userExists": "L'utilisateur Linux {{user}} existe déjà",
      "userCreated": "Utilisateur Linux créé {{user}}",
      "useraddFailed": "useradd a échoué pour {{user}} : {{detail}}",
      "userdelBlocked": "Impossible de supprimer l'utilisateur Linux {{user}} sans root + YSK_EXECUTE",
      "userAlreadyGone": "L'utilisateur Linux {{user}} est déjà absent",
      "userdelFailed": "userdel a échoué pour {{user}} : {{detail}}",
      "userdelLeftover": "Compte Panel supprimé, mais l'utilisateur Linux {{user}} est toujours sur l'hôte. Supprimez-le des utilisateurs ou de l'hôte.",
      "userDeleted": "Utilisateur Linux supprimé {{user}}",
      "passwordTooShort": "Le mot de passe VNC doit contenir au moins 6 caractères",
      "passwordWrittenOnly": "Mot de passe marqué dans le plan de contrôle uniquement (nécessite root + YSK_EXECUTE pour vncpasswd)",
      "passwordFailed": "Échec de l'écriture du mot de passe VNC : {{detail}}",
      "passwordNeedTiger": "vncpasswd introuvable. Installez TigerVNC (tigervnc-standalone-server) avant de définir un mot de passe.",
      "passwordSet": "Mot de passe VNC défini sur {{user}}",
      "passwordUpdated": "Mot de passe mis à jour pour {{name}}",
      "passwordMetaOnly": "Mot de passe stocké sous forme de méta uniquement jusqu'à ce que le système s'applique",
      "xstartupWrittenOnly": "xstartup n'est pas écrit à la maison (besoin de root + YSK_EXECUTE)",
      "xstartupWriteFailed": "Échec de l'écriture de ~/.vnc/xstartup ({{detail}}). Besoin de root + YSK_EXECUTE.",
      "xstartupFailed": "VNC xstartup/desktop a échoué à l'affichage :{{display}} ({{detail}}). Préférez le profil XFCE ou installez un terminal.",
      "xstartupWritten": "Écrit {{path}}",
      "sessionStartBlocked": "Impossible de démarrer la session VNC sans root + YSK_EXECUTE",
      "sessionStartFailed": "Échec du démarrage de l'affichage : {{display}} : {{detail}}",
      "sessionStartHostname": "Échec du démarrage de l'affichage :{{display}} : cet hôte ne peut pas résoudre son propre nom d'hôte. Ajoutez le nom d'hôte à /etc/hosts (ou corrigez le DNS), puis redémarrez la session.",
      "sessionStarted": "VNC démarré pour {{user}} sur :{{display}} (port {{port}})",
      "sessionStartUnverified": "La commande de démarrage a renvoyé OK mais le port RFB n'écoute pas encore",
      "sessionAlreadyRunning": "VNC fonctionne déjà pour {{user}} sur :{{display}} (port {{port}})",
      "vncserverMissing": "Le wrapper du serveur TigerVNC (tigervncserver/vncserver) n'est pas installé - utilisez l'onglet Installer",
      "vncserverWrapperMissing": "Trouvé {{found}} mais pas de wrapper Tigervncserver/vncserver — réinstallez Tigervnc-standalone-server",
      "vncPackageWithoutBin": "Le package Tigervnc-standalone-server est installé mais le script de démarrage est manquant – réinstallez le package",
      "needPasswordBeforeStart": "Définissez un mot de passe VNC (≥6 caractères) avant de commencer",
      "displayPortBusy": "Affichage :{{display}} → le port {{port}} est déjà utilisé — arrêtez l'autre session ou choisissez un autre affichage",
      "sessionStartPermission": "Autorisation refusée lors du démarrage de l'affichage :{{display}}",
      "staleLockCleared": "Verrou obsolète effacé pour l'affichage :{{display}}, nouvelle tentative",
      "sessionStopBlocked": "Impossible d'arrêter la session VNC sans root + YSK_EXECUTE",
      "sessionStopped": "VNC arrêté pour {{user}} affichage :{{display}}",
      "linuxUserKept": "Utilisateur Linux conservé {{user}} sur le système",
      "novncStartBlocked": "Impossible de démarrer noVNC sans root + YSK_EXECUTE",
      "novncAlreadyRunning": "noVNC fonctionne déjà sur le port {{port}}",
      "novncStartFailed": "Échec du démarrage de websockify : {{detail}}",
      "novncStarted": "noVNC en écoute sur 127.0.0.1 :{{httpPort}} → RFB {{rfbPort}}",
      "novncNotRunning": "noVNC ne fonctionnait pas",
      "novncStopBlocked": "Impossible d'arrêter noVNC sans root + YSK_EXECUTE",
      "novncStopped": "NoVNC arrêté sur le port {{httpPort}}",
      "directNeedsAllBind": "La liaison RFB est localhost — les clients directs ne peuvent pas accéder de l'extérieur sans tunnel",
      "directOpenFirewall": "Ouvrez TCP {{port}} dans le pare-feu pour les clients directs",
      "viaServerReady": "noVNC est opérationnel : ouvrez l'URL locale ou utilisez un tunnel SSH",
      "viaServerStartFirst": "Démarrez noVNC pour activer l'accès au navigateur via le serveur",
      "viewTicketIssued": "Émission d'un ticket de vue de courte durée",
      "invalidPort": "Numéro de port invalide",
      "firewallNeedExecute": "L'ouverture des ports UFW nécessite YSK_EXECUTE",
      "firewallNeedRoot": "L'ouverture des ports UFW nécessite root",
      "firewallFailed": "échec de l'autorisation ufw : {{detail}}",
      "firewallOpened": "UFW a autorisé TCP {{port}}",
      "clientInvalid": "Le nom du client et l'hôte sont requis",
      "clientNotFound": "Profil client introuvable",
      "clientUpBlocked": "Impossible de connecter le client VNC sans root + YSK_EXECUTE",
      "clientUpFailed": "Échec de la connexion client : {{detail}}",
      "clientViaServerUp": "Client {{name}} prêt pour le navigateur VNC via le panneau (ancienne note websockify retirée). La cible reste accessible via Ouvrir dans le navigateur.",
      "clientDirectUp": "Le client {{name}} utilise uniquement le VNC dans le navigateur (le chemin du vncviewer de l'hôte a été supprimé). Ouvrir dans le navigateur → {{target}}.",
      "clientNeedViewer": "Le vncviewer de bureau est facultatif. Utilisez Ouvrir dans le navigateur pour le client VNC intégré.",
      "clientDownBlocked": "Impossible de se déconnecter sans root + YSK_EXECUTE",
      "clientDown": "Client déconnecté {{name}}",
      "clientDeleted": "Profil client supprimé",
      "sessionStartCwd": "Échec du démarrage de VNC : répertoire de travail non accessible à l'utilisateur de la session (affichage :{{display}}). Corrigé en démarrant depuis HOME.",
      "desktopRestarted": "Profil de bureau appliqué et session redémarrée ({{desktop}}). Reconnectez VNC/noVNC.",
      "desktopNeedsStart": "Profil de bureau {{desktop}} écrit sur xstartup. Démarrez la session pour postuler.",
      "linuxUserRolledBack": "Suppression de l'utilisateur Linux restant {{user}} après l'échec du mot de passe VNC.",
      "linuxUserOrphan": "Impossible de supprimer l'utilisateur Linux restant {{user}} après l'échec du mot de passe VNC."
    },
    "apache": {
      "needServerName": "Nom du serveur requis",
      "siteExists": "Le site existe déjà",
      "siteNotFound": "Site introuvable",
      "wroteConf": "Écrit {{path}}",
      "needExecute": "Nécessite YSK_EXECUTE",
      "settingsWritten": "Valeurs par défaut d'Apache écrites",
      "managedDir": "Répertoire géré {{path}}",
      "dryRun": "Essai à sec",
      "copyFailed": "Échec de la copie : {{file}}",
      "configOk": "test de configuration OK",
      "configFailed": "Le test de configuration a échoué : {{detail}}",
      "reloaded": "Apache rechargé",
      "reloadFailed": "Échec du rechargement",
      "skippedOrphans": "{{count}} conf(s) orpheline(s) ignorée(s) (n'appartenant pas)",
      "artifactInvalid": "Nom de configuration d'artefact non valide",
      "artifactOwned": "Conf {{file}} appartient à un projet ou à un site autonome",
      "artifactNotFound": "Conf d'artefact introuvable : {{file}}",
      "artifactRemoveFailed": "Échec de la suppression de {{file}} : {{detail}}",
      "artifactRemoved": "Conf. orpheline supprimée {{file}}",
      "artifactSystemPending": "DataDir nettoyé ; le système Apache Twin a besoin de YSK_EXECUTE/root pour être désactivé",
      "artifactSystemDisabled": "Site système désactivé {{site}}",
      "artifactSystemFailed": "Échec de la désactivation du système : {{detail}}",
      "conflictProjectsOnly": "Le domaine {{name}} est revendiqué par plusieurs projets : modifiez le domaine d'un projet",
      "cleanupNothing": "Aucune configuration d'artefact conflictuelle à supprimer",
      "conflictOwnedKeep": "Conf appartenant à {{file}} (également ServerName {{domain}})",
      "retiredOrphan": "Conf orphelin à la retraite {{file}} (Nom du serveur en conflit avec {{domain}})"
    },
    "btTracker": {
      "needExecute": "YSK_EXECUTE est désactivé : l'installation/démarrage du tracker et les ports publics nécessitent une autorisation de modification du système.",
      "startWithoutExecute": "Démarrage du tracker sans YSK_EXECUTE — l'écoute peut fonctionner ; le pare-feu hôte ne sera pas ouvert.",
      "alreadyRunning": "Le tracker BitTorrent est déjà en cours d'exécution dans ce processus.",
      "notRunning": "Le tracker BitTorrent ne fonctionne pas.",
      "started": "Tracker BitTorrent en écoute sur le port {{port}}.",
      "startFailed": "Échec du démarrage du tracker : {{detail}}",
      "stopped": "Le tracker BitTorrent s'est arrêté.",
      "maxSeeds": "Nombre maximal de graines simultanées atteint ({{n}}).",
      "seedStarted": "Part d'amorçage {{id}}.",
      "seedStopped": "Partage d'amorçage arrêté.",
      "seedPending": "L'amorçage n'est pas encore prêt : démarrez le tracker et assurez-vous de YSK_EXECUTE si nécessaire.",
      "notSeeding": "Ce partage n’est actuellement pas amorcé par le plan de contrôle.",
      "btNeedsTracker": "Le partage BT a besoin d'un tracker en cours d'exécution. Ouvrez Fichiers → BT Tracker et démarrez-le.",
      "restoreTrackerFailed": "Le tracker BT n'a pas pu démarrer lors de la restauration du démarrage",
      "restoreDone": "Restauration BT : initialisée {{seeded}}/{{attempted}} (échec {{failed}})",
      "workerMissing": "Script de travailleur détaché manquant ; démarré en cours (meurt avec ce processus)",
      "startedDetached": "Le travailleur détaché du tracker BT a démarré (pid {{pid}}, port {{port}})",
      "runningDetached": "Tracker exécuté en tant que travailleur détaché (pid {{pid}})",
      "jobQueued": "Création de torrent BT en file d'attente (partage important)",
      "jobRunning": "Création de torrent BT en cours d'exécution",
      "libraryAdded": "Ajout de {{name}} à la bibliothèque WebTorrent",
      "libraryInspectFailed": "Impossible de lire ce .torrent ou cet aimant",
      "libraryDup": "Ce torrent est déjà dans la bibliothèque",
      "libraryDestBad": "Le dossier de sauvegarde n'est pas un chemin de fichiers valide",
      "libraryTorrentTooBig": "Le fichier .torrent fait plus de 8 Mo",
      "libraryNotFound": "Élément de bibliothèque introuvable",
      "libraryPaused": "En pause",
      "libraryResumed": "Reprise",
      "libraryRemoved": "Supprimé de la bibliothèque",
      "libraryFilesRemoved": "Fichiers téléchargés supprimés",
      "libraryRestoreDone": "Restauration de la bibliothèque : démarrée {{started}}/{{attempted}} (échec {{failed}})",
      "applyTrackersDone": "Application de trackers supplémentaires aux {{n}} emplacements d'annonce en direct",
      "libraryNeedServe": "Enregistré. Ouvrez le panneau (serveur ysk-server) pour que WebTorrent puisse télécharger ou démarrer.",
      "libraryDestIsFile": "Impossible de créer un dossier nommé {{name}} — un fichier portant ce nom existe déjà.",
      "librarySeedMissing": "Aucun fichier correspondant à créer dans ce dossier.",
      "libraryWaitingPeers": "En attente de pairs. Si les fichiers sont déjà sur cet hôte, ajoutez-les à nouveau et choisissez seed-existant."
    },
    "migrate": {
      "orphanConfirm": "Tapez le chemin d’accès exact restant pour confirmer la suppression.",
      "orphanStillInStore": "Cette maison fait toujours partie d'un projet du magasin.",
      "orphanMissing": "Chemin pas sur le disque : {{path}}",
      "orphanNeedExecute": "Supprimerait les restes {{path}}. Nécessite YSK_EXECUTE=1.",
      "orphanRmFailed": "Impossible de supprimer la maison restante : {{detail}}",
      "orphanRemoved": "Suppression de la maison de projet restante {{path}}."
    },
    "publicFiles": {
      "liveConf": "Conf Nginx en service : {{path}}",
      "publicRoot": "Racine publique : {{path}}",
      "confNameStale": "Le fichier {{file}} ne correspond pas au server_name actuel {{serverName}}. Réappliquez les fichiers publics pour le renommer."
    },
    "leftover": {
      "staleCliTitle": "CLI restante périmée",
      "staleCli": "CLI restante toujours présente : {{path}} (produit en cours d'exécution {{version}}). PATH peut le préférer. Supprimer avec : rm -f {{path}}",
      "apacheDefaultTitle": "Site par défaut restant d'Apache",
      "apacheDefault": "Apache 000 par défaut est toujours activé. Il s'agit du fichier stock du site — cela ne signifie pas qu'Apache écoute sur public :80 (YSK Apache est attendu sur 127.0.0.1:8080). La superposition ne le désactive pas. Appliquez Apache à partir du panneau ou de l'hébergement Apache apply --execute.",
      "nginxCatchAllTitle": "Nginx fourre-tout manquant",
      "nginxCatchAll": "ysk-000-default.conf n'est pas dans /etc/nginx/conf.d. Un SNI inconnu peut échouer. Exécutez les projets nginx-sync --execute.",
      "vsftpdTitle": "L'unité vsftpd a échoué",
      "vsftpd": "vsftpd a échoué. La superposition ne réécrit pas Listen/listen_ipv6. Appliquez FTP à partir du panneau.",
      "dovecotTitle": "Dovecot TLS indique un certificat manquant",
      "dovecot": "Dovecot ssl_cert indique qu'il manque {{path}}. La superposition ne réécrit pas ssl=no. Appliquez le courrier TLS après avoir émis le certificat ou appliquez la pile de courrier électronique.",
      "overlayDoesNotHeal": "La superposition de produits ne réécrit pas nginx, Apache, vsftpd ou Dovecot. Utilisez les commandes d'application répertoriées (root + YSK_EXECUTE=1).",
      "executeStaleCli": "Passez --execute (root + YSK_EXECUTE=1) pour supprimer les bacs CLI obsolètes.",
      "executeMissingTls": "Passez --execute (root + YSK_EXECUTE=1) pour désactiver le certificat TLS manquant afin que vsftpd/Dovecot puisse démarrer.",
      "executeGeneric": "Passez --execute (root + YSK_EXECUTE=1) pour appliquer le nettoyage restant pour les résultats ci-dessus.",
      "staleCliRemoved": "CLI résiduel {{path}} supprimé.",
      "staleCliRemoveFailed": "Impossible de supprimer le CLI résiduel {{path}} : {{detail}}",
      "vsftpdSslOff": "Certificat FTPS manquant : ssl_enable=NO sur vsftpd, puis redémarrage.",
      "dovecotSslOff": "{{path}} manquant : Dovecot en ssl=no, puis redémarrage.",
      "readinessTitle": "Restes d’hôte après superposition",
      "readinessClean": "Aucun défaut Apache restant, nginx fourre-tout manquant, échec de vsftpd ou CLI obsolète détecté.",
      "nginxRemoved": "Suppression des restes de conf nginx {{path}}.",
      "nginxNotLeftover": "Il ne s'agit pas d'une conférence de fichiers publics restante : refusez la suppression.",
      "nginxUnusedKeep": "000-par défaut n'est pas utilisé, pas restant - pas supprimé.",
      "nginxSystemCopy": "Copie système toujours présente : {{path}}. Nécessite YSK_EXECUTE + root pour supprimer.",
      "nginxReloadFailed": "nginx -t ou reload a échoué après la suppression de {{path}}."
    },
    "defense": {
      "panelReqLabel": "Demandes de panel / min",
      "panelReqExcluded": "Trafic du panneau authentifié : affiché ici, non pris en compte dans le score de menace",
      "tcpOk": "TCP {{target}} accessible",
      "tcpFail": "TCP {{target}} a échoué",
      "dnsDegraded": "Chemin DNS dégradé",
      "reqRateHigh": "Taux de requêtes publiques {{reqs}}/min ≥ {{threshold}}",
      "ddosHeuristic": "Taux de requêtes publiques élevé et échec de la sonde de périphérie"
    }
  },
  "ops": {
    "blocked": {
      "needExecute": "L’exécution hôte est désactivée ; cette action ne peut pas se terminer depuis le panneau",
      "needExecuteShort": "L’exécution hôte n’est pas activée",
      "needExecuteBlocked": "Bloqué : l’exécution hôte est désactivée",
      "needRoot": "Privilèges root requis",
      "needExecuteRoot": "Nécessite YSK_EXECUTE=1 et root",
      "needExecuteYsk": "Nécessite YSK_EXECUTE=1",
      "writeOutsideDataDir": "Écriture bloquée : l’exécution hôte est désactivée et le chemin est hors du répertoire de données du panneau",
      "nginxReload": "Impossible de recharger Nginx : exécution hôte requise",
      "signal": "Impossible d’envoyer le signal : exécution hôte requise (YSK_EXECUTE)",
      "signalNote": "YSK_EXECUTE=1 est requis pour un kill réel",
      "renice": "Impossible de renice : exécution hôte requise (YSK_EXECUTE)",
      "install": "L’exécution hôte est désactivée ; l’installation ne peut pas se terminer depuis le panneau",
      "update": "L’exécution hôte est désactivée ; la mise à jour ne peut pas se terminer depuis le panneau",
      "panel": "Impossible de terminer ceci depuis le panneau de gestion"
    },
    "honesty": {
      "blockedNotOk": "Correction d’honnêteté : blocked ne peut pas être ok=true",
      "blockedNotApplied": "Correction d’honnêteté : blocked ne peut pas être apply_status=applied",
      "okFalseNotApplied": "Correction d’honnêteté : ok=false ne peut pas être apply_status=applied"
    },
    "status": {
      "applied": "Statut : appliqué",
      "failed": "Statut : échec",
      "written": "Statut : écrit",
      "blocked": "Statut : bloqué"
    },
    "notes": {
      "writtenSettings": "Paramètres enregistrés",
      "completed": "Terminé",
      "partialSuccess": "L’opération n’a réussi que partiellement",
      "notInstalled": "Non installé",
      "running": "En cours",
      "stopped": "Arrêté",
      "unknown": "Inconnu"
    }
  },
  "opsResult": {
    "title": "Résultat",
    "status": "Statut",
    "port": "Port",
    "url": "URL",
    "pid": "PID",
    "blocked": "Exécution impossible",
    "success": "Succès",
    "failed": "Échoué",
    "retry": "Réessayer",
    "showDetails": "Détails ({{count}})",
    "hideDetails": "Masquer les détails",
    "stepBuildOk": "Build terminé",
    "stepHealthOk": "Contrôle de santé réussi",
    "stepProcessStarted": "Processus démarré",
    "stepSystemdFallback": "Unité systemd pas prête — processus démarré via pidfile",
    "stepNginxWritten": "Configuration Nginx écrite",
    "stepConfigsSynced": "Configurations synchronisées vers le système",
    "stepStoppedOld": "Processus précédent arrêté",
    "stepTuningApplied": "Réglages d’exécution appliqués",
    "stepUnitWritten": "Unité de service écrite",
    "stepSystemdStartFailed": "Échec du démarrage systemd — bascule sur le processus de secours",
    "portListening": "Le port {{port}} écoute",
    "portNotListening": "Le port {{port}} n'écoute pas",
    "httpOk": "HTTP OK {{status}}",
    "httpFail": "Échec du HTTP : {{detail}}"
  },
  "pageGuide": {
    "missing": "Aucun contenu d’aide n’est encore disponible pour cette page.",
    "missingTitle": "Aucun guide",
    "eyebrow": "À propos",
    "canDoTitle": "Ce que vous pouvez faire",
    "workflowTitle": "Flux suggéré",
    "notesTitle": "Remarques",
    "cliTitle": "Référence rapide CLI",
    "cliFoot": "Pour toutes les options, exécutez ysk-server <command> --help ou consultez la doc.",
    "relatedTitle": "Liés"
  },
  "playbooks": {
    "discover-host": {
      "name": "Découverte hôte",
      "description": "Inventaire hôte en lecture seule"
    },
    "nginx-health": {
      "name": "Contrôle de santé Nginx",
      "description": "Vérifier l'état du service nginx"
    },
    "nginx-restart": {
      "name": "Redémarrage Nginx (risque élevé)",
      "description": "Redémarrer nginx après approbation"
    },
    "local-llm-ops-only": {
      "name": "Ops LLM local uniquement",
      "description": "Découverte d'urgence en mode protection"
    },
    "disk-pressure": {
      "name": "Contrôle de pression disque",
      "description": "Utilisation disque en lecture seule via df"
    },
    "mail-stack-status": {
      "name": "État de la pile messagerie",
      "description": "Vérifier les unités postfix + dovecot"
    },
    "security-units": {
      "name": "Unités de sécurité",
      "description": "État fail2ban + sshd (lecture seule)"
    },
    "web-stack-status": {
      "name": "État de la pile web",
      "description": "Sonde nginx + php-fpm"
    },
    "emergency-read-only": {
      "name": "Balayage d'urgence en lecture seule",
      "description": "Faits sûrs en mode protection uniquement"
    },
    "backup-health": {
      "name": "Préparation des sauvegardes",
      "description": "Vérifier le disque + lister les processus avant la fenêtre de sauvegarde"
    },
    "db-stack-status": {
      "name": "État de la pile base de données",
      "description": "Unités mysql/mariadb/redis/postgres"
    },
    "ssl-nginx-check": {
      "name": "Contrôle SSL + Nginx",
      "description": "État nginx avant opérations de certificats"
    }
  },
  "presetChips": {
    "customPlaceholder": "Personnalisé…"
  },
  "projects": {
    "title": "Projets",
    "subtitle": "",
    "create": "Créer un projet",
    "createHint": "Après création, ouvrir le détail pour déployer, publier et ajuster les ressources",
    "empty": "Aucun projet pour le moment",
    "emptyHint": "Créez votre premier projet, puis déployez et publiez Nginx",
    "emptyFilter": "Aucun projet correspondant",
    "emptyFilterHint": "Effacer la recherche ou modifier le filtre de runtime",
    "name": "Nom",
    "domain": "Domaine (facultatif)",
    "detail": "Détail du projet",
    "deploy": "Déployer",
    "deployPhp": "Déployer PHP",
    "stop": "Arrêter",
    "health": "Contrôle de santé",
    "publishNginx": "Publier Nginx",
    "publishNginxSsl": "Publier Nginx + SSL",
    "opsResult": "Résultat ops",
    "runtime": "Durée d'exécution",
    "template": "Modèle (optionnel)",
    "templateNone": "— aucun —",
    "searchPlaceholder": "Rechercher nom, domaine ou ID…",
    "listDesc": "Gérer les sites sur cet hôte.",
    "filterAll": "Tous les runtimes",
    "statTotal": "Total",
    "statRunning": "En cours",
    "statDegraded": "Dégradé",
    "statUnhealthy": "Dégradé",
    "statStopped": "Arrêté / prêt",
    "statStoppedOnly": "Arrêté",
    "statReadyOnly": "Prêt",
    "statPendingOs": "OS en attente",
    "status": {
      "failed": "Échoué",
      "failedHint": "Échec du déploiement ou du contrôle de santé — consulter les journaux",
      "unhealthy": "Dégradé",
      "unhealthyHint": "Processus actif mais contrôle de santé échoué",
      "pendingOs": "Utilisateur OS en attente",
      "pendingOsHint": "Utilisateur système non provisionné",
      "degraded": "En cours (dégradé)",
      "degradedHint": "Processus actif mais pas en mode production complet (p. ex. non-root / pidfile)",
      "deploying": "Déploiement en cours",
      "published": "Publié",
      "publishedHint": "Config Nginx écrite ; le processus peut être séparé",
      "running": "En cours",
      "stopped": "Arrêté",
      "ready": "Prêt",
      "readyHint": "Créé — déployer pour démarrer",
      "unknown": "Inconnu"
    },
    "checklist": {
      "title": "Chemin de lancement",
      "desc": "Suivez ces étapes pour servir le trafic",
      "created": "Créé",
      "os": "Utilisateur système",
      "deploy": "Déployer",
      "nginx": "Nginx",
      "health": "Santé"
    },
    "next": {
      "pendingOsTitle": "Utilisateur système non provisionné",
      "provisionOsAction": "Créer un utilisateur système",
      "pendingOsBody": "Ce projet n'a pas encore d'utilisateur système isolé.",
      "pendingOsActions": "Vous pouvez tout de même déployer ; l'isolation complète nécessite des privilèges d'administrateur sur l'hôte.",
      "deployTitle": "Suivant : Déployer",
      "deployBody": "Utilisez Déployer dans l'en-tête, ou l'onglet Déployer pour Git.",
      "nginxTitle": "Suivant : Publier Nginx",
      "nginxBody": "Ouvrez l'onglet Réseau pour publier Nginx (SSL optionnel)."
    },
    "healthDetail": {
      "none": "Pas encore de contrôle d'état",
      "overall": "Résultat",
      "nginxStatus": "État Nginx",
      "nginxReloaded": "Rechargement Nginx",
      "httpStatus": "HTTP",
      "latency": "Latence",
      "error": "Erreur",
      "at": "Vérifié le",
      "deployMode": "Mode de déploiement",
      "edgeKind": "Bord",
      "goLiveOk": "Mise en ligne",
      "goLiveAt": "Mise en ligne sur",
      "degraded": "Dégradé"
    },
    "railPhp": "PHP/site",
    "railStatic": "Site statique",
    "sectionPhpDeploy": "Déploiement PHP",
    "sectionPhpDeployDesc": "Écrire le site / pool PHP et appliquer lorsque autorisé",
    "sectionStaticDeploy": "Contenu statique",
    "sectionStaticDeployDesc": "Les sites statiques utilisent des fichiers + Nginx — pas de processus Node",
    "staticDeployHint": "Récupérez le contenu via Git, puis publiez Nginx sous Réseau.",
    "noDomain": "Pas de domaine",
    "lastDeploy": "Dernier déploiement",
    "neverDeployed": "Jamais déployé",
    "created": "Créé {{name}}",
    "backToList": "Retour aux projets",
    "openUrl": "Ouvrir l'URL",
    "openUrlNeedDomain": "Définissez d’abord un domaine – n’ouvrez pas 127.0.0.1 dans votre navigateur",
    "needOsUser": "Créez d'abord l'utilisateur système dans l'onglet Isolation.",
    "goIsolation": "Ouvrir l'onglet Isolation",
    "homeMissing": "Le répertoire personnel n'existe pas",
    "homeMissingHint": "Même sonde en direct que la migration de l'inventaire : créez l'utilisateur système en isolation",
    "stopTitle": "Arrêter ce projet (unité systemd et site public)",
    "deployTitle": "Déployer ce projet",
    "httpStatsHint": "À partir du journal d'accès de ce projet (dernier échantillon)",
    "httpStatsNone": "Aucun journal d'accès au projet pour l'instant",
    "notFound": "Projet introuvable",
    "home": "Répertoire personnel",
    "env": "Environnement",
    "backup": "Sauvegarde",
    "resources": "Ressources",
    "quotaUnlimited": "Pas de quota",
    "lastHealth": "Dernier état",
    "tabOverview": "Vue d'ensemble",
    "tabDeploy": "Déployer",
    "tabApp": "Application",
    "tabNetwork": "Réseau",
    "tabResources": "Ressources",
    "tabIsolation": "Isolement",
    "tabLogs": "Journaux",
    "tabAdvanced": "Avancé",
    "tabMore": "Plus",
    "createGoLive": "Déployer et publier Nginx après la création",
    "createPreferredPort": "Port fixe (optionnel)",
    "goLiveOk": "Déployé et publié",
    "goLivePartial": "Créé ; déploiement/publication incomplet",
    "nginxLive": "En direct",
    "nginxWritten": "Écrit",
    "nginxNeedsDeploy": "Déploiement requis",
    "nginxFailed": "Échec de la publication",
    "netEdgeStatus": "État Edge",
    "netUpstream": "En amont",
    "netPortTitle": "Port du processus",
    "netCurrentPort": "Port actuel",
    "netPublishTitle": "Publier",
    "netConfPreview": "Conf",
    "savePublishSsl": "Enregistrer et publier + SSL",
    "retryLiveTitle": "Mise en production incomplète",
    "retryLiveBody": "Le déploiement ou la publication Nginx n'a pas abouti. Réessayez ci-dessous.",
    "retryDeploy": "Réessayer le déploiement",
    "retryPublish": "Réessayer la publication Nginx",
    "preferredPortRedeployHint": "Enregistrez, puis redéployez pour que le processus utilise ce port",
    "railProcess": "Processus",
    "railNginx": "Nginx",
    "railOs": "Utilisateur système",
    "railHealth": "Santé",
    "nginxPublished": "Config publiée",
    "nginxNone": "Non publiée",
    "osProvisioned": "Utilisateur système provisionné",
    "osPending": "Isolation OS en attente",
    "healthOk": "Sain",
    "healthBad": "Échoué",
    "healthUnknown": "Non vérifié",
    "sectionRuntimeDeploy": "Déploiement runtime",
    "sectionRuntimeDeployDesc": "Démarrer le processus pour le runtime de ce projet (Node / PHP)",
    "sectionGit": "Déploiement Git",
    "sectionGitDesc": "Récupérer depuis Git et redéployer",
    "sectionEnv": "Variables d'environnement",
    "sectionEnvDesc": "Écrire les lignes KEY=value dans le .env du projet",
    "gitUrl": "URL Git",
    "gitDeploy": "Déploiement Git",
    "envFile": "Env (.env)",
    "saveEnv": "Enregistrer l'env",
    "sectionNginx": "Nginx et SSL",
    "sectionNginxDesc": "Écrire et appliquer la config du site",
    "domainHint": "Définir un domaine à la création pour une publication plus propre",
    "sectionQuota": "Quota disque",
    "sectionQuotaDesc": "Limiter la taille du répertoire home (MiB)",
    "sectionLimits": "CPU / mémoire",
    "sectionLimitsDesc": "limites systemd ; redéployer pour appliquer l'unité",
    "quotaMb": "Quota (Mio)",
    "memoryMax": "MémoireMax",
    "cpuQuota": "Quota CPU %",
    "setQuota": "Définir le quota",
    "setResources": "Enregistrer les limites de ressources",
    "sectionLogs": "Journaux d'application",
    "sectionLogsDesc": "Afficher la fin des fichiers journaux récents sous le home du projet",
    "viewLogs": "Charger les journaux",
    "logsEmpty": "Aucun journal chargé pour l'instant",
    "logsNoFiles": "(aucun fichier journal pour l'instant — déployez d'abord)",
    "sectionAdvanced": "Autres actions",
    "sectionAdvancedDesc": "Sauvegardes et contenu du modèle",
    "downloadWp": "Télécharger WordPress",
    "dangerZone": "Zone de danger",
    "dangerZoneDesc": "La suppression retire les enregistrements du projet et les ressources associées",
    "delete": "Supprimer le projet",
    "confirmStopTitle": "Arrêter ce projet ?",
    "confirmStopDesc": "Cela arrêtera le processus en cours pour « {{name}} ».",
    "confirmDeleteTitle": "Supprimer ce projet ?",
    "confirmDeleteDesc": "Supprimer « {{name}} » ? Cette action est irréversible depuis l'interface.",
    "close": "Fermer",
    "statProjects": "{{count}} projets",
    "noProjectsShort": "Aucun projet pour le moment",
    "runtimeStatic": "Statique",
    "logsLoadFailed": "Échec du chargement des journaux",
    "deleteFailed": "Échec de la suppression",
    "tabAbout": "À propos",
    "statusLabel": "Statut",
    "userLabel": "Utilisateur",
    "nginxValuePublished": "Publié",
    "nginxValueNone": "Non publiée",
    "osValueReady": "Prêt",
    "osValuePending": "En attente",
    "openFiles": "Fichiers",
    "enableCdn": "Activer le CDN",
    "openLogs": "Journaux",
    "osUserReadyMsg": "Utilisateur système prêt. {{detail}}",
    "osUserNeedRoot": "Impossible de créer l'utilisateur système : nécessite YSK_EXECUTE + root. {{detail}}",
    "osUserIncomplete": "Provisionnement de l'utilisateur système incomplet",
    "saveLogDirsFailed": "Échec de l'enregistrement des répertoires de journaux",
    "createName": "Nom du projet",
    "noPathSepHint": "Le nom ne peut pas contenir / ou \\.",
    "createRuntime": "Durée d'exécution",
    "createRuntimeHint": "Vous pourrez modifier les options de déploiement plus tard dans le détail",
    "createVersion": "Version",
    "createVersionHint": "Stocké en tant que runtime_version ; utilisé par le déploiement / FPM",
    "createVersionAria": "Version du runtime",
    "createPrimaryDomain": "Domaine principal",
    "createPrimaryDomainHint": "Facultatif pour l’instant",
    "createAliases": "Alias",
    "createAliasesHint": "Séparés par des virgules ou des sauts de ligne",
    "createTemplate": "Modèle",
    "createTemplateHint": "Une démo Hello World! par runtime ; choisir un modèle définit ce runtime",
    "createTemplateNote": "Les modèles n’écrivent qu’une ossature ; déployez pour compiler/démarrer.",
    "createRuntimeNow": "Runtime actuel : ",
    "createTemplateFooter": ". Modèle facultatif pour démarrer plus vite, ou laisser vide.",
    "createDraftResources": "Créer aussi des ressources brouillon avec le domaine",
    "createNeedDomainFirst": "Saisissez d’abord le domaine principal pour que les options brouillon s’appliquent ensemble.",
    "createDnsZone": "Créer aussi la zone DNS",
    "createDnsZoneDesc": "Écrit uniquement un brouillon de gestion — pas de DNS autoritatif en production",
    "createMailDomain": "Enregistrer aussi le domaine mail",
    "createMailDomainDesc": "Finalisez les boîtes mail et appliquez plus tard sur la page mail",
    "createServerIpv4": "IPv4 du serveur",
    "createServerIpv4Hint": "Pour les modèles DNS / mail",
    "createServerIpv4Ph": "IPv4 public de cet hôte",
    "createServerIpv6": "IPv6 du serveur (facultatif)",
    "createServerIpv6Ph": "IPv6 public (facultatif)",
    "sshCardDesc": "Les clés de connexion déterminent qui peut entrer ;",
    "sshLoginKeys": "Clés publiques de connexion autorisées",
    "sshKeyCount": "{{count}} clé(s)",
    "sshOutbound": "Identité sortante",
    "sshOutboundNone": "Non créée",
    "sshOutboundCreated": "Identité sortante créée (clé privée chiffrée)",
    "sshCreateFailed": "Échec de la création",
    "sshWriteTried": "Tentative d’écriture sur le disque",
    "sshOutboundHint": "Après création, cet utilisateur projet peut utiliser git/scripts en sortant.",
    "sshCreateOutbound": "Créer l’identité sortante",
    "sshWriteHome": "Écrire home/.ssh",
    "sshOpenWorkspace": "Ouvrir l’espace de travail SSH",
    "sshManageLoginKeys": "Gérer les clés de connexion",
    "logsSectionDesc": "Parcourir logs/, log/ et les répertoires supplémentaires ; rechercher par nom ou mot-clé de contenu",
    "logsNameSearch": "Recherche par nom de fichier",
    "logsNameSearchHint": "Correspondance sur le chemin relatif, ex. error, app.out",
    "logsContentKw": "Mot-clé de contenu",
    "logsContentKwHint": "Rechercher dans les fins de fichiers (pas le fichier entier)",
    "logsSearch": "Rechercher",
    "logsRescan": "Rescanner",
    "logsRefreshFile": "Actualiser ce fichier",
    "logsCopy": "Copier le contenu",
    "logsDownloadTail": "Télécharger la fin",
    "logsCenter": "Centre de journaux",
    "logsHitsTitle": "{{count}} fichier(s) avec occurrences — cliquer pour ouvrir la fin (avec filtre par mot-clé)",
    "logsLinesHit": "{{count}} ligne(s) trouvée(s)",
    "logsFileCount": "Fichiers journaux {{count}}",
    "logsNameFilter": "(le nom contient « {{q}} »)",
    "logsScanning": "Analyse des journaux…",
    "logsNoneYet": "Aucun fichier journal pour l’instant — apparaissent après déploiement/exécution ; les répertoires supplémentaires fonctionnent aussi.",
    "logsNoContent": "Aucun contenu pour l’instant",
    "logsRelated": "Sources associées",
    "logsRelatedDesc": "journal / nginx / PHP-FPM (voir le centre de journaux)",
    "logsAvailable": "Disponible",
    "logsMissing": "Manquant",
    "logsOpenInCenter": "Ouvrir dans le centre de journaux",
    "logsExtraDirs": "Répertoires de journaux supplémentaires",
    "logsExtraDirsDesc": "Chemins relatifs au home du projet (en plus de logs/ et log/)",
    "logsDirList": "Liste des répertoires",
    "logsDirListHint": "Un par ligne ; chemins relatifs au home uniquement",
    "logsReset": "Réinitialiser",
    "logsSaveScan": "Enregistrer et analyser",
    "logsDefaultNote": "Analyse toujours logs/ et log/. Les répertoires supplémentaires n’incluent que *.log / *.out / *.err.",
    "resOsTitle": "Isolation des utilisateurs système",
    "resOsDesc": "Chaque projet a son propre utilisateur Linux ;",
    "resLinuxUser": "Utilisateur Linux",
    "resOsIsolation": "Isolation OS",
    "resOsReady": "Prêt",
    "resOsNotCreated": "Non créé (admin requis)",
    "resHomeDir": "Répertoire personnel",
    "resCanonical": "Chemin prévu",
    "resUserMissing": "Utilisateur manquant",
    "resShellLive": "Shell actif / verrouillage",
    "resLocked": "Verrouillé",
    "resUnlocked": "Déverrouillé",
    "resHomeMode": "mode home",
    "resHomeExists": "Existe · mode {{mode}}",
    "resHomeMissing": "Manquant",
    "resIsolationOn": "Isolé",
    "resIsolationPending": "Isolation en attente",
    "resOsHint": "Les processus s'exécutent sous l'utilisateur du projet",
    "resProvisionUser": "Créer / réparer l'utilisateur système",
    "resRefreshStatus": "Actualiser l'état",
    "resFixHome": "Corriger la propriété du home",
    "resMigrateHome": "Migrer vers /home/ysk-server-…",
    "resQuotaDesc": "Quota soft (du avant déploiement) + application hard si setquota existe",
    "resQuotaHint": "ex. 1024 = 1 Gio",
    "resSetSoftQuota": "Enregistrer le quota soft",
    "resLimitsTitle": "Limites de processus et de compte",
    "resLimitsDesc": "systemd MemoryMax / CPUQuota / TasksMax / NOFILE + shell / verrouillage",
    "resLimitsDescSystemd": "cgroup systemd : MemoryMax / CPUQuota / TasksMax / NOFILE + shell / verrouillage",
    "resLimitsDescPm2": "PM2 : la mémoire correspond à max_memory_restart ; les autres limites utilisent systemd.",
    "resRunnerSystemd": "Gestionnaire de processus : systemd",
    "resRunnerPm2": "Gestionnaire de processus : PM2",
    "resMemMax": "Mémoire max",
    "resMemHint": "ex. 512M ou 1G",
    "resMemHintSystemd": "systemd MemoryMax (plafond dur cgroup, ex. 512M ou 1G)",
    "resMemHintPm2": "Écrit max_memory_restart dans l'ecosystem (seuil de redémarrage, pas un kill cgroup) ;",
    "resFieldSystemdOnly": "cgroup systemd uniquement ; tout de même enregistré en base pour un retour à systemd",
    "resCpuHint": "100 = un CPU",
    "resCustomPct": "% personnalisé",
    "resTasksHint": "Tâches max",
    "resNofileHint": "Limite de fichiers ouverts",
    "resShellHint": "nologin par défaut",
    "resShellBashRisk": "bash · risque",
    "resLockAccount": "Verrouiller le compte Linux",
    "resLockDesc": "usermod -L ; décocher pour déverrouiller",
    "resLimitsHint": "Enregistrer et appliquer écrit la base et tente usermod / setquota / systemctl set-property",
    "resLimitsHintSystemd": "Enregistrer et appliquer écrit l'état du panneau et les limites OS/systemd si autorisé.",
    "resLimitsHintPm2": "Enregistrer et appliquer écrit l'état du panneau et la limite mémoire PM2.",
    "resSaveApply": "Enregistrer et appliquer les limites à l'OS",
    "resSaveControlOnly": "Enregistrer Mem/CPU uniquement sur le plan de contrôle",
    "resReapply": "Réappliquer une fois (sans modification du formulaire)",
    "resMigrateDone": "Migration terminée",
    "resMigrateIncomplete": "Migration incomplète",
    "resMigrateTitle": "Migrer le home de l'utilisateur système ?",
    "resMigrateDesc": "Migre vers /home/ysk-server-{id} et crée/répare l'utilisateur système",
    "resMigrate": "Migrer",
    "resWrittenOnly": "Écrit dans le plan de contrôle ; OS non appliqué (nécessite root). {{notes}}",
    "resAppliedOs": "Limites appliquées à l'OS. {{notes}}",
    "resSaved": "Enregistré",
    "resIncomplete": "Incomplet",
    "resApplyLimitsFailed": "Échec de l'application des limites",
    "resApplied": "Appliqué",
    "resApplyFailed": "Échec de l’application",
    "resChownOk": "chown terminé",
    "resChownFailed": "chown échoué",
    "netSavedPublished": "Réseau enregistré et Nginx publié",
    "netSavedOnly": "Paramètres réseau enregistrés (non publiés)",
    "netSaveFailed": "Échec de l'enregistrement",
    "netSuspended": "Projet suspendu — les visiteurs reçoivent une 503. Réactivez puis publiez.",
    "netDomainTitle": "Domaine",
    "netDomainDesc": "Domaine principal et alias ; l'enregistrement peut aussi écrire la config de gestion Nginx",
    "netPrimaryDomain": "Domaine principal",
    "netPrimaryHint": "Domaine visiteur, ex. app.example.com",
    "netAliases": "Alias",
    "netAliasesHint": "Un par ligne, ex. www ou sous-domaine blog",
    "netNeedPrimary": "Saisissez d'abord le domaine principal",
    "netHttpsTitle": "HTTPS et redirection du site",
    "netHttpsDesc": "Publier Nginx après l'enregistrement. Une 301 sur tout le site prime sur le contenu proxy/PHP/statique",
    "netForceHttps": "Forcer HTTPS",
    "netForceHttpsDesc": "HTTP → HTTPS (301) ; nécessite un certificat SSL et la publication SSL",
    "netForceHttpsOn": "HTTP sera redirigé vers HTTPS après la publication du Edge.",
    "netForceHttpsOff": "Aucune redirection forcée n'est stockée.",
    "netBoundCert": "Certificat lié",
    "netBoundCertExpiry": "expire {{at}}",
    "netNoBoundCert": "Aucun certificat sur disque pour ce nom d’hôte",
    "netForceHttpsNeedCert": "Émettez un certificat sur /ssl pour ce domaine avant de forcer HTTPS.",
    "netHttpsLiveNotForced": "Un fichier Edge existe ; HTTPS peut déjà fonctionner. Cette case force uniquement HTTP → HTTPS.",
    "netHsts": "Activer HSTS",
    "netHstsDesc": "Les navigateurs restent en HTTPS (recommandé après forcer HTTPS)",
    "netHstsNeedHttps": "Activez d'abord le HTTPS forcé",
    "netRedirectUrl": "URL de redirection du site entier",
    "netRedirectHint": "Facultatif. 301 du site entier vers cette URL (déplacer / apex→www)",
    "netBasicAuthTitle": "Authentification HTTP basique (connexion navigateur)",
    "netBasicAuthDesc": "Écrit htpasswd à la publication ; nom d'utilisateur vide = désactivé. Mot de passe vide = conserver l'existant",
    "netAuthUserHint": "Vide désactive l'auth",
    "netAuthPassHint": "Requis la première fois ; laisser vide ensuite pour conserver",
    "netAuthPassSet": "Définir ou mettre à jour le mot de passe",
    "netCacheNote": "Cache-Control 7d par défaut pour le statique/PHP statique ; la purge vide le répertoire cache nginx de l'hôte (nécessite YSK_EXECUTE)",
    "netPurgeOk": "Purge du cache tentée",
    "netPurgeFailed": "échec de la purge",
    "netDocrootTitle": "Répertoire du site (docroot)",
    "netDocrootDesc": "Relatif au home du projet ; utilisé comme root Nginx à la publication (défaut app/public)",
    "netDocrootLabel": "Racine des documents",
    "netDocrootFull": "Chemin complet : {{path}}",
    "netDocrootCustom": "Chemin relatif personnalisé…",
    "netAdvancedTitle": "Avancé et publication",
    "netAdvancedDesc": "IP de liaison, publier vers le Nginx système",
    "netCollapseBind": "Réduire l'IP de liaison",
    "netExpandBind": "Développer l'IP de liaison",
    "netBindIp": "IP de liaison",
    "netBindHint": "Vide = toutes les interfaces",
    "netBindPh": "Vide = toutes ; ou IP de liaison",
    "netNeedDomainSave": "Saisissez et enregistrez d'abord le domaine principal",
    "ovUsed": "Utilisé",
    "ovQuota": "Quota",
    "ovQuotaUnset": "Non défini",
    "ovQuotaStatus": "État du quota",
    "ovOverQuota": "Dépassement de quota",
    "ovQuotaOk": "OK",
    "ovDocroot": "Racine des documents",
    "ovAccessSample": "Échantillon d'accès",
    "ovLines": "{{count}} lignes",
    "ovDailyDays": "Jours de stats quotidiennes",
    "ovDailyTitle": "Stats de visites quotidiennes (max. 60 jours)",
    "ovDailyDesc": "Glissant à partir d'échantillons du journal d'accès",
    "ovQuickTitle": "Raccourcis du site",
    "ovQuickDesc": "Publier et sauvegarder (déploiement principal via l'en-tête ou l'onglet Deploy)",
    "ovNeedNetworkDomain": "Définir d’abord le domaine dans l’onglet Réseau",
    "ovPublishNginx": "Publier Nginx",
    "ovPublishSsl": "Publier Nginx + SSL",
    "ovBackupProject": "Sauvegarder ce projet",
    "ovOpenFiles": "Ouvrir les fichiers du projet",
    "ovNoDomainHint": "Aucun domaine — définissez-le dans l’onglet Réseau avant la publication.",
    "ovPublishNote": "La publication écrit la configuration de gestion ; le rechargement Nginx en direct nécessite des droits de modification système.",
    "ovStatic": "Statique",
    "ovAliases": "Alias",
    "ovForceOn": "Forcé",
    "ovForceOff": "Non forcé",
    "advFtpCreated": "FTP {{user}} créé (brouillon — appliquer sur la page FTPS)",
    "advCreateFailed": "Échec de la création",
    "advFtpFailed": "Échec de la création FTP",
    "advMaintTitle": "Entretien",
    "advMaintDesc": "Sauvegarde, suspension/reprise, outils optionnels",
    "advBackupProject": "Sauvegarder ce projet",
    "advOneClickWp": "WordPress en un clic (téléchargement + configuration)",
    "advSuspendedHint": "Suspendu : processus arrêté, les visiteurs reçoivent un 503.",
    "advSuspendHint": "La suspension arrête le processus et affiche une page de maintenance 503.",
    "advFtpTitle": "FTP du projet (jail de chemin)",
    "advFtpDesc": "Compte confiné au répertoire app du projet ; appliquer sur la page du service FTPS après création",
    "advFtpUserHint": "Optionnel ; le système peut générer",
    "advFtpPassHint": "Au moins 8 caractères",
    "advDangerTitle": "Zone de danger",
    "advDangerDesc": "La suppression est irréversible depuis l’interface — sauvegardez d’abord.",
    "advDelete": "Supprimer le projet",
    "deployPyHint": "Par défaut : venv + pip ; ASGI via uvicorn, Django via gunicorn.",
    "deployGoHint": "Par défaut : go build -o app . puis ./app ; ignorer la compilation si le binaire existe.",
    "deployRustHint": "Par défaut : cargo build --release puis target/release/{crate} ; compilation optionnelle à ignorer.",
    "deployNodeHint": "Démarrer le processus Node (entrée par défaut server.js) ; systemd recommandé en prod.",
    "deployDefaultHint": "Démarrage selon le runtime ; externe uniquement après application.",
    "deployOsStep": "Utilisateur Linux isolé + /home/ysk-server-{project id} (l’onglet Ressources peut créer)",
    "deployPyReady": "Runtime Python prêt",
    "deployPipNet": "requirements.txt nécessite un accès pip sortant",
    "deployCheckPort": "Après le déploiement, vérifier le port et /health",
    "deployPublishProxy": "Publier le reverse proxy Nginx",
    "deployToolchainReady": "Chaîne d’outils {{runtime}} prête",
    "deployFirstBuild": "Le premier déploiement compile (peut prendre un moment)",
    "deployNeedBinary": "Binaire uniquement après une compilation réussie",
    "deployPhpFpmOk": "Version PHP-FPM OK",
    "deployPhpPool": "Déployer PHP / appliquer le pool",
    "deployNginxSsl": "Publier Nginx + SSL optionnel",
    "deployPublicContent": "Confirmer que public/ contient du contenu",
    "deployNetPublish": "Publier Nginx dans l’onglet Réseau",
    "deployConfirmToolchain": "Confirmer que la page Runtime a installé la chaîne d’outils (ou qu’elle est présente sur l’hôte)",
    "deployConfirmCode": "Confirmer que app/ contient du code (modèle ou Git)",
    "deployPressDeploy": "Appuyer sur Déployer ; puis publier Nginx dans Réseau",
    "deployVersionSaved": "Version {{runtime}} {{version}} enregistrée (utilisée au déploiement)",
    "deployVersionSaveFailed": "Échec de l’enregistrement de la version du runtime",
    "deployInstallingToolchain": "Installation / confirmation de la chaîne d’outils…",
    "deployToolchainIncomplete": "Installation de la chaîne d’outils incomplète (permission ou réseau) ; essayez la page Runtime",
    "deployToolchainDone": "Étape chaîne d’outils terminée, démarrage du déploiement…",
    "deployToolchainFailed": "Échec de l’installation de la chaîne d’outils",
    "deployChecklistTitle": "Créé — checklist de déploiement",
    "deployChecklistDesc": "Squelette {{runtime}} prêt ; terminer les étapes pour servir le trafic",
    "deploySectionTitle": "Déploiement {{runtime}}",
    "deploySectionDesc": "Démarrer le processus {{runtime}} (port / systemd ou pidfile)",
    "deployPhpVersion": "Version PHP",
    "deployPhpVersionHint": "Version PHP pour ce site (le FPM correspondant doit être installé)",
    "deployRuntimeVersion": "Version {{runtime}}",
    "deployRuntimeVersionHint": "Enregistré sur le projet ; utilisé au déploiement. Installer sur la page Runtime",
    "deployRuntimeVersionCreateHint": "Écrit à la création ; référencé au déploiement",
    "deployRuntimeVersionGeneric": "Version du runtime",
    "deployEntry": "Entrée de démarrage",
    "deployEntryHint": "Vide = défaut ({{hint}}) ; synchronisé vers le serveur",
    "deploySkipBuild": "Ignorer le build",
    "deploySkipBuildHint": "Si le venv/binaire existe ; accélère le redémarrage (préférence locale)",
    "deployPort": "· port {{port}}",
    "deployFpmApplied": "Pool PHP-FPM appliqué",
    "deployFpmIncomplete": "FPM incomplet",
    "deployFpmNote": "Écrit la config site/pool ; le rechargement à chaud nécessite les droits de modification système.",
    "deployBuildNote": "Les échecs de build/démarrage s'affichent dans le résultat ops. L'entrée est écrite sur le serveur ; skip-build est une préférence locale.",
    "deployPhpIniTitle": "Surcharges php.ini du projet",
    "deployPhpIniDesc": "Uniquement les clés à modifier ;",
    "deployPhpIniExample": "ex. 256M ; vide = global",
    "deployGlobal": "Mondial",
    "deployCustom": "Personnalisé",
    "deployOff": "Désactivé",
    "deployOnCareful": "Activé · attention",
    "deployPhpIniSaved": "Surcharges php.ini du projet enregistrées ; redéployer ou réappliquer le FPM",
    "deployHistory": "Historique des déploiements ({{count}})",
    "deployHistoryDesc": "Depuis l'audit ; plus récent en premier",
    "deployGitUrlHint": "URL de dépôt HTTPS ou SSH ; synchroniser puis redéployer selon le runtime",
    "deployEnvHint": "Une KEY=value par ligne ; commentaires #",
    "resume": "Reprendre le projet",
    "suspend": "Suspendre le projet",
    "goFtpsApply": "Aller appliquer sur le service FTPS",
    "toolchainNote": "Installer la toolchain ≠ projet en ligne ; déploiement réussi ≠ Nginx public (publier sur Réseau).",
    "installToolchainDeploy": "Installer la toolchain et déployer",
    "deployOnly": "Déployer uniquement",
    "openRuntime": "Ouvrir le runtime {{runtime}}",
    "later": "Plus tard",
    "installToolchainDeployShort": "Toolchain + déploiement",
    "runtimeEnv": "Env {{runtime}}",
    "applyFpmPool": "Appliquer le pool FPM",
    "staticNginxHint": "Les sites statiques dépendent de Publier Nginx — utiliser les raccourcis Réseau ou Vue d'ensemble.",
    "fullIniLink": "Catalogue complet et opcache/session etc. sur",
    "phpIniLink": "Runtime PHP → php.ini",
    "savePhpIniOverride": "Enregistrer les surcharges php.ini",
    "scaffoldNote": "Si app/ est un scaffold YSK (.ysk-scaffold), il est effacé avant le clone ; le contenu personnalisé refuse l'écrasement.",
    "saveOnly": "Enregistrer uniquement",
    "savePublishNginx": "Enregistrer et publier Nginx",
    "needDomainToPublish": "Saisir le domaine principal avant de publier.",
    "savePublish": "Enregistrer et publier",
    "saveAuth": "Enregistrer l'auth",
    "cacheZoneNote": "Les zones FastCGI/proxy_cache complètes nécessitent keys_zone dans le nginx.conf hôte ; le panneau propose une purge au mieux.",
    "purgeNginxCache": "Purger le cache Nginx",
    "nginxManageFile": "Fichier de gestion Nginx : ",
    "publishRuntimeNote": "La publication écrit la conf proxy/PHP-FPM/statique selon le runtime (auth, redirections, docroot)",
    "publishStored": "Publier avec les paramètres enregistrés",
    "publishStoredSsl": "Publier enregistré + SSL",
    "publishNote": "La publication écrit la conf de gestion ; la sync vers /etc/nginx et le reload nécessitent les droits de modification système.",
    "hitsFiles": "{{count}} fichier(s) avec occurrences — cliquer pour ouvrir le tail (filtre par mot-clé)",
    "logFilesCount": "Fichiers journaux {{count}}",
    "defaultScanNote": "Analyse toujours logs/ et log/. Les répertoires supplémentaires n’incluent que *.log / *.out / *.err.",
    "opsOk": "{{label}} terminé{{url}}",
    "opsOkWithNote": "{{label}} terminé : {{note}}{{url}}",
    "opsFail": "{{label}} échoué : {{reason}}",
    "railPython": "Processus Python",
    "railGo": "Processus Go",
    "railRust": "Processus Rust",
    "railNode": "Processus Node",
    "runtimeName": {
      "php": "PHP",
      "node": "Noeud.js",
      "static": "Statique",
      "python": "Python",
      "go": "Aller",
      "rust": "Rouiller",
      "java": "Java",
      "kotlin": "Kotlin",
      "bun": "Chignon"
    },
    "netCacheTitle": "Cache",
    "logsDeepAccess": "Centre de logs · accès",
    "logsDeepError": "Centre de logs · erreur",
    "logsDeepNginxUnit": "Journaux de l’unité Nginx",
    "logsPresetAccess": "Filtrer access.log",
    "logsPresetError": "Filtrer error.log",
    "railJava": "Processus Java",
    "railKotlin": "Processus Kotlin",
    "railBun": "Processus Bun",
    "deployProcessManager": "Gestionnaire de processus",
    "deployProcessManagerSystemd": "systemd (recommandé)",
    "deployProcessManagerPm2": "PM2",
    "proc_restart": "Redémarrer",
    "proc_stop": "Arrêter",
    "proc_reload": "Recharger",
    "procControlsHint": "Contrôles du processus ({{manager}})",
    "procActionOk": "{{action}} ok · {{notes}}",
    "procActionFail": "{{action}} échoué · {{notes}}",
    "procActionFailShort": "Action sur le processus échouée",
    "procMissingUser": "Le projet n’a pas d’utilisateur Linux — impossible de cibler l’app PM2",
    "deploySystemdHint": "Par défaut en production : unité ysk-project-*",
    "deployPm2Hint": "Démarre via pm2 (ecosystem",
    "deleteDialogTitle": "Supprimer définitivement le projet",
    "deletePermanent": "Supprimer définitivement",
    "deleteRemoveFiles": "Supprimer le répertoire home disque et l’utilisateur Linux",
    "deleteTypeName": "Saisissez le nom du projet pour confirmer",
    "deletedOk": "Projet supprimé",
    "sslRequiredFirst": "Aucun certificat SSL pour ce domaine pour l’instant. Créez ou importez-en un sous Certificats SSL avant Publier + SSL.",
    "sslGateHint": "Actions SSL verrouillées — allez à",
    "sslGateHint2": "pour émettre/importer un certificat pour ce domaine d’abord.",
    "netPublishPrimary": "Basique",
    "netPublishSsl": "HTTPS/SSL",
    "netPublishMaint": "Entretien",
    "sslNeedDomain": "Définissez un domaine avant de publier Nginx / SSL.",
    "createTemplateMissing": "{{v0}} ；「— —」。",
    "deleteDialogDesc": "「{{name}}」。。",
    "deleteWillStop": "systèmed / PM2 /",
    "deleteWillWeb": "Configuration Nginx、Pool PHP-FPM、Apache vhost（）",
    "deleteWillOs": "LinuxMaison（）",
    "deleteKeepOs": "AccueilLinux（）",
    "deleteWillDb": "…",
    "deleteRemoveFilesDesc": "Annuler，",
    "deleteTypeNameHint": "「{{name}}」",
    "deleteDnsWarn": "Zone DNS / domaine 。",
    "manageInNginx": "Gérer dans Nginx",
    "advFtpHomeApp": "Répertoire app du site",
    "advFtpHomeRoot": "Répertoire racine du projet",
    "advFtpManage": "Ouvrir la page FTP",
    "resShell": "Coquille de connexion",
    "resSaveHint": "Enregistrez et appliquez les modifications au système d'exploitation en direct. Le plan de contrôle stocke uniquement le formulaire. Réappliquer utilise les dernières valeurs enregistrées.",
    "resBashConfirmTitle": "Autoriser les bash interactifs ?",
    "resBashConfirmDesc": "Cela accorde un shell de connexion interactif à l’utilisateur du projet. Confirmez uniquement si vous avez besoin de SSH ou PTY en tant qu'utilisateur.",
    "createGitHint": "Facultatif. Stocké sur le projet ; cloner à partir de l'onglet Déployer (ne clone pas lors de la création).",
    "gitTokenLaterHint": "Le jeton HTTPS et la profondeur de clonage sont définis dans l'onglet Déploiement du projet après la création.",
    "gitBranch": "Bifurquer",
    "gitBranchHint": "Branch or tag. Empty uses the remote default. First clone is shallow (depth 1).",
    "gitBranchAfterUrl": "Saisissez d’abord l’URL Git. Vide = branche par défaut du distant.",
    "gitLastRef": "Dernière synchronisation : {{branch}} @ {{commit}}",
    "gitConfirmTitle": "Cloner dans ce projet ?",
    "gitConfirmBody": "Si app/ est toujours l'espace réservé Hello World, il sera effacé, puis cloné. Les fichiers personnalisés qui ne sont pas un échafaudage YSK sont refusés.",
    "gitConfirmRemoteBody": "Cela pointe l'origine vers la nouvelle URL et extrait. Des histoires sans rapport échouent ; les fichiers personnalisés ne sont pas effacés.",
    "runtimeActual": "Binaire réel {{path}}",
    "runtimeFallback": "L'option {{version}} choisie n'est pas sur cet hôte. Le processus utilise {{path}}.",
    "gitSync": "Synchroniser",
    "gitFetch": "Aller chercher",
    "gitCheckout": "Vérifier",
    "gitReset": "Réinitialiser à distance",
    "gitResetNeedConfirm": "Confirmation requise — abandonne les commits locaux",
    "gitDeepen": "Récupérer l'historique complet",
    "gitLogTitle": "Commis récents",
    "gitDirtyTitle": "Les modifications locales bloquent l'extraction",
    "gitDirtyBody": "{{count}} le(s) fichier(s) diffèrent de Git (modifications de fichiers ou application). Jetez-les ou abandonnez.",
    "gitSyncBlockedDirty": "La synchronisation est désactivée jusqu'à ce que les modifications locales soient ignorées (réinitialisation) ou que les fichiers correspondent à Git.",
    "gitViewDiff": "Voir la différence",
    "gitDiscard": "Supprimer les fichiers locaux",
    "gitOpenFiles": "Ouvrir dans les fichiers",
    "gitNotCloned": "Non cloné",
    "gitClean": "Faire le ménage",
    "gitDirty": "Sale",
    "gitBehind": "Derrière {{count}}",
    "gitAhead": "En avant {{count}}",
    "gitDetached": "Épinglé",
    "gitShallow": "Peu profond",
    "gitMissing": "git manquant",
    "gitResetConfirmTitle": "Réinitialisation difficile à distance ?",
    "gitResetConfirmBody": "Cela supprime l'historique Git local et les fichiers non suivis, à l'exception de .env, puis restaure .env à partir du plan de contrôle.",
    "gitHeads": "Succursales distantes",
    "gitToken": "Jeton HTTPS",
    "gitTokenHint": "Personal access token. Stored encrypted; never written into the remote URL.",
    "gitTokenPlaceholder": "ghp_… ou glpat-…",
    "gitTokenSet": "Ensemble de jetons",
    "gitSaveToken": "Enregistrer le jeton",
    "gitClearToken": "Effacer le jeton",
    "gitDeployKey": "Déployer la clé publique",
    "gitDeployKeyHint": "Ajoutez-le en tant que clé de déploiement en lecture seule sur l'hôte Git.",
    "gitDeployKeyOn": "Clé de déploiement",
    "gitMakeKey": "Créer une clé de déploiement",
    "gitCopyPub": "Copier la clé publique",
    "gitClearKey": "Effacer la clé de déploiement",
    "gitKeyCopied": "Clé publique copiée",
    "gitPinHost": "Épingler la clé de l'hôte",
    "gitPinHostBody": "{{host}} n'est pas épinglé. Confirmez les empreintes digitales, puis épinglez avant le clonage SSH.",
    "gitHostUnpinned": "Clé d'hôte non épinglée",
    "gitHookTitle": "Inbound hook",
    "gitHookHint": "Paste POST /api/v1/hooks/git/<id> into GitHub / Gitea / GitLab yourself (push events). Not Slack. Secret is HMAC or X-YSK-Git-Hook.",
    "gitHookOn": "Hook on",
    "gitHookOff": "Hook off",
    "gitHookEnable": "Enable hook",
    "gitHookRotate": "Rotation secrète",
    "gitHookDisable": "Disable hook",
    "gitHookSecretOnce": "Copy this secret now — it is not stored in the page after you leave.",
    "gitHookCopyUrl": "Copy URL",
    "gitHookCopySecret": "Copier le secret",
    "gitHookCopied": "Copié",
    "gitHookSetup": "Add the webhook yourself. Payload URL = the URL above. Content type application/json. Events: push only. Secret = the one-time value.",
    "gitHookGithub": "GitHub: Settings → Webhooks → Add webhook. Content type application/json. Events: Just the push event. GitHub.com requires HTTPS.",
    "gitHookGitea": "Gitea: Settings → Webhooks → Add Webhook → Gitea. HTTP Method POST. Push events.",
    "gitHookGitlab": "GitLab: Settings → Webhooks. Trigger: Push events. Secret token = the hook secret (sent as X-Gitlab-Token).",
    "gitHookHonesty": "The host unit must have YSK_EXECUTE=1. Without it the hook answers but does not clone or deploy.",
    "gitHookSkipOther": "Pushes to other branches are ignored. Only the project ref syncs.",
    "gitAuthHttps": "Jeton HTTPS",
    "gitAuthSsh": "Clé de déploiement SSH",
    "gitLoadRefs": "Charger les branches",
    "gitRefDefault": "Valeur par défaut à distance",
    "gitRefBranches": "Succursales",
    "gitRefTags": "Balises",
    "gitRefOther": "Autre réf…",
    "gitRefCustom": "Commit ou ref",
    "gitRefsNeedUrl": "Entrez d'abord une URL.",
    "gitRefsNeedAuth": "Enregistrez un jeton ou déployez une clé, puis chargez des branches.",
    "gitRefsHint": "Chargé depuis la télécommande. Choisissez-en un – ne tapez pas.",
    "gitHookSetupToggle": "Comment coller ça",
    "gitHookOneLiner": "HMAC ou X-YSK-Git-Hook. Seule la réf. de ce projet.",
    "gitHookExecuteHint": "Nécessite YSK_EXECUTE=1 pour cloner ou déployer.",
    "gitShowKey": "Afficher la clé",
    "gitHideKey": "Cacher",
    "gitBehindShort": "↓{{count}}",
    "gitAheadShort": "↑{{count}}",
    "gitDirtyShort": "Sale · {{count}}",
    "gitFilesLink": "Fichiers",
    "nameInvalid": "Utilisez un nom en minuscules : commencez par une lettre, puis des lettres, des chiffres ou un trait d'union (max 31).",
    "deployVersionMissing": "Le nœud {{version}} n'est pas installé sur cet hôte. Choisissez une version installée ou installez d'abord cette version.",
    "deployUsedBinary": "Déploiement utilisé {{path}}"
  },
  "protection": {
    "levels": {
      "low": {
        "label": "OK",
        "verb": "Système stable",
        "hint": "Maintenir la protection quotidienne"
      },
      "elevated": {
        "label": "Élevé",
        "verb": "Anomalies détectées",
        "hint": "Passer en mode renforcé et surveiller les IP suspectes"
      },
      "under_attack": {
        "label": "Sous attaque",
        "verb": "Probablement sous attaque",
        "hint": "Appliquer le préréglage sous attaque + bannissement en masse"
      },
      "critical": {
        "label": "Critique",
        "verb": "Menace grave",
        "hint": "Envisagez le mode urgence ; assurez-vous d'être en liste blanche"
      }
    },
    "presetsWhen": {
      "daily": "Quotidien",
      "hardened": "Scanner/brut",
      "under_attack": "Flood L7",
      "emergency": "Dernier recours"
    },
    "note": {
      "notApplied": "Non appliqué sur l'hôte (nécessite root + YSK_EXECUTE=1) — enregistré dans les paramètres du panneau",
      "nginxWritten": "Fichier panneau de limitation de débit Nginx écrit",
      "f2bWritten": "Paramètres panneau fail2ban écrits",
      "hintDropped": "Indice de protection interne omis",
      "nginxLimits": "Écrira un extrait de limite de débit Nginx"
    },
    "rel": {
      "justNow": "À l'instant",
      "minutesAgo": "il y a {{n}} min",
      "hoursAgo": "il y a {{n}} h"
    },
    "apiUnreachable": "Impossible d'atteindre l'API (proxy web/backend peut être hors service)",
    "geoipLoadFailed": "Échec du chargement de GeoIP",
    "loadFailed": "Échec du chargement",
    "previewDone": "Aperçu terminé (non écrit)",
    "presetApplied": "Préréglage de protection appliqué",
    "manualBan": "Bannissement manuel",
    "banSent": "Bannissement envoyé pour {{ip}}",
    "quickSelectBan": "Bannissement sélection rapide",
    "bulkBan": "Bannissement groupé {{count}}",
    "autoBanStatus": "Bannissement auto : {{onOff}} · {{mode}} · {{method}}",
    "autoBanUpdated": "Bannissement auto mis à jour",
    "automationMaster": "Automatisation principale : {{onOff}}",
    "autoPresetStatus": "Préréglage auto : {{onOff}}",
    "autoBanAutomation": "Bannissement auto : {{onOff}} ({{mode}})",
    "automationSaved": "Paramètres d'automatisation enregistrés",
    "statFirewall": "Pare-feu",
    "statSuspects": "IP suspectes",
    "statSuspectsSplit": "{{actionable}} exploitable / {{total}} répertorié",
    "suspectActionableCount": "IP exploitables {{count}}",
    "scoreBasisHint": "Le score de menace utilise le pare-feu, le volume d'interdiction fail2ban et les signaux de taux de requêtes – ce qui n'est pas le même nombre que la liste des suspects Intel.",
    "statAutoBan": "Bannissement auto",
    "statApply": "Application système",
    "statActiveBans": "Bannissements actifs",
    "statPreset": "Préréglage",
    "threatPill": "Menace {{label}} · score {{score}}",
    "reprobed": "Resondé",
    "loadingStatus": "Chargement de l'état de protection…",
    "tabs": {
      "command": "Réponse",
      "automation": "Automatisation",
      "bans": "Bannissements",
      "geo": "Accès IP",
      "stack": "Empiler",
      "intel": "Intel",
      "about": "À propos"
    },
    "reapply": "Réappliquer",
    "nginxLimits": "Limitations de débit Nginx",
    "notWritten": "Non écrit",
    "modeValue": {
      "normal": "Normale",
      "degraded": "Dégradé",
      "ddos-protection": "Protection contre les attaques DDoS",
      "offline": "Hors ligne"
    },
    "mode": "Mode",
    "controlPlane": "Plan de contrôle",
    "canApply": "Applicable",
    "needRoot": "Nécessite root",
    "writeOnly": "Écrire le fichier uniquement",
    "autoRunning": "En cours · toutes les {{sec}}s · bannissements cette heure {{n}}",
    "autoOffManual": "Désactivé — manuel uniquement",
    "lastTick": "· dernier {{t}}",
    "nextTick": "· prochain {{t}}",
    "on": "Activé",
    "off": "Désactivé",
    "open": "Ouvrir",
    "ranAutomationTick": "Un cycle d'automatisation exécuté",
    "escalateHardened": "Renforcé ≥ score",
    "escalateAttack": "Sous attaque ≥ score",
    "deescalateDaily": "Retour au score quotidien <",
    "zeroOff": "0 désactivé",
    "holdAfterEscalate": "Maintien min. après escalade",
    "min5": "5 minutes",
    "min15": "15 minutes",
    "min30": "30 minutes",
    "hour1": "1 heure",
    "hour2": "2 heures",
    "hour6": "6 heures",
    "presetOrCustom": "Préréglage / personnalisé",
    "autoBanMode": "Mode auto-ban",
    "soft": "Souple",
    "normal": "Normale",
    "aggressive": "Agressif",
    "custom": "Personnalisé",
    "method": "Méthode",
    "banMethod": "Méthode de ban",
    "both": "Les deux",
    "scoreGte": "Note ≥",
    "hitsGte": "Hits de requêtes ≥",
    "hits429Gte": "Hits liés aux 429 ≥",
    "scanHitsGte": "Hits chemins de scan ≥",
    "cooldown": "Refroidir",
    "maxPerHour": "Max par heure",
    "scanInterval": "Intervalle de scan",
    "schedulerDefault": "planificateur par défaut 120s",
    "collapse": "Réduire",
    "expand": "Développer",
    "step": "Étape",
    "mechanism": "Mécanisme",
    "youCanTune": "Réglable",
    "probe": "Sonder",
    "probeSignals": "WAN/taux de demande/TCP/f2b/UFW",
    "escalateThreshold": "Seuil d'escalade",
    "emergency": "Urgence",
    "neverAuto": "Jamais auto",
    "manualEmergency": "URGENCE manuelle",
    "signalNetworkDown": "WAN hors service",
    "signalHighReq": "Taux de requêtes élevé",
    "signalDdos": "Heuristique DDoS",
    "signalTcp": "Connexions TCP",
    "signalUfwOff": "UFW désactivé",
    "signalF2bBans": "Nombre de bans fail2ban",
    "weightHint": "Poids {{label}} 0–3",
    "detected": "(détecté)",
    "notSet": "(non défini)",
    "zonesComma": "Zones (séparées par des virgules)",
    "underAttackRequested": "Under Attack demandé",
    "underAttackCleared": "Clear UA demandé",
    "autoBanOpen": "Activé · {{mode}} · cette heure {{n}}/{{max}}",
    "autoBanClosed": "Désactivé — manuel/liste uniquement",
    "pausedNoExecute": "· en pause (pas d'EXECUTE)",
    "circuitOpen": "· circuit ouvert",
    "autoBanModeLabel": "Mode auto-ban",
    "scanned": "Scanné",
    "bulkOps": "Actions groupées",
    "fromAccessLog": "Depuis le journal d'accès · ban en un clic ou groupé",
    "noSuspectIps": "Aucune IP suspecte pour l'instant",
    "noSuspectDesc": "Apparaît lorsque du trafic scan/429 est détecté. Développez pour un ban manuel.",
    "whitelistPlus": "Liste blanche + {{ip}}",
    "whitelistAdded": "Ajouté à la liste blanche",
    "activeBansTitle": "Bans actifs ({{count}})",
    "activeBansDesc": "Agrégat de protection · débannir via l'API defense (identique à fail2ban-client)",
    "source": "Source",
    "unbanned": "Débanni",
    "noBans": "Aucun ban",
    "noBansDesc": "Les bans s'affichent ici",
    "collapseQuickAdd": "Réduire l'ajout rapide",
    "quickAddOne": "Ajout rapide",
    "removeItem": "Retirer {{w}}",
    "updated": "Mis à jour",
    "ipOrCidr": "IPv4/IPv6 ou CIDR",
    "autoBanWhitelistAdded": "Ajouté à la liste blanche d'auto-ban",
    "added": "Ajouté",
    "banIpPlaceholder": "IPv4 ou IPv6 à bannir",
    "reason": "Motif",
    "scanBrute": "Scanner/brut",
    "noSignals": "Aucun signal pour l'instant",
    "pressReprobe": "Appuyez sur re-probe",
    "points": "points",
    "noTopIps": "Aucune IP en tête pour l'instant",
    "topIpsAfterLog": "S'affiche une fois les journaux disponibles",
    "noManagedVhost": "Aucun vhost géré",
    "afterPresetMarker": "L'application du préréglage injecte le marqueur",
    "injected": "YSK_DEFENSE injecté",
    "notInjected": "Non injecté",
    "noEvents": "Aucun événement pour l'instant",
    "eventsAfterOps": "Apparaissent après apply/ban",
    "geoipUpdated": "Base GeoIP mise à jour",
    "dbReady": "Base prête",
    "stale": "Obsolète",
    "older7d": ">7 jours",
    "freshnessNa": "n / A",
    "freshnessMissing": "Aucune base de données",
    "freshnessStale": "Vicié",
    "freshnessFresh": "Actuel",
    "lastSuccess": "Dernier succès",
    "downloaded": "Téléchargé",
    "missing": "Manquant",
    "geoMode": "Mode d'accès géo",
    "denyList": "Liste de refus",
    "allowListHighRisk": "Liste d'autorisation · risque élevé",
    "autoUpdateDb": "Mise à jour auto de la base",
    "countriesSelected": "Pays ({{n}} sélectionnés)",
    "searchCountry": "Rechercher nom chinois ou ISO",
    "countryPlaceholder": "Chine / CN",
    "regionsSelected": "Régions ({{n}} sélectionnées)",
    "regionsHint": "Depuis les pays sélectionnés ; CN-GD personnalisé OK",
    "pickCountryFirst": "Sélectionnez d'abord des pays pour affiner la liste",
    "customRegion": "Personnalisé, ex. CN-GD",
    "regionPlaceholder": "Guangdong / Californie / Tokyo",
    "continentsSelected": "Continents ({{n}} sélectionnés)",
    "continentsHint": "Continents optionnels",
    "continentPlaceholder": "Asie / UE",
    "asnsSelected": "ASN fournisseur ({{n}} sélectionnés)",
    "asnsHint": "Cloud/FAI ; ASN personnalisé OK",
    "customAsn": "ASN personnalisé, ex. 13335",
    "asnPlaceholder": "Cloudflare / FAI",
    "cityExample": "ex. CN|Shenzhen ou US|Ashburn",
    "policySaved": "Politique enregistrée · pays {{c}} · régions {{r}} · ASN {{a}}",
    "ipPolicySaved": "Politique d'accès IP enregistrée",
    "nginxGeoWritten": "Snippet geo nginx écrit",
    "ipAddress": "Adresse IP",
    "lookupPlaceholder": "IPv4 ou IPv6 à interroger",
    "wouldBlock": "Bloquerait · {{reason}} · {{matched}}",
    "wouldAllow": "Autoriser · {{reason}}",
    "lookupDone": "Recherche terminée",
    "item": "Champ",
    "value": "Valeur",
    "country": "Pays",
    "region": "Région",
    "city": "Ville",
    "continent": "Continent",
    "coords": "Coordonnées",
    "provider": "Fournisseur",
    "policy": "Politique",
    "block": "Bloquer",
    "allow": "Autoriser",
    "matched": "Correspondance",
    "applyStricterTitle": "Appliquer le préréglage plus strict ?",
    "applyStricterDesc": "Peut activer le bannissement auto. Confirmez que votre IP est en liste blanche.",
    "confirmEmergencyTitle": "Confirmer le préréglage d'urgence",
    "confirmEmergencyDesc": "L'urgence limite extrêmement le débit. Confirmez la liste blanche et tapez EMERGENCY.",
    "confirmString": "Chaîne de confirmation",
    "applyEmergency": "Appliquer l'urgence",
    "sectionPreset": "Préréglages",
    "sectionAutoPreset": "① Préréglage auto",
    "sectionAutoBan": "② Bannissement auto",
    "unban": "Débannir",
    "ban": "Bannir",
    "banConfirmTitle": "Interdire {{ip}} ?",
    "banConfirmMethod": "Méthode : {{method}}",
    "banConfirmUntilUnban": "Reste banni jusqu'à ce que vous le débannissiez (ou jusqu'à l'expiration de fail2ban).",
    "banConfirmDesc": "Cette IP sera bloquée sur l'hôte. Confirmez qu’il ne s’agit pas d’une adresse de panel ou de session actuelle.",
    "wlRemovedUndo": "Suppression de {{ip}} de la liste verte. Annulez dans les 5 secondes.",
    "undo": "Défaire",
    "banSelectedConfirmTitle": "Interdire {{count}} IP sélectionnées ?",
    "banSelectedConfirmDesc": "Ces adresses seront bloquées sur l'hébergeur : {{ips}}",
    "save": "Enregistrer",
    "yes": "Oui",
    "no": "Non",
    "oneClickSuggested": "Appliquer le préréglage suggéré",
    "stackApply": "Appliquer la pile de protection (UFW, fail2ban, preset)",
    "stackApplyDone": "Application de la pile de protection demandée",
    "stackApplyHint": "Cela active UFW et applique fail2ban ainsi que le préréglage suggéré. Confirmez que vous ne vous bloquerez pas hors d'un panneau distant.",
    "viewPresets": "Voir les préréglages",
    "suspectIpsCount": "IP suspectes {{count}}",
    "goBans": "Aller aux bannissements",
    "singleEntryPrefix": "Entrée unique :",
    "singleEntryBody": " ",
    "emergencyNeverAuto": "urgence jamais auto",
    "writeOnlyBanner": "Écriture seule : l'application système nécessite EXECUTE=1 et root.",
    "readiness": "Disponibilité",
    "goTo": "Ouvrir",
    "presetGuide": "",
    "active": "Actif",
    "recommended": "Suggéré",
    "useCarefully": "Attention",
    "preview": "Aperçu",
    "stackToolsSee": "Outils stack dans l'onglet Stack ·",
    "readinessCheck": "Contrôle de préparation",
    "automationMasterLabel": "Interrupteur principal d'automatisation",
    "runOneTick": "Lancer un cycle maintenant",
    "suggestEmergencyBanner": "Score très élevé — le système suggère l'urgence mais ne l'appliquera pas automatiquement. Confirmez dans l'onglet Response.",
    "autoPresetDesc": "Basculement auto daily/hardened/under-attack selon le score. Urgence jamais auto.",
    "allowDeescalate": "Autoriser la désescalade auto",
    "autoBanThresholdHint": "seuils soft/normal/aggressive ;",
    "sectionMechanism": "③ Fonctionnement",
    "lastNotes": "Dernier : {{notes}}",
    "sectionWeights": "④ Poids des signaux (0–3)",
    "weightsDesc": "Par défaut 1 ;",
    "needCfToken": "Nécessite l'env CF_API_TOKEN",
    "cfOnEscalate": ". Peut appeler l'API lors de l'escalade vers under-attack ou d'une application manuelle.",
    "ufwOnlyCf": "Under attack : UFW n'autorise que les plages CF (+SSH)",
    "ufwOnlyCfHint": "Réinitialise UFW aux seules IP Cloudflare ; nécessite les droits de modification système.",
    "saveZones": "Enregistrer les zones",
    "uaNow": "Under Attack maintenant",
    "uaClear": "Clair (→ élevé)",
    "stackRoleNote": "UFW et fail2ban sont des pages d’outils sous Protection (pas de navigation de premier niveau). La barre latérale ne conserve que cette page.",
    "fwUfwTitle": "Pare-feu UFW",
    "fwStats": "Politique de ports · DENY permanent · autoriser {{allow}} · refuser {{deny}}",
    "fwRulesProfiles": "Règles et profils UFW",
    "f2bStats": "Journal des bans temporaires · {{jails}} jails · bannis {{banned}}",
    "jailsWhitelistPolicy": "Jails · liste blanche · politique",
    "divisionTitle": "Répartition des rôles",
    "divisionUfw": "UFW = quels ports ouverts, refus IP permanent",
    "divisionF2b": "fail2ban = ban temporaire après analyse des journaux",
    "divisionDefense": "Cette page = orchestration des attaques (préréglages de débit + auto-ban + suspects)",
    "autoBanLabel": "Bannissement auto",
    "scanOnce": "Analyser une fois",
    "selectedIps": "{{count}} IP sélectionnée(s)",
    "banSelected": "Bannir la sélection",
    "suspectIps": "IP suspectes",
    "selectAll": "Tout sélectionner",
    "alreadyBanned": "Bannis",
    "whitelist": "Liste blanche",
    "bansWorkflow": "Réponse : liste des suspects → ban/déban. Politique des jails, ignoreip, cycle de vie du service :",
    "f2bTool": "Outil fail2ban",
    "noSecondJail": "(pas de second éditeur de jail ici).",
    "autoBanWhitelistTitle": "Liste blanche auto-ban",
    "autoBanWhitelistDesc": "Exemptions d’auto-ban Protection (synchronise fail2ban ignoreip",
    "ufwOff": "UFW (éteint)",
    "ufwOffHint": "UFW n'est pas actif — fail2ban est la cible utilisable.",
    "whitelistSyncHint": "{{n}} entrées du panneau · fail2ban ignoreip sync : {{sync}}",
    "whitelistSyncOn": "sur",
    "whitelistSyncOff": "désactivé (les listes peuvent différer)",
    "ignoreipWhitelist": "liste blanche ignoreip",
    "notSetSuggestAdmin": "Non défini (ajoutez l’IP d’administration)",
    "moreItems": "… {{n}} de plus · voir la liste blanche fail2ban",
    "add": "Ajouter",
    "manualBanTitle": "Bannissement manuel",
    "methodFollows": "La méthode suit la sélection ci-dessus (fail2ban / UFW)",
    "preferSuspectList": "En général, la liste des suspects suffit.",
    "threatSignals": "Signaux de menace",
    "scoreSource": "Sources de score · poids réglables",
    "accessAuthSample": "échantillons access + auth",
    "fullLogsAt": "Journaux nginx/auth complets :",
    "logCenter": "Centre de journaux",
    "colScore": "Score",
    "colHits": "Requêtes",
    "col429": "429",
    "topIpsTitle": "IP en tête",
    "hitsCount": "{{n}} requêtes",
    "sampleWindowHint": "Les comptes viennent de la fenêtre d’échantillons access + auth actuelle, pas du fichier journal complet.",
    "banShort": "Bannir",
    "vhostLimits": "Limites de débit par vhost",
    "eventStream": "Flux d’événements",
    "eventKind": {
      "preset": "Préréglage",
      "auto_preset": "Préréglage auto",
      "cloudflare_ua": "Flare nuageuse",
      "ban": "Bannir",
      "unban": "Débannir"
    },
    "hours48": "48 heures",
    "geoipDb": "Base GeoIP",
    "refreshStatus": "Actualiser l'état",
    "updateDbNow": "Mettre à jour la DB maintenant",
    "geoipSourceHint": "Utilise la base GeoIP locale par défaut ; jeton IPinfo optionnel.",
    "retry": "Réessayer",
    "loadingGeoip": "Chargement de l’état GeoIP…",
    "nextScheduledUpdate": "Prochaine mise à jour planifiée : {{at}}",
    "statusNotLoaded": "État non chargé",
    "load": "Charge",
    "accessPolicy": "Politique d’accès",
    "enable": "Activer",
    "freeGranularity": "Gratuit max : pays + région + ASN ; ville optionnelle (désactivée par défaut, précision moindre). Fournisseur = ASN. La liste blanche est toujours exemptée. Cliquez sur une pastille pour retirer.",
    "allowListDanger": "Le mode liste d’autorisation est à haut risque : les IP publiques non listées (y compris géo inconnue) sont bloquées. Assurez-vous que l’IP d’administration figure sur la liste blanche de la page de ban.",
    "dailySchedule": "Planification quotidienne",
    "cityPolicy": "Politique ville (faible confiance · optionnel)",
    "useCityAccess": "Utiliser la ville pour l’accès",
    "cityPolicyHint": "La précision ville de la DB gratuite est limitée",
    "noCitiesYet": "Aucune ville pour l’instant",
    "savePolicy": "Enregistrer la politique",
    "applyNginxSnippet": "Appliquer l’extrait Nginx",
    "nginxSnippetHint": "Le blocage HTTP nécessite le module nginx geoip2.",
    "testIp": "IP de test",
    "lookup": "Recherche",
    "plusCountry": "+ pays {{v}}",
    "plusRegion": "+ région {{v}}",
    "plusCity": "+ ville {{v}}",
    "lastTickPrefix": "· dernier {{t}}",
    "nextTickPrefix": "· prochain {{t}}",
    "cannotBanSelf": "Impossible d’interdire {{ip}} — c’est l’hôte, votre IP de connexion ou ignoreip",
    "selfIp": "Cet hôte",
    "selfHostIp": "IP de l'hôte",
    "selfLoginIp": "Votre IP de connexion",
    "showZeroScore": "Afficher le score 0",
    "hideZeroScore": "Masquer le score 0",
    "geoDraftOnly": "Politique désactivée — Enregistrer n’écrit qu’un brouillon. Nginx n’applique rien tant qu’elle n’est pas activée.",
    "geoNeedDb": "Les bases de données GeoIP sont manquantes : mettez d'abord à jour les fichiers MMDB",
    "uaNeedZones": "Définir d'abord une zone Cloudflare",
    "selectAllCountriesWarn": "Tout sélectionner en liste de blocage ? Cela peut bloquer cet hôte et votre pays de connexion.",
    "badgeRecommendPreset": "Un préréglage plus fort est recommandé pour la menace actuelle",
    "badgeAutomationOn": "L’automatisation est activée",
    "badgeBanCount": "Interdictions actives",
    "badgeGeoOn": "La politique d’accès Geo est activée",
    "badgeGeoNotReady": "La base GeoIP n’est pas prête",
    "badgeIntelSignals": "Signaux qui ajoutent au score actuellement",
    "signalActive": "Actif",
    "signalInactive": "Inactif",
    "signalJails": "{{n}} prison(s)",
    "dbReadyHint": "Fichiers MMDB présents",
    "dbNotReadyHint": "Téléchargez d’abord une base GeoIP",
    "staleHint": "Si la dernière mise à jour réussie a plus de 7 jours",
    "draftBadge": "Brouillon",
    "banIsSelf": "Cette IP correspond à la source actuelle du panneau ou à cet hôte.",
    "banNotSelf": "Cette adresse IP n'est pas la source actuelle du panneau.",
    "geoSourceLocal": "Bibliothèque GeoIP locale (sapics + DB-IP)",
    "nginxPreviewHint": "Extrait Nginx que ce préréglage écrirait (aperçu uniquement) :"
  },
  "publicFiles": {
    "notSet": "Non défini",
    "quota": "Quota",
    "reloadOnApply": "À l’application",
    "path": "Chemin",
    "fileManager": "Gestionnaire de fichiers",
    "overview": "Vue d'ensemble",
    "overviewDesc": "Paramètres à appliquer (résumé en lecture seule)",
    "serverName": "Nom du serveur",
    "reloadNginx": "Recharger Nginx",
    "reloadTry": "Essayer à l’application",
    "siteSettings": "Paramètres du site",
    "siteSettingsDesc": "Écrit la conf gérée ; peut recharger Nginx à l’application (accessible uniquement après application)",
    "serverNameHint": "Nginx server_name, ex. files.example.com",
    "notes": {
      "noManagedConf": "Aucune configuration Nginx gérée pour l'instant : cliquez sur Appliquer",
      "notSynced": "La configuration gérée existe mais ne se trouve pas sous /etc/nginx/conf.d — appliquez-la à nouveau en tant que root avec YSK_EXECUTE"
    },
    "quotaMiB": "Quota (Mio)",
    "quotaHint": "Facultatif ; limite la taille du répertoire public",
    "unlimited": "Illimité",
    "quotaInvalid": "Saisissez un nombre entier de MiB ou choisissez Illimité.",
    "serverNameRequired": "Entrez un nom de serveur.",
    "serverNameInvalid": "Utilisez un nom d'hôte, un caractère générique ou une adresse IP – sans espaces ni ponctuation.",
    "applyHint": "L’application écrit uniquement la configuration ;",
    "appliedOk": "Site de fichiers publics appliqué",
    "applyReload": "Appliquer et recharger Nginx",
    "statusLive": "Actif sur nginx",
    "statusDraft": "Brouillon / non appliqué",
    "statusManagedOnly": "Géré uniquement",
    "statusNotApplied": "Non appliqué",
    "nginxLive": "dans conf.d",
    "nginxNotLive": "absent de conf.d",
    "openSite": "Ouvrir le site",
    "notLiveHint": "Un domaine en 404 signifie en général que la conf est seulement sous dataDir, non copiée vers /etc/nginx/conf.d, ou que nginx n’a pas été rechargé. Réappliquez avec root + YSK_EXECUTE. Utilisez http:// jusqu’à l’émission du SSL pour ce nom d’hôte.",
    "diskRoot": "Racine disque",
    "executeFlag": "Exécuter",
    "asRoot": "Racine",
    "filesInRoot": "Entrées",
    "managedConf": "Conf gérée",
    "systemConf": "conf.d système",
    "autoindex": "Liste des répertoires (indexation automatique)",
    "liveSystemConf": "Conf système active : {{path}}",
    "publicRootNote": "Racine publique : {{path}}",
    "applyConfirmTitle": "Appliquer le site des fichiers publics ?",
    "applyConfirmDesc": "Écrire Nginx server_name {{name}} et recharger Nginx.",
    "serverNameMismatch": "La conf active est {{live}} ; le formulaire a {{draft}}. Appliquez pour remplacer.",
    "liveName": "Nom en direct",
    "draftName": "Nom du brouillon",
    "draftUnapplied": "Ce projet n'est pas appliqué. Nginx sert toujours le nom live.",
    "discardDraft": "Supprimer le brouillon"
  },
  "rbac": {
    "permissions": "Autorisations",
    "permissionsDesc": "Ajouter ou retirer des capacités par rôle. Valeurs d’usine avec restauration en un clic.",
    "rolePolicy": "Politique de rôle",
    "dirty": "Personnalisé",
    "factory": "Valeur d’usine",
    "maxLevel": "Niveau max",
    "save": "Enregistrer la politique",
    "saved": "Politique {{role}} enregistrée",
    "restoreRole": "Restaurer ce rôle",
    "restoreAll": "Restaurer tous les rôles",
    "restoreRoleTitle": "Restaurer {{role}} aux valeurs d’usine ?",
    "restoreRoleDesc": "Les capacités personnalisées de ce rôle seront effacées.",
    "restoreAllTitle": "Restaurer tous les rôles aux valeurs d’usine ?",
    "restoreAllDesc": "Toutes les politiques de rôle personnalisées seront effacées.",
    "restoredRole": "{{role}} restauré",
    "restoredAll": "Valeurs d’usine de tous les rôles restaurées",
    "bandAllOn": "Tout activer",
    "bandAllOff": "Tout désactiver",
    "diffFromFactory": "Diffère de la valeur par défaut",
    "effectivePreview": "Capacités effectives",
    "userOverrides": "Surcharges utilisateur",
    "extraGrants": "Octrois supplémentaires",
    "extraRevokes": "Révocations supplémentaires",
    "restoreUserOverrides": "Effacer les dérogations utilisateur",
    "restoreUserOverridesTitle": "Effacer les dérogations pour {{name}} ?",
    "restoreUserOverridesDesc": "Seules les attributions/révocations supplémentaires sont effacées ; la politique de rôle reste inchangée.",
    "overridesBadge": "Dérogations",
    "promoteAdminTitle": "Promouvoir en administrateur ?",
    "promoteAdminDesc": "L'administrateur peut gérer les utilisateurs, modifier le RBAC, usurper l'identité, restaurer des sauvegardes, et plus encore.",
    "level": {
      "read": "Lecture",
      "write-low": "Écriture (faible)",
      "write-high": "Écriture (élevée)",
      "destructive": "Destructif",
      "privilege": "Privilège"
    },
    "cap": {
      "dashboardRead": "Tableau de bord",
      "logsRead": "Journaux",
      "metricsRead": "Métriques",
      "projectsRead": "Projets (lecture)",
      "mailRead": "Messagerie (lecture)",
      "dnsRead": "DNS (lecture)",
      "sslRead": "SSL (lecture)",
      "backupsRead": "Sauvegardes (lecture)",
      "updatesRead": "Mises à jour (lecture)",
      "servicesRead": "Services (lecture)",
      "firewallRead": "Pare-feu (lecture)",
      "approvalsView": "Approbations (consultation)",
      "usersSelf": "Profil personnel / 2FA",
      "projectsWrite": "Création/modification de projets",
      "mailWrite": "Boîtes aux lettres / alias",
      "dbWrite": "Créer des bases de données",
      "sslUpload": "Téléverser des certificats",
      "filesProject": "Fichiers de projet",
      "approvalsRespond": "Répondre aux approbations",
      "cronManage": "Gestion du cron",
      "servicesControl": "Contrôle des services",
      "updatesApply": "Appliquer les mises à jour de paquets",
      "dnsApply": "Appliquer le DNS",
      "sslIssue": "Émettre un certificat SSL",
      "publishApply": "Publier / Nginx",
      "firewallEdit": "Modifier le pare-feu",
      "mailApply": "Appliquer les maps de messagerie",
      "runtimeTuning": "Réglages d'exécution",
      "mysqlConsoleWrite": "Console d'écriture MySQL",
      "projectsDelete": "Supprimer des projets",
      "dbDrop": "Supprimer des bases de données",
      "backupsRun": "Lancer des sauvegardes",
      "backupsRestore": "Restaurer des sauvegardes",
      "firewallFlush": "Vider le pare-feu",
      "logsPurge": "Purger les journaux",
      "usersManage": "Gérer les utilisateurs",
      "packagesManage": "Gérer les paquets",
      "usersImpersonate": "Usurper l'identité",
      "securityPolicy": "Politique de sécurité",
      "rbacPolicy": "Politique RBAC",
      "settingsSystem": "Paramètres système",
      "auditExport": "Export d'audit",
      "securityApiKeysAdmin": "Administration des clés API",
      "networkBrowse": "Navigation Web via l'hôte",
      "networkVnc": "Bureau à distance VNC",
      "validatorsRead": "Validateurs (lecture)",
      "validatorsManage": "Validateurs gérer",
      "validatorsWipe": "Validateurs effacer les données",
      "dockerRead": "Docker (lecture)",
      "dockerManage": "Docker gérer",
      "dockerWipe": "Docker supprimer / nettoyer"
    },
    "aboutRoles": "Rôles (valeurs d'usine)",
    "aboutRolesBody": "Les rôles définissent les capacités par défaut ; les utilisateurs peuvent en remplacer certaines individuellement.",
    "aboutQuota": "Quotas",
    "aboutQuotaBody": "Les quotas de package sont principalement des totaux hôte/panneau, pas une isolation multi-locataire stricte",
    "dangerPolicyTitle": "Accorder des capacités destructives / de privilège ?",
    "dangerPolicyDesc": "Vous ajoutez des capacités destructives ou de privilège, ou vous augmentez maxLevel pour ce rôle",
    "needRbacPolicy": "rbac.policy est requis pour modifier les politiques de rôle.",
    "adminLockedFull": "Admin tout ouvert (verrouillé)",
    "adminLockedHint": "Le rôle système admin est toujours entièrement ouvert et ne peut pas être réduit",
    "maxLevelHint": "Les groupes de capacités au-dessus de ce niveau restent verrouillés.",
    "capabilities": "Capacités",
    "capabilitiesHint": "Activer/désactiver ce que ce rôle peut faire",
    "enabledCount": "{{enabled}} sur {{total}} activées",
    "bandAboveMax": "Au-dessus du niveau max",
    "roleUnavailable": "Non disponible pour ce rôle",
    "dirtyHint": "Personnalisé (diffère de l'usine)",
    "unsaved": "Non enregistré",
    "unsavedHint": "Modifications non enregistrées sur ce rôle",
    "nothingToSave": "Rien à sauver",
    "saveRole": "Enregistrer la politique {{role}}",
    "discardTitle": "Supprimer la stratégie non enregistrée ?",
    "discardDesc": "Le changement de rôle supprime les modifications de fonctionnalités non enregistrées."
  },
  "readiness": {
    "cat": {
      "core": "Plan de contrôle",
      "security": "Autorisations et sécurité",
      "binaries": "Logiciels système",
      "hosting": "Durées d'exécution",
      "dns": "DNS",
      "email": "E-mail",
      "isolation": "Isolation de projet",
      "ops": "Opérations"
    },
    "level": {
      "ready": "Prêt",
      "degraded": "Dégradé",
      "missing": "Manquant",
      "unknown": "Inconnu"
    },
    "severity": {
      "critical": "Critique",
      "recommended": "Recommandé",
      "optional": "Facultatif"
    },
    "fix": "Corriger",
    "passed": "Réussi",
    "checkFailed": "Échec du contrôle de préparation",
    "gatePass": "Gate franchie · {{pct}} %",
    "gateFail": "Non prêt · {{pct}} %",
    "gateBlocked": "Non réussi · {{n}} manquant",
    "executeOn": "Activé",
    "executeOff": "Désactivé",
    "blockers": "Bloquants",
    "blockersHint": "Les bloqueurs sont le sous-ensemble critique de Manquants — pas des contrôles en plus.",
    "requireAdminTotp": "exiger une politique administrateur 2FA",
    "listenBind": "écouter l'adresse",
    "item": {
      "admin2fa": "Administrateur à deux facteurs"
    },
    "dataDirPerms": "autorisations du répertoire de données du panneau",
    "mode750": "mode 750",
    "totalChecks": "Tous les chèques",
    "totalChecksHint": "Prêt + dégradé + manquant = ce total. Les bloqueurs constituent le sous-ensemble manquant critique.",
    "probing": "Sondage…",
    "reprobe": "Re-sonder",
    "exportReport": "Exporter le rapport",
    "exportStarted": "Téléchargement {{name}}",
    "firstBlocker": "Corriger le premier bloquant",
    "viewRecommended": "Voir les recommandés",
    "loadingProbe": "Sondage des capacités de l'hôte…",
    "priorityTab": "Corrections prioritaires",
    "checklistTab": "Liste de contrôle complète",
    "summaryTab": "Résumé et raccourcis",
    "priorityTitle": "Corrections prioritaires",
    "prioritySub": "Traiter dans l'ordre ; relancer le sondage après avoir levé les bloquants",
    "nItems": "{{count}} éléments",
    "noHardBlockers": "Aucun bloquant critique",
    "noHardBlockersTitle": "Aucun bloquant critique",
    "prodGate": "Gate de production",
    "gatePassed": "validé",
    "gateMaybePerm": "peut encore échouer en raison des permissions",
    "viewDegradedHint": "Examiner les recommandations dégradées (mail, DNS, runtimes optionnels).",
    "viewDegraded": "Voir les dégradés",
    "fullChecklist": "Liste de contrôle complète",
    "showing": "Affichage de {{shown}} / {{total}}",
    "filterAria": "Filtre d'état",
    "all": "Tous",
    "category": "Catégorie",
    "allCategories": "Toutes les catégories",
    "searchPh": "Titre, détail, id, indice de correction…",
    "quickCatAria": "Catégories rapides",
    "noMatchTitle": "Aucun élément correspondant",
    "noMatchDesc": "Effacer la recherche ou modifier les filtres.",
    "resetFilters": "Réinitialiser les filtres",
    "summary": "Résumé",
    "shortcuts": "Raccourcis",
    "opsShortcutsAria": "Raccourcis Ops",
    "scHost": "Paramètres de l'hôte",
    "scHostD": "nom d'hôte · puissance · NTP",
    "scUnit": "Unité du plan de contrôle",
    "scUnitD": "systemd installer/activer",
    "scServices": "Matrice des services",
    "scServicesD": "nginx · BD · cycle de vie",
    "scMetrics": "Métriques de l'hôte",
    "scMetricsD": "charge · mémoire · alertes",
    "scProtection": "Centre de défense",
    "scProtectionD": "réponse · UFW · fail2ban",
    "policyNote": "Politique : mail PTR / port 25 / DNS du registrar ne sont jamais marqués automatiquement comme terminés. HTTP 503 = pas prêt mais rapport complet (pas un faux succès).",
    "notProbedTitle": "Pas encore sondé",
    "notProbedDesc": "Cliquez sur « Re-probe » pour lancer une vérification de disponibilité en lecture seule.",
    "runCheck": "Lancer la vérification de disponibilité",
    "reportFormatError": "Format de rapport de disponibilité invalide",
    "checkFailedHttp": "Échec de la vérification de disponibilité ({{status}})",
    "itemAdminPassword": "Robustesse du mot de passe administrateur",
    "itemAdminPasswordWeak": "{{count}} admin(s) signalé(s) must_change_password / bootstrap non sécurisé — modifier avant la production",
    "itemAdminPasswordOk": "Aucun indicateur bootstrap/mot de passe faible sur les comptes admin",
    "itemAdminPasswordFix": "Changer le mot de passe admin (Sécurité / Utilisateurs)",
    "itemListenBind": "Liaison d'écoute du plan de contrôle",
    "itemListenBindPublic": "L'écoute peut être publique (0.0.0.0/::). Préférez 127.0.0.1 + reverse proxy / pare-feu.",
    "itemListenBindLoopback": "Préférer la liaison loopback (par défaut 127.0.0.1)",
    "itemDataDirPerms": "Permissions dataDir",
    "itemDataDirWorldW": "chmod 750 (ou 700) dataDir ; chown vers l'utilisateur du panneau",
    "itemDataDirOtherR": "Préférez chmod 750 dataDir pour que les autres utilisateurs ne puissent pas lire le JSON du plan de contrôle",
    "itemRustToolchain": "Chaîne d'outils Rust",
    "itemWebBuildFix": "Cliquez sur « Fix now » pour compiler l'interface Web (nécessite le monorepo sur cet hôte), ou exécutez : pnpm --filter ysk-server-web build",
    "itemWebBuildManual": "Pas de monorepo ni de SPA empaquetée sur cet hôte — la correction en un clic est indisponible. Sur une machine avec les sources : pnpm --filter ysk-server-web build, puis copiez apps/web/dist/* dans dataDir/web (p. ex. /var/lib/ysk-server/web), ou définissez YSK_WEB_ROOT et redémarrez.",
    "itemStateStore": "Stockage d'état du plan de contrôle",
    "itemStateStoreSqliteHint": "Optionnel : YSK_STORE=sqlite pour le magasin de documents WAL",
    "itemBackupFreshness": "Dernière exécution de sauvegarde complète",
    "itemBackupNone": "Aucun last_backup_run enregistré — exécutez backup all ou planifiez",
    "itemBackupFix": "sauvegarde du serveur ysk : planification de sauvegarde --install",
    "itemFleetSessions": "Sessions d'agent de flotte",
    "itemFleetNone": "Optionnel pour hôte unique ; multi-edge nécessite agent run + heartbeat",
    "itemFleetNoHb": "Sessions enregistrées mais sans heartbeat — démarrer l'agent edge",
    "itemPdnsutil": "pdnsutil (PowerDNS)",
    "apachePort80Title": "Apache contre public :80",
    "apachePort80Detail": "Apache écoute sur :80 et Nginx n'est pas sur HTTP public — conflit avec la topologie Nginx en edge.",
    "apachePort80Both": "Apache et Nginx apparaissent tous deux sur :80 — rattachez Apache à 127.0.0.1:8080.",
    "apachePort80Ok": "Apache est en cours d'exécution mais n'occupe pas seul le :80 public (topologie OK).",
    "apachePort80Fix": "Des assistants de rebind d'installation existent ; désactivez les vhosts Apache sur 80 ou vérifiez avec ss -lntp après rechargement.",
    "fixNow": "Corriger maintenant",
    "fixFailed": "Échec de la correction",
    "fixDone": "Permissions dataDir renforcées (chmod 750)",
    "fixDoneWebUi": "Interface Web compilée / installée",
    "rootLabel": "Superutilisateur",
    "techDetails": "Détails techniques",
    "missingOwner": "Aucun propriétaire de panel attribué (attribution de quota de package)",
    "notOsProvisioned": "Utilisateur/domicile du système d'exploitation non encore provisionné",
    "isolationPendingOs": "Identique au statut du projet : utilisateur du système d'exploitation en attente. Ouvrez l'isolation pour provisionner l'utilisateur du système et la maison.",
    "ondrejNone": "Aucune source PHP ondrej Launchpad détectée",
    "ondrejFound": "Sources ondrej/php héritées trouvées en conflit avec packages.sury.org : {{paths}}",
    "ondrejTitle": "PHP apt source (ondrej résiduel)",
    "systemctlActive": "Le service est en cours d'exécution",
    "systemctlStatus": "Statut du service : {{status}}",
    "binInPath": "{{bin}} dans CHEMIN",
    "leftoverApache": "Site par défaut restant d'Apache",
    "leftoverVsftpd": "L'unité vsftpd a échoué",
    "leftoverCli": "CLI restante périmée",
    "leftoverNginx": "Nginx fourre-tout manquant",
    "leftoverDovecot": "Dovecot TLS indique un certificat manquant",
    "leftoverOther": "Restes d’hôte",
    "leftoverApply": "Les restes s'appliquent",
    "isolationOwnerDegrades": "L'absence de Owner_user_id affecte l'attribution du quota de package : le statut est dégradé, pas prêt."
  },
  "redis": {
    "neverExpire": "N'expire jamais",
    "ttlSeconds": "{{ttl}}s",
    "ttlMinutes": "{{n}} minutes",
    "ttlHours": "{{n}} heures",
    "ttlDays": "{{n}} j",
    "typeString": "Chaîne",
    "typeHash": "Hacher",
    "typeList": "Liste",
    "typeSet": "Ensemble",
    "typeZset": "Ensemble trié",
    "keysLoadFailed": "Échec du chargement des clés",
    "writeFailed": "Échec de l'écriture",
    "saved": "Enregistré",
    "deleted": "Supprimé",
    "offline": "Hors ligne",
    "connections": "Connexions",
    "totalKeys": "Total des clés",
    "writable": "Accessible en écriture",
    "connected": "Connecté",
    "notConnected": "Non connecté",
    "keys": "Clés",
    "selected": "Sélectionné",
    "softwareMissing": "Le logiciel Redis n'est pas installé",
    "notConnectedTitle": "Non connecté à Redis",
    "installThenStart": "Installez Redis via la bannière, puis démarrez le service.",
    "installedNotConnected": "Installé mais non connecté — démarrez le service pour parcourir les clés.",
    "keysCountSuffix": "· {{n}} clé(s)",
    "searchPlaceholder": "Rechercher des clés, ex. user:* ou *",
    "searchKeys": "Rechercher des clés",
    "scanHint": "Utilise SCAN, pas KEYS. Renvoie au maximum {{n}} clés – évitez * sur les bases de données volumineuses.",
    "scanCapped": "Affichage des premiers matchs {{n}}.",
    "rows": "{{n}} ligne(s)",
    "content": "Contenu",
    "noMatchingKeys": "Aucune clé correspondante",
    "dbEmpty": "La base de données {{db}} est vide.",
    "noMatchPattern": "Aucune clé ne correspond à « {{pattern}} ».",
    "opsResult": "Résultat ops",
    "addStringKey": "Ajouter une clé string",
    "writeToDb": "Écrire dans la DB Redis {{db}} (en direct — prudence)",
    "keyName": "Clé",
    "keyNameHint": "Utilisez des espaces de noms avec deux-points, ex. session:user:1",
    "ttlLabel": "TTL (secondes)",
    "ttlHint": "Vide = n'expire jamais",
    "m1": "1m",
    "m5": "5m",
    "h1": "1h",
    "d1": "1j",
    "d7": "7j",
    "customSeconds": "Secondes personnalisées",
    "stringValue": "Valeur string via SET",
    "stringContent": "Contenu string",
    "deleteKeyTitle": "Supprimer cette clé ?",
    "deleteKeyDesc": "Supprimer « {{key}} » de la DB {{db}} ? Cette action est irréversible.",
    "installedOk": "Redis installé",
    "startedOk": "Redis démarré",
    "memory": "Mémoire",
    "addKey": "Ajouter une clé",
    "dbLabel": "BD {{i}}",
    "keysInDb": "· {{n}} clé(s)",
    "dbOptionKeys": "Touches DB {{i}} · {{n}}",
    "dbOptionEmpty": "DB {{i}} · vide",
    "dbRange": "{{n}} bases de données (0–{{max}}).",
    "serviceLink": "Modifier le nombre dans les paramètres du service",
    "dbsWithData": "DB avec données (rapide)",
    "keysShort": "{{k}} clés",
    "keyList": "Liste des clés",
    "pickKey": "Sélectionnez une clé à gauche pour afficher le contenu.",
    "ttlPrefix": "TTL : {{ttl}}",
    "writeLiveHint": "Écrit dans Redis en direct ; impossible d'annuler en un clic depuis le panneau.",
    "refPath": "Réf. : {{path}}",
    "dbEmptyMark": " · vide",
    "noRequirepass": "Le mode protégé est actif, mais requirepass est vide ou non lu — pas de mot de passe.",
    "insecureShort": "Pas de mot de passe",
    "setRequirepass": "Définir le mot de passe",
    "generateRequirepass": "Générer et appliquer un mot de passe",
    "generateRequirepassTitle": "Générer un mot de passe Redis ?",
    "generateRequirepassDesc": "Écrit requirepass et redémarre Redis. Le mot de passe est affiché une fois. Le changement d’hôte nécessite EXECUTE.",
    "generateRequirepassDone": "Mot de passe Redis appliqué",
    "generatedOnce": "Mot de passe généré (affiché une fois) : {{password}}",
    "rdbOnlyLossHint": "AOF désactivé et RDB activé. Un redémarrage ou un plantage peut perdre des écritures récentes.",
    "dirDataContainer": "/données (conteneur)",
    "dirHostDefault": "/var/lib/redis",
    "dirDefaultInstance": "/var/lib/redis/default",
    "dirDataWarn": "/data est généralement un chemin de conteneur ; ce panneau ne peut pas confirmer son existence.",
    "saveOff": "Désactiver les instantanés (non recommandé)",
    "saveOffWarn": "Une chaîne de sauvegarde vide désactive les instantanés RDB. Un crash peut perdre toutes les données si AOF est également désactivé.",
    "dirMoveWarn": "Changer de répertoire ne déplace pas dump.rdb / AOF. Le prochain démarrage utilise le nouveau chemin tel quel.",
    "passwordUnset": "Non défini sur le service",
    "passwordSetHidden": "Ensemble (non illustré)"
  },
  "resources": {
    "created": "Créé",
    "updated": "Mis à jour",
    "deleted": "Supprimé",
    "applyDone": "Application terminée",
    "applyIncomplete": "Application incomplète"
  },
  "roles": {
    "admin": "Administrateur",
    "operator": "Opérateur",
    "viewer": "Téléspectateur",
    "agent": "Agent"
  },
  "runtime": {
    "probed": "Sondé",
    "notProbed": "Non sondé",
    "probe": "Sonder",
    "read": "Lecture",
    "targetVersion": "Version cible",
    "nodeMissing": "Node.js n'est pas installé",
    "probeResult": "Résultat de la sonde",
    "readonly": "Lecture seule",
    "installNode": "Installer Node.js",
    "needExecuteAdmin": "Nécessite les droits de modification système et l’admin",
    "nodeMajor": "Version majeure de Node",
    "nodeMajorHint": "LTS souvent 20 ou 22 ; aligner avec le runtime du projet",
    "installedNode": "Node {{version}} installé",
    "installPm2": "Installer PM2",
    "installPm2Desc": "Installation en un clic de npm install -g pm2 (gestionnaire de processus). Nécessite d’abord Node.js.",
    "installPm2Btn": "Installer PM2",
    "reinstallPm2": "Réinstaller PM2",
    "installedPm2": "PM2 installé",
    "pm2Status": "État PM2",
    "pm2Ready": "Prêt",
    "pm2MissingShort": "Non installé",
    "pm2NeedNodeFirst": "Installer d’abord Node.js, puis PM2.",
    "pm2InstallHint": "Exécute npm -g en root avec les droits de modification système ;",
    "pm2ReadyHint": "PM2 est dans le PATH ; les projets peuvent utiliser le mode processus PM2.",
    "opsResult": "Résultat ops",
    "unlimited": "Illimité",
    "zeroUnlimited": "0 = illimité",
    "m24": "24m",
    "h1": "1h",
    "d1": "1j",
    "d7": "7j",
    "phpIniLoadFailed": "Échec du chargement de php.ini",
    "loaded": "Chargé",
    "default": "Par défaut",
    "phpMissing": "PHP n’est pas installé",
    "overview": "Vue d'ensemble",
    "fpmSites": "FPM / sites",
    "tools": "Outils",
    "about": "À propos",
    "installPhp": "Installer PHP",
    "versionAlreadyInstalled": "La version {{version}} est déjà présente sur l’hôte",
    "installedVersionBtn": "{{version}} installé",
    "newerVersionAvailable": "Actuel {{current}} ; plus récent pris en charge : {{newer}} (sélectionner pour installer)",
    "switchToNewer": "Sélectionner {{version}}",
    "installedVersionsHint": "Détecté : {{list}}",
    "phpInstallHint": "Nécessite les droits de modification système et l’admin ;",
    "phpVersion": "Version PHP",
    "phpExtHint": "Choisir les extensions à installer",
    "phpExtSelect": "Extensions PHP",
    "phpExtSelectHint": "Les paquets s’installent en php{{version}}-… ;",
    "phpExtRequired": "Obligatoires (cœur)",
    "phpExtRecommended": "Ensemble recommandé",
    "phpExtSelectAll": "Sélectionner toutes les extensions",
    "phpExtCoreOnly": "Cœur uniquement",
    "phpExtSearch": "Rechercher des extensions (mysql, gd, redis…)",
    "phpExtEmpty": "Aucune extension correspondante",
    "pluginsSelect": "Outils / plugins courants",
    "pluginsSelectHint": "Sélectionner pour installer avec le runtime (ex. PM2 pour Node, Poetry pour Python)",
    "pluginsSearch": "Rechercher des outils (pm2, poetry, maven…)",
    "pluginsEmpty": "Aucun outil correspondant",
    "pluginsRecommended": "Ensemble recommandé",
    "pluginsSelectAll": "Tout sélectionner",
    "pluginsNone": "Aucun outil associé",
    "pluginsInstallNote": "Sélectionner les outils puis Installer la sélection. La première installation du runtime peut inclure des outils ; si le runtime est déjà présent, utiliser uniquement le bouton ci-dessus.",
    "installPluginsOnly": "Installer les outils sélectionnés ({{version}} déjà présent)",
    "installExtOnly": "Installer les extensions sélectionnées (PHP {{version}} présent)",
    "pluginAlreadyOnHost": "déjà sur l’hôte",
    "installAddonsOnly": "Installer les modules complémentaires sélectionnés ({{version}} présent)",
    "remoteNewerHint": "Installé {{current}} · dernière version amont {{remote}}{{source}}",
    "installedPhp": "PHP {{version}} installé",
    "nextSteps": "Suivant",
    "suggestedFlow": "Flux suggéré",
    "globalPhpIni": "php.ini global",
    "globalPhpIniDesc": "Un paramètre par ligne",
    "managePath": "Chemin de gestion",
    "loading": "Chargement",
    "probing": "Sondage…",
    "noBinaryPath": "Pas de chemin binaire",
    "hostDefaultError": "Hôte par défaut indisponible",
    "pm2Tick": "{{at}} · projets {{projects}} · PM2 {{pm2}} · en cours d'exécution {{run}}",
    "cannotLoadSettings": "Impossible de charger la table des paramètres",
    "reloadFailed": "Échec du rechargement",
    "sensitive": "Paramètre sensible — prudence",
    "on": "Activé",
    "off": "Désactivé",
    "customNumber": "Nombre personnalisé",
    "customExample": "Personnalisé, ex. 768M",
    "advancedExtra": "Avancé : clés supplémentaires et brut",
    "advancedExtraDesc": "Directives hors catalogue ; une clé=valeur par ligne ; le brut s'ajoute en fin d'ini",
    "extraDirectives": "Directives supplémentaires",
    "extraDirectivesHint": "Une clé=valeur par ligne (clés absentes ci-dessus)",
    "rawAppend": "Ajouter le brut en fin d'ini",
    "phpIniSaved": "php.ini enregistré",
    "appliedSystem": "Appliqué au système",
    "demoVhost": "Outils système : vhost / pool de démo",
    "demoVhostDesc": "Avancé/debug ; les sites quotidiens passent par Projets → Déployer",
    "domain": "Domaine",
    "domainRequired": "Entrez un domaine valide avant d'appliquer le vhost.",
    "vhostServerName": "server_name du virtual host",
    "poolName": "Nom du pool",
    "poolNameHint": "Identifiant saisi manuellement (démo) ; les chemins projet utilisent les utilisateurs ysks_*",
    "enableReload": "Activer et recharger les services",
    "enableReloadHint": "Nécessite les droits de modification système ; désactivé = gestion en écriture uniquement",
    "applyFailed": "Échec de l’application",
    "phpVhostApplied": "Vhost / pool PHP appliqué",
    "composerTools": "Compositeur / WP-CLI / modules",
    "composerToolsDesc": "Sonde en direct des outils PATH et de php -m (lecture seule)",
    "toolsProbed": "Outils sondés",
    "notFound": "Introuvable",
    "available": "Disponible",
    "moduleCount": "Modules",
    "installNodeV": "Installer Node {{v}}",
    "installPhpV": "Installer PHP {{v}}",
    "installPythonV": "Installer Python {{v}}",
    "installGoV": "Installer Go {{v}}",
    "installRustV": "Installer Rust {{v}}",
    "pythonMissing": "Python n'est pas installé",
    "goMissing": "Go n'est pas installé",
    "rustMissing": "Rust/cargo n'est pas installé",
    "tuneLoadFailed": "Échec du chargement du réglage",
    "availableCount": "{{n}} disponible(s)",
    "notDetected": "Non détecté",
    "binaryPath": "Chemin du binaire",
    "targetMissing": "Version cible non installée",
    "targetMissingHint": "La cible {{version}} n’est pas sur cet hôte. Liez une version installée ou installez cette version.",
    "target": "Cible",
    "tune": "Régler",
    "loadedShort": "Chargé",
    "host": "Hôte",
    "tabOverviewInstall": "Vue d'ensemble",
    "tabTune": "Réglage",
    "probeReadonlyInstall": "Lecture seule · sonder à nouveau après installation",
    "hostDefault": "Défaut de l'hôte",
    "panelSupport": "Prise en charge du panneau",
    "ready": "Prêt",
    "notDetectedYet": "Pas encore détecté",
    "install": "Installer",
    "installHint": "Nécessite les droits de modification système et admin ; installer la toolchain ≠ le projet est public",
    "panelTune": "Réglage du panneau",
    "panelTuneDesc": "Gestion en écriture ; injection d'env au déploiement",
    "bindVersion": "Épingler la version",
    "onePerRow": "Un paramètre par ligne",
    "zeroAll": "0 = tous",
    "custom": "Personnalisé",
    "extraEnv": "Variables d'environnement supplémentaires",
    "extraEnvHint": "Une KEY=value par ligne",
    "customEnv": "Env personnalisé",
    "envPreview": "Aperçu de l'env",
    "envPreviewDesc": "Résultat fusionné après enregistrement / dernier chargement",
    "unsupported": "Non pris en charge",
    "tuneSaved": "Réglages enregistrés",
    "nodeDetectedHint": "Node détecté sur l'hôte ; la réinstallation dépend des privilèges et peut écraser.",
    "nodeProbeAfter": "Après l'installation, relancer la détection pour confirmer le PATH et la version.",
    "installNodeVBtn": "Installer Node {{version}}",
    "installPhpVBtn": "Installer PHP {{version}}",
    "phpIniSteps1": "Définir les valeurs globales dans l'onglet php.ini et enregistrer",
    "phpIniSteps2": "Optionnel : appliquer au système (écrit dans /etc/php/…/conf.d, nécessite root)",
    "phpIniSteps3": "Le déploiement du projet injecte l'ini fusionné en php_admin_* sur le pool FPM",
    "phpIniSteps4": "Les projets peuvent remplacer des clés individuelles (Projet → Déployer)",
    "phpIniNote": "Les modifications sont d'abord enregistrées dans le dataDir du panneau ; Appliquer au système copie vers /etc/php et recharge FPM. Les pools de projet injectent php_admin_value au déploiement.",
    "phpIniLoading": "Chargement du formulaire php.ini…",
    "phpIniEmpty": "Catalogue vide — recharger ou vérifier que l'API est disponible.",
    "reloadForm": "Recharger le formulaire",
    "savePhpIni": "Enregistrer php.ini",
    "prodUseProjects": "La production doit utiliser les Projets",
    "prodPathDesc": " : créer un projet PHP → déployer/appliquer FPM (pool = utilisateur Linux du projet + home isolé)",
    "systemDemo": "démo/outils au niveau système",
    "demoNotBind": "(nom de pool saisi manuellement) et ne lie pas automatiquement l'isolation du projet. Le php.ini global se trouve dans l'onglet php.ini.",
    "applyOkWritten": "Succès de l'application = fichiers écrits. Préférer le déploiement projet pour que User=utilisateur Linux du projet.",
    "applyPhpVhost": "Appliquer le vhost / pool PHP",
    "applyPhpVhostTitle": "Besoin de confirmation – écrit les fichiers pool/vhost",
    "applyPhpVhostDesc": "Écrira le pool {{pool}} et le vhost {{domain}}. Services de rechargement : {{reload}}.",
    "reprobeTools": "Relancer la détection des outils",
    "pressReprobe": "Appuyez sur Relancer la détection des outils pour charger",
    "installNodeLabel": "Installer Node {{v}}",
    "installPhpLabel": "Installer PHP {{v}}",
    "installPythonLabel": "Installer Python {{v}}",
    "installGoLabel": "Installer Go {{v}}",
    "installRustLabel": "Installer Rust {{v}}",
    "readShort": "Lecture",
    "pressReprobeHost": "Appuyez sur Relancer la détection pour charger la matrice des versions de l'hôte",
    "installScriptNote": "Écrit le script d'installation ; s'exécute uniquement avec les privilèges. Les réglages sont dans l'onglet Réglages ; redéployer les projets pour les changements de processus.",
    "envNote": "Node : max-old-space-size est fusionné dans NODE_OPTIONS. Go/Python/Rust utilisent les variables d'environnement officielles.",
    "saveTune": "Enregistrer les réglages",
    "pressReprobeLoad": "Appuyez sur Relancer la détection des outils pour charger",
    "installJavaLabel": "Installer / mettre à jour OpenJDK",
    "installKotlinLabel": "Installer / mettre à jour Kotlin",
    "installBunLabel": "Installer / mettre à jour Bun",
    "javaMissing": "Java (OpenJDK) non détecté",
    "kotlinMissing": "Compilateur Kotlin non détecté",
    "bunMissing": "Bun non détecté",
    "phpIniCatalog": {
      "groups": {
        "resource": {
          "title": "Limites de ressources",
          "description": "Limites de mémoire, de temps d'exécution et d'entrée"
        },
        "upload": {
          "title": "Upload et POST",
          "description": "Téléversements de fichiers et taille du corps POST"
        },
        "session": {
          "title": "Session",
          "description": "Stockage de session et cookies"
        },
        "error": {
          "title": "Erreurs et journalisation",
          "description": "Affichage des erreurs, journalisation et niveau de rapport"
        },
        "opcache": {
          "title": "OPcache",
          "description": "Cache de bytecode"
        },
        "security": {
          "title": "Sécurité et chemins",
          "description": "Fichiers distants, exposition et fonctions désactivées"
        },
        "locale": {
          "title": "Fuseau horaire et jeu de caractères"
        },
        "misc": {
          "title": "Autres paramètres courants"
        }
      },
      "fields": {
        "memory_limit": {
          "label": "Limite de mémoire",
          "hint": "ex. 128M, 256M, 512M, -1 (illimité)"
        },
        "max_execution_time": {
          "label": "Temps d'exécution max",
          "hint": "Secondes ; 0 = illimité (CLI)"
        },
        "max_input_time": {
          "label": "Temps d'entrée max",
          "hint": "Secondes ; durée max. pour analyser la requête"
        },
        "max_input_vars": {
          "label": "Variables d'entrée max",
          "hint": "Limite pour les variables $_GET / $_POST / $_COOKIE"
        },
        "max_input_nesting_level": {
          "label": "Niveau d'imbrication max. des entrées"
        },
        "file_uploads": {
          "label": "Autoriser les téléversements de fichiers"
        },
        "upload_max_filesize": {
          "label": "Taille max. des fichiers téléversés"
        },
        "post_max_size": {
          "label": "Taille max. des POST",
          "hint": "Doit être ≥ à la taille max. des fichiers téléversés"
        },
        "max_file_uploads": {
          "label": "Fichiers max. par requête"
        },
        "session_save_handler": {
          "label": "Gestionnaire de sauvegarde de session"
        },
        "session_gc_maxlifetime": {
          "label": "Durée de vie de la session (secondes)",
          "hint": "Secondes"
        },
        "session_cookie_httponly": {
          "label": "Cookie HttpOnly"
        },
        "session_cookie_secure": {
          "label": "Cookie Secure (HTTPS uniquement)",
          "hint": "Recommandé pour les sites HTTPS"
        },
        "session_use_strict_mode": {
          "label": "Mode strict des sessions"
        },
        "display_errors": {
          "label": "Afficher les erreurs (sur la page)",
          "hint": "Désactiver en production"
        },
        "display_startup_errors": {
          "label": "Afficher les erreurs de démarrage"
        },
        "log_errors": {
          "label": "Journaliser les erreurs"
        },
        "error_reporting": {
          "label": "Niveau de rapport d'erreurs",
          "hint": "Ou un entier tel que 32767"
        },
        "error_log": {
          "label": "Chemin du journal d'erreurs",
          "hint": "Vide = défaut système ; chemin absolu autorisé"
        },
        "opcache_enable": {
          "label": "Activer OPcache"
        },
        "opcache_enable_cli": {
          "label": "Activer OPcache pour le CLI"
        },
        "opcache_memory_consumption": {
          "label": "Mémoire OPcache (Mo)",
          "hint": "Unité : Mo"
        },
        "opcache_interned_strings_buffer": {
          "label": "Tampon des chaînes internées (Mo)"
        },
        "opcache_max_accelerated_files": {
          "label": "Fichiers accélérés max."
        },
        "opcache_validate_timestamps": {
          "label": "Valider les horodatages",
          "hint": "En production, vous pouvez désactiver et recharger manuellement"
        },
        "opcache_revalidate_freq": {
          "label": "Fréquence de revalidation (secondes)"
        },
        "allow_url_fopen": {
          "label": "Autoriser fopen via URL"
        },
        "allow_url_include": {
          "label": "Autoriser include via URL"
        },
        "expose_php": {
          "label": "Exposer l'en-tête de version PHP"
        },
        "open_basedir": {
          "label": "Restriction de chemin open_basedir",
          "hint": "Vide = aucune limite ; séparer les chemins par :"
        },
        "disable_functions": {
          "label": "Fonctions désactivées",
          "hint": "Séparées par des virgules ; trop strict peut casser des paquets"
        },
        "date_timezone": {
          "label": "Fuseau horaire"
        },
        "default_charset": {
          "label": "Jeu de caractères par défaut"
        },
        "short_open_tag": {
          "label": "Autoriser les balises d'ouverture courtes (<?)"
        },
        "realpath_cache_size": {
          "label": "Taille du cache realpath"
        },
        "realpath_cache_ttl": {
          "label": "TTL du cache realpath (secondes)"
        },
        "cgi_fix_redirect": {
          "label": "Correction de redirection de chemin CGI"
        }
      },
      "options": {
        "sessionFiles": "Fichiers",
        "sessionRedis": "Rédis",
        "sessionMemcached": "Memcaché",
        "errorReportingProd": "Production (E_ALL moins deprecated/strict)",
        "errorReportingAll": "Tout (E_ALL)",
        "errorReportingQuiet": "Plus silencieux (sans NOTICE/DEPRECATED)",
        "errorReportingMinimal": "Erreurs / avertissements / analyse uniquement",
        "errorReportingOff": "Désactivé (0)",
        "openBasedirNone": "Aucune restriction (vide)",
        "openBasedirVarWww": "/var/www",
        "openBasedirHome": "/home",
        "openBasedirWwwTmp": "/var/www et /tmp",
        "errorLogDefault": "Valeur système par défaut (vide)",
        "errorLogPhp": "/var/log/php/error.log",
        "errorLogFpm": "Chemin du journal FPM",
        "errorLogSyslog": "journal système"
      },
      "disableFn": {
        "groups": {
          "process": "Exécution de processus",
          "dynamic": "Chargement dynamique",
          "info": "Divulgation d'informations",
          "filesystem": "Système de fichiers",
          "network": "Réseau / autre"
        },
        "extraHint": "Hors catalogue (déjà présent sur l'hôte)",
        "customPlaceholder": "Autre nom de fonction…",
        "searchPlaceholder": "Rechercher des fonctions…",
        "emptyText": "Aucune correspondance"
      }
    },
    "pluginsAvailableTitle": "Disponibles à installer",
    "pluginsInstalledTitle": "Installés sur l'hôte",
    "pluginsInstalledHint": "Détecté dans le PATH ; exclu de la sélection d'installation. La désinstallation est au mieux effort.",
    "pluginsAllInstalled": "Tous les outils du catalogue sont déjà présents sur cet hôte.",
    "pluginStatusInstalled": "Installé",
    "pluginUninstall": "Désinstaller",
    "pluginUninstallConfirmTitle": "Désinstaller l'outil ?",
    "pluginUninstallConfirm": "Retirer « {{name}} » de cet hôte (via npm/apt/pip selon le cas). Arrêtez d'abord les services qui en dépendent.",
    "pluginUninstalled": "{{name}} désinstallé",
    "pluginUninstallFailed": "Échec de la désinstallation de {{name}}",
    "pluginUninstallBlocked": "Le panneau ne peut pas désinstaller (nécessite root + EXECUTE)",
    "phpExtAlreadyOnHost": "Extensions installées",
    "pluginsInstallSelected": "Installer la sélection ({{n}})",
    "pluginInstallOk": "{{n}} outil(s) installé(s)",
    "pluginInstallFailed": "Échec de l'installation de l'outil",
    "phpExtUninstallHint": "Désinstaller les extensions optionnelles (apt remove ; jamais FPM/CLI)",
    "phpExtUninstallConfirmTitle": "Désinstaller l'extension PHP ?",
    "phpExtUninstallConfirm": "Va exécuter apt remove « {{pkg}} » ({{name}}). Le cœur FPM/CLI n'est jamais supprimé.",
    "phpExtOpsTitle": "Résultat des opérations d'extensions",
    "pluginsOpsTitle": "Résultat des opérations d'outils",
    "pluginBatchUninstall": "Désinstaller la sélection ({{n}})",
    "pluginBatchUninstallConfirm": "Désinstaller les {{n}} outils sélectionnés ?",
    "pluginBatchUninstalled": "{{n}} outil(s) désinstallé(s)",
    "pluginBatchLabel": "outils sélectionnés",
    "addonsInstallAbove": "Utilisez « Installer la sélection… » ci-dessus pour les outils/extensions. Ce bouton installe/confirme uniquement la version du runtime.",
    "phpExtInstallSelected": "Installer les extensions sélectionnées ({{n}})",
    "phpExtInstallNote": "Sélectionnez les extensions puis Installer la sélection. Pour un premier PHP, utilisez Installer PHP ci-dessous (cœur+ext) ; une fois installé, seul le bouton des extensions s'affiche.",
    "phpExtInstallNoteInstalled": "Sélectionnez les extensions puis Installer la sélection. Cette version est déjà sur l'hôte — pas de réinstallation du runtime.",
    "phpExtInstallNoteFirst": "PHP {{version}} n'est pas installé : sélectionnez les extensions puis utilisez Installer PHP {{version}} ci-dessous (un seul bouton d'installation, cœur+extensions).",
    "installPhpWithExt": "Installer PHP {{version}} (avec les extensions sélectionnées)",
    "installLogTitle": "Journal d'installation (en direct)",
    "installLogStreaming": "Diffusion…",
    "installLogDone": "Terminé",
    "installLogWaiting": "En attente de la sortie du serveur…",
    "activeDefault": "par défaut",
    "switchDefaultBtn": "Définir la valeur par défaut de l'hôte sur {{version}}",
    "switchDefaultHint": "Cette version est installée mais n'est pas la version par défaut active",
    "installedNotActive": "{{version}} installée (non par défaut)",
    "multiVersionHint": "Go/Rust conservent plusieurs versions : installez les manquantes, puis basculez la version par défaut pour le PATH",
    "tabProcesses": "Processus",
    "pm2": {
      "title": "Flotte PM2",
      "desc": "Vue en lecture seule de pm2 jlist (PM2_HOME de l’utilisateur du panneau). Actualisation SSE en direct toutes les 2 s.",
      "glossary": "PM2 = gestionnaire de processus ; SSE = diffusion en direct.",
      "live": "En direct",
      "installed": "PM2 installé",
      "version": "version pm2",
      "path": "chemin pm2",
      "counts": "Processus",
      "countsValue": "{{n}} au total · {{run}} en ligne · {{stop}} arrêtés · {{err}} en erreur",
      "updatedAt": "Dernière actualisation",
      "notInstalled": "PM2 n’est pas dans le PATH.",
      "installHint": "Installer le plugin compagnon dans Vue d’ensemble",
      "tableTitle": "Liste des processus",
      "yskOnly": "Applications YSK uniquement (ysk-*)",
      "filterPh": "Filtrer nom / script / pid…",
      "emptyTitle": "PM2 non disponible",
      "emptyDesc": "Installez le plugin pm2 pour Node, puis actualisez.",
      "noApps": "Aucun processus",
      "noAppsDesc": "Aucune application PM2 pour l’utilisateur du panneau",
      "streamLog": "Journal des ticks en direct",
      "streamLogDesc": "Une ligne par tick SSE (pas la sortie standard des processus).",
      "col": {
        "name": "Nom",
        "status": "Statut",
        "mem": "Mémoire",
        "restarts": "Redémarrages",
        "uptime": "Disponibilité",
        "mode": "Mode",
        "script": "Scénario",
        "interpreter": "Interprète",
        "user": "Utilisateur",
        "unit": "Unité",
        "runtime": "Durée d'exécution",
        "pid": "PID"
      },
      "projectsTitle": "Processus des projets YSK",
      "projectsDesc": "Unités systemd pour les projets du panneau (chemin de déploiement par défaut — pas PM2).",
      "projectsCount": "Projets YSK",
      "noProjects": "Aucun projet",
      "noProjectsDesc": "Aucun projet node/bun dans le panneau, ou utilisateur OS non provisionné.",
      "pm2OnlyDesc": "Uniquement les applications démarrées avec PM2 sous l’utilisateur du panneau. Les déploiements systemd apparaissent ci-dessus.",
      "startupTitle": "Démarrer au démarrage",
      "startupDesc": "Enregistrez PM2 pour que les processus reviennent après le redémarrage.",
      "systemdActionsHint": "Les actions systemd nécessitent root et YSK_EXECUTE.",
      "startupOk": "Démarrage enregistré. {{notes}}",
      "startupFail": "Impossible d'enregistrer le démarrage. {{notes}}",
      "actionOk": "{{action}} {{name}} — {{notes}}",
      "actionFail": "Impossible {{action}} {{name}}. {{notes}}",
      "startupReady": "Prêt",
      "startupReadyYes": "Oui",
      "startupReadyNo": "Non",
      "startupUnit": "Unité",
      "startupDump": "Décharge",
      "startupInstall": "Installer le démarrage",
      "startupSave": "Enregistrer la liste des processus",
      "actRestart": "Redémarrage",
      "actStop": "Arrêt",
      "actReload": "Recharger",
      "pm2ActionsHint": "Les actions PM2 s’appliquent uniquement à la liste de processus de l’utilisateur du panneau.",
      "noteUnparsed": "La liste PM2 n'a pas pu être analysée (sortie vide ou inattendue).",
      "notePanelUserOnly": "La liste PM2 est réservée à l'utilisateur du processus du panneau.",
      "noteProjectUnits": "{{n}} Unité(s) de projet YSK répertoriée(s)"
    },
    "recordedInstalled": "Enregistré {{v}}",
    "remoteSourceSuffix": "({{source}})",
    "nodePathYskMissingTitle": "Chemin Node géré non prêt",
    "nodePathYskMissing": "Le Node géré par YSK pour la version {{version}} n’est pas prêt. Relancez la sonde ou réinstallez.",
    "managedPathMissingTitle": "Le chemin géré {{name}} n'est pas prêt",
    "managedPathMissing": "{{name}} géré par YSK pour la version {{version}} n'est pas prêt. Re-sondez ou réinstallez.",
    "nodePathUnsafeTitle": "Le chemin Node n’est pas sûr",
    "nodePathUnsafe": "Le chemin {{path}} est hors de l’arborescence gérée ; les déploiements de projets peuvent échouer.",
    "recordedButProbeEmpty": "Le panneau a enregistré l’installation {{v}}, mais la sonde hôte n’a trouvé aucun binaire. Non installé — relancez la sonde ou réinstallez.",
    "installedLabel": "Installé",
    "installedHint": "Résultat de la sonde hôte - pas l'enregistrement du plan de contrôle",
    "targetHint": "Version que cette page va installer ou épingler",
    "panelDefaultHint": "Les nouveaux projets préfèrent la valeur par défaut du panneau {{version}} (la CLI hôte peut différer).",
    "rebuildFromHost": "Reconstruire l'enregistrement à partir de l'hôte",
    "rebuiltFromHost": "Enregistrement actualisé à partir de la sonde hôte",
    "tabTuning": "Réglage",
    "versionPlaceholder": "Dernier,",
    "pluginsBundleWithRuntime": "Outils「Installer le runtime」Installer（Installer）。",
    "tabSoftware": "Logiciels",
    "overviewSoftwareHint": "Installez les versions, définissez l'hôte par défaut et désinstallez-le à partir du",
    "versionReadyTitle": "{{name}} {{version}} est prêt",
    "versionReadyHint": "Vous pouvez définir l'hôte par défaut ou le désinstaller à partir de cet onglet.",
    "softwareVersionTitle": "Version {{version}}",
    "setHostDefault": "Définir comme hôte par défaut",
    "alreadyHostDefault": "{{version}} est la valeur par défaut de l'hôte",
    "setHostDefaultConfirmTitle": "Définir la valeur par défaut de l'hôte sur {{version}} ?",
    "setHostDefaultConfirm": "La CLI système (node/go/…) pointera vers {{version}}. Les projets qui épinglent une version restent inchangés.",
    "hostDefaultUnsupported": "Ce moteur d'exécution ne prend pas en charge le changement d'hôte par défaut dans le panneau. Utilisez une épingle au niveau de l'installation ou du projet.",
    "versionInventory": "Inventaire des versions",
    "versionInventoryDesc": "Toutes les versions prises en charge par le panneau. Sélectionnez une ligne à installer ou à définir par défaut.",
    "selectToInstall": "Sélectionner",
    "advancedFeatureUninstall": "Avancé : supprimez toute la pile {{name}}…",
    "advancedFeatureUninstallHint": "Supprime toutes les versions {{name}} gérées par le panneau (et les compagnons comme PM2 pour Node), avec aperçu d'impact et double confirmation. Préférez supprimer les versions uniques ci-dessus lorsque cela est possible.",
    "probeReadonly": "Sonde en lecture seule de l'hôte",
    "uninstallVersion": "Désinstaller {{version}}",
    "uninstallVersionTitle": "Désinstaller {{version}} ?",
    "uninstallVersionConfirm": "Supprimez les {{name}} {{version}} gérés de cet hôte (chemin d'installation YSK ou chaîne d'outils rustup). S'il s'agissait de la valeur par défaut de l'hôte, les liens symboliques CLI pour ce runtime seront effacés. Les projets qui épinglent une autre version restent inchangés.",
    "uninstallVersionDone": "Désinstallé {{version}}",
    "uninstallVersionUnsupported": "La désinstallation par version n'est pas encore disponible pour ce runtime.",
    "setPanelDefault": "Définir comme panneau par défaut",
    "alreadyPanelDefault": "Valeur par défaut du panneau · {{version}}",
    "panelDefaultSaved": "Le panneau est défini par défaut sur {{version}}",
    "panelDefaultExplain": "Panel par défaut = version préférée pour les nouveaux sites/projets. Hôte par défaut = système CLI (php/python/node…).",
    "stackReadyTitle": "{{name}} pile prête",
    "softwareIntro": "Gérez les versions installées, la CLI hôte par défaut et la version préférée pour les nouveaux projets.",
    "panelDefaultLabel": "Valeur par défaut du panneau",
    "panelDefaultNone": "Non défini",
    "versionsTitle": "Versions",
    "versionsDesc": "Sélectionnez une version. Installez, définissez la CLI hôte ou définissez les paramètres par défaut du panneau à partir de la ligne.",
    "roleHost": "Hôte",
    "rolePanel": "Panneau",
    "rowUninstall": "Supprimer cette version",
    "moreActions": "Plus de propositions",
    "selectedVersion": "Sélectionné · {{version}}",
    "selectedInstalledDesc": "Outils complémentaires ci-dessous. Supprimez cette version uniquement si vous n'en avez plus besoin.",
    "selectedMissingDesc": "Installez cette version sur l'hôte. Des outils compagnons peuvent être ajoutés après l'installation.",
    "path": "Chemin",
    "fullVersion": "Version complète",
    "useListForDefaults": "Pour modifier la valeur par défaut de l'hôte ou du panneau, ou supprimer cette version, utilisez la liste ci-dessus.",
    "alreadyHostDefaultShort": "Défaut de l'hôte",
    "installRecordedCta": "Installation enregistrée {{v}}",
    "needsInstall": "à installer",
    "needsInstallHint": "Pas sur cet hôte. Installez-le ou choisissez une version déjà présente.",
    "unitBytes": "octets",
    "headerSizeKb": "{{n}} Ko",
    "phpIniChipEmpty": "Non chargé — ouvrez l’onglet php.ini",
    "phpFpmService": "PHP-FPM",
    "phpFpmServiceDesc": "Démarrer, arrêter, recharger ou redémarrer l’unité PHP-FPM",
    "rustupDefaultMissingTitle": "Pas de chaîne d’outils rustup par défaut",
    "rustupDefaultMissing": "rustup n’a pas de défaut. Définissez stable dans l’onglet Logiciel.",
    "rustupDefaultMissingShort": "Aucune chaîne d'outils par défaut",
    "rustupSetDefaultHint": "Définir la chaîne d'outils par défaut",
    "uninstalledCountHint": "{{n}} version(s) absente(s) de cet hôte"
  },
  "search": {
    "placeholder": "Rechercher des pages et des ressources…",
    "aria": "Recherche globale",
    "results": "Résultats de la recherche",
    "loading": "Recherche…",
    "noResults": "Aucune correspondance",
    "kinds": {
      "page": "Pages",
      "project": "Projets",
      "email": "E-mail",
      "mailbox": "Boîtes aux lettres",
      "ssl": "SSL",
      "dns": "DNS",
      "nginx": "Nginx",
      "share": "Actions",
      "ftp": "FTP",
      "mysql": "MySQL",
      "postgres": "PostgreSQL",
      "redis": "Rédis",
      "cron": "Cron",
      "user": "Utilisateurs",
      "other": "Autre"
    },
    "alias": {
      "ssl": "certificat certificat certificats",
      "projects": "chantiers"
    }
  },
  "security": {
    "title": "Sécurité et approbations",
    "allowlist": "Liste d’autorisation des outils (lecture seule par défaut ; risque élevé nécessitant une approbation humaine)",
    "llmUntrusted": "La sortie du LLM est toujours non fiable et ne doit jamais s’exécuter directement",
    "pending": "Approbations en attente",
    "runSysInfo": "Exécuter sys.info",
    "none": "Aucune approbation en attente",
    "pillPending": "{{count}} en attente",
    "pillReady": "Prêt",
    "pill2faOff": "2FA désactivée",
    "stat2fa": "2FA",
    "statApi": "API",
    "statApiSessions": "Sessions API",
    "revokeOtherTitle": "Déconnexion {{n}} autre(s) session(s)",
    "statSsh": "SSH",
    "statSshValue": "{{keys}} clés · {{auth}} autorisé",
    "statSshHint": "Identités sortantes / clés de connexion autorisées",
    "statPending": "En attente",
    "on": "Activé",
    "off": "Désactivé",
    "output": "Sortie",
    "tabAccount": "Ma sécurité",
    "tabApiKeys": "Clés API",
    "tabSsh": "SSH",
    "tabApprovals": "Approbations",
    "tabAllowlist": "Outils agent",
    "apiTokenOnce": "Jeton API (affiché une seule fois) :",
    "copiedToken": "Jeton copié",
    "totpTitle": "Double authentification (TOTP)",
    "totpStatus": "Statut : ",
    "totpEnabled": "Activé",
    "totpEnrolledUnconfirmed": "En cours — scannez et confirmez",
    "totpNotSet": "Non défini",
    "totpLead": "La connexion nécessite un code à 6 chiffres de l'application.",
    "totpWhy1": "Un mot de passe volé ne suffit pas pour se connecter sans le code de l'application",
    "totpWhy2": "Les actions sensibles peuvent redemander le TOTP (step-up)",
    "totpWhy3": "Compatible avec Google Authenticator, Authy, NordPass, 1Password et d'autres",
    "totpAppsHint": "Applications suggérées : Google Authenticator, Authy, Microsoft Authenticator, NordPass, 1Password",
    "totpStepsLabel": "Étapes de configuration",
    "totpStepReauth": "Vérifier le mot de passe",
    "totpStepScan": "Scanner le QR / saisir la clé",
    "totpStepConfirm": "Confirmer le code à 6 chiffres",
    "totpStepBackup": "Enregistrer les codes de récupération",
    "totpScanTitle": "Scanner le code QR",
    "totpScanHint": "Ouvrez votre application d'authentification → Ajouter un compte → Scannez ce QR.",
    "totpManualTitle": "Ou saisissez la clé manuellement",
    "totpManualHint": "Si vous ne pouvez pas scanner, choisissez la saisie manuelle dans l'application et collez ce secret Base32.",
    "totpShowOtpauth": "Afficher l'URL otpauth:// (avancé)",
    "totpQrAlt": "Code QR de configuration TOTP",
    "totpQrFailed": "Impossible d'afficher le QR — utilisez la clé secrète ci-dessous",
    "totpSecretCopied": "Secret copié",
    "hideSecret": "Masquer le secret",
    "showSecret": "Afficher le secret",
    "totpEnabledDesc": "Activé.",
    "totpRecoveryRemaining": "{{n}} codes de récupération restants",
    "totpResetSummary": "Réinitialiser ou désactiver la 2FA…",
    "totpResetHint": "La réinitialisation génère un nouveau QR/secret (les anciennes entrées de l'application cessent de fonctionner)",
    "totpDisableCodeHint": "Code à 6 chiffres de l'application ou code de récupération",
    "disable2fa": "Désactiver la 2FA",
    "totpDisabledOk": "Double authentification désactivée",
    "reauthPassword": "Ressaisir le mot de passe",
    "reauthPasswordHint": "Démarrer/réinitialiser la 2FA nécessite à nouveau le mot de passe (protection contre les sessions volées)",
    "reauthPasswordRequired": "Saisissez d'abord votre mot de passe de connexion",
    "needCurrentPassword": "Entrez d'abord le mot de passe actuel",
    "passwordMin8": "Le nouveau mot de passe doit comporter au moins 8 caractères",
    "totpSecretGenerated": "Secret prêt — scannez le QR ou copiez la clé, puis saisissez le code à 6 chiffres de l'application",
    "reset2fa": "Réinitialiser la 2FA",
    "start2fa": "Configurer la 2FA",
    "secretLabel": "Secret : ",
    "confirmCode": "Code à 6 chiffres de l'application",
    "confirmCodeHint": "Après le scan, saisissez les 6 chiffres actuellement affichés dans votre authentificateur.",
    "confirmCodeInvalid": "Saisissez un code de vérification à 6 chiffres",
    "totpEnabledSaveCodes": "2FA activée — enregistrez dès maintenant les codes de récupération ci-dessous (affichés une seule fois)",
    "confirmEnable": "Confirmer et activer",
    "recoveryCodesHint": "Les codes de récupération ne s'affichent qu'une seule fois",
    "copiedRecoveryCodes": "Codes de récupération copiés",
    "downloadRecovery": "Télécharger .txt",
    "recoveryDownloaded": "Fichier des codes de récupération téléchargé",
    "copyAll": "Tout copier",
    "savedClose": "Je les ai enregistrés — terminé",
    "sessionsTitle": "Séances",
    "sessionsDesc": "",
    "revokeOtherSessions": "Déconnecter les autres appareils",
    "revokedOtherSessions": "Déconnexion de {{count}} autre(s) session(s)",
    "noSessions": "Aucune session active",
    "currentSession": "Cet appareil",
    "revoke": "Se déconnecter",
    "passkeyTitle": "Clé d'accès/WebAuthn",
    "passkeyDesc": "",
    "passkeyRegistered": "Passkey enregistrée",
    "webauthnFailed": "Échec WebAuthn",
    "webauthnUnsupported": "Cette page n'a pas d'API WebAuthn. Dans Brave/Chrome/Firefox, évitez les modes restreints ; utilisez un gestionnaire de mots de passe si besoin, et ouvrez le panneau sur un domaine en HTTPS.",
    "webauthnInsecureContext": "Cette page n'est pas un contexte sécurisé ({{origin}}). Les navigateurs exigent HTTPS ou localhost pour les passkeys — sans lien avec Brave/NordPass. Ouvrez plutôt https://votre-domaine.",
    "webauthnIpHost": "Vous avez ouvert le panneau via une IP ({{origin}}). WebAuthn interdit l'IP comme RP ID, donc Brave/NordPass échouera. Associez un domaine + HTTPS (ex. https://panel.example.com) et réessayez.",
    "webauthnEnvOk": "Passkey prête ({{origin}})",
    "webauthnEnvCurrent": "Page actuelle : {{origin}}",
    "webauthnCancelled": "Annulé ou expiré. Réessayez.",
    "webauthnUnavailableHint": "La passkey nécessite HTTPS + domaine.",
    "registerPasskey": "Enregistrer une passkey",
    "noPasskey": "Aucune passkey",
    "passkeyVerifyOk": "Passkey vérifiée (step-up effectué)",
    "verifyFailed": "Échec de la vérification",
    "verifyWithPasskey": "Vérifier avec passkey (step-up)",
    "passkeyHint": "Pour le step-up à haut risque ; nécessite HTTPS + domaine.",
    "devicesTitle": "Appareils / sauvegarde",
    "devicesDesc": "",
    "viewTrustedDevices": "Voir les appareils de confiance",
    "trustedDevicesCount": "Appareils de confiance : {{count}}",
    "revokeAllDevices": "Révoquer tous les appareils",
    "revokedAllDevices": "Tous les appareils de confiance ont été révoqués",
    "export2faBackup": "Exporter la sauvegarde 2FA chiffrée",
    "fail2banSnippetMsg": "Extraits fail2ban : {{written}} — {{notes}}",
    "generatefail2ban": "Générer les extraits fail2ban",
    "generateFail2ban": "Générer les extraits fail2ban",
    "adminPolicyTitle": "Politique 2FA admin",
    "adminPolicyDesc": "",
    "requireAdmin2fa": "Exiger la 2FA admin",
    "strictAdmin2fa": "Strict : bloquer la connexion sans 2FA",
    "confirmTotpPolicy": "Confirmer le TOTP (lors d'un changement de politique)",
    "confirmTotpPolicyHint": "L'activation de la politique nécessite un step-up",
    "totp6digitPlaceholder": "Code à 6 chiffres",
    "policyUpdated": "Politique de sécurité mise à jour",
    "savePolicy": "Enregistrer la politique",
    "recentProbe": "Sonde récente",
    "apiKeysTitle": "Clés d'accès API",
    "apiKeysDesc": "",
    "createKey": "+ Créer une clé",
    "colName": "Nom",
    "colPrefix": "Préfixe",
    "colCreated": "Créé",
    "apiKeysEmpty": "Aucune clé API pour l'instant",
    "apiKeysEmptyHint": "Créez depuis la barre d'outils ; puis appelez l'API avec un jeton Bearer",
    "approve": "Approuver",
    "allowlistTitle": "Outils agent ({{count}})",
    "allowlistEmpty": "Aucun outil dans le catalogue",
    "totpStatusLoadFailed": "Impossible de charger l’état 2FA",
    "createApiKeyTitle": "Créer une clé API",
    "createApiKeyDesc": "Le jeton complet n'est affiché qu'une seule fois après la création",
    "createKeyBtn": "Créer la clé",
    "apiKeyNameHint": "Facile à reconnaître, ex. CI / script de sauvegarde",
    "apiKeyScope": "Portée",
    "apiKeyScopeHint": "read = lecture seule (pas de mutation complète)",
    "scopeFull": "full (API complète)",
    "scopeRead": "read (lecture seule)",
    "apiKey2faHint": "Si la 2FA est activée, la création d'une clé nécessite un code de vérification (step-up).",
    "apiKeyCreated": "Clé API créée",
    "export2faBackupTitle": "Exporter la sauvegarde 2FA",
    "createApiKeyStepUp": "Créer une clé API · step-up",
    "enterTotpCode": "Saisir le code TOTP actuel",
    "export": "Exporter",
    "backupCopied": "Sauvegarde chiffrée copiée dans le presse-papiers (conserver hors ligne)",
    "digit6Placeholder": "Code à 6 chiffres",
    "ssh": {
      "workspaceTitle": "Espace de travail SSH",
      "workspaceDesc": "Sélectionnez d'abord un job",
      "subOutbound": "Identités sortantes",
      "subOutboundHint": "Clés privées pour les connexions sortantes panel/projet",
      "subLogin": "Authentification de connexion",
      "subLoginHint": "Qui peut se connecter en SFTP/SSH",
      "sub2fa": "2FA de connexion",
      "sub2faHint": "TOTP SSH (≠ 2FA du panel)",
      "subSshd": "sshd système",
      "subSshdHint": "Paramètres SFTP de l'utilisateur projet",
      "jobOutboundTitle": "Connexion sortante",
      "jobOutboundDesc": "Créer des clés d'identité sortantes · pair panel / git projet",
      "jobLoginTitle": "Autoriser la connexion entrante",
      "jobLoginDesc": "Enregistrer les clés publiques dans le home projet · authorized_keys",
      "job2faTitle": "La connexion SSH nécessite la 2FA",
      "job2faDesc": "TOTP utilisateur Linux (distinct de la 2FA du panel)",
      "jobSshdTitle": "Activer le SFTP système",
      "jobSshdDesc": "Installer les extraits Match sshd (utilisateurs projet)",
      "purposePanel": "Panel vers d'autres hôtes",
      "purposeUser": "Sortant utilisateur projet",
      "purposeUnbound": "Objectif non défini",
      "purposePanelHint": "Pair de cluster, scp de sauvegarde, sondes distantes",
      "purposeUserHint": "Utilisateur Linux projet git / scp / scripts",
      "purposeDefaultHint": "Lier plus tard",
      "statusStored": "Stocké",
      "statusInstalled": "Sur disque",
      "statusVerified": "Vérifié",
      "statusMissing": "Absent du disque",
      "statusRetired": "Retiré",
      "statusError": "Erreur",
      "actionInstall": "Écrire sur disque",
      "actionTest": "Tester la connexion",
      "actionCopyPub": "Copier la clé publique",
      "pipelineStored": "Stocké",
      "pipelineInstalled": "Sur disque",
      "pipelineVerified": "Vérifié",
      "progressAria": "Progression",
      "loginTitle": "Autorisation de connexion (clés publiques)",
      "loginDesc": "Qui peut entrer",
      "loginAdd": "Ajouter une clé publique de connexion",
      "loginEmpty": "Aucune clé publique de connexion pour l'instant",
      "loginEmptyHint": "Collez une clé publique d'ordinateur portable ou de CI, liez-la à un utilisateur projet pour SFTP/SSH (nécessite un extrait sshd)",
      "loginAddFirst": "Ajouter la première clé publique de connexion",
      "boundProject": "Projet",
      "unboundProject": "Aucun projet",
      "loginRemoved": "Clé publique supprimée",
      "remove": "Supprimer",
      "loginModalTitle": "Autoriser une clé publique",
      "loginModalDesc": "Après sélection d’un projet, la clé est écrite dans le répertoire home/ de cet utilisateur Linux",
      "addAuth": "Ajouter une autorisation",
      "selectOption": "— Sélectionner —",
      "publicKey": "Clé publique",
      "publicKeyHint": "Collez la ligne complète, ex. ssh-ed25519 AAAA… commentaire",
      "commentOptional": "Commentaire (facultatif)",
      "commentPlaceholder": "ordinateur portable / CI",
      "loginNeedProject": "Créez d’abord un projet. La liaison fonctionne mieux lorsque l’utilisateur système est prêt.",
      "loginNeedPub": "Sélectionnez un projet et collez une clé publique commençant par ssh-",
      "loginNoProjects": "Aucun projet. Autorisez un utilisateur Linux existant (root / testeur) ci-dessous. L'écriture de /root/.ssh nécessite YSK_EXECUTE=1.",
      "loginLinuxHint": "Utilisé lorsqu'il n'y a pas de projet. Exemple : root ou testeur.",
      "loginAdded": "Ajouté",
      "sshdTitle": "SFTP utilisateur projet (sshd)",
      "sshdDesc": "Autoriser les utilisateurs projet ysks_* / ysk_* à utiliser SFTP avec des clés publiques",
      "sshdStep1": "Ajoutez des clés publiques sous Authentification de connexion pour les projets",
      "sshdStep2": "Prévisualisez et installez ici les extraits Match système",
      "sshdStep3": "L’installation nécessite les droits d’exécution système ; tentative de rechargement de sshd",
      "sshdPreview": "Aperçu de la configuration",
      "loadingSnippet": "(Chargement…)",
      "reloadedCopied": "Rechargé ; extrait copié dans le presse-papiers",
      "reloadAndCopy": "Recharger et copier",
      "installedOk": "Installé",
      "installToSystem": "Installer sur le système",
      "sshdManualHint": "Si l’exécution est bloquée, lancez le plan de contrôle avec les privilèges, ou placez l’extrait sous",
      "outboundTitle": "Clés d’identité sortantes",
      "outboundDesc": "Clés privées chiffrées dans le plan de contrôle",
      "outboundAdd": "Ajouter une identité sortante",
      "filterActive": "Actif",
      "filterPanel": "Panneau",
      "filterUser": "Utilisateur du projet",
      "filterRetired": "Retiré",
      "filterAll": "Tous",
      "searchIdentity": "Rechercher un nom ou une empreinte…",
      "searchIdentityAria": "Rechercher des identités",
      "identityCount": "{{count}} identités",
      "identityList": "Identités",
      "outboundEmpty": "Aucune identité sortante pour l’instant",
      "outboundEmptyFilter": "Aucun élément correspondant",
      "outboundEmptyHint": "Créez une clé en ~30 s : choisissez l’usage → nom → terminé. Pour pair / sauvegarde / git.",
      "outboundEmptyFilterHint": "Essayez de modifier les filtres ou d’effacer la recherche",
      "outboundAddFirst": "Ajouter la première identité sortante",
      "userPrefix": "Utilisateur {{user}}",
      "createFailed": "Échec de la création",
      "identityCreatedOnce": "Identité créée (clé privée affichée une seule fois)",
      "writtenToDisk": "Écrite sur le disque",
      "cannotWriteNeedExecute": "Impossible d’écrire sur le système : activez l’exécution (YSK_EXECUTE)",
      "notDone": "Non terminé",
      "installFailed": "Échec de l’installation",
      "testPassed": "Connexion OK",
      "testFailed": "Échec de la connexion",
      "testError": "Échec du test",
      "copiedPubPaste": "Clé publique copiée — collez-la dans authorized_keys du pair ou une clé de déploiement Git",
      "deletedNamed": "« {{name}} » supprimé",
      "rotated": "Rotation effectuée : ancienne clé retirée, nouvelle clé créée",
      "detailStatus": "Statut",
      "detailPurpose": "Usage",
      "detailLinuxUser": "Utilisateur Linux",
      "detailDiskPath": "Chemin disque",
      "detailLastTest": "Dernier test",
      "suggestFlow": "Suggestion : enregistrer → écrire sur le disque → placer la clé publique sur le pair → tester la connexion",
      "suggestFlowPrefix": "Suggestion : enregistrer → écrire sur le disque → placer ",
      "suggestFlowSuffix": " sur le pair → tester la connexion",
      "publicKeyStrong": "clé publique",
      "copiedPub": "Clé publique copiée",
      "allowLocalLogin": "Autoriser la connexion locale avec cette clé",
      "localLoginOk": "Clé publique ajoutée à l'autorisation de connexion locale",
      "testingConnection": "Test de la connexion…",
      "rotateKey": "Rotation de la clé",
      "wizStepPurpose": "À quoi sert cette clé ?",
      "wizStepProject": "Quel projet ?",
      "wizStepPanelConfirm": "Confirmer le trafic sortant du panneau",
      "wizStepName": "Nom et options",
      "wizStepPurposeDesc": "Choisissez l'usage pour aligner la liste et le chemin d'installation",
      "wizStepProjectDesc": "La clé est liée à l'utilisateur Linux et au home de ce projet",
      "wizStepPanelDesc": "La clé privée reste dans les secrets du plan de contrôle pour scp/ssh vers d'autres hôtes",
      "wizStepNameDesc": "Nom pour l'identification ; les options avancées peuvent attendre",
      "prevStep": "Retour",
      "nextStep": "Suivant",
      "createIdentity": "Créer l'identité",
      "purposePanelTitle": "Panel vers d'autres hôtes",
      "purposePanelSub": "Pair de cluster, sauvegarde distante, sondes",
      "purposePanelRec": "Recommandé pour la plupart des opérations d'administration",
      "purposeUserTitle": "Sortant utilisateur projet",
      "purposeUserSub": "git pull, scp de scripts projet",
      "purposeUserPath": "Écrit dans home/.ssh du projet",
      "selectProject": "— Sélectionner un projet —",
      "noProjectsHint": "Aucun projet pour l'instant — créez d'abord un projet et un utilisateur système",
      "afterCreatePub": "Après la création, placez la ",
      "afterCreatePubMid": " sur le ",
      "afterCreatePubEnd": ", puis utilisez Tester la connexion.",
      "privKeyStayLocal": "La clé privée reste sur ce plan de contrôle ; jamais dans les listes ni les journaux.",
      "displayName": "Nom d'affichage",
      "displayNameHint": "ex. : peer-prod, myapp-git",
      "algorithm": "Algorithme",
      "algoSuggested": "Recommandé",
      "algoLegacy": "Systèmes hérités",
      "installImmediately": "Écrire sur le disque immédiatement après la création",
      "installImmediatelyHint": "(nécessite l'exécution système ; sinon vous serez informé que l'application est impossible)",
      "savePrivTitle": "Enregistrer la clé privée maintenant",
      "savePrivDesc": "Après fermeture, la clé privée complète ne sera plus affichée",
      "copiedPriv": "Clé privée copiée",
      "copyPriv": "Copier la clé privée",
      "nextInstallDisk": "Suivant : écrire sur le disque",
      "savedCloseBtn": "Enregistré — fermer",
      "privKeyOnce": "Clé privée (cette fois uniquement)",
      "privSavedConfirm": "J'ai stocké la clé privée en sécurité (gestionnaire de mots de passe / sauvegarde hors ligne)",
      "testConnTitle": "Tester la connexion",
      "testConnDesc": "Essayer ssh … true avec cette identité. Le succès signifie seulement que cette cible est joignable.",
      "startTest": "Lancer le test",
      "testTarget": "Cible",
      "testTargetHint": "Format user@host ou user@host:port",
      "deleteIdentityTitle": "Supprimer l'identité ?",
      "rotateKeyTitle": "Rotation de la clé ?",
      "deleteIdentityDesc": "Supprimer « {{name}} » et tenter de retirer le fichier de clé privée sur le disque",
      "rotateKeyDesc": "« {{name}} » sera retirée et une nouvelle clé créée. Mettez à jour authorized_keys sur les pairs.",
      "rotate": "Rotation",
      "enrollStatusSecret": "Secret généré",
      "enrollStatusConfirmed": "Application confirmée",
      "enrollStatusWritten": "Écrit dans home",
      "enrollStatusRetired": "Retiré",
      "needProjectOrUser": "Sélectionnez un projet ou saisissez un nom d'utilisateur Linux",
      "enrollFailed": "Échec de l'enrôlement",
      "totpGenerated": "TOTP réservé à SSH généré (séparé de la 2FA du panneau sauf synchronisation)",
      "confirmed": "Confirmé",
      "codeWrong": "Code incorrect",
      "gaWritten": "Fichier .google_authenticator écrit",
      "needExecute": "Nécessite l'exécution système activée",
      "ssh2faTitle": "Second facteur de connexion SSH",
      "ssh2faDesc": "Protège la connexion ssh des utilisateurs Linux",
      "ssh2faStep1": "Enrôler le TOTP pour un utilisateur Linux (scanner le QR)",
      "ssh2faStep2": "Confirmer le code à 6 chiffres de l'app",
      "ssh2faStep3": "Écrire le fichier home",
      "ssh2faStep4": "Installer le module PAM et fusionner les extraits (ci-dessous)",
      "pkgLabel": "Paquet {{name}}",
      "pkgStatus": "Forfait {{status}}",
      "pamStatus": "PAM {{status}}",
      "kbdStatus": "clavier interactif sshd {{status}}",
      "light": {
        "green": "d'accord",
        "yellow": "vérifier",
        "red": "manquant"
      },
      "enrollForUser": "Enrôler la 2FA SSH pour l'utilisateur",
      "ssh2faEmpty": "Aucun utilisateur Linux n'a encore de 2FA SSH",
      "ssh2faEmptyHint": "Préférez d'abord la connexion par clé ;",
      "startEnroll": "Démarrer l'enrôlement",
      "fromPanelBadge": "Identique au panneau",
      "enterCode": "Saisir le code",
      "rewriteHome": "Réécrire le fichier home",
      "writeHome": "Écrire home",
      "retiredOk": "Retiré",
      "retire": "Retirer",
      "pamTitle": "Système : PAM / sshd (manuel ou appliquer si autorisé)",
      "pamDesc": "nullok évite de verrouiller les utilisateurs sans fichiers. Fichier écrit ≠ TOTP requis.",
      "pamSnippet": "Extrait PAM (fusionner dans /etc/pam.d/sshd)",
      "sshdHint": "Indications sshd",
      "rescueUsers": "Utilisateurs de secours (séparés par des virgules, jamais dans Match strict)",
      "strictPreview": "Aperçu Match strict (publickey+TOTP, mot de passe désactivé)",
      "copiedPam": "Extrait PAM copié",
      "copyPam": "Copier PAM",
      "applyStrict": "Appliquer Strict au système",
      "pamPkgHint": "Paquet : ",
      "pamRescueHint": ". Conservez au moins un admin de secours sans fichier 2FA (root par défaut).",
      "enrollModalTitle": "Enrôler la 2FA SSH",
      "enrollModalDesc": "Par défaut : secret indépendant (non partagé avec le panneau)",
      "generateShowSecret": "Générer et afficher le secret",
      "projectSuggested": "Projet (recommandé)",
      "orManualUser": "— ou saisir l'utilisateur manuellement —",
      "linuxUser": "Utilisateur Linux",
      "advancedSharePanel": "Avancé : utiliser le secret TOTP de l'opérateur actuel du panneau (tapez SHARED pour confirmer)",
      "setupAuthTitle": "Configurer l'authenticator",
      "setupAuthDesc": "Scannez ou saisissez le secret, puis confirmez avec le code à 6 chiffres de l'app",
      "later": "Plus tard",
      "confirmCodeBtn": "Confirmer le code",
      "secretBase32": "Secret (base32)",
      "copiedSecret": "Secret copié",
      "copySecret": "Copier le secret",
      "scanThenCode": "Si déjà scanné, saisissez le code à 6 chiffres actuel.",
      "verifyCode": "Code de vérification",
      "applyStrictStepUp": "Appliquer Strict · step-up",
      "enterPanelTotp": "Saisir le code TOTP actuel du panneau",
      "applyBtn": "Appliquer",
      "appliedOk": "Appliqué",
      "sharePanelTitle": "Partager le secret TOTP du panneau ?",
      "sharePanelDesc": "Risque élevé. Tapez SHARED pour confirmer.",
      "confirmString": "Chaîne de confirmation",
      "enableShare": "Activer le partage",
      "invalidPub": "Collez une ligne complète de clé publique OpenSSH (ssh-ed25519 / ssh-rsa / ecdsa…).",
      "dryRunOk": "Aperçu terminé. Vérifiez le contenu ci-dessous.",
      "strictDryRun": "Aperçu du mode strict",
      "errorNoDetail": "Échec du test (aucun détail)",
      "strictBlocked": "Le paquet ou PAM n’est pas prêt ; l’application Strict est désactivée.",
      "privCloseWithoutAck": "Fermé. La clé privée ne sera plus affichée ; générez-en un nouveau si vous ne l’avez pas enregistré."
    },
    "sessionsActive": "Sessions actives",
    "sessionsOther": "Autres appareils",
    "sessionsHint": "",
    "noSessionsHint": "Lorsque vous vous reconnecterez, cet appareil apparaîtra ici.",
    "sessionOtherBadge": "Autre",
    "sessionThisDevice": "Vous êtes ici",
    "sessionDeviceOn": "{{browser}} sur {{os}}",
    "sessionIpUnknown": "IP inconnue",
    "sessionLastActive": "Dernière activité {{when}}",
    "sessionStarted": "Connecté {{when}}",
    "sessionIdShort": "ID {{id}}…",
    "sessionJustNow": "à l’instant",
    "sessionMinAgo": "il y a {{n}} min",
    "sessionHourAgo": "il y a {{n}} h",
    "sessionDayAgo": "il y a {{n}} j",
    "revokeSessionTitle": "Déconnecter cet appareil ?",
    "revokeSessionDesc": "Terminer la session pour {{device}} ({{ip}}). Cet appareil devra se reconnecter.",
    "revokeOthersTitle": "Déconnecter tous les autres appareils ?",
    "revokeOthersDesc": "Cela mettra fin à {{count}} autre(s) session(s). Votre navigateur actuel reste connecté.",
    "sessionRevoked": "Session déconnectée",
    "mySecurityHint": "",
    "policyTotpHint": "Politique du site : chaque administrateur doit activer sa propre 2FA (QR individuel)",
    "requireUser2fa": "Exiger la 2FA pour tous les utilisateurs du panneau",
    "changePasswordTitle": "Changer le mot de passe de connexion",
    "currentPassword": "Mot de passe actuel",
    "newPassword": "Nouveau mot de passe",
    "confirmNewPassword": "Confirmer le nouveau mot de passe",
    "passwordMismatch": "Les nouveaux mots de passe ne correspondent pas.",
    "changePassword": "Changer le mot de passe",
    "passwordChanged": "Mot de passe mis à jour.",
    "strictNeedsEnrolled": "Au moins un administrateur doit avoir la 2FA avant d’activer Strict.",
    "policyTotpNeedSelf": "Activez d’abord la 2FA sur ce compte ; sinon le code de confirmation ne peut pas être saisi.",
    "policyNoTotpHint": "This account has no 2FA yet — saving policy does not need a TOTP. Set up 2FA above if you want to require it for others.",
    "policyNeedSelf2fa": "Activez d'abord 2FA sur ce compte, puis confirmez avec un code TOTP",
    "revokeAllDevicesTitle": "Révoquer tous les appareils mémorisés : vous et les autres administrateurs devez à nouveau vérifier 2FA",
    "sessionCli": "CLI",
    "sessionApi": "API",
    "fail2banSnippetTitle": "Extrait fail2ban",
    "fail2banSnippetEmpty": "Aucun extrait n’a été écrit.",
    "trustedDevicesTitle": "Appareils de confiance",
    "noTrustedDevices": "Aucun appareil de confiance.",
    "strictConfirmTitle": "Activer la 2FA Strict ?",
    "strictConfirmDesc": "Les utilisateurs sans 2FA seront refusés. Confirmez que vous avez un TOTP ou une Passkey qui fonctionne.",
    "revokeDevicesTitle": "Révoquer les appareils de confiance ?",
    "revokeDevicesDesc": "Les navigateurs mémorisés devront refaire la 2FA.",
    "approvalsHint": "Les approbations apparaissent lorsqu’un outil à haut risque nécessite un second opérateur. Configurez les droits dans Utilisateurs → Autorisations.",
    "allowlistReadonly": "Catalogue d’outils agent (lecture seule). Les capacités se règlent dans Utilisateurs → Autorisations.",
    "colTool": "Outil",
    "colAllowed": "Autorisé",
    "colRisk": "Risque",
    "colApproval": "Approbation",
    "risk": {
      "low": "Faible",
      "medium": "Moyen",
      "high": "Élevé",
      "critical": "Critique"
    },
    "confirmDeleteApiKey": "Supprimer cette clé API ?",
    "confirmDeleteApiKeyDesc": "«{{name}}» arrêtera l'authentification. Cela ne peut pas être annulé."
  },
  "serviceExposure": {
    "title": "Accès au réseau",
    "manage": "Gérer l'accès",
    "manageTitle": "Accès au réseau de services",
    "manageDesc": "Contrôlez comment {{service}} est accessible sur le pare-feu hôte.",
    "mode": "Mode d'accès",
    "modePrivate": "Local uniquement",
    "modePublic": "Publique",
    "modeRestricted": "Limité",
    "modeUndecided": "Non défini",
    "modePublicLive": "Public (liaison en direct)",
    "summaryPublicLive": "En écoute sur {{bind}} — accessible sur toutes les interfaces. Confirmer le mode d'accès ; ce n'est pas privé.",
    "modeLoading": "Chargement",
    "summaryPrivate": "Non ouvert sur le pare-feu public.",
    "summaryPublic": "Ouvert · {{ports}}",
    "summaryUndecided": "Mode d'accès non confirmé (par défaut du catalogue : {{suggested}}).",
    "summaryNotEnforced": "Le pare-feu est désactivé : le panneau n'ouvre ni ne bloque ces ports.",
    "roleSmtp": "Soumission SMTP",
    "roleImap": "Boîte aux lettres IMAP/POP3",
    "summaryRestricted": "Restreint · {{count}} source(s)",
    "summaryFirewallOff": "Pare-feu hôte : {{detail}} – règles non appliquées tant que UFW n'est pas actif.",
    "summaryFirewallOffOnly": "Le pare-feu de l'hôte n'est pas activé, les règles de port ne sont donc pas appliquées.",
    "outOfSync": "Désynchronisé",
    "openButStopped": "Ports ouverts – le service ne fonctionne pas",
    "openNoTenants": "Ports publics sans locataires",
    "firewallOff": "Pare-feu désactivé",
    "ufwMissing": "UFW non installé",
    "ufwInactive": "inactif",
    "firewallLink": "Pare-feu",
    "portsLabel": "Ports",
    "allowFrom": "Sources autorisées (IP / CIDR)",
    "allowCountries": "Pays autorisés (ISO)",
    "hintPrivate": "Le service peut toujours écouter sur localhost ; aucun UFW public n'autorise les règles.",
    "hintPublic": "Attention : ouvre ce port à tout Internet. Préférez restreint pour les bases de données.",
    "hintRestricted": "Adresses IP ou CIDR séparées par des virgules. Seules ces sources peuvent se connecter.",
    "hintCountries": "Meilleur effort L2 via ipset + CIDR de zone pays. Nécessite root, EXECUTE et ipset. Les groupes de sécurité cloud sont distincts.",
    "restrictedNeedIp": "Ajoutez au moins une adresse IP ou CIDR pour le mode restreint.",
    "restrictedNeedSource": "Ajoutez au moins un code IP/CIDR ou pays pour le mode restreint.",
    "privateStartTitle": "Exposer {{service}} sur le réseau ?",
    "confirmAndStart": "Confirmez et démarrez",
    "cloudSgNote": "Pare-feu hôte uniquement : les groupes de sécurité cloud (AWS/GCP/Azure) ne sont pas modifiés.",
    "serviceNotInstalled": "Ce service n'est pas installé, les règles de pare-feu ne s'appliquent donc pas."
  },
  "services": {
    "enabledBoot": "Au démarrage",
    "unitNotFound": "Unit not installed",
    "bootNa": "Sans objet",
    "unitNa": "Sans objet",
    "permLabel": "Autorisation",
    "permCanChange": "Peut changer de système (superutilisateur)",
    "permBlocked": "Impossible de changer le système",
    "permHint": "Changement de système {{exec}} · Superutilisateur {{root}}",
    "clusterLegend": "Planifié = enregistré dans le panneau, non appliqué sur l'hôte.",
    "active": {
      "active": "En cours d'exécution",
      "inactive": "Arrêté",
      "not-found": "Non installé",
      "failed": "Échoué",
      "tool": "Outil",
      "activating": "Départ"
    },
    "unitStatic": "statique",
    "unitIndirect": "indirect",
    "action": {
      "start": "Démarrer",
      "stop": "Arrêter",
      "restart": "Redémarrer",
      "reload": "Recharger",
      "enable": "Activer au démarrage",
      "disable": "Désactiver au démarrage"
    },
    "enabledOk": "{{label}} activé au démarrage",
    "bootDisabledWarn": "{{label}} tourne mais ne démarrera pas au boot. Activez-le pour le conserver.",
    "bootDisabledShort": "Pas au boot",
    "sshdBootOffWarn": "sshd n'est pas activé au démarrage. Après le redémarrage, cet hôte n'aura aucun chemin de secours SSH.",
    "mariadbNotInstalled": "MariaDB n’est pas installé",
    "mariadbNotInstalledMysqlOk": "Non installé : MariaDB (MySQL est installé)",
    "lifecycleTitle": "Contrôle du service {{label}}",
    "startedOk": "{{label}} démarré",
    "stoppedOk": "{{label}} arrêté",
    "needRunning": "{{label}} ne fonctionne pas",
    "restartedOk": "{{label}} redémarré",
    "reloadedOk": "{{label}} rechargé",
    "reloadTitle": "Recharger la configuration {{label}} sans redémarrage complet",
    "stopNeedConfirm": "Confirmation requise",
    "stopNeedConfirmPhrase": "Saisie de la phrase de confirmation requise",
    "stopNeedConfirmImpact": "Arrêter {{label}} ? Les connexions actives à ce service seront interrompues.",
    "stopConfirmTitle": "Arrêter {{label}} ?",
    "stopConfirmDesc": "{{label}} cessera d’écouter. Relancez-le depuis cette page si besoin.",
    "stopConfirmEdgeDesc": "Arrêter {{label}} met hors ligne les sites et le reverse proxy jusqu’au redémarrage.",
    "stopConfirmEdgeConsequence": "Tant que {{label}} est arrêté, cet hôte ne sert pas HTTP/HTTPS.",
    "stopConfirmSshdTitle": "Arrêter sshd ?",
    "stopConfirmSshdDesc": "Arrêter sshd coupe le SSH distant. Confirmez un accès console ou une autre voie.",
    "stopConfirmSshdToken": "arrête sshd",
    "stopConfirmSshdConsequence": "Les nouvelles sessions SSH échoueront jusqu’au démarrage de sshd depuis la console.",
    "stopConfirmPanelTitle": "Arrêter YSK Server ?",
    "stopConfirmPanelDesc": "Le panneau et l’API seront hors ligne jusqu’au démarrage de l’unité sur l’hôte.",
    "stopConfirmPanelSshdOffDesc": "Le panneau et l'API seront hors ligne. sshd n'est pas activé au démarrage, donc SSH peut ne pas être un chemin de secours après le redémarrage.",
    "stopConfirmPanelSshdOffConsequence": "sshd n'est pas activé au démarrage. Après le redémarrage, vous n'aurez peut-être pas de chemin de secours SSH.",
    "ufwNoLifecycle": "UFW n'est ni démarré ni arrêté à partir de cette matrice.",
    "restartConfirmPanelTitle": "Redémarrer le serveur YSK ?",
    "restartConfirmPanelDesc": "Le panneau et l'API disparaîtront brièvement pendant le redémarrage de l'unité.",
    "restartConfirmTitle": "Redémarrer {{label}} ?",
    "restartConfirmDesc": "Redémarrez {{label}} maintenant. Les connexions actives peuvent être interrompues.",
    "restartConfirmConsequence": "{{label}} interrompra brièvement les connexions, puis continuera à servir HTTP/HTTPS.",
    "reloadConfirmTitle": "Recharger {{label}} ?",
    "reloadConfirmDesc": "Rechargez la configuration {{label}}. Les sessions existantes doivent rester actives.",
    "enableConfirmTitle": "Activer {{label}} au démarrage ?",
    "enableConfirmDesc": "Activez {{label}} pour qu'il démarre au démarrage.",
    "startVerifyFailed": "{{label}} le départ n'est pas resté en bonne santé.",
    "stopConfirmPanelToken": "arrêter le serveur Ysk",
    "stopConfirmPanelConsequence": "Cette session navigateur sera coupée. Démarrez l’unité via SSH ou la console hôte.",
    "stopConfirmFail2banTitle": "Arrêter fail2ban ?",
    "stopConfirmFail2banDesc": "L'arrêt de fail2ban désactive les interdictions IP automatiques. Les sites Web et SSH continuent de fonctionner.",
    "stopConfirmFail2banConsequence": "Les nouveaux attaquants ne sont pas bannis tant que fail2ban n’est pas redémarré.",
    "actionDone": "{{action}} terminé",
    "runningOf": "{{running}}/{{total}} en cours",
    "statusFilter": {
      "all": "Tous les états",
      "running": "En cours d'exécution",
      "failed": "Échoué",
      "missing": "Non installé"
    },
    "canMutate": "Modifiable",
    "locked": "Verrouillé",
    "controlUnit": "Unité du plan de contrôle",
    "logs": "Journaux",
    "dbHa": "HA base de données",
    "clusterCount": "{{count}} cluster(s)",
    "mariadbCluster": "Cluster MariaDB",
    "probing": "Sondage de la matrice des services…",
    "lifecycleLocked": "Actions de cycle de vie verrouillées : root + YSK_EXECUTE requis. Les sondes fonctionnent toujours. Voir",
    "hostSettings": "Paramètres de l'hôte",
    "matrixTab": "Matrice des services ({{count}})",
    "stackTab": "Pile logicielle",
    "stackTitle": "Pile logicielle de l’hôte",
    "stackHint": "Installer ou supprimer des composants hôte selon le plan ; les moteurs de serveur SQL sont exclusifs.",
    "protectionTab": "Sonde de protection",
    "knownServices": "Services connus",
    "showing": "Affichage de {{shown}} / {{total}}",
    "all": "Tous",
    "searchPh": "Nom / unité / catégorie",
    "noMatch": "Aucun service correspondant",
    "bootPrefix": "Démarrage {{state}}",
    "controlPage": "Page de contrôle",
    "manageRuntime": "Installer / mettre à jour",
    "installOrOpen": "Installer / ouvrir",
    "protectionTitle": "Sonde de protection",
    "protectionSub": "Lecture seule ; ne modifie pas le pare-feu / fail2ban",
    "protectionDoneNote": "Sonde de protection terminée",
    "probeDone": "Sonde terminée",
    "runProtection": "Lancer la sonde de protection",
    "notProbedYet": "Pas encore sondé",
    "cat": {
      "web": "Internet",
      "db": "Bases de données",
      "mail": "Mail",
      "dns": "DNS",
      "ftp": "FTP",
      "cache": "Cache",
      "panel": "Panneau",
      "ssh": "SSH",
      "other": "Autre",
      "runtime": "Durées d'exécution"
    }
  },
  "software": {
    "title": "Logiciels",
    "desc": "Tous les logiciels gérés : état d’installation, santé des services, versions plus récentes et liens d’utilisation dans les projets.",
    "tabs": {
      "overview": "Vue d'ensemble",
      "runtimes": "Durées d'exécution",
      "databases": "Bases de données",
      "edge": "Domaines et edge",
      "mailFiles": "Messagerie et fichiers",
      "host": "Services de l’hôte"
    },
    "stat": {
      "catalog": "Éléments du catalogue",
      "runtimesInstalled": "Runtimes installés",
      "updates": "Mises à jour / extensibles",
      "attention": "Nécessite une attention"
    },
    "quickTitle": "Raccourcis",
    "quickDesc": "Aller à une section ou aux outils de l’hôte",
    "updatesTitle": "Mises à jour et versions installables",
    "updatesDesc": "Pins upstream ou panneau plus récents. Installez, puis sélectionnez le runtime sur un projet.",
    "allSoftware": "Tous les logiciels",
    "status": {
      "unknown": "—",
      "installed": "Installé",
      "notInstalled": "Non installé",
      "running": "En cours",
      "missing": "Non détecté",
      "failed": "Échoué",
      "stopped": "Arrêté"
    },
    "badge": {
      "update": "Mise à jour disponible",
      "upToDate": "À jour"
    },
    "meta": {
      "installed": "Installé : {{list}}",
      "default": "Par défaut {{v}}",
      "remote": "En amont ~{{v}}",
      "openManage": "Ouvrez la page de gestion pour installer ou configurer",
      "aptCurrentLatest": "Installé {{v}} · le dépôt est à jour",
      "aptVersion": "Installé {{v}}",
      "aptUpgrade": "{{from}} → {{to}} disponible",
      "aptUpgradeMulti": "{{n}} paquets pouvant être mis à jour : {{list}}",
      "aptNotInstalled": "Paquet non installé (ouvrez la page de gestion pour installer)",
      "hostUpgradable": "~{{n}} paquets pouvant être mis à jour sur l'hôte",
      "checking": "Vérification des versions… ou ouvrez la page de gestion"
    },
    "action": {
      "manage": "Gérer",
      "useInProject": "Utiliser dans le projet",
      "useInProjectTitle": "Ouvrez les projets pour définir ce runtime",
      "update": "Mettre à jour",
      "updateTitle": "Installer ou basculer vers {{v}}",
      "updateTo": "Mettre à jour vers {{v}}",
      "installVersion": "Installer {{v}}",
      "applyAptTitle": "Confirmer la mise à jour de {{pkg}}",
      "updateN": "Mettre à jour {{n}} éléments",
      "installTitle": "Installer {{list}}",
      "install": "Installer",
      "updateAptTitle": "Ouvrir les mises à jour pour {{pkg}}"
    },
    "apply": {
      "blockedShort": "Bloqué",
      "failedShort": "Échoué",
      "failed": "Échec de la mise à jour",
      "blocked": "Bloqué",
      "confirm": "Confirmer la mise à jour",
      "confirmTitle": "Confirmer la mise à jour logicielle ?",
      "confirmBody": "Mettre à jour {{pkg}} : {{from}} → {{to}}. Nécessite les droits de modification système.",
      "ok": "{{pkg}} appliqué",
      "progress": "Mise à jour {{n}}/{{total}} : {{pkg}}",
      "okMulti": "Mis à jour : {{list}}",
      "okMultiTitle": "{{label}} mis à jour",
      "partial": "Succès partiel",
      "partialTitle": "Certaines mises à jour ont échoué",
      "failedTitle": "Échec de la mise à jour de {{label}}",
      "progressDetail": "{{from}} → {{to}}",
      "confirmBodyMulti": "Mettre à jour {{label}} : {{list}}"
    },
    "version": {
      "loading": "Chargement des versions…",
      "installed": "Installé",
      "latest": "Dernière",
      "upToDate": "À jour / dépôt à jour",
      "refresh": "Revérifier la dernière version",
      "refreshHasUpdate": "Version plus récente disponible",
      "refreshLatest": "Déjà la dernière version enregistrée",
      "pick": "Choisir la version",
      "noTarget": "Aucune cible de mise à jour",
      "needRuntimePage": "Installez cette version sur la page du runtime",
      "noAptCandidate": "Aucune version candidate apt",
      "sourceLabel": "Source"
    },
    "install": {
      "progress": "Installation : {{list}}…",
      "progressHint": "Peut prendre une minute ou deux",
      "blockedTitle": "Impossible d'installer {{label}}",
      "ok": "Installation en file d'attente : {{list}}",
      "okTitle": "{{label}} installé / en file d'attente",
      "failedTitle": "Échec de l'installation de {{label}}",
      "confirmTitle": "Confirmer l'installation du logiciel ?",
      "confirmBody": "Installer {{label}} : {{list}}. Nécessite des droits de modification système.",
      "confirm": "Confirmer l'installation"
    },
    "runtime": {
      "installing": "Installation/mise à jour de {{kind}} {{v}}…",
      "installingHint": "Peut prendre une minute ou deux",
      "blockedTitle": "Impossible d'installer {{kind}} {{v}}",
      "installed": "{{kind}} {{v}} installé/mis à jour",
      "installedDetail": "Sélectionner cette version sur un projet",
      "failedTitle": "Échec de l'installation de {{kind}} {{v}}",
      "installingShort": "Installation…"
    },
    "aptSummaryTitle": "Mises à niveau du dépôt disponibles",
    "aptSummaryDesc": "Les comptes du catalogue et des paquets hôte sont distincts ; appliquer depuis Mises à jour ou une carte.",
    "aptSummary": {
      "catalog": "Catalogue {{n}}",
      "host": "Paquets hôte {{n}}",
      "openUpdates": "Ouvrir les mises à jour"
    },
    "navBadgeTitle": "Mises à niveau du catalogue : {{n}}",
    "projectHint": "Runtime {{runtime}} prérempli — créer un projet",
    "projectHintWithVersion": "Runtime {{runtime}} {{version}} prérempli — créer un projet"
  },
  "softwareBanner": {
    "titleDefault": "Logiciel requis non installé",
    "missing": "Manquant : {{names}}",
    "nameSep": ", ",
    "installOneClick": "Installer maintenant",
    "installing": "Installation…",
    "reprobe": "Revérifier",
    "close": "Fermer",
    "resultTitle": "Résultat de l'installation",
    "probeFailed": "Échec du sondage",
    "installIncomplete": "Installation incomplète",
    "installedOne": "{{name}} installé",
    "allInstalled": "Logiciel requis installé"
  },
  "softwareLifecycle": {
    "kindInstall": "Installer",
    "kindUninstall": "Désinstaller",
    "dockBusy": "{{kind}} · {{title}}",
    "dockFail": "Échec · {{title}}",
    "dockDone": "Terminé · {{title}}",
    "minimize": "Minimiser",
    "maximize": "Agrandir",
    "restore": "Restaurer",
    "liveLog": "Journal en direct",
    "uninstall": "Désinstaller…",
    "uninstallTitle": "Désinstaller {{name}}",
    "impactIntro": "Ces composants et services seront affectés. Examinez attentivement avant de continuer.",
    "nothingInstalled": "Rien d'installé pour cette fonctionnalité.",
    "packagesList": "Forfaits : {{list}}",
    "noPackages": "Aucun package apt répertorié",
    "unitsList": "Prestations : {{list}}",
    "dataPolicy": "Politique de données",
    "policyKeep": "Conserver la configuration et les données",
    "policyPurge": "Purger la configuration et les données (dangereux)",
    "purgeWarning": "La purge supprime définitivement les répertoires de configuration et de données. Cela ne peut pas être annulé facilement.",
    "keepHint": "Les packages seront supprimés ; les répertoires de configuration et de données sont conservés sur le disque.",
    "summaryLine": "{{packages}} colis(s), {{units}} unité(s) de service seront traités.",
    "doubleConfirmIntro": "Une double confirmation est requise pour la désinstallation.",
    "ackLabel": "Je comprends que les services peuvent s'arrêter et j'ai lu la liste des impacts.",
    "typePhrase": "Saisissez {{phrase}} pour confirmer",
    "confirmUninstall": "Confirmer la désinstallation",
    "protected": "Protégé",
    "readyHint": "Le logiciel requis est installé. Vous pouvez désinstaller à partir d'ici si nécessaire.",
    "readyTitle": "Logiciel prêt",
    "jobInProgress": "Une autre installation/désinstallation est déjà en cours",
    "uninstallDone": "Désinstallation terminée",
    "uninstallFailed": "Échec de la désinstallation",
    "impact": {
      "sitesDown": "Les sites publics peuvent être hors ligne",
      "reverseProxy": "Le proxy inverse s'arrêtera",
      "phpBackend": "Le backend PHP peut s'arrêter",
      "mailOutbound": "Le courrier sortant s'arrêtera",
      "mailInbound": "Le courrier entrant s'arrêtera",
      "mailQueue": "Outils de file d'attente de courrier indisponibles",
      "mailDkim": "La signature DKIM s'arrêtera",
      "database": "Le service de base de données s'arrêtera",
      "dataLossPurge": "La purge supprime les répertoires de données",
      "cache": "Le service de cache s'arrêtera",
      "firewall": "Le pare-feu de l'hôte sera supprimé",
      "intrusion": "Le blocage des intrusions s'arrêtera",
      "ftp": "Le service FTPS s'arrêtera",
      "dns": "Le serveur DNS s'arrêtera",
      "vpn": "Les services VPN s'arrêteront",
      "vnc": "Les services VNC s'arrêteront",
      "controlPlane": "Runtime du plan de contrôle (protégé)",
      "generic": "Les services associés peuvent s'arrêter",
      "containers": "Les conteneurs en cours s’arrêteront",
      "validators": "Les piles validateur qui utilisent Docker Compose s’arrêteront",
      "purgeData": "Les chemins de données seront supprimés",
      "protectedSkipped": "Les composants protégés sont ignorés",
      "runtimeStack": "Toutes les versions gérées par panneau de ce runtime seront supprimées"
    },
    "requestCancel": "Demande d'annulation",
    "cancelling": "Annulation…",
    "dockCancelling": "Annulation · {{title}}",
    "dockCancelled": "Annulé · {{title}}",
    "cancelHint": "Annulation demandée. Le client a arrêté d'écouter ; l'hôte peut terminer l'apt/l'étape en cours. Re-sondez l'état après un moment.",
    "cancelledToast": "Opération annulée (le client a arrêté la diffusion)",
    "kindApply": "Appliquer",
    "kindScan": "Balayage",
    "kindDeploy": "Déployer",
    "kindRuntime": "Durée d'exécution",
    "jobDone": "Terminé · {{title}}",
    "jobFailed": "Échec · {{title}}",
    "uninstallUfwWarn": "Retirer UFW laisse cet hôte sans le pare-feu de ports géré par le panneau.",
    "uninstallFail2banWarn": "Retirer fail2ban arrête les jails et lève les interdictions. Si vous le gardez, ajoutez votre IP de connexion à ignoreip."
  },
  "sqlEngineHealth": {
    "finding": {
      "package_missing": "Le paquet serveur pour {{flavor}} n'est pas installé.",
      "client_missing": "Les outils clients SQL ne sont pas installés.",
      "frozen_marker": "Marqueur de gel Debian présent (mode : {{mode}}). Le démarrage du démon est bloqué jusqu'à la levée.",
      "datadir_uninitialized": "Le répertoire de données n'a pas de catalogue système — initialisation requise.",
      "config_flavor_mismatch": "my.cnf pointe vers le mauvais moteur pour {{flavor}} ({{path}}).",
      "residual_foreign_plugins": "Des configs/plugins résiduels de l'autre moteur SQL peuvent faire planter ce démon.",
      "unit_failed": "L'unité de service {{unit}} est en échec.",
      "unit_not_active": "L'unité de service {{unit}} est {{active}} (non active).",
      "port_conflict": "Le port 3306 est utilisé alors que ce moteur est arrêté (conflit possible)."
    },
    "action": {
      "stop_unit": "Arrêter l'unité de service",
      "clear_frozen": "Effacer le marqueur de gel",
      "sanitize_config": "Aligner my.cnf et désactiver les plugins de l'autre moteur",
      "init_datadir": "Initialiser le répertoire de données vide",
      "reset_failed": "Réinitialiser l'état d'échec de l'unité",
      "enable_unit": "Activer le service au démarrage",
      "start_unit": "Démarrer le service",
      "verify_active": "Vérifier que le service est actif"
    },
    "note": {
      "alreadyHealthy": "Moteur SQL déjà sain — aucune réparation nécessaire.",
      "needsConfirm": "La réparation nécessite une confirmation ({{count}} étapes : {{findings}}).",
      "installPackageFirst": "Installer d'abord le paquet serveur {{flavor}}, puis réparer.",
      "stepFailed": "Échec de l'étape de réparation {{action}} : {{detail}}",
      "repairOk": "Réparation terminée — {{unit}} est actif.",
      "repairIncomplete": "Réparation terminée mais l'unité est toujours {{active}}."
    }
  },
  "sqlEngineSwitch": {
    "title": "Basculer vers {{target}}",
    "subtitle": "Remplacer {{from}} par {{to}}. Un seul serveur SQL est autorisé sur cet hôte.",
    "confirm": "Confirmer le basculement et migrer",
    "success": "Moteur SQL basculé et données migrées",
    "bannerHint": "Si l'autre moteur est déjà installé, vous devez confirmer un basculement exclusif (désinstaller",
    "flowAria": "Direction du basculement du moteur SQL",
    "from": "Actuel",
    "to": "Cible",
    "calloutTitle": "Difficile à annuler sans sauvegardes",
    "calloutBody": "Les paquets {{from}} ne sont supprimés qu'après une exportation réussie",
    "sectionImpact": "Ce qui va se passer",
    "sectionLimits": "Limitations et risques",
    "dbListTitle": "Bases de données à migrer ({{count}})",
    "dbMigrateBadge": "{{count}} base(s) de données utilisateur",
    "dbEmptyBadge": "Aucune base de données utilisateur",
    "noUserDbs": "Aucune base de données utilisateur détectée (schémas système uniquement). Le moteur du serveur sera tout de même remplacé.",
    "tableCount": "{{count}} table(s)",
    "ackLabel": "Je comprends que les moteurs sont exclusifs. Désinstaller {{from}} et migrer les données vers {{to}}.",
    "phraseLabel": "Saisissez {{phrase}} pour confirmer",
    "phraseMismatch": "La phrase ne correspond pas. Saisissez SWITCH exactement.",
    "warn": {
      "replace_engine": "Désinstaller {{from}} et installer {{to}}.",
      "exclusive": "MySQL et MariaDB ne peuvent pas s'exécuter ensemble en tant que serveurs sur un même hôte (exclusifs).",
      "uninstall_packages": "Les paquets du serveur SQL actuels seront supprimés du système.",
      "logical_dump": "Les bases de données utilisateur sont exportées logiquement puis importées. Les schémas système ne sont pas copiés en tant que fichiers.",
      "dialect_risk": "Le SQL spécifique à MariaDB ou MySQL peut échouer à l'importation.",
      "no_replication": "Les paramètres de réplication, les plugins et les journaux binaires ne sont pas migrés.",
      "root_auth": "L'authentification root par socket ou mot de passe peut nécessiter une reconfiguration après le basculement.",
      "no_user_dbs": "Aucune base de données utilisateur détectée — seuls les paquets du moteur changeront.",
      "has_user_dbs": "{{count}} base(s) de données utilisateur seront exportées et importées."
    },
    "note": {
      "needsSwitch": "Cet hôte exécute déjà {{other}}. MySQL et MariaDB sont exclusifs — confirmez le basculement (export → désinstallation de l'autre → installation → import).",
      "invalidTarget": "Cible invalide (mysql ou mariadb uniquement).",
      "badConfirmPhrase": "La phrase de confirmation doit être exactement SWITCH.",
      "needAck": "Vous devez confirmer le basculement exclusif (MySQL ou MariaDB, pas les deux).",
      "switchNotNeeded": "Basculement non nécessaire — utilisez l'installation normale.",
      "migrateDataRequired": "La migration des données doit être activée lorsque des bases de données utilisateur existent.",
      "dumpFailed": "Échec de l'exportation — la source {{source}} reste en cours d'exécution. {{detail}}",
      "datadirBackupFailed": "Échec de la sauvegarde du répertoire de données — abandonné avant la désinstallation. Essayez de démarrer le service source manuellement.",
      "waitFailed": "Le service cible n'est pas devenu prêt. Sauvegarde : {{dumpPath}}. Ancien répertoire de données : {{datadir}}. Récupération manuelle requise.",
      "incomplete": "Basculement incomplet. Exportation conservée dans {{dumpPath}}. Ancien répertoire de données dans {{datadir}}. Ne purgez pas à nouveau aveuglément.",
      "switched": "Basculé de {{from}} → {{to}}. {{imported}}/{{total}} base(s) de données importée(s).",
      "dumpPath": "Chemin d'exportation logique : {{path}}",
      "datadirBackup": "Sauvegarde de l'ancien répertoire de données : {{path}} (supprimer une fois satisfait : rm -rf {{path}})",
      "grantsExported": "Privilèges exportés ({{detail}})",
      "frozenDetected": "MySQL/MariaDB est FROZEN (pas un échec apt). Chemin {{path}} (mode : {{mode}}). Le paquet peut être installé mais le démon refuse de démarrer après un basculement ou une rétrogradation de moteur. Lever le gel et réinitialiser un répertoire de données vide si c'est sûr. Extrait : {{snippet}}",
      "frozenCleared": "Marqueur de gel {{path}} supprimé.",
      "frozenClearFailed": "Impossible de supprimer le marqueur de gel {{path}} — supprimez-le manuellement en tant que root.",
      "datadirNotEmptySkipInit": "Le répertoire de données contient déjà des tables système — réinitialisation ignorée.",
      "datadirInitialized": "Répertoire de données vide initialisé pour {{flavor}}.",
      "datadirInitFailed": "Échec de l'initialisation du répertoire de données : {{detail}}",
      "unitNotActive": "L'unité {{unit}} est {{active}} (actif attendu).",
      "nginxPortConflict": "L'unité Nginx n'est pas active — Apache peut encore lier le port public :80 ; reliez Apache à 127.0.0.1:8080, puis redémarrez Nginx.",
      "nginxConfigFailed": "Échec de nginx -t : {{detail}}",
      "frozenShort": "FROZEN ({{mode}}) — démon bloqué ; dégel et réparation requis.",
      "unfreezeNeedsConfirm": "Confirmation requise pour dégeler (frozen={{frozen}}, emptyDatadir={{empty}}). POST avec confirm:true.",
      "unfreezeOk": "Le service {{unit}} est actif après réparation de dégel.",
      "unfreezeStartFailed": "Toujours pas actif après dégel : {{detail}}",
      "unfreezePrompt": "Cliquez sur « Dégeler et réparer » pour lever FROZEN et réinitialiser un répertoire de données vide.",
      "configSanitized": "Configuration SQL alignée pour {{flavor}} (my.cnf → {{target}}). Restes de plugins MariaDB désactivés lors du ciblage de MySQL.",
      "configSanitizeFailed": "Échec de l'assainissement de la configuration SQL : {{detail}}"
    },
    "step": {
      "dump": "Exporter {{db}}",
      "exportGrants": "Exporter les privilèges",
      "stop": "Arrêter {{unit}}",
      "backupDatadir": "Sauvegarder le datadir",
      "purge": "Désinstaller {{pkg}}",
      "wait": "Attendre {{unit}}",
      "importDb": "Importer {{db}}",
      "importGrants": "Importer les privilèges",
      "verify": "Vérifier",
      "preflight": "Prévol",
      "confirm": "Confirmer",
      "clearFrozen": "Lever le FROZEN MySQL",
      "initDatadir": "Initialiser un datadir vide",
      "startUnit": "Démarrer {{unit}}",
      "sanitizeConfig": "Nettoyer my.cnf / plugins résiduels"
    }
  },
  "ssl": {
    "status": {
      "uploaded": "Téléversé",
      "issued": "Émis",
      "planned": "En cours",
      "failed": "Échoué",
      "missing": "Fichiers manquants",
      "ready": "Prêt",
      "processing": "En cours"
    },
    "step": {
      "ok": "Fait",
      "blocked": "Exécution impossible",
      "failed": "Échoué",
      "skipped": "Ignoré"
    },
    "pillCount": "{{count}} certificat(s)",
    "statCerts": "Certificats",
    "panelCertHint": "Le panneau HTTPS utilise {{path}} (expire {{exp}}). Il n'est pas répertorié comme certificat de site.",
    "openPanelTls": "Panneau ouvert HTTPS",
    "statWithFiles": "Avec fichiers",
    "statBindings": "Liaisons",
    "statFailed": "Échoué",
    "requestLe": "Demander Let’s Encrypt",
    "openLetsEncryptLog": "Ouvrir letsencrypt.log dans le Centre de journaux",
    "uploadCert": "+ Téléverser un certificat",
    "certbotNotInstalled": "Certbot n’est pas installé",
    "leFailNxdomain": "Le DNS n’a aucun enregistrement pour {{domain}} (NXDOMAIN) — Let's Encrypt ne peut pas valider sans un A/AAAA public.",
    "leFailNxdomainHint": "Ajoutez un enregistrement A pour {{domain}} vers l’IP publique de ce serveur dans le DNS, écrivez la zone, confirmez",
    "leFailDns": "Erreur DNS lors de la résolution de {{domain}} (SERVFAIL ou similaire).",
    "leFailDnsHint": "Vérifiez les serveurs de noms et que la zone est publiée sur Internet public.",
    "leFailHttp01": "{{domain}} se résout, mais HTTP-01 a échoué (port 80 inaccessible ou mauvaise réponse).",
    "leFailHttp01Hint": "Ouvrez le port 80, assurez-vous que nginx écoute sur 80, et que {{domain}} pointe vers cet hôte",
    "leFailRateLimit": "Limite de débit Let's Encrypt atteinte.",
    "leFailRateLimitHint": "Attendez et réessayez, ou évitez les demandes répétées pour le même nom.",
    "leFailCaa": "Des enregistrements CAA bloquent Let's Encrypt pour {{domain}}.",
    "leFailCaaHint": "Ajoutez un CAA autorisant letsencrypt.org, ou supprimez le CAA bloquant.",
    "leFailChallenge": "Échec de la validation de domaine Let's Encrypt ({{domain}}).",
    "leFailChallengeHint": "Confirmez l’enregistrement DNS A et l’accessibilité du port 80, puis réessayez ; voir letsencrypt.log.",
    "leFailUnknown": "Échec de la demande Let's Encrypt ({{domain}}).",
    "leFailUnknownHint": "Ouvrez letsencrypt.log pour les détails.",
    "leFailRawTail": "Détail technique (extrait) : {{snippet}}",
    "requestFailedWhy": "Pourquoi ça a échoué",
    "requestFailedNext": "Prochaines étapes",
    "retryRequest": "Réessayer la demande",
    "retryRequestFor": "Réessayer la demande pour {{domain}}",
    "retryInTableHint": "Réessayer depuis la ligne du domaine en échec dans la liste ci-dessous",
    "bindingsTitle": "Liaisons et renouvellement",
    "autoRenewLabel": "Renouvellement automatique",
    "autoRenewYes": "Activé",
    "autoRenewNo": "Non activé / non confirmé",
    "autoRenewYesDetail": "Mécanisme de renouvellement détecté : {{source}}. Les certificats Let's Encrypt devraient se renouveler avant expiration si certbot est sain.",
    "autoRenewNoDetail": "Aucun certbot.timer activé ni cron de renouvellement trouvé. Activez certbot.timer, sinon les certificats expireront sauf renouvellement manuel.",
    "renewSourceCron": "cron panneau/système",
    "renewTimerEnabled": "minuterie systemd activée : {{unit}}",
    "renewTimerDisabled": "{{unit}} trouvé mais non activé (systemctl enable --now {{unit}})",
    "renewTimerInstalledUnknown": "L’hôte a le fichier d’unité {{unit}} ; confirmer systemctl enable --now",
    "renewTimerActive": "{{unit}} est actif",
    "renewViaCron": "{{count}} tâche(s) cron mentionnant certbot/renew trouvée(s)",
    "renewNone": "Aucun certbot.timer ni cron de renouvellement LE enregistré",
    "expiresUnknown": "Inconnu",
    "expiresUnknownHint": "Fichier de certificat illisible (permissions/chemin) ;",
    "expiresInDays": "dans {{n}} jours",
    "expiresAt": " · Expire le {{date}}",
    "projectsAt": " · Projets : {{names}}",
    "mailAt": " · Courriel : {{domains}}",
    "noBindings": "Aucune liaison projet/courriel détectée",
    "certsTitle": "Certificats ({{count}})",
    "colDomain": "Domaine",
    "colProvider": "Source",
    "providerUpload": "Téléverser",
    "colLocalFiles": "Fichiers locaux",
    "filesYes": "Oui",
    "filesNo": "Non",
    "colExpires": "Expire",
    "renew": "Renouveler",
    "renewFor": "Renouveler Let's Encrypt pour {{domain}}",
    "deleteDomain": "Supprimer {{domain}}",
    "colStatus": "Statut",
    "emptyTitle": "Aucun certificat pour l’instant",
    "emptyDesc": "Utilisez « Upload certificate » ou « Request Let’s Encrypt » ci-dessus",
    "uploadTitle": "Téléverser un certificat",
    "uploadDesc": "Collez le contenu PEM ; le panneau écrit les fichiers sur le serveur",
    "domainHint": "Domaine principal de ce certificat, p. ex. example.com",
    "fullchainLabel": "Chaîne de certificats (fullchain)",
    "fullchainHint": "PEM avec le certificat serveur et l’autorité de certification intermédiaire",
    "privkeyLabel": "Clé privée (privkey)",
    "privkeyHint": "PEM de clé privée correspondant au certificat — à garder secret",
    "uploadHint": "Le téléversement écrit uniquement les fichiers ;",
    "leTitle": "Demander Let’s Encrypt",
    "leDesc": "Le panneau demande le certificat sur le serveur — pas de certbot manuel",
    "requestCert": "Demander un certificat",
    "domainLeHint": "Apex/domaine ou joker *.example.com",
    "domainLePlaceholder": "example.com ou *.example.com",
    "emailLabel": "E-mail de contact",
    "emailHint": "Pour les avis d’expiration Let’s Encrypt ; laisser vide pour utiliser admin@domain",
    "leDns01Hint": "Les jokers utilisent dns-01 : le panneau lance un défi manuel certbot — complétez l’enregistre",
    "leHttp01Hint": "Les domaines normaux utilisent http-01 (plugin nginx)",
    "deleteTitle": "Supprimer le certificat ?",
    "deleteDesc": "Supprime les fichiers de certificat et l’enregistrement pour {{domain}}.",
    "deleteNeedDomain": "Supprimez ce certificat — saisissez le nom de domaine pour confirmer",
    "savedCert": "Certificat enregistré pour {{domain}}",
    "uploadFailed": "Échec du téléversement",
    "requestBlocked": "Impossible de terminer la demande de certificat dans le panneau d’administration",
    "requestDone": "Demande de certificat terminée",
    "requestFailed": "La demande de certificat n’a pas abouti",
    "applyFailed": "Échec de la demande",
    "deletedCert": "{{domain}} supprimé",
    "uninstallCertbotWarn": "La suppression de certbot arrête le renouvellement automatique des certificats Let's Encrypt existants.",
    "uninstallCertbot": "Désinstallez certbot (perd le renouvellement automatique)",
    "domainRequired": "Saisissez un domaine.",
    "domainInvalid": "Le format du domaine n’est pas valide.",
    "domainKnownHint": "Choisissez un domaine projet / DNS / mail connu, ou saisissez-en un."
  },
  "stackWizard": {
    "purgeConfirm": "Confirmer la purge ? Les chemins de données enregistrés (bases de données/courriel) seront supprimés définitivement.",
    "installedCount": "Installé {{installed}} · Manquant {{missing}}",
    "countHint": "Ces décomptes correspondent aux packages de système d'exploitation dans le plan logiciel, et non aux unités de matrice de service de l'autre onglet.",
    "executeRoot": "Modifications du système {{execute}} · administrateur {{root}}",
    "manifestPlan": "Plan {{plan}} ({{bundles}})",
    "manifestHint": "Dernier plan logiciel et offres groupées choisis",
    "needRootExecute": "L’installation/suppression en direct nécessite les droits administrateur et l’autorisation de modification système. Vous pouvez toujours faire un dry-run.",
    "modeInstall": "Plan d’installation",
    "modeUninstall": "Désinstaller",
    "plan": "Plan",
    "customBundles": "Lots personnalisés",
    "sqlExclusive": "Serveur SQL (exclusif)",
    "clamavOptional": "optionnel, volumineux",
    "componentsTitle": "Composants à installer",
    "dryRun": "Aperçu dry-run",
    "installNow": "Installer maintenant",
    "uninstallHint": "Cochez les lots à retirer. Sans sélection, le retrait est impossible. Les données sont conservées par défaut.",
    "dataPolicy": "Politique de données",
    "keepData": "Conserver les données",
    "purgeData": "Purger les données",
    "uninstallNow": "Désinstaller maintenant",
    "uninstallNeedSelect": "Sélectionnez au moins un forfait. Une sélection vide ne signifie plus tout supprimer.",
    "uninstallConfirmTitle": "Supprimer les groupes sélectionnés ?",
    "uninstallConfirmDesc": "{{count}} le ou les bundles seront supprimés. Tapez SUPPRIMER pour confirmer.",
    "bundle": {
      "control-plane": "Plan de contrôle",
      "web": "Hébergement Web",
      "database": "Bases de données",
      "email": "Pile de courrier",
      "dns": "DNS",
      "ftp": "FTP/FTPS",
      "defense": "Défense de l'hôte",
      "runtimes": "Durées d'exécution du langage"
    },
    "planTitle": {
      "minimal": "Plan de contrôle uniquement",
      "recommended": "Hébergement recommandé",
      "full": "Tous les logiciels"
    }
  },
  "support": {
    "title": "Assistance",
    "sub": "Creator, dons et YSK Limited — produit gratuit, aide réelle",
    "creatorTitle": "Créateur",
    "creatorBody": "YSK Server est un plan de contrôle mono-hôte, gratuit et honnête, pour les opérateurs qui veulent posséder leur pile. Le projet est maintenu au grand jour ; retours et rapports de bogues le rendent plus solide.",
    "donateTitle": "Soutien / Don",
    "donateBody": "Si YSK Server vous fait gagner du temps, envisagez de parrainer le développement. Chaque contribution aide à garder le produit gratuit pour tous.",
    "donateGithub": "Commanditaires GitHub",
    "donateOther": "Autres façons de donner",
    "yskTitle": "YSK Limited",
    "yskIntro": "Besoin d’une aide concrète au-delà du panneau gratuit ? YSK Limited peut aider pour :",
    "yskSvc1": "Installation, durcissement et exploitation continue du serveur",
    "yskSvc2": "Conception de pile d’hébergement (web, mail, DNS, bases de données)",
    "yskSvc3": "Migration, automatisation et intégration sur mesure",
    "yskSvc4": "Réponse aux incidents et revues de préparation à la production",
    "yskNoPrice": "Aucun tarif n’est affiché ici — contactez-nous pour une discussion adaptée à votre environnement.",
    "yskWebsite": "ysk.hk",
    "helpTitle": "Un problème ?",
    "helpBody": "Écrivez-nous avec votre OS, le chemin du journal d’installation, et ce que vous attendiez vs ce qui s’est passé. Nous lisons chaque message.",
    "docsHint": "La documentation complète se trouve dans le dépôt sous",
    "donateLinktree": "Linktree",
    "cryptoTitle": "Crypto / identifiants Web3",
    "cryptoHint": "N’envoyez que sur le réseau correspondant. Vérifiez l’adresse avant d’envoyer.",
    "cryptoNetwork": "Réseau",
    "cryptoAddress": "Adresse",
    "copy": "Copier",
    "copied": "Copié",
    "copyTitle": "Copier {{address}}",
    "docsLink": "Documentation",
    "diagTitle": "Résumé du diagnostic",
    "diagBody": "Copiez la version, exécutez et hébergez les faits à coller dans un e-mail. Il ne s'agit pas d'un ensemble de journaux complet.",
    "diagCopy": "Copier le résumé du diagnostic",
    "diagCopied": "Résumé du diagnostic copié",
    "diagCopyTitle": "Copier version, EXECUTE et faits hôte",
    "diagPreview": "Aperçu de ce qui sera copié",
    "diagLoading": "Chargement du diagnostic…",
    "diagLoadFailed": "Impossible de charger le diagnostic",
    "copiedAddr": "Copié {{addr}}",
    "diagStatus": "Statut",
    "diagMode": "Mode",
    "diagProtection": "Protection",
    "diagHostname": "Nom d'hôte",
    "diagOs": "OS"
  },
  "system": {
    "exportLoadFailed": "Échec du chargement des données d'export",
    "dryRunDone": "Simulation terminée (système inchangé)",
    "rebuildDone": "Demande de reconstruction terminée — voir le résultat ops",
    "exportWritten": "Export écrit / conf gérée listée",
    "rebuildFailed": "Échec de la reconstruction",
    "hostFallback": "Hôte",
    "mem": "Mémoire",
    "diskPeak": "Pic disque",
    "exportRebuild": "Export / Reconstruction",
    "dnsCerts": "DNS / certificats",
    "editIdentity": "Modifier l'identité",
    "power": "Alimentation",
    "metrics": "Métriques",
    "writeExports": "Écrire le répertoire d'export",
    "dryRunSync": "Synchronisation en simulation",
    "hostConsole": "Console hôte",
    "loadingHost": "Chargement de l'aperçu de l'hôte…",
    "identity": "Identité",
    "identityReadonly": "Lecture seule — nécessite YSK_EXECUTE + root pour appliquer",
    "identityTools": "Définir le nom d'hôte et le fuseau horaire via les outils système",
    "hostnameHint": "Nom d'hôte système",
    "writable": "Accessible en écriture",
    "locked": "Verrouillé",
    "hostname": "Nom d'hôte",
    "prettyName": "Nom convivial",
    "optional": "Facultatif",
    "prettyPh": "Nom d'affichage convivial",
    "timezone": "Fuseau horaire",
    "timezoneHint": "Choisissez un fuseau horaire IANA dans la liste (p. ex. Asia/Hong_Kong)",
    "timezoneNow": "Heure de l'hôte maintenant : {{time}} ({{tz}})",
    "timezoneBrowserDiff": "Cet hôte utilise {{host}} ; votre navigateur utilise {{browser}}. Changer le fuseau horaire ici modifie l'horloge de l'hôte, pas celle du navigateur.",
    "timezoneSelect": "Sélectionner le fuseau horaire",
    "notExported": "Pas encore exporté",
    "dns": "DNS",
    "updated": "Mis à jour",
    "applyIdentity": "Appliquer l'identité",
    "identitySetHostname": "Nom d'hôte défini sur {{name}}",
    "identitySetPretty": "Nom d'hôte convivial défini sur {{name}}",
    "identityClearPretty": "Nom d'hôte convivial effacé",
    "identitySetTimezone": "Fuseau horaire défini sur {{tz}}",
    "panelSsl": "SSL du panneau",
    "panelTls": {
      "title": "HTTPS du panneau",
      "sub": "Le plan de contrôle (ysk-server) sert le TLS sur listenPort ; WebAuthn/Passkeys nécessitent HTTPS",
      "domain": "Domaine du panneau",
      "domainHint": "Utilisé pour l'émission/la liaison de certificat, par ex. démo.ysk.hk",
      "email": "E-mail Let’s Encrypt",
      "status": "Statut",
      "enabled": "TLS activé dans la configuration",
      "disabled": "TLS désactivé (HTTP)",
      "serving": "Cette connexion : HTTPS",
      "servingHttp": "Cette connexion : HTTP",
      "expires": "Expiration du certificat",
      "certPath": "Chemin du certificat",
      "issueEnable": "Émettre le certificat et activer HTTPS",
      "enableExisting": "Activer avec le certificat existant",
      "disable": "Désactiver le HTTPS du panneau",
      "disableNeedConfirm": "Confirmation requise — saisissez DISABLE-HTTPS",
      "needDomain": "Saisissez d'abord le nom d'hôte / domaine",
      "needFqdn": "Besoin d'un nom de domaine complet (exemple.com), pas d'un simple nom d'hôte",
      "urlHint": "Après redémarrage, ouvrez {{url}}",
      "certMissing": "TLS activé mais fichiers cert/clé manquants",
      "restartToApply": "Redémarrez ysk-server pour appliquer HTTPS",
      "noConfig": "config.json introuvable (démarrer avec --config)",
      "usingExisting": "Utilisation du certificat local existant",
      "usingLe": "Utilisation des chemins live Let’s Encrypt",
      "needCertFirst": "Aucun certificat pour {{domain}} ; émettez-en un ou téléversez-en un d’abord",
      "configWritten": "Paramètres TLS du panneau enregistrés",
      "disabledNote": "TLS du panneau désactivé",
      "certAlreadyPresent": "Certificat déjà présent ; réémission ignorée",
      "restartManual": "Redémarrez manuellement : systemctl restart ysk-server",
      "restarted": "ysk-server redémarré",
      "restartFailed": "Échec du redémarrage : {{detail}}",
      "firewallHint": "Si accès depuis Internet, autorisez le port du panneau (par défaut 9287/tcp)",
      "restartNow": "Redémarrez ysk-server immédiatement après",
      "restartNowHint": "Ferme cette session ;",
      "restartConfirm": "Redémarrer le service du panneau maintenant ? Cette connexion peut être interrompue — rouvrez en HTTPS.",
      "manualRestart": "Redémarrez manuellement, puis ouvrez {{url}}",
      "reconnectHttps": "Le service a peut-être redémarré. Reconnectez-vous sur {{url}}.",
      "leStrategies": "Cert. panneau : essayer webroot → nginx certonly → standalone (sans --redirect)",
      "leOk": "Certificat Let’s Encrypt obtenu pour {{domain}}",
      "leFailed": "Échec de la demande de certificat : {{detail}}",
      "leHint": "Vérifiez que l’enregistrement DNS A pointe ici et que le port 80 est joignable (ou que nginx sert le domaine)",
      "openFirewall": "Si public : autorisez le port du panneau {{port}}/tcp (Pare-feu → ouvrir le port → 9287 Panel)",
      "disableConfirmTitle": "Désactiver le panneau HTTPS ?",
      "disableConfirmDesc": "Le panneau servira HTTP. WebAuthn/Passkey cessera de fonctionner jusqu'à ce que HTTPS soit réactivé.",
      "disablePasskeyWarn": "Les clés d'accès enregistrées nécessitent HTTPS – elles échoueront sur HTTP.",
      "listenPublic": "Le panneau écoute sur une adresse publique (0.0.0.0/::). Restreindre avec un pare-feu ou lier à 127.0.0.1.",
      "bootstrapCert": "Il s'agit du certificat d'amorçage auto-signé — les navigateurs vous avertiront. Émettez un certificat approuvé pour le domaine du panneau.",
      "cliNoSocket": "La CLI n'a pas de socket HTTP actif ; serveHttps est déduit des sockets de configuration et d'écoute (ss).",
      "listenHost": "Adresse d'écoute",
      "currentHost": "Cette séance",
      "replaceCert": "Remplacer par un certificat de confiance"
    },
    "timeNtp": "Heure et NTP",
    "clockStatus": "État de l’horloge système",
    "local": "Locale",
    "utc": "UTC",
    "source": "Source",
    "ntpService": "Service NTP",
    "ntpServiceActive": "En cours",
    "ntpServiceInactive": "Arrêté",
    "ntpServiceNa": "N / A",
    "ntpSync": "Synchro. horloge",
    "ntpSyncedYes": "Synchronisé",
    "ntpSyncedNo": "Non synchronisé",
    "ntpSyncedUnknown": "Inconnu",
    "ntpRequested": "Activation de la synchro NTP demandée",
    "ntpFailed": "Échec de l’activation de NTP",
    "enableNtp": "Activer la synchro NTP",
    "network": "Réseau",
    "networkSub": "Lecture seule · le netplan complet n’est pas sur cette page",
    "noIp": "Impossible de lire les IP",
    "storage": "Stockage",
    "metricsDetail": "Détail des métriques",
    "noDisk": "Impossible de lire les disques",
    "avail": "Disp. {{v}}",
    "shortcuts": "Raccourcis Ops",
    "shortcutsAria": "Raccourcis Ops",
    "scServices": "Matrice des services",
    "scServicesD": "cycle de vie de l’unité",
    "scUnit": "Unité du plan de contrôle",
    "scUnitD": "Unité systemd du panneau",
    "scReadiness": "Disponibilité",
    "scReadinessD": "Gate de production",
    "scUpdates": "Mises à jour système",
    "scUpdatesD": "Paquets / CVE",
    "scMetrics": "Métriques de l'hôte",
    "scMetricsD": "Alertes de charge",
    "scLogs": "Centre de journaux",
    "scLogsD": "journal / fichiers",
    "powerTitle": "Alimentation (zone de danger)",
    "powerWarn": "Le redémarrage/arrêt coupe tous les services et le panneau. Le panneau ne peut pas rallumer l’hôte — accès physique ou hyperviseur requis.",
    "unlocked": "Déverrouillé",
    "powerUnlock": "Débloquez la zone dangereuse",
    "powerLock": "Verrouiller la zone dangereuse",
    "noScheduledPower": "Aucun redémarrage ou mise hors tension n'est prévu",
    "powerCaps": "Nécessite YSK_EXECUTE=1 et root. Actuellement EXECUTE={{exec}}, root={{root}}.",
    "scheduledPower": "Arrêt/redémarrage planifié détecté",
    "cancelScheduleHint": ". Utilisez « Annuler la planification » pour retirer.",
    "rebootHost": "Redémarrer l’hôte…",
    "poweroffHost": "Éteindre…",
    "cancelled": "Annulé",
    "cancelFailed": "Échec de l’annulation",
    "cancelSchedule": "Annuler la planification",
    "confirmStrings": "Confirmer avec REBOOT / POWEROFF. Délai par défaut ~1 min pour poweroff et reboot (shutdown +N). Écrit dans l’audit.",
    "confirmReboot": "Confirmer le redémarrage de l’hôte ?",
    "confirmPoweroff": "Confirmer l’arrêt ?",
    "confirmRebootDesc": "Tous les services et sessions du panneau seront interrompus. Tapez REBOOT pour confirmer.",
    "confirmPoweroffDesc": "L’hôte s’éteindra ; le panneau ne peut pas le rallumer à distance. Tapez POWEROFF pour confirmer.",
    "typeToUnlock": "Tapez {{need}} pour déverrouiller",
    "confirmRebootBtn": "Confirmer le redémarrage",
    "confirmPoweroffBtn": "Confirmer l’arrêt",
    "sentDisconnect": "Envoyé — la connexion va se couper",
    "powerFailed": "Échec de l’action d’alimentation",
    "exportExplain": "Export = résumé JSON de la BD du panneau. Rebuild = conf gérée → /etc/nginx/conf.d + reload. Sync nécessite root + EXECUTE.",
    "controlSummary": "Résumé du plan de contrôle",
    "controlSummarySub": "Instantané BD en direct · prévisualiser / télécharger / écrire sur le serveur",
    "snapshotLoaded": "Résumé chargé · {{at}}",
    "previewSummary": "Prévisualiser le résumé",
    "downloadedJson": "JSON téléchargé dans le navigateur",
    "downloadJson": "Télécharger le JSON",
    "snapshotMeta": "Généré {{at}} · utilisateurs {{users}} · paquets {{packages}}",
    "previewHint": "Cliquez sur « Prévisualiser le résumé » pour charger l’instantané du plan de contrôle.",
    "managedNotEtc": "dataDir/nginx/conf.d — pas la même chose que ce qui est appliqué sous /etc",
    "nFiles": "{{count}} fichiers",
    "noManaged": "Aucune conf gérée pour l’instant",
    "noManagedDesc": "Apparaît après la publication du Nginx du projet",
    "readFailed": "Échec de la lecture",
    "preview": "Aperçu",
    "previewModalDesc": "Contenu de la conf gérée (dataDir)",
    "prevPage": "Précédent",
    "nextPage": "Suivant",
    "pageOf": "Page {{page}} / {{total}} · {{count}} fichiers",
    "managedPager": "Pages de conf gérée",
    "syncToSystem": "Synchroniser vers le système",
    "syncSub": "Copier vers /etc/nginx/conf.d et recharger — nécessite root + EXECUTE",
    "syncReload": "Synchronisation + rechargement",
    "syncReloadNeedConfirm": "Confirmation requise — écrit /etc/nginx/conf.d et recharge Nginx",
    "exportOnly": "Export seul + liste conf",
    "dryRun": "Simulation",
    "dryRunNote": "La simulation ne modifie pas le système.",
    "exportHistory": "Historique des exports serveur",
    "exportHistorySub": "dataDir/exports · téléchargement authentifié",
    "noExports": "Aucun fichier d’export serveur pour l’instant",
    "noExportsDesc": "Cliquez sur « Écrire le répertoire d’export » pour créer",
    "downloaded": "Téléchargé {{name}}",
    "download": "Télécharger",
    "syncConfirmTitle": "Synchroniser Nginx vers le système ?",
    "syncConfirmDesc": "Synchroniser la conf Nginx gérée vers /etc/nginx/conf",
    "uptime": "Disponibilité",
    "load1m": "Charger 1m",
    "executeLabel": "EXECUTE",
    "rootLabel": "Racine",
    "managedLabel": "Géré",
    "managedCount": "Géré",
    "exportsCount": "Exportations",
    "managedNginxTitle": "Nginx géré",
    "exportPath": "Chemin d’export",
    "mode": "Mode",
    "managedConf": "Conf gérée",
    "dryRunFlag": "Simulation",
    "timezoneSearch": "Filtrer les fuseaux horaires…",
    "resyncNtp": "Resynchroniser NTP",
    "storageSub": "Utilisation du disque",
    "nginxLeftover": "Reliquat",
    "nginxUnused": "Inutilisé",
    "nginxLeftoverHint": "Conf reliquat (ex. public-files). Incluse dans la sync tant que vous n’agissez pas.",
    "nginxUnusedHint": "Conf stock / catch-all (000-default). Incluse dans la sync tant que vous n’agissez pas.",
    "nginxRemoveLeftover": "Supprimer les restes",
    "nginxRemoveLeftoverTitle": "Supprimer la configuration nginx restante ?",
    "nginxRemoveLeftoverDesc": "Supprime {{name}} de l'inventaire du panneau. La copie live /etc/nginx est supprimée uniquement avec YSK_EXECUTE + root. 000-default n'est pas restant et ne peut pas être supprimé ici.",
    "needExecuteRoot": "Nécessite YSK_EXECUTE + racine"
  },
  "systemd": {
    "enabled": "Activé",
    "disabled": "Désactivé",
    "notInstalled": "Non installé",
    "running": "En cours",
    "notRunning": "Arrêté",
    "failed": "Échoué",
    "activating": "Activation",
    "unitMissing": "Unit manquante",
    "loadFailed": "Échec du chargement",
    "opFailed": "Échec de l’opération",
    "installedEnabled": "Installé et tentative d’activation",
    "unitTemplateWritten": "Modèle d’unit écrit",
    "writeTemplate": "Écrire le modèle du répertoire de gestion",
    "writeTemplateDesc": "Crée ysk-server.service sous dataDir/systemd (ne modifie pas /etc)",
    "templateExists": "Le modèle de gestion existe déjà",
    "installEnable": "Installer dans /etc/systemd et activer",
    "installEnableDesc": "Copier l’unité → daemon-reload → enable --now",
    "needExecuteRoot": "Nécessite YSK_EXECUTE et root",
    "serviceNotRunning": "Service non démarré",
    "serviceNotRunningHint": "L’unité peut être installée mais inactive — essayez Installer et activer ou la matrice des services",
    "controlRunning": "Service du plan de contrôle en cours d’exécution",
    "unlockApply": "Déverrouiller la capacité d’application système",
    "startAsRoot": "Démarrer en root avec YSK_EXECUTE=1",
    "status": "Statut",
    "bootEnabled": "Démarrer au démarrage",
    "on": "Activé",
    "off": "Désactivé",
    "yes": "Oui",
    "no": "Non",
    "canInstall": "Installable",
    "copyEnable": "Copier vers /etc/systemd et enable --now",
    "needExecuteRootShort": "Nécessite EXECUTE + root",
    "probing": "Interrogation de l’état systemd…",
    "suggestedSteps": "Étapes suggérées",
    "install": "Installer",
    "policy": "Politique",
    "about": "À propos",
    "exists": "Existe",
    "missing": "Manquant",
    "notWritten": "Pas encore écrit",
    "related": "Liés",
    "opsResult": "Résultat ops",
    "writeTemplateOnly": "Écrire le modèle uniquement",
    "installAndEnable": "Installer et activer",
    "stepReport": "Rapport d’étape",
    "installEnableShort": "Installer activer",
    "cannotInstall": "Impossible d’installer sur le système pour l’instant : nécessite ",
    "andRoot": " et root. Écrire le modèle crée tout de même les fichiers de gestion. Voir ",
    "probeDetail": "Détail de la sonde",
    "probeDetailSub": "État systemd en direct et fichiers d’unité sur disque",
    "unit": "Unité",
    "manageTemplate": "Modèle de gestion",
    "installOps": "Actions d’installation",
    "twoModes": "Deux modes selon les besoins — choisir selon l’environnement",
    "writeOnlyTitle": "Écrire le modèle uniquement",
    "writeOnlyBody": "Crée le fichier d’unité dans le répertoire de gestion. Utile pour revue ou préparation sans root.",
    "willNotEnable": "N’active pas le service.",
    "writeTemplateBtn": "Écrire le modèle",
    "installEnableTitle": "Installer et activer",
    "installEnableBody": "Copier vers /etc/systemd/system, daemon-reload, enable --now. Nécessite root + EXECUTE.",
    "policyWrite": "Écrire le modèle uniquement — dataDir seulement, pas /etc",
    "policyInstall": "Installer et activer — cp + daemon-reload + enable",
    "policyBlocked": "Sans EXECUTE ou hors root → clairement bloqué, pas de faux succès",
    "policyNotEqual": "Écrire le modèle ≠ service activé ≠ en écoute",
    "shortcutPower": "EXECUTE / pouvoirs",
    "shortcutOther": "Autres unités",
    "cannotInstallFull": "Impossible d’installer sur le système pour l’instant : nécessite YSK_EXECUTE=1 et root. Écrire le modèle crée tout de même les fichiers de gestion. Voir ",
    "policyWriteFull": "Écrire le modèle uniquement — dataDir seulement, pas /etc",
    "policyNotEqualFull": "Écrire le modèle ≠ service activé ≠ en écoute",
    "controlPlaneUnit": "Unité du plan de contrôle",
    "kpiRuntime": "Durée d'exécution",
    "rawStateHint": "État de l'unité brute dans l'info-bulle",
    "bootHint": "Si l'unité démarre au démarrage",
    "kpiBoot": "Activation au démarrage",
    "kpiCaps": "Capacité d’application",
    "capsReady": "Peut installer sur le système",
    "capsBlocked": "Impossible d’appliquer",
    "unitFiles": "Fichiers d’unité",
    "unitFilesSub": "Chemin système vs modèle géré par le panneau (rôles distincts)",
    "systemUnitFile": "Unité système (/etc)",
    "systemUnitHint": "Unité chargée par systemd ; apparaît après install & enable.",
    "managedUnitFile": "Modèle géré (dataDir)",
    "managedUnitHint": "Modèle écrit par le panneau — distinct de l’installation dans /etc.",
    "managedPathHint": "dataDir/systemd/ysk-server.service",
    "fragmentPath": "Chemin du fragment",
    "fromSystemd": "Depuis systemd",
    "pid": "PID {{pid}}",
    "nextAction": "Étape suivante suggérée",
    "controlRunningHint": "systemctl est actif = actif",
    "aboutPolicyTitle": "Appliquer la politique",
    "aboutPolicySub": "L'écriture du modèle et l'installation système sont des étapes distinctes. Relancer après installation est une opération normale, pas une étape manquante.",
    "policyInstallFull": "Installer et activer : copier vers /etc/systemd/system, daemon-reload, enable --now. Nécessite root + EXECUTE.",
    "policyBlockedTitle": "Bloqué sans privilège",
    "policyNotEqualTitle": "Les états ne sont pas équivalents"
  },
  "tabs": {
    "scrollLeft": "Faire défiler les onglets vers la gauche",
    "scrollRight": "Faire défiler les onglets vers la droite",
    "about": "À propos",
    "main": "Actes",
    "stack": "Logiciels",
    "unknown": "Aucun onglet de ce type",
    "unknownHint": "Cette page n'a pas d'onglet nommé {{tab}}."
  },
  "terminal": {
    "tabSession": "Session",
    "target": "Se connecter en tant que",
    "connect": "Connecter",
    "disconnect": "Déconnecter",
    "user": "Utilisateur",
    "size": "Taille",
    "stateConnected": "Connecté",
    "stateConnecting": "Connexion…",
    "stateIdle": "Inactif",
    "connecting": "Ouverture de la session…",
    "connectedAs": "Connecté en tant que {{user}}",
    "disconnected": "Déconnecté",
    "error": "Erreur du terminal",
    "wsError": "Échec WebSocket",
    "exitCode": "Code de sortie {{code}}",
    "needRootExecute": "Nécessite root + YSK_EXECUTE=1 pour les shells système.",
    "groupSystem": "Système",
    "groupProject": "Projet",
    "unavailable": "indisponible",
    "copyAll": "Copier tout",
    "copyAllNeedConn": "Connectez-vous d'abord - le tampon est vide lorsqu'il est déconnecté",
    "placeholder": "Choisissez une identité, puis Connecter",
    "aboutTitle": "À propos du terminal",
    "aboutSub": "Shell OS interactif dans le navigateur (utilisateurs locaux). Pas un client SSH distant arbitraire.",
    "aboutWhat": "Présentation",
    "aboutWhatBody": "Vrai shell de connexion PTY (bash -l). Utilisateurs projet via runuser ; root via shell root.",
    "aboutReq": "Prérequis",
    "aboutReqBody": "Le plan de contrôle doit s'exécuter en root avec YSK_EXECUTE activé.",
    "aboutUsers": "Identités",
    "aboutUsersBody": "Root, ou utilisateurs Linux de projet provisionnés par l'OS.",
    "stepUpRequired": "Le shell root nécessite un code TOTP / de récupération",
    "stepUpHint": "La connexion root exige une élévation 2FA lorsque votre compte a le TOTP activé.",
    "stepUpTitle": "Confirmer le shell root",
    "stepUpDesc": "Saisissez le code de votre authenticator ou un code de récupération.",
    "totpLabel": "Code TOTP / de récupération",
    "sessionStillOpen": "Un live shell est toujours connecté pendant que vous lisez cette page.",
    "rootConfirmTitle": "Ouvrir un shell racine ?",
    "rootConfirmDesc": "Cette session est un PTY racine sans restriction sur l'hôte. Les commandes sont auditées.",
    "rootConfirmBody": "Continuez uniquement si vous avez l'intention d'exécuter des commandes d'hôte privilégiées."
  },
  "uiInline": {
    "s27d9daa5": "durée d'exécution {{v0}} {{v1}}，",
    "sb8eaefa3": "durée d'exécution {{v0}}，",
    "s7d540128": "· {{v0}}",
    "s814bcc7c": "· {{v0}}",
    "s3f7c3eae": "Mettre à jour",
    "s92e48065": "Ignorer",
    "sdff0f697": "Surveiller",
    "s012f2d7e": "Mettre à jour",
    "s20455064": "…",
    "s9b34f8c3": "…",
    "s8e3824cb": "Mise à jour 0/{{v0}}：…",
    "sc2570ff7": "Mise à jour {{v0}}/{{v1}}：{{v2}}",
    "s0bd0c471": "： {{v0}}，Échec {{v1}}",
    "s2980553a": "…",
    "s303ee0f7": "Annuler…（）",
    "s21858fe5": "Annuler",
    "sddc05404": "Fermer",
    "saf251c2a": "Mise à jour（）",
    "s5929623c": "…",
    "s18b08919": "…",
    "se2b088fc": "Mise à jour ({{v0}})",
    "sb2848bc7": "Mettre à jour ?",
    "sc1910cf2": "{{v0}} 。 root EXECUTE。",
    "sc13bb38c": "／；。",
    "sea4ba90a": "Chargé",
    "sdd78429a": "Écrit",
    "s9b6c1b03": "À propos",
    "s858f4eca": "…",
    "s090aa1a7": "Gérer。 Nginx Projects → → 。",
    "sac96ec39": "Le panneau a enregistré l'installation de {{v0}}, mais la sonde hôte n'a trouvé aucun binaire. Non installé — relancer la sonde ou réinstaller.",
    "sf7f7807b": "Par défaut",
    "sc9530028": "Dernier,",
    "s9602769e": "Installé {{v0}} · dernière version amont {{v1}}",
    "sb8b5a353": "Go／Rust ：「Installer」，「Par défaut」 PATH 。",
    "sac155c20": "Extensions non essentielles amovibles (apt remove ; conserve FPM/CLI)",
    "s23379974": "「Installer」。， runtime。",
    "s7b6d4414": "PHP {{v0}} non installé ：「Installer PHP {{v0}}」+（Installer）。",
    "s2e9a1b03": "Installer PHP {{v0}}（）",
    "s62b73dd7": "…",
    "se23513e5": "PHP？",
    "sf8c8ff4b": "Va exécuter apt remove \"{{v0}}\". Le cœur FPM/CLI ne sera pas supprimé.",
    "s7aa09150": "Installé",
    "sbcbdbc49": "Non installé",
    "sae7738d0": "En cours",
    "sf3af7c5e": "Non détecté",
    "sa1d77833": "Échoué",
    "s75dddf52": "Arrêté",
    "s4e7f6152": "Mise à jour… {{v0}}/{{v1}}：{{v2}}",
    "s72cac69e": "{{v0}} : {{v1}}",
    "sd1c15b6d": "{{v0}} : {{v1}}",
    "s7a90f74c": "Mise à jour：{{v0}}",
    "s0aa24093": "Mise à jour {{v0}}",
    "s5d92ffc3": "：{{v0}}；Échec：{{v1}}",
    "sa15a291f": "ÉchecMiseÀJour",
    "sbb823c06": "Échoué",
    "s68db1348": "ÉchecMiseÀJour {{v0}}",
    "s84a4e7c6": "Installation：{{v0}}…",
    "s2ca8a4f5": "racine + EXÉCUTER；。",
    "sd9419dc9": "Installer（ root+EXECUTE）",
    "s3ec3d449": "Installation {{v0}}",
    "sbb8dfdeb": "Installation：{{v0}}",
    "s18bb4b62": "Installation／ {{v0}}",
    "se9a47def": "Installer",
    "sdc0528a2": "ÉchecInstallation {{v0}}",
    "s69e60fb5": "Aucune cible de mise à jour",
    "s3f50fa6e": "Installer／Mettre à jour {{v0}} {{v1}}…（）",
    "s1f5eef17": "Afficher le serveur ，Fermer。",
    "s2bf6b642": "Mettre à jour（ root YSK_EXECUTE=1）",
    "s9b4a58e8": "Installation {{v0}} {{v1}}",
    "s6dc82720": "Installé／Mise à jour {{v0}} {{v1}}",
    "s94a1f025": "。Afficher，。",
    "s73cae5a0": "ÉchecInstallation {{v0}} {{v1}}",
    "se1050a28": "Vue d'ensemble",
    "s8c29cb38": "…",
    "s583f0654": "…",
    "s4344c486": "…",
    "sed2550e1": "…",
    "scb435db5": "Service",
    "s97bbc1b7": "…",
    "s60a23151": "Gérer：Installation、Service、；Gérer。",
    "s5387b55b": "…",
    "s0b582c70": "…",
    "s4be2a3a4": "Installé",
    "s259e6f0e": "／",
    "s13b3f970": "Nécessite une attention",
    "sdd33adf9": "…",
    "sdfaaf946": "；Mettre à jour。",
    "s78f03e20": "{{v0}}",
    "sbf368054": "{{v0}}",
    "s235a7426": "Mettre à jour",
    "s14249f75": "Rapide",
    "saff76d0a": "Service",
    "s24f12f4f": "Mettre à jour／Installer",
    "s43a9fd7a": "：Amont／；Service：。Mettre à jour。",
    "sc45743bd": "…",
    "s00338fde": "Mettre à jour ?",
    "s0e05f4b7": "Mettre à jour",
    "s4d0b4688": "Annuler",
    "s92b8bf67": "Installer？",
    "s9af27043": "Installer {{v0}}：{{v1}}。 root YSK_EXECUTE=1。",
    "s28263d85": "Installer",
    "s2e37cbfa": "Installé：{{v0}}",
    "s7d52bb0c": "Par défaut {{v0}}",
    "s9f898b85": "Amont {{v0}}",
    "s93dde991": "{{v0}} → {{v1}}",
    "s9071dcb7": "{{v0}} installé · le dépôt est à jour",
    "s0b09f444": "{{v0}}",
    "sf6cc774f": "Non installé（GérerInstallation）",
    "s42f9c88b": "{{v0}}",
    "sb72e8ebc": "Vérification des versions… ou ouvrez la page de gestion",
    "sabac942e": "Ouvrez la page de gestion pour installer ou configurer",
    "sbd26894e": "Mise à jour disponible",
    "s5985ee9a": "À jour",
    "s090e6a43": "Choisir la version",
    "s8253535d": "Installer／Mettre à jour {{v0}}",
    "s1723f1d7": "Installation……",
    "sd9db02d0": "Mettre à jour",
    "sba60558e": "Mettre à jour {{v0}}",
    "s706de938": "Mettre à jour {{v0}}",
    "s0f9ddc70": "Installer {{v0}}",
    "sef864639": "Installer",
    "s59f613d5": "Installer／ {{v0}}",
    "s78b1688f": "Mettre à jour {{v0}}",
    "s4989b5cf": "Gérer",
    "s72203f17": "Service",
    "s75817a35": ", durée d'exécution",
    "s6d449473": "…",
    "s777e90e0": "Gérer",
    "sd8bc8ab3": "Nom：{{name}}",
    "s09877be5": "Gérer",
    "sd95910ce": "…",
    "sa72ef18d": "Outils",
    "s4b2bec80": "Nom",
    "sd00c0d39": "PHP ；Nom",
    "sd7c669ac": "phpMyAdmin（）",
    "s9e5d3a97": "： {{v0}}，Échec {{v1}}",
    "s1f0a4bf9": "Annuler（）",
    "s7193f51b": "： {{v0}}，Échec 0",
    "sd93b8620": "{{v0}} Outils",
    "sd0ef129c": "({{v0}})",
    "se6d47d0b": "Outils",
    "se6436711": "Installer les outils ({{v0}})",
    "s1a27a3c4": "Outils「Installer le runtime」Installer（Installer）。",
    "s32add03e": "{{v0}} Outils。",
    "s3bca33b2": "Outils",
    "s8072fa0d": "{{v0}} Installation（Par défaut）",
    "s2bf2b4c4": "InstallDefault.「Par défaut」；Installation。",
    "s42f3d613": "Par défaut {{v0}}",
    "sdcdc5029": "Mise en production incomplète",
    "s55cc91e0": "Publication Nginx，。",
    "s303f6113": "Réessayer le déploiement",
    "s3265f9ed": "Publier Nginx",
    "s99cc48c1": "{{v0}} ；「— —」。",
    "sa87ceeff": "Publier Nginx",
    "s38a63bcb": "Port fixe（）",
    "s5ac95c29": "Non publiée",
    "sc8f34a0d": "Écrit（ reload）",
    "s07fb5671": "Déployer d'abord",
    "sa5f994e3": "Échec de la publication",
    "s32dd17d9": "SSL 。「SSL 」／，Publication + SSL。",
    "s5516cb5b": "Statut du site",
    "sed38f4ea": "En amont",
    "sadb6ef47": "Port du processus",
    "se7a422dd": "Port fixe",
    "s2eff57b7": "Port du processus",
    "s110671e6": "Port actuel",
    "s549ea65e": "Publier",
    "s9dc5c003": "Basique",
    "s04a32a1e": "SSL :",
    "s564d50b7": "／Publication + SSL。",
    "sbb6c72f1": "({{v0}})",
    "sd9b695a5": "，Publication Nginx / SSL。",
    "scb85cfff": "SSL",
    "s18c1af46": "Publication + SSL",
    "s6a284cb0": "Publier Nginx + SSL",
    "s85483ffb": "Entretien",
    "s6993c6ba": "Masquer",
    "s15671929": "Afficher",
    "s56f99a6b": "Supprimer définitivement le projet",
    "sa0f2f5c6": "「{{v0}}」。。",
    "sa6710b42": "Supprimer définitivement",
    "s06569331": "systèmed / PM2 /",
    "sd20a5b0c": "Configuration Nginx、Pool PHP-FPM、Apache vhost（）",
    "s4ff53acc": "LinuxMaison（）",
    "s50dda2df": "AccueilLinux（）",
    "sa7f90a4a": "…",
    "se0d24557": "Nom",
    "s9a9e4e32": "Accueil Linux",
    "s1cf2a97b": "Annuler，",
    "s51af87fd": "Nom",
    "s8b04d62f": "「{{v0}}」",
    "s49d55c8f": "Zone DNS / domaine 。",
    "s239f6551": "：{{v0}}",
    "sa00380bd": "：{{v0}}",
    "sb4e3bb0b": "Installer",
    "sae926193": "…",
    "s52573ef8": "Mise à jour（ root+EXECUTE）",
    "s872d2fe0": "Mise à jour {{v0}}",
    "s6a93c0ec": "Chargement des versions…",
    "s378e49b6": "Installé",
    "s7e805a12": "Dernière",
    "s74b39712": "À jour / dépôt à jour",
    "s03a87d5d": "Revérifier la dernière version",
    "s53c07a48": "Mettre à jour {{v0}}",
    "s425e8381": "Installer {{v0}}",
    "s5bd1242f": "{{v0}}：{{v1}} → {{v2}}。 root EXECUTE。",
    "s296817b1": "Installation（）",
    "s3568a3da": "…",
    "s28256229": "Terminé",
    "s3971290f": "serveur …"
  },
  "updates": {
    "title": "Mises à jour intelligentes",
    "body": "",
    "risk": {
      "critical": "Critique",
      "high": "Élevé",
      "medium": "Moyen",
      "low": "Faible"
    },
    "justNow": "À l'instant",
    "secAgo": "il y a {{n}} s",
    "minAgo": "il y a {{n}} min",
    "hourAgo": "il y a {{n}} h",
    "highRiskN": "{{count}} à haut risque",
    "panelUpdate": "Mise à jour du panneau disponible",
    "footerNewVersion": "Nouvelle version {{version}}",
    "riskOk": "Risque maîtrisable",
    "riskUnevaluated": "Non évalué - exécutez Scan + OSV",
    "pendingScan": "En attente d'analyse",
    "packages": "Paquets",
    "highRisk": "Risque élevé",
    "needApproval": "Approbation requise",
    "hasCve": "Avec CVE",
    "panel": "Panneau",
    "schedule": "Planification",
    "reload": "Recharger",
    "osvTitle": "Interroger OSV pour les 12 paquets suggérés prioritaires (réseau requis)",
    "scanOsv": "Analyse + OSV",
    "cveNotChecked": "Non vérifié",
    "scanPkgs": "Analyser les paquets",
    "tabInventory": "Inventaire des paquets",
    "tabSelf": "Panneau lui-même",
    "badgeUpdate": "Mettre à jour",
    "tabSchedule": "Planification",
    "tabPolicy": "Politique",
    "scanning": "Analyse…",
    "inventoryTitle": "Inventaire des paquets",
    "inventoryDesc": "Affichage {{shown}} / {{total}} · inventorié {{when}}",
    "riskFilterAria": "Filtre de risque",
    "all": "Tous",
    "upgradable": "Actualisable",
    "mediumFilter": "Moyen",
    "lowUnmarked": "Faible / non marqué",
    "searchPh": "Paquet / conseil / CVE…",
    "searchAria": "Rechercher des paquets",
    "colPackage": "Paquet",
    "colVersion": "Version (installée → candidat apt)",
    "installedTitle": "Installé",
    "noUpgrade": "(aucune mise à niveau disponible)",
    "colAdvice": "Conseil",
    "upgradeTo": "Mettre à niveau vers {{v}}",
    "sameVersion": "Le candidat apt correspond à la version installée",
    "noNeedUpgrade": "Aucune mise à niveau nécessaire",
    "emptyInventory": "Aucune donnée de paquet pour l'instant",
    "emptyInventoryDesc": "Utilisez « Analyser les paquets » dans l'en-tête de la page pour inventorier cet hôte",
    "emptyFilter": "Aucun paquet ne correspond aux filtres",
    "emptyFilterDesc": "Modifiez les filtres de risque ou effacez la recherche",
    "resetFilters": "Réinitialiser les filtres",
    "selfLoading": "Chargement de l'état de la mise à jour du panneau…",
    "selfTitle": "Mise à jour du panneau",
    "selfCheckFailed": "Échec de la vérification",
    "selfUpToDate": "À jour",
    "selfAvailable": "Mise à jour disponible",
    "selfCurrent": "Version actuelle",
    "selfLatest": "Dernière version",
    "selfChannel": "Canal",
    "checkSelf": "Rechercher les mises à jour",
    "applySelf": "Appliquer la mise à jour du panneau",
    "scheduleTitle": "Planification de l'analyse automatique",
    "scheduleDesc": "Inventaire périodique ; n'effectue pas de mise à niveau automatique",
    "enabled": "Activé",
    "disabled": "Désactivé",
    "cron": "Expression cron",
    "saveSchedule": "Enregistrer la planification",
    "policyTitle": "Politique de mise à jour",
    "policyBody": "Les paquets à haut risque et CVE nécessitent une approbation avant application",
    "applyPkg": "Appliquer la mise à niveau du paquet",
    "rebootNeeded": "redémarrer",
    "kernelRebootHint": "Les packages du noyau nécessitent un redémarrage après l'application",
    "applyPkgConfirm": "Mettre à niveau {{name}} ?",
    "applyPkgDesc": "Exécute apt upgrade pour ce paquet sur l'hôte. Nécessite root + YSK_EXECUTE.",
    "lastScan": "Dernière analyse",
    "never": "Jamais",
    "cve": "CVE",
    "riskCol": "Risque",
    "selfUpdatable": "Mise à jour possible",
    "selfCurrentShort": "Actuel",
    "selfLatestShort": "Dernière",
    "applyPanelUpdate": "Appliquer la mise à jour du panneau",
    "applySelfConfirmTitle": "Appliquer la mise à jour du panneau ?",
    "applySelfConfirmDesc": "Installez {{from}} → {{to}} et redémarrez le service du panneau. Il n’y a pas de test à sec.",
    "applyPanelAlreadyLatest": "Déjà la dernière version du panneau",
    "recheck": "Revérifier",
    "aboutScope": "Portée",
    "aboutScopeV": "panneau du serveur ysk + services de catalogue + environnements d'exécution + packages apt restants",
    "aboutChannel": "Canal",
    "aboutChannelV": "package npm ysk-server → version GitHub → apps/server/package.json ; appliquer : npm i -g ysk-server@version ou git (YSK_SOURCE_ROOT)",
    "aboutFail": "Échecs",
    "aboutFailV": "Les canaux indisponibles ne sont pas signalés comme à jour ; l'application nécessite EXECUTE ; l'application git nécessite un redémarrage du service",
    "jobsTitle": "Tâches planifiées",
    "jobsSub": "Planificateur du plan de contrôle (lecture seule) · {{count}}",
    "noJobs": "Aucune planification visible",
    "noJobsDesc": "Désactivé ou aucune tâche du planificateur pour l'instant",
    "lastRun": " · dernier {{when}}",
    "scanPolicy": "Analyser",
    "scanPolicyV": "Analyser ≠ mis à niveau ; appliquer modifie le système",
    "highRiskPolicy": "Risque élevé",
    "highRiskPolicyV": "Approbation requise : seconde confirmation avant envoi",
    "needApprovalHint": "Ouvrez Disponible et filtrez les packages qui nécessitent une approbation",
    "applyNeedConfirm": "Ouvre une boîte de dialogue de confirmation avant d'appliquer",
    "probeFailed": "La sonde a échoué",
    "notViaApt": "Non géré par apt — aucun candidat",
    "noCandidate": "Aucune version candidate",
    "cveLabel": "CVE",
    "jobOpenGeo": "Page GéoIP",
    "job": {
      "protection_probe": {
        "name": "Sonde de protection",
        "hint": "Signaux de défense périodiques"
      },
      "updates_scan": {
        "name": "Analyse des mises à jour",
        "hint": "Actualiser l'inventaire des packages"
      },
      "daily_backup": {
        "name": "Sauvegarde quotidienne",
        "hint": "Sauvegarde planifiée tout"
      },
      "db_temp_expire": {
        "name": "Expiration des utilisateurs de base de données temporaires",
        "hint": "Supprimer les utilisateurs de base de données temporaires expirés"
      },
      "defense_auto_ban": {
        "name": "Interdiction automatique de la défense",
        "hint": "Appliquer une coche d'interdiction automatique"
      },
      "defense_geoip_update": {
        "name": "Mise à jour GeoIP",
        "hint": "Télécharger les bases de données GeoIP"
      },
      "log_auto_vacuum": {
        "name": "Aspirateur à bûches",
        "hint": "conservation du journal"
      },
      "email_dnsbl": {
        "name": "Envoyer un e-mail à DNSBL",
        "hint": "Vérification DNSBL par courrier"
      },
      "validators_upgrade_scan": {
        "name": "Analyse de mise à niveau des validateurs",
        "hint": "Vérifier l'image du validateur/les mises à jour binaires"
      }
    },
    "permPolicy": "Autorisations",
    "permPolicyV": "Sans EXECUTE/root → bloqué (pas de faux succès)",
    "osvPolicyV": "Nécessite le réseau ; enrichit uniquement les 12 premières suggestions",
    "relatedAria": "Liés",
    "scHost": "Paramètres de l'hôte",
    "scReadiness": "Disponibilité",
    "scReadinessD": "Gate de production",
    "scSystemd": "unité systemd",
    "scSystemdD": "Service du plan de contrôle",
    "scSecurity": "Centre de sécurité",
    "scSecurityD": "Approbation / outils",
    "applyHighRisk": "Appliquer la mise à jour à haut risque {{name}} ?",
    "highRiskUpdate": "Mise à jour à haut risque",
    "remoteUnknown": "Distant inconnu",
    "hasUpdate": "Mise à jour disponible",
    "scanned": "{{count}} paquet(s) analysé(s)",
    "scannedWithOsv": "{{count}} paquet(s) analysé(s) (avec OSV)",
    "realUpgradeable": "{{count}} réellement mis à niveau",
    "panelCheckFailed": "Échec de la vérification de version du panneau",
    "applyIncomplete": "Application incomplète",
    "appliedPackage": "Mise à jour du paquet appliquée",
    "updateFailed": "Échec de la mise à jour",
    "updateIncomplete": "Mise à jour incomplète",
    "appliedUpdate": "Mise à jour appliquée",
    "panelRestarting": "Le panneau redémarre pour charger la nouvelle version…",
    "panelRestarted": "Panneau de retour · {{version}}",
    "panelRestartWait": "Mise à jour appliquée. Si la page ne se rafraîchit pas, rechargez dans quelques secondes.",
    "reloadUi": "Recharger l'interface utilisateur",
    "reloadUiTitle": "Recharger l'interface utilisateur du panneau ?",
    "reloadUiDesc": "Le service du panneau est {{version}}. Cet onglet a toujours l'interface précédente jusqu'à ce que vous rechargez. Les champs non enregistrés sur cette page seront perdus.",
    "aptCandidate": "candidat compétent",
    "advice": {
      "update": "Mise à jour recommandée",
      "skip": "Ignorer",
      "watch": "Surveiller",
      "urgent": "Mise à jour urgente"
    },
    "selectCol": "Sélectionner",
    "selectAllUpgradable": "Tout sélectionner (mis à niveau)",
    "clearSelection": "Effacer la sélection",
    "updateSelected": "Mettre à jour la sélection ({{n}})",
    "batchConfirmTitle": "Confirmer la mise à jour groupée des paquets ?",
    "batchConfirmBody": "Mettra à niveau {{n}} paquet(s) dans l’ordre. Nécessite root et EXECUTE.",
    "batchConfirmHighRisk": "La sélection inclut des paquets à haut risque / soumis à approbation ; j’ai examiné et j’approuve l’application.",
    "batchProgress": "Mise à jour groupée {{n}}/{{total}} : {{pkg}}",
    "batchDone": "Groupé terminé : {{ok}} ok, {{fail}} échec(s)",
    "batchPartialFail": "Certains ont échoué : {{list}}",
    "batchEmpty": "Sélectionnez d’abord des paquets mis à niveau",
    "batchNoneUpgradable": "Aucun paquet mis à niveau dans le filtre actuel",
    "batchCancel": "Annuler le groupé",
    "batchCancelling": "Annulation… (arrêt après le paquet en cours)",
    "batchCancelled": "Annulé (restants ignorés)",
    "batchRescanned": "État des paquets de l’hôte réanalysé",
    "applyLogTitle": "Mise à jour（）",
    "navBadgeTitle": "Mises à jour en attente : {{n}}",
    "aboutPolicySub": "Périmètres d’analyse, d’application, de privilèges et OSV. Analyser n’est pas la même chose que mis à niveau.",
    "tabOverview": "Vue d'ensemble",
    "overviewHint": "Le serveur analyse les packages selon un planning. Installer le logiciel sur chaque page de fonctionnalités ; cette page vérifie et applique uniquement les mises à niveau.",
    "overviewStale": "Les données de numérisation sont obsolètes. Exécutez une analyse ou attendez la prochaine vérification automatique.",
    "nextScan": "Analyse suivante",
    "autoScan": "Analyse automatique",
    "autoScanEnable": "Activer l'analyse automatique des packages",
    "scanInterval": "Intervalle de scan",
    "interval6h": "Toutes les 6 heures",
    "interval12h": "Toutes les 12 heures",
    "interval24h": "Toutes les 24 heures",
    "interval48h": "Toutes les 48 heures",
    "scheduleSaved": "Planification d'analyse enregistrée",
    "scanNow": "Scannez maintenant",
    "viewUpgradable": "Voir évolutif",
    "installElsewhere": "Pour installer des packages (Nginx, PHP, bases de données…), ouvrez la page des fonctionnalités correspondantes – pas ce hub.",
    "status": "Statut",
    "groupService": "Services",
    "groupRuntime": "Durées d'exécution",
    "groupOs": "Paquets système",
    "notInstalled": "Non installé",
    "goToPage": "Ouvrir la page",
    "hubHint": "Cataloguez les logiciels et les environnements d'exécution sur cet hôte. Numérisez pour actualiser.",
    "intervalDay": "tous les jours",
    "intervalDays": "tous les {{n}} jours",
    "intervalHour": "toutes les heures",
    "intervalHours": "toutes les {{n}} heures",
    "intervalMinutes": "toutes les {{n}} minutes",
    "intervalSeconds": "toutes les {{n}} secondes",
    "availableHint": "Packages avec un candidat plus récent du gestionnaire de packages.",
    "servicesHint": "Services de catalogue sur cet hôte. Ouvrez la page du service pour installer.",
    "runtimeHint": "Durées d'exécution sur cet hôte. Les mises à niveau de version sont effectuées sur chaque page d'exécution.",
    "needsReboot": "Redémarrage nécessaire",
    "kernelRebootWarn": "L'installation d'un nouveau noyau nécessite généralement un redémarrage avant son utilisation.",
    "neverRun": "pas encore couru",
    "scanOsvN": "Scan + OSV (premier {{n}})"
  },
  "users": {
    "userCount": "{{count}} utilisateurs",
    "users": "Utilisateurs",
    "packages": "Paquets",
    "suspended": "Suspendu",
    "securityCenter": "Centre de sécurité",
    "singleAdminNo2fa": "Cet hôte a un seul administrateur et 2FA est désactivé : activez 2FA et ajoutez un administrateur de sauvegarde.",
    "enableAdmin2fa": "Activer l'administrateur 2FA",
    "addBackupAdmin": "Ajouter un administrateur de sauvegarde",
    "loading": "Chargement des utilisateurs et paquets…",
    "userList": "Utilisateurs ({{count}})",
    "userListDesc": "Ouvrir le détail pour modifier le rôle, le mot de passe, le forfait, les dérogations",
    "createUser": "Créer un utilisateur",
    "operatorHighRiskHint": "Le rôle opérateur d’usine inclut des écritures à haut risque. Le restreindre n’affecte que les nouveaux comptes ; changer le défaut affecte les opérateurs existants.",
    "createUserPlus": "+ Créer un utilisateur",
    "searchPh": "Nom d’utilisateur / rôle / forfait",
    "searchPkgPh": "Nom du package",
    "searchUsersAria": "Rechercher des utilisateurs",
    "user": "Utilisateur",
    "roles": "Rôles",
    "package": "Paquet",
    "packageAria": "Forfait {{name}}",
    "noneOption": "— aucun —",
    "resume": "Reprendre",
    "suspend": "Suspendre",
    "impersonate": "Usurper l'identité",
    "impersonateHint": "Ouvre une session en tant qu'utilisateur. Utilisez le menu du compte pour quitter l’usurpation d’identité.",
    "cannotDeleteSelf": "Impossible de supprimer le compte actuellement connecté",
    "cannotImpersonateSelf": "Vous êtes déjà connecté avec ce compte",
    "openDetail": "Détails",
    "edit": "Modifier",
    "resetPassword": "Réinitialiser le mot de passe",
    "newPassword": "Nouveau mot de passe",
    "saveUser": "Enregistrer l’utilisateur",
    "userSaved": "{{name}} mis à jour",
    "filterAll": "Tous",
    "filterAdmin": "Administrateur",
    "filterOperator": "Opérateur",
    "filterViewer": "Téléspectateur",
    "filterSuspended": "Suspendu",
    "filterNoPkg": "Aucun forfait",
    "filter2faOff": "2FA désactivée",
    "filterOverrides": "A des dérogations",
    "subscribers": "Abonnés",
    "subscribersN": "{{count}} utilisateurs",
    "ftp": "FTP",
    "ssh": "SSH",
    "databases": "Bases de données",
    "bandwidth": "Bande passante MiB",
    "notes": "Remarques",
    "editPkg": "Modifier le forfait",
    "pkgUpdated": "Forfait {{name}} mis à jour",
    "pkgList": "Forfaits ({{count}})",
    "pkgListDesc": "Modifier les quotas ; suppression bloquée tant que des abonnés restent",
    "createPkg": "Créer un forfait",
    "createPkgPlus": "+ Créer un forfait",
    "mailboxes": "Boîtes mail",
    "diskMiB": "Disque MiB",
    "noPackages": "Aucun forfait pour le moment",
    "noPackagesHint": "Créez un plan à partir de la barre d'outils, puis liez-le aux utilisateurs.",
    "createUserDesc": "Mot de passe min. 8 caractères ; modifier le rôle et les permissions en détail plus tard",
    "username": "Nom d'utilisateur",
    "passwordHint": "Au moins 8 caractères",
    "role": "Rôle",
    "roleAria": "Rôle utilisateur",
    "createPkgDesc": "Modèle de quotas ; lier aux utilisateurs plus tard",
    "maxProjects": "Projets max.",
    "diskQuota": "Disque MiB",
    "custom": "Personnalisé",
    "createdUser": "Utilisateur {{name}} créé",
    "createdPkg": "Forfait {{name}} créé",
    "impersonateTitle": "Usurper l'identité de {{name}} ?",
    "deleteUserTitle": "Supprimer {{name}} ?",
    "deletePkgTitle": "Supprimer le forfait {{name}} ?",
    "impersonateDesc": "Votre session actuelle sera remplacée (~2 heures).",
    "deleteUserDesc": "Cette action est irréversible.",
    "deletePkgDesc": "Suppression refusée tant que des utilisateurs utilisent encore ce forfait.",
    "lastSeen": "Dernière activité",
    "neverSeen": "Jamais",
    "hostUsage": "Utilisation de l'hôte",
    "hostUsageHint": "Totaux machine (hôte), pas d'isolation stricte par utilisateur",
    "hostTotalsBadge": "totaux hôte",
    "opsChecklist": "Liste de contrôle ops",
    "opsCheck1": "Attribuer Admin uniquement à ceux qui ont besoin des privilèges ; utiliser Operator au quotidien.",
    "opsCheck2": "Enregistrer après modification des permissions ; la restauration en un clic rétablit les valeurs d'usine.",
    "opsCheck3": "Ne pas supprimer les forfaits avec abonnés ; désassigner d'abord.",
    "opsCheck4": "La restauration de sauvegarde est destructive — Admin par défaut ; confirmer avant d'accorder à Operator.",
    "detailDesc": "Compte, aperçu des accès et dérogations avancées",
    "tabAccount": "Compte",
    "tabAccess": "Accès",
    "tabAdvanced": "Avancé",
    "rolePickHint": "Choisir le bon rôle métier ; Admin reste entièrement ouvert",
    "accountSection": "Paramètres du compte",
    "packageHint": "Modèle de forfait d'hébergement (optionnel)",
    "resetPasswordOptional": "Laisser vide pour conserver le mot de passe",
    "accountStatus": "Statut du compte",
    "suspendedHint": "Suspendu : connexion impossible",
    "activeHint": "Actif : peut se connecter et travailler",
    "accessHint": "Capacités effectives issues de la politique de rôle (libellés lisibles)",
    "noCapsInBand": "Aucune capacité à ce niveau",
    "overridesHint": "Affecte uniquement cet utilisateur ; les valeurs par défaut du rôle restent inchangées",
    "adminNoOverrides": "Les utilisateurs Admin sont toujours entièrement ouverts ; les retraits personnels ne s'appliquent pas.",
    "grantsHint": "Capacités supplémentaires au-delà du pack de rôle",
    "revokesHint": "Désactiver les capacités héritées (pas pour Admin)",
    "searchCaps": "Rechercher des capacités…",
    "noCapMatch": "Aucune capacité correspondante",
    "no2fa": "2FA désactivée",
    "lastSeenValue": "Dernière activité {{time}}",
    "roleName": {
      "admin": "Administrateur",
      "operator": "Opérateur",
      "viewer": "Téléspectateur",
      "agent": "Agent"
    },
    "roleDesc": {
      "admin": "Contrôle total : utilisateurs, permissions, opérations destructives. Toujours entièrement ouvert.",
      "operator": "Ops quotidiennes : services, mises à jour, DNS/SSL, sites.",
      "viewer": "Lecture seule : statut, journaux, listes — aucune modification.",
      "agent": "Agent d'automatisation : écritures à faible risque avec limites de périmètre."
    },
    "securityTitle": "Authentification à deux facteurs (cet utilisateur)",
    "securityPerUserHint": "TOTP/Passkey est par utilisateur",
    "securityStatusOn": "2FA activée",
    "securityStatusOff": "2FA non configurée",
    "securitySessions": "Sessions actives",
    "securityClearTotp": "Forcer la suppression de la 2FA de cet utilisateur",
    "securityClearTotpHint": "Nécessite une authentification renforcée",
    "securityClearConfirm": "Saisissez le nom d'utilisateur pour confirmer la suppression de la 2FA",
    "securityClearOk": "2FA supprimée pour {{name}}",
    "securitySelfNote": "Pour configurer votre propre 2FA, ouvrez Sécurité → Ma sécurité.",
    "cannotModifySelf": "Impossible de suspendre ou rétrograder le compte actuellement connecté",
    "cannotDeleteLastAdmin": "Impossible de supprimer le dernier administrateur",
    "cannotDemoteLastAdmin": "Impossible de suspendre ou rétrograder le dernier administrateur",
    "lockSelfHint": "Ceci est le compte connecté. La suppression, la suspension et le changement de rôle sont bloqués pour éviter un verrouillage.",
    "lockLastAdminHint": "Ceci est le dernier administrateur. La suppression, la suspension et la rétrogradation sont bloquées.",
    "demoteAdminTitle": "Rétrograder cet administrateur ?",
    "demoteAdminDesc": "Cet utilisateur perdra l’accès administrateur complet. Confirmez qu’un autre administrateur reste.",
    "quotaNonNeg": "Les décomptes et les quotas ne peuvent pas être négatifs.",
    "diskQuotaHint": "Les préréglages sont en GiB ; la boîte personnalisée est MiB.",
    "bandwidthHint": "0 signifie illimité."
  },
  "validators": {
    "title": "Validateurs (Beta)",
    "subtitle": "Installez et gérez des nœuds L1 sur cet hôte. Non dépositaire — vous gardez les clés.",
    "beta": "Beta",
    "tab": {
      "nodes": "Nœuds",
      "disk": "Disque",
      "stack": "Logiciel",
      "about": "À propos"
    },
    "empty": {
      "title": "Aucun nœud validateur pour l’instant",
      "desc": "Créez un nœud de testnet en quelques clics."
    },
    "refresh": "Actualiser",
    "software": {
      "engine": "Moteur Docker",
      "engineDesc": "Les nœuds de validation s'exécutent en tant que projets Compose. Installez Docker ici s'il est manquant. L'élagage de l'image reste sur la page Docker.",
      "client": "Client",
      "image": "Image",
      "present": "Locale",
      "local": "Tiré",
      "missing": "Pas tiré",
      "size": "Taille",
      "usedBy": "Utilisé par",
      "unused": "Aucun exemple",
      "pull": "Pull",
      "pulled": "Sur cet hôte",
      "pulling": "Tirez {{ref}}",
      "empty": "Aucune image client épinglée",
      "emptyDesc": "Le catalogue est vide. Cela ne devrait pas arriver.",
      "daemonDown": "Le moteur Docker ne fonctionne pas",
      "source": "Source",
      "official": "Dernier officiel",
      "officialNewer": "Officiel plus récent",
      "stale": "Derrière la broche",
      "staleItem": "{{id}} ({{tag}})",
      "pin": "Goupille du panneau",
      "openRelease": "Notes de version",
      "chooseOnInstance": "Modifiez la version sur la page de l'instance. Extraire une image ne ré-étiquete pas un nœud en cours d'exécution."
    },
    "disk": {
      "title": "Disque des validateurs",
      "root": "Répertoire de données",
      "free": "Libre",
      "used": "Utilisé",
      "fsUsed": "Système de fichiers utilisé",
      "leftoverTitle": "Données restantes ({{count}})",
      "leftoverEmpty": "Aucun répertoire d'instance restant",
      "leftoverDesc": "Répertoires sous la racine des validateurs qui ne sont pas une instance de magasin. Supprimez-les uniquement après avoir confirmé qu'ils ne sont pas utilisés.",
      "leftoverRemove": "Retirer",
      "leftoverRemoveTitle": "Supprimer les données restantes du validateur ?",
      "leftoverRemoveDesc": "Supprimez définitivement {{path}} du disque. Ce n'est pas un nœud répertorié.",
      "browseRoot": "Ouvrir dans le navigateur de fichiers",
      "none": "Pas encore de données d’instance",
      "warn": "Utilisation du disque élevée (70 %+)",
      "danger": "Utilisation du disque critique (85 %+)",
      "autoClear": "Vider automatiquement la plus grande instance arrêtée lorsque le disque est critique (désactivé par défaut)",
      "autoClearRisk": "Destructif : la plus grande instance arrêtée est supprimée sans autre invite. La valeur par défaut est désactivée. Vérifiez l'audit/les journaux après le déclenchement.",
      "autoClearConfirmTitle": "Activer l'effacement automatique ?",
      "autoClearC1": "Lorsque le disque est critique, la plus grande instance arrêtée est supprimée sans nouvelle demande.",
      "autoClearThreshold": "Déclencheur : utilisation du système de fichiers à 85 % ou plus.",
      "autoClearCandidate": "Candidat actuel : {{id}}",
      "autoClearCandidates": "Candidats arrêtés (le plus grand avec les données en premier) : {{list}}",
      "autoClearNone": "Aucune instance arrêtée n’est candidate pour le moment."
    },
    "chain": {
      "eth": "Ethereum",
      "avax": "Avalanche",
      "near": "NEAR",
      "ada": "Cardano",
      "btc": "Bitcoin",
      "cosmos": "Cosmos Hub",
      "sui": "Sui",
      "aptos": "Aptos",
      "dot": "Polkadot",
      "sol": "Solana"
    },
    "network": {
      "hoodi": "Hoodi",
      "sepolia": "Sepolia",
      "mainnet": "Réseau principal",
      "fuji": "Fuji",
      "testnet": "Réseau de test",
      "preview": "Aperçu",
      "preprod": "Préproduction",
      "westend": "Westend"
    },
    "networkKind": {
      "testnet": "Réseau de test",
      "mainnet": "Réseau principal",
      "mixed": "Réseau principal + réseau de test"
    },
    "profile": {
      "minimal": "Minimaliste",
      "pruned": "Pruned",
      "validator-ready": "Prêt validateur",
      "rpc": "RPC"
    },
    "profileHelp": {
      "title": "Profiles",
      "desc": "The four choices on wizard step 3 are mainly disk budget and role. Each chain shows its recommended size in the wizard. The panel never holds staking keys.",
      "colName": "Profil",
      "colUse": "Utiliser pour",
      "colDisk": "Disque",
      "colStake": "Validateur de jalonnement",
      "useMinimal": "Testnet ou une première installation. Pas une histoire complète.",
      "usePruned": "Suivez la pointe de la chaîne à long terme. Conserve uniquement les données récentes (élaguées).",
      "useValidatorReady": "Dimensionné pour que vous puissiez ultérieurement attester ou proposer. Générez vous-même des clés hors ligne.",
      "useRpc": "Laissez cet hôte ou d'autres services interroger la chaîne. Écoute sur 127.0.0.1 par défaut.",
      "diskMinimal": "Le plus petit",
      "diskPruned": "Moyen (plus que minimal)",
      "diskValidatorReady": "Le plus grand des quatre",
      "diskRpc": "Cela dépend de la chaîne",
      "stakeNo": "Ne convient pas",
      "stakeYes": "Oui – hors ligne ou mal configuré, vous risquez de perdre votre mise",
      "stakeRpc": "Pas un validateur",
      "minimal": "Le plus petit disque. À utiliser pour les testnets ou une première installation. Pas un historique complet, et pas pour un validateur de jalonnement en direct.",
      "pruned": "Conserve l'état récent de la chaîne et supprime les blocs plus anciens (élagués). Plus de disque que Minimal, moins qu'un nœud complet. Utilisez pour suivre le conseil à long terme.",
      "validatorReady": "Réserve plus de disque afin que vous puissiez ultérieurement attester ou proposer en tant que validateur. Générez vous-même des clés hors ligne. Être hors ligne ou mal configuré peut perdre votre mise.",
      "rpc": "Pour que cet hôte ou d’autres services interrogent la chaîne. RPC écoute sur 127.0.0.1 par défaut et n'est pas publié sur Internet."
    },
    "col": {
      "id": "ID",
      "chain": "Chaîne",
      "network": "Réseau",
      "profile": "Profil",
      "status": "État",
      "traffic": "Trafic",
      "disk": "Disque"
    },
    "cli": {
      "usage": "Utilisation : ysk-server validators list|chains|disk|get|status|checklist|logs|create|start|stop|restart|clear|upgrade|set-version|versions|policy|mithril|prune|switch-network|snapshot|compose|compose-write|rewrite-compose|software|pull|leftover-remove|stats|settings|producer-keys|producer-detach|near-account [--chain C] [--network N] [--profile P] [--el EL] [--cl CL] [--el-tag T] [--cl-tag T] [--node-tag T] [--client ID] [--tag T] [--data-path P] [--rpc-port N] [--id ID] [--path PATH] [--file PATH] [--image REF] [--upgrade POLICY] [--confirm TOKEN] [--kes-file P] [--vrf-file P] [--opcert-file P] [--accept-low-disk] [--accept-low-mem] [--accept-mainnet] [--refresh] [--execute] [--json]"
    },
    "clients": {
      "el": "Client d’exécution",
      "cl": "Client de consensus",
      "version": "Version",
      "pin": "Goupille du panneau",
      "officialNewer": "Officiel plus récent",
      "olderThanPin": "Plus vieux que la broche du panneau",
      "prerelease": "Avant-première",
      "current": "En cours d'exécution maintenant",
      "source": "Source des images"
    },
    "mithril": {
      "label": "Restaurer d’abord depuis un instantané Mithril (recommandé en testnet)",
      "hint": "Il s'agit d'une restauration unique après l'installation. Ce n’est pas écrit dans composer. Vous pouvez également l'exécuter plus tard à partir de la page de l'instance.",
      "action": "Restaurer avec Mithril"
    },
    "errors": {
      "notFound": "Instance de validateur introuvable",
      "invalidId": "Identifiant d’instance invalide",
      "diskLow": "Pas assez d’espace disque libre pour cette chaîne, ce réseau et ce profil",
      "memLow": "Pas assez de RAM libre pour la limite de mémoire de cette chaîne",
      "diskUnknownMainnet": "Impossible de mesurer l’espace libre ; création en réseau principal refusée",
      "needDocker": "Docker Compose est requis et introuvable",
      "composeFailed": "docker compose a échoué",
      "containerNotUp": "Compose a démarré, mais le conteneur n'a pas continué à fonctionner",
      "probeFailed": "Le nœud ne répond pas encore à RPC. Vérifiez les journaux sur cette page.",
      "oom": "Plus de mémoire. Définissez une limite de mémoire ou ajoutez de la RAM, puis redémarrez.",
      "nofile": "Le processus a atteint la limite de fichiers ouverts (nofile). Augmentez ulimits.nofile et redémarrez.",
      "noContainer": "Aucun conteneur de composition n'existe pour cette instance.",
      "restarting": "Le conteneur redémarre. Vérifiez les journaux sur cette page.",
      "restartingCount": "Le conteneur redémarre ({{n}}). Vérifiez les journaux sur cette page.",
      "needConfirm": "Vider exige confirm=identifiant d’instance ou CLEAR",
      "mithrilAdaOnly": "La restauration Mithril n’est disponible que pour Cardano",
      "needMithrilConfirm": "Mithril exige confirm=identifiant d’instance ou MITHRIL",
      "mithrilBlocked": "Le docker run Mithril a été bloqué par la liste d’autorisation",
      "mithrilKey": "Impossible de charger la clé de vérification genesis Mithril",
      "mithrilFailed": "Échec du téléchargement de l’instantané Mithril",
      "pruneFailed": "Le nettoyage a échoué",
      "switchNeedStop": "Arrêtez le nœud avant de changer de réseau",
      "switchNeedClear": "Changer de réseau efface les données de chaîne. Confirmez avec l’identifiant d’instance ou CLEAR",
      "composeMissing": "Fichier Compose introuvable",
      "composeNotManaged": "Refus d’écrire un fichier Compose non géré par YSK",
      "badDataPath": "Le chemin de données doit être un répertoire absolu hors des chemins système",
      "portInUse": "Ce port RPC est déjà utilisé par une autre instance de validateur",
      "badTag": "Cette version client n'est pas une balise officielle pour cette image",
      "needVersionConfirm": "Le changement de version nécessite confirmation = identifiant d'instance",
      "needMainnetVersionAck": "Les modifications de la version du réseau principal nécessitent acceptMainnet",
      "snapshotUnsupported": "Aucune source d’instantané autorisée pour cette chaîne",
      "snapshotLookup": "Impossible de résoudre le pointeur d’instantané officiel",
      "needSnapshotConfirm": "La restauration d’instantané exige confirm=identifiant d’instance ou SNAPSHOT",
      "snapshotBlocked": "Le docker run d’instantané a été bloqué par la liste d’autorisation",
      "snapshotFailed": "Échec du téléchargement ou de l’extraction de l’instantané",
      "producerAdaOnly": "Les clés du producteur sont uniquement pour Cardano",
      "needProducerConfirm": "L'attachement de clés de producteur nécessite confirm=identifiant d'instance ou PRODUCER",
      "needMainnetProducerAck": "L'attachement du producteur au réseau principal nécessite acceptMainnet",
      "producerColdRejected": "Les clés de signature à froid ou par le propriétaire de la piscine sont refusées. Gardez les touches froides hors ligne.",
      "producerTooLarge": "Ce fichier de clé fait plus de 64 Ko",
      "producerBadType": "Ce fichier n'est pas une clé KES, une clé VRF ou un certificat opérationnel",
      "producerEmpty": "Fournissez au moins un des éléments suivants : kes, vrf ou opcert",
      "switchNeedDetachProducer": "Détachez les clés du producteur avant de changer de réseau",
      "nearAccountInvalid": "Le nom du pool doit être un slug court (ou le compte complet {pool}{factory}).",
      "nearKeyMissing": "validator_key.json est manquant ou n'a pas de clé publique. Démarrez le nœud et attendez l'initialisation neard."
    },
    "notes": {
      "beta": "Cette fonction est Beta. Les changements d’hôte nécessitent root et YSK_EXECUTE=1.",
      "noKeys": "YSK Server ne génère ni n’enregistre jamais de clés de staking.",
      "dockerSoon": "Installez et démarrez à partir de cette page l'assistant. Les modifications d'hôte nécessitent root et YSK_EXECUTE=1.",
      "dryCreate": "Spécification d’instance et compose écrits (dry-run). Passez --execute et YSK_EXECUTE=1 pour démarrer les conteneurs.",
      "dryStart": "Le démarrage est un dry-run. Passez --execute et YSK_EXECUTE=1.",
      "dryStop": "L’arrêt est un dry-run. Passez --execute et YSK_EXECUTE=1.",
      "dryClear": "Le vidage est un dry-run. Passez --execute et YSK_EXECUTE=1.",
      "created": "Nœud créé et compose démarré",
      "started": "Nœud démarré",
      "stopped": "Nœud arrêté",
      "cleared": "Données de chaîne vidées",
      "dryMithril": "La restauration Mithril est un dry-run. Passez --execute et YSK_EXECUTE=1.",
      "mithril": "Instantané Mithril restauré ; nœud redémarré",
      "dryPrune": "Le nettoyage est un dry-run. Passez --execute et YSK_EXECUTE=1.",
      "pruned": "Images de projet inutilisées nettoyées",
      "pruneProfile": "L’élagage natif du client est le profil pruned／minimal. Recréez pour le changer.",
      "sameNetwork": "Déjà sur ce réseau",
      "drySwitch": "Le changement de réseau est un dry-run.",
      "switched": "Réseau changé et données de chaîne vidées",
      "dryCompose": "Écrirait compose.yml",
      "composeWrote": "compose.yml écrit",
      "statsEmpty": "Aucun conteneur en cours d’exécution à mesurer",
      "autoClearNone": "Aucune instance arrêtée à vider automatiquement",
      "drySnapshot": "La restauration d’instantané est un dry-run. Passez --execute et YSK_EXECUTE=1.",
      "snapshotEthEl": "Archive EL ethPandaOps restaurée et CL réinitialisé pour le checkpoint sync",
      "snapshotEthCl": "Données CL réinitialisées pour le checkpoint sync officiel",
      "snapshotNear": "Données NEAR effacées ; compose réinitialisera avec le genesis officiel et epoch sync",
      "nativePrune": "Commande d’élagage native du client exécutée",
      "dryProducer": "Les clés du producteur sont exécutées à sec. Ajoutez --execute et YSK_EXECUTE=1.",
      "dryProducerDetach": "Le détachement du producteur est un essai à sec. Ajoutez --execute et YSK_EXECUTE=1.",
      "producerPartial": "J'ai écrit des touches de raccourci. Attachez KES, VRF et opcert avant que le nœud ne démarre en tant que producteur de blocs.",
      "producerAttached": "Touches de raccourci attachées ; composer réécrit en tant que producteur de blocs",
      "producerDetached": "Touches de raccourci supprimées ; composer réécrit en relais",
      "dryDelete": "La suppression est un essai à sec. Passez --execute et YSK_EXECUTE=1.",
      "deleted": "Nœud supprimé",
      "leftoverRemoved": "Suppression des restes {{path}}",
      "dryNearAccount": "Définirait account_id sur {{account}} (passer --execute). Le secret n'est jamais modifié.",
      "nearAccountWrote": "Réglez account_id sur {{account}}. Le secret n'a pas été modifié. Redémarrez le nœud s'il est en cours d'exécution."
    },
    "create": "Créer un nœud",
    "wizard": {
      "title": "Créer un nœud",
      "stepOf": "Étape {{n}} / {{total}}",
      "stepChain": "Chaîne",
      "stepNetwork": "Réseau",
      "stepProfile": "Profil",
      "stepSummary": "Résumé",
      "needDocker": "Docker Engine n'est pas installé. Installez-le d'abord – ce bouton reste désactivé.",
      "diskNeed": "Ce profil nécessite environ {{need}} · gratuit {{free}}",
      "diskNeedNetwork": "Par défaut (minimal) pour ce réseau, il faut environ {{need}} · gratuit {{free}}",
      "profileHint": {
        "minimal": "La plus petite synchronisation – disque léger, pas pour le jalonnement.",
        "pruned": "Conserve uniquement l'historique récent (élagué). Plus petit que l'archive, toujours utilisable pour RPC.",
        "validator-ready": "Dimensionné pour un validateur de jalonnement. Nécessite plus de disque que Minimal.",
        "rpc": "Nœud RPC public – pas un validateur de jalonnement."
      },
      "diskShort": "Pas assez de disque libre pour cette chaîne/réseau/profil",
      "diskShortDetail": "Besoin {{need}} · gratuit {{free}} · court {{short}}",
      "memShort": "Pas assez de RAM libre pour la limite de mémoire de cette chaîne",
      "memShortDetail": "Besoin {{need}} · gratuit {{free}} · court {{short}}",
      "needCustomPath": "Entrez un chemin de données absolu",
      "previewId": "ID du nœud",
      "previewCompose": "Composer un projet",
      "profileSeeAbout": "What each profile means is on the About tab.",
      "back": "Retour",
      "next": "Suivant",
      "install": "Installer",
      "mainnetWarn": "Le réseau principal demande beaucoup d’espace libre (ETH souvent 800 Gio+). Le testnet est recommandé.",
      "mainnetAck": "Je comprends le risque disque et slashing. Continuer en réseau principal.",
      "lowDiskAcked": "Le disque libre est inférieur à la taille recommandée. Vous avez quand même confirmé la création ; la synchronisation peut s'arrêter si le disque se remplit.",
      "lowMemAcked": "La RAM libre est inférieure à la limite de mémoire de cette chaîne plus 1 Gio de marge. Vous avez quand même confirmé la création ; le nœud peut être MOO ou caler.",
      "heavyWarn": "Cette chaîne est lourde (gros disque et IOPS élevés). Solana en réseau principal demande généralement 2 Tio+.",
      "memory": "Limite mémoire (ex. 4g)",
      "cpus": "Limite CPU (ex. 2.0)",
      "dataPath": "Chemin de données (facultatif)",
      "rpcPort": "Port RPC (facultatif)",
      "limitNone": "Aucune limite",
      "rpcDefault": "Défaut",
      "customPath": "Utiliser un chemin de données personnalisé",
      "installConfirmTitle": "Installer ce nœud ?",
      "installConfirmDesc": "{{chain}} · {{network}} · {{profile}}. Environ {{disk}} de disque. L’extraction de l’image peut prendre beaucoup de temps.",
      "installC1": "Plusieurs gigaoctets d'images peuvent être téléchargés.",
      "installC2": "Vous pouvez annuler la tâche du panneau ; les images déjà extraites ne sont pas supprimées automatiquement.",
      "installC3": "Le réseau principal utilise beaucoup de disque. Un validateur de jalonnement peut perdre sa mise s’il est hors ligne ou mal configuré. Tapez l'ID du nœud pour confirmer.",
      "dockerAbout": "Docker Engine est requis pour installer et démarrer les nœuds.",
      "dockerAboutOk": "Docker Engine est installé.",
      "dockerAboutMissing": "Docker Engine n'est pas installé. Ouvrez Docker pour l'installer.",
      "rewriteCompose": "Réécrire la composition",
      "rewriteComposeTitle": "Réécrire compose.yml à partir de l'adaptateur actuel ?",
      "rewriteComposeDesc": "Écrase la composition générée pour {{id}} en utilisant les indicateurs fournis pour cette chaîne.",
      "chainMeta": "{{disk}} min · {{clients}} clients"
    },
    "actions": {
      "detail": "Détails",
      "start": "Démarrer",
      "stop": "Arrêter",
      "restart": "Redémarrer",
      "clear": "Vider",
      "upgrade": "Mettre à jour",
      "setVersion": "Changer de version",
      "clearConfirm": "Saisissez l’identifiant d’instance ou CLEAR",
      "prune": "Nettoyer les images",
      "switchNetwork": "Changer de réseau",
      "removeUnit": "Supprimer aussi compose / l’enregistrement d’instance",
      "restoreAfter": "Restaurer l’instantané après vidage",
      "delete": "Supprimer",
      "deleteTitle": "Supprimer {{id}}",
      "deleteDesc": "Cela supprime le nœud du panneau.",
      "deleteC1": "Docker Compose est arrêté et supprimé",
      "deleteC2": "Les données de la chaîne sur le disque sont supprimées",
      "deleteC3": "L'enregistrement de l'instance est supprimé",
      "pruneTitle": "Élaguer les images inutilisées",
      "pruneDesc": "Tapez l'ID d'instance pour élaguer les images Compose inutilisées pour ce nœud.",
      "pruneC1": "Les images inutilisées étiquetées pour ce projet Compose sont supprimées.",
      "clearTitle": "Effacer {{id}}",
      "clearC1": "Les données de la chaîne sur le disque sont supprimées.",
      "clearC2": "L'instance reste dans le panneau, arrêtée et vide.",
      "switchTitle": "Changer de réseau",
      "switchC1": "Le nœud est arrêté et les données de la chaîne sont effacées avant l'écriture du nouveau réseau."
    },
    "policy": {
      "label": "Politique de mise à jour",
      "manual": "Manuel",
      "notify": "Notifier",
      "auto-safe": "Auto (sûr)",
      "auto-all": "Auto (tout)"
    },
    "logs": {
      "empty": "Pas encore de journaux",
      "follow": "Suivre les journaux"
    },
    "compose": {
      "label": "Fichier Compose",
      "save": "Enregistrer compose"
    },
    "snapshot": {
      "action": "Restaurer l’instantané",
      "mithril": "Cardano utilise Mithril pour restaurer un instantané certifié.",
      "eth": "Ethereum en réseau principal démarre via le checkpoint sync officiel du client de consensus. L’EL continue en snap sync.",
      "ethEl": "Hoodi／Sepolia peuvent restaurer une archive EL ethPandaOps, puis faire un checkpoint-sync du CL.",
      "avax": "Avalanche utilise state-sync dans le profil compose.",
      "near": "Les instantanés tar NEAR gratuits officiels ont été retirés. Restaurer efface les données et utilise le genesis officiel plus epoch sync.",
      "none": "Aucune source d’instantané n’est configurée pour cette chaîne."
    },
    "producer": {
      "title": "Bloquer les touches de raccourci du producteur",
      "hint": "Ce n'est pas une adresse IP. Téléchargez la clé KES, la clé VRF et le certificat opérationnel à partir d'une machine hors ligne. Gardez les touches froides hors de cet hôte.",
      "warn": "Le même nœud avec un port P2P public signera les blocs. La topologie officielle maintient le producteur hors de l'Internet public. Ces trois fichiers sont des raccourcis clavier.",
      "kes": "KES",
      "vrf": "VRF",
      "opcert": "extrait",
      "missing": "Non attaché",
      "present": "Ci-joint {{fp}}",
      "presentShort": "Sur l'hôte",
      "queuedShort": "Prêt",
      "queued": "Sélectionné · {{name}}",
      "fileHint": "Nom typique {{file}}",
      "dropOrBrowse": "Déposez {{file}} ici ou parcourez",
      "dropping": "Déposer pour joindre {{label}}",
      "browse": "Parcourir",
      "clearFile": "Retirer",
      "choose": "Choisir un fichier",
      "apply": "Appliquer et redémarrer en tant que producteur de blocs",
      "detach": "Détachez-vous et courez comme relais",
      "applyTitle": "Attacher les touches de raccourci à {{id}} ?",
      "applyDesc": "KES, VRF et opcert sont écrits dans le répertoire des clés d'instance. Compose est réécrit. Le conteneur redémarre en tant que producteur de blocs.",
      "applyC1": "Les touches froides doivent rester hors ligne. Ne téléchargez pas cold.skey.",
      "applyC2": "Le nœud en cours d'exécution peut signer des blocs si ces fichiers sont valides.",
      "applyC3": "Mainnet : un producteur hors ligne ou mal configuré manque des blocs.",
      "detachTitle": "Détacher les clés de producteur de {{id}} ?",
      "detachDesc": "Les touches de raccourci sont supprimées de cet hôte. Compose revient au relais.",
      "detachC1": "Le nœud ne produira plus de blocs.",
      "mainnet": "Réseau principal : je comprends que cet hôte contiendra des touches de raccourci et signera des blocs."
    },
    "stake": {
      "title": "Préparer le staking (vous gardez les clés)",
      "offlineKeys": "Générez les clés hors ligne. Le panneau ne les stocke jamais.",
      "deposit": "Terminez le dépôt / l’enregistrement sur le launchpad officiel.",
      "withdrawal": "Définissez vous-même les identifiants de retrait.",
      "monitor": "Surveillez disque, pairs et badges de mise à jour sur cette page."
    },
    "playbook": {
      "overviewTitle": "Comment fonctionne le jalonnement sur chaque chaîne",
      "overviewDesc": "Ce panneau exécute le nœud. Votre portefeuille et vos clés restent avec vous. Liens officiels uniquement – ​​ne partagez jamais de phrase de départ ici.",
      "colChain": "Chaîne",
      "colModel": "Comment s'inscrire",
      "colMin": "Minimum typique",
      "colWallet": "Votre portefeuille",
      "colPanel": "Ce que fait ce panneau",
      "yskDoes": "Ce panneau fait",
      "youDo": "Tu fais",
      "steps": "Mesures",
      "never": "Ne pas",
      "official": "Liens officiels",
      "seeAbout": "Les étapes complètes se trouvent dans l’onglet À propos.",
      "nodeIdReady": "NodeID (de ce nœud)",
      "nodeIdPending": "NodeID apparaît une fois le nœud synchronisé et répondant au RPC.",
      "blsReady": "Clé publique BLS",
      "blsProof": "Preuve de possession BLS",
      "blsPending": "Les informations d'identification BLS apparaissent une fois que le nœud répond à RPC.",
      "copyAll": "Copier tout",
      "copyNamed": "Copier {{label}}",
      "nearStakeKey": "Clé publique de mise en jeu",
      "nearStakeKeyPending": "Apparaît après le premier démarrage (près de l'initialisation). RPC n'est pas prêt ne signifie pas que la clé est manquante.",
      "nearAccountId": "Fichier clé account_id",
      "nearAccountIdPending": "Souvent vide jusqu'à ce que vous le définissiez sur {{pool}}{{suffix}} une fois le pool existant. Le panneau écrit uniquement ce champ – jamais secret_key.",
      "nearFactory": "Usine de pool de jalonnement",
      "nearPublicAddr": "P2P public (pairs)",
      "nearPublicAddrPending": "Apparaît après le premier démarrage, écrit WAN:{{port}} dans config.json.",
      "nearCreateCommand": "Commande create_staking_pool",
      "nearPointing": "Le contrat de pool ne prend pas l’IP de ce serveur. Il stocke la clé publique de participation de ce nœud. Les pairs utilisent la ligne Public P2P ci-dessus (port hôte {{port}}). RPC reste sur localhost.",
      "nearAccountIdHint": "Une fois le pool existant, définissez account_id ici (ne modifiez pas le fichier à la main). Le panneau n'écrit jamais secret_key.",
      "cosmosPubkey": "Clé publique consensuelle",
      "cosmosPubkeyPending": "Apparaît après que gaiad init ait écrit priv_validator_key.json. RPC n'est pas prêt ne signifie pas que la clé est manquante.",
      "cosmosChainId": "identifiant de chaîne",
      "cosmosP2p": "P2P public (adresse_externe)",
      "cosmosP2pPending": "Apparaît après le premier démarrage, écrit tcp://WAN:{{port}} dans config.toml.",
      "ethBeacon": "API de balise (localhost)",
      "ethBeaconPending": "Balise HTTP sur cet hôte. Pointez un client validateur que vous exécutez vous-même sur cette URL : cette composition n'a pas de VC.",
      "cosmosCreateCommand": "commande create-validator",
      "cosmosCreateJson": "validateur.json (gaiad v28)",
      "copyFailed": "Échec de la copie",
      "solIdentity": "Clé publique d'identité",
      "solIdentityPending": "Apparaît après que RPC répond à getIdentity. Ce processus est sans vote jusqu'à ce que vous ajoutiez vous-même un compte de vote.",
      "adaP2pPort": "Port relais P2P",
      "adaP2pPending": "Annoncez le IPv4 (ou DNS) public de cet hôte et ce port dans le certificat d'enregistrement du pool. topology.json localRoots est pour votre propre producteur de blocs. Ce panneau ne sonde pas WAN.",
      "notPosTitle": "Pas de preuve de participation",
      "notPosBody": "Bitcoin est ici un nœud complet ou élagué. Il n'y a pas de portefeuille de jalonnement sur cette page.",
      "eth": {
        "model": "Cette composition exécute uniquement l'exécution + la balise - pas un client validateur. Déposez 32 ETH sur la rampe de lancement officielle.",
        "min": "32 ETH + gaz",
        "wallets": "MetaMask, Ledger, Trezor — uniquement sur la rampe de lancement officielle",
        "panel": "Fonctionne EL + balise. RPC et API de balise sur localhost. Aucun client validateur dans composer.",
        "honesty": "Cette instance est uniquement une exécution + une balise. Il n'y a aucun client validateur dans le fichier de composition. La copie d'un magasin de clés dans le répertoire de données de balise ne démarrera pas l'attestation. Le contrat de dépôt ne prend pas l’IP de ce serveur.",
        "yskDoes": [
          "Installez et démarrez les clients d'exécution et de balise.",
          "Afficher le disque, les pairs et l'état de la mise à niveau.",
          "N'exécute pas de client de validation et ne charge pas de magasin de clés de signature."
        ],
        "youDo": [
          "Créez vous-même le magasin de clés et l'adresse de retrait sur la rampe de lancement officielle ou avec staking-deposit-cli.",
          "Déposez 32 ETH sur la rampe de lancement de ce réseau.",
          "Exécutez vous-même un client de validation (pas cette composition) sur l'API de balise localhost de cette instance."
        ],
        "steps": [
          "Attendez que l'exécution et la balise soient synchronisées.",
          "Ouvrez la barre de lancement officielle de ce réseau (Hoodi ou Mainnet sur cette page). Sepolia n'a pas de bouton de tableau de bord ici.",
          "Hors ligne, générez le keystore (staking-deposit-cli). Définissez l'adresse de retrait sur votre propre portefeuille ETH.",
          "Déposez 32 ETH sur le launchpad (gardez un supplément pour le gaz).",
          "Exécutez vous-même un validator client sur l'URL de la balise sur cette carte (exemple : lighthouse vc --beacon-nodes). Cette composition n'a pas de VC — mettre un keystore dans le répertoire de données de la balise ne l'atteste pas."
        ],
        "never": [
          "Ne donnez jamais votre phrase de départ ou votre clé de retrait à qui que ce soit, y compris à ce panneau.",
          "Ne téléchargez jamais un magasin de clés de signature sur un cloud hébergé.",
          "Ne vous attendez pas à ce que cette page atteste après avoir copié un magasin de clés dans le répertoire de données de la balise."
        ]
      },
      "avax": {
        "model": "Enregistrez la preuve NodeID et BLS en cours d'exécution sur la P-Chain à partir de Core ou Ledger.",
        "min": "2 000 AVAX + frais (1 AVAX sur Fuji) ; au moins 14 jours",
        "wallets": "Noyau, grand livre",
        "panel": "Exécute avalanchego et peut afficher NodeID et BLS après les réponses RPC",
        "yskDoes": [
          "Exécutez avalanchego et conservez RPC sur localhost.",
          "Afficher les informations d'identification NodeID et BLS une fois que le nœud répond à RPC."
        ],
        "youDo": [
          "Conservez AVAX dans Core ou Ledger.",
          "Ajoutez le validateur de Core en utilisant la preuve NodeID et BLS de ce nœud."
        ],
        "steps": [
          "Attendez que ce nœud soit synchronisé et que les lignes NodeID / BLS apparaissent (RPC).",
          "Copiez la clé publique NodeID, BLS et la preuve de possession BLS.",
          "Dans Core web (Staking → Validate), ou avec Ledger via Core, inscrivez-vous sur la P-Chain. La transaction ne prend pas d'adresse IP de serveur.",
          "Le réseau principal a besoin d'au moins 2 000 AVAX, d'une période minimale de 14 jours et d'une réserve de frais. Fuji est 1 AVAX."
        ],
        "never": [
          "N’envoyez pas AVAX à ce panneau.",
          "Ne partagez pas votre phrase de récupération Core ou Ledger."
        ]
      },
      "ada": {
        "model": "Gérez un pool de mises avec des clés froides / KES / VRF hors ligne – et non avec un robinet de portefeuille de navigateur.",
        "min": "L'engagement est votre choix (voir la documentation officielle)",
        "wallets": "Outils officiels de pool de mises (les touches froides restent hors ligne)",
        "panel": "Exécute d'abord le nœud cardano en tant que relais ; des touches de raccourci peuvent être jointes sur cette page.",
        "honesty": "Cette instance démarre en tant que relais. L'enregistrement du pool en chaîne utilise des clés froides que vous conservez hors ligne. Les homologues et la topologie utilisent l'IPv4 public de cet hôte et le port P2P illustré ici : le panneau ne sonde pas le WAN.",
        "yskDoes": [
          "Exécutez la restauration d'instantanés Cardano-Node et Mithril là où cela est proposé.",
          "Joignez KES, VRF et opcert lorsque vous les fournissez. Les touches froides sont refusées."
        ],
        "youDo": [
          "Générez des clés de pool hors ligne.",
          "Enregistrez la piscine auprès de la CLI officielle de Cardano. Mettez le port public IPv4 ou DNS de cet hôte et le port relais P2P dans le certificat d'enregistrement du pool.",
          "Joignez KES, VRF et opcert sur cette page. Ne téléchargez pas de clés froides."
        ],
        "steps": [
          "Lisez le guide officiel d’exploitation d’un pool de participation.",
          "Générez des clés froides, KES et VRF sur une machine hors ligne.",
          "Enregistrez le pool en chaîne. Annoncez le relais dans ce certificat (--pool-relay-ipv4 ou DNS + le port P2P sur cette carte). La découverte publique est le certificat, pas topology.json.",
          "Sur cette page d'instance, joignez KES, VRF et le certificat opérationnel. Les touches froides sont refusées.",
          "topology.json localRoots est pour votre propre producteur de blocs (publicité : fausse). Ce panneau ne recherche pas l'adresse WAN."
        ],
        "never": [
          "Ne traitez pas cela comme une mise MetaMask en un clic.",
          "Ne stockez pas de clés froides sur l’hôte du validateur.",
          "Ne vous attendez pas à ce que la modification de topology.json seule enregistre le relais en chaîne."
        ]
      },
      "near": {
        "model": "Créez un contrat de pool de jalonnement à l’usine officielle. Le contrat stocke la clé publique de ce nœud, et non l'adresse IP du serveur.",
        "min": "Voir la documentation officielle du validateur (30 NEAR pour créer le pool, plus la mise)",
        "wallets": "Portefeuille / verrouillage officiel NEAR",
        "panel": "Exécute neard ; le formulaire remplit create_staking_pool ; une fois le pool existant, écrit account_id uniquement.",
        "yskDoes": [
          "Exécutez Neard avec RPC sur localhost et P2P sur 24567.",
          "Après l'initialisation, affichez la clé publique de mise, l'adresse publique P2P et l'usine.",
          "Remplissez create_staking_pool à partir du nom du pool + propriétaire + clé publique. Une fois le pool existant, écrivez uniquement account_id — jamais secret_key, jamais la transaction."
        ],
        "youDo": [
          "Démarrez le nœud et attendez la clé publique sur cette page.",
          "Entrez le nom et le propriétaire du pool, puis copiez la commande.",
          "Signez create_staking_pool depuis votre propre portefeuille NEAR ou près de cli.",
          "Revenez ici et définissez account_id. Misez de votre portefeuille dans ce pool."
        ],
        "steps": [
          "Démarrez le nœud et attendez l'initialisation proche pour que la clé publique apparaisse (RPC non prêt n'est pas la même chose que les clés manquantes).",
          "Saisissez le nom abrégé du pool et le compte propriétaire. Copiez la commande create_staking_pool remplie.",
          "Depuis votre portefeuille, appelez l'usine (testnet pool.f863973.m0 / mainnet poolv1.near) avec 30 NEAR pour le stockage. La commande utilise --accountId ; si votre CLI proche attend --account_id, suivez l' --help de cette CLI.",
          "Une fois le pool existant, utilisez Set account_id sur cette page (confirmer = identifiant d'instance). Ne modifiez pas validator_key.json à la main.",
          "Redémarrez si le nœud est déjà en cours d'exécution. Attendez que RPC réponde et que le nœud soit synchronisé avant de miser de grandes sommes. Les pairs utilisent Public P2P — le contrat ne prend pas d'adresse IP."
        ],
        "never": [
          "Ne collez pas de phrase de départ dans ce panneau.",
          "Ne mettez pas l’adresse IP de ce serveur dans le contrat.",
          "Ne vous attendez pas à ce que le panel envoie la transaction create_staking_pool."
        ]
      },
      "cosmos": {
        "model": "créez un validateur à partir du portefeuille de votre opérateur en utilisant la clé publique de consensus de ce nœud – et non l'adresse IP du serveur.",
        "min": "Voir la documentation officielle de Cosmos Hub (auto-délégation en uatom)",
        "wallets": "Keplr ou un autre portefeuille Cosmos que vous contrôlez",
        "panel": "Exécute gaiad v28 ; affiche la clé publique de consensus ; le formulaire remplit validator.json + create-validator. N'écrit jamais priv_validator_key.json ou diffuse.",
        "honesty": "Cette gaiad est la v28 (fichier JSON). Les documents du Hub affichent toujours des indicateurs – ceux-ci échouent ici. La transaction stocke la clé publique de consensus de ce nœud, et non l'adresse IP du serveur. Les pairs utilisent le P2P public. RPC reste sur localhost. Ce panneau ne diffuse ni ne lit priv_key.",
        "yskDoes": [
          "Exécutez gaiad avec RPC sur localhost et P2P sur 26656. Le prix minimum du gaz est 0.005uatom.",
          "Après l'initialisation, affichez la clé publique de consensus, l'identifiant de chaîne et le P2P public.",
          "Remplissez validator.json et la commande gaiad v28 à partir du montant, du moniker et de --from plus la clé publique de consensus. N'écrivez jamais priv_validator_key.json et ne diffusez jamais la transaction."
        ],
        "youDo": [
          "Démarrez le nœud et attendez la clé publique de consensus sur cette page.",
          "Entrez le montant, le surnom et --from. Copiez validator.json, puis la commande gaiad.",
          "Signez à partir des clés Keplr ou Gaiad que vous contrôlez. Ne mélangez pas ce mnémonique avec la clé de consensus sur cet hôte."
        ],
        "steps": [
          "Démarrez le nœud et attendez gaiad init pour que la clé publique de consensus apparaisse (RPC non prêt n'est pas la même chose que les clés manquantes).",
          "Saisissez l'auto-délégation (1atom = 1 ATOM ou uatom), le surnom et --from. Copiez validator.json puis la commande gaiad. Ce nœud est gaiad v28 : fichier JSON, pas le formulaire de drapeau de la documentation Hub. chain-id est cosmoshub-4 sur le réseau principal, fournisseur sur testnet.",
          "Le --gas-prices copié est de 0,005uatom pour correspondre à ce nœud. Ne collez pas l'exemple 0.0025uatom de la documentation Hub ou le validateur de création basé sur un indicateur.",
          "Enregistrez validator.json et diffusez depuis le portefeuille de votre opérateur. La transaction ne prend pas d'adresse IP de serveur. Les pairs utilisent tcp://WAN:{{port}}.",
          "Attendez que RPC réponde et que le nœud soit synchronisé avant de lier de grandes quantités."
        ],
        "never": [
          "Ne mélangez pas le mnémonique du portefeuille de l’opérateur avec la clé de consensus.",
          "N'entrez pas ici les mnémoniques du portefeuille.",
          "Ne mettez pas l’adresse IP de ce serveur dans create-validator.",
          "Ne collez pas les indicateurs --amount/--pubkey des documents Hub - cette gaiad est la v28 (validator.json).",
          "N'utilisez pas de gaz 0.0025uatom sur ce nœud — le minimum de composition est 0.005uatom."
        ]
      },
      "sol": {
        "model": "Cette composition exécute Agave avec --no-voting. Le compte de vote et le retrait sont créés avec les outils officiels Solana – pas ce panneau.",
        "min": "Voir la documentation officielle des opérations (le matériel et le disque sont lourds)",
        "wallets": "CLI/portefeuille Solana officiel que vous contrôlez",
        "panel": "Exécute Agave en tant que nœud de rattrapage (--no-voting). Peut afficher la clé publique d'identité après les réponses RPC.",
        "honesty": "Ce processus est sans vote. Il ne votera pas et ne gagnera pas de mise tant que vous n'aurez pas créé un compte de vote avec Agave CLI officiel et modifié la façon dont le processus est démarré. Ce panneau ne supprime pas --no-voting.",
        "yskDoes": [
          "Exécutez le client Agave et avertissez du disque.",
          "Afficher la clé publique d'identité une fois que RPC répond à getIdentity.",
          "Ne crée pas de compte de vote et ne commence pas à voter."
        ],
        "youDo": [
          "Créez des clés de vote et de retrait autorisé avec les outils officiels Solana sur une machine que vous contrôlez.",
          "Créez le compte de vote avec la CLI officielle, en utilisant cette clé publique d'identité.",
          "Ensuite seulement, exécutez un validateur de vote – cette composition reste --no-voting."
        ],
        "steps": [
          "Confirmez que cet hôte dispose de suffisamment de disque et d'IOPS (le réseau principal est généralement de 2 TiB+).",
          "Attendez que RPC réponde, puis copiez la clé publique d'identité affichée ici.",
          "Créez des clés de vote et de retrait autorisé avec les outils officiels Solana sur une machine que vous contrôlez, puis Solana crée un compte de vote.",
          "Cette composition conserve --no-voting. La création d'un vote account ne fait pas voter ce processus."
        ],
        "never": [
          "Ne vous attendez pas à un bouton de portefeuille de navigateur dans ce panneau.",
          "Ne collez pas de paires de clés d'identité ou de vote dans ce panneau.",
          "Ne vous attendez pas à ce que cette page commence à voter après avoir créé un vote account."
        ]
      },
      "dot": {
        "model": "Cette composition est un nœud complet (pas de --validator). Les clés de session et setKeys sont des étapes officielles de Polkadot.js – pas ce panneau.",
        "min": "Voir le wiki officiel",
        "wallets": "Polkadot.js",
        "panel": "Exécute polkadot en tant que nœud complet. RPC sur localhost. Pas d'indicateur --validator.",
        "honesty": "Ce processus n'est pas démarré avec --validator. Le panneau n'appelle pas author_rotateKeys (cela modifierait le magasin de clés). Devenir validateur nécessite l'indicateur de nœud officiel et un appel rotateKeys que vous effectuez contre localhost RPC.",
        "yskDoes": [
          "Exécutez polkadot et exposez RPC sur localhost.",
          "Ne transmet pas --validator et ne fait pas pivoter les clés de session."
        ],
        "youDo": [
          "Suivez le guide officiel de configuration d'un validateur.",
          "Si vous ajoutez --validator vous-même, appelez rotateKeys sur localhost RPC et liez le résultat dans Polkadot.js à partir de votre réserve."
        ],
        "steps": [
          "Synchronisez ce nœud complet.",
          "Lisez le guide de validation officiel. Cette composition n'est pas un processus de validation.",
          "Ne collez pas le mnémonique de cache ici. Si vous exécutez ultérieurement avec --validator, faites vous-même la rotation des clés sur http://127.0.0.1 (port RPC sur cette instance).",
          "Dans Polkadot.js, définissez ces clés de session sur votre réserve/contrôleur, puis suivez les étapes de liaison officielles."
        ],
        "never": [
          "Ne collez pas le mnémonique de cache dans ce panneau.",
          "Ne vous attendez pas à ce que cette page génère des clés de session ou ait démarré --validator."
        ]
      },
      "sui": {
        "model": "Cette composition est un nœud complet Sui (fullnode.yaml), pas un nœud de validation.",
        "min": "Voir la documentation officielle de Sui",
        "wallets": "Portefeuille officiel de l'opérateur Sui",
        "panel": "Exécute sui-node en tant que nœud complet. RPC sur localhost.",
        "honesty": "Ce processus ne peut pas signer en tant que validateur Sui. La configuration du validateur utilise une configuration et des clés différentes. Les documents officiels du validateur sont liés ; ce panneau ne fait pas passer le nœud en mode validateur.",
        "yskDoes": [
          "Exécutez l'image sui-node livrée en tant que nœud complet."
        ],
        "youDo": [
          "Utilisez cette instance comme nœud complet.",
          "Pour devenir validateur, suivez la documentation officielle du validateur Sui sur une configuration de validateur - pas cette composition."
        ],
        "steps": [
          "Synchronisez ce nœud complet.",
          "Traitez-le comme un fullnode : il réexécute les points de contrôle mais ne signe pas de consensus.",
          "Ouvrez le guide officiel de l'opérateur du validateur uniquement si vous créez un processus de validation distinct."
        ],
        "never": [
          "N’envoyez pas de SUI à ce panneau.",
          "Ne vous attendez pas à ce que ce processus de nœud complet s'enregistre en tant que validateur."
        ]
      },
      "aptos": {
        "model": "Cette composition est un fullnode public Aptos (rôle full_node), pas un validateur.",
        "min": "Voir la documentation officielle d'Aptos",
        "wallets": "Portefeuille officiel de l'opérateur Aptos",
        "panel": "Exécute aptos-node en tant que nœud complet public. RPC sur localhost.",
        "honesty": "Les fullnodes publics ne participent pas au consensus. Un validateur a besoin d'un rôle différent, de clés et généralement d'un nœud complet de validateur. Ce panneau ne fait pas passer le nœud en mode validateur.",
        "yskDoes": [
          "Exécutez l’image Aptos livrée en tant que nœud complet public."
        ],
        "youDo": [
          "Utilisez cette instance comme nœud complet public.",
          "Pour exécuter un validateur, suivez la documentation officielle du nœud de validation Aptos – et non cette composition."
        ],
        "steps": [
          "Synchronisez ce fullnode public.",
          "Traitez-le comme un PFN : il sert les données du grand livre, il ne vote pas.",
          "Ouvrez les documents officiels du validateur uniquement si vous créez une paire validateur + VFN distincte."
        ],
        "never": [
          "N'entrez pas les clés de l'opérateur dans ce panneau.",
          "Ne vous attendez pas à ce que ce processus de nœud complet s'enregistre en tant que validateur."
        ]
      },
      "btc": {
        "model": "Pas une preuve de participation. Il s’agit d’un nœud Bitcoin complet ou élagué.",
        "min": "—",
        "wallets": "Sans objet",
        "panel": "Exécute Bitcoind",
        "yskDoes": [
          "Exécutez un nœud Bitcoin complet ou élagué."
        ],
        "youDo": [
          "Utilisez n’importe quel portefeuille Bitcoin séparément. L'exploitation minière et la foudre sont hors de portée."
        ],
        "steps": [
          "Traitez cette instance uniquement comme un nœud Bitcoin.",
          "Il n’y a pas de dépôt de jalonnement ni de magasin de clés de validateur."
        ],
        "never": [
          "Ne cherchez pas de portefeuille de jalonnement sur cette page."
        ]
      },
      "nearPoolSlug": "Nom du pool",
      "nearPoolSlugHint": "Nom court uniquement. L'usine ajoute {{suffix}}.",
      "nearOwner": "Compte propriétaire",
      "nearOwnerHint": "Compte NEAR qui signe create_staking_pool dans votre portefeuille. Pas la clé du nœud.",
      "nearPreview": "Aperçu de la commande",
      "nearWriteAccount": "Définir account_id",
      "nearWriteTitle": "Définir validator_key.json account_id pour {{id}} ?",
      "nearWriteDesc": "Écrit uniquement account_id sur le fichier de clé existant. N'envoie pas create_staking_pool. Ne touche pas secret_key.",
      "nearWriteC1": "account_id devient {{pool}}{{suffix}}",
      "nearWriteC2": "Le panneau ne signe jamais la transaction factory",
      "nearRestart": "Redémarrez le nœud après l'écriture",
      "nearNeedKey": "Attendez que la clé publique de mise apparaisse (neard init), puis remplissez ce formulaire.",
      "nearNeedSlug": "Entrez un nom de pool pour définir account_id.",
      "nearNeedOwner": "Entrez le compte propriétaire pour remplir la commande. Définir account_id n’a besoin que du nom du pool.",
      "cosmosPointing": "Cette gaiad est la v28 : copiez validator.json, puis créez-validator validator.json. Les documents du Hub affichent toujours des indicateurs – ceux-ci échouent ici. La transaction utilise la clé publique de consensus de ce nœud, et non l’adresse IP du serveur. Les pairs utilisent Public P2P (port hôte {{port}}). Le gaz vaut 0,005uatom – pas l’exemple de 0,0025uatom des documents Hub.",
      "avaxPointing": "L'enregistrement P-Chain utilise cette preuve NodeID et BLS, pas l'adresse IP du serveur. RPC reste sur localhost. Inscrivez-vous dans Core (Staking → Valider).",
      "ethVcCommand": "Exemple de validator client (absent de ce compose)",
      "ethVcHint": "Exécutez vous-même un validator client sur cette URL de balise. L'importation d'un keystore dans le répertoire de données de balise n'atteste pas.",
      "cosmosAmount": "Auto-délégation",
      "cosmosAmountHint": "uatom, ou 1atom pour 1 ATOM. Un simple 1 équivaut à 1 uatom – et non à 1 ATOM.",
      "cosmosAmountParsed": "{{amount}} = {{atom}}",
      "cosmosMoniker": "Moniker",
      "cosmosFromKey": "nom de clé --from",
      "cosmosFromHint": "Nom de la clé locale gaiad, ou signez avec Keplr. Pas la clé du consensus sur cet hôte.",
      "cosmosNeedPubkey": "Attendez que la clé publique de consensus apparaisse (gaiad init), puis remplissez ce formulaire.",
      "cosmosNeedFields": "Entrez le montant, le surnom et --from pour remplir la commande."
    },
    "alerts": {
      "diskTitle": "Disque validateur critique",
      "diskBody": "L’espace libre du volume de données validateur est critique.",
      "upgradeTitle": "Mise à jour validateur disponible",
      "upgradeBody": "Un ou plusieurs clients de nœud ont une version épinglée plus récente.",
      "syncTitle": "Le nœud validateur nécessite une attention",
      "syncBody": "Un nœud se synchronise depuis plus de 6 heures ou a signalé une erreur.",
      "rollbackTitle": "Mise à jour validateur annulée",
      "rollbackBody": "La mise à jour de {{id}} a échoué au contrôle de santé et a été annulée."
    },
    "upgrade": {
      "changelog": "Journal des changements"
    },
    "readiness": {
      "dockerTitle": "Docker pour les nœuds validateurs",
      "dockerOk": "{{count}} instance(s) de validateur ; Docker est installé",
      "dockerMissing": "Des instances de validateur existent mais la commande docker est introuvable"
    },
    "detail": {
      "status": "Statut",
      "sync": "Synchroniser",
      "peers": "Pairs",
      "traffic": "Trafic",
      "version": "Version",
      "access": "Accéder",
      "upgrade": "Mises à jour",
      "upgradeHint": "Comment ce nœud suit les versions client.",
      "setVersion": "Changer de version",
      "setVersionHint": "Choisissez une balise Docker officielle pour un client sur ce nœud. Compose est réécrit, puis extrait et redémarré.",
      "setVersionConfirmTitle": "Changer {{id}} en {{tag}} ?",
      "setVersionConfirmDesc": "Réécrit la composition, extrait {{ref}} et redémarre le nœud.",
      "setVersionC1": "Le conteneur en cours d'exécution est remplacé par la balise sélectionnée.",
      "setVersionC2": "Tapez l'ID de l'instance pour confirmer.",
      "setVersionMainnet": "Mainnet : une mauvaise version peut mettre le nœud hors ligne. Je comprends.",
      "releaseNotes": "Notes de version",
      "network": "Réseau",
      "networkHint": "Le réseau de commutation arrête le nœud et efface les données de la chaîne. Confirmez d'abord sous Effacer les données.",
      "maintain": "Entretien",
      "danger": "Effacer les données",
      "dangerHint": "Tapez l'identifiant de l'instance ou CLEAR. Cela supprime les données de la chaîne sur le disque.",
      "compose": "Compose",
      "logs": "Journaux"
    },
    "state": {
      "unknown": "Inconnu",
      "stopped": "Arrêté",
      "created": "Créé (jamais commencé)",
      "missing": "Pas de conteneur",
      "starting": "Départ",
      "rpc_wait": "En cours d'exécution : RPC n'est pas prêt",
      "running": "En cours d'exécution",
      "syncing": "Synchronisation",
      "error": "Erreur"
    }
  },
  "vnc": {
    "pageDesc": "Serveur et client VNC",
    "result": "Résultat de l'opération VNC",
    "installed": "Installé",
    "notInstalled": "Non installé",
    "stackBins": "{{bins}}",
    "stackMissing": "Outils manquants",
    "executeOn": "YSK_EXECUTE sur",
    "executeOff": "YSK_EXECUTE désactivé",
    "statAccounts": "Comptes",
    "statRunning": "En cours",
    "statClients": "Profils clients",
    "statEndpoint": "Hôte",
    "goAccounts": "Comptes",
    "goClient": "Client",
    "goInstall": "Installer",
    "accountsEmptyTitle": "Aucun compte",
    "accountsEmptyDesc": "Créez un compte pour commencer",
    "clientPathHint": "Les deux chemins ouvrent VNC dans le navigateur. Ils diffèrent par la sémantique cible et la copie (tous deux toujours par proxy TCP via le panneau).",
    "clientPathCompare": "« Accessible à l'utilisateur » : noms d'hôtes publics (par exemple, hermes.example.com:5901). « Serveur proxy » : cibles LAN/DC que seul cet hôte peut atteindre. TCP est sondé depuis ce serveur avant la connexion.",
    "clientEmptyTitle": "Aucun client",
    "clientEmptyDesc": "Ajouter un hôte distant : port",
    "openInBrowser": "Ouvrir dans le navigateur",
    "pathUserReachable": "Point de terminaison accessible par l'utilisateur",
    "pathServerProxy": "Via un serveur proxy",
    "pathUserReachableShort": "Accessible par l'utilisateur",
    "pathServerProxyShort": "Serveur proxy",
    "pathUserReachableHint": "Pour les noms d'hôtes ou cibles publics tels que configurés (par exemple, example.com:5901). Le navigateur parcourt le panneau ; cet hôte doit ouvrir TCP à cette adresse.",
    "pathServerProxyHint": "Pour le réseau local ou les cibles, seul le serveur du plan de contrôle peut atteindre. Le trafic est proxy via le réseau de ce serveur. L'hôte de connexion facultatif remplace l'adresse TCP (par exemple, nom d'affichage vs 10.x).",
    "connectHost": "Connecter l'hôte (facultatif, serveur proxy)",
    "connectHostHint": "Adresse TCP que le plan de contrôle ouvre (LAN IP). Laissez vide pour utiliser l'hôte distant ci-dessus.",
    "pathBrowser": "Point de terminaison accessible par l'utilisateur",
    "pathHostViewer": "Via un serveur proxy",
    "hostViewer": "Via un serveur proxy",
    "needViewerOptional": "TigerVNC Viewer (facultatif, pas pour le chemin du navigateur)",
    "viewerStackOptional": "VNC dans le navigateur n'a pas besoin de vncviewer de bureau. Le package Viewer ci-dessous est uniquement une maintenance facultative du système.",
    "viewer": {
      "minting": "Séance de préparation…",
      "connecting": "De liaison…",
      "connected": "Connecté",
      "disconnected": "Déconnecté",
      "error": "Échec de la connexion",
      "idle": "Inactif",
      "closed": "Fermé",
      "minting_state": "Préparation",
      "reconnect": "Reconnecter",
      "disconnect": "Déconnecter",
      "fullscreen": "Plein écran",
      "fit": "Ajuster la fenêtre",
      "oneToOne": "1:1",
      "cad": "Ctrl+Alt+Suppr",
      "password": "Mot de passe VNC",
      "passwordPrompt": "Mot de passe requis",
      "sendPassword": "Envoyer le mot de passe",
      "securityFailure": "L'authentification a échoué",
      "canvasLabel": "Bureau VNC : {{name}}",
      "clipboardPaste": "Coller → à distance",
      "clipboardPanel": "Presse-papiers",
      "clipboardHint": "Synchronisez le texte entre ce navigateur et le bureau distant.",
      "clipboardLocal": "Envoyer à distance",
      "clipboardLocalPh": "Collez ou saisissez le texte à envoyer dans la session VNC",
      "clipboardRemote": "À distance",
      "clipboardRemotePh": "Le texte copié sur le bureau distant apparaît ici",
      "clipboardSend": "Envoyer à distance",
      "clipboardCopy": "Copier localement",
      "clipboardToRemote": "Presse-papiers envoyé à distance",
      "clipboardToRemoteHint": "Collez le presse-papier du navigateur dans la session à distance",
      "clipboardFromRemote": "Presse-papiers distant copié dans ce navigateur",
      "clipboardFromRemoteManual": "Presse-papiers distant mis à jour : ouvrez le panneau Presse-papiers pour copier",
      "clipboardEmpty": "Rien à coller : copiez d'abord le texte ou tapez ci-dessous",
      "clipboardReadDenied": "Lecture du presse-papiers bloquée par le navigateur : collez-le dans le panneau et envoyez",
      "clipboardNoRemote": "Aucun SMS reçu de la télécommande pour l'instant",
      "clipboardCopiedLocal": "Copié sur ce navigateur",
      "quality": "Qualité",
      "qualityHint": "Qualité d'image vs bande passante (JPEG / compression)",
      "qualityLow": "Faible (enregistrer les données)",
      "qualityBalanced": "Équilibré",
      "qualityHigh": "Élevé",
      "qualityMax": "Qualité maximale",
      "passwordPromptHint": "Ce bureau nécessite un mot de passe VNC — saisissez-le ci-dessous.",
      "errNeedExecute": "Impossible de démarrer le bureau : le serveur nécessite root et YSK_EXECUTE activé.",
      "errTicket": "Ticket de session expiré ou invalide : appuyez sur Reconnecter.",
      "errBusy": "Trop de sessions VNC sur ce panneau : fermez-en une autre et réessayez.",
      "errRefused": "Rien n'écoute sur {{host}}:{{port}} (connexion refusée). VNC est-il en cours d’exécution et accessible depuis ce serveur ?",
      "errRefusedGeneric": "Connexion refusée : vérifiez que VNC est en cours d'exécution et que le port est correct.",
      "errTimeout": "Le délai de connexion à {{host}} : {{port}} a expiré. Vérifiez le pare-feu/le chemin réseau à partir de ce serveur.",
      "errTimeoutGeneric": "La connexion a expiré : vérifiez le réseau et le pare-feu.",
      "errDns": "Impossible de résoudre le nom d'hôte «{{host}}».",
      "errDnsGeneric": "Le nom d'hôte n'a pas pu être résolu.",
      "errNet": "Réseau inaccessible pour {{host}}:{{port}}.",
      "reconnecting": "Connexion interrompue – reconnexion ({{n}}/{{max}})…",
      "idleHint": "La session est inactive depuis un moment. Le poste de travail distant peut se verrouiller ; déplacez la souris ou reconnectez-vous si nécessaire.",
      "idleDismiss": "Toujours là",
      "sessions": "Ouvrir des sessions VNC",
      "sessionCount": "{{n}} / {{max}} séances",
      "sessionLimit": "Au maximum {{max}} sessions VNC à la fois : fermez-en une en premier.",
      "closeSession": "Fermer la session {{name}}",
      "shareLink": "Partager le lien",
      "shareCopied": "Lien de partage en lecture seule copié (valable environ 1 heure)",
      "shareFailed": "Impossible de créer le lien de partage",
      "shareTitle": "Vue VNC partagée",
      "shareGuest": "Bureau partagé",
      "shareMissing": "Jeton de partage manquant",
      "shareExpired": "Ce lien de partage n'est pas valide ou a expiré",
      "viewOnlyBadge": "Visualisation uniquement",
      "screenshot": "Capture d'écran",
      "screenshotSaved": "Capture d'écran téléchargée",
      "screenshotFailed": "Impossible de capturer une capture d'écran",
      "screenshotNoCanvas": "L'affichage n'est pas prêt pour la capture d'écran",
      "record": "Enregistrer",
      "recordStop": "Arrêter l'enregistrement",
      "recordHint": "Enregistrer le bureau sur WebM (max 60 s)",
      "recordStarted": "Enregistrement… cliquez sur Arrêter l'enregistrement ou attendez 60 s",
      "recordSaved": "Enregistrement téléchargé",
      "recordFailed": "Impossible d'enregistrer",
      "recordUnsupported": "Ce navigateur ne peut pas enregistrer le canevas",
      "connectingHint": "Ouverture d'un tunnel sécurisé vers le bureau…",
      "reconnectHint": "Appuyez sur Reconnecter pour réessayer ou vérifiez l'hôte et le port distants."
    },
    "installHint": "TigerVNC → noVNC ; XFCE en option",
    "needTigerVnc": "TigerVNC requis",
    "needXfceFirst": "Installez d'abord XFCE",
    "needSessionRunning": "La session n'est pas en cours d'exécution : démarrez-la d'abord",
    "needNovnc": "nonVNC requis",
    "needXfce": "XFCE (facultatif)",
    "needViewer": "Visionneuse (facultatif)",
    "needViewerOrNovnc": "Visionneuse ou noVNC",
    "settingsHint": "Valeurs par défaut pour les nouveaux comptes",
    "settingsNeedStack": "Ces valeurs par défaut s'appliquent lorsque TigerVNC (et XFCE si sélectionné) sont installés. Installez-les d'abord dans l'onglet Installer.",
    "clientNeedNovnc": "Ouvrir dans le navigateur nécessite noVNC. Installez-le dans l'onglet Installer avant d'ajouter les télécommandes que vous prévoyez d'ouvrir ici.",
    "defaultDesktop": "Bureau par défaut",
    "defaultGeometry": "Résolution par défaut",
    "defaultDepth": "Profondeur de couleur",
    "defaultRfbBind": "RFB écouter",
    "defaultAutostart": "Sessions de démarrage automatique",
    "autostartLabel": "Démarrer au démarrage",
    "settingsSaved": "Paramètres par défaut VNC enregistrés",
    "tab": {
      "overview": "Vue d'ensemble",
      "accounts": "Comptes",
      "client": "Client",
      "install": "Installer",
      "settings": "Paramètres",
      "about": "À propos"
    },
    "desktop": {
      "xfce": "XFCE (bureau complet)",
      "terminal": "Terminal"
    },
    "bind": {
      "localhost": "Localhost uniquement (noVNC / tunnel)",
      "all": "Toutes les interfaces (RFB direct — pare-feu ouvert)",
      "localhostShort": "hôte local",
      "allShort": "0.0.0.0"
    },
    "accountListTitle": "Comptes VNC ({{count}})",
    "accountListDesc": "Un utilisateur Linux par compte",
    "createAccount": "+ Créer un compte",
    "createAccountTitle": "Créer un compte VNC",
    "createAccountDesc": "Utilisateur yskvnc_* dédié",
    "createAccountBtn": "Créer un compte",
    "editAccountTitle": "Modifier le compte VNC",
    "editAccountDesc": "Utilisateur Linux {{user}} · affichage :{{display}}",
    "setPassword": "Mot de passe",
    "setPasswordTitle": "Définir le mot de passe VNC",
    "setPasswordDesc": "Mettre à jour le mot de passe de connexion VNC pour {{address}}",
    "newPassword": "Nouveau mot de passe",
    "confirmPassword": "Confirmez le mot de passe",
    "passwordHint": "Minimum 6 caractères",
    "passwordMismatch": "Les mots de passe ne correspondent pas",
    "passwordTooShort": "Le mot de passe doit contenir au moins 6 caractères",
    "needName": "Entrez un nom d'affichage",
    "start": "Démarrer",
    "stop": "Arrêter",
    "startAfterCreate": "Commencer après la création",
    "hostnameBroken": "Cet hôte ne peut pas résoudre son propre nom d'hôte ({{hostname}}). Le démarrage de la session échouera.",
    "hostnameBrokenIdle": "Hostname {{hostname}} does not resolve on this host. Fix /etc/hosts before you create a session.",
    "hostnameFix": "Écrivez le nom d'hôte dans /etc/hosts",
    "hostnameFixTitle": "Ajouter cette ligne à /etc/hosts ?",
    "hostnameFixDesc": "{{line}}",
    "hostnameFixDone": "Nom d'hôte /etc/hosts mis à jour",
    "startAfterCreateBlocked": "Désactivé jusqu'à ce que le nom d'hôte soit résolu",
    "startHostnameBlocked": "Impossible de démarrer tant que cet hôte n'a pas résolu son nom d'hôte. Utilisez « Écrire le nom d'hôte dans /etc/hosts ».",
    "colName": "Nom",
    "colLinuxUser": "Utilisateur Linux",
    "colDisplay": "Affichage/port",
    "colStatus": "Statut",
    "colDesktop": "Bureau",
    "colBind": "Liaison RFB",
    "accountStatus": {
      "running": "En cours",
      "stopped": "Arrêté",
      "failed": "Échoué",
      "written": "Écrit",
      "unknown": "Inconnu"
    },
    "clientStatus": {
      "up": "Connecté",
      "down": "Déconnecté",
      "unknown": "Inconnu",
      "error": "Erreur",
      "viewing": "Affichage dans le navigateur"
    },
    "accountPager": "Pages de compte",
    "prevPage": "Précédent",
    "nextPage": "Suivant",
    "pageOf": "Page {{page}} / {{total}} · {{count}}",
    "deleteAccountTitle": "Supprimer le compte VNC ?",
    "deleteAccountDesc": "Supprimez le compte du plan de contrôle {{name}} ({{user}}). La session sera arrêtée en premier.",
    "deleteAccountC1": "Session VNC pour cet affichage",
    "deleteAccountC2": "Métadonnées du panneau sous dataDir/vnc",
    "deleteAccountC3User": "L'accueil de l'utilisateur Linux sera supprimé (userdel -r)",
    "deleteAccountC3Keep": "L'utilisateur Linux sera conservé sur le système",
    "removeLinuxUser": "Supprimez également l'utilisateur Linux et le répertoire personnel",
    "deleteKeepUserWarn": "L'utilisateur Linux restera sur l'hôte en tant qu'orphelin. Vous devrez le nettoyer plus tard.",
    "bindRfbLine": "RFB {{bind}} :{{port}}",
    "bindNovncLine": "noVNC 127.0.0.1 :{{port}}",
    "bindNovncHint": "noVNC écoute sur localhost. Le bureau est accessible via ce panneau, pas via Internet public, à moins que la liaison RFB ne concerne toutes les interfaces.",
    "connection": "Connecter",
    "connectionTitle": "Matériaux de connexion",
    "connectionDesc": "Comment les clients atteignent {{name}}",
    "connectionPathsHint": "Préférez ouvrir dans le navigateur ; options avancées pour l'ancien noVNC / RFB direct",
    "connectionBrowserHint": "Recommandé : ouvrez le bureau à l'intérieur de ce panneau (pas de tunnel SSH, fonctionne depuis n'importe quel navigateur pouvant accéder au panneau).",
    "connectionBrowserDesc": "Démarre la session VNC si nécessaire et ouvre la visionneuse intégrée au panneau avec le clavier, la souris et le presse-papiers.",
    "connectionAdvanced": "Avancé : URL noVNC héritée et RFB direct",
    "pathViaServer": "Via serveur (noVNC)",
    "pathViaServerLegacy": "NoVNC hérité sur le serveur (127.0.0.1)",
    "pathViaServerLegacyHint": "Fonctionne uniquement sur l'hôte du serveur ou via le tunnel SSH — préférez « Ouvrir dans le navigateur ».",
    "pathDirect": "RFB directe",
    "recommended": "Recommandé",
    "startNovnc": "Démarrer noVNC",
    "stopNovnc": "Arrêter noVNC",
    "copyNovncUrl": "Copier l'URL noVNC",
    "copyAddress": "Copier l'hôte : port",
    "openFirewall": "Ouvrir le port UFW",
    "directAddress": "Adresse",
    "ticketPath": "Afficher l'API des tickets",
    "directLocalhostWarn": "RFB est réservé à l'hôte local",
    "copied": "Copié dans le presse-papiers",
    "clientListTitle": "Profils clients ({{count}})",
    "clientListDesc": "VNC sortant",
    "addClient": "+ Ajouter une télécommande",
    "addClientTitle": "Ajouter un VNC distant",
    "addClientDesc": "Hôte distant : port",
    "clientTarget": "Cible",
    "clientPath": "Chemin de connexion",
    "clientHost": "Hôte distant",
    "pathViaServerShort": "Navigateur",
    "pathDirectShort": "Visionneuse hôte",
    "disconnect": "Déconnecter",
    "connect": "Connecter",
    "clientNeedFields": "Le nom et l'hôte sont requis",
    "clientCreated": "Profil client créé",
    "clientPasswordOptional": "Mot de passe VNC (facultatif)",
    "clientPasswordHint": "Utilisé lorsque vous ouvrez la visionneuse du navigateur. Laissez vide pour le saisir à chaque fois.",
    "clientRememberPassword": "Stocker le mot de passe sur ce serveur pour la prochaine ouverture",
    "clientRememberPasswordWarn": "Le mot de passe est stocké dans le panneau dataDir (lisible par root). Préférez taper à chaque fois sur des hôtes mutualisés.",
    "stackMissingShort": "Non installé",
    "editClientTitle": "Modifier le client distant",
    "editClientDesc": "Mettez à jour le chemin, les hôtes et le mot de passe stocké facultatif.",
    "clientUpdated": "Profil client mis à jour",
    "rememberNeedPassword": "Entrez d'abord un mot de passe."
  },
  "vpn": {
    "pageDesc": "Serveur et client VPN",
    "eyebrow": "VPN",
    "tab": {
      "wireguard": "WireGuard",
      "openvpn": "OpenVPN",
      "outline": "Shadowsocks",
      "client": "Client local",
      "software": "Logiciels",
      "monitor": "Moniteur",
      "about": "À propos",
      "server": "Serveur",
      "install": "Installer",
      "overview": "Vue d'ensemble"
    },
    "softwareIntro": "Installez ou mettez à jour les moteurs VPN ici. Les onglets du serveur restent concentrés sur la configuration.",
    "monitor": {
      "needLive": "Les métriques en direct nécessitent root + YSK_EXECUTE sur le serveur.",
      "autoRefresh": "Auto 3s",
      "filterEngine": "Filtre moteur",
      "filterPresence": "Filtre de présence",
      "engineAll": "Tous les moteurs",
      "presenceAll": "Tous",
      "presenceOnline": "En ligne",
      "presenceOffline": "Hors ligne",
      "onlineOf": "En ligne {{online}} / {{total}}",
      "peersTitle": "Pairs ({{count}})",
      "localTitle": "Sortie locale",
      "colEndpoint": "Distant",
      "colLastSeen": "Dernière activité",
      "colRx": "↓Total",
      "colTx": "↑ Total",
      "colRxRate": "↓ Tarif",
      "colTxRate": "↑ Tarif",
      "sampledAt": "Échantillonné {{when}}",
      "emptyPeers": "Aucun pair à afficher",
      "emptyPeersHint": "Ajoutez des pairs dans les onglets du moteur ou effacez les filtres",
      "presence": {
        "online": "En ligne",
        "idle": "Inactif",
        "offline": "Hors ligne",
        "never": "Jamais",
        "unknown": "Inconnu"
      }
    },
    "installed": "Installé",
    "notInstalled": "Non installé",
    "serverUp": "En cours",
    "serverDown": "Arrêté",
    "engineSummary": "port {{port}} · {{peers}} pairs",
    "engineSummaryClient": "{{count}} profils · {{up}} vers le haut",
    "needWireGuard": "WireGuard requis",
    "needOpenVpn": "OpenVPN requis",
    "needSs": "serveur SS requis",
    "ssHonestUi": "Clés d'accès ss:// (pas d'Outline Manager complet)",
    "listenPort": "Port d'écoute",
    "listenPortUdp": "Port d'écoute (UDP)",
    "listenPortTcp": "Port d'écoute (TCP)",
    "endpoint": "Point de terminaison public",
    "endpointHint": "Hôte public : port utilisé par les clients pour se connecter",
    "ddnsFill": "Utiliser le nom d'hôte DDNS",
    "ddnsFilled": "Hôte de point de terminaison rempli à partir du DDNS. Les pairs sont inchangés.",
    "ddnsFillEmpty": "Aucun nom d'hôte principal DDNS pour l'instant. Ajoutez-en un dans l'onglet DNS DDNS.",
    "ensureServer": "Appliquer le serveur",
    "openFirewall": "Ouvert {{port}}/{{proto}}",
    "presets": "Préréglages de ports",
    "portHint": {
      "51820": "Port d'écoute WireGuard par défaut",
      "51821": "Port d'écoute WireGuard alternatif",
      "51822": "Deuxième port d'écoute WireGuard alternatif"
    },
    "proto": "Protocole",
    "protoUdp": "UDP",
    "protoTcp": "TCP",
    "statusLine": "{{state}} · {{port}}/{{proto}} · {{peers}} pairs",
    "peersTitle": "Pairs / clés",
    "peersTitleWg": "Pairs",
    "peersTitleOvpn": "Configurations client",
    "peersTitleSs": "Clés d'accès",
    "peerName": "Nom",
    "peerNamePlaceholder": "téléphone",
    "peerNameHint": "Lettres, chiffres, . _ - — pas d'espaces, / ou !",
    "peerNameInvalid": "Espaces, / et ! ne sont pas autorisés. Utilisez {{preview}} ou modifiez le nom.",
    "addPeer": "+ Ajouter",
    "installEngineFirst": "Installez d'abord le moteur VPN",
    "needServerRunning": "{{engine}} n'est pas en cours d'exécution — appliquez d'abord le serveur",
    "engineSummarySoftware": "{{installed}} installé · {{running}} en cours d'exécution",
    "privateKeyOnce": "La clé privée du client est affichée uniquement ici. Téléchargez-le ou copiez-le maintenant : il ne pourra pas être récupéré plus tard.",
    "showPrivateKey": "Afficher la clé privée",
    "hidePrivateKey": "Masquer la clé privée",
    "deletePeerTitle": "Supprimer le pair {{name}} ?",
    "deletePeerDesc": "Remove {{name}} ({{address}}). The client disconnects immediately and the config cannot be restored.",
    "deleteClientTitle": "Supprimer le client OpenVPN {{name}} ?",
    "deleteClientDesc": "Supprimez {{name}} ({{address}}). Le client se déconnecte immédiatement et le profil ne peut pas être restauré. Le serveur OpenVPN reste actif.",
    "deleteKeyTitle": "Supprimer la clé Shadowsocks {{name}} ?",
    "deleteKeyDesc": "Supprimez la clé d'accès {{name}} ({{address}}). Les clients utilisant cette clé se déconnectent. Le serveur Shadowsocks reste actif.",
    "deleteResult": "Supprimé {{name}}.",
    "portInvalid": "Le port d'écoute doit être un nombre entier compris entre 1 et 65 535.",
    "portRequired": "Le port d'écoute est requis.",
    "importInvalid": "Impossible de détecter une configuration client WireGuard ou OpenVPN.",
    "qrFailed": "Impossible de générer un code QR pour cette configuration. Téléchargez ou copiez plutôt le texte.",
    "cfgTitle": "Configuration — {{name}}",
    "addPeerWg": "+ Ajouter un pair",
    "addPeerOvpn": "+ Ajouter un client",
    "addPeerSs": "+ Ajouter une clé",
    "noPeers": "Aucun pour l'instant",
    "noPeersHint": "Ajoutez-en un pour télécharger la configuration",
    "colName": "Nom",
    "colAddress": "Adresse",
    "colCreated": "Créé",
    "colActions": "Actes",
    "colEngine": "Moteur",
    "colStatus": "Statut",
    "colIface": "Interface",
    "downloadKey": "Télécharger",
    "showQr": "QR",
    "copyConf": "Copier",
    "copied": "Copié",
    "downloaded": "Configuration téléchargée",
    "qrReady": "Prêt pour les QR",
    "qrTitle": "QR-{{name}}",
    "qrHintWg": "Scanner dans l'application WireGuard",
    "qrHintSs": "Scannez ss:// dans un client Shadowsocks",
    "showConf": "Texte de configuration",
    "close": "Fermer",
    "clientIntro": "Importez un fichier de configuration pour connecter cet hôte",
    "profileName": "Nom du profil",
    "pasteConf": "Coller la conférence",
    "importProfile": "Importer",
    "importOpen": "+ Importer la configuration",
    "noProfiles": "Aucun profil local",
    "noProfilesHint": "Importer la configuration du client WireGuard ou OpenVPN",
    "connect": "Connecter",
    "disconnect": "Déconnecter",
    "clientStatus": {
      "up": "Connecté",
      "down": "Déconnecté",
      "unknown": "Inconnu",
      "error": "Erreur"
    },
    "result": "Résultat",
    "clientEngine": "Taper",
    "engineAuto": "Détection automatique",
    "refresh": "Actualiser",
    "dnsOptional": "DNS (facultatif)",
    "serverSettings": "Paramètres du serveur",
    "access": {
      "label": "Trafic client",
      "full": "Internet complet",
      "lan": "Réseau local uniquement",
      "custom": "Itinéraires personnalisés",
      "fullHint": "Tout le trafic client passe via ce serveur (active NAT). Reconnectez les clients après l'application.",
      "lanHint": "Uniquement VPN + réseaux privés sélectionnés ; le client conserve son propre Internet. Reconnectez-vous après l'application.",
      "customHint": "Seuls les CIDR que vous répertoriez entrent dans le tunnel. Reconnectez-vous après l'application.",
      "lanCidrs": "Réseaux LAN",
      "customCidr": "CIDR",
      "addCidr": "Ajouter",
      "cidrRequired": "Saisissez un CIDR (par exemple 192.168.1.0/24).",
      "cidrInvalid": "Saisissez un CIDR valide, par exemple 192.168.1.0/24."
    },
    "engineNotInstalled": "Ce moteur VPN n'est pas installé sur l'hôte.",
    "serverNotListening": "L'unité serveur n'est pas active. UDP/TCP {{port}} est peut-être fermé."
  }
}
