{
  "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}}"
}
