export default { // Navigation nav: { printers: 'Imprimantes', archives: 'Archives', queue: 'File d\'attente', stats: 'Statistiques', profiles: 'Profils', maintenance: 'Maintenance', projects: 'Projets', inventory: 'Filament', files: 'Gestionnaire de fichiers', settings: 'Paramètres', system: 'Système', collapseSidebar: 'Réduire la barre latérale', expandSidebar: 'Développer la barre latérale', update: 'Mise à jour', updateAvailable: 'Mise à jour disponible : v{{version}}', updateAvailableBanner: 'La version {{version}} est disponible !', viewUpdate: 'Voir la mise à jour', viewOnGithub: 'Voir sur GitHub', keyboardShortcuts: 'Raccourcis clavier (?)', switchToLight: 'Passer au mode clair', switchToDark: 'Passer au mode sombre', smartSwitches: 'Interrupteurs intelligents', logout: 'Déconnexion', }, // Common common: { save: 'Enregistrer', saving: 'Enregistrement...', cancel: 'Annuler', delete: 'Supprimer', edit: 'Modifier', add: 'Ajouter', close: 'Fermer', confirm: 'Confirmer', loading: 'Chargement...', error: 'Erreur', success: 'Succès', warning: 'Avertissement', enabled: 'Activé', disabled: 'Désactivé', yes: 'Oui', no: 'Non', on: 'On', off: 'Off', all: 'Tous', none: 'Aucun', search: 'Rechercher', filter: 'Filtrer', sort: 'Trier', refresh: 'Actualiser', download: 'Télécharger', upload: 'Téléverser', actions: 'Actions', status: 'Statut', name: 'Nom', description: 'Description', date: 'Date', time: 'Heure', hours: 'heures', minutes: 'minutes', seconds: 'secondes', days: 'jours', enable: 'Activer', disable: 'Désactiver', permissions: 'Autorisations', noPrinters: 'Aucune imprimante configurée', noData: 'Aucune donnée disponible', linkNotFound: 'Lien non trouvé', required: 'Requis', optional: 'Optionnel', dismiss: 'Ignorer', apply: 'Appliquer', reset: 'Réinitialiser', export: 'Exporter', import: 'Importer', clear: 'Effacer', selectAll: 'Tout sélectionner', deselectAll: 'Tout désélectionner', noChange: '— Aucun changement —', unchanged: 'Inchangé', unassigned: 'Non assigné', unknown: 'Inconnu', unknownError: 'Erreur inconnue', today: 'Aujourd\'hui', asap: 'Dès que possible', overdue: 'En retard', now: 'Maintenant', collapse: 'Réduire', expand: 'Développer', viewArchive: 'Voir l\'archive', viewInFileManager: 'Voir dans le gestionnaire de fichiers', addedBy: 'Ajouté par {{username}}', prints: 'impressions', more: '+{{count}} de plus', ascending: 'Croissant', descending: 'Décroissant', printer: 'Imprimante', remove: 'Retirer', type: 'Type', print: 'Imprimer', rename: 'Renommer', move: 'Déplacer', create: 'Créer', duplicate: 'Dupliquer', left: 'Gauche', right: 'Droite', }, // Printers page printers: { title: 'Imprimantes', addPrinter: 'Ajouter une imprimante', editPrinter: 'Modifier l\'imprimante', deletePrinter: 'Supprimer l\'imprimante', printerName: 'Nom de l\'imprimante', serialNumber: 'Numéro de série', ipAddress: 'Adresse IP / Nom d\'hôte', accessCode: 'Code d\'accès', model: 'Modèle', nozzleCount: 'Nombre de buses', autoArchive: 'Auto-archivage', status: { available: 'Disponible', idle: 'Inactif', printing: 'Impression en cours', paused: 'En pause', offline: 'Hors ligne', error: 'Erreur', finished: 'Terminé', unknown: 'Inconnu', }, temperatures: { nozzle: 'Buse', bed: 'Plateau', chamber: 'Chambre', }, progress: '{{percent}}% terminé', timeRemaining: '{{time}} restant', deleteConfirm: 'Êtes-vous sûr de vouloir supprimer "{{name}}" ?', maintenanceOk: 'Maintenance OK', maintenanceWarning: '{{count}} avertissement', maintenanceWarning_plural: '{{count}} avertissements', maintenanceDue: '{{count}} échéance', maintenanceDue_plural: '{{count}} échéances', // Sort options sort: { name: 'Nom', status: 'Statut', model: 'Modèle', location: 'Emplacement', ascending: 'Tri croissant', descending: 'Tri décroissant', }, // Card size cardSize: { small: 'Petites cartes', medium: 'Cartes moyennes', large: 'Grandes cartes', extraLarge: 'Très grandes cartes', }, // Controls hideOffline: 'Masquer hors ligne', nextAvailable: 'Prochaine disponible', powerOn: 'Allumer', offlinePrintersWithPlugs: 'Imprimantes hors ligne avec prises connectées', noPrintersConfigured: 'Aucune imprimante configurée pour le moment', // Printer card readyToPrint: 'Prête à imprimer', external: 'Externe', deleteArchives: 'Supprimer les archives d\'impression', noLabel: 'Pas d\'étiquette', printPreview: 'Aperçu avant impression', width: 'Largeur', height: 'Hauteur', noObjectsFound: 'Aucun objet trouvé', objectsLoadedOnPrintStart: 'Les objets sont chargés au début de l\'impression', willBeSkipped: 'Sera sauté', name: 'Nom', serialCannotBeChanged: 'Le numéro de série ne peut pas être modifié', locationHelp: 'Utilisé pour grouper les imprimantes et filtrer la file d\'attente', // WiFi signal strength wifiSignal: { veryWeak: 'Très faible', weak: 'Faible', fair: 'Moyen', good: 'Bon', excellent: 'Excellent', }, // Maintenance maintenanceUpToDate: 'Maintenance à jour - Cliquez pour voir', // Chamber light chamberLightOn: 'Allumer la lumière de la chambre', chamberLightOff: 'Éteindre la lumière de la chambre', // Files browseFiles: 'Parcourir les fichiers de l\'imprimante', // Smart plug autoOffAfterPrint: 'Extinction auto après impression', autoOffExecuted: 'Extinction auto exécutée - rallumez pour réinitialiser', // HMS errors hmsErrors: 'Erreurs HMS', viewHmsErrors: 'Voir {{count}} erreur(s) HMS', // Actions resume: 'Reprendre', pause: 'Pause', stop: 'Arrêter', camera: 'Caméra', skipObject: 'Sauter l\'objet', reconnect: 'Reconnecter', mqttDebug: 'Débogage MQTT', activeNozzle: 'Active : buse {{nozzle}}', nozzleRack: 'Rack à buses', nozzleDocked: 'Rangée', nozzleMounted: 'Montée', nozzleActive: 'Active', nozzleIdle: 'Inactive', nozzleDiameter: 'Diamètre', nozzleType: 'Type', nozzleStatus: 'Statut', nozzleFilament: 'Filament', nozzleWear: 'Usure', nozzleMaxTemp: 'Temp Max', nozzleSerial: 'Série', nozzleHardenedSteel: 'Acier Trempé', nozzleStainlessSteel: 'Acier Inoxydable', nozzleTungstenCarbide: 'Carbure de Tungstène', nozzleFlow: 'Débit', nozzleHighFlow: 'Haut débit', nozzleStandardFlow: 'Standard', // Firmware firmwareUpdate: 'Mise à jour Firmware', firmwareInstructions: 'Sur l\'écran de l\'imprimante, allez dans', firmwareNav: 'Naviguez vers', settings: 'Paramètres', firmware: 'Firmware', // Discovery discoverPrinters: 'Découvrir les imprimantes', searching: 'Recherche...', manualEntry: 'Saisie manuelle', addFromCloud: 'Ajouter depuis le Cloud', // Toast messages toast: { printerDeleted: 'Imprimante supprimée', printerAdded: 'Imprimante ajoutée', printerUpdated: 'Imprimante mise à jour', failedToDelete: 'Échec de la suppression', failedToAdd: 'Échec de l\'ajout', failedToUpdate: 'Échec de la mise à jour', commandSent: 'Commande envoyée', failedToSendCommand: 'Échec de l\'envoi de la commande', turnedOn: '{{name}} allumée', failedToPowerOn: 'Échec de l\'allumage de {{name}}', scriptTriggered: 'Script déclenché', printStopped: 'Impression arrêtée', printPaused: 'Impression en pause', printResumed: 'Impression reprise', referenceDeleted: 'Référence supprimée', detectionAreaSaved: 'Zone de détection enregistrée', failedToRunScript: 'Échec du script', failedToStopPrint: 'Échec de l\'arrêt', failedToPausePrint: 'Échec de la mise en pause', failedToResumePrint: 'Échec de la reprise', failedToControlChamberLight: 'Échec du contrôle de la lumière', failedToUpdateSetting: 'Échec de mise à jour du paramètre', failedToSkipObjects: 'Échec du saut d\'objets', failedToRereadRfid: 'Échec lecture RFID', failedToCheckPlate: 'Échec vérification plateau', failedToUpdateLabel: 'Échec mise à jour étiquette', failedToDeleteReference: 'Échec suppression référence', failedToSaveDetectionArea: 'Échec enregistrement zone', plateCheckEnabled: 'Vérification plateau activée', plateCheckDisabled: 'Vérification plateau désactivée', calibrationSaved: 'Calibration enregistrée !', calibrationFailed: 'Échec de la calibration', rfidRereadInitiated: 'Lecture RFID initiée', }, // Connection status connection: { connected: 'Connecté', offline: 'Hors ligne', }, // Queue info queue: { inQueue: '{{count}} impression en file', inQueue_plural: '{{count}} impressions en file', }, // Controls section controls: 'Contrôles', // RFID rfid: { reread: 'Relire RFID', }, // Permissions permission: { noAdd: 'Pas d\'autorisation pour ajouter', noEdit: 'Pas d\'autorisation pour modifier', noDelete: 'Pas d\'autorisation pour supprimer', noControl: 'Pas d\'autorisation pour contrôler', noFiles: 'Pas d\'autorisation pour les fichiers', noAmsRfid: 'Pas d\'autorisation pour le RFID', noSmartPlugControl: 'Pas d\'autorisation pour les prises', }, // Add/Edit modal modal: { addTitle: 'Ajouter une imprimante', editTitle: 'Modifier l\'imprimante', myPrinter: 'Mon imprimante', selectModel: 'Choisir un modèle...', locationGroup: 'Emplacement / Groupe (optionnel)', locationPlaceholder: 'ex: Atelier, Bureau', autoArchiveLabel: 'Auto-archiver les impressions terminées', fromPrinterSettings: 'Depuis les paramètres imprimante', modelOptional: 'Modèle (optionnel)', saveChanges: 'Enregistrer les modifications', }, // Skip objects skipObjects: { tooltip: 'Sauter des objets', onlyWhilePrinting: 'Sauter (uniquement pendant l\'impression)', requiresMultiple: 'Sauter (nécessite 2+ objets)', title: 'Sauter des objets', matchIdsInfo: 'Faites correspondre les IDs avec l\'écran de l\'imprimante', printerShowsIds: 'L\'écran affiche les IDs des objets sur le plateau', skipSelected: 'Sauter la sélection', skipping: 'Saut en cours...', noObjectsSelected: 'Aucun objet sélectionné', selectObjectsToSkip: 'Sélectionnez les objets à ignorer', skipped: 'sauté', objectsSkipped: 'Objets sautés', activeCount: '{{count}} actifs', waitForLayer: 'Attendez la couche 2 pour sauter des objets (actuelle : {{layer}})', skip: 'Sauter', confirmTitle: 'Sauter l\'objet ?', confirmMessage: 'Voulez-vous vraiment sauter "{{name}}" ? Cette action est irréversible.', }, // Confirm modals confirm: { deleteTitle: 'Supprimer l\'imprimante', deleteMessage: 'Supprimer "{{name}}" ? Cela retirera tous les paramètres de connexion.', deleteArchivesNote: 'Tout l\'historique sera définitivement supprimé.', keepArchivesNote: 'L\'historique sera conservé mais plus associé à cette imprimante.', stopTitle: 'Arrêter l\'impression', stopMessage: 'Arrêter l\'impression sur "{{name}}" ?', stopButton: 'Arrêter', pauseTitle: 'Mettre en pause', pauseMessage: 'Mettre en pause l\'impression sur "{{name}}" ?', pauseButton: 'Pause', resumeTitle: 'Reprendre l\'impression', resumeMessage: 'Reprendre l\'impression sur "{{name}}" ?', resumeButton: 'Reprendre', powerOnTitle: 'Allumer l\'imprimante', powerOnMessage: 'Allumer "{{name}}" ?', powerOnButton: 'Allumer', powerOffTitle: 'Éteindre l\'imprimante', powerOffMessage: 'Éteindre "{{name}}" ?', powerOffWarning: 'ATTENTION : "{{name}}" imprime ! L\'éteindre maintenant peut endommager l\'imprimante.', powerOffButton: 'Éteindre', }, // Discovery discovery: { title: 'Découvrir les imprimantes', searching: 'Recherche...', scanning: 'Scan en cours...', scanProgress: 'Scan... {{scanned}}/{{total}}', foundPrinters: '{{count}} imprimante(s) trouvée(s)', noPrintersFound: 'Aucune imprimante trouvée', noPrintersFoundSubnet: 'Aucune imprimante dans ce sous-réseau.', noPrintersFoundNetwork: 'Aucune imprimante sur le réseau.', allConfigured: 'Toutes les imprimantes trouvées sont déjà configurées.', alreadyAdded: 'Déjà ajoutée', select: 'Sélectionner', manualEntry: 'Saisie manuelle', addFromCloud: 'Ajouter depuis le Cloud', subnetToScan: 'Sous-réseau à scanner', dockerNote: 'Docker détecté. Entrez le sous-réseau en notation CIDR. Nécessite network_mode: host.', scanSubnet: 'Scanner le sous-réseau', discoverNetwork: 'Découvrir sur le réseau', scanningSubnet: 'Scan du sous-réseau pour imprimantes Bambu...', scanningNetwork: 'Scan du réseau...', serialRequired: 'Série requis', unknown: 'Inconnu', failedToStart: 'Échec du démarrage de la découverte', }, // Filaments section filaments: 'Filaments', // Camera openCameraOverlay: 'Ouvrir la caméra en superposition', openCameraWindow: 'Ouvrir la caméra dans une fenêtre', // Firmware firmwareUpdateAvailable: 'Mise à jour firmware : {{current}} → {{latest}}', firmwareUpToDate: 'Firmware {{version}} — À jour', firmwareUpdateButton: 'Mettre à jour', // Plate detection plateDetection: { noPermission: 'Pas d\'autorisation de modification', enabledClick: 'Vérification activée - Cliquez pour désactiver', disabledClick: 'Vérification désactivée - Cliquez pour activer', manageCalibration: 'Gérer la calibration de détection', calibrationRequired: 'Calibration requise', calibrationInstructions: 'Videz le plateau, puis cliquez sur Calibrer.', calibrationDescription: 'Capture une image de référence du plateau vide.', calibrationTip: 'Conseil : Stockez jusqu\'à 5 références. Le système utilise la meilleure correspondance.', plateEmpty: 'Le plateau semble vide', objectsDetected: 'Objets détectés sur le plateau', confidence: 'Confiance', difference: 'Différence', analysisPreview: 'Aperçu de l\'analyse :', analysisLegend: 'Cadre vert = zone, Rouge = différences', savedReferences: 'Références ({{count}}/{{max}})', deleteReference: 'Supprimer la référence', labelPlaceholder: 'Étiquette...', clickToEdit: '{{label}} - Modifier', clickToAddLabel: 'Ajouter une étiquette', }, // Fans fans: { partCooling: 'Ventilateur pièce', auxiliary: 'Ventilateur auxiliaire', chamber: 'Ventilateur chambre', }, // HMS errors clickToViewHmsErrors: 'Cliquez pour voir les erreurs HMS', estimatedCompletion: 'Fin estimée', slotOptions: 'Options du slot', // Firmware modal firmwareModal: { title: 'Mise à jour Firmware', titleUpToDate: 'Infos Firmware', currentVersion: 'Actuelle :', latestVersion: 'Dernière :', releaseNotes: 'Notes de version', checkingPrereqs: 'Vérification des prérequis...', sdCardReady: 'Carte SD prête. Cliquez pour téléverser.', uploadedSuccess: 'Firmware téléversé !', applyInstructions: 'Pour appliquer sur l\'imprimante :', step1: 'Sur l\'écran, allez dans Paramètres', step2: 'Allez dans Firmware', step3: 'Sélectionnez "Mettre à jour depuis carte SD"', step4: 'Prévoyez 10-20 minutes', done: 'Terminé', starting: 'Démarrage...', uploadFirmware: 'Téléverser le Firmware', uploadFailed: 'Échec du téléversement : {{error}}', uploadedToast: 'Firmware téléversé ! Lancez la mise à jour sur l\'écran.', }, accessCodePlaceholder: 'Laissez vide pour garder l\'actuel', // ROI editor roi: { title: 'Zone de détection (ROI)', xStart: 'Début X', yStart: 'Début Y', width: 'Largeur', height: 'Hauteur', instruction: 'Ajustez le cadre vert pour cibler le plateau.', }, }, // Archives page archives: { title: 'Archives d\'impression', searchPlaceholder: 'Chercher dans les archives...', filterByPrinter: 'Par imprimante', filterByStatus: 'Par statut', sortBy: 'Trier par', sortNewest: 'Plus récent', sortOldest: 'Plus ancien', sortName: 'Nom', sortDuration: 'Durée', sortLargest: 'Plus volumineux', sortSmallest: 'Plus léger', sortSize: 'Taille', noArchives: 'Aucune archive trouvée', noArchivesSearch: 'Aucune archive ne correspond', noArchivesYet: 'Pas encore d\'archive', loadingArchives: 'Chargement...', releaseToUpload: 'Relâcher pour téléverser', showAll: 'Tout afficher', showFavoritesOnly: 'Favoris uniquement', gridView: 'Grille', listView: 'Liste', calendarView: 'Calendrier', manageTags: 'Gérer les tags', showFailedPrints: 'Afficher les échecs', hideFailedPrints: 'Masquer les échecs', printTime: 'Temps d\'impression', filamentUsed: 'Filament utilisé', cost: 'Coût', reprint: 'Réimprimer', preview: 'Aperçu', deleteArchive: 'Supprimer l\'archive', deleteConfirm: 'Supprimer cette archive ?', favorite: 'Favori', unfavorite: 'Retirer des favoris', viewDetails: 'Détails', status: { completed: 'Réussi', failed: 'Échoué', stopped: 'Arrêté', }, toast: { source3mfAttached: 'Source 3MF attachée : {{filename}}', failedUploadSource3mf: 'Échec téléversement 3MF', source3mfRemoved: 'Source 3MF retirée', failedRemoveSource3mf: 'Échec retrait 3MF', f3dAttached: 'F3D attaché : {{filename}}', failedUploadF3d: 'Échec téléversement F3D', f3dRemoved: 'F3D retiré', failedRemoveF3d: 'Échec retrait F3D', timelapseAttached: 'Timelapse attaché : {{filename}}', timelapseAlreadyAttached: 'Timelapse déjà présent', noMatchingTimelapse: 'Pas de timelapse correspondant', failedScanTimelapse: 'Échec scan timelapse', failedAttachTimelapse: 'Échec attache timelapse', archiveDeleted: 'Archive supprimée', failedDeleteArchive: 'Échec suppression', addedToFavorites: 'Ajouté aux favoris', removedFromFavorites: 'Retiré des favoris', projectUpdated: 'Projet mis à jour', failedUpdateProject: 'Échec mise à jour projet', linkCopied: 'Lien copié', failedCopyLink: 'Échec copie lien', photoDeleted: 'Photo supprimée', failedDeletePhoto: 'Échec suppression photo', failedDeleteArchives: 'Échec suppression archives', failedUpdateFavorites: 'Échec mise à jour favoris', exportDownloaded: 'Export téléchargé', exportFailed: 'Échec export', }, menu: { print: 'Imprimer', schedule: 'Planifier', openInBambuStudio: 'Ouvrir dans le Slicer', slice: 'Découper', externalLink: 'Lien externe', viewOnMakerWorld: 'Voir sur MakerWorld', preview3d: 'Aperçu 3D', viewTimelapse: 'Voir le Timelapse', scanForTimelapse: 'Scanner pour Timelapse', downloadSource3mf: 'Télécharger Source 3MF', uploadSource3mf: 'Téléverser Source 3MF', replaceSource3mf: 'Remplacer Source 3MF', removeSource3mf: 'Retirer Source 3MF', uploadF3d: 'Téléverser F3D', replaceF3d: 'Remplacer F3D', downloadF3d: 'Télécharger F3D', removeF3d: 'Retirer F3D', download: 'Télécharger', copyDownloadLink: 'Copier lien de téléchargement', qrCode: 'Code QR', viewPhotos: 'Voir les photos', viewPhotosCount: 'Voir les photos ({{count}})', projectPage: 'Page du Projet', addToFavorites: 'Ajouter aux favoris', removeFromFavorites: 'Retirer des favoris', edit: 'Modifier', goToProject: 'Aller au Projet : {{name}}', addToProject: 'Ajouter au Projet', removeFromProject: 'Retirer du Projet', loading: 'Chargement...', noProjectsAvailable: 'Aucun projet disponible', select: 'Sélectionner', deselect: 'Désélectionner', delete: 'Supprimer', }, permission: { noReprint: 'Pas d\'autorisation de réimpression', noAddToQueue: 'Pas d\'autorisation pour la file', noUpdateArchives: 'Pas d\'autorisation de mise à jour', noUploadFiles: 'Pas d\'autorisation de téléversement', noDownload: 'Pas d\'autorisation de téléchargement', noCopyLink: 'Pas d\'autorisation de copie lien', noDelete: 'Pas d\'autorisation de suppression', noCreate: 'Pas d\'autorisation de création', }, card: { previousPlate: 'Plateau précédent', nextPlate: 'Plateau suivant', plateNumber: 'Plateau {{index}}', moreOptions: 'Clic droit pour plus d\'options', addToFavorites: 'Ajouter aux favoris', removeFromFavorites: 'Retirer des favoris', cancelled: 'annulé', failed: 'échoué', duplicate: 'doublon', duplicateTitle: 'Ce modèle a déjà été imprimé', openSource3mf: 'Ouvrir 3MF dans Bambu Studio (clic droit pour plus)', downloadF3d: 'Télécharger fichier Fusion 360', viewTimelapse: 'Voir timelapse', viewPhoto: 'Voir 1 photo', viewPhotos: 'Voir {{count}} photos', openFolder: 'Ouvrir le dossier : {{name}}', slicedFile: 'Fichier découpé - prêt', sourceFile: 'Fichier source uniquement - pas de mapping AMS', gcode: 'GCODE', source: 'SOURCE', project: 'Projet : {{name}}', estimated: 'Estimé : {{time}}', actual: 'Réel : {{time}}', accuracy: 'Précision : {{percent}}%', filament: '{{weight}}g', layer: '{{count}} couche', layers: '{{count}} couches', object: '{{count}} objet', objects: '{{count}} objets', slicedFor: 'Découpé pour {{model}}', uploadedBy: 'Téléversé par', noPermissionReprint: 'Pas d\'autorisation de réimpression', noPermissionEdit: 'Pas d\'autorisation de modification', noPermissionDelete: 'Pas d\'autorisation de suppression', reprint: 'Réimprimer', schedulePrint: 'Planifier', schedule: 'Planifier', openInBambuStudio: 'Ouvrir dans le Slicer', openInBambuStudioToSlice: 'Ouvrir dans le Slicer pour découper', slice: 'Découper', externalLink: 'Lien externe', makerWorld: 'MakerWorld : {{designer}}', viewProject: 'Voir projet', noExternalLink: 'Aucun lien externe', preview3d: 'Aperçu 3D', download: 'Télécharger', edit: 'Modifier', delete: 'Supprimer', }, modal: { deleteArchive: 'Supprimer l\'archive', deleteConfirm: 'Supprimer "{{name}}" ? Cette action est irréversible.', deleteButton: 'Supprimer', removeSource3mf: 'Retirer Source 3MF', removeSource3mfConfirm: 'Retirer le fichier 3MF de "{{name}}" ?', removeButton: 'Retirer', removeF3d: 'Retirer F3D', removeF3dConfirm: 'Retirer le fichier Fusion 360 de "{{name}}" ?', timelapse: '{{name}} - Timelapse', selectTimelapse: 'Choisir un Timelapse', selectTimelapseDesc: 'Sélectionnez manuellement le timelapse :', deleteArchives: 'Supprimer les archives', deleteArchivesConfirm: 'Supprimer {{count}} archive(s) ?', deleteCount: 'Supprimer {{count}}', }, page: { title: 'Archives', printsCount: '{{filtered}} sur {{total}} impressions', dropFilesHere: 'Déposez les fichiers .3mf ici', releaseToUpload: 'Relâcher pour téléverser', only3mfSupported: 'Seuls les fichiers .3mf sont supportés', close: 'Fermer', selected: '{{count}} sélectionnés', selectAll: 'Tout sélectionner', tags: 'Tags', project: 'Projet', favorite: 'Favori', delete: 'Supprimer', toggledFavorites: 'Favoris mis à jour pour {{count}} archive(s)', failedUpdateFavorites: 'Échec mise à jour favoris', archivesDeleted: '{{count}} archive(s) supprimée(s)', failedDeleteArchives: 'Échec suppression', photoDeleted: 'Photo supprimée', failedDeletePhoto: 'Échec suppression photo', }, list: { name: 'Nom', printer: 'Imprimante', date: 'Date', size: 'Taille', actions: 'Actions', hasTimelapse: 'A un timelapse', }, }, // Queue page queue: { title: 'File d\'attente', subtitle: 'Gérez vos travaux d\'impression', addToQueue: 'Ajouter à la file', // Print modal print: 'Imprimer', reprint: 'Réimprimer', schedulePrint: 'Planifier', editQueueItem: 'Modifier l\'élément', printToPrinters: 'Imprimer sur {{count}} imprimantes', queueToPrinters: 'Ajouter à la file pour {{count}} imprimantes', sending: 'Envoi...', sendingProgress: 'Envoi {{current}}/{{total}}...', adding: 'Ajout...', addingProgress: 'Ajout {{current}}/{{total}}...', savingProgress: 'Enregistrement {{current}}/{{total}}...', clearQueue: 'Vider la file', clearHistory: 'Effacer l\'historique', emptyQueue: 'La file est vide', position: 'Position', scheduledTime: 'Heure prévue', moveUp: 'Monter', moveDown: 'Descendre', startNow: 'Démarrer maintenant', printingInProgress: 'Impression en cours...', viewArchive: 'Voir l\'archive', viewInFileManager: 'Voir dans le gestionnaire', itemCount: '{{count}} élément', itemCount_plural: '{{count}} éléments', dragToReorder: 'Glisser pour réordonner (ASAP uniquement)', reorderHint: 'La position n\'affecte que les éléments ASAP.', addedBy: 'Ajouté par {{name}}', nextInQueue: 'Prochain en file', clearPlate: 'Vider plateau & lancer suivant', clearPlateSuccess: 'Plateau vidé — prêt pour l\'impression suivante', plateReady: 'Plateau vidé — prêt pour l\'impression suivante', // Sections sections: { currentlyPrinting: 'En cours', queued: 'En attente', history: 'Historique', }, // Status status: { pending: 'En attente', waiting: 'En attente', printing: 'Impression', paused: 'En pause', completed: 'Terminé', failed: 'Échoué', skipped: 'Sauté', cancelled: 'Annulé', }, // Summary cards summary: { printing: 'Impressions', queued: 'En attente', totalTime: 'Temps total estimé', history: 'Historique', }, // Filters filter: { allPrinters: 'Toutes les imprimantes', unassigned: 'Non assigné', allStatus: 'Tous les statuts', allLocations: 'Tous les emplacements', any: 'Tout', }, // Sort sort: { byPosition: 'Par position', byName: 'Par nom', byPrinter: 'Par imprimante', bySchedule: 'Par planification', byDate: 'Par date', ascendingOldest: 'Croissant (plus vieux)', descendingNewest: 'Décroissant (plus récent)', }, // Badges badges: { staged: 'Préparé', requiresPrevious: 'Nécessite succès précédent', autoPowerOff: 'Extinction auto', }, // Empty state empty: { title: 'Aucune impression prévue', description: 'Planifiez depuis les Archives ou glissez des fichiers ici.', }, // Time time: { asap: 'Dès que possible', overdue: 'En retard', now: 'Maintenant', lessThanMinute: 'Dans moins d\'une minute', inMinutes: 'Dans {{count}} min', inHours: 'Dans {{count}} heures', }, // Actions actions: { stopPrint: 'Arrêter', startPrint: 'Démarrer', requeue: 'Remettre en file', }, // Bulk edit bulkEdit: { title: 'Modifier {{count}} élément', title_plural: 'Modifier {{count}} éléments', description: 'Seuls les changements seront appliqués.', printer: 'Imprimante', noChange: '— Aucun changement —', queueOptions: 'Options de file', staged: 'Préparé (manuel)', autoPowerOff: 'Extinction auto après', requirePrevious: 'Requiert succès précédent', printOptions: 'Options d\'impression', bedLevelling: 'Nivellement plateau', flowCalibration: 'Calibration débit', vibrationCalibration: 'Vibration (Input Shaper)', layerInspection: 'Inspection 1ère couche', timelapse: 'Timelapse', useAms: 'Utiliser AMS', applyChanges: 'Appliquer', selectAll: 'Tout sélectionner', deselectAll: 'Tout désélectionner', selected: '{{count}} sélectionnés', editSelected: 'Modifier la sélection', cancelSelected: 'Annuler la sélection', }, // Confirmations confirm: { cancelTitle: 'Annuler l\'impression prévue', cancelMessage: 'Annuler "{{name}}" ?', stopTitle: 'Arrêter l\'impression', stopMessage: 'Arrêter "{{name}}" sur l\'imprimante ?', removeTitle: 'Retirer de l\'historique', removeMessage: 'Retirer "{{name}}" de l\'historique ?', clearHistoryTitle: 'Effacer l\'historique', clearHistoryMessage: 'Retirer les {{count}} éléments ?', cancelButton: 'Annuler l\'impression', stopButton: 'Arrêter l\'impression', thisPrint: 'cette impression', thisItem: 'cet élément', }, // Toast messages toast: { cancelled: 'Élément annulé', cancelFailed: 'Échec annulation', removed: 'Élément retiré', removeFailed: 'Échec retrait', stopped: 'Impression arrêtée', stopFailed: 'Échec arrêt', released: 'Libéré dans la file', startFailed: 'Échec démarrage', reorderFailed: 'Échec réorganisation', historyCleared: '{{count}} éléments effacés', clearHistoryFailed: 'Échec effacement', updateFailed: 'Échec mise à jour', bulkCancelled: '{{count}} éléments annulés', bulkCancelFailed: 'Échec annulation', }, // Permissions permissions: { noStopPrint: 'Pas d\'autorisation d\'arrêt', noStartPrint: 'Pas d\'autorisation de démarrage', noEdit: 'Pas d\'autorisation de modification', noCancel: 'Pas d\'autorisation d\'annulation', noRequeue: 'Pas d\'autorisation de remise en file', noRemove: 'Pas d\'autorisation de retrait', noClearHistory: 'Pas d\'autorisation historique', noEditItems: 'Pas d\'autorisation modification groupée', noCancelItems: 'Pas d\'autorisation annulation groupée', }, }, // Statistics page stats: { title: 'Tableau de bord', subtitle: 'Glissez les widgets pour réorganiser. Cliquez sur l\'œil pour masquer.', overview: 'Vue d\'ensemble', totalPrints: 'Total impressions', successRate: 'Taux de succès', totalPrintTime: 'Temps total d\'impression', printTime: 'Temps d\'impression', totalFilament: 'Total filament utilisé', filamentUsed: 'Filament utilisé', filamentCost: 'Coût filament', totalCost: 'Coût total', energyUsed: 'Énergie consommée', energyCost: 'Coût énergie', averagePrintTime: 'Temps moyen par impression', printsPerDay: 'Impressions par jour', byPrinter: 'Par imprimante', printsByPrinter: 'Impressions par imprimante', byMaterial: 'Par matériau', byMonth: 'Par mois', last7Days: '7 derniers jours', last30Days: '30 derniers jours', last90Days: '90 derniers jours', allTime: 'Tout le temps', // Widgets quickStats: 'Stats rapides', printActivity: 'Activité d\'impression', filamentTypes: 'Types de filament', filamentTrends: 'Tendances filament', failureAnalysis: 'Analyse des échecs', timeAccuracy: 'Précision du temps', successful: 'Succès :', failed: 'Échecs :', perfectEstimate: '100% = estimation parfaite', noTimeAccuracyData: 'Pas encore de données de précision', noFilamentData: 'Aucune donnée de filament', noPrinterData: 'Aucune donnée d\'imprimante', noPrintData: 'Aucune donnée d\'impression', noPrintDataLast30Days: 'Aucune impression ces 30 derniers jours', failureReasons: 'Raisons des échecs', topFailureReasons: 'Top raisons d\'échec', failedPrintsCount: '{{failed}} / {{total}} impressions ont échoué', lastWeekRate: 'Semaine dernière : {{rate}}%', // Actions resetLayout: 'Réinitialiser la mise en page', recalculateCosts: 'Recalculer les coûts', recalculateCostsHint: 'Recalcule les coûts avec les prix actuels des filaments', exportStats: 'Exporter les stats', exportAsCsv: 'Exporter en CSV', exportAsExcel: 'Exporter en Excel', hiddenCount: '{{count}} Masqués', // Toast exportDownloaded: 'Export téléchargé', exportFailed: 'Échec export', layoutReset: 'Mise en page réinitialisée', recalculatedCosts: 'Coûts recalculés pour {{count}} archives', recalculateFailed: 'Échec du calcul', // Loading loadingStats: 'Chargement des statistiques...', // Permissions noPermissionResetLayout: 'Pas d\'autorisation de réinitialisation', noPermissionRecalculate: 'Pas d\'autorisation de recalcul', }, // Maintenance page maintenance: { title: 'Maintenance', overview: 'Vue d\'ensemble', allOk: 'Toute la maintenance est à jour', dueCount: '{{count}} tâche à faire', dueCount_plural: '{{count}} tâches à faire', warningCount: '{{count}} avertissement', warningCount_plural: '{{count}} avertissements', totalPrintTime: 'Temps d\'impression total', nextMaintenance: 'Prochaine maintenance', nothingDue: 'Rien de prévu', tasks: 'Tâches', lastPerformed: 'Dernière réalisation', interval: 'Intervalle', hoursRemaining: '{{hours}}h restantes', hoursOverdue: '{{hours}}h de retard', markDone: 'Marquer comme fait', performMaintenance: 'Effectuer la maintenance', history: 'Historique', noHistory: 'Aucun historique', editPrintHours: 'Modifier les heures d\'impression', currentHours: 'Heures actuelles', // Tabs statusTab: 'Statut', settingsTab: 'Paramètres', // Status overdueCount: '{{count}} en retard', dueSoonCount: '{{count}} bientôt', dueSoon: 'Bientôt', allGood: 'Tout va bien', overdueBy: 'Retard de {{duration}}', dueIn: 'Dans {{duration}}', timeLeft: '{{duration}} restant', // Duration formats day: '1 jour', days: '{{count}} jours', week: '1 semaine', weeks: '{{count}} semaines', month: '1 mois', months: '{{count}} mois', year: '1 an', // Settings maintenanceTypes: 'Types de maintenance', maintenanceTypesDescription: 'Types système et tâches personnalisées', addCustomType: 'Ajouter un type', intervalType: 'Type d\'intervalle', intervalValue: 'Intervalle ({{type}})', icon: 'Icône', documentationLink: 'Lien documentation (optionnel)', assignToPrinters: 'Assigner aux imprimantes', selectAtLeastOnePrinter: 'Sélectionnez au moins une imprimante', addType: 'Ajouter le type', custom: 'Personnalisé', printHours: 'Heures d\'impression', calendarDays: 'Jours calendaires', exampleName: 'ex: Remplacement filtre HEPA', viewDocumentation: 'Voir documentation', timeBasedInterval: 'Intervalle temporel', // Interval overrides intervalOverrides: 'Exceptions d\'intervalle', intervalOverridesDescription: 'Intervalles spécifiques par imprimante', // Printer assignment assignedToPrinters: 'Assigné aux imprimantes :', noPrintersAssigned: 'Aucune imprimante assignée', addPrinterShort: 'Ajouter :', printersAssignedClick: '{{count}} imprimante(s) assignée(s) - gérer', removeFromPrinter: 'Retirer de cette imprimante', // Types types: { lubricateCarbonRods: 'Lubrifier les tiges carbone', lubricateRails: 'Lubrifier les rails linéaires', cleanNozzle: 'Nettoyer la buse / hotend', checkBelts: 'Vérifier la tension des courroies', cleanBuildPlate: 'Nettoyer le plateau', checkExtruder: 'Vérifier les engrenages de l\'extrudeur', checkCooling: 'Vérifier les ventilateurs', generalInspection: 'Inspection générale', cleanCarbonRods: 'Nettoyer les tiges carbone', cleanLinearRails: 'Nettoyer les rails linéaires', checkPtfeTube: 'Vérifier le tube PTFE', replaceHepaFilter: 'Remplacer le filtre HEPA', replaceCarbonFilter: 'Remplacer le filtre charbon', lubricateLeftNozzleRail: 'Lubrifier le rail de buse gauche', }, // Toast maintenanceComplete: 'Maintenance marquée comme faite', typeUpdated: 'Type mis à jour', typeDeleted: 'Type supprimé', printHoursUpdated: 'Heures mises à jour', printerAssigned: 'Imprimante assignée', printerRemoved: 'Imprimante retirée', // Confirmation deleteTypeConfirm: 'Supprimer "{{name}}" ?', // Permissions noPermissionUpdate: 'Pas d\'autorisation de mise à jour', noPermissionPerform: 'Pas d\'autorisation d\'action', noPermissionEditTypes: 'Pas d\'autorisation de modification types', noPermissionDeleteTypes: 'Pas d\'autorisation de suppression types', noPermissionEditHours: 'Pas d\'autorisation de modification heures', noPermissionRemovePrinter: 'Pas d\'autorisation retrait imprimante', noPermissionAssignPrinter: 'Pas d\'autorisation assignation', noPermissionEditIntervals: 'Pas d\'autorisation modification intervalles', // Configure link configureSettings: 'Configurer types et intervalles', }, // Settings page settings: { title: 'Paramètres', general: 'Général', // Tab names tabs: { general: 'Général', smartPlugs: 'Prises connectées', notifications: 'Notifications', filament: 'Filament', network: 'Réseau', apiKeys: 'Clés API', virtualPrinter: 'Imprimante virtuelle', users: 'Authentification', backup: 'Sauvegarde', emailAuth: 'Authentification Email', }, // Email settings email: { smtpSettings: 'Configuration SMTP', smtpHost: 'Serveur SMTP', smtpPort: 'Port SMTP', security: 'Sécurité', authentication: 'Authentification', username: 'Utilisateur', password: 'Mot de passe', fromEmail: 'Email expéditeur', fromName: 'Nom expéditeur', testConnection: 'Tester la connexion SMTP', testRecipient: 'Email test destinataire', sendTest: 'Envoyer email test', sending: 'Envoi...', save: 'Enregistrer les paramètres', saving: 'Enregistrement...', advancedAuth: 'Authentification avancée', advancedAuthEnabled: 'L\'authentification avancée est activée', advancedAuthEnabledDesc: 'La gestion des utilisateurs par email est active. Les nouveaux utilisateurs recevront un mot de passe auto-généré.', advancedAuthDisabled: 'Authentification avancée désactivée', advancedAuthDisabledDesc: 'Activez pour les fonctionnalités liées à l\'email (mot de passe oublié, etc).', enable: 'Activer', disable: 'Désactiver', feature1: 'Génération auto et envoi de mots de passe par email', feature2: 'Connexion par utilisateur ou email', feature3: 'Réinitialisation mot de passe oublié disponible', feature4: 'Réinitialisation admin par email', // Error messages errors: { requiredFields: 'Remplissez tous les champs requis', usernameRequired: 'L\'utilisateur est requis pour l\'authentification', enterTestEmail: 'Entrez une adresse email de test', smtpServerAndEmail: 'Serveur et expéditeur requis pour le test', usernamePasswordRequired: 'Utilisateur et mot de passe requis pour l\'auth', configureSmtpFirst: 'Configurez et testez le SMTP d\'abord', }, // Success messages success: { settingsSaved: 'Paramètres SMTP enregistrés', }, // Security options securityOptions: { starttls: 'STARTTLS (Port 587)', ssl: 'SSL/TLS (Port 465)', none: 'Aucun (Port 25)', }, // Authentication options authOptions: { enabled: 'Activée', disabled: 'Désactivée', }, }, appearance: 'Apparence', notifications: 'Notifications', smartPlugs: 'Prises connectées', spoolman: 'Spoolman', updates: 'Mises à jour', language: 'Langue', languageDescription: 'Choisissez votre langue', theme: 'Thème', themeLight: 'Clair', themeDark: 'Sombre', themeSystem: 'Système', defaultView: 'Vue par défaut', defaultViewDescription: 'Page affichée au démarrage', checkForUpdates: 'Vérifier les mises à jour', autoUpdate: 'Mise à jour auto', currentVersion: 'Version actuelle', latestVersion: 'Dernière version', upToDate: 'Bambuddy est à jour', updateAvailable: 'Mise à jour disponible', // Notifications notificationLanguage: 'Langue des notifications', notificationLanguageDescription: 'Langue pour les notifications push', notificationProviders: 'Fournisseurs de notifications', addProvider: 'Ajouter un fournisseur', editProvider: 'Modifier le fournisseur', providerType: 'Type de fournisseur', testNotification: 'Tester la notification', testSuccess: 'Notification de test envoyée', testFailed: 'Échec de l\'envoi du test', quietHours: 'Heures de silence', quietHoursDescription: 'Ne pas déranger pendant ces heures', quietHoursStart: 'Début', quietHoursEnd: 'Fin', events: { title: 'Événements de notification', printStart: 'Impression démarrée', printComplete: 'Impression terminée', printFailed: 'Impression échouée', printStopped: 'Impression arrêtée', printProgress: 'Jalons de progression', printProgressDescription: 'Notifier à 25%, 50%, 75%', printerOffline: 'Imprimante hors ligne', printerError: 'Erreur imprimante', filamentLow: 'Filament bas', maintenanceDue: 'Maintenance due', maintenanceDueDescription: 'Notifier quand une tâche est due', }, // Smart Plugs smartPlug: { title: 'Prises connectées', add: 'Ajouter une prise', edit: 'Modifier la prise', name: 'Nom', ipAddress: 'Adresse IP', linkedPrinter: 'Imprimante liée', autoOn: 'Allumage auto', autoOnDescription: 'Allumer au début de l\'impression', autoOff: 'Extinction auto', autoOffDescription: 'Éteindre après l\'impression', offDelay: 'Délai d\'extinction', offDelayMinutes: 'Minutes après fin', offDelayTemp: 'Quand la buse est sous', currentState: 'État actuel', turnOn: 'Allumer', turnOff: 'Éteindre', }, // Filament Tracking Mode filamentTracking: 'Suivi de Filament', filamentTrackingDesc: 'Choisissez comment suivre vos bobines. Utilisez l\'inventaire intégré ou connectez un serveur Spoolman.', disableFilamentWarnings: 'Désactiver les avertissements de filament', disableFilamentWarningsDesc: 'Ne pas afficher les avertissements de filament insuffisant lors de l\'impression ou de la mise en file d\'attente', trackingModeBuiltIn: 'Inventaire Intégré', trackingModeBuiltInDesc: 'Correspondance RFID et suivi de consommation inclus', trackingModeSpoolmanDesc: 'Serveur de gestion externe', builtInFeatureRfid: 'Détecte auto les bobines RFID Bambu Lab dans l\'AMS', builtInFeatureUsage: 'Suit la consommation par impression', builtInFeatureCatalog: 'Gère bobines, couleurs et profils facteur K', // Spoolman settings spoolmanUrl: 'URL Spoolman', spoolmanUrlHint: 'URL de votre serveur Spoolman (ex: http://localhost:7912)', spoolmanConnected: 'Connecté', spoolmanDisconnected: 'Déconnecté', status: 'Statut', connect: 'Connecter', disconnect: 'Déconnecter', howSyncWorks: 'Fonctionnement de la Sync', syncInfoRfidOnly: 'Seules les bobines officielles RFID sont synchronisées', syncInfoAutoCreate: 'Les bobines sont créées dans Spoolman à la 1ère sync', syncInfoThirdPartySkipped: 'Les bobines tierces ou rechargées sont ignorées', linkingExistingSpools: 'Lier des bobines existantes', linkingExistingSpoolsDesc: 'Pour lier une bobine Spoolman, survolez un slot AMS et cliquez sur "Lier à Spoolman".', syncMode: 'Mode de Sync', syncModeAuto: 'Automatique', syncModeManual: 'Manuel uniquement', syncModeAutoDesc: 'Sync auto lors de changements AMS', syncModeManualDesc: 'Sync uniquement sur déclenchement manuel', syncAmsData: 'Synchroniser AMS', syncAmsDataDesc: 'Synchroniser manuellement les données vers Spoolman', allPrinters: 'Toutes les imprimantes', // Default printer noDefaultPrinter: 'Aucune par défaut (demander à chaque fois)', // Sidebar sidebarOrder: 'Ordre de la barre latérale', // Camera saveThumbnails: 'Enregistrer les vignettes', captureFinishPhoto: 'Prendre une photo à la fin', noPrintersConfigured: 'Aucune imprimante configurée', // Archive settings archiveMode: { always: 'Toujours créer une archive', never: 'Ne jamais créer d\'archive', ask: 'Demander à chaque fois', }, // Updates checkForUpdatesLabel: 'Vérifier les mises à jour', checkPrinterFirmware: 'Vérifier le firmware imprimante', // Queue enableRetry: 'Activer la rétentative', // Home Assistant homeAssistantDescription: 'Contrôler les prises via Home Assistant', environmentManagedLabel: '(Géré par l\'environnement)', autoEnabledViaEnv: 'Activé via variables d\'environnement', urlFromEnvReadOnly: 'Valeur HA_URL (lecture seule)', tokenFromEnvReadOnly: 'Valeur HA_TOKEN (lecture seule)', // MQTT mqttConnectedTo: 'Connecté à', // Prometheus prometheusDescription: 'Exposer les données au format Prometheus', // Smart plugs empty state noSmartPlugsTitle: 'Aucune prise configurée', noSmartPlugsDescription: 'Ajoutez une prise Tasmota pour suivre l\'énergie et automatiser.', // Notifications empty state noProvidersTitle: 'Aucun fournisseur configuré', noProvidersDescription: 'Ajoutez un fournisseur pour recevoir des alertes.', noTemplatesAvailable: 'Aucun modèle dispo. Redémarrez pour les générer.', // API permissions apiPermissionView: 'Voir statut et file', apiPermissionEdit: 'Gérer la file d\'attente', // API keys apiKeysEmptyTitle: 'Aucune clé API', apiKeysEmptyDescription: 'Créez une clé pour vos intégrations.', // Users noUsersFound: 'Aucun utilisateur trouvé', noGroupsFound: 'Aucun groupe trouvé', noGroupsAvailable: 'Aucun groupe disponible', passwordsDoNotMatch: 'Les mots de passe ne correspondent pas', systemGroupWarning: 'Les noms des groupes système sont fixes', // Auth disabled authDisabledTitle: 'Authentification désactivée', authDisabledFeature1: 'Requis pour accéder au système', authDisabledFeature2: 'Gestion multi-utilisateurs et groupes', authDisabledFeature3: 'Plus de 50 permissions granulaires', // User deletion userHasCreated: 'Cet utilisateur a créé :', userItemsQuestion: 'Que faire de ces éléments ?', deleteUserConfirm: 'Supprimer cet utilisateur ?', actionCannotBeUndone: 'Cette action est irréversible.', // Smart plugs addFirstSmartPlug: 'Ajoutez votre première prise', // Notifications providers: 'Fournisseurs', log: 'Journal', testAll: 'Tout tester', testResults: 'Résultats du test', testPassedCount: '{{count}} succès', testFailedCount: '{{count}} échecs', messageTemplates: 'Modèles de message', messageTemplatesDescription: 'Personnalisez les messages par événement.', // API Keys section apiKeys: 'Clés API', apiKeysDescription: 'Créez des clés pour webhooks et API.', createKey: 'Créer une clé', apiKeyCreated: 'Clé API créée avec succès', apiKeyCopyWarning: "Copiez cette clé maintenant - elle ne sera plus affichée !", useInApiBrowser: 'Utiliser dans l\'explorateur API', createNewApiKey: 'Nouvelle clé API', keyName: 'Nom de la clé', keyNamePlaceholder: 'ex: Home Assistant, OctoPrint', readStatus: 'Lire le statut', readStatusDescription: 'Voir les imprimantes et la file', manageQueue: 'Gérer la file', manageQueueDescription: 'Ajouter/retirer des éléments', controlPrinter: 'Contrôler l\'imprimante', controlPrinterDescription: 'Pause, reprise, arrêt', unnamedKey: 'Clé sans nom', lastUsed: 'Dernière utilisation', read: 'Lecture', control: 'Contrôle', createFirstKey: 'Créez votre première clé', webhookEndpoints: 'Points de terminaison Webhook', webhookApiKeyHint: 'Utilisez la clé dans l\'en-tête X-API-Key.', webhook: { getAllStatus: 'Tous les statuts', getSpecificStatus: 'Statut spécifique', addToQueue: 'Ajouter à la file', pausePrint: 'Pause', resumePrint: 'Reprise', stopPrint: 'Arrêt', }, apiBrowser: 'Explorateur API', apiBrowserDescription: 'Testez les endpoints API.', apiKeyForTesting: 'Clé API pour test', apiKeyPlaceholder: 'Collez votre clé pour tester...', apiKeyHint: 'Sera envoyée via l\'en-tête X-API-Key.', deleteApiKeyTitle: 'Supprimer la clé API', deleteApiKeyMessage: 'Les intégrations utilisant cette clé cesseront de fonctionner.', deleteKey: 'Supprimer la clé', // Filament tab amsDisplayThresholds: 'Seuils d\'affichage AMS', amsThresholdsDescription: 'Seuils de couleur pour humidité et température.', humidity: 'Humidité', goodGreen: 'Bon (vert)', fairOrange: 'Moyen (orange)', aboveFairBad: 'Au-dessus = rouge (mauvais)', temperature: 'Température', goodBlue: 'Bon (bleu)', aboveFairHot: 'Au-dessus = rouge (chaud)', historyRetention: 'Rétention d\'historique', keepSensorHistory: 'Garder l\'historique pendant', historyRetentionDescription: 'Les anciennes données seront supprimées.', printModal: 'Fenêtre d\'impression', expandCustomMapping: 'Étendre le mapping personnalisé par défaut', expandCustomMappingDescription: 'Affiche le mapping AMS par imprimante étendu.', // User management authentication: 'Authentification', authEnabledDescription: 'L\'instance est sécurisée', authDisabledDescription: 'Activez pour restreindre l\'accès', authDisabledMessage: 'Activez l\'authentification pour gérer comptes et permissions.', enableAuthentication: 'Activer l\'authentification', currentUser: 'Utilisateur actuel', changePassword: 'Changer le mot de passe', admin: 'Admin', users: 'Utilisateurs', addUser: 'Ajouter un utilisateur', groups: 'Groupes', addGroup: 'Ajouter un groupe', system: 'Système', noDescription: 'Pas de description', userCount: '{{count}} utilisateurs', permissionCount: '{{count}} permissions', createUser: 'Créer un utilisateur', username: 'Nom d\'utilisateur', enterUsername: 'Entrez l\'utilisateur', password: 'Mot de passe', enterPassword: 'Mot de passe (min 6 char)', confirmPassword: 'Confirmer le mot de passe', confirmPasswordPlaceholder: 'Confirmez le mot de passe', // Title tooltips viewReleaseOnGitHub: 'Voir la version sur GitHub', turnAllPlugsOn: 'Tout allumer', turnAllPlugsOff: 'Tout éteindre', // Modal: Clear logs clearNotificationLogs: 'Effacer les journaux', clearLogsMessage: 'Efface définitivement les logs de plus de 30 jours.', clearLogs: 'Effacer les logs', // Modal: Reset UI resetUiPreferences: 'Réinitialiser l\'UI', resetUiPreferencesMessage: 'Réinitialise l\'ordre, thème, widgets, etc. N\'affecte pas vos données.', resetPreferences: 'Réinitialiser', // Modal: Delete group deleteGroupTitle: 'Supprimer le groupe', deleteGroupMessage: 'Les utilisateurs de ce groupe perdront ces permissions.', deleteGroup: 'Supprimer le groupe', // Modal: Disable auth disableAuthenticationTitle: 'Désactiver l\'authentification', disableAuthenticationMessage: 'Instance accessible sans connexion. Les comptes sont conservés.', disableAuthentication: 'Désactiver', // Additional settings configureBambuddy: 'Configurer Bambuddy', systemDefault: 'Défaut système', archiveSettings: 'Réglages Archives', newWindow: 'Nouvelle fenêtre', embeddedOverlay: 'Superposition intégrée', preferredSlicer: 'Slicer préféré', preferredSlicerDescription: 'Application pour ouvrir les fichiers', externalCameras: 'Caméras externes', costTracking: 'Suivi des coûts', printsOnly: 'Impressions uniquement', totalConsumption: 'Consommation totale', dataManagement: 'Gestion des données', clearNotificationLogsDescription: 'Supprimer logs de plus de 30 jours', resetUiPreferencesDescription: 'Réinitialise thèmes et affichage sans toucher aux données.', enableHomeAssistant: 'Activer Home Assistant', enableMqtt: 'Activer MQTT', useTls: 'Utiliser TLS', enableMetricsEndpoint: 'Activer l\'endpoint Metrics', availableMetrics: 'Metrics disponibles', editUser: 'Modifier l\'utilisateur', deleteUserTitle: 'Supprimer l\'utilisateur', groupName: 'Nom du groupe', // Placeholders leaveEmptyForAnonymous: 'Vide pour anonyme', leaveEmptyForNoAuth: 'Vide si pas d\'auth', enterNewPassword: 'Nouveau mot de passe', confirmNewPassword: 'Confirmer nouveau mdp', enterGroupName: 'Entrez le nom du groupe', enterDescriptionOptional: 'Description (optionnel)', enterCurrentPassword: 'Mdp actuel', enterNewPasswordMin6: 'Nouveau mdp (min 6 char)', toast: { keyCopied: 'Clé copiée', copyFailed: 'Échec copie', keyAddedToBrowser: 'Clé ajoutée à l\'explorateur', clearLogsFailed: 'Échec effacement logs', uiPreferencesReset: 'Préférences UI réinitialisées. Rafraîchissement...', authDisabled: 'Authentification désactivée', authDisableFailed: 'Échec désactivation', apiKeyCreated: 'Clé API créée', apiKeyDeleted: 'Clé API supprimée', userCreated: 'Utilisateur créé', userUpdated: 'Utilisateur mis à jour', userDeleted: 'Utilisateur supprimé', groupCreated: 'Groupe créé', groupUpdated: 'Groupe mis à jour', groupDeleted: 'Groupe supprimé', fillRequiredFields: 'Remplissez les champs requis', passwordsDoNotMatch: 'Les mots de passe ne correspondent pas', passwordTooShort: 'Minimum 6 caractères', enterGroupName: 'Entrez un nom de groupe', settingsSaved: 'Paramètres enregistrés', cameraSettingsSaved: 'Réglages caméra enregistrés', enterCameraUrl: 'Entrez une URL caméra', passwordChanged: 'Mot de passe modifié', connectionFailed: 'Échec connexion', testFailed: 'Échec test', cameraConnected: 'Caméra connectée {{resolution}}', }, testConnection: 'Tester la connexion', catalog: { spoolCatalog: 'Catalogue de Bobines', spoolCatalogDescription: 'Poids des bobines vides par marque/type. Utilisé pour le calcul auto du poids restant.', searchCatalog: 'Chercher dans le catalogue...', addNewEntry: 'Nouvelle Entrée', namePlaceholder: 'Nom (ex: Bambu Lab - Plastique)', weight: 'Poids', type: 'Type', default: 'Défaut', custom: 'Perso', noMatch: 'Aucune entrée correspondante', empty: 'Catalogue vide', deleteEntry: 'Supprimer l\'entrée', deleteConfirm: 'Supprimer "{{name}}" ?', resetCatalog: 'Réinitialiser le catalogue', resetConfirm: 'Réinitialiser aux valeurs par défaut ? Vos entrées personnalisées seront supprimées.', loadFailed: 'Échec chargement catalogue', nameWeightRequired: 'Nom et poids requis', entryAdded: 'Entrée ajoutée', addFailed: 'Échec ajout', entryUpdated: 'Entrée mise à jour', updateFailed: 'Échec mise à jour', entryDeleted: 'Entrée supprimée', deleteFailed: 'Échec suppression', resetSuccess: 'Catalogue réinitialisé', resetFailed: 'Échec réinitialisation', exported: '{{count}} entrées exportées', imported: '{{added}} entrées importées ({{skipped}} ignorées)', importFailed: 'Échec import : format JSON invalide', exportTooltip: 'Exporter en JSON', importTooltip: 'Importer depuis JSON', resetTooltip: 'Réinitialiser par défaut', }, colorCatalog: { title: 'Catalogue de Couleurs', description: 'Couleurs de filament par fabricant. Utilisé pour la recherche auto lors de l\'ajout de bobines.', searchColors: 'Chercher couleurs...', allManufacturers: 'Tous les fabricants', addNewColor: 'Nouvelle Couleur', manufacturer: 'Fabricant', colorName: 'Nom couleur', hex: 'Hex', materialOptional: 'Matériau (optionnel)', showing: 'Affichage {{filtered}} sur {{total}} couleurs', noMatch: 'Aucune couleur correspondante', empty: 'Catalogue vide', deleteColor: 'Supprimer couleur', deleteConfirm: 'Supprimer "{{name}}" ?', resetCatalog: 'Réinitialiser catalogue couleurs', resetConfirm: 'Réinitialiser aux valeurs par défaut ?', sync: 'Sync', starting: 'Démarrage...', syncTooltip: 'Sync depuis FilamentColors.xyz (2000+ couleurs, peut être long)', loadFailed: 'Échec chargement catalogue couleurs', fieldsRequired: 'Fabricant, nom et code Hex requis', colorAdded: 'Couleur ajoutée', addFailed: 'Échec ajout', colorUpdated: 'Couleur mise à jour', updateFailed: 'Échec mise à jour', colorDeleted: 'Couleur supprimée', deleteFailed: 'Échec suppression', resetSuccess: 'Catalogue réinitialisé', resetFailed: 'Échec réinitialisation', syncUpToDate: 'Déjà à jour ({{count}} couleurs vérifiées)', syncComplete: '{{added}} couleurs ajoutées ({{skipped}} déjà présentes)', syncError: 'Erreur de sync', syncFailed: 'Échec sync FilamentColors.xyz', exported: '{{count}} couleurs exportées', imported: '{{added}} couleurs importées ({{skipped}} ignorées)', importFailed: 'Échec import : format JSON invalide', }, }, // Notifications (for push notifications) notification: { printStarted: { title: 'Impression démarrée', body: '{{printer}} : {{filename}} commence l\'impression', }, printCompleted: { title: 'Impression terminée', body: '{{printer}} : {{filename}} a réussi', }, printFailed: { title: 'Impression échouée', body: '{{printer}} : {{filename}} a échoué', }, printStopped: { title: 'Impression arrêtée', body: '{{printer}} : {{filename}} a été arrêtée', }, printProgress: { title: 'Progression d\'impression', body: '{{printer}} : {{filename}} est à {{percent}}%', }, printerOffline: { title: 'Imprimante hors ligne', body: '{{printer}} est déconnectée', }, printerError: { title: 'Erreur imprimante', body: '{{printer}} : {{error}}', }, filamentLow: { title: 'Filament bas', body: '{{printer}} : Le filament est presque vide', }, maintenanceDue: { title: 'Maintenance due', body: '{{printer}} : {{items}} demandent votre attention', }, }, // Errors errors: { generic: 'Une erreur est survenue', networkError: 'Erreur réseau. Vérifiez votre connexion.', notFound: 'Non trouvé', unauthorized: 'Non autorisé', serverError: 'Erreur serveur', validationError: 'Vérifiez vos saisies', printerConnectionFailed: 'Échec connexion imprimante', saveFailed: 'Échec enregistrement', deleteFailed: 'Échec suppression', loadFailed: 'Échec chargement', }, // HMS Errors modal hmsErrors: { title: 'Erreurs - {{name}}', noErrors: 'Aucune erreur', viewOnWiki: 'Voir sur le Wiki Bambu Lab', clearInstructions: 'Effacez les erreurs sur l\'imprimante pour les retirer ici.', }, // MQTT Debug modal mqttDebug: { title: 'Journal de débogage MQTT', searchPlaceholder: 'Chercher topic ou message...', noMessages: 'Aucun message enregistré', startLoggingHint: 'Cliquez sur "Démarrer" pour capturer les messages MQTT', noMessagesMatch: 'Aucun message ne correspond', adjustFilterHint: 'Ajustez votre recherche', incoming: 'Entrant', outgoing: 'Sortant', loggingStopped: 'Enregistrement arrêté', loggingActive: 'Enregistrement actif - rafraîchissement auto', startLogging: 'Démarrer', stopLogging: 'Arrêter', clearLog: 'Effacer le journal', topic: 'Topic', timestamp: 'Horodatage', direction: 'Direction', all: 'Tous', }, // Printer File Manager modal (printer internal storage) printerFiles: { title: 'Gestionnaire de fichiers', storageUsed: 'Utilisé :', storageFree: 'Libre :', filterPlaceholder: 'Filtrer les fichiers...', deleteButton: 'Supprimer', deleteFiles: 'Supprimer {{count}} fichiers', deleteFileConfirm: 'Supprimer "{{name}}" ?', deleteFilesConfirm: 'Supprimer les {{count}} fichiers sélectionnés ?', noFiles: 'Aucun fichier sur l\'imprimante', loadingFiles: 'Chargement...', failedToLoad: 'Échec chargement fichiers', toast: { filesDeleted: '{{count}} fichier(s) supprimé(s)', deleteFailed: 'Échec suppression : {{error}}', }, }, // Confirmations confirm: { delete: 'Voulez-vous vraiment supprimer cet élément ?', unsavedChanges: 'Changements non sauvegardés. Voulez-vous quitter ?', clearQueue: 'Voulez-vous vraiment vider la file d\'attente ?', }, // Login page login: { title: 'Connexion Bambuddy', subtitle: 'Connectez-vous à votre compte', username: 'Utilisateur', usernamePlaceholder: 'Entrez votre utilisateur', usernameOrEmail: 'Utilisateur ou Email', usernameOrEmailPlaceholder: 'Utilisateur ou @ Email', password: 'Mot de passe', passwordPlaceholder: 'Entrez votre mot de passe', signIn: 'Se connecter', signingIn: 'Connexion...', forgotPassword: 'Mot de passe oublié ?', loginSuccess: 'Connecté avec succès', loginFailed: 'Échec de connexion', enterCredentials: 'Entrez vos identifiants', forgotPasswordTitle: 'Mot de passe oublié', forgotPasswordMessage: "Contactez votre administrateur pour réinitialiser votre accès.", forgotPasswordEmailMessage: "Entrez votre email pour recevoir un nouveau mot de passe.", emailAddress: 'Adresse Email', emailPlaceholder: 'votre.email@exemple.com', cancel: 'Annuler', sending: 'Envoi...', sendResetEmail: 'Envoyer l\'email', howToReset: 'Comment réinitialiser :', resetStep1: 'Contactez votre admin Bambuddy', resetStep2: 'Demandez une réinitialisation dans la Gestion Utilisateurs', resetStep3: 'Il vous donnera un mot de passe temporaire', resetStep4: 'Connectez-vous et changez-le dans les Paramètres', gotIt: 'Compris', }, // Setup page setup: { title: 'Configuration Bambuddy', subtitle: 'Configurez l\'authentification', enableAuth: 'Activer l\'authentification', adminAccount: 'Compte Admin', adminAccountDesc: 'Si des admins existent, ils seront utilisés. Sinon, créez-en un ci-dessous.', adminUsername: 'Utilisateur Admin', adminPassword: 'Mot de passe Admin', optionalIfAdminExists: '(optionnel si admin existe)', adminUsernamePlaceholder: 'Nom admin (optionnel)', adminPasswordPlaceholder: 'Mdp admin (optionnel)', confirmPassword: 'Confirmer mdp', confirmPasswordPlaceholder: 'Confirmez mdp admin', settingUp: 'Configuration...', completeSetup: 'Terminer la configuration', toast: { authEnabledAdminCreated: 'Authentification activée et admin créé', authEnabledExistingAdmins: 'Authentification activée avec admins existants', setupCompleted: 'Configuration terminée', enterBothCredentials: 'Entrez les deux ou laissez vide pour utiliser les admins existants', passwordsDoNotMatch: 'Les mots de passe ne correspondent pas', passwordTooShort: 'Minimum 6 caractères', }, }, // Password change changePassword: { title: 'Changer le mot de passe', currentPassword: 'Mot de passe actuel', currentPasswordPlaceholder: 'Entrez mdp actuel', newPassword: 'Nouveau mot de passe', newPasswordPlaceholder: 'Nouveau mdp (min 6 char)', confirmPassword: 'Confirmer nouveau mdp', confirmPasswordPlaceholder: 'Confirmez nouveau mdp', passwordsDoNotMatch: 'Les mots de passe ne correspondent pas', passwordTooShort: 'Minimum 6 caractères', changing: 'Changement...', success: 'Mot de passe modifié', failed: 'Échec modification', }, // Plate detection alert plateAlert: { title: 'Impression en Pause !', message: 'Objets détectés sur le plateau. L\'impression a été suspendue automatiquement. Videz le plateau avant de reprendre.', understand: 'J\'ai compris', }, // Camera page camera: { title: 'Vue Caméra', invalidPrinterId: 'ID imprimante invalide', live: 'Direct', snapshot: 'Instantané', restartStream: 'Redémarrer le flux', refreshSnapshot: 'Rafraîchir l\'image', fullscreen: 'Plein écran', exitFullscreen: 'Quitter plein écran', connectingToCamera: 'Connexion caméra...', capturingSnapshot: 'Capture...', connectionLost: 'Connexion perdue', connectionFailed: 'Échec connexion caméra', reconnecting: 'Reconnexion dans {{countdown}}s... (essai {{attempt}}/{{max}})', reconnectNow: 'Reconnexion immédiate', cameraUnavailable: 'Caméra indisponible', cameraUnavailableDesc: 'Vérifiez que l\'imprimante est allumée.', noCamera: 'Aucune caméra disponible', retry: 'Réessayer', cameraStream: 'Flux caméra', zoomOut: 'Zoom arrière', zoomIn: 'Zoom avant', resetZoom: 'Réinitialiser zoom', recording: 'Enregistrement', startRecording: 'Démarrer l\'enregistrement', stopRecording: 'Arrêter l\'enregistrement', chamberLight: 'Basculer lumière chambre', }, // Groups management groups: { title: 'Gestion des Groupes', subtitle: 'Gérez les permissions pour le contrôle d\'accès', backToSettings: 'Retour aux paramètres', createGroup: 'Créer un groupe', noPermission: 'Accès refusé.', system: 'Système', noDescription: 'Pas de description', usersCount: '{{count}} utilisateurs', permissionsCount: '{{count}} permissions', edit: 'Modifier', delete: 'Supprimer', toast: { created: 'Groupe créé', updated: 'Groupe mis à jour', deleted: 'Groupe supprimé', enterGroupName: 'Entrez un nom de groupe', }, modal: { editGroup: 'Modifier le groupe', createGroup: 'Créer un groupe', cancel: 'Annuler', saving: 'Enregistrement...', creating: 'Création...', saveChanges: 'Enregistrer', }, form: { groupName: 'Nom du groupe', groupNamePlaceholder: 'Nom du groupe', systemGroupWarning: 'Les groupes système sont fixes', description: 'Description', descriptionPlaceholder: 'Description (optionnel)', permissions: 'Permissions ({{count}} sélectionnées)', }, deleteModal: { title: 'Supprimer le groupe', message: 'Les utilisateurs de ce groupe perdront ces permissions.', confirm: 'Supprimer', }, }, // Users management users: { title: 'Gestion des Utilisateurs', subtitle: 'Gérez les accès à Bambuddy', backToSettings: 'Retour aux paramètres', createUser: 'Créer un utilisateur', noPermission: 'Accès refusé.', admin: 'Admin', noGroups: 'Aucun groupe', active: 'Actif', inactive: 'Inactif', edit: 'Modifier', delete: 'Supprimer', system: 'Système', noGroupsAvailable: 'Aucun groupe disponible', table: { username: 'Utilisateur', groups: 'Groupes', status: 'Statut', actions: 'Actions', }, toast: { created: 'Utilisateur créé', updated: 'Utilisateur mis à jour', deleted: 'Utilisateur supprimé', fillRequired: 'Remplissez les champs requis', passwordsDoNotMatch: 'Les mots de passe ne correspondent pas', passwordTooShort: 'Minimum 6 caractères', }, modal: { createUser: 'Créer utilisateur', editUser: 'Modifier utilisateur', cancel: 'Annuler', creating: 'Création...', saving: 'Enregistrement...', saveChanges: 'Enregistrer', advancedAuthSubtitle: 'avec Authentification Avancée', }, form: { username: 'Utilisateur', usernamePlaceholder: 'Nom utilisateur', email: 'Email', emailPlaceholder: 'utilisateur@exemple.com', password: 'Mot de passe', passwordPlaceholder: 'Mot de passe', confirmPassword: 'Confirmer mdp', confirmPasswordPlaceholder: 'Confirmez mdp', newPasswordPlaceholder: 'Nouveau mdp', confirmNewPasswordPlaceholder: 'Confirmez nouveau mdp', leaveBlankToKeep: 'Laissez vide pour conserver l\'actuel', groups: 'Groupes', optional: 'optionnel', autoGeneratedPassword: 'Un mot de passe sera généré et envoyé par email.', passwordManagedByAdvancedAuth: 'Géré par Auth Avancée. Utilisez "Réinitialiser" pour envoyer un nouveau mdp par email.', resetPassword: 'Réinitialiser le mot de passe', resettingPassword: 'Réinitialisation...', }, deleteModal: { title: 'Supprimer utilisateur', message: 'Cette action est irréversible.', confirm: 'Supprimer', }, }, // Stream overlay streamOverlay: { title: 'Superposition Flux', invalidPrinterId: 'ID invalide', cameraStream: 'Flux caméra', progress: 'Progression', eta: 'Fin estimée', tomorrow: 'Demain', printerIdle: 'Imprimante inactive', printerOffline: 'Imprimante hors ligne', status: { printing: 'Impression', paused: 'En pause', finished: 'Terminée', failed: 'Échouée', idle: 'Inactive', unknown: 'Inconnue', }, }, // Profiles profiles: { title: 'Profils', subtitle: 'Gérez vos presets slicer et calibrations Pressure Advance', tabs: { cloud: 'Profils Cloud', local: 'Profils Locaux', kprofiles: 'K-Profiles', }, localProfiles: { title: 'Profils Locaux', subtitle: 'Gérez vos presets OrcaSlicer', import: 'Importer Profils', importDesc: 'Déposez les fichiers .bbscfg, .bbsflmt, .orca_filament, .zip ou .json', importing: 'Importation...', search: 'Chercher un preset...', noPresets: 'Aucun preset local', badge: 'Local', edit: 'Modifier', delete: 'Supprimer', cancel: 'Annuler', deleteConfirmTitle: 'Supprimer Preset', deleteConfirm: 'Supprimer définitivement ce preset ?', source: 'Source', inheritsFrom: 'Hérite de', filamentType: 'Type', vendor: 'Vendeur', compatiblePrinters: 'Imprimantes', nozzleTemp: 'Temp Buse', cost: 'Coût', density: 'Densité', pressureAdvance: 'Pressure Advance', filament: 'Filament', process: 'Processus', printer: 'Imprimante', toast: { importSuccess: '{{count}} profil(s) importé(s)', importSkipped: '{{count}} profil(s) ignoré(s) (doublons)', importError: '{{count}} erreur(s) d\'import', deleted: 'Preset supprimé', updated: 'Preset mis à jour', }, }, connectedAs: 'Connecté en tant que', logout: 'Déconnexion', noLogoutPermission: 'Pas d\'autorisation de déconnexion', failedToLoad: 'Échec chargement profils', retry: 'Réessayer', time: { justNow: 'À l\'instant', minsAgo: 'Il y a {{count}}m', hoursAgo: 'Il y a {{count}}h', daysAgo: 'Il y a {{count}}j', }, toast: { loggedOut: 'Déconnecté', }, login: { title: 'Connexion Bambu Cloud', subtitle: 'Synchronisez vos presets slicer', email: 'Email', password: 'Mot de passe', region: 'Région', regionGlobal: 'Global', regionChina: 'Chine', verificationCode: 'Code de vérification', totpCode: 'Code Authenticator', checkEmail: 'Code envoyé à {{email}}', enterTotpHint: 'Entrez le code 2FA', accessToken: 'Jeton d\'accès (Access Token)', accessTokenHint: 'Collez le jeton (depuis Bambu Studio)', back: 'Retour', loginButton: 'Connexion', verifyButton: 'Vérifier', setTokenButton: 'Définir Jeton', useToken: 'Utiliser jeton d\'accès', useEmail: 'Connexion par email', toast: { loggedIn: 'Connecté avec succès', codeSent: 'Code envoyé par email', enterTotp: 'Entrez le code Authenticator', tokenSet: 'Jeton défini', }, }, presets: { myPreset: 'Mon preset (modifiable)', duplicate: 'Dupliquer', editable: 'Modifiable', failedToLoadDetails: 'Échec détails preset', deleteConfirm: 'Supprimer ce preset ?', deleteWarning: 'Ceci supprimera "{{name}}" de Bambu Cloud définitivement.', noDuplicatePermission: 'Pas d\'autorisation duplication', noEditPermission: 'Pas d\'autorisation modification', noDeletePermission: 'Pas d\'autorisation suppression', types: { filament: 'Preset filament', printer: 'Preset imprimante', process: 'Preset processus', }, toast: { deleted: 'Preset supprimé', created: 'Preset créé', updated: 'Preset mis à jour', duplicated: 'Preset dupliqué', fieldAdded: 'Champ "{{key}}" ajouté', exported: 'Preset exporté', }, baseLabel: 'Base : {{name}}', currentLabel: 'Actuel : {{name}}', newPreset: 'Nouveau Preset', editPreset: 'Modifier Preset', duplicatePreset: 'Dupliquer Preset', createNewPreset: 'Créer un nouveau Preset', customizeSettings: 'Personnalisez vos réglages', compareWithBase: 'Comparer avec la base', compare: 'Comparer', // CreatePresetModal - Basic Info basePreset: 'Preset de base', selectBasePreset: 'Choisir preset de base...', presetName: 'Nom du preset', myCustomPreset: 'Mon preset personnalisé', inheritsFrom: 'Hérite de', dropJsonToImport: 'Glissez JSON pour importer', // CreatePresetModal - Tabs tabs: { common: 'Commun', allFields: 'Tous les champs', }, // CreatePresetModal - All Fields Tab availableFields: 'Champs disponibles', searchFieldsPlaceholder: 'Chercher un champ...', noMatchingFields: 'Aucun champ trouvé', allFieldsAdded: 'Tous les champs sont ajoutés', addCustomField: 'Ajouter un champ personnalisé', yourOverrides: 'Vos modifications', noOverridesYet: 'Aucune modification', clickFieldsToAdd: 'Cliquez à gauche pour ajouter', saveAsTemplate: 'Enregistrer comme modèle', jsonTip: 'Conseil : Glissez un .json pour importer les réglages', }, cloudView: { searchPlaceholder: 'Chercher presets...', templates: 'Modèles', refresh: 'Rafraîchir', newPreset: 'Nouveau Preset', clearFilters: 'Effacer filtres', // Compare mode compareMode: 'Mode Comparaison', selectAnotherPreset: 'Choisir un autre preset {{type}}', clickTwoPresets: 'Choisissez deux presets de même type', selectFirst: '1. Sélectionner premier', selectSecond: '2. Sélectionner second', compareNow: 'Comparer maintenant', // Status row lastSynced: 'Synchronisé :', showingCount: '{{showing}} sur {{total}} presets', noPresetsFound: 'Aucun preset trouvé', // Column headers columns: { filament: 'Filament', process: 'Processus', printer: 'Imprimante', }, noFilamentPresets: 'Pas de preset filament', noProcessPresets: 'Pas de preset processus', noPrinterPresets: 'Pas de preset imprimante', // Filters filters: { type: 'Type', owner: 'Propriétaire', printer: 'Imprimante', nozzle: 'Buse', filament: 'Filament', layer: 'Couche', all: 'Tous', myPresets: 'Mes Presets', builtIn: 'Inclus', process: 'Processus', }, // Permissions noTemplatesPermission: 'Pas d\'autorisation modèles', noRefreshPermission: 'Pas d\'autorisation rafraîchissement', noCreatePermission: 'Pas d\'autorisation création', }, templates: { title: 'Modèles rapides', noTemplates: 'Aucun modèle', createFirst: 'Créez-en depuis l\'éditeur de preset', typeFilter: 'Type :', deleteTitle: 'Supprimer modèle', deleteWarning: 'Action irréversible', deleteConfirm: 'Supprimer "{{name}}" ?', namePlaceholder: 'Nom du modèle', descriptionPlaceholder: 'Description', settingsJson: 'Paramètres (JSON)', fieldsCount: '{{count}} champs', shownInModals: 'Visible dans fenêtres', hiddenInModals: 'Masqué dans fenêtres', apply: 'Appliquer', toast: { deleted: 'Modèle supprimé', updated: 'Modèle mis à jour', created: 'Modèle créé', applied: 'Modèle appliqué', }, }, }, // Support/Debug support: { debugLoggingActive: 'Débogage actif', manageLogs: 'Gérer', collectItem7: 'Connectivité et versions firmware', collectItem8: 'Statut intégrations (Spoolman, MQTT, HA)', collectItem9: 'Interfaces réseau (sous-réseaux)', collectItem10: 'Versions packages Python', collectItem11: 'Santé base de données', collectItem12: 'Détails environnement Docker', }, // File manager fileManager: { title: 'Gestionnaire de fichiers', subtitle: 'Organisez vos fichiers d\'impression', uploadFiles: 'Téléverser fichiers', newFolder: 'Nouveau dossier', folderName: 'Nom du dossier', folderNamePlaceholder: 'ex: Pièces Utiles', renameFile: 'Renommer fichier', renameFolder: 'Renommer dossier', moveFiles: 'Déplacer {{count}} fichier(s)', rootNoFolder: 'Racine (aucun dossier)', current: 'actuel', linkFolder: 'Lier le dossier', linkFolderDescription: 'Lier "{{name}}" à un projet ou archive.', project: 'Projet', archive: 'Archive', noProjectsFound: 'Aucun projet trouvé', noArchivesFound: 'Aucune archive trouvée', unlink: 'Délier', link: 'Lier', dragDropFiles: 'Glissez les fichiers ici', dropFilesHere: 'Déposez ici', orClickToBrowse: 'ou cliquez pour parcourir', allFileTypesSupported: 'Tous types supportés. ZIP extraits.', zipFilesDetected: 'ZIP détectés', zipExtractOptions: 'Choix de structure pour ZIP :', preserveZipStructure: 'Garder structure ZIP', createFolderFromZip: 'Dossier par nom du ZIP', stlThumbnailGeneration: 'Vignettes STL', zipMayContainStl: 'Extraction vignettes possible pour STL.', thumbnailsCanBeGenerated: 'Génération vignettes (peut être long).', generateThumbnailsForStl: 'Générer vignettes STL', threemfDetected: 'Fichiers 3MF détectés', threemfExtractionInfo: 'Réglages extraits auto du 3MF.', willBeExtracted: 'Sera extrait', filesExtracted: '{{count}} fichiers extraits', uploadComplete: 'Terminé : {{succeeded}} succès', uploadFailed: '{{count}} échecs', uploading: 'Téléversement...', changeLink: 'Modifier lien...', linkTo: 'Lier à...', linkToProjectOrArchive: 'Lier à projet ou archive', addToQueue: 'Ajouter à la file', schedulePrint: 'Planifier', generateThumbnail: 'Générer vignette', generateThumbnails: 'Générer vignettes', generateThumbnailsForMissing: 'Vignettes STL manquantes', gridView: 'Grille', listView: 'Liste', lowDiskSpaceWarning: 'Espace disque faible', lowDiskSpaceDetails: '{{free}} libre sur {{total}}. Seuil : {{threshold}} Go.', files: 'Fichiers', folders: 'Dossiers', size: 'Taille', free: 'Libre', allFiles: 'Tous les fichiers', wrap: 'Retour ligne', enableTextWrapping: 'Activer retour ligne', disableTextWrapping: 'Désactiver retour ligne', dragToResizeTooltip: 'Glisser pour redimensionner, double-clic reset', searchFiles: 'Chercher fichiers...', allTypes: 'Tous types', prints: 'Impressions', ascending: 'Croissant', descending: 'Décroissant', resultsCount: '{{showing}} sur {{total}} fichiers', selectAll: 'Tout sélectionner', deselectAll: 'Tout désélectionner', selected: '{{count}} sélectionnés', adding: 'Ajout...', loadingFiles: 'Chargement...', folderIsEmpty: 'Dossier vide', noFilesYet: 'Aucun fichier', folderEmptyDescription: 'Téléversez ou déplacez des fichiers ici.', noFilesDescription: 'Téléversez des fichiers pour organiser.', noMatchingFiles: 'Aucun fichier correspondant', noMatchingFilesDescription: 'Ajustez votre recherche.', clearFilters: 'Effacer filtres', printedCount: 'Imprimé {{count}}x', uploadedBy: 'Téléversé par', deleteFolder: 'Supprimer dossier', deleteFile: 'Supprimer fichier', deleteFilesCount: 'Supprimer {{count}} fichiers', deleteFolderConfirm: 'Supprimer le dossier et son contenu ?', deleteFileConfirm: 'Supprimer ce fichier ?', deleteFilesConfirm: 'Supprimer {{count}} fichiers définitivement ?', deleting: 'Suppression...', noPermissionRenameFolder: 'Pas d\'autorisation renommage', noPermissionLinkFolder: 'Pas d\'autorisation lien', noPermissionDeleteFolder: 'Pas d\'autorisation suppression dossier', noPermissionPrint: 'Pas d\'autorisation impression', noPermissionAddToQueue: 'Pas d\'autorisation file', noPermissionDownload: 'Pas d\'autorisation téléchargement', noPermissionRenameFile: 'Pas d\'autorisation renommage fichier', noPermissionGenerateThumbnail: 'Pas d\'autorisation vignettes', noPermissionDeleteFile: 'Pas d\'autorisation suppression fichier', noPermissionCreateFolder: 'Pas d\'autorisation nouveau dossier', noPermissionUpload: 'Pas d\'autorisation téléversement', noPermissionMoveFiles: 'Pas d\'autorisation déplacement', noPermissionDeleteFiles: 'Pas d\'autorisation suppression groupée', toast: { folderCreated: 'Dossier créé', folderDeleted: 'Dossier supprimé', fileDeleted: 'Fichier supprimé', filesDeleted: '{{count}} fichiers supprimés', filesMoved: 'Fichiers déplacés', folderLinked: 'Dossier lié', folderUnlinked: 'Dossier délié', addedToQueue: '{{count}} fichier(s) ajouté(s)', addedToQueuePartial: '{{added}} ajoutés, {{failed}} échecs', failedToAddToQueue: 'Échec ajout file : {{error}}', fileRenamed: 'Fichier renommé', folderRenamed: 'Dossier renommé', thumbnailsGenerated: '{{count}} vignette(s) générée(s)', thumbnailsGeneratedPartial: '{{succeeded}} succès, {{failed}} échecs', noStlMissingThumbnails: 'Aucun STL sans vignette', failedToGenerateThumbnails: 'Échec vignettes : {{error}}', thumbnailGenerated: 'Vignette générée', failedToGenerateThumbnail: 'Échec vignette : {{error}}', }, }, // Projects projects: { title: 'Projets', subtitle: 'Suivez vos projets d\'impression 3D', newProject: 'Nouveau Projet', editProject: 'Modifier Projet', deleteProject: 'Supprimer Projet', projectName: 'Nom du Projet', description: 'Description', noProjects: 'Aucun projet', noProjectsFiltered: 'Aucun projet {{status}}', noProjectsFilteredHelp: 'Les projets apparaîtront ici quand leur statut changera.', createFirst: 'Créez votre premier projet pour organiser vos builds.', createFirstButton: 'Créer votre premier projet', create: 'Créer', files: 'Fichiers', prints: 'Impressions', plates: 'plateaux', parts: 'pièces', lastModified: 'Modifié le', deleteConfirm: 'Supprimer ce projet ? Les archives seront déliées mais conservées.', addFiles: 'Ajouter fichiers', removeFile: 'Retirer fichier', viewDetails: 'Détails', // Modal fields namePlaceholder: 'ex: Build Voron 2.4', descriptionPlaceholder: 'Description optionnelle...', color: 'Couleur', targetPlates: 'Plateaux cibles', targetPlatesPlaceholder: 'ex: 25', targetPlatesHelp: 'Nombre total de jobs', targetParts: 'Pièces cibles', targetPartsPlaceholder: 'ex: 150', targetPartsHelp: 'Nombre total d\'objets', tagsLabel: 'Tags (séparés par virgules)', tagsPlaceholder: 'ex: voron, cadeau', dueDate: 'Échéance', priority: 'Priorité', priorityLow: 'Basse', priorityNormal: 'Normale', priorityHigh: 'Haute', priorityUrgent: 'Urgente', // Status statusActive: 'Actif', statusCompleted: 'Terminé', statusArchived: 'Archivé', done: 'Fait', completed: 'terminé', failed: 'échoué', inQueue: 'en file', noPrintsYet: 'Aucune impression', // Footer stats printJobs: 'Jobs (plateaux)', partsPrinted: 'Pièces imprimées', failedParts: 'Pièces échouées', // Actions import: 'Importer', export: 'Exporter', importProject: 'Importer projet', exportAll: 'Exporter tous les projets', loading: 'Chargement des projets...', // Permissions noEditPermission: 'Pas d\'autorisation de modification', noDeletePermission: 'Pas d\'autorisation de suppression', noCreatePermission: 'Pas d\'autorisation de création', noImportPermission: 'Pas d\'autorisation d\'import', noExportPermission: 'Pas d\'autorisation d\'export', // Toast toast: { created: 'Projet créé', updated: 'Projet mis à jour', deleted: 'Projet supprimé', imported: 'Projet importé', multipleImported: '{{count}} projets importés', importFailed: 'Échec d\'import', exported: 'Projets exportés (métadonnées)', }, }, // Project detail page projectDetail: { notFound: 'Projet non trouvé', backToProjects: 'Retour aux Projets', export: 'Exporter', exportProject: 'Exporter projet', noExportPermission: 'Pas d\'autorisation export', noEditPermission: 'Pas d\'autorisation modification', partOf: 'Fait partie de :', priorityLabel: 'Priorité :', noPrints: 'Aucune impression dans ce projet', status: { active: 'Actif', completed: 'Terminé', archived: 'Archivé', }, priority: { low: 'Basse', normal: 'Normale', high: 'Haute', urgent: 'Urgente', }, dueDate: { overdue: 'En retard', today: 'Aujourd\'hui', daysLeft: '{{count}} jours restants', }, progress: { platesProgress: 'Progression Plateaux', partsProgress: 'Progression Pièces', printJobs: 'jobs d\'impression', parts: 'pièces', percentComplete: '{{percent}}% terminé', remaining: '{{count}} restant(s)', }, stats: { printJobs: 'Jobs d\'Impression', total: 'total', failed: '{{count}} échecs', partsPrinted: '{{count}} pièces imprimées', printTime: 'Temps d\'Impression', filamentUsed: 'Filament utilisé', }, cost: { title: 'Suivi des coûts', filamentCost: 'Coût Filament', energy: 'Énergie', budget: 'Budget', remaining: 'Restant', }, subProjects: { title: 'Sous-projets ({{count}})', }, notes: { title: 'Notes', noEditPermission: 'Pas d\'autorisation modification', placeholder: 'Ajouter des notes...', empty: 'Aucune note. Cliquez sur modifier.', }, files: { title: 'Fichiers', linkFolders: 'Liez des dossiers depuis le gestionnaire', forQuickAccess: 'pour un accès rapide.', fileCount: '{{count}} fichier(s)', empty: 'Aucun dossier lié.', }, bom: { title: 'BOM (Liste matériel)', acquired: '{{completed}}/{{total}} acquis', showAll: 'Tout afficher', hideDone: 'Masquer acquis', addPart: 'Ajouter matériel', noAddPermission: 'Pas d\'autorisation ajout', partNamePlaceholder: 'Nom (ex: Vis M3x8)', partName: 'Nom de pièce', qty: 'Qté', price: 'Prix ({{currency}})', sourcingUrlPlaceholder: 'Lien d\'achat (optionnel)', remarksPlaceholder: 'Remarques (optionnel)', deletePart: 'Supprimer pièce', deleteConfirm: 'Supprimer "{{name}}" ?', noUpdatePermission: 'Pas d\'autorisation mise à jour', noEditPermission: 'Pas d\'autorisation modification', noDeletePermission: 'Pas d\'autorisation suppression', totalCost: 'Coût total :', empty: 'BOM vide. Ajoutez du matériel ou de l\'électronique.', }, timeline: { title: 'Historique d\'activité', empty: 'Aucune activité.', }, template: { saveAsTemplate: 'Enregistrer comme modèle', noCreatePermission: 'Pas d\'autorisation modèle', }, queue: { title: 'File d\'attente', viewAll: 'Tout voir', printing: '{{count}} en cours', queued: '{{count}} en file', }, prints: { title: 'Impressions ({{count}})', }, toast: { projectUpdated: 'Projet mis à jour', partAdded: 'Pièce ajoutée', partRemoved: 'Pièce retirée', exportFailed: 'Échec export', projectExported: 'Projet exporté', templateCreated: 'Modèle créé', }, }, // System info system: { title: 'Informations Système', version: 'Version', uptime: 'Temps de fonctionnement', cpuUsage: 'Utilisation CPU', memoryUsage: 'Utilisation RAM', diskUsage: 'Utilisation Disque', networkInfo: 'Infos Réseau', logs: 'Journaux', debugMode: 'Mode Débogage', enableDebug: 'Activer débogage', disableDebug: 'Désactiver débogage', downloadLogs: 'Télécharger logs', clearLogs: 'Effacer logs', dockerInfo: 'Infos Docker', containerName: 'Nom conteneur', imageName: 'Nom image', platform: 'Plateforme', architecture: 'Architecture', }, // Library (K Profiles) library: { title: 'Bibliothèque Filament', addFilament: 'Ajouter Filament', editFilament: 'Modifier Filament', deleteFilament: 'Supprimer Filament', vendor: 'Vendeur', material: 'Matériau', color: 'Couleur', kFactor: 'Facteur K', temperature: 'Température', noFilaments: 'Bibliothèque vide', deleteConfirm: 'Supprimer ce filament ?', importFromPrinter: 'Importer de l\'imprimante', exportToFile: 'Exporter vers fichier', }, // Spoolman spoolman: { title: 'Intégration Spoolman', enabled: 'Spoolman Activé', url: 'URL Spoolman', connected: 'Connecté', disconnected: 'Non Connecté', testConnection: 'Tester connexion', sync: 'Synchroniser', syncing: 'Sync...', lastSync: 'Dernière Sync', linkToSpoolman: 'Lier à Spoolman', openInSpoolman: 'Ouvrir Spoolman', unlinkSpool: 'Délier bobine', selectSpool: 'Choisir bobine', noUnlinkedSpools: 'Pas de bobine libre', linkSuccess: 'Lien réussi', linkFailed: 'Échec lien', spoolId: 'ID Bobine', fillSourceLabel: '(Spoolman)', weight: 'Poids', remaining: 'Restant', disableWeightSync: 'Désactiver Sync poids estimé AMS', disableWeightSyncDesc: 'Ne pas utiliser les estimations AMS. Utile si vous préférez le suivi Spoolman.', reportPartialUsage: 'Rapporter consommation partielle pour échecs', reportPartialUsageDesc: 'Si l\'impression échoue, rapporte le filament consommé selon les couches.', }, // Inventory inventory: { title: 'Inventaire de Bobines', addSpool: 'Ajouter Bobine', editSpool: 'Modifier Bobine', material: 'Matériau', selectMaterial: 'Choisir matériau...', subtype: 'Sous-type', brand: 'Marque', searchBrand: 'Chercher marque...', useCustomBrand: 'Utiliser "{{brand}}"', colorName: 'Nom de couleur', colorNamePlaceholder: 'Jade White, Fire Red...', color: 'Couleur', hexColor: 'Code Hex', pickColor: 'Choisir couleur perso', labelWeight: 'Poids net', coreWeight: 'Poids bobine vide', searchSpoolWeight: 'Chercher poids bobine...', weightUsed: 'Consommé', currentWeight: 'Poids restant', measuredWeight: 'Poids mesuré', measuredWeightError: 'Le poids mesuré doit être entre {{min}}g et {{max}}g.', slicerFilament: 'Filament Slicer', slicerFilamentName: 'Nom du Preset Slicer', slicerPreset: 'Preset Slicer', searchPresets: 'Chercher presets...', selectedPreset: 'Sélectionné', noPresetsFound: 'Aucun preset trouvé', tempOverrides: 'Exceptions Température', note: 'Note', notePlaceholder: 'Notes additionnelles sur cette bobine...', archive: 'Archiver', restore: 'Restaurer', noSpools: 'Aucune bobine. Ajoutez votre première bobine pour commencer.', noManualSpools: 'Aucune bobine manuelle disponible. Ajoutez-en une d\'abord.', kProfiles: 'K-Profiles', addKProfile: 'Ajouter K-Profile', assignSpool: 'Assigner Bobine', unassignSpool: 'Désassigner', assignSuccess: 'Bobine assignée et slot AMS configuré', assignFailed: 'Échec assignation', assignMismatchTitle: 'Matériau non correspondant', assignMismatchMessage: 'Le matériau de la bobine sélectionnée ({{spoolMaterial}}) ne correspond pas au profil AMS ({{trayMaterial}}) pour {{location}}. Assigner quand même ?', assignMismatchConfirm: 'Assigner quand même', selectSpool: 'Choisir une bobine pour ce slot', assigned: 'Assigné', assigning: 'Assignation...', searchSpools: 'Chercher bobines...', allMaterials: 'Tous Matériaux', filterByBrand: 'Filtrer par marque...', showArchived: 'Afficher archivées', spoolCreated: 'Bobine créée', spoolUpdated: 'Bobine mise à jour', spoolDeleted: 'Bobine supprimée', spoolArchived: 'Bobine archivée', spoolRestored: 'Bobine restaurée', deleteConfirm: 'Supprimer définitivement cette bobine ?', advancedSettings: 'Paramètres Avancés', // Tabs filamentInfoTab: 'Infos Filament', paProfileTab: 'Profil PA', filamentInfo: 'Filament', additional: 'Additionnel', // Cloud loadingPresets: 'Chargement des presets cloud...', cloudConnected: 'Cloud connecté', cloudNotConnected: 'Cloud déconnecté (valeurs par défaut)', // Colors recentColors: 'Récentes', searchColors: 'Chercher couleurs...', searchResults: 'Résultats', allColors: 'Toutes', commonColors: 'Communes', showLess: 'Moins', showAll: 'Toutes', noColorsFound: 'Aucune couleur correspondante', noResults: 'Aucun résultat', // PA Profiles selectMaterialFirst: 'Veuillez choisir un matériau dans l\'onglet Infos Filament.', noPrintersConfigured: 'Ajoutez une imprimante pour utiliser les profils PA.', matchingFilter: 'Correspondant', anyBrand: 'Toute marque', anyVariant: 'Toute variante', autoSelect: 'Auto-sélection', matches: 'correspondances', match: 'correspondance', noMatches: 'Aucune correspondance', connected: 'Connecté', offline: 'Hors ligne', printerOffline: 'Imprimante hors ligne. Connectez-vous pour voir les profils.', noKProfilesMatch: 'Aucun profil K ne correspond au filament.', leftNozzle: 'Buse Gauche', rightNozzle: 'Buse Droite', profilesSelected: 'profil(s) de calibration sélectionné(s)', // Stats & enhanced table totalInventory: 'Total Inventaire', totalConsumed: 'Total Consommé', byMaterial: 'Par Matériau', inPrinter: 'Dans Imprimante', lowStock: 'Stock Bas', sinceTracking: 'Depuis le début du suivi', loadedInAms: 'Chargé dans AMS/Ext', remaining: 'Restant', lowStockThreshold: '<20% restant', search: 'Chercher bobines...', showing: 'Affichage', to: 'à', of: 'sur', show: 'Voir', spools: 'bobines', spool: 'bobine', page: 'Page', noSpoolsMatch: 'Aucun résultat trouvé', noSpoolsMatchDesc: 'Ajustez votre recherche ou vos filtres.', active: 'Actif', archived: 'Archivé', all: 'Tous', used: 'Occasion', new: 'Neuf', clearFilters: 'Effacer filtres', table: 'Tableau', cards: 'Cartes', net: 'Net', // Column config columns: 'Colonnes', configureColumns: 'Configurer Colonnes', configureColumnsDesc: 'Glissez pour ordonner ou utilisez les flèches. Cliquez sur l\'œil pour masquer.', visible: 'visible', reset: 'Reset', cancel: 'Annuler', applyChanges: 'Appliquer', moveUp: 'Monter', moveDown: 'Descendre', hideColumn: 'Masquer', showColumn: 'Afficher', // Tag linking linkToSpool: 'Lier à une Bobine', tagLinked: 'Tag lié à la bobine', tagLinkFailed: 'Échec lien tag', tagAlreadyLinked: 'Tag déjà lié à une autre bobine', unknownTag: 'Tag RFID inconnu détecté', // Usage history usageHistory: 'Historique de Consommation', noUsageHistory: 'Aucune consommation enregistrée', printName: 'Nom Impression', weightConsumed: 'Poids consommé', clearHistory: 'Effacer', historyCleared: 'Historique effacé', fillSourceLabel: '(Inv)', }, // Timelapse timelapse: { title: 'Timelapse', create: 'Créer Timelapse', download: 'Télécharger', delete: 'Supprimer', preview: 'Aperçu', frameRate: 'Images/sec', quality: 'Qualité', processing: 'Traitement...', noTimelapses: 'Aucun timelapse', }, // AMS ams: { title: 'AMS', slot: 'Slot', empty: 'Vide', emptySlot: 'Slot vide', unknown: 'Inconnu', humidity: 'Humidité', temperature: 'Température', filamentType: 'Type filament', filamentColor: 'Couleur', remaining: 'Restant', history: 'Historique AMS', noHistory: 'Aucun historique', configureSlot: 'Configurer Slot', externalSpool: 'Bobine externe', profile: 'Profil', kFactor: 'Facteur K', fill: 'Remplir', configure: 'Configurer', }, // Print modal printModal: { title: 'Lancer l\'impression', selectPrinter: 'Choisir l\'imprimante', selectPlate: 'Choisir le plateau', filamentMapping: 'Mapping Filament', printSettings: 'Réglages d\'impression', bedLeveling: 'Nivellement plateau', flowCalibration: 'Calibration débit', vibrationCalibration: 'Vibration (Input Shaper)', layerInspection: 'Inspection 1ère couche', timelapse: 'Timelapse', startPrint: 'Démarrer', addToQueue: 'Ajouter à la file', cancel: 'Annuler', noPrintersAvailable: 'Aucune imprimante disponible', printerBusy: 'L\'imprimante est occupée', printerOffline: 'L\'imprimante est hors ligne', sameTypeDifferentColor: 'Même type, couleur différente', filamentTypeNotLoaded: 'Type de filament non chargé', openCalendar: 'Ouvrir calendrier', leftNozzle: 'G', rightNozzle: 'D', leftNozzleTooltip: 'Buse gauche', rightNozzleTooltip: 'Buse droite', insufficientFilamentTitle: 'Not enough filament', insufficientFilamentMessage: 'Some assigned spools have less filament remaining than this print needs:', insufficientFilamentLine: '{{printer}} - {{slot}}: needs {{required}}g, remaining {{remaining}}g', printAnyway: 'Print anyway', }, // Backup backup: { title: 'Sauvegarde & Restauration', createBackup: 'Créer Sauvegarde', restoreBackup: 'Restaurer Sauvegarde', restoreDescription: 'Remplace les données par un fichier de sauvegarde', downloadBackup: 'Télécharger Sauvegarde', uploadBackup: 'Téléverser Sauvegarde', lastBackup: 'Dernière sauvegarde', autoBackup: 'Sauvegarde auto', backupNow: 'Sauvegarder maintenant', restoreWarning: 'Attention : Écrase TOUTES les données actuelles.', includeArchives: 'Inclure Archives', includeSettings: 'Inclure Paramètres', includeProfiles: 'Inclure Profils', backupSuccess: 'Sauvegarde réussie', restoreSuccess: 'Restauration réussie', backupFailed: 'Échec sauvegarde', restoreFailed: 'Échec restauration', restoreNote: 'L\'imprimante virtuelle sera arrêtée pendant la restauration', }, // Tags tags: { title: 'Tags', addTag: 'Ajouter Tag', editTag: 'Modifier Tag', deleteTag: 'Supprimer Tag', tagName: 'Nom du Tag', tagColor: 'Couleur du Tag', noTags: 'Aucun tag', deleteConfirm: 'Supprimer ce tag ?', manageTags: 'Gérer les Tags', }, // Upload modal (archives) uploadModal: { title: 'Téléverser des fichiers 3MF', dragDrop: 'Glissez les fichiers .3mf ici', or: 'ou', browseFiles: 'Parcourir', extractionInfo: 'Le modèle d\'imprimante est extrait des métadonnées 3MF.', uploaded: 'téléversé', failed: 'échoué', uploading: 'En cours...', upload: 'Téléverser', uploadFailed: 'Échec du téléversement', }, // Edit archive modal // Edit Archive Modal editArchive: { title: 'Modifier l\'archive', name: 'Nom', namePlaceholder: 'Nom de l\'impression', printer: 'Imprimante', noPrinter: 'Aucune imprimante', project: 'Projet', noProject: 'Aucun projet', itemsPrinted: 'Nombre de pièces', itemsPrintedHelp: 'Nombre d\'objets produits', notes: 'Notes', notesPlaceholder: 'Notes sur l\'impression...', externalLink: 'Lien externe', externalLinkPlaceholder: 'https://...', externalLinkHelp: 'Lien vers Printables, Thingiverse, etc.', tags: 'Tags', tagsPlaceholder: 'Ajouter des tags...', addMoreTags: 'Plus de tags...', matchingTags: 'Correspondant à "{{query}}"', existingTags: 'Tags existants', clickToAdd: '(cliquer pour ajouter)', status: 'Statut', failureReason: 'Raison de l\'échec', selectReason: 'Choisir raison...', photos: 'Photos du résultat', photosHelp: 'Cliquez sur + pour ajouter des photos', printResult: 'Résultat d\'impression', saving: 'Enregistrement...', // Failure reasons failureReasons: { adhesionFailure: 'Défaut d\'adhésion', spaghettiDetached: 'Spaghetti / Détaché', layerShift: 'Décalage de couche', cloggedNozzle: 'Buse bouchée', filamentRunout: 'Filament fini', warping: 'Warping (Déformation)', stringing: 'Stringing (Cheveux d\'ange)', underExtrusion: 'Sous-extrusion', powerFailure: 'Coupure courant', userCancelled: 'Annulé par l\'utilisateur', other: 'Autre', }, // Archive statuses statuses: { completed: 'Réussie', failed: 'Échouée', aborted: 'Annulée', printing: 'Impression', }, }, // K-Profiles kProfiles: { title: 'K-Profiles', noPrintersConfigured: 'Aucune imprimante configurée', addPrinterInSettings: 'Ajoutez une imprimante pour gérer les K-profiles', noActivePrinters: 'Aucune imprimante active', enablePrinterConnection: 'Activez la connexion pour voir les K-profiles', loadingProfiles: 'Chargement des K-Profiles...', printerOffline: 'Imprimante hors ligne', printerOfflineDesc: 'L\'imprimante doit être allumée.', noMatchingProfiles: 'Aucun profil correspondant', noMatchingProfilesDesc: 'Ajustez votre recherche', noKProfiles: 'Aucun K-Profile', noKProfilesDesc: 'Aucun profil trouvé pour une buse de {{diameter}}mm', createFirstProfile: 'Créer le premier profil', // Controls printer: 'Imprimante', nozzle: 'Buse', refresh: 'Rafraîchir', addProfile: 'Ajouter Profil', export: 'Exporter', import: 'Importer', select: 'Choisir', selectAll: 'Tout sélectionner', delete: 'Supprimer', // Filters searchPlaceholder: 'Nom ou filament...', allExtruders: 'Tous les extrudeurs', leftOnly: 'Gauche uniquement', rightOnly: 'Droite uniquement', allFlow: 'Tout débit', hfOnly: 'HF uniquement', sOnly: 'S uniquement', sortName: 'Tri : Nom', sortKValue: 'Tri : Valeur K', sortFilament: 'Tri : Filament', // Dual extruder labels leftExtruder: 'Extrudeur gauche', rightExtruder: 'Extrudeur droit', // Modal modal: { addTitle: 'Ajouter K-Profile', editTitle: 'Modifier K-Profile', profileName: 'Nom du profil', profileNamePlaceholder: 'ex: Mon profil PLA', kValue: 'Valeur K', kValuePlaceholder: '0.020', kValueHelp: 'Plage type : 0.01-0.06 (PLA), 0.02-0.10 (PETG)', filament: 'Filament', selectFilament: 'Choisir filament...', noFilamentsHelp: 'Créez d\'abord un profil dans Bambu Studio.', flowType: 'Type de débit', highFlow: 'Haut Débit (HF)', standard: 'Standard', nozzleSize: 'Taille buse', extruder: 'Extrudeur', extruders: 'Extrudeurs', left: 'Gauche', right: 'Droite', notes: 'Notes (locales)', notesPlaceholder: 'Notes sur ce profil...', notesHelp: 'Enregistré dans Bambuddy, pas sur l\'imprimante', syncing: 'Sync avec l\'imprimante...', savingExtruder: 'Sauvegarde extrudeur {{current}}/{{total}}...', pleaseWait: 'Patientez...', }, // Delete confirmation deleteConfirm: { title: 'Supprimer profil', cannotUndo: 'Action irréversible', message: 'Supprimer "{{name}}" de l\'imprimante ?', }, // Bulk delete bulkDelete: { title: 'Supprimer les profils', cannotUndo: 'Action irréversible', message: 'Supprimer les {{count}} profils de l\'imprimante ?', }, // Toast toast: { profileSaved: 'Profil K enregistré', profilesSaved: 'Profil K enregistré sur {{count}} extrudeur(s)', selectAtLeastOneExtruder: 'Sélectionnez un extrudeur', profileDeleted: 'Profil K supprimé', profilesDeleted: '{{count}} profils supprimés', exportedProfiles: '{{count}} profils exportés', importedProfiles: '{{count}} sur {{total}} profils importés', noProfilesToExport: 'Rien à exporter', invalidFileFormat: 'Format invalide', failedToParseImport: 'Échec analyse fichier', failedToSaveBatch: 'Échec enregistrement groupé', noteSaved: 'Note enregistrée', failedToSaveNote: 'Échec note', }, // Permissions permission: { noRead: 'Pas d\'autorisation lecture', noCreate: 'Pas d\'autorisation création', noUpdate: 'Pas d\'autorisation mise à jour', noDelete: 'Pas d\'autorisation suppression', noExport: 'Pas d\'autorisation export', noImport: 'Pas d\'autorisation import', }, }, // Virtual Printer virtualPrinter: { title: 'Imprimante Virtuelle', running: 'En cours', stopped: 'Arrêtée', description: { default: 'Active une imprimante qui apparaît dans Bambu Studio. Les fichiers envoyés sont archivés sans impression.', proxy: 'Active un proxy qui relaie le trafic vers une imprimante réelle, permettant l\'impression à distance.', }, enable: { title: 'Activer l\'imprimante virtuelle', visibleInSlicer: 'Visible comme "Bambuddy" dans le Slicer', proxyingTo: 'Proxy vers {{name}}', notActive: 'Inactive', }, model: { title: 'Modèle d\'imprimante', description: 'Choisissez le modèle à émuler.', restartWarning: 'Changer le modèle redémarrera le service', }, accessCode: { title: 'Code d\'accès', isSet: 'Code défini', notSet: 'Code requis pour activer', placeholder: 'Code 8 char', placeholderChange: 'Entrez nouveau code', hint: 'Exactement 8 caractères. Sert à l\'auth du Slicer.', charCount: '({{count}}/8)', }, targetPrinter: { title: 'Imprimante cible', configured: 'Cible configurée', notConfigured: 'Imprimante requise pour mode Proxy', placeholder: 'Choisir imprimante...', hint: 'L\'imprimante doit être en mode LAN.', noPrinters: 'Ajoutez une imprimante réelle d\'abord.', }, remoteInterface: { title: 'Exception Interface Réseau', configured: 'Override actif', optional: 'Optionnel - si IP auto est fausse (VPN, Docker, multi-NIC).', placeholder: 'Auto (défaut)...', hint: 'Force l\'IP annoncée via SSDP.', }, mode: { title: 'Mode', archive: 'Archiver', archiveDesc: 'Archive immédiatement', review: 'Revue', reviewDesc: 'Attendre revue avant archive', queue: 'File', queueDesc: 'Archiver et ajouter à la file', proxy: 'Proxy', proxyDesc: 'Relais vers imprimante réelle', }, setupRequired: { title: 'Configuration requise', description: 'Nécessite des réglages système (ports, pare-feu).', readGuide: 'Lire le guide de configuration', }, howItWorks: { title: 'Fonctionnement', titleProxy: 'Fonctionnement (Mode Proxy)', step1: 'Suivez le guide pour votre plateforme', step2: 'Activez et réglez le code d\'accès', step3: 'Dans le Slicer, allez dans "Ajouter Imprimante"', step4: '"Bambuddy" apparaîtra dans la découverte', step5: 'Connectez avec votre code d\'accès', step6: 'Imprimez vers Bambuddy : le 3MF est archivé', proxyStep1: 'Cible réelle en mode LAN', proxyStep2: 'Choisissez l\'interface réseau', proxyStep3: 'Activez le proxy', proxyStep4: 'Connectez avec le code de la vraie imprimante', proxyStep5: 'Le trafic est relayé par Bambuddy', proxyStep6: 'Streaming caméra : voir doc NAT/IP forwarding', }, status: { title: 'Détails du statut', printerName: 'Nom', model: 'Modèle', serialNumber: 'Série', mode: 'Mode', pendingFiles: 'Fichiers en attente', targetPrinter: 'Cible', ftpPort: 'Port FTP', mqttPort: 'Port MQTT', ftpConnections: 'Connexions FTP', mqttConnections: 'Connexions MQTT', }, toast: { updated: 'Réglages virtuels mis à jour', failedToUpdate: 'Échec mise à jour', accessCodeRequired: 'Code d\'accès requis', targetPrinterRequired: 'Imprimante cible requise', accessCodeEmpty: 'Le code ne peut pas être vide', accessCodeLength: 'Le code doit faire 8 caractères', }, }, // Model Viewer modelViewer: { openInSlicer: 'Ouvrir dans le Slicer', tabs: { model: 'Modèle 3D', gcode: 'Aperçu G-code', }, notAvailable: 'indisponible', notSliced: 'pas découpé', plates: 'Plateaux', allPlates: 'Tous les plateaux', plateNumber: 'Plateau {{number}}', plateCount: '{{count}} plateau', plateCount_other: '{{count}} plateaux', objectCount: '{{count}} objet', objectCount_other: '{{count}} objets', filamentCount: '{{count}} filament', filamentCount_other: '{{count}} filaments', eta: 'Fin {{minutes}} min', noPreview: 'Aucun aperçu pour ce fichier', pagination: { pageOf: 'Page {{current}} sur {{total}}', prev: 'Préc', next: 'Suiv', }, errors: { failedToLoad: 'Échec chargement fichier', noMeshes: 'Aucun maillage trouvé dans le 3MF', unsupportedFormat: 'Format non supporté', }, }, // Maintenance type descriptions (built-in) maintenanceDescriptions: { lubricateCarbonRods: 'Appliquer du lubrifiant sur les tiges carbone pour un mouvement fluide', lubricateRails: 'Appliquer du lubrifiant sur les rails linéaires', cleanNozzle: 'Nettoyer buse et hotend anti-bouchage', checkBelts: 'Tension des courroies pour la précision', cleanBuildPlate: 'Nettoyage plateau pour l\'adhésion', checkExtruder: 'Usure des engrenages de l\'extrudeur', checkCooling: 'Bon fonctionnement des ventilateurs', generalInspection: 'Inspection générale de la machine', cleanCarbonRods: 'Nettoyer les tiges carbone (friction)', cleanLinearRails: 'Essuyer les rails linéaires (poussière/débris)', checkPtfeTube: 'Usure ou dommage du tube PTFE', replaceHepaFilter: 'Filtre HEPA pour la qualité de l\'air', replaceCarbonFilter: 'Filtre charbon actif (odeurs)', lubricateLeftNozzleRail: 'Lubrifier le rail de buse gauche (Série H2)', }, // Smart Plugs smartPlugs: { offline: 'Hors ligne', admin: 'Admin', openPlugAdminPage: 'Page admin de la prise', deleteSmartPlug: 'Supprimer la prise', turnOnSmartPlug: 'Allumer la prise', turnOffSmartPlug: 'Éteindre la prise', turnOn: 'Allumer', turnOff: 'Éteindre', addSmartPlug: { scanningNetwork: 'Scan réseau...', chooseEntity: 'Choisir une entité...', connectionFailed: 'Échec connexion', searchEntities: 'Chercher entités...', searchPowerSensors: 'Capteurs puissance...', searchEnergySensors: 'Capteurs énergie...', placeholders: { plugName: 'Prise Salon', mqttStateOnValue: 'ON, true, 1', mqttSameAsPower: 'Identique au topic puissance, ou différent', }, }, }, // Rich Text Editor richTextEditor: { bold: 'Gras', italic: 'Italique', underline: 'Souligné', bulletList: 'Liste à puces', numberedList: 'Liste numérotée', alignLeft: 'Aligner à gauche', alignCenter: 'Centrer', alignRight: 'Aligner à droite', addLink: 'Ajouter lien', removeLink: 'Retirer lien', }, // External Links externalLinks: { noLinksConfigured: 'Aucun lien externe configuré', deleteLink: 'Supprimer lien', removeCustomIcon: 'Retirer icône personnalisée', openInNewTab: 'Ouvrir dans un nouvel onglet', placeholders: { linkName: 'Mon Lien', }, }, // Keyboard Shortcuts Modal keyboardShortcuts: { title: 'Raccourcis Clavier', navigation: 'Navigation', archivesSection: 'Archives', kProfilesSection: 'K-Profiles', generalSection: 'Général', shortcuts: { goToPrinters: 'Aller aux Imprimantes', goToArchives: 'Aller aux Archives', goToQueue: 'Aller à la File', goToStats: 'Aller aux Stats', goToProfiles: 'Aller aux Profils Cloud', goToSettings: 'Aller aux Paramètres', focusSearch: 'Focus recherche', openUploadModal: 'Ouvrir téléversement', clearSelection: 'Tout déselectionner', contextMenu: 'Menu contextuel (cartes)', refreshProfiles: 'Rafraîchir profils', newProfile: 'Nouveau profil', exitSelectionMode: 'Quitter mode sélection', showHelp: 'Afficher cette aide', }, footer: 'Échap ou clic extérieur pour fermer', }, // Notification Log notificationLog: { title: 'Journal de Notification', events: { printStarted: 'Début impression', printComplete: 'Fin impression', printFailed: 'Échec impression', printStopped: 'Arrêt impression', progress: 'Progression', printerOffline: 'Hors ligne', printerError: 'Erreur', lowFilament: 'Filament bas', maintenanceDue: 'Maintenance', test: 'Test', }, timeAgo: { justNow: 'À l\'instant', minutesAgo: 'Il y a {{minutes}}m', hoursAgo: 'Il y a {{hours}}h', }, }, // Restore/Backup Modal restoreBackup: { title: 'Restaurer Sauvegarde', restoring: 'Restauration...', restoreComplete: 'Restauration terminée', restoreFailed: 'Échec restauration', importSettings: 'Importer les réglages d\'un fichier', pleaseWait: 'Patientez pendant la restauration', clickToSelect: 'Fichier .json ou .zip', howDuplicateHandling: 'Gestion des doublons :', categories: { printers: 'Imprimantes', smartPlugs: 'Prises', notificationProviders: 'Fournisseurs', filaments: 'Filaments', archives: 'Archives', pendingUploads: 'Téléversements en attente', settingsTemplates: 'Réglages & Modèles', }, matchingInfo: { printers: 'par numéro de série', smartPlugs: 'par adresse IP', notificationProviders: 'par nom', filaments: 'par nom+type+marque', archives: 'par empreinte numérique (hash)', pendingUploads: 'par nom de fichier', settingsTemplates: 'toujours écrasés', }, replaceExisting: 'Remplacer existant', keepExisting: 'Garder existant', replaceDescription: 'Écrase les doublons avec la sauvegarde', keepDescription: 'Ne restaure que les éléments absents', caution: 'Attention :', cautionText: 'L\'écrasement remplacera vos réglages. Les codes d\'accès imprimantes sont exclus par sécurité.', itemsRestored: 'Éléments restaurés', itemsSkipped: 'Éléments ignorés', restored: 'Restaurés', skipped: 'Ignorés (déjà présents)', filesLabel: 'Fichiers (3MF, vignettes, etc.)', newApiKeysGenerated: 'Nouvelles clés API générées', newApiKeysWarning: 'Copiées maintenant, elles ne seront plus visibles !', processingBackup: 'Traitement du fichier...', noDataFound: 'Aucune donnée trouvée dans le fichier.', failedToRestore: 'Échec restaure. Vérifiez le format.', }, // Backup Export Modal backupExport: { title: 'Exporter Sauvegarde', selectData: 'Données à inclure', selectAll: 'Tout sélectionner', selectNone: 'Ne rien sélectionner', categoryDescriptions: { settings: 'Langue, thèmes, préférences', notifications: 'ntfy, Pushover, Discord, etc.', templates: 'Modèles de messages personnalisés', smartPlugs: 'Configuration des prises Tasmota', externalLinks: 'Liens externes de la barre latérale', printers: 'Infos imprimantes (codes d\'accès exclus par défaut)', plateDetection: 'Images références des plateaux vides', filaments: 'Types et coûts filaments', maintenance: 'Plannings de maintenance personnalisés', archives: 'Données impressions + fichiers (3MF, vignettes, etc.)', projects: 'Projets, BOM, pièces jointes', pendingUploads: 'En attente revue virtuelle', apiKeys: 'Clés Webhook (nouvelles clés générées à l\'import)', }, requiresPrinters: 'Nécessite sélection des imprimantes', zipFileWarning: 'Fichier ZIP créé.', zipFileDescription: 'Contient tous les médias. Peut être volumineux.', includeAccessCodes: 'Inclure Codes d\'accès', includeAccessCodesDescription: 'Pour migrer vers une autre machine', includeAccessCodesWarning: 'Codes en texte clair. Sécurisez ce fichier !', categoriesSelected: '{{selectedCount}} catégories choisies', }, // Pending Uploads Panel pendingUploads: { placeholders: { notes: 'Notes sur l\'impression...', }, discardUpload: 'Rejeter', archiveAllUploads: 'Tout archiver', discardAllUploads: 'Tout rejeter', archive: 'Archiver', timeAgo: { justNow: 'À l\'instant', minutesAgo: 'Il y a {{minutes}}m', hoursAgo: 'Il y a {{hours}}h', daysAgo: 'Il y a {{days}}j', }, }, // API Browser apiBrowser: { placeholders: { requestBody: 'Corps JSON...', searchEndpoints: 'Chercher endpoints...', }, }, // Configure AMS Slot Modal configureAmsSlot: { searchPresets: 'Chercher presets...', colorPlaceholder: 'Nom couleur ou hex (ex: brown, FF8800)', clearCustomColor: 'Effacer couleur perso', noCloudPresets: 'Profils Cloud absents. Connectez-vous.', noMatchingPresets: 'Aucun profil trouvé.', custom: 'Perso', builtin: 'Inclus', settingsSentToPrinter: 'Réglages envoyés', filamentProfile: 'Profil Filament', }, // GitHub Backup Settings githubBackup: { title: 'Sauvegarde GitHub', history: 'Historique', downloadBackup: 'Télécharger', restoreBackup: 'Restaurer', noBackupsYet: 'Aucune sauvegarde', }, // Email Settings emailSettings: { placeholders: { fromName: 'BamBuddy', }, }, // Tag Management Modal tagManagement: { searchTags: 'Chercher tags...', renameTag: 'Renommer tag', deleteTag: 'Supprimer tag', }, // Notification Template Editor notificationTemplates: { placeholders: { title: 'Titre notification...', body: 'Message notification...', }, }, // Batch Tag Modal batchTag: { placeholders: { newTag: 'Nouveau tag...', }, }, // Photo Gallery Modal photoGallery: { deletePhoto: 'Supprimer photo', }, // Filament Hover Card filamentHoverCard: { copySpoolUuid: 'Copier UUID bobine', }, // K Profiles View kProfilesView: { hasNote: 'A une note', copyProfile: 'Copier profil', }, // Layout/Navigation layout: { openMenu: 'Ouvrir menu', noPermissionSystemInfo: 'Pas d\'autorisation système', }, // Dashboard dashboard: { dragToReorder: 'Glisser pour réorganiser', hideWidget: 'Masquer widget', }, // Notification Provider Card notificationProviderCard: { deleteNotificationProvider: 'Supprimer fournisseur', }, // File Manager Modal fileManagerModal: { closeFileManager: 'Fermer gestionnaire', sortFiles: 'Trier fichiers', goToParentFolder: 'Dossier parent', threeView: 'Vue 3D', }, // Embedded Camera Viewer embeddedCameraViewer: { refreshStream: 'Actualiser flux', close: 'Fermer', zoomOut: 'Zoom -', resetZoom: 'Reset zoom', zoomIn: 'Zoom +', dragToResize: 'Glisser pour dimension', }, // Timelapse Viewer timelapseViewer: { skipBack5s: '-5s', skipForward5s: '+5s', }, // Notification Providers notificationProviders: { descriptions: { email: 'Notifications par email SMTP', telegram: 'Via bot Telegram', discord: 'Via webhook Discord', ntfy: 'Push auto-hébergé (ntfy)', pushover: 'Push fiable (Pushover)', callmebot: 'WhatsApp gratuit via CallMeBot', webhook: 'Requête HTTP POST personnalisée', }, }, // Log Viewer logViewer: { searchPlaceholder: 'Message ou nom...', noLogEntries: 'Aucune entrée journal', }, // Switchbar Popover switchbarPopover: { noSwitchesInSwitchbar: 'Aucun interrupteur', }, // Project Page Modal projectPageModal: { placeholders: { title: 'Titre', designer: 'Designer', license: 'Licence', description: 'Description...', profileTitle: 'Titre du profil', profileDescription: 'Description du profil...', }, }, // Spoolman Settings spoolmanSettings: {}, };