Files
stripstream-librarian/apps/backoffice/lib/i18n/fr.ts
Froidefond Julien 81d1586501 feat: add Telegram notification system with granular event toggles
Add notifications crate shared between API and indexer to send Telegram
messages on scan/thumbnail/conversion completion/failure, metadata linking,
batch and refresh events. Configurable via a new Notifications tab in the
backoffice settings with per-event toggle switches grouped by category.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-21 17:24:43 +01:00

721 lines
36 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
const fr = {
// Navigation
"nav.dashboard": "Tableau de bord",
"nav.books": "Livres",
"nav.series": "Séries",
"nav.libraries": "Bibliothèques",
"nav.jobs": "Tâches",
"nav.tokens": "Jetons",
"nav.settings": "Paramètres",
"nav.navigation": "Navigation",
"nav.closeMenu": "Fermer le menu",
"nav.openMenu": "Ouvrir le menu",
// Common
"common.save": "Enregistrer",
"common.saving": "Enregistrement...",
"common.cancel": "Annuler",
"common.close": "Fermer",
"common.delete": "Supprimer",
"common.edit": "Modifier",
"common.search": "Rechercher",
"common.clear": "Effacer",
"common.view": "Voir",
"common.all": "Tous",
"common.enabled": "Activé",
"common.disabled": "Désactivé",
"common.browse": "Parcourir",
"common.add": "Ajouter",
"common.noData": "Aucune donnée",
"common.loading": "Chargement...",
"common.error": "Erreur",
"common.networkError": "Erreur réseau",
"common.show": "Afficher",
"common.perPage": "par page",
"common.next": "Suivant",
"common.previous": "Précédent",
"common.first": "Premier",
"common.previousPage": "Page précédente",
"common.nextPage": "Page suivante",
"common.backoffice": "backoffice",
"common.and": "et",
"common.via": "via",
// Reading status
"status.unread": "Non lu",
"status.reading": "En cours",
"status.read": "Lu",
// Series status
"seriesStatus.ongoing": "En cours",
"seriesStatus.ended": "Terminée",
"seriesStatus.hiatus": "Hiatus",
"seriesStatus.cancelled": "Annulée",
"seriesStatus.upcoming": "À paraître",
"seriesStatus.allStatuses": "Tous les statuts",
"seriesStatus.notDefined": "Non défini",
// Dashboard
"dashboard.title": "Tableau de bord",
"dashboard.subtitle": "Aperçu de votre collection de bandes dessinées. Gérez vos bibliothèques, suivez votre progression de lecture et explorez vos livres et séries.",
"dashboard.loadError": "Impossible de charger les statistiques. Vérifiez que l'API est en cours d'exécution.",
"dashboard.books": "Livres",
"dashboard.series": "Séries",
"dashboard.libraries": "Bibliothèques",
"dashboard.pages": "Pages",
"dashboard.authors": "Auteurs",
"dashboard.totalSize": "Taille totale",
"dashboard.readingStatus": "Statut de lecture",
"dashboard.byFormat": "Par format",
"dashboard.byLibrary": "Par bibliothèque",
"dashboard.booksAdded": "Livres ajoutés (12 derniers mois)",
"dashboard.popularSeries": "Séries populaires",
"dashboard.noSeries": "Aucune série pour le moment",
"dashboard.unknown": "Inconnu",
"dashboard.readCount": "{{read}}/{{total}} lu",
"dashboard.metadataCoverage": "Couverture métadonnées",
"dashboard.seriesLinked": "Séries liées",
"dashboard.seriesUnlinked": "Séries non liées",
"dashboard.byProvider": "Par fournisseur",
"dashboard.bookMetadata": "Métadonnées livres",
"dashboard.withSummary": "Avec résumé",
"dashboard.withIsbn": "Avec ISBN",
// Books page
"books.title": "Livres",
"books.searchPlaceholder": "Rechercher par titre, auteur, série...",
"books.library": "Bibliothèque",
"books.allLibraries": "Toutes les bibliothèques",
"books.status": "Statut",
"books.sort": "Tri",
"books.sortTitle": "Titre",
"books.sortLatest": "Ajout récent",
"books.resultCount": "{{count}} résultat{{plural}}",
"books.resultCountFor": "{{count}} résultat{{plural}} pour \u00ab {{query}} \u00bb",
"books.bookCount": "{{count}} livre{{plural}}",
"books.seriesHeading": "Séries",
"books.unclassified": "Non classé",
"books.noResults": "Aucun livre trouvé pour \"{{query}}\"",
"books.noBooks": "Aucun livre disponible",
"books.coverOf": "Couverture de {{name}}",
"books.format": "Format",
"books.allFormats": "Tous les formats",
// Series page
"series.title": "Séries",
"series.searchPlaceholder": "Rechercher par nom de série...",
"series.reading": "Lecture",
"series.missing": "Manquant",
"series.missingBooks": "Livres manquants",
"series.matchingQuery": "correspondant à",
"series.noResults": "Aucune série trouvée correspondant à vos filtres",
"series.noSeries": "Aucune série disponible",
"series.missingCount": "{{count}} manquant{{plural}}",
"series.readCount": "{{read}}/{{total}} lu{{plural}}",
// Authors page
"nav.authors": "Auteurs",
"authors.title": "Auteurs",
"authors.searchPlaceholder": "Rechercher par nom d'auteur...",
"authors.bookCount": "{{count}} livre{{plural}}",
"authors.seriesCount": "{{count}} série{{plural}}",
"authors.noResults": "Aucun auteur trouvé correspondant à vos filtres",
"authors.noAuthors": "Aucun auteur disponible",
"authors.matchingQuery": "correspondant à",
"authors.sortName": "Nom",
"authors.sortBooks": "Nombre de livres",
"authors.booksBy": "Livres de {{name}}",
"authors.seriesBy": "Séries de {{name}}",
// Libraries page
"libraries.title": "Bibliothèques",
"libraries.addLibrary": "Ajouter une bibliothèque",
"libraries.addLibraryDescription": "Créer une nouvelle bibliothèque à partir d'un dossier existant",
"libraries.disabled": "Désactivée",
"libraries.books": "Livres",
"libraries.series": "Séries",
"libraries.auto": "Auto",
"libraries.manual": "Manuel",
"libraries.nextScan": "Prochain : {{time}}",
"libraries.imminent": "Imminent",
"libraries.nextMetadataRefresh": "Prochain rafraîchissement méta. : {{time}}",
"libraries.nextMetadataRefreshShort": "Méta. : {{time}}",
"libraries.scanLabel": "Scan : {{mode}}",
"libraries.watcherLabel": "Surveillance fichiers",
"libraries.metaRefreshLabel": "Rafraîch. méta. : {{mode}}",
"libraries.index": "Indexer",
"libraries.fullIndex": "Complet",
"libraries.batchMetadata": "Métadonnées en lot",
"libraries.libraryName": "Nom de la bibliothèque",
"libraries.addButton": "Ajouter une bibliothèque",
// Library sub-pages
"libraryBooks.allBooks": "Tous les livres",
"libraryBooks.booksOfSeries": "Livres de \"{{series}}\"",
"libraryBooks.filterLabel": "Livres de la série \"{{series}}\"",
"libraryBooks.viewAll": "Voir tous les livres",
"libraryBooks.noBooks": "Aucun livre dans cette bibliothèque",
"libraryBooks.noBooksInSeries": "Aucun livre dans la série \"{{series}}\"",
"librarySeries.noSeries": "Aucune série trouvée dans cette bibliothèque",
"librarySeries.noBooksInSeries": "Aucun livre dans cette série",
// Library actions
"libraryActions.settingsTitle": "Paramètres de la bibliothèque",
"libraryActions.sectionIndexation": "Indexation",
"libraryActions.sectionMetadata": "Métadonnées",
"libraryActions.autoScan": "Scan planifié",
"libraryActions.autoScanDesc": "Scanner automatiquement les fichiers nouveaux et modifiés",
"libraryActions.fileWatch": "Surveillance en temps réel",
"libraryActions.fileWatchDesc": "Détecter les changements de fichiers instantanément",
"libraryActions.schedule": "Fréquence",
"libraryActions.provider": "Fournisseur",
"libraryActions.providerDesc": "Source utilisée pour récupérer les métadonnées des séries",
"libraryActions.fallback": "Fournisseur de secours",
"libraryActions.fallbackDesc": "Utilisé quand le fournisseur principal ne retourne aucun résultat",
"libraryActions.default": "Par défaut",
"libraryActions.none": "Aucun",
"libraryActions.metadataRefreshSchedule": "Rafraîchissement auto",
"libraryActions.metadataRefreshDesc": "Re-télécharger périodiquement les métadonnées existantes",
"libraryActions.saving": "Enregistrement...",
// Library sub-page header
"libraryHeader.libraries": "Bibliothèques",
"libraryHeader.bookCount": "{{count}} livre{{plural}}",
"libraryHeader.enabled": "Activée",
// Monitoring
"monitoring.auto": "Auto",
"monitoring.manual": "Manuel",
"monitoring.hourly": "Toutes les heures",
"monitoring.daily": "Quotidien",
"monitoring.weekly": "Hebdomadaire",
"monitoring.fileWatch": "Surveillance des fichiers en temps réel",
// Jobs page
"jobs.title": "Tâches d'indexation",
"jobs.startJob": "Lancer une tâche",
"jobs.startJobDescription": "Sélectionnez une bibliothèque (ou toutes) et choisissez l'action à effectuer.",
"jobs.allLibraries": "Toutes les bibliothèques",
"jobs.rebuild": "Mise à jour",
"jobs.rescan": "Rescan complet",
"jobs.fullRebuild": "Reconstruction complète (destructif)",
"jobs.generateThumbnails": "Générer les miniatures",
"jobs.regenerateThumbnails": "Regénérer les miniatures",
"jobs.batchMetadata": "Métadonnées en lot",
"jobs.refreshMetadata": "Rafraîchir métadonnées",
"jobs.refreshMetadataDescription": "Rafraîchit les métadonnées de toutes les séries déjà liées à un fournisseur externe. Re-télécharge les informations depuis le fournisseur et met à jour les séries et livres en base (en respectant les champs verrouillés). Les séries sans lien approuvé sont ignorées. <strong>Requiert une bibliothèque spécifique</strong> (ne fonctionne pas sur \u00ab Toutes les bibliothèques \u00bb).",
"jobs.referenceTitle": "Référence des types de tâches",
"jobs.groupIndexation": "Indexation",
"jobs.groupThumbnails": "Miniatures",
"jobs.groupMetadata": "Métadonnées",
"jobs.requiresLibrary": "Requiert une bibliothèque spécifique",
"jobs.rebuildShort": "Scanner les fichiers nouveaux et modifiés",
"jobs.rescanShort": "Re-parcourir tous les dossiers pour découvrir de nouveaux formats",
"jobs.fullRebuildShort": "Tout supprimer et re-scanner depuis zéro. Les métadonnées, statuts de lecture et liens seront perdus.",
"jobs.generateThumbnailsShort": "Miniatures manquantes uniquement",
"jobs.regenerateThumbnailsShort": "Recréer toutes les miniatures",
"jobs.batchMetadataShort": "Lier automatiquement les séries non liées",
"jobs.refreshMetadataShort": "Mettre à jour les séries déjà liées",
"jobs.rebuildDescription": "Scan incrémental : détecte les fichiers ajoutés, modifiés ou supprimés depuis le dernier scan, les indexe et génère les miniatures manquantes. Les données existantes non modifiées sont conservées. C'est l'action la plus courante et la plus rapide.",
"jobs.rescanDescription": "Re-parcourt tous les dossiers même s'ils n'ont pas changé, pour découvrir les fichiers dans les formats nouvellement supportés (ex. EPUB). Les livres et métadonnées existants sont entièrement préservés — seuls les fichiers réellement nouveaux sont ajoutés. Plus lent qu'un rebuild mais sans risque pour vos données.",
"jobs.fullRebuildDescription": "Supprime toutes les données indexées (livres, séries, miniatures) puis effectue un scan complet depuis zéro. Utile si la base de données est désynchronisée ou corrompue. Opération longue et destructive : les statuts de lecture et les métadonnées manuelles seront perdus.",
"jobs.generateThumbnailsDescription": "Génère les miniatures uniquement pour les livres qui n'en ont pas encore. Les miniatures existantes ne sont pas touchées. Utile après un import ou si certaines miniatures sont manquantes.",
"jobs.regenerateThumbnailsDescription": "Regénère toutes les miniatures depuis zéro, en remplaçant les existantes. Utile si la qualité ou la taille des miniatures a changé dans la configuration, ou si des miniatures sont corrompues.",
"jobs.batchMetadataDescription": "Recherche automatiquement les métadonnées de chaque série de la bibliothèque auprès du provider configuré (avec fallback si configuré). Seuls les résultats avec un match unique à 100% de confiance sont appliqués automatiquement. Les séries déjà liées sont ignorées. Un rapport détaillé par série est disponible à la fin du job. <strong>Requiert une bibliothèque spécifique</strong> (ne fonctionne pas sur \u00ab Toutes les bibliothèques \u00bb).",
// Jobs list
"jobsList.id": "ID",
"jobsList.library": "Bibliothèque",
"jobsList.type": "Type",
"jobsList.status": "Statut",
"jobsList.stats": "Stats",
"jobsList.duration": "Durée",
"jobsList.created": "Créé",
"jobsList.actions": "Actions",
// Job row
"jobRow.showProgress": "Afficher la progression",
"jobRow.hideProgress": "Masquer la progression",
"jobRow.scanned": "{{count}} analysés",
"jobRow.filesIndexed": "{{count}} fichiers indexés",
"jobRow.filesRemoved": "{{count}} fichiers supprimés",
"jobRow.thumbnailsGenerated": "{{count}} miniatures générées",
"jobRow.metadataProcessed": "{{count}} séries traitées",
"jobRow.metadataRefreshed": "{{count}} séries rafraîchies",
"jobRow.errors": "{{count}} erreurs",
"jobRow.view": "Voir",
// Job progress
"jobProgress.loadingProgress": "Chargement de la progression...",
"jobProgress.sseError": "Échec de l'analyse des données SSE",
"jobProgress.connectionLost": "Connexion perdue",
"jobProgress.error": "Erreur : {{message}}",
"jobProgress.done": "Terminé",
"jobProgress.currentFile": "En cours : {{file}}",
"jobProgress.pages": "pages",
"jobProgress.thumbnails": "miniatures",
"jobProgress.filesUnit": "fichiers",
"jobProgress.scanned": "Analysés : {{count}}",
"jobProgress.indexed": "Indexés : {{count}}",
"jobProgress.removed": "Supprimés : {{count}}",
"jobProgress.errors": "Erreurs : {{count}}",
// Job detail
"jobDetail.backToJobs": "Retour aux tâches",
"jobDetail.title": "Détails de la tâche",
"jobDetail.completedIn": "Terminé en {{duration}}",
"jobDetail.failedAfter": "après {{duration}}",
"jobDetail.jobFailed": "Tâche échouée",
"jobDetail.cancelled": "Annulé",
"jobDetail.overview": "Aperçu",
"jobDetail.timeline": "Chronologie",
"jobDetail.created": "Créé",
"jobDetail.started": "Démarré",
"jobDetail.pendingStart": "En attente de démarrage…",
"jobDetail.finished": "Terminé",
"jobDetail.failed": "Échoué",
"jobDetail.library": "Bibliothèque",
"jobDetail.book": "Livre",
"jobDetail.allLibraries": "Toutes les bibliothèques",
"jobDetail.phase1": "Phase 1 — Découverte",
"jobDetail.phase2a": "Phase 2a — Extraction des pages",
"jobDetail.phase2b": "Phase 2b — Génération des miniatures",
"jobDetail.metadataSearch": "Recherche de métadonnées",
"jobDetail.metadataSearchDesc": "Recherche auprès des fournisseurs externes pour chaque série",
"jobDetail.metadataRefresh": "Rafraîchissement des métadonnées",
"jobDetail.metadataRefreshDesc": "Re-téléchargement des métadonnées depuis les fournisseurs pour les séries déjà liées",
"jobDetail.refreshReport": "Rapport de rafraîchissement",
"jobDetail.refreshReportDesc": "{{count}} séries liées traitées",
"jobDetail.refreshed": "Rafraîchies",
"jobDetail.unchanged": "Inchangées",
"jobDetail.refreshChanges": "Détail des changements",
"jobDetail.refreshChangesDesc": "{{count}} séries avec des modifications",
"jobDetail.phase1Desc": "Scan et indexation des fichiers de la bibliothèque",
"jobDetail.phase2aDesc": "Extraction de la première page de chaque archive (nombre de pages + image brute)",
"jobDetail.phase2bDesc": "Génération des miniatures pour les livres analysés",
"jobDetail.inProgress": "en cours",
"jobDetail.duration": "Durée : {{duration}}",
"jobDetail.currentFile": "Fichier en cours",
"jobDetail.generated": "Générés",
"jobDetail.processed": "Traités",
"jobDetail.total": "Total",
"jobDetail.remaining": "Restants",
"jobDetail.indexStats": "Statistiques d'indexation",
"jobDetail.scanned": "Scannés",
"jobDetail.indexed": "Indexés",
"jobDetail.removed": "Supprimés",
"jobDetail.warnings": "Avertissements",
"jobDetail.errors": "Erreurs",
"jobDetail.thumbnailStats": "Statistiques des miniatures",
"jobDetail.batchReport": "Rapport du lot",
"jobDetail.seriesAnalyzed": "{{count}} séries analysées",
"jobDetail.autoMatched": "Auto-associé",
"jobDetail.alreadyLinked": "Déjà lié",
"jobDetail.noResults": "Aucun résultat",
"jobDetail.tooManyResults": "Trop de résultats",
"jobDetail.lowConfidence": "Confiance faible",
"jobDetail.resultsBySeries": "Résultats par série",
"jobDetail.seriesProcessed": "{{count}} séries traitées",
"jobDetail.candidates": "candidat{{plural}}",
"jobDetail.confidence": "confiance",
"jobDetail.match": "Correspondance : {{title}}",
"jobDetail.fileErrors": "Erreurs de fichiers ({{count}})",
"jobDetail.fileErrorsDesc": "Erreurs rencontrées lors du traitement des fichiers",
// Job types
"jobType.rebuild": "Indexation",
"jobType.rescan": "Rescan complet",
"jobType.full_rebuild": "Indexation complète",
"jobType.thumbnail_rebuild": "Miniatures",
"jobType.thumbnail_regenerate": "Régén. miniatures",
"jobType.cbr_to_cbz": "CBR → CBZ",
"jobType.metadata_batch": "Métadonnées en lot",
"jobType.metadata_refresh": "Rafraîchir méta.",
"jobType.rebuildLabel": "Indexation incrémentale",
"jobType.rebuildDesc": "Scanne les fichiers nouveaux/modifiés, les analyse et génère les miniatures manquantes.",
"jobType.rescanLabel": "Rescan complet",
"jobType.rescanDesc": "Re-parcourt tous les dossiers pour découvrir les fichiers dans les formats nouvellement supportés (ex. EPUB). Les données existantes sont préservées — seuls les nouveaux fichiers sont ajoutés.",
"jobType.full_rebuildLabel": "Réindexation complète",
"jobType.full_rebuildDesc": "Supprime toutes les données existantes puis effectue un scan complet, une ré-analyse et la génération des miniatures.",
"jobType.thumbnail_rebuildLabel": "Reconstruction des miniatures",
"jobType.thumbnail_rebuildDesc": "Génère les miniatures uniquement pour les livres qui n'en ont pas. Les miniatures existantes sont conservées.",
"jobType.thumbnail_regenerateLabel": "Regénération des miniatures",
"jobType.thumbnail_regenerateDesc": "Regénère toutes les miniatures depuis zéro, en remplaçant les existantes.",
"jobType.cbr_to_cbzLabel": "Conversion CBR → CBZ",
"jobType.cbr_to_cbzDesc": "Convertit une archive CBR au format ouvert CBZ.",
"jobType.metadata_batchLabel": "Métadonnées en lot",
"jobType.metadata_batchDesc": "Recherche les métadonnées auprès des fournisseurs externes pour toutes les séries de la bibliothèque et applique automatiquement les correspondances à 100% de confiance.",
"jobType.metadata_refreshLabel": "Rafraîchissement métadonnées",
"jobType.metadata_refreshDesc": "Re-télécharge et met à jour les métadonnées pour toutes les séries déjà liées à un fournisseur externe.",
// Status badges
"statusBadge.extracting_pages": "Extraction des pages",
"statusBadge.generating_thumbnails": "Miniatures",
// Jobs indicator
"jobsIndicator.viewAll": "Voir toutes les tâches",
"jobsIndicator.activeTasks": "Tâches actives",
"jobsIndicator.runningAndPending": "{{running}} en cours, {{pending}} en attente",
"jobsIndicator.pendingTasks": "{{count}} tâche{{plural}} en attente",
"jobsIndicator.overallProgress": "Progression globale",
"jobsIndicator.viewAllLink": "Tout voir →",
"jobsIndicator.noActiveTasks": "Aucune tâche active",
"jobsIndicator.autoRefresh": "Actualisation automatique toutes les 2s",
"jobsIndicator.taskCount": "{{count}} tâche{{plural}} active{{plural}}",
"jobsIndicator.thumbnails": "Miniatures",
"jobsIndicator.regeneration": "Regénération",
// Time
"time.justNow": "À l'instant",
"time.minutesAgo": "il y a {{count}}m",
"time.hoursAgo": "il y a {{count}}h",
// Tokens page
"tokens.title": "Jetons API",
"tokens.created": "Jeton créé",
"tokens.createdDescription": "Copiez-le maintenant, il ne sera plus affiché",
"tokens.createNew": "Créer un nouveau jeton",
"tokens.createDescription": "Générer un nouveau jeton API avec la portée souhaitée",
"tokens.tokenName": "Nom du jeton",
"tokens.scopeRead": "Lecture",
"tokens.scopeAdmin": "Admin",
"tokens.createButton": "Créer le jeton",
"tokens.name": "Nom",
"tokens.scope": "Portée",
"tokens.prefix": "Préfixe",
"tokens.status": "Statut",
"tokens.actions": "Actions",
"tokens.revoked": "Révoqué",
"tokens.active": "Actif",
"tokens.revoke": "Révoquer",
// Settings page
"settings.title": "Paramètres",
"settings.general": "Général",
"settings.integrations": "Intégrations",
"settings.savedSuccess": "Paramètres enregistrés avec succès",
"settings.savedError": "Échec de l'enregistrement des paramètres",
"settings.saveError": "Erreur lors de l'enregistrement des paramètres",
"settings.cacheClearError": "Échec du vidage du cache",
// Settings - Image Processing
"settings.imageProcessing": "Traitement d'images",
"settings.imageProcessingDesc": "Ces paramètres s'appliquent uniquement lorsqu'un client demande explicitement une conversion de format via l'API (ex. <code>?format=webp&width=800</code>). Les pages servies sans paramètres sont livrées telles quelles depuis l'archive, sans traitement.",
"settings.defaultFormat": "Format de sortie par défaut",
"settings.defaultQuality": "Qualité par défaut (1-100)",
"settings.defaultFilter": "Filtre de redimensionnement par défaut",
"settings.filterLanczos": "Lanczos3 (Meilleure qualité)",
"settings.filterTriangle": "Triangle (Plus rapide)",
"settings.filterNearest": "Nearest (Le plus rapide)",
"settings.maxWidth": "Largeur maximale autorisée (px)",
// Settings - Cache
"settings.cache": "Cache",
"settings.cacheDesc": "Gérer le cache d'images et le stockage",
"settings.cacheSize": "Taille du cache",
"settings.files": "Fichiers",
"settings.directory": "Répertoire",
"settings.cacheDirectory": "Répertoire du cache",
"settings.maxSizeMb": "Taille max (Mo)",
"settings.clearing": "Vidage en cours...",
"settings.clearCache": "Vider le cache",
// Settings - Performance
"settings.performanceLimits": "Limites de performance",
"settings.performanceDesc": "Configurer les performances de l'API, la limitation de débit et la concurrence de génération des miniatures",
"settings.concurrentRenders": "Rendus simultanés",
"settings.concurrentRendersHelp": "Nombre maximum de rendus de pages et de générations de miniatures en parallèle",
"settings.timeoutSeconds": "Délai d'expiration (secondes)",
"settings.rateLimit": "Limite de débit (req/s)",
"settings.limitsNote": "Note : Les modifications des limites nécessitent un redémarrage du serveur pour prendre effet. Le paramètre « Rendus simultanés » contrôle à la fois le rendu des pages et le parallélisme de génération des miniatures.",
// Settings - Thumbnails
"settings.thumbnails": "Miniatures",
"settings.thumbnailsDesc": "Configurer la génération des miniatures pendant l'indexation",
"settings.enableThumbnails": "Activer les miniatures",
"settings.outputFormat": "Format de sortie",
"settings.formatOriginal": "Original (Sans ré-encodage)",
"settings.formatOriginalDesc": "Redimensionne aux dimensions cibles, conserve le format source (JPEG→JPEG). Génération beaucoup plus rapide.",
"settings.formatReencodeDesc": "Redimensionne et ré-encode dans le format sélectionné.",
"settings.width": "Largeur (px)",
"settings.height": "Hauteur (px)",
"settings.quality": "Qualité (1-100)",
"settings.thumbnailDirectory": "Répertoire des miniatures",
"settings.totalSize": "Taille totale",
"settings.thumbnailsNote": "Note : Les paramètres des miniatures sont utilisés pendant l'indexation. Les miniatures existantes ne seront pas regénérées automatiquement. La concurrence de génération des miniatures est contrôlée par le paramètre « Rendus simultanés » dans les Limites de performance ci-dessus.",
// Settings - Komga
"settings.komgaSync": "Synchronisation Komga",
"settings.komgaDesc": "Importer le statut de lecture depuis un serveur Komga. Les livres sont associés par titre (insensible à la casse). Les identifiants ne sont pas stockés.",
"settings.komgaUrl": "URL Komga",
"settings.username": "Nom d'utilisateur",
"settings.password": "Mot de passe",
"settings.syncing": "Synchronisation...",
"settings.syncReadBooks": "Synchroniser les livres lus",
"settings.komgaRead": "Lus sur Komga",
"settings.matched": "Associés",
"settings.alreadyRead": "Déjà lus",
"settings.newlyMarked": "Nouvellement marqués",
"settings.matchedBooks": "{{count}} livre{{plural}} associé{{plural}}",
"settings.unmatchedBooks": "{{count}} unmatched book{{plural}}",
"settings.syncHistory": "Historique de synchronisation",
"settings.read": "lus",
"settings.new": "nouveaux",
"settings.unmatched": "non associés",
// Settings - Metadata Providers
"settings.metadataProviders": "Fournisseurs de métadonnées",
"settings.metadataProvidersDesc": "Configurer les fournisseurs de métadonnées externes pour l'enrichissement des séries/livres. Chaque bibliothèque peut remplacer le fournisseur par défaut. Tous les fournisseurs sont disponibles pour la recherche rapide dans la modale de métadonnées.",
"settings.defaultProvider": "Fournisseur par défaut",
"settings.defaultProviderHelp": "Utilisé par défaut pour la recherche de métadonnées. Les bibliothèques peuvent le remplacer individuellement.",
"settings.metadataLanguage": "Langue des métadonnées",
"settings.metadataLanguageHelp": "Langue préférée pour les résultats de recherche et les descriptions. Secours : anglais.",
"settings.apiKeys": "Clés API",
"settings.googleBooksKey": "Clé API Google Books",
"settings.googleBooksPlaceholder": "Optionnel — pour des limites de débit plus élevées",
"settings.googleBooksHelp": "Fonctionne sans clé mais avec des limites de débit plus basses.",
"settings.comicvineKey": "Clé API ComicVine",
"settings.comicvinePlaceholder": "Requise pour utiliser ComicVine",
"settings.comicvineHelp": "Obtenez votre clé sur",
"settings.freeProviders": "sont gratuits et ne nécessitent pas de clé API.",
// Settings - Status Mappings
"settings.statusMappings": "Correspondance de statuts",
"settings.statusMappingsDesc": "Configurer la correspondance entre les statuts des fournisseurs et les statuts en base de données. Plusieurs statuts fournisseurs peuvent pointer vers un même statut cible.",
"settings.targetStatus": "Statut cible",
"settings.providerStatuses": "Statuts fournisseurs",
"settings.addProviderStatus": "Ajouter un statut fournisseur…",
"settings.noMappings": "Aucune correspondance configurée",
"settings.unmappedSection": "Non mappés",
"settings.addMapping": "Ajouter une correspondance",
"settings.selectTargetStatus": "Sélectionner un statut cible",
"settings.newTargetPlaceholder": "Nouveau statut cible (ex: hiatus)",
"settings.createTargetStatus": "Créer un statut",
// Settings - Prowlarr
"settings.prowlarr": "Prowlarr",
"settings.prowlarrDesc": "Configurer Prowlarr pour rechercher des releases sur les indexeurs (torrents/usenet). Seule la recherche manuelle est disponible pour le moment.",
"settings.prowlarrUrl": "URL Prowlarr",
"settings.prowlarrUrlPlaceholder": "http://localhost:9696",
"settings.prowlarrApiKey": "Clé API",
"settings.prowlarrApiKeyPlaceholder": "Clé API Prowlarr",
"settings.prowlarrCategories": "Catégories",
"settings.prowlarrCategoriesHelp": "ID de catégories Newznab séparés par des virgules (7030 = Comics, 7020 = Ebooks)",
"settings.testConnection": "Tester la connexion",
"settings.testing": "Test en cours...",
"settings.testSuccess": "Connexion réussie",
"settings.testFailed": "Échec de la connexion",
// Prowlarr search modal
"prowlarr.searchButton": "Prowlarr",
"prowlarr.modalTitle": "Recherche Prowlarr",
"prowlarr.searchSeries": "Rechercher la série",
"prowlarr.searchVolume": "Rechercher",
"prowlarr.searching": "Recherche en cours...",
"prowlarr.noResults": "Aucun résultat trouvé",
"prowlarr.resultCount": "{{count}} résultat{{plural}}",
"prowlarr.missingVolumes": "Volumes manquants",
"prowlarr.columnTitle": "Titre",
"prowlarr.columnIndexer": "Indexeur",
"prowlarr.columnSize": "Taille",
"prowlarr.columnSeeders": "Seeds",
"prowlarr.columnLeechers": "Peers",
"prowlarr.columnProtocol": "Protocole",
"prowlarr.searchPlaceholder": "Modifier la recherche...",
"prowlarr.searchAction": "Rechercher",
"prowlarr.searchError": "Erreur lors de la recherche",
"prowlarr.notConfigured": "Prowlarr n'est pas configuré",
"prowlarr.download": "Télécharger",
"prowlarr.info": "Info",
"prowlarr.sendToQbittorrent": "Envoyer à qBittorrent",
"prowlarr.sending": "Envoi...",
"prowlarr.sentSuccess": "Envoyé à qBittorrent",
"prowlarr.sentError": "Échec de l'envoi à qBittorrent",
"prowlarr.missingVol": "T{{vol}} manquant",
// Settings - qBittorrent
"settings.qbittorrent": "qBittorrent",
"settings.qbittorrentDesc": "Configurer qBittorrent comme client de téléchargement. Les torrents trouvés via Prowlarr peuvent être envoyés directement à qBittorrent.",
"settings.qbittorrentUrl": "URL qBittorrent",
"settings.qbittorrentUrlPlaceholder": "http://localhost:8080",
"settings.qbittorrentUsername": "Nom d'utilisateur",
"settings.qbittorrentPassword": "Mot de passe",
// Settings - Telegram Notifications
"settings.notifications": "Notifications",
"settings.telegram": "Telegram",
"settings.telegramDesc": "Recevoir des notifications Telegram lors des scans, erreurs et liaisons de métadonnées.",
"settings.botToken": "Bot Token",
"settings.botTokenPlaceholder": "123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11",
"settings.chatId": "Chat ID",
"settings.chatIdPlaceholder": "123456789",
"settings.telegramEnabled": "Activer les notifications Telegram",
"settings.telegramEvents": "Événements",
"settings.eventCategoryScan": "Scans",
"settings.eventCategoryThumbnail": "Miniatures",
"settings.eventCategoryConversion": "Conversion CBR → CBZ",
"settings.eventCategoryMetadata": "Métadonnées",
"settings.eventCompleted": "Terminé",
"settings.eventFailed": "Échoué",
"settings.eventCancelled": "Annulé",
"settings.eventLinked": "Liée",
"settings.eventBatchCompleted": "Batch terminé",
"settings.eventBatchFailed": "Batch échoué",
"settings.eventRefreshCompleted": "Rafraîchissement terminé",
"settings.eventRefreshFailed": "Rafraîchissement échoué",
"settings.telegramHelp": "Comment obtenir les informations ?",
"settings.telegramHelpBot": "Ouvrez Telegram, recherchez <b>@BotFather</b>, envoyez <code>/newbot</code> et suivez les instructions. Copiez le token fourni.",
"settings.telegramHelpChat": "Envoyez un message à votre bot, puis ouvrez <code>https://api.telegram.org/bot&lt;TOKEN&gt;/getUpdates</code> dans votre navigateur. Le <b>chat id</b> apparaît dans <code>message.chat.id</code>.",
"settings.telegramHelpGroup": "Pour un groupe : ajoutez le bot au groupe, envoyez un message, puis consultez la même URL. Les IDs de groupe sont négatifs (ex: <code>-123456789</code>).",
// Settings - Language
"settings.language": "Langue",
"settings.languageDesc": "Choisir la langue de l'interface",
// Pagination
"pagination.show": "Afficher",
"pagination.displaying": "Affichage de {{count}} éléments",
"pagination.range": "{{start}}-{{end}} sur {{total}}",
// Book detail
"bookDetail.libraries": "Bibliothèques",
"bookDetail.coverOf": "Couverture de {{title}}",
"bookDetail.technicalInfo": "Informations techniques",
"bookDetail.file": "Fichier",
"bookDetail.fileFormat": "Format fichier",
"bookDetail.parsing": "Parsing",
"bookDetail.updatedAt": "Mis à jour",
// Book preview
"bookPreview.preview": "Aperçu",
"bookPreview.pages": "pages {{start}}{{end}} / {{total}}",
"bookPreview.prev": "← Préc.",
"bookPreview.next": "Suiv. →",
// Edit book form
"editBook.editMetadata": "Modifier les métadonnées",
"editBook.title": "Titre",
"editBook.titlePlaceholder": "Titre du livre",
"editBook.authors": "Auteur(s)",
"editBook.addAuthor": "Ajouter un auteur (Entrée pour valider)",
"editBook.language": "Langue",
"editBook.languagePlaceholder": "ex : fr, en, jp",
"editBook.series": "Série",
"editBook.seriesPlaceholder": "Nom de la série",
"editBook.volume": "Volume",
"editBook.volumePlaceholder": "Numéro de volume",
"editBook.isbn": "ISBN",
"editBook.publishDate": "Date de publication",
"editBook.publishDatePlaceholder": "ex : 2023-01-15",
"editBook.description": "Description",
"editBook.descriptionPlaceholder": "Résumé / description du livre",
"editBook.lockedField": "Champ verrouillé (protégé des synchros)",
"editBook.clickToLock": "Cliquer pour verrouiller ce champ",
"editBook.lockedFieldsNote": "Les champs verrouillés ne seront pas écrasés par les synchros de métadonnées externes.",
"editBook.saveError": "Erreur lors de la sauvegarde",
"editBook.savingLabel": "Sauvegarde…",
"editBook.saveLabel": "Sauvegarder",
"editBook.removeAuthor": "Supprimer {{name}}",
// Edit series form
"editSeries.title": "Modifier la série",
"editSeries.name": "Nom",
"editSeries.namePlaceholder": "Nom de la série",
"editSeries.startYear": "Année de début",
"editSeries.startYearPlaceholder": "ex : 1990",
"editSeries.totalVolumes": "Nombre de volumes",
"editSeries.status": "Statut",
"editSeries.authors": "Auteur(s)",
"editSeries.applyToBooks": "→ livres",
"editSeries.applyToBooksTitle": "Appliquer auteur et langue à tous les livres de la série",
"editSeries.bookAuthor": "Auteur (livres)",
"editSeries.bookAuthorPlaceholder": "Écrase le champ auteur de chaque livre",
"editSeries.bookLanguage": "Langue (livres)",
"editSeries.publishers": "Éditeur(s)",
"editSeries.addPublisher": "Ajouter un éditeur (Entrée pour valider)",
"editSeries.descriptionPlaceholder": "Synopsis ou description de la série…",
// Convert button
"convert.convertToCbz": "Convertir en CBZ",
"convert.converting": "Conversion…",
"convert.started": "Conversion lancée.",
"convert.viewJob": "Voir la tâche →",
"convert.failed": "Échec de la conversion",
"convert.unknownError": "Erreur inconnue",
// Mark read buttons
"markRead.markUnread": "Marquer non lu",
"markRead.markAllRead": "Tout marquer lu",
"markRead.markAsRead": "Marquer comme lu",
// Metadata search modal
"metadata.metadataLink": "Lien métadonnées",
"metadata.searchExternal": "Rechercher les métadonnées externes",
"metadata.provider": "Fournisseur :",
"metadata.searching": "Recherche de \"{{name}}\"...",
"metadata.noResults": "Aucun résultat trouvé.",
"metadata.resultCount": "{{count}} résultat{{plural}} trouvé{{plural}}",
"metadata.howToSync": "Comment souhaitez-vous synchroniser ?",
"metadata.syncSeriesOnly": "Synchroniser la série uniquement",
"metadata.syncSeriesOnlyDesc": "Mettre à jour la description, les auteurs, les éditeurs et l'année",
"metadata.syncSeriesAndBooks": "Synchroniser la série + les livres",
"metadata.syncSeriesAndBooksDesc": "Récupérer aussi la liste des livres et afficher les tomes manquants",
"metadata.backToResults": "Retour aux résultats",
"metadata.syncingMetadata": "Synchronisation des métadonnées...",
"metadata.syncSuccess": "Métadonnées synchronisées avec succès !",
"metadata.seriesLabel": "Série",
"metadata.booksLabel": "Livres",
"metadata.booksMatched": "{{matched}} associé{{plural}}",
"metadata.booksUnmatched": "{{count}} non associé{{plural}}",
"metadata.external": "Externe",
"metadata.local": "Locaux",
"metadata.missingLabel": "Manquants",
"metadata.missingBooks": "{{count}} livre{{plural}} manquant{{plural}}",
"metadata.unknown": "Inconnu",
"metadata.linkedTo": "Lié à",
"metadata.viewExternal": "Voir sur la source externe",
"metadata.searchAgain": "Rechercher à nouveau",
"metadata.unlink": "Dissocier",
"metadata.searchButton": "Rechercher les métadonnées",
"metadata.metadataButton": "Métadonnées",
"metadata.locked": "verrouillé",
"metadata.searchFailed": "Échec de la recherche",
"metadata.linkFailed": "Échec de la création du lien",
"metadata.approveFailed": "Échec de l'approbation",
"metadata.chapters": "chapitres",
"metadata.volumes": "volumes",
"metadata.inProgress": "en cours",
"metadata.fallbackUsed": "(secours)",
// Field labels
"field.description": "Description",
"field.authors": "Auteurs",
"field.publishers": "Éditeurs",
"field.start_year": "Année",
"field.total_volumes": "Nb volumes",
"field.status": "Statut",
"field.summary": "Résumé",
"field.isbn": "ISBN",
"field.publish_date": "Date de publication",
"field.language": "Langue",
// Folder picker/browser
"folder.selectFolder": "Sélectionner un dossier...",
"folder.selectFolderTitle": "Sélectionner le dossier",
"folder.clickToSelect": "Cliquez sur un dossier pour le sélectionner",
"folder.noFolders": "Aucun dossier trouvé",
// Series filters
"seriesFilters.all": "Tous",
"seriesFilters.missingBooks": "Livres manquants",
// Metadata filter
"series.metadata": "Métadonnées",
"series.metadataAll": "Toutes",
"series.metadataLinked": "Associée",
"series.metadataUnlinked": "Non associée",
} as const;
export type TranslationKey = keyof typeof fr;
export default fr;