const fr: Record<string, string> = {
  // Common
  'common.save': 'Enregistrer',
  'common.showMore': 'Voir plus',
  'common.showLess': 'Voir moins',
  'common.cancel': 'Annuler',
  'common.clear': 'Effacer',
  'common.delete': 'Supprimer',
  'common.edit': 'Modifier',
  'common.add': 'Ajouter',
  'common.loading': 'Chargement…',
  'common.import': 'Importer',
  'common.select': 'Sélectionner',
  'common.selectAll': 'Tout sélectionner',
  'common.deselectAll': 'Tout désélectionner',
  'common.error': 'Erreur',
  'common.unknownError': 'Erreur inconnue',
  'common.tooManyAttempts': 'Trop de tentatives. Veuillez réessayer plus tard.',
  'common.back': 'Retour',
  'common.all': 'Tout',
  'common.close': 'Fermer',
  'common.open': 'Ouvrir',
  'common.upload': 'Importer',
  'common.search': 'Rechercher',
  'common.confirm': 'Confirmer',
  'common.ok': 'OK',
  'common.yes': 'Oui',
  'common.no': 'Non',
  'common.or': 'ou',
  'common.none': 'Aucun',
  'common.date': 'Date',
  'common.rename': 'Renommer',
  'common.discardChanges': 'Ignorer les modifications',
  'common.discard': 'Ignorer',
  'common.name': 'Nom',
  'common.email': 'E-mail',
  'common.password': 'Mot de passe',
  'common.saving': 'Enregistrement…',
  'common.saved': 'Enregistré',
  'trips.memberRemoved': '{username} supprimé',
  'trips.memberRemoveError': 'Échec de la suppression',
  'trips.memberAdded': '{username} ajouté',
  'trips.memberAddError': "Échec de l'ajout",
  'common.expand': 'Développer',
  'common.collapse': 'Réduire',
  'trips.reminder': 'Rappel',
  'trips.reminderNone': 'Aucun',
  'trips.reminderDay': 'jour',
  'trips.reminderDays': 'jours',
  'trips.reminderCustom': 'Personnalisé',
  'trips.reminderDaysBefore': 'jours avant le départ',
  'trips.reminderDisabledHint': 'Les rappels de voyage sont désactivés. Activez-les dans Admin > Paramètres > Notifications.',
  'common.update': 'Mettre à jour',
  'common.change': 'Modifier',
  'common.uploading': 'Import en cours…',
  'common.backToPlanning': 'Retour à la planification',
  'common.reset': 'Réinitialiser',

  // Navbar
  'nav.trip': 'Voyage',
  'nav.share': 'Partager',
  'nav.settings': 'Paramètres',
  'nav.admin': 'Admin',
  'nav.logout': 'Déconnexion',
  'nav.lightMode': 'Mode clair',
  'nav.darkMode': 'Mode sombre',
  'nav.autoMode': 'Mode auto',
  'nav.administrator': 'Administrateur',

  // Dashboard
  'dashboard.title': 'Mes voyages',
  'dashboard.subtitle.loading': 'Chargement des voyages…',
  'dashboard.subtitle.trips': '{count} voyages ({archived} archivés)',
  'dashboard.subtitle.empty': 'Commencez votre premier voyage',
  'dashboard.subtitle.activeOne': '{count} voyage actif',
  'dashboard.subtitle.activeMany': '{count} voyages actifs',
  'dashboard.subtitle.archivedSuffix': ' · {count} archivés',
  'dashboard.newTrip': 'Nouveau voyage',
  'dashboard.gridView': 'Vue en grille',
  'dashboard.listView': 'Vue en liste',
  'dashboard.currency': 'Devise',
  'dashboard.timezone': 'Fuseau horaire',
  'dashboard.localTime': 'Heure locale',
  'dashboard.timezoneCustomTitle': 'Fuseau horaire personnalisé',
  'dashboard.timezoneCustomLabelPlaceholder': 'Libellé (facultatif)',
  'dashboard.timezoneCustomTzPlaceholder': 'ex. America/New_York',
  'dashboard.timezoneCustomAdd': 'Ajouter',
  'dashboard.timezoneCustomErrorEmpty': 'Saisissez un identifiant de fuseau horaire',
  'dashboard.timezoneCustomErrorInvalid': 'Fuseau horaire invalide. Utilisez un format comme Europe/Berlin',
  'dashboard.timezoneCustomErrorDuplicate': 'Déjà ajouté',
  'dashboard.emptyTitle': 'Aucun voyage',
  'dashboard.emptyText': 'Créez votre premier voyage et commencez à planifier !',
  'dashboard.emptyButton': 'Créer un premier voyage',
  'dashboard.nextTrip': 'Prochain voyage',
  'dashboard.shared': 'Partagé',
  'dashboard.sharedBy': 'Partagé par {name}',
  'dashboard.days': 'Jours',
  'dashboard.places': 'Lieux',
  'dashboard.members': 'Compagnons de voyage',
  'dashboard.archive': 'Archiver',
  'dashboard.copyTrip': 'Copier',
  'dashboard.copySuffix': 'copie',
  'dashboard.restore': 'Restaurer',
  'dashboard.archived': 'Archivé',
  'dashboard.status.ongoing': 'En cours',
  'dashboard.status.today': "Aujourd'hui",
  'dashboard.status.tomorrow': 'Demain',
  'dashboard.status.past': 'Passé',
  'dashboard.status.daysLeft': '{count} jours restants',
  'dashboard.toast.loadError': 'Impossible de charger les voyages',
  'dashboard.toast.created': 'Voyage créé avec succès !',
  'dashboard.toast.createError': 'Impossible de créer le voyage',
  'dashboard.toast.updated': 'Voyage mis à jour !',
  'dashboard.toast.updateError': 'Impossible de mettre à jour le voyage',
  'dashboard.toast.deleted': 'Voyage supprimé',
  'dashboard.toast.deleteError': 'Impossible de supprimer le voyage',
  'dashboard.toast.archived': 'Voyage archivé',
  'dashboard.toast.archiveError': "Impossible d'archiver le voyage",
  'dashboard.toast.restored': 'Voyage restauré',
  'dashboard.toast.restoreError': 'Impossible de restaurer le voyage',
  'dashboard.toast.copied': 'Voyage copié !',
  'dashboard.toast.copyError': 'Impossible de copier le voyage',
  'dashboard.confirm.delete': 'Supprimer le voyage « {title} » ? Tous les lieux et plans seront définitivement supprimés.',
  'dashboard.editTrip': 'Modifier le voyage',
  'dashboard.createTrip': 'Créer un nouveau voyage',
  'dashboard.tripTitle': 'Titre',
  'dashboard.tripTitlePlaceholder': 'ex. Été au Japon',
  'dashboard.tripDescription': 'Description',
  'dashboard.tripDescriptionPlaceholder': 'De quoi parle ce voyage ?',
  'dashboard.startDate': 'Date de début',
  'dashboard.endDate': 'Date de fin',
  'dashboard.dayCount': 'Nombre de jours',
  'dashboard.dayCountHint': 'Nombre de jours à planifier lorsqu\'aucune date de voyage n\'est définie.',
  'dashboard.noDateHint': 'Aucune date définie — 7 jours par défaut seront créés. Vous pouvez modifier cela à tout moment.',
  'dashboard.coverImage': 'Image de couverture',
  'dashboard.addCoverImage': 'Ajouter une image de couverture',
  'dashboard.addMembers': 'Compagnons de voyage',
  'dashboard.addMember': 'Ajouter un membre',
  'dashboard.coverSaved': 'Image de couverture enregistrée',
  'dashboard.coverUploadError': 'Échec de l\'import',
  'dashboard.coverRemoveError': 'Échec de la suppression',
  'dashboard.titleRequired': 'Le titre est obligatoire',
  'dashboard.endDateError': 'La date de fin doit être postérieure à la date de début',

  // Settings
  'settings.title': 'Paramètres',
  'settings.subtitle': 'Configurez vos paramètres personnels',
  'settings.tabs.display': 'Affichage',
  'settings.tabs.map': 'Carte',
  'settings.tabs.notifications': 'Notifications',
  'settings.tabs.integrations': 'Intégrations',
  'settings.tabs.account': 'Compte',
  'settings.tabs.offline': 'Offline',
  'settings.tabs.about': 'À propos',
  'settings.map': 'Carte',
  'settings.mapTemplate': 'Modèle de carte',
  'settings.mapTemplatePlaceholder.select': 'Sélectionner un modèle…',
  'settings.mapDefaultHint': 'Laissez vide pour OpenStreetMap (par défaut)',
  'settings.mapTemplatePlaceholder': 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',
  'settings.mapHint': 'Modèle d\'URL pour les tuiles de carte',
  'settings.mapProvider': 'Fournisseur de carte',
  'settings.mapProviderHint': 'Affecte les cartes Trip Planner et Journey. Atlas utilise toujours Leaflet.',
  'settings.mapLeafletSubtitle': 'Classique 2D, toutes tuiles raster',
  'settings.mapMapboxSubtitle': 'Tuiles vectorielles, bâtiments 3D & terrain',
  'settings.mapExperimental': 'Expérimental',
  'settings.mapMapboxToken': 'Jeton d\'accès Mapbox',
  'settings.mapMapboxTokenHint': 'Jeton public (pk.*) depuis',
  'settings.mapMapboxTokenLink': 'mapbox.com → Jetons d\'accès',
  'settings.mapStyle': 'Style de carte',
  'settings.mapStylePlaceholder': 'Sélectionner un style Mapbox',
  'settings.mapStyleHint': 'Preset ou votre propre URL mapbox://styles/USER/ID',
  'settings.map3dBuildings': 'Bâtiments 3D & terrain',
  'settings.map3dHint': 'Inclinaison + extrusions 3D réelles des bâtiments — fonctionne avec tous les styles, y compris satellite.',
  'settings.mapHighQuality': 'Mode haute qualité',
  'settings.mapHighQualityHint': 'Anticrénelage + projection globe pour des bords plus nets et une vue réaliste du monde.',
  'settings.mapHighQualityWarning': 'Peut affecter les performances sur les appareils moins puissants.',
  'settings.mapTipLabel': 'Astuce :',
  'settings.mapTip': 'Clic droit et glisser pour pivoter/incliner la carte. Clic milieu pour ajouter un lieu (le clic droit est réservé à la rotation).',
  'settings.latitude': 'Latitude',
  'settings.longitude': 'Longitude',
  'settings.saveMap': 'Enregistrer la carte',
  'settings.apiKeys': 'Clés API',
  'settings.mapsKey': 'Clé API Google Maps',
  'settings.mapsKeyHint': 'Pour la recherche de lieux. Nécessite l\'API Places (New). Obtenez-la sur console.cloud.google.com',
  'settings.weatherKey': 'Clé API OpenWeatherMap',
  'settings.weatherKeyHint': 'Pour les données météo. Gratuit sur openweathermap.org/api',
  'settings.keyPlaceholder': 'Saisir la clé…',
  'settings.configured': 'Configuré',
  'settings.saveKeys': 'Enregistrer les clés',
  'settings.display': 'Affichage',
  'settings.colorMode': 'Mode de couleur',
  'settings.light': 'Clair',
  'settings.dark': 'Sombre',
  'settings.auto': 'Auto',
  'settings.language': 'Langue',
  'settings.temperature': 'Unité de température',
  'settings.timeFormat': 'Format de l\'heure',
  'settings.routeCalculation': 'Calcul d\'itinéraire',
  'settings.blurBookingCodes': 'Masquer les codes de réservation',
  'settings.notifications': 'Notifications',
  'settings.notifyTripInvite': 'Invitations de voyage',
  'settings.notifyBookingChange': 'Modifications de réservation',
  'settings.notifyTripReminder': 'Rappels de voyage',
  'settings.notifyTodoDue': 'Tâche à échéance',
  'settings.notifyVacayInvite': 'Invitations de fusion Vacay',
  'settings.notifyPhotosShared': 'Photos partagées (Immich)',
  'settings.notifyCollabMessage': 'Messages de chat (Collab)',
  'settings.notifyPackingTagged': 'Liste de bagages : attributions',
  'settings.notifyWebhook': 'Notifications webhook',
  'settings.notificationsDisabled': 'Les notifications ne sont pas configurées. Demandez à un administrateur d\'activer les notifications par e-mail ou webhook.',
  'settings.notificationsActive': 'Canal actif',
  'settings.notificationsManagedByAdmin': 'Les événements de notification sont configurés par votre administrateur.',
  'admin.notifications.title': 'Notifications',
  'admin.notifications.hint': 'Choisissez un canal de notification. Un seul peut être actif à la fois.',
  'admin.notifications.none': 'Désactivé',
  'admin.notifications.email': 'E-mail (SMTP)',
  'admin.notifications.webhook': 'Webhook',
  'admin.notifications.save': 'Enregistrer les paramètres de notification',
  'admin.notifications.saved': 'Paramètres de notification enregistrés',
  'admin.notifications.testWebhook': 'Envoyer un webhook de test',
  'admin.notifications.testWebhookSuccess': 'Webhook de test envoyé avec succès',
  'admin.notifications.testWebhookFailed': 'Échec du webhook de test',
  'admin.smtp.title': 'E-mail et notifications',
  'admin.smtp.hint': 'Configuration SMTP pour l\'envoi des notifications par e-mail.',
  'admin.smtp.testButton': 'Envoyer un e-mail de test',
  'admin.webhook.hint': 'Envoyer des notifications vers un webhook externe (Discord, Slack, etc.).',
  'admin.smtp.testSuccess': 'E-mail de test envoyé avec succès',
  'admin.smtp.testFailed': 'Échec de l\'e-mail de test',
  'dayplan.icsTooltip': 'Exporter le calendrier (ICS)',
  'share.linkTitle': 'Lien public',
  'share.linkHint': 'Créez un lien que n\'importe qui peut utiliser pour consulter ce voyage sans se connecter. Lecture seule — aucune modification possible.',
  'share.createLink': 'Créer un lien',
  'share.deleteLink': 'Supprimer le lien',
  'share.createError': 'Impossible de créer le lien',
  'common.copy': 'Copier',
  'common.copied': 'Copié',
  'share.permMap': 'Carte et plan',
  'share.permBookings': 'Réservations',
  'share.permPacking': 'Bagages',
  'shared.expired': 'Lien expiré ou invalide',
  'shared.expiredHint': 'Ce lien de partage n\'est plus actif.',
  'shared.readOnly': 'Vue en lecture seule',
  'shared.tabPlan': 'Plan',
  'shared.tabBookings': 'Réservations',
  'shared.tabPacking': 'Bagages',
  'shared.tabBudget': 'Budget',
  'shared.tabChat': 'Chat',
  'shared.days': 'jours',
  'shared.places': 'lieux',
  'shared.other': 'Autre',
  'shared.totalBudget': 'Budget total',
  'shared.messages': 'messages',
  'shared.sharedVia': 'Partagé via',
  'shared.confirmed': 'Confirmé',
  'shared.pending': 'En attente',
  'share.permBudget': 'Budget',
  'share.permCollab': 'Chat',
  'settings.on': 'Activé',
  'settings.off': 'Désactivé',
  'settings.mcp.title': 'Configuration MCP',
  'settings.mcp.endpoint': 'Point de terminaison MCP',
  'settings.mcp.clientConfig': 'Configuration du client',
  'settings.mcp.clientConfigHint': 'Remplacez <your_token> par un token API de la liste ci-dessous. Le chemin vers npx devra peut-être être ajusté selon votre système (ex. C:\\PROGRA~1\\nodejs\\npx.cmd sous Windows).',
  'settings.mcp.clientConfigHintOAuth': 'Remplacez <your_client_id> et <your_client_secret> par les identifiants affichés dans le client OAuth 2.1 créé ci-dessus. mcp-remote ouvrira votre navigateur pour finaliser l\'autorisation lors de la première connexion. Le chemin vers npx devra peut-être être ajusté selon votre système (ex. C:\\PROGRA~1\\nodejs\\npx.cmd sous Windows).',
  'settings.mcp.copy': 'Copier',
  'settings.mcp.copied': 'Copié !',
  'settings.mcp.apiTokens': 'Tokens API',
  'settings.mcp.createToken': 'Créer un token',
  'settings.mcp.noTokens': 'Aucun token pour l\'instant. Créez-en un pour connecter des clients MCP.',
  'settings.mcp.tokenCreatedAt': 'Créé',
  'settings.mcp.tokenUsedAt': 'Utilisé',
  'settings.mcp.deleteTokenTitle': 'Supprimer le token',
  'settings.mcp.deleteTokenMessage': 'Ce token cessera de fonctionner immédiatement. Tout client MCP l\'utilisant perdra l\'accès.',
  'settings.mcp.modal.createTitle': 'Créer un token API',
  'settings.mcp.modal.tokenName': 'Nom du token',
  'settings.mcp.modal.tokenNamePlaceholder': 'ex. Claude Desktop, Ordinateur pro',
  'settings.mcp.modal.creating': 'Création…',
  'settings.mcp.modal.create': 'Créer le token',
  'settings.mcp.modal.createdTitle': 'Token créé',
  'settings.mcp.modal.createdWarning': 'Ce token ne sera affiché qu\'une seule fois. Copiez-le et conservez-le maintenant — il ne pourra pas être récupéré.',
  'settings.mcp.modal.done': 'Terminé',
  'settings.mcp.toast.created': 'Token créé',
  'settings.mcp.toast.createError': 'Impossible de créer le token',
  'settings.mcp.toast.deleted': 'Token supprimé',
  'settings.mcp.toast.deleteError': 'Impossible de supprimer le token',
  'settings.mcp.apiTokensDeprecated': 'Les tokens API sont dépréciés et seront supprimés dans une prochaine version. Veuillez utiliser les clients OAuth 2.1 à la place.',
  'settings.oauth.clients': 'Clients OAuth 2.1',
  'settings.oauth.clientsHint': 'Enregistrez des clients OAuth 2.1 pour permettre à des applications MCP tierces (Claude Web, Cursor, etc.) de se connecter sans tokens statiques.',
  'settings.oauth.createClient': 'Nouveau client',
  'settings.oauth.noClients': 'Aucun client OAuth enregistré.',
  'settings.oauth.clientId': 'ID client',
  'settings.oauth.clientSecret': 'Secret client',
  'settings.oauth.deleteClient': 'Supprimer le client',
  'settings.oauth.deleteClientMessage': 'Ce client et toutes les sessions actives seront définitivement supprimés. Toute application l\'utilisant perdra immédiatement l\'accès.',
  'settings.oauth.rotateSecret': 'Renouveler le secret',
  'settings.oauth.rotateSecretMessage': 'Un nouveau secret client sera généré et toutes les sessions existantes seront immédiatement invalidées. Mettez à jour votre application avant de fermer cette fenêtre.',
  'settings.oauth.rotateSecretConfirm': 'Renouveler',
  'settings.oauth.rotateSecretConfirming': 'Renouvellement…',
  'settings.oauth.rotateSecretDoneTitle': 'Nouveau secret généré',
  'settings.oauth.rotateSecretDoneWarning': 'Ce secret n\'est affiché qu\'une seule fois. Copiez-le maintenant et mettez à jour votre application — toutes les sessions précédentes ont été invalidées.',
  'settings.oauth.activeSessions': 'Sessions OAuth actives',
  'settings.oauth.sessionScopes': 'Portées',
  'settings.oauth.sessionExpires': 'Expire',
  'settings.oauth.revoke': 'Révoquer',
  'settings.oauth.revokeSession': 'Révoquer la session',
  'settings.oauth.revokeSessionMessage': 'Cela révoquera immédiatement l\'accès pour cette session OAuth.',
  'settings.oauth.modal.createTitle': 'Enregistrer un client OAuth',
  'settings.oauth.modal.presets': 'Préréglages rapides',
  'settings.oauth.modal.clientName': 'Nom de l\'application',
  'settings.oauth.modal.clientNamePlaceholder': 'ex. Claude Web, Mon app MCP',
  'settings.oauth.modal.redirectUris': 'URIs de redirection',
  'settings.oauth.modal.redirectUrisPlaceholder': 'https://your-app.com/callback\nhttps://your-app.com/auth',
  'settings.oauth.modal.redirectUrisHint': 'Une URI par ligne. HTTPS requis (localhost exempté). Correspondance exacte.',
  'settings.oauth.modal.scopes': 'Portées autorisées',
  'settings.oauth.modal.scopesHint': 'list_trips et get_trip_summary sont toujours disponibles — aucune portée requise. Ils permettent à l\'IA de découvrir les IDs de voyage nécessaires.',
  'settings.oauth.modal.selectAll': 'Tout sélectionner',
  'settings.oauth.modal.deselectAll': 'Tout désélectionner',
  'settings.oauth.modal.creating': 'Enregistrement…',
  'settings.oauth.modal.create': 'Enregistrer le client',
  'settings.oauth.modal.createdTitle': 'Client enregistré',
  'settings.oauth.modal.createdWarning': 'Le secret client n\'est affiché qu\'une seule fois. Copiez-le maintenant — il ne peut pas être récupéré.',
  'settings.oauth.toast.createError': 'Impossible d\'enregistrer le client OAuth',
  'settings.oauth.toast.deleted': 'Client OAuth supprimé',
  'settings.oauth.toast.deleteError': 'Impossible de supprimer le client OAuth',
  'settings.oauth.toast.revoked': 'Session révoquée',
  'settings.oauth.toast.revokeError': 'Impossible de révoquer la session',
  'settings.oauth.toast.rotateError': 'Impossible de renouveler le secret client',
  'settings.account': 'Compte',
  'settings.about': 'À propos',
  'settings.about.reportBug': 'Signaler un bug',
  'settings.about.reportBugHint': 'Un problème ? Faites-le nous savoir',
  'settings.about.featureRequest': 'Proposer une fonctionnalité',
  'settings.about.featureRequestHint': 'Suggérez une nouvelle fonctionnalité',
  'settings.about.wikiHint': 'Documentation et guides',
  'settings.about.supporters.badge': 'Soutiens Mensuels',
  'settings.about.supporters.title': 'Compagnons de voyage pour TREK',
  'settings.about.supporters.subtitle': 'Pendant que tu planifies ton prochain itinéraire, ces personnes aident à planifier l\'avenir de TREK. Leur contribution mensuelle va directement au développement et aux heures réellement passées — pour que TREK reste Open Source.',
  'settings.about.supporters.since': 'soutien depuis {date}',
  'settings.about.supporters.tierEmpty': 'Sois le premier',
  'settings.about.supporter.tier.noReturnTicket': 'No Return Ticket',
  'settings.about.supporter.tier.lostLuggageVip': 'Lost Luggage VIP',
  'settings.about.supporter.tier.businessClassDreamer': 'Business Class Dreamer',
  'settings.about.supporter.tier.budgetTraveller': 'Budget Traveller',
  'settings.about.supporter.tier.hostelBunkmate': 'Hostel Bunkmate',
  'settings.about.description': 'TREK est un planificateur de voyage auto-hébergé qui vous aide à organiser vos voyages de la première idée au dernier souvenir. Planification journalière, budget, listes de bagages, photos et bien plus — le tout au même endroit, sur votre propre serveur.',
  'settings.about.madeWith': 'Fait avec',
  'settings.about.madeBy': 'par Maurice et une communauté open-source grandissante.',
  'settings.username': 'Nom d\'utilisateur',
  'settings.email': 'E-mail',
  'settings.role': 'Rôle',
  'settings.roleAdmin': 'Administrateur',
  'settings.oidcLinked': 'Lié avec',
  'settings.changePassword': 'Changer le mot de passe',
  'settings.mustChangePassword': 'Vous devez changer votre mot de passe avant de continuer. Veuillez définir un nouveau mot de passe ci-dessous.',
  'settings.currentPassword': 'Mot de passe actuel',
  'settings.currentPasswordRequired': 'Le mot de passe actuel est requis',
  'settings.newPassword': 'Nouveau mot de passe',
  'settings.confirmPassword': 'Confirmer le nouveau mot de passe',
  'settings.updatePassword': 'Mettre à jour le mot de passe',
  'settings.passwordRequired': 'Veuillez saisir le mot de passe actuel et le nouveau',
  'settings.passwordTooShort': 'Le mot de passe doit comporter au moins 8 caractères',
  'settings.passwordMismatch': 'Les mots de passe ne correspondent pas',
  'settings.passwordWeak': 'Le mot de passe doit contenir des majuscules, des minuscules, un chiffre et un caractère spécial',
  'settings.passwordChanged': 'Mot de passe modifié avec succès',
  'settings.deleteAccount': 'Supprimer le compte',
  'settings.deleteAccountTitle': 'Supprimer votre compte ?',
  'settings.deleteAccountWarning': 'Votre compte ainsi que tous vos voyages, lieux et fichiers seront définitivement supprimés. Cette action est irréversible.',
  'settings.deleteAccountConfirm': 'Supprimer définitivement',
  'settings.deleteBlockedTitle': 'Suppression impossible',
  'settings.deleteBlockedMessage': 'Vous êtes le seul administrateur. Promouvez un autre utilisateur en tant qu\'administrateur avant de supprimer votre compte.',
  'settings.roleUser': 'Utilisateur',
  'settings.saveProfile': 'Enregistrer le profil',
  'settings.mfa.title': 'Authentification à deux facteurs (2FA)',
  'settings.mfa.description': 'Ajoute une étape supplémentaire lors de la connexion. Utilisez une application d\'authentification (Google Authenticator, Authy, etc.).',
  'settings.mfa.requiredByPolicy': 'Votre administrateur exige l\'authentification à deux facteurs. Configurez une application d\'authentification ci-dessous avant de continuer.',
  'settings.mfa.backupTitle': 'Codes de secours',
  'settings.mfa.backupDescription': 'Utilisez ces codes à usage unique si vous perdez l\'accès à votre application d\'authentification.',
  'settings.mfa.backupWarning': 'Enregistrez ces codes maintenant. Chaque code n\'est utilisable qu\'une seule fois.',
  'settings.mfa.backupCopy': 'Copier les codes',
  'settings.mfa.backupDownload': 'Télécharger TXT',
  'settings.mfa.backupPrint': 'Imprimer / PDF',
  'settings.mfa.backupCopied': 'Codes de secours copiés',
  'settings.mfa.enabled': '2FA est activé sur votre compte.',
  'settings.mfa.disabled': '2FA n\'est pas activé.',
  'settings.mfa.setup': 'Configurer l\'authentificateur',
  'settings.mfa.scanQr': 'Scannez ce code QR avec votre application ou entrez la clé manuellement.',
  'settings.mfa.secretLabel': 'Clé secrète (saisie manuelle)',
  'settings.mfa.codePlaceholder': 'Code à 6 chiffres',
  'settings.mfa.enable': 'Activer 2FA',
  'settings.mfa.cancelSetup': 'Annuler',
  'settings.mfa.disableTitle': 'Désactiver 2FA',
  'settings.mfa.disableHint': 'Entrez votre mot de passe et un code actuel de votre authentificateur.',
  'settings.mfa.disable': 'Désactiver 2FA',
  'settings.mfa.toastEnabled': 'Authentification à deux facteurs activée',
  'settings.mfa.toastDisabled': 'Authentification à deux facteurs désactivée',
  'settings.mfa.demoBlocked': 'Non disponible en mode démo',
  'settings.toast.mapSaved': 'Paramètres de carte enregistrés',
  'settings.toast.keysSaved': 'Clés API enregistrées',
  'settings.toast.displaySaved': 'Paramètres d\'affichage enregistrés',
  'settings.toast.profileSaved': 'Profil enregistré',
  'settings.uploadAvatar': 'Importer une photo de profil',
  'settings.removeAvatar': 'Supprimer la photo de profil',
  'settings.avatarUploaded': 'Photo de profil mise à jour',
  'settings.avatarRemoved': 'Photo de profil supprimée',
  'settings.avatarError': 'Échec de l\'import',

  // Login
  'login.error': 'Échec de la connexion. Veuillez vérifier vos identifiants.',
  'login.tagline': 'Vos voyages.\nVotre organisation.',
  'login.description': 'Planifiez vos voyages en collaboration avec des cartes interactives, des budgets et la synchronisation en temps réel.',
  'login.features.maps': 'Cartes interactives',
  'login.features.mapsDesc': 'Google Places, itinéraires et regroupement',
  'login.features.realtime': 'Synchronisation en temps réel',
  'login.features.realtimeDesc': 'Planifiez ensemble via WebSocket',
  'login.features.budget': 'Suivi du budget',
  'login.features.budgetDesc': 'Catégories, graphiques et coûts par personne',
  'login.features.collab': 'Collaboration',
  'login.features.collabDesc': 'Multi-utilisateurs avec voyages partagés',
  'login.features.packing': 'Listes de bagages',
  'login.features.packingDesc': 'Catégories, progression et suggestions',
  'login.features.bookings': 'Réservations',
  'login.features.bookingsDesc': 'Vols, hôtels, restaurants et plus',
  'login.features.files': 'Documents',
  'login.features.filesDesc': 'Importez et gérez vos documents',
  'login.features.routes': 'Itinéraires intelligents',
  'login.features.routesDesc': 'Optimisation automatique et export Google Maps',
  'login.selfHosted': 'Auto-hébergé · Open Source · Vos données restent les vôtres',
  'login.title': 'Connexion',
  'login.subtitle': 'Bon retour',
  'login.signingIn': 'Connexion en cours…',
  'login.signIn': 'Se connecter',
  'login.createAdmin': 'Créer un compte administrateur',
  'login.createAdminHint': 'Configurez le premier compte administrateur pour TREK.',
  'login.setNewPassword': 'Définir un nouveau mot de passe',
  'login.setNewPasswordHint': 'Vous devez changer votre mot de passe avant de continuer.',
  'login.createAccount': 'Créer un compte',
  'login.createAccountHint': 'Créez un nouveau compte.',
  'login.creating': 'Création…',
  'login.noAccount': 'Pas encore de compte ?',
  'login.hasAccount': 'Vous avez déjà un compte ?',
  'login.register': 'S\'inscrire',
  'login.emailPlaceholder': 'votre@email.com',
  'login.username': 'Nom d\'utilisateur',
  'login.oidc.registrationDisabled': 'Les inscriptions sont désactivées. Contactez votre administrateur.',
  'login.oidc.noEmail': 'Aucun e-mail reçu du fournisseur.',
  'login.mfaTitle': 'Authentification à deux facteurs',
  'login.mfaSubtitle': 'Entrez le code à 6 chiffres de votre application d\'authentification.',
  'login.mfaCodeLabel': 'Code de vérification',
  'login.mfaCodeRequired': 'Entrez le code de votre application d\'authentification.',
  'login.mfaHint': 'Ouvrez Google Authenticator, Authy ou une autre application TOTP.',
  'login.mfaBack': '← Retour à la connexion',
  'login.mfaVerify': 'Vérifier',
  'login.invalidInviteLink': 'Lien d\'invitation invalide ou expiré',
  'login.oidcFailed': 'Échec de connexion OIDC',
  'login.usernameRequired': 'Le nom d\'utilisateur est obligatoire',
  'login.passwordMinLength': 'Le mot de passe doit comporter au moins 8 caractères',
  'login.forgotPassword': 'Mot de passe oublié ?',
  'login.forgotPasswordTitle': 'Réinitialiser votre mot de passe',
  'login.forgotPasswordBody': 'Entrez l\'adresse e-mail associée à votre compte. Si un compte existe, nous enverrons un lien de réinitialisation.',
  'login.forgotPasswordSubmit': 'Envoyer le lien',
  'login.forgotPasswordSentTitle': 'Vérifiez vos e-mails',
  'login.forgotPasswordSentBody': 'Si un compte existe pour cette adresse, un lien de réinitialisation est en route. Il expire dans 60 minutes.',
  'login.forgotPasswordSmtpHintOff': 'Remarque : votre administrateur n\'a pas configuré SMTP. Le lien de réinitialisation sera écrit dans la console du serveur au lieu d\'être envoyé par e-mail.',
  'login.backToLogin': 'Retour à la connexion',
  'login.newPassword': 'Nouveau mot de passe',
  'login.confirmPassword': 'Confirmer le nouveau mot de passe',
  'login.passwordsDontMatch': 'Les mots de passe ne correspondent pas',
  'login.mfaCode': 'Code 2FA',
  'login.resetPasswordTitle': 'Définir un nouveau mot de passe',
  'login.resetPasswordBody': 'Choisissez un mot de passe fort que vous n\'avez pas encore utilisé ici. 8 caractères minimum.',
  'login.resetPasswordMfaBody': 'Entrez votre code 2FA ou un code de secours pour finaliser la réinitialisation.',
  'login.resetPasswordSubmit': 'Réinitialiser',
  'login.resetPasswordVerify': 'Vérifier et réinitialiser',
  'login.resetPasswordSuccessTitle': 'Mot de passe mis à jour',
  'login.resetPasswordSuccessBody': 'Vous pouvez maintenant vous connecter avec votre nouveau mot de passe.',
  'login.resetPasswordInvalidLink': 'Lien de réinitialisation invalide',
  'login.resetPasswordInvalidLinkBody': 'Ce lien est manquant ou invalide. Demandez-en un nouveau pour continuer.',
  'login.resetPasswordFailed': 'Échec de la réinitialisation. Le lien a peut-être expiré.',
  'login.oidc.tokenFailed': 'L\'authentification a échoué.',
  'login.oidc.invalidState': 'Session invalide. Veuillez réessayer.',
  'login.demoFailed': 'Échec de la connexion démo',
  'login.oidcSignIn': 'Se connecter avec {name}',
  'login.oidcOnly': 'L\'authentification par mot de passe est désactivée. Veuillez vous connecter via votre fournisseur SSO.',
  'login.oidcLoggedOut': 'Vous avez été déconnecté. Reconnectez-vous via votre fournisseur SSO.',
  'login.demoHint': 'Essayez la démo — aucune inscription nécessaire',

  // Register
  'register.passwordMismatch': 'Les mots de passe ne correspondent pas',
  'register.passwordTooShort': 'Le mot de passe doit comporter au moins 8 caractères',
  'register.failed': 'Échec de l\'inscription',
  'register.getStarted': 'Commencer',
  'register.subtitle': 'Créez un compte et commencez à planifier vos voyages de rêve.',
  'register.feature1': 'Plans de voyage illimités',
  'register.feature2': 'Vue carte interactive',
  'register.feature3': 'Gérez les lieux et catégories',
  'register.feature4': 'Suivez les réservations',
  'register.feature5': 'Créez des listes de bagages',
  'register.feature6': 'Stockez photos et fichiers',
  'register.createAccount': 'Créer un compte',
  'register.startPlanning': 'Commencez à planifier vos voyages',
  'register.minChars': 'Min. 6 caractères',
  'register.confirmPassword': 'Confirmer le mot de passe',
  'register.repeatPassword': 'Répéter le mot de passe',
  'register.registering': 'Inscription en cours…',
  'register.register': 'S\'inscrire',
  'register.hasAccount': 'Vous avez déjà un compte ?',
  'register.signIn': 'Se connecter',

  // Admin
  'admin.title': 'Administration',
  'admin.subtitle': 'Gestion des utilisateurs et paramètres système',
  'admin.tabs.users': 'Utilisateurs',
  'admin.tabs.categories': 'Catégories',
  'admin.tabs.backup': 'Sauvegarde',
  'admin.stats.users': 'Utilisateurs',
  'admin.stats.trips': 'Voyages',
  'admin.stats.places': 'Lieux',
  'admin.stats.photos': 'Photos',
  'admin.stats.files': 'Fichiers',
  'admin.table.user': 'Utilisateur',
  'admin.table.email': 'E-mail',
  'admin.table.role': 'Rôle',
  'admin.table.created': 'Créé le',
  'admin.table.lastLogin': 'Dernière connexion',
  'admin.table.actions': 'Actions',
  'admin.you': '(Vous)',
  'admin.editUser': 'Modifier l\'utilisateur',
  'admin.newPassword': 'Nouveau mot de passe',
  'admin.newPasswordHint': 'Laissez vide pour conserver le mot de passe actuel',
  'admin.deleteUser': 'Supprimer l\'utilisateur « {name} » ? Tous les voyages seront définitivement supprimés.',
  'admin.deleteUserTitle': 'Supprimer l\'utilisateur',
  'admin.newPasswordPlaceholder': 'Saisir le nouveau mot de passe…',
  'admin.toast.loadError': 'Impossible de charger les données d\'administration',
  'admin.toast.userUpdated': 'Utilisateur mis à jour',
  'admin.toast.updateError': 'Échec de la mise à jour',
  'admin.toast.userDeleted': 'Utilisateur supprimé',
  'admin.toast.deleteError': 'Échec de la suppression',
  'admin.toast.cannotDeleteSelf': 'Impossible de supprimer votre propre compte',
  'admin.toast.userCreated': 'Utilisateur créé',
  'admin.toast.createError': 'Échec de la création de l\'utilisateur',
  'admin.toast.fieldsRequired': 'Le nom d\'utilisateur, l\'e-mail et le mot de passe sont requis',
  'admin.createUser': 'Créer un utilisateur',
  'admin.invite.title': 'Liens d\'invitation',
  'admin.invite.subtitle': 'Créer des liens d\'inscription à usage unique',
  'admin.invite.create': 'Créer un lien',
  'admin.invite.createAndCopy': 'Créer et copier',
  'admin.invite.empty': 'Aucun lien d\'invitation créé',
  'admin.invite.maxUses': 'Utilisations max.',
  'admin.invite.expiry': 'Expire après',
  'admin.invite.uses': 'utilisé(s)',
  'admin.invite.expiresAt': 'expire le',
  'admin.invite.createdBy': 'par',
  'admin.invite.active': 'Actif',
  'admin.invite.expired': 'Expiré',
  'admin.invite.usedUp': 'Épuisé',
  'admin.invite.copied': 'Lien d\'invitation copié',
  'admin.invite.copyLink': 'Copier le lien',
  'admin.invite.deleted': 'Lien d\'invitation supprimé',
  'admin.invite.createError': 'Erreur lors de la création du lien',
  'admin.invite.deleteError': 'Erreur lors de la suppression du lien',
  'admin.tabs.settings': 'Paramètres',
  'admin.allowRegistration': 'Autoriser les inscriptions',
  'admin.allowRegistrationHint': 'Les nouveaux utilisateurs peuvent s\'inscrire eux-mêmes',
  'admin.authMethods': 'Authentication Methods',
  'admin.passwordLogin': 'Password Login',
  'admin.passwordLoginHint': 'Allow users to sign in with email and password',
  'admin.passwordRegistration': 'Password Registration',
  'admin.passwordRegistrationHint': 'Allow new users to register with email and password',
  'admin.oidcLogin': 'SSO Login',
  'admin.oidcLoginHint': 'Allow users to sign in with SSO',
  'admin.oidcRegistration': 'SSO Auto-Provisioning',
  'admin.oidcRegistrationHint': 'Automatically create accounts for new SSO users',
  'admin.envOverrideHint': 'Password login settings are controlled by the OIDC_ONLY environment variable and cannot be changed here.',
  'admin.lockoutWarning': 'At least one login method must remain enabled',
  'admin.requireMfa': 'Exiger l\'authentification à deux facteurs (2FA)',
  'admin.requireMfaHint': 'Les utilisateurs sans 2FA doivent terminer la configuration dans Paramètres avant d\'utiliser l\'application.',
  'admin.apiKeys': 'Clés API',
  'admin.apiKeysHint': 'Facultatif. Active les données de lieu étendues comme les photos et la météo.',
  'admin.mapsKey': 'Clé API Google Maps',
  'admin.mapsKeyHint': 'Requise pour la recherche de lieux. Obtenez-la sur console.cloud.google.com',
  'admin.mapsKeyHintLong': 'Sans clé API, OpenStreetMap est utilisé pour la recherche de lieux. Avec une clé Google API, les photos, notes et horaires d\'ouverture peuvent également être chargés. Obtenez-en une sur console.cloud.google.com.',
  'admin.recommended': 'Recommandé',
  'admin.weatherKey': 'Clé API OpenWeatherMap',
  'admin.weatherKeyHint': 'Pour les données météo. Gratuit sur openweathermap.org',
  'admin.validateKey': 'Tester',
  'admin.keyValid': 'Connecté',
  'admin.keyInvalid': 'Invalide',
  'admin.keySaved': 'Clés API enregistrées',
  'admin.oidcTitle': 'Authentification unique (OIDC)',
  'admin.oidcSubtitle': 'Autorisez la connexion via des fournisseurs externes comme Google, Apple, Authentik ou Keycloak.',
  'admin.oidcDisplayName': 'Nom d\'affichage',
  'admin.oidcIssuer': 'URL de l\'émetteur',
  'admin.oidcIssuerHint': 'L\'URL de l\'émetteur OpenID Connect du fournisseur. ex. https://accounts.google.com',
  'admin.oidcSaved': 'Configuration OIDC enregistrée',
  'admin.oidcOnlyMode': 'Désactiver l\'authentification par mot de passe',
  'admin.oidcOnlyModeHint': 'Lorsqu\'activé, seule la connexion SSO est autorisée. La connexion et l\'inscription par mot de passe sont bloquées.',

  // File Types
  'admin.fileTypes': 'Types de fichiers autorisés',
  'admin.fileTypesHint': 'Configurez les types de fichiers que les utilisateurs peuvent importer.',
  'admin.fileTypesFormat': 'Extensions séparées par des virgules (ex. jpg,png,pdf,doc). Utilisez * pour autoriser tous les types.',
  'admin.fileTypesSaved': 'Paramètres des types de fichiers enregistrés',

  'admin.placesPhotos.title': 'Photos de lieux',
  'admin.placesPhotos.subtitle': "Récupère les photos depuis l'API Google Places. Désactivez pour économiser le quota API. Les photos Wikimedia ne sont pas affectées.",
  'admin.placesAutocomplete.title': 'Autocomplétion des lieux',
  'admin.placesAutocomplete.subtitle': "Utilise l'API Google Places pour les suggestions de recherche. Désactivez pour économiser le quota API.",
  'admin.placesDetails.title': 'Détails du lieu',
  'admin.placesDetails.subtitle': "Récupère les informations détaillées du lieu (horaires, note, site web) depuis l'API Google Places. Désactivez pour économiser le quota API.",
  'admin.bagTracking.title': 'Suivi des bagages',
  'admin.bagTracking.subtitle': 'Activer le poids et l\'attribution de bagages pour les articles',
  'admin.collab.chat.title': 'Chat',
  'admin.collab.chat.subtitle': 'Messagerie en temps réel pour la collaboration',
  'admin.collab.notes.title': 'Notes',
  'admin.collab.notes.subtitle': 'Notes et documents partagés',
  'admin.collab.polls.title': 'Sondages',
  'admin.collab.polls.subtitle': 'Sondages et votes de groupe',
  'admin.collab.whatsnext.title': 'Et ensuite',
  'admin.collab.whatsnext.subtitle': "Suggestions d'activités et prochaines étapes",
  'admin.tabs.config': 'Personnalisation',
  'admin.tabs.defaults': 'Valeurs par défaut',
  'admin.defaultSettings.title': 'Paramètres utilisateur par défaut',
  'admin.defaultSettings.description': "Définissez des valeurs par défaut pour toute l'instance. Les utilisateurs n'ayant pas modifié un paramètre verront ces valeurs. Leurs propres modifications ont toujours la priorité.",
  'admin.defaultSettings.saved': 'Valeur par défaut enregistrée',
  'admin.defaultSettings.reset': 'Réinitialiser à la valeur par défaut intégrée',
  'admin.defaultSettings.resetToBuiltIn': 'réinitialiser',
  'admin.tabs.templates': 'Modèles de bagages',
  'admin.packingTemplates.title': 'Modèles de bagages',
  'admin.packingTemplates.subtitle': 'Créer des listes de bagages réutilisables pour vos voyages',
  'admin.packingTemplates.create': 'Nouveau modèle',
  'admin.packingTemplates.namePlaceholder': 'Nom du modèle (ex. Vacances à la plage)',
  'admin.packingTemplates.empty': 'Aucun modèle créé',
  'admin.packingTemplates.items': 'articles',
  'admin.packingTemplates.categories': 'catégories',
  'admin.packingTemplates.itemName': 'Nom de l\'article',
  'admin.packingTemplates.itemCategory': 'Catégorie',
  'admin.packingTemplates.categoryName': 'Nom de catégorie (ex. Vêtements)',
  'admin.packingTemplates.addCategory': 'Ajouter une catégorie',
  'admin.packingTemplates.created': 'Modèle créé',
  'admin.packingTemplates.deleted': 'Modèle supprimé',
  'admin.packingTemplates.loadError': 'Erreur de chargement des modèles',
  'admin.packingTemplates.createError': 'Erreur de création du modèle',
  'admin.packingTemplates.deleteError': 'Erreur de suppression du modèle',
  'admin.packingTemplates.saveError': 'Erreur de sauvegarde',

  // Addons
  'admin.tabs.addons': 'Extensions',
  'admin.addons.title': 'Extensions',
  'admin.addons.subtitle': 'Activez ou désactivez des fonctionnalités pour personnaliser votre expérience TREK.',
  'admin.addons.catalog.memories.name': 'Photos (Immich)',
  'admin.addons.catalog.memories.description': 'Partagez vos photos de voyage via votre instance Immich',
  'admin.addons.catalog.mcp.name': 'MCP',
  'admin.addons.catalog.mcp.description': 'Protocole de contexte de modèle pour l\'intégration d\'assistants IA',
  'admin.addons.catalog.packing.name': 'Listes',
  'admin.addons.catalog.packing.description': 'Listes de bagages et tâches à faire pour vos voyages',
  'admin.addons.catalog.budget.name': 'Budget',
  'admin.addons.catalog.budget.description': 'Suivez les dépenses et planifiez votre budget de voyage',
  'admin.addons.catalog.documents.name': 'Documents',
  'admin.addons.catalog.documents.description': 'Stockez et gérez vos documents de voyage',
  'admin.addons.catalog.vacay.name': 'Vacances',
  'admin.addons.catalog.vacay.description': 'Planificateur de vacances personnel avec vue calendrier',
  'admin.addons.catalog.atlas.name': 'Atlas',
  'admin.addons.catalog.atlas.description': 'Carte du monde avec pays visités et statistiques de voyage',
  'admin.addons.catalog.collab.name': 'Collaboration',
  'admin.addons.catalog.collab.description': 'Notes en temps réel, sondages et chat pour la planification de voyage',
  'admin.addons.subtitleBefore': 'Activez ou désactivez des fonctionnalités pour personnaliser votre expérience ',
  'admin.addons.subtitleAfter': '.',
  'admin.addons.enabled': 'Activé',
  'admin.addons.disabled': 'Désactivé',
  'admin.addons.type.trip': 'Voyage',
  'admin.addons.type.global': 'Global',
  'admin.addons.type.integration': 'Intégration',
  'admin.addons.tripHint': 'Disponible comme onglet dans chaque voyage',
  'admin.addons.globalHint': 'Disponible comme section autonome dans la navigation principale',
  'admin.addons.integrationHint': 'Services backend et intégrations API sans page dédiée',
  'admin.addons.toast.updated': 'Extension mise à jour',
  'admin.addons.toast.error': 'Échec de la mise à jour de l\'extension',
  'admin.addons.noAddons': 'Aucune extension disponible',
  // Weather info
  'admin.weather.title': 'Données météo',
  'admin.weather.badge': 'Depuis le 24 mars 2026',
  'admin.weather.description': 'TREK utilise Open-Meteo comme source de données météo. Open-Meteo est un service météo gratuit et open source — aucune clé API requise.',
  'admin.weather.forecast': 'Prévisions sur 16 jours',
  'admin.weather.forecastDesc': 'Auparavant 5 jours (OpenWeatherMap)',
  'admin.weather.climate': 'Données climatiques historiques',
  'admin.weather.climateDesc': 'Moyennes des 85 dernières années pour les jours au-delà des prévisions de 16 jours',
  'admin.weather.requests': '10 000 requêtes / jour',
  'admin.weather.requestsDesc': 'Gratuit, aucune clé API requise',
  'admin.weather.locationHint': 'La météo est basée sur le premier lieu avec des coordonnées de chaque jour. Si aucun lieu n\'est attribué à un jour, un lieu de la liste est utilisé comme référence.',

  'admin.tabs.audit': 'Audit',

  'admin.audit.subtitle': 'Événements sensibles de sécurité et d\'administration (sauvegardes, utilisateurs, 2FA, paramètres).',
  'admin.audit.empty': 'Aucune entrée d\'audit.',
  'admin.audit.refresh': 'Actualiser',
  'admin.audit.loadMore': 'Charger plus',
  'admin.audit.showing': '{count} chargées · {total} au total',
  'admin.audit.col.time': 'Heure',
  'admin.audit.col.user': 'Utilisateur',
  'admin.audit.col.action': 'Action',
  'admin.audit.col.resource': 'Ressource',
  'admin.audit.col.ip': 'IP',
  'admin.audit.col.details': 'Détails',

  // MCP Tokens
  'admin.tabs.mcpTokens': 'Accès MCP',
  'admin.mcpTokens.title': 'Accès MCP',
  'admin.mcpTokens.subtitle': 'Gérer les sessions OAuth et les tokens API de tous les utilisateurs',
  'admin.mcpTokens.sectionTitle': 'Tokens API',
  'admin.mcpTokens.owner': 'Propriétaire',
  'admin.mcpTokens.tokenName': 'Nom du token',
  'admin.mcpTokens.created': 'Créé',
  'admin.mcpTokens.lastUsed': 'Dernière utilisation',
  'admin.mcpTokens.never': 'Jamais',
  'admin.mcpTokens.empty': 'Aucun token MCP n\'a encore été créé',
  'admin.mcpTokens.deleteTitle': 'Supprimer le token',
  'admin.mcpTokens.deleteMessage': 'Ce token sera révoqué immédiatement. L\'utilisateur perdra l\'accès MCP via ce token.',
  'admin.mcpTokens.deleteSuccess': 'Token supprimé',
  'admin.mcpTokens.deleteError': 'Impossible de supprimer le token',
  'admin.mcpTokens.loadError': 'Impossible de charger les tokens',
  'admin.oauthSessions.sectionTitle': 'Sessions OAuth',
  'admin.oauthSessions.clientName': 'Client',
  'admin.oauthSessions.owner': 'Propriétaire',
  'admin.oauthSessions.scopes': 'Portées',
  'admin.oauthSessions.created': 'Créé',
  'admin.oauthSessions.empty': 'Aucune session OAuth active',
  'admin.oauthSessions.revokeTitle': 'Révoquer la session',
  'admin.oauthSessions.revokeMessage': 'Cette session OAuth sera révoquée immédiatement. Le client perdra l\'accès MCP.',
  'admin.oauthSessions.revokeSuccess': 'Session révoquée',
  'admin.oauthSessions.revokeError': 'Impossible de révoquer la session',
  'admin.oauthSessions.loadError': 'Impossible de charger les sessions OAuth',

  // GitHub
  'admin.tabs.github': 'GitHub',
  'admin.github.title': 'Historique des versions',
  'admin.github.subtitle': 'Dernières mises à jour de {repo}',
  'admin.github.latest': 'Dernière',
  'admin.github.prerelease': 'Pré-version',
  'admin.github.showDetails': 'Afficher les détails',
  'admin.github.hideDetails': 'Masquer les détails',
  'admin.github.loadMore': 'Charger plus',
  'admin.github.loading': 'Chargement…',
  'admin.github.support': 'Aidez à poursuivre le développement de TREK',
  'admin.github.error': 'Impossible de charger les versions',
  'admin.github.by': 'par',

  'admin.update.available': 'Mise à jour disponible',
  'admin.update.text': 'TREK {version} est disponible. Vous utilisez {current}.',
  'admin.update.button': 'Voir sur GitHub',
  'admin.update.install': 'Installer la mise à jour',
  'admin.update.confirmTitle': 'Installer la mise à jour ?',
  'admin.update.confirmText': 'TREK sera mis à jour de {current} vers {version}. Le serveur redémarrera automatiquement ensuite.',
  'admin.update.dataInfo': 'Toutes vos données (voyages, utilisateurs, clés API, importations, Vacances, Atlas, budgets) seront préservées.',
  'admin.update.warning': 'L\'application sera brièvement indisponible pendant le redémarrage.',
  'admin.update.confirm': 'Mettre à jour maintenant',
  'admin.update.installing': 'Mise à jour…',
  'admin.update.success': 'Mise à jour installée ! Le serveur redémarre…',
  'admin.update.failed': 'Échec de la mise à jour',
  'admin.update.backupHint': 'Nous recommandons de créer une sauvegarde avant la mise à jour.',
  'admin.update.backupLink': 'Aller aux sauvegardes',
  'admin.update.howTo': 'Comment mettre à jour',
  'admin.update.dockerText': 'Votre instance TREK fonctionne dans Docker. Pour mettre à jour vers {version}, exécutez les commandes suivantes sur votre serveur :',
  'admin.update.reloadHint': 'Veuillez recharger la page dans quelques secondes.',

  // Vacay addon
  'vacay.subtitle': 'Planifiez et gérez vos jours de congés',
  'vacay.settings': 'Paramètres',
  'vacay.year': 'Année',
  'vacay.addYear': 'Ajouter l\'année suivante',
  'vacay.addPrevYear': 'Ajouter l\'année précédente',
  'vacay.removeYear': 'Supprimer l\'année',
  'vacay.removeYearConfirm': 'Supprimer {year} ?',
  'vacay.removeYearHint': 'Toutes les entrées de vacances et jours fériés d\'entreprise de cette année seront définitivement supprimés.',
  'vacay.remove': 'Supprimer',
  'vacay.persons': 'Personnes',
  'vacay.noPersons': 'Aucune personne ajoutée',
  'vacay.addPerson': 'Ajouter une personne',
  'vacay.editPerson': 'Modifier la personne',
  'vacay.removePerson': 'Supprimer la personne',
  'vacay.removePersonConfirm': 'Supprimer {name} ?',
  'vacay.removePersonHint': 'Toutes les entrées de vacances de cette personne seront définitivement supprimées.',
  'vacay.personName': 'Nom',
  'vacay.personNamePlaceholder': 'Saisir le nom',
  'vacay.color': 'Couleur',
  'vacay.add': 'Ajouter',
  'vacay.legend': 'Légende',
  'vacay.publicHoliday': 'Jour férié',
  'vacay.companyHoliday': 'Jour férié d\'entreprise',
  'vacay.weekend': 'Week-end',
  'vacay.modeVacation': 'Vacances',
  'vacay.modeCompany': 'Jour férié d\'entreprise',
  'vacay.entitlement': 'Droits',
  'vacay.entitlementDays': 'Jours',
  'vacay.used': 'Utilisés',
  'vacay.remaining': 'Restants',
  'vacay.carriedOver': 'de {year}',
  'vacay.weekendDays': 'Jours de week-end',
  'vacay.mon': 'Lun',
  'vacay.tue': 'Mar',
  'vacay.wed': 'Mer',
  'vacay.thu': 'Jeu',
  'vacay.fri': 'Ven',
  'vacay.sat': 'Sam',
  'vacay.sun': 'Dim',
  'vacay.blockWeekends': 'Bloquer les week-ends',
  'vacay.blockWeekendsHint': 'Empêcher les entrées de vacances les samedis et dimanches',
  'vacay.publicHolidays': 'Jours fériés',
  'vacay.publicHolidaysHint': 'Marquer les jours fériés dans le calendrier',
  'vacay.selectCountry': 'Sélectionner un pays',
  'vacay.selectRegion': 'Sélectionner une région (facultatif)',
  'vacay.companyHolidays': 'Jours fériés d\'entreprise',
  'vacay.companyHolidaysHint': 'Autoriser le marquage des jours fériés d\'entreprise',
  'vacay.companyHolidaysNoDeduct': 'Les jours fériés d\'entreprise ne sont pas déduits des jours de vacances.',
  'vacay.weekStart': 'La semaine commence le',
  'vacay.weekStartHint': 'Choisissez si la semaine commence le lundi ou le dimanche',
  'vacay.carryOver': 'Report',
  'vacay.carryOverHint': 'Reporter automatiquement les jours de vacances restants à l\'année suivante',
  'vacay.sharing': 'Partage',
  'vacay.sharingHint': 'Partagez votre plan de vacances avec d\'autres utilisateurs TREK',
  'vacay.owner': 'Propriétaire',
  'vacay.shareEmailPlaceholder': 'E-mail de l\'utilisateur TREK',
  'vacay.shareSuccess': 'Plan partagé avec succès',
  'vacay.shareError': 'Impossible de partager le plan',
  'vacay.dissolve': 'Séparer les calendriers',
  'vacay.dissolveHint': 'Séparer à nouveau les calendriers. Vos entrées seront conservées.',
  'vacay.dissolveAction': 'Dissoudre',
  'vacay.dissolved': 'Calendrier séparé',
  'vacay.fusedWith': 'Partagé avec',
  'vacay.you': 'vous',
  'vacay.noData': 'Aucune donnée',
  'vacay.changeColor': 'Changer la couleur',
  'vacay.inviteUser': 'Inviter un utilisateur',
  'vacay.inviteHint': 'Invitez un autre utilisateur TREK à partager un calendrier de vacances combiné.',
  'vacay.selectUser': 'Sélectionner un utilisateur',
  'vacay.sendInvite': 'Envoyer l\'invitation',
  'vacay.inviteSent': 'Invitation envoyée',
  'vacay.inviteError': 'Impossible d\'envoyer l\'invitation',
  'vacay.pending': 'en attente',
  'vacay.noUsersAvailable': 'Aucun utilisateur disponible',
  'vacay.accept': 'Accepter',
  'vacay.decline': 'Refuser',
  'vacay.acceptFusion': 'Accepter et fusionner',
  'vacay.inviteTitle': 'Demande de fusion',
  'vacay.inviteWantsToFuse': 'souhaite partager un calendrier de vacances avec vous.',
  'vacay.fuseInfo1': 'Vous verrez tous les deux toutes les entrées de vacances dans un calendrier partagé.',
  'vacay.fuseInfo2': 'Les deux parties peuvent créer et modifier des entrées pour l\'autre.',
  'vacay.fuseInfo3': 'Les deux parties peuvent supprimer des entrées et modifier les droits aux vacances.',
  'vacay.fuseInfo4': 'Les paramètres comme les jours fériés et les jours d\'entreprise sont partagés.',
  'vacay.fuseInfo5': 'La fusion peut être dissoute à tout moment par l\'une ou l\'autre partie. Vos entrées seront préservées.',
  'vacay.addCalendar': 'Ajouter un calendrier',
  'vacay.calendarColor': 'Couleur',
  'vacay.calendarLabel': 'Libellé',
  'vacay.noCalendars': 'Aucun calendrier',
  'nav.myTrips': 'Mes voyages',

  // Atlas addon
  'atlas.subtitle': 'Votre empreinte de voyage à travers le monde',
  'atlas.countries': 'Pays',
  'atlas.trips': 'Voyages',
  'atlas.places': 'Lieux',
  'atlas.days': 'Jours',
  'atlas.visitedCountries': 'Pays visités',
  'atlas.cities': 'Villes',
  'atlas.noData': 'Aucune donnée de voyage',
  'atlas.noDataHint': 'Créez un voyage et ajoutez des lieux pour voir votre carte du monde',
  'atlas.lastTrip': 'Dernier voyage',
  'atlas.nextTrip': 'Prochain voyage',
  'atlas.daysLeft': 'jours restants',
  'atlas.streak': 'Série',
  'atlas.year': 'an',
  'atlas.years': 'ans',
  'atlas.yearInRow': 'année consécutive',
  'atlas.yearsInRow': 'années consécutives',
  'atlas.tripIn': 'voyage en',
  'atlas.tripsIn': 'voyages en',
  'atlas.since': 'depuis',
  'atlas.europe': 'Europe',
  'atlas.asia': 'Asie',
  'atlas.northAmerica': 'Amérique du N.',
  'atlas.southAmerica': 'Amérique du S.',
  'atlas.africa': 'Afrique',
  'atlas.oceania': 'Océanie',
  'atlas.other': 'Autre',
  'atlas.firstVisit': 'Premier voyage',
  'atlas.lastVisitLabel': 'Dernier voyage',
  'atlas.tripSingular': 'Voyage',
  'atlas.tripPlural': 'Voyages',
  'atlas.placeVisited': 'Lieu visité',
  'atlas.placesVisited': 'Lieux visités',
  'atlas.statsTab': 'Statistiques',
  'atlas.bucketTab': 'Bucket List',
  'atlas.addBucket': 'Ajouter à la bucket list',
  'atlas.bucketNamePlaceholder': 'Lieu ou destination...',
  'atlas.bucketNotesPlaceholder': 'Notes (optionnel)',
  'atlas.bucketEmpty': 'Votre bucket list est vide',
  'atlas.bucketEmptyHint': 'Ajoutez des lieux que vous rêvez de visiter',
  'atlas.unmark': 'Retirer',
  'atlas.confirmMark': 'Marquer ce pays comme visité ?',
  'atlas.confirmUnmark': 'Retirer ce pays de votre liste ?',
  'atlas.confirmUnmarkRegion': 'Retirer cette région de votre liste ?',
  'atlas.markVisited': 'Marquer comme visité',
  'atlas.markVisitedHint': 'Ajouter ce pays à votre liste de visités',
  'atlas.markRegionVisitedHint': 'Ajouter cette région à votre liste de visités',
  'atlas.addToBucket': 'Ajouter à la bucket list',
  'atlas.addPoi': 'Ajouter un lieu',
  'atlas.searchCountry': 'Rechercher un pays…',
  'atlas.month': 'Mois',
  'atlas.addToBucketHint': 'Sauvegarder comme lieu à visiter',
  'atlas.bucketWhen': 'Quand prévoyez-vous d\'y aller ?',

  // Trip Planner
  'trip.tabs.plan': 'Plan',
  'trip.tabs.transports': 'Transports',
  'trip.tabs.reservations': 'Réservations',
  'trip.tabs.reservationsShort': 'Résa',
  'trip.tabs.packing': 'Liste de bagages',
  'trip.tabs.packingShort': 'Bagages',
  'trip.tabs.lists': 'Listes',
  'trip.tabs.listsShort': 'Listes',
  'trip.tabs.budget': 'Budget',
  'trip.tabs.files': 'Fichiers',
  'trip.loading': 'Chargement du voyage…',
  'trip.loadingPhotos': 'Chargement des photos des lieux...',
  'trip.mobilePlan': 'Plan',
  'trip.mobilePlaces': 'Lieux',
  'trip.toast.placeUpdated': 'Lieu mis à jour',
  'trip.toast.placeAdded': 'Lieu ajouté',
  'trip.toast.placeDeleted': 'Lieu supprimé',
  'trip.toast.selectDay': 'Veuillez d\'abord sélectionner un jour',
  'trip.toast.assignedToDay': 'Lieu attribué au planning',
  'trip.toast.reorderError': 'Échec de la réorganisation',
  'trip.toast.reservationUpdated': 'Réservation mise à jour',
  'trip.toast.reservationAdded': 'Réservation ajoutée',
  'trip.toast.deleted': 'Supprimé',
  'trip.confirm.deletePlace': 'Voulez-vous vraiment supprimer ce lieu ?',
  'trip.confirm.deletePlaces': 'Supprimer {count} lieux?',
  'trip.toast.placesDeleted': '{count} lieux supprimés',

  // Day Plan Sidebar
  'dayplan.emptyDay': 'Aucun lieu prévu pour ce jour',
  'dayplan.addNote': 'Ajouter une note',
  'dayplan.editNote': 'Modifier la note',
  'dayplan.noteAdd': 'Ajouter une note',
  'dayplan.noteEdit': 'Modifier la note',
  'dayplan.noteTitle': 'Note',
  'dayplan.noteSubtitle': 'Note du jour',
  'dayplan.totalCost': 'Coût total',
  'dayplan.days': 'Jours',
  'dayplan.dayN': 'Jour {n}',
  'dayplan.calculating': 'Calcul en cours…',
  'dayplan.route': 'Itinéraire',
  'dayplan.optimize': 'Optimiser',
  'dayplan.optimized': 'Itinéraire optimisé',
  'dayplan.routeError': 'Impossible de calculer l\'itinéraire',
  'dayplan.toast.needTwoPlaces': 'Au moins deux lieux nécessaires pour optimiser l\'itinéraire',
  'dayplan.toast.routeOptimized': 'Itinéraire optimisé',
  'dayplan.toast.noGeoPlaces': 'Aucun lieu avec des coordonnées trouvé pour le calcul d\'itinéraire',
  'dayplan.confirmed': 'Confirmé',
  'dayplan.pendingRes': 'En attente',
  'dayplan.pdf': 'PDF',
  'dayplan.pdfTooltip': 'Exporter le plan du jour en PDF',
  'dayplan.pdfError': 'Échec de l\'export PDF',
  'dayplan.cannotReorderTransport': 'Les réservations avec une heure fixe ne peuvent pas être réorganisées',
  'dayplan.confirmRemoveTimeTitle': 'Supprimer l\'heure ?',
  'dayplan.confirmRemoveTimeBody': 'Ce lieu a une heure fixe ({time}). Le déplacer supprimera l\'heure et permettra un tri libre.',
  'dayplan.confirmRemoveTimeAction': 'Supprimer l\'heure et déplacer',
  'dayplan.cannotDropOnTimed': 'Les éléments ne peuvent pas être placés entre des entrées à heure fixe',
  'dayplan.cannotBreakChronology': 'Cela briserait l\'ordre chronologique des éléments et réservations planifiés',

  // Places Sidebar
  'places.addPlace': 'Ajouter un lieu/activité',
  'places.importFile': 'Importer un fichier',
  'places.sidebarDrop': 'Déposer pour importer',
  'places.importFileHint': 'Importez des fichiers .gpx, .kml ou .kmz depuis des outils comme Google My Maps, Google Earth ou un traceur GPS.',
  'places.importFileDropHere': 'Cliquez pour sélectionner un fichier ou glissez-déposez ici',
  'places.importFileDropActive': 'Déposez le fichier pour le sélectionner',
  'places.importFileUnsupported': 'Type de fichier non pris en charge. Utilisez .gpx, .kml ou .kmz.',
  'places.importFileTooLarge': 'Le fichier est trop volumineux. La taille maximale est de {maxMb} MB.',
  'places.importFileError': 'Importation échouée',
  'places.importAllSkipped': 'Tous les lieux étaient déjà dans le voyage.',
  'places.gpxImported': '{count} lieux importés depuis GPX',
  'places.gpxImportTypes': 'Que voulez-vous importer?',
  'places.gpxImportWaypoints': 'Points de passage',
  'places.gpxImportRoutes': 'Itinéraires',
  'places.gpxImportTracks': 'Traces (avec géométrie)',
  'places.gpxImportNoneSelected': 'Sélectionnez au moins un type à importer.',
  'places.kmlImportTypes': 'Que souhaitez-vous importer ?',
  'places.kmlImportPoints': 'Points (Placemarks)',
  'places.kmlImportPaths': 'Chemins (LineStrings)',
  'places.kmlImportNoneSelected': 'Sélectionnez au moins un type.',
  'places.selectionCount': '{count} sélectionné(s)',
  'places.deleteSelected': 'Supprimer la sélection',
  'places.kmlKmzImported': '{count} lieux importés depuis KMZ/KML',
  'places.urlResolved': 'Lieu importé depuis l\'URL',
  'places.importList': 'Import de liste',
  'places.kmlKmzSummaryValues': 'Placemarks : {total} • Importés : {created} • Ignorés : {skipped}',
  'places.importGoogleList': 'Liste Google',
  'places.importNaverList': 'Liste Naver',
  'places.googleListHint': 'Collez un lien de liste Google Maps partagée pour importer tous les lieux.',
  'places.googleListImported': '{count} lieux importés depuis "{list}"',
  'places.googleListError': 'Impossible d\'importer la liste Google Maps',
  'places.naverListHint': 'Collez un lien de liste Naver Maps partagée pour importer tous les lieux.',
  'places.naverListImported': '{count} lieux importés depuis "{list}"',
  'places.naverListError': 'Impossible d\'importer la liste Naver Maps',
  'places.viewDetails': 'Voir les détails',
  'places.assignToDay': 'Ajouter à quel jour ?',
  'places.all': 'Tous',
  'places.unplanned': 'Non planifiés',
  'places.filterTracks': 'Traces',
  'places.search': 'Rechercher des lieux…',
  'places.allCategories': 'Toutes les catégories',
  'places.categoriesSelected': 'catégories',
  'places.clearFilter': 'Effacer le filtre',
  'places.count': '{count} lieux',
  'places.countSingular': '1 lieu',
  'places.allPlanned': 'Tous les lieux sont planifiés',
  'places.noneFound': 'Aucun lieu trouvé',
  'places.editPlace': 'Modifier le lieu',
  'places.formName': 'Nom',
  'places.formNamePlaceholder': 'ex. Tour Eiffel',
  'places.formDescription': 'Description',
  'places.formDescriptionPlaceholder': 'Brève description…',
  'places.formAddress': 'Adresse',
  'places.formAddressPlaceholder': 'Rue, ville, pays',
  'places.formLat': 'Latitude (ex. 48.8566)',
  'places.formLng': 'Longitude (ex. 2.3522)',
  'places.formCategory': 'Catégorie',
  'places.noCategory': 'Sans catégorie',
  'places.categoryNamePlaceholder': 'Nom de la catégorie',
  'places.formTime': 'Heure',
  'places.startTime': 'Début',
  'places.endTime': 'Fin',
  'places.endTimeBeforeStart': 'L\'heure de fin est antérieure à l\'heure de début',
  'places.timeCollision': 'Chevauchement horaire avec :',
  'places.formWebsite': 'Site web',
  'places.formNotes': 'Notes',
  'places.formNotesPlaceholder': 'Notes personnelles…',
  'places.formReservation': 'Réservation',
  'places.reservationNotesPlaceholder': 'Notes de réservation, numéro de confirmation…',
  'places.mapsSearchPlaceholder': 'Rechercher des lieux…',
  'places.mapsSearchError': 'La recherche de lieu a échoué.',
  'places.loadingDetails': 'Chargement des détails du lieu…',
  'places.osmHint': 'Recherche via OpenStreetMap (pas de photos, horaires ni notes). Ajoutez une clé API Google dans les paramètres pour plus de détails.',
  'places.osmActive': 'Recherche via OpenStreetMap (pas de photos, notes ni horaires). Ajoutez une clé API Google dans les paramètres pour des données enrichies.',
  'places.categoryCreateError': 'Impossible de créer la catégorie',
  'places.nameRequired': 'Veuillez saisir un nom',
  'places.saveError': 'Échec de l\'enregistrement',
  // Place Inspector
  'inspector.opened': 'Ouvert',
  'inspector.closed': 'Fermé',
  'inspector.openingHours': 'Horaires d\'ouverture',
  'inspector.showHours': 'Afficher les horaires',
  'inspector.files': 'Fichiers',
  'inspector.filesCount': '{count} fichiers',
  'inspector.removeFromDay': 'Retirer du jour',
  'inspector.remove': 'Supprimer',
  'inspector.addToDay': 'Ajouter au jour',
  'inspector.confirmedRes': 'Réservation confirmée',
  'inspector.pendingRes': 'Réservation en attente',
  'inspector.google': 'Ouvrir dans Google Maps',
  'inspector.website': 'Ouvrir le site web',
  'inspector.addRes': 'Réservation',
  'inspector.editRes': 'Modifier la réservation',
  'inspector.participants': 'Participants',
  'inspector.trackStats': 'Données du parcours',

  // Reservations
  'reservations.title': 'Réservations',
  'reservations.empty': 'Aucune réservation',
  'reservations.emptyHint': 'Ajoutez des réservations pour les vols, hôtels et plus',
  'reservations.add': 'Ajouter une réservation',
  'reservations.addManual': 'Réservation manuelle',
  'reservations.placeHint': 'Conseil : les réservations sont mieux créées directement depuis un lieu pour les lier à votre plan du jour.',
  'reservations.confirmed': 'Confirmée',
  'reservations.pending': 'En attente',
  'reservations.summary': '{confirmed} confirmées, {pending} en attente',
  'reservations.fromPlan': 'Du plan',
  'reservations.showFiles': 'Afficher les fichiers',
  'reservations.editTitle': 'Modifier la réservation',
  'reservations.status': 'Statut',
  'reservations.datetime': 'Date et heure',
  'reservations.startTime': 'Heure de début',
  'reservations.endTime': 'Heure de fin',
  'reservations.date': 'Date',
  'reservations.time': 'Heure',
  'reservations.timeAlt': 'Heure (alternative, ex. 19h30)',
  'reservations.notes': 'Notes',
  'reservations.notesPlaceholder': 'Notes supplémentaires…',
  'reservations.meta.airline': 'Compagnie aérienne',
  'reservations.meta.flightNumber': 'N° de vol',
  'reservations.meta.from': 'De',
  'reservations.meta.to': 'À',
  'reservations.needsReview': 'Vérifier',
  'reservations.needsReviewHint': 'L\'aéroport n\'a pas pu être identifié automatiquement — veuillez confirmer l\'emplacement.',
  'reservations.searchLocation': 'Rechercher une gare, un port, une adresse…',
  'airport.searchPlaceholder': 'Code ou ville de l\'aéroport (ex. FRA)',
  'map.connections': 'Connexions',
  'map.showConnections': 'Afficher les itinéraires',
  'map.hideConnections': 'Masquer les itinéraires',
  'settings.bookingLabels': 'Étiquettes des itinéraires',
  'settings.bookingLabelsHint': 'Affiche les noms des gares / aéroports sur la carte. Si désactivé, seule l\'icône est affichée.',
  'reservations.meta.trainNumber': 'N° de train',
  'reservations.meta.platform': 'Quai',
  'reservations.meta.seat': 'Place',
  'reservations.meta.checkIn': 'Arrivée',
  'reservations.meta.checkInUntil': "Check-in jusqu'à",
  'reservations.meta.checkOut': 'Départ',
  'reservations.meta.linkAccommodation': 'Hébergement',
  'reservations.meta.pickAccommodation': 'Lier à un hébergement',
  'reservations.meta.noAccommodation': 'Aucun',
  'reservations.meta.hotelPlace': 'Hébergement',
  'reservations.meta.pickHotel': 'Sélectionner un hébergement',
  'reservations.meta.fromDay': 'Du',
  'reservations.meta.toDay': 'Au',
  'reservations.meta.selectDay': 'Sélectionner un jour',
  'reservations.type.flight': 'Vol',
  'reservations.type.hotel': 'Hébergement',
  'reservations.type.restaurant': 'Restaurant',
  'reservations.type.train': 'Train',
  'reservations.type.car': 'Voiture',
  'reservations.type.cruise': 'Croisière',
  'reservations.type.event': 'Événement',
  'reservations.type.tour': 'Visite',
  'reservations.type.other': 'Autre',
  'reservations.confirm.delete': 'Voulez-vous vraiment supprimer la réservation « {name} » ?',
  'reservations.confirm.deleteTitle': 'Supprimer la réservation ?',
  'reservations.confirm.deleteBody': '« {name} » sera définitivement supprimé.',
  'reservations.toast.updated': 'Réservation mise à jour',
  'reservations.toast.removed': 'Réservation supprimée',
  'reservations.toast.fileUploaded': 'Fichier importé',
  'reservations.toast.uploadError': 'Échec de l\'import',
  'reservations.newTitle': 'Nouvelle réservation',
  'reservations.bookingType': 'Type de réservation',
  'reservations.titleLabel': 'Titre',
  'reservations.titlePlaceholder': 'ex. Lufthansa LH123, Hôtel Adlon, …',
  'reservations.locationAddress': 'Lieu / Adresse',
  'reservations.locationPlaceholder': 'Adresse, aéroport, hôtel…',
  'reservations.confirmationCode': 'Code de réservation',
  'reservations.confirmationPlaceholder': 'ex. ABC12345',
  'reservations.day': 'Jour',
  'reservations.noDay': 'Aucun jour',
  'reservations.place': 'Lieu',
  'reservations.noPlace': 'Aucun lieu',
  'reservations.pendingSave': 'sera enregistré…',
  'reservations.uploading': 'Importation…',
  'reservations.attachFile': 'Joindre un fichier',
  'reservations.linkExisting': 'Lier un fichier existant',
  'reservations.toast.saveError': 'Échec de l\'enregistrement',
  'reservations.toast.updateError': 'Échec de la mise à jour',
  'reservations.toast.deleteError': 'Échec de la suppression',
  'reservations.confirm.remove': 'Supprimer la réservation pour « {name} » ?',
  'reservations.linkAssignment': 'Lier à l\'affectation du jour',
  'reservations.pickAssignment': 'Sélectionnez une affectation de votre plan…',
  'reservations.noAssignment': 'Aucun lien (autonome)',
  'reservations.price': 'Prix',
  'reservations.budgetCategory': 'Catégorie budgétaire',
  'reservations.budgetCategoryPlaceholder': 'ex. Transport, Hébergement',
  'reservations.budgetCategoryAuto': 'Auto (selon le type de réservation)',
  'reservations.budgetHint': 'Une entrée budgétaire sera créée automatiquement lors de l\'enregistrement.',
  'reservations.departureDate': 'Départ',
  'reservations.arrivalDate': 'Arrivée',
  'reservations.departureTime': 'Heure dép.',
  'reservations.arrivalTime': 'Heure arr.',
  'reservations.pickupDate': 'Prise en charge',
  'reservations.returnDate': 'Restitution',
  'reservations.pickupTime': 'Heure prise en charge',
  'reservations.returnTime': 'Heure restitution',
  'reservations.endDate': 'Date de fin',
  'reservations.meta.departureTimezone': 'TZ dép.',
  'reservations.meta.arrivalTimezone': 'TZ arr.',
  'reservations.span.departure': 'Départ',
  'reservations.span.arrival': 'Arrivée',
  'reservations.span.inTransit': 'En transit',
  'reservations.span.pickup': 'Prise en charge',
  'reservations.span.return': 'Restitution',
  'reservations.span.active': 'Actif',
  'reservations.span.start': 'Début',
  'reservations.span.end': 'Fin',
  'reservations.span.ongoing': 'En cours',
  'reservations.validation.endBeforeStart': 'La date/heure de fin doit être postérieure à la date/heure de début',
  'reservations.addBooking': 'Ajouter une réservation',

  // Budget
  'budget.title': 'Budget',
  'budget.exportCsv': 'Exporter CSV',
  'budget.emptyTitle': 'Aucun budget créé',
  'budget.emptyText': 'Créez des catégories et des entrées pour planifier votre budget de voyage',
  'budget.emptyPlaceholder': 'Nom de la catégorie…',
  'budget.createCategory': 'Créer une catégorie',
  'budget.category': 'Catégorie',
  'budget.categoryName': 'Nom de la catégorie',
  'budget.table.name': 'Nom',
  'budget.table.total': 'Total',
  'budget.table.persons': 'Personnes',
  'budget.table.days': 'Jours',
  'budget.table.perPerson': 'Par personne',
  'budget.table.perDay': 'Par jour',
  'budget.table.perPersonDay': 'P. p / Jour',
  'budget.table.note': 'Note',
  'budget.table.date': 'Date',
  'budget.newEntry': 'Nouvelle entrée',
  'budget.defaultEntry': 'Nouvelle entrée',
  'budget.defaultCategory': 'Nouvelle catégorie',
  'budget.total': 'Total',
  'budget.totalBudget': 'Budget total',
  'budget.byCategory': 'Par catégorie',
  'budget.editTooltip': 'Cliquez pour modifier',
  'budget.linkedToReservation': 'Lié à une réservation — modifiez le nom depuis celle-ci',
  'budget.confirm.deleteCategory': 'Voulez-vous vraiment supprimer la catégorie « {name} » avec {count} entrées ?',
  'budget.deleteCategory': 'Supprimer la catégorie',
  'budget.perPerson': 'Par personne',
  'budget.paid': 'Payé',
  'budget.open': 'Ouvert',
  'budget.noMembers': 'Aucun membre assigné',
  'budget.settlement': 'Règlement',
  'budget.settlementInfo': 'Cliquez sur l\'avatar d\'un membre sur un poste budgétaire pour le marquer en vert — cela signifie qu\'il a payé. Le règlement indique ensuite qui doit combien à qui.',
  'budget.netBalances': 'Soldes nets',

  // Files
  'files.title': 'Fichiers',
  'files.pageTitle': 'Fichiers et documents',
  'files.subtitle': '{count} fichiers pour {trip}',
  'files.download': 'Télécharger',
  'files.openError': "Impossible d'ouvrir le fichier",
  'files.downloadPdf': 'Télécharger le PDF',
  'files.count': '{count} fichiers',
  'files.countSingular': '1 fichier',
  'files.uploaded': '{count} importés',
  'files.uploadError': 'Échec de l\'import',
  'files.dropzone': 'Déposez les fichiers ici',
  'files.dropzoneHint': 'ou cliquez pour parcourir',
  'files.allowedTypes': 'Images, PDF, DOC, DOCX, XLS, XLSX, TXT, CSV · Max 50 Mo',
  'files.uploading': 'Importation…',
  'files.filterAll': 'Tous',
  'files.filterPdf': 'PDF',
  'files.filterImages': 'Images',
  'files.filterDocs': 'Documents',
  'files.filterCollab': 'Notes Collab',
  'files.sourceCollab': 'Depuis les notes Collab',
  'files.empty': 'Aucun fichier',
  'files.emptyHint': 'Importez des fichiers pour les joindre à votre voyage',
  'files.openTab': 'Ouvrir dans un nouvel onglet',
  'files.confirm.delete': 'Voulez-vous vraiment supprimer ce fichier ?',
  'files.toast.deleted': 'Fichier supprimé',
  'files.toast.deleteError': 'Impossible de supprimer le fichier',
  'files.sourcePlan': 'Plan du jour',
  'files.sourceBooking': 'Réservation',
  'files.sourceTransport': 'Transport',
  'files.attach': 'Joindre',
  'files.pasteHint': 'Vous pouvez aussi coller des images depuis le presse-papiers (Ctrl+V)',
  'files.trash': 'Corbeille',
  'files.trashEmpty': 'La corbeille est vide',
  'files.emptyTrash': 'Vider la corbeille',
  'files.restore': 'Restaurer',
  'files.star': 'Favori',
  'files.unstar': 'Retirer des favoris',
  'files.assign': 'Assigner',
  'files.assignTitle': 'Assigner le fichier',
  'files.assignPlace': 'Lieu',
  'files.assignBooking': 'Réservation',
  'files.assignTransport': 'Transport',
  'files.unassigned': 'Non attribué',
  'files.unlink': 'Supprimer le lien',
  'files.toast.trashed': 'Déplacé dans la corbeille',
  'files.toast.restored': 'Fichier restauré',
  'files.toast.trashEmptied': 'Corbeille vidée',
  'files.toast.assigned': 'Fichier attribué',
  'files.toast.assignError': 'Échec de l\'assignation',
  'files.toast.restoreError': 'Échec de la restauration',
  'files.confirm.permanentDelete': 'Supprimer définitivement ce fichier ? Cette action est irréversible.',
  'files.confirm.emptyTrash': 'Supprimer définitivement tous les fichiers de la corbeille ? Cette action est irréversible.',
  'files.noteLabel': 'Note',
  'files.notePlaceholder': 'Ajouter une note…',

  // Packing
  'packing.title': 'Liste de bagages',
  'packing.empty': 'La liste de bagages est vide',
  'packing.import': 'Importer',
  'packing.importTitle': 'Importer la liste',
  'packing.importHint': 'Un élément par ligne. Catégorie et quantité optionnelles séparées par virgule, point-virgule ou tabulation : Nom, Catégorie, Quantité',
  'packing.importPlaceholder': 'Brosse à dents\nCrème solaire, Hygiène\nT-Shirts, Vêtements, 5\nPasseport, Documents',
  'packing.importCsv': 'Charger CSV/TXT',
  'packing.importAction': 'Importer {count}',
  'packing.importSuccess': '{count} éléments importés',
  'packing.importError': 'Échec de l\'import',
  'packing.importEmpty': 'Aucun élément à importer',
  'packing.progress': '{packed} sur {total} emballés ({percent} %)',
  'packing.clearChecked': 'Supprimer {count} cochés',
  'packing.clearCheckedShort': 'Supprimer {count}',
  'packing.suggestions': 'Suggestions',
  'packing.suggestionsTitle': 'Ajouter des suggestions',
  'packing.allSuggested': 'Toutes les suggestions ajoutées',
  'packing.allPacked': 'Tout est emballé !',
  'packing.addPlaceholder': 'Ajouter un nouvel article…',
  'packing.categoryPlaceholder': 'Catégorie…',
  'packing.filterAll': 'Tous',
  'packing.filterOpen': 'À faire',
  'packing.filterDone': 'Fait',
  'packing.emptyTitle': 'La liste de bagages est vide',
  'packing.emptyHint': 'Ajoutez des articles ou utilisez les suggestions',
  'packing.emptyFiltered': 'Aucun article ne correspond à ce filtre',
  'packing.menuRename': 'Renommer',
  'packing.menuCheckAll': 'Tout cocher',
  'packing.menuUncheckAll': 'Tout décocher',
  'packing.menuDeleteCat': 'Supprimer la catégorie',
  'packing.addItem': 'Ajouter un article',
  'packing.addItemPlaceholder': 'Nom de l\'article...',
  'packing.addCategory': 'Ajouter une catégorie',
  'packing.newCategoryPlaceholder': 'Nom de catégorie (ex. Vêtements)',
  'packing.applyTemplate': 'Appliquer un modèle',
  'packing.template': 'Modèle',
  'packing.templateApplied': '{count} articles ajoutés depuis le modèle',
  'packing.templateError': 'Erreur lors de l\'application du modèle',
  'packing.saveAsTemplate': 'Enregistrer comme modèle',
  'packing.templateName': 'Nom du modèle',
  'packing.templateSaved': 'Liste de voyage enregistrée comme modèle',
  'packing.noMembers': 'Aucun membre',
  'packing.bags': 'Bagages',
  'packing.noBag': 'Non assigné',
  'packing.totalWeight': 'Poids total',
  'packing.bagName': 'Nom...',
  'packing.addBag': 'Ajouter un bagage',
  'packing.changeCategory': 'Changer de catégorie',
  'packing.confirm.clearChecked': 'Voulez-vous vraiment supprimer {count} articles cochés ?',
  'packing.confirm.deleteCat': 'Voulez-vous vraiment supprimer la catégorie « {name} » avec {count} articles ?',
  'packing.defaultCategory': 'Autre',
  'packing.toast.saveError': 'Échec de l\'enregistrement',
  'packing.toast.deleteError': 'Échec de la suppression',
  'packing.toast.renameError': 'Échec du renommage',
  'packing.toast.addError': 'Échec de l\'ajout',

  // Packing suggestions
  'packing.suggestions.items': [
    { name: 'Passeport', category: 'Documents' },
    { name: 'Carte d\'identité', category: 'Documents' },
    { name: 'Assurance voyage', category: 'Documents' },
    { name: 'Billets d\'avion', category: 'Documents' },
    { name: 'Carte bancaire', category: 'Finances' },
    { name: 'Espèces', category: 'Finances' },
    { name: 'Visa', category: 'Documents' },
    { name: 'T-shirts', category: 'Vêtements' },
    { name: 'Pantalons', category: 'Vêtements' },
    { name: 'Sous-vêtements', category: 'Vêtements' },
    { name: 'Chaussettes', category: 'Vêtements' },
    { name: 'Veste', category: 'Vêtements' },
    { name: 'Pyjama', category: 'Vêtements' },
    { name: 'Maillot de bain', category: 'Vêtements' },
    { name: 'Imperméable', category: 'Vêtements' },
    { name: 'Chaussures confortables', category: 'Vêtements' },
    { name: 'Brosse à dents', category: 'Hygiène' },
    { name: 'Dentifrice', category: 'Hygiène' },
    { name: 'Shampooing', category: 'Hygiène' },
    { name: 'Déodorant', category: 'Hygiène' },
    { name: 'Crème solaire', category: 'Hygiène' },
    { name: 'Rasoir', category: 'Hygiène' },
    { name: 'Chargeur', category: 'Électronique' },
    { name: 'Batterie externe', category: 'Électronique' },
    { name: 'Écouteurs', category: 'Électronique' },
    { name: 'Adaptateur de voyage', category: 'Électronique' },
    { name: 'Appareil photo', category: 'Électronique' },
    { name: 'Antidouleurs', category: 'Santé' },
    { name: 'Pansements', category: 'Santé' },
    { name: 'Désinfectant', category: 'Santé' },
  ],

  // Members / Sharing
  'members.shareTrip': 'Partager le voyage',
  'members.inviteUser': 'Inviter un utilisateur',
  'members.selectUser': 'Sélectionner un utilisateur…',
  'members.invite': 'Inviter',
  'members.allHaveAccess': 'Tous les utilisateurs ont déjà accès.',
  'members.access': 'Accès',
  'members.person': 'personne',
  'members.persons': 'personnes',
  'members.you': 'vous',
  'members.owner': 'Propriétaire',
  'members.leaveTrip': 'Quitter le voyage',
  'members.removeAccess': 'Retirer l\'accès',
  'members.confirmLeave': 'Quitter le voyage ? Vous perdrez l\'accès.',
  'members.confirmRemove': 'Retirer l\'accès à cet utilisateur ?',
  'members.loadError': 'Impossible de charger les membres',
  'members.added': 'ajouté',
  'members.addError': 'Échec de l\'ajout',
  'members.removed': 'Membre retiré',
  'members.removeError': 'Échec de la suppression',

  // Categories (Admin)
  'categories.title': 'Catégories',
  'categories.subtitle': 'Gérer les catégories de lieux',
  'categories.new': 'Nouvelle catégorie',
  'categories.empty': 'Aucune catégorie',
  'categories.namePlaceholder': 'Nom de la catégorie',
  'categories.icon': 'Icône',
  'categories.color': 'Couleur',
  'categories.customColor': 'Choisir une couleur personnalisée',
  'categories.preview': 'Aperçu',
  'categories.defaultName': 'Catégorie',
  'categories.update': 'Mettre à jour',
  'categories.create': 'Créer',
  'categories.confirm.delete': 'Supprimer la catégorie ? Les lieux de cette catégorie ne seront pas supprimés.',
  'categories.toast.loadError': 'Impossible de charger les catégories',
  'categories.toast.nameRequired': 'Veuillez saisir un nom',
  'categories.toast.updated': 'Catégorie mise à jour',
  'categories.toast.created': 'Catégorie créée',
  'categories.toast.saveError': 'Échec de l\'enregistrement',
  'categories.toast.deleted': 'Catégorie supprimée',
  'categories.toast.deleteError': 'Échec de la suppression',

  // Backup (Admin)
  'backup.title': 'Sauvegarde des données',
  'backup.subtitle': 'Base de données et tous les fichiers importés',
  'backup.refresh': 'Actualiser',
  'backup.upload': 'Importer une sauvegarde',
  'backup.uploading': 'Importation…',
  'backup.create': 'Créer une sauvegarde',
  'backup.creating': 'Création…',
  'backup.empty': 'Aucune sauvegarde',
  'backup.createFirst': 'Créer la première sauvegarde',
  'backup.download': 'Télécharger',
  'backup.restore': 'Restaurer',
  'backup.confirm.restore': 'Restaurer la sauvegarde « {name} » ?\n\nToutes les données actuelles seront remplacées par la sauvegarde.',
  'backup.confirm.uploadRestore': 'Importer et restaurer le fichier de sauvegarde « {name} » ?\n\nToutes les données actuelles seront écrasées.',
  'backup.confirm.delete': 'Supprimer la sauvegarde « {name} » ?',
  'backup.toast.loadError': 'Impossible de charger les sauvegardes',
  'backup.toast.created': 'Sauvegarde créée avec succès',
  'backup.toast.createError': 'Impossible de créer la sauvegarde',
  'backup.toast.restored': 'Sauvegarde restaurée. La page va se recharger…',
  'backup.toast.restoreError': 'Échec de la restauration',
  'backup.toast.uploadError': 'Échec de l\'import',
  'backup.toast.deleted': 'Sauvegarde supprimée',
  'backup.toast.deleteError': 'Échec de la suppression',
  'backup.toast.downloadError': 'Échec du téléchargement',
  'backup.toast.settingsSaved': 'Paramètres de sauvegarde automatique enregistrés',
  'backup.toast.settingsError': 'Impossible d\'enregistrer les paramètres',
  'backup.auto.title': 'Sauvegarde automatique',
  'backup.auto.subtitle': 'Sauvegarde automatique programmée',
  'backup.auto.enable': 'Activer la sauvegarde automatique',
  'backup.auto.enableHint': 'Les sauvegardes seront créées automatiquement selon le calendrier choisi',
  'backup.auto.interval': 'Intervalle',
  'backup.auto.hour': 'Exécuter à l\'heure',
  'backup.auto.hourHint': 'Heure locale du serveur (format {format})',
  'backup.auto.dayOfWeek': 'Jour de la semaine',
  'backup.auto.dayOfMonth': 'Jour du mois',
  'backup.auto.dayOfMonthHint': 'Limité à 1–28 pour la compatibilité avec tous les mois',
  'backup.auto.scheduleSummary': 'Planification',
  'backup.auto.summaryDaily': 'Tous les jours à {hour}h00',
  'backup.auto.summaryWeekly': 'Chaque {day} à {hour}h00',
  'backup.auto.summaryMonthly': 'Le {day} de chaque mois à {hour}h00',
  'backup.auto.envLocked': 'Docker',
  'backup.auto.envLockedHint': 'La sauvegarde automatique est configurée via les variables d\'environnement Docker. Pour modifier ces paramètres, mettez à jour votre docker-compose.yml et redémarrez le conteneur.',
  'backup.auto.copyEnv': 'Copier les variables d\'env Docker',
  'backup.auto.envCopied': 'Variables d\'env Docker copiées dans le presse-papiers',
  'backup.auto.keepLabel': 'Supprimer les anciennes sauvegardes après',
  'backup.dow.sunday': 'Dim',
  'backup.dow.monday': 'Lun',
  'backup.dow.tuesday': 'Mar',
  'backup.dow.wednesday': 'Mer',
  'backup.dow.thursday': 'Jeu',
  'backup.dow.friday': 'Ven',
  'backup.dow.saturday': 'Sam',
  'backup.interval.hourly': 'Toutes les heures',
  'backup.interval.daily': 'Quotidien',
  'backup.interval.weekly': 'Hebdomadaire',
  'backup.interval.monthly': 'Mensuel',
  'backup.keep.1day': '1 jour',
  'backup.keep.3days': '3 jours',
  'backup.keep.7days': '7 jours',
  'backup.keep.14days': '14 jours',
  'backup.keep.30days': '30 jours',
  'backup.keep.forever': 'Conserver indéfiniment',

  // Photos
  'photos.title': 'Photos',
  'photos.subtitle': '{count} photos pour {trip}',
  'photos.dropHere': 'Déposez des photos ici...',
  'photos.dropHereActive': 'Déposez des photos ici',
  'photos.captionForAll': 'Légende (pour tous)',
  'photos.captionPlaceholder': 'Légende optionnelle...',
  'photos.addCaption': 'Ajouter une légende...',
  'photos.allDays': 'Tous les jours',
  'photos.noPhotos': 'Aucune photo',
  'photos.uploadHint': 'Importez vos photos de voyage',
  'photos.clickToSelect': 'ou cliquez pour sélectionner',
  'photos.linkPlace': 'Lier au lieu',
  'photos.noPlace': 'Aucun lieu',
  'photos.uploadN': '{n} photo(s) importée(s)',
  'photos.linkDay': 'Lier le jour',
  'photos.noDay': 'Aucun jour',
  'photos.dayLabel': 'Jour {number}',
  'photos.photoSelected': 'Photo sélectionnée',
  'photos.photosSelected': 'Photos sélectionnées',
  'photos.fileTypeHint': "JPG, PNG, WebP · max. 10 Mo · jusqu'à 30 photos",

  // Backup restore modal
  'backup.restoreConfirmTitle': 'Restaurer la sauvegarde ?',
  'backup.restoreWarning': 'Toutes les données actuelles (voyages, lieux, utilisateurs, importations) seront définitivement remplacées par la sauvegarde. Cette action est irréversible.',
  'backup.restoreTip': 'Conseil : créez une sauvegarde de l\'état actuel avant de restaurer.',
  'backup.restoreConfirm': 'Oui, restaurer',

  // PDF
  'pdf.travelPlan': 'Plan de voyage',
  'pdf.planned': 'Planifié',
  'pdf.costLabel': 'Coût EUR',
  'pdf.preview': 'Aperçu PDF',
  'pdf.saveAsPdf': 'Enregistrer en PDF',

  // Planner
  'planner.places': 'Lieux',
  'planner.bookings': 'Réservations',
  'planner.packingList': 'Liste de bagages',
  'planner.documents': 'Documents',
  'planner.dayPlan': 'Plan du jour',
  'planner.reservations': 'Réservations',
  'planner.minTwoPlaces': 'Au moins 2 lieux avec coordonnées nécessaires',
  'planner.noGeoPlaces': 'Aucun lieu avec coordonnées disponible',
  'planner.routeCalculated': 'Itinéraire calculé',
  'planner.routeCalcFailed': 'L\'itinéraire n\'a pas pu être calculé',
  'planner.routeError': 'Erreur lors du calcul de l\'itinéraire',
  'planner.icsExportFailed': 'Échec de l\'export ICS',
  'planner.routeOptimized': 'Itinéraire optimisé',
  'planner.reservationUpdated': 'Réservation mise à jour',
  'planner.reservationAdded': 'Réservation ajoutée',
  'planner.confirmDeleteReservation': 'Supprimer la réservation ?',
  'planner.reservationDeleted': 'Réservation supprimée',
  'planner.days': 'Jours',
  'planner.allPlaces': 'Tous les lieux',
  'planner.totalPlaces': '{n} lieux au total',
  'planner.noDaysPlanned': 'Aucun jour planifié',
  'planner.editTrip': 'Modifier le voyage \u2192',
  'planner.placeOne': '1 lieu',
  'planner.placeN': '{n} lieux',
  'planner.addNote': 'Ajouter une note',
  'planner.noEntries': 'Aucune entrée pour ce jour',
  'planner.addPlace': 'Ajouter un lieu ou une activité',
  'planner.addPlaceShort': '+ Ajouter un lieu ou une activité',
  'planner.resPending': 'Réservation en attente · ',
  'planner.resConfirmed': 'Réservation confirmée · ',
  'planner.notePlaceholder': 'Note…',
  'planner.noteTimePlaceholder': 'Heure (facultatif)',
  'planner.noteExamplePlaceholder': 'ex. S3 à 14h30 depuis la gare centrale, ferry depuis le quai 7, pause déjeuner…',
  'planner.totalCost': 'Coût total',
  'planner.searchPlaces': 'Rechercher des lieux…',
  'planner.allCategories': 'Toutes les catégories',
  'planner.noPlacesFound': 'Aucun lieu trouvé',
  'planner.addFirstPlace': 'Ajouter un premier lieu',
  'planner.noReservations': 'Aucune réservation',
  'planner.addFirstReservation': 'Ajouter une première réservation',
  'planner.new': 'Nouveau',
  'planner.addToDay': '+ Jour',
  'planner.calculating': 'Calcul…',
  'planner.route': 'Itinéraire',
  'planner.optimize': 'Optimiser',
  'planner.openGoogleMaps': 'Ouvrir dans Google Maps',
  'planner.selectDayHint': 'Sélectionnez un jour dans la liste de gauche pour voir le plan du jour',
  'planner.noPlacesForDay': 'Aucun lieu pour ce jour',
  'planner.addPlacesLink': 'Ajouter des lieux \u2192',
  'planner.minTotal': 'min. total',
  'planner.noReservation': 'Pas de réservation',
  'planner.removeFromDay': 'Retirer du jour',
  'planner.addToThisDay': 'Ajouter au jour',
  'planner.overview': 'Aperçu',
  'planner.noDays': 'Aucun jour',
  'planner.editTripToAddDays': 'Modifiez le voyage pour ajouter des jours',
  'planner.dayCount': '{n} jours',
  'planner.clickToUnlock': 'Cliquez pour déverrouiller',
  'planner.keepPosition': 'Maintenir la position lors de l\'optimisation de l\'itinéraire',
  'planner.dayDetails': 'Détails du jour',
  'planner.dayN': 'Jour {n}',

  // Dashboard Stats
  'stats.countries': 'Pays',
  'stats.cities': 'Villes',
  'stats.trips': 'Voyages',
  'stats.places': 'Lieux',
  'stats.worldProgress': 'Progression mondiale',
  'stats.visited': 'visités',
  'stats.remaining': 'restants',
  'stats.visitedCountries': 'Pays visités',

  // Day Detail Panel
  'day.precipProb': 'Probabilité de pluie',
  'day.precipitation': 'Précipitations',
  'day.wind': 'Vent',
  'day.sunrise': 'Lever du soleil',
  'day.sunset': 'Coucher du soleil',
  'day.hourlyForecast': 'Prévisions horaires',
  'day.climateHint': 'Moyennes historiques — prévisions réelles disponibles dans les 16 jours précédant cette date.',
  'day.noWeather': 'Aucune donnée météo disponible. Ajoutez un lieu avec des coordonnées.',
  'day.overview': 'Aperçu du jour',
  'day.accommodation': 'Hébergement',
  'day.addAccommodation': 'Ajouter un hébergement',
  'day.hotelDayRange': 'Appliquer aux jours',
  'day.noPlacesForHotel': 'Ajoutez d\'abord des lieux à votre voyage',
  'day.allDays': 'Tous',
  'day.checkIn': 'Arrivée',
  'day.checkInUntil': "Jusqu'à",
  'day.checkOut': 'Départ',
  'day.confirmation': 'Confirmation',
  'day.editAccommodation': 'Modifier l\'hébergement',
  'day.reservations': 'Réservations',

  // Memories / Immich
  'memories.title': 'Photos',
  'memories.notConnected': 'Immich non connecté',
  'memories.notConnectedHint': 'Connectez votre instance Immich dans les paramètres pour voir vos photos de voyage ici.',
  'memories.notConnectedMultipleHint': 'Connectez un de ces fournisseurs de photos : {provider_names} dans les Paramètres pour pouvoir ajouter des photos à ce voyage.',
  'memories.noDates': 'Ajoutez des dates à votre voyage pour charger les photos.',
  'memories.noPhotos': 'Aucune photo trouvée',
  'memories.noPhotosHint': 'Aucune photo trouvée dans Immich pour la période de ce voyage.',
  'memories.photosFound': 'photos',
  'memories.fromOthers': 'd\'autres',
  'memories.sharePhotos': 'Partager les photos',
  'memories.sharing': 'Partagé',
  'memories.reviewTitle': 'Vérifier vos photos',
  'memories.reviewHint': 'Cliquez sur les photos pour les exclure du partage.',
  'memories.shareCount': 'Partager {count} photos',
  'memories.providerUrl': 'URL du serveur',
  'memories.providerApiKey': 'Clé API',
  'memories.providerUsername': 'Nom d\'utilisateur',
  'memories.providerPassword': 'Mot de passe',
  'memories.providerOTP': 'Code MFA (si activé)',
  'memories.skipSSLVerification': 'Ignorer la vérification du certificat SSL',
  'memories.immichAutoUpload': 'Répliquer les photos du journey vers Immich au téléversement',
  'memories.providerUrlHintSynology': 'Incluez le chemin de l\'application Photos dans l\'URL, ex. https://nas:5001/photo',
  'memories.testConnection': 'Tester la connexion',
  'memories.testShort': 'Tester',
  'memories.testFirst': 'Testez la connexion avant de sauvegarder',
  'memories.connected': 'Connecté',
  'memories.disconnected': 'Non connecté',
  'memories.connectionSuccess': 'Connecté à Immich',
  'memories.connectionError': 'Impossible de se connecter à Immich',
  'memories.saved': 'Paramètres {provider_name} enregistrés',
  'memories.providerDisconnectedBanner': 'Votre connexion {provider_name} est perdue. Reconnectez-vous dans les Paramètres pour voir les photos.',
  'memories.saveError': 'Impossible d\'enregistrer les paramètres de {provider_name}',
  'memories.saveRouteNotConfigured': "La route de sauvegarde n'est pas configurée pour ce fournisseur",
  'memories.testRouteNotConfigured': "La route de test n'est pas configurée pour ce fournisseur",
  'memories.fillRequiredFields': 'Veuillez remplir tous les champs obligatoires',
  'memories.oldest': 'Plus anciennes',
  'memories.newest': 'Plus récentes',
  'memories.allLocations': 'Tous les lieux',
  'memories.addPhotos': 'Ajouter des photos',
  'memories.linkAlbum': 'Lier un album',
  'memories.selectAlbum': 'Choisir un album Immich',
  'memories.selectAlbumMultiple': 'Sélectionner un album',
  'memories.noAlbums': 'Aucun album trouvé',
  'memories.syncAlbum': 'Synchroniser',
  'memories.unlinkAlbum': 'Délier',
  'memories.photos': 'photos',
  'memories.selectPhotos': 'Sélectionner des photos depuis Immich',
  'memories.selectPhotosMultiple': 'Sélectionner des photos',
  'memories.selectHint': 'Appuyez sur les photos pour les sélectionner.',
  'memories.selected': 'sélectionné(s)',
  'memories.addSelected': 'Ajouter {count} photos',
  'memories.alreadyAdded': 'Ajouté',
  'memories.private': 'Privé',
  'memories.stopSharing': 'Arrêter le partage',
  'memories.tripDates': 'Dates du voyage',
  'memories.allPhotos': 'Toutes les photos',
  'memories.confirmShareTitle': 'Partager avec les membres du voyage ?',
  'memories.confirmShareHint': '{count} photos seront visibles par tous les membres de ce voyage. Vous pourrez rendre des photos individuelles privées plus tard.',
  'memories.confirmShareButton': 'Partager les photos',

  // Collab Addon
  'collab.tabs.chat': 'Discussion',
  'collab.tabs.notes': 'Notes',
  'collab.tabs.polls': 'Sondages',
  'collab.whatsNext.title': 'À venir',
  'collab.whatsNext.today': 'Aujourd\'hui',
  'collab.whatsNext.tomorrow': 'Demain',
  'collab.whatsNext.empty': 'Aucune activité à venir',
  'collab.whatsNext.until': 'à',
  'collab.whatsNext.emptyHint': 'Les activités avec des horaires apparaîtront ici',
  'collab.chat.send': 'Envoyer',
  'collab.chat.placeholder': 'Écrire un message…',
  'collab.chat.empty': 'Commencez la conversation',
  'collab.chat.emptyHint': 'Les messages sont partagés avec tous les membres du voyage',
  'collab.chat.emptyDesc': 'Partagez des idées, des plans et des mises à jour avec votre groupe de voyage',
  'collab.chat.today': 'Aujourd\'hui',
  'collab.chat.yesterday': 'Hier',
  'collab.chat.deletedMessage': 'a supprimé un message',
  'collab.chat.reply': 'Répondre',
  'collab.chat.loadMore': 'Charger les messages précédents',
  'collab.chat.justNow': 'à l\'instant',
  'collab.chat.minutesAgo': 'il y a {n} min',
  'collab.chat.hoursAgo': 'il y a {n} h',
  'collab.notes.title': 'Notes',
  'collab.notes.new': 'Nouvelle note',
  'collab.notes.empty': 'Aucune note',
  'collab.notes.emptyHint': 'Commencez à capturer vos idées et plans',
  'collab.notes.all': 'Toutes',
  'collab.notes.titlePlaceholder': 'Titre de la note',
  'collab.notes.contentPlaceholder': 'Écrivez quelque chose…',
  'collab.notes.categoryPlaceholder': 'Catégorie',
  'collab.notes.newCategory': 'Nouvelle catégorie…',
  'collab.notes.category': 'Catégorie',
  'collab.notes.noCategory': 'Sans catégorie',
  'collab.notes.color': 'Couleur',
  'collab.notes.save': 'Enregistrer',
  'collab.notes.cancel': 'Annuler',
  'collab.notes.edit': 'Modifier',
  'collab.notes.delete': 'Supprimer',
  'collab.notes.pin': 'Épingler',
  'collab.notes.unpin': 'Désépingler',
  'collab.notes.daysAgo': 'il y a {n} j',
  'collab.notes.categorySettings': 'Gérer les catégories',
  'collab.notes.create': 'Créer',
  'collab.notes.website': 'Site web',
  'collab.notes.websitePlaceholder': 'https://…',
  'collab.notes.attachFiles': 'Joindre des fichiers',
  'collab.notes.noCategoriesYet': 'Aucune catégorie',
  'collab.notes.emptyDesc': 'Créez une note pour commencer',
  'collab.polls.title': 'Sondages',
  'collab.polls.new': 'Nouveau sondage',
  'collab.polls.empty': 'Aucun sondage',
  'collab.polls.emptyHint': 'Posez des questions au groupe et votez ensemble',
  'collab.polls.question': 'Question',
  'collab.polls.questionPlaceholder': 'Que devrait-on faire ?',
  'collab.polls.addOption': '+ Ajouter une option',
  'collab.polls.optionPlaceholder': 'Option {n}',
  'collab.polls.create': 'Créer le sondage',
  'collab.polls.close': 'Fermer',
  'collab.polls.closed': 'Fermé',
  'collab.polls.votes': '{n} votes',
  'collab.polls.vote': '{n} vote',
  'collab.polls.multipleChoice': 'Choix multiples',
  'collab.polls.multiChoice': 'Choix multiples',
  'collab.polls.deadline': 'Date limite',
  'collab.polls.option': 'Option',
  'collab.polls.options': 'Options',
  'collab.polls.delete': 'Supprimer',
  'collab.polls.closedSection': 'Fermés',

  // Permissions
  'admin.tabs.permissions': 'Permissions',
  'perm.title': 'Paramètres des permissions',
  'perm.subtitle': 'Contrôlez qui peut effectuer des actions dans l\'application',
  'perm.saved': 'Paramètres des permissions enregistrés',
  'perm.resetDefaults': 'Réinitialiser par défaut',
  'perm.customized': 'personnalisé',
  'perm.level.admin': 'Administrateur uniquement',
  'perm.level.tripOwner': 'Propriétaire du voyage',
  'perm.level.tripMember': 'Membres du voyage',
  'perm.level.everybody': 'Tout le monde',
  'perm.cat.trip': 'Gestion des voyages',
  'perm.cat.members': 'Gestion des membres',
  'perm.cat.files': 'Fichiers',
  'perm.cat.content': 'Contenu et planning',
  'perm.cat.extras': 'Budget, bagages et collaboration',
  'perm.action.trip_create': 'Créer des voyages',
  'perm.action.trip_edit': 'Modifier les détails du voyage',
  'perm.action.trip_delete': 'Supprimer des voyages',
  'perm.action.trip_archive': 'Archiver / désarchiver des voyages',
  'perm.action.trip_cover_upload': 'Télécharger l\'image de couverture',
  'perm.action.member_manage': 'Ajouter / supprimer des membres',
  'perm.action.file_upload': 'Télécharger des fichiers',
  'perm.action.file_edit': 'Modifier les métadonnées des fichiers',
  'perm.action.file_delete': 'Supprimer des fichiers',
  'perm.action.place_edit': 'Ajouter / modifier / supprimer des lieux',
  'perm.action.day_edit': 'Modifier les jours, notes et affectations',
  'perm.action.reservation_edit': 'Gérer les réservations',
  'perm.action.budget_edit': 'Gérer le budget',
  'perm.action.packing_edit': 'Gérer les listes de bagages',
  'perm.action.collab_edit': 'Collaboration (notes, sondages, chat)',
  'perm.action.share_manage': 'Gérer les liens de partage',
  'perm.actionHint.trip_create': 'Qui peut créer de nouveaux voyages',
  'perm.actionHint.trip_edit': 'Qui peut modifier le nom, les dates, la description et la devise du voyage',
  'perm.actionHint.trip_delete': 'Qui peut supprimer définitivement un voyage',
  'perm.actionHint.trip_archive': 'Qui peut archiver ou désarchiver un voyage',
  'perm.actionHint.trip_cover_upload': 'Qui peut télécharger ou modifier l\'image de couverture',
  'perm.actionHint.member_manage': 'Qui peut inviter ou supprimer des membres du voyage',
  'perm.actionHint.file_upload': 'Qui peut télécharger des fichiers vers un voyage',
  'perm.actionHint.file_edit': 'Qui peut modifier les descriptions et liens des fichiers',
  'perm.actionHint.file_delete': 'Qui peut déplacer des fichiers vers la corbeille ou les supprimer définitivement',
  'perm.actionHint.place_edit': 'Qui peut ajouter, modifier ou supprimer des lieux',
  'perm.actionHint.day_edit': 'Qui peut modifier les jours, notes de jours et affectations de lieux',
  'perm.actionHint.reservation_edit': 'Qui peut créer, modifier ou supprimer des réservations',
  'perm.actionHint.budget_edit': 'Qui peut créer, modifier ou supprimer des éléments de budget',
  'perm.actionHint.packing_edit': 'Qui peut gérer les articles de bagages et les sacs',
  'perm.actionHint.collab_edit': 'Qui peut créer des notes, des sondages et envoyer des messages',
  'perm.actionHint.share_manage': 'Qui peut créer ou supprimer des liens de partage publics',
  // Undo
  'undo.button': 'Annuler',
  'undo.tooltip': 'Annuler : {action}',
  'undo.assignPlace': 'Lieu ajouté au jour',
  'undo.removeAssignment': 'Lieu retiré du jour',
  'undo.reorder': 'Lieux réorganisés',
  'undo.optimize': 'Itinéraire optimisé',
  'undo.deletePlace': 'Lieu supprimé',
  'undo.deletePlaces': 'Lieux supprimés',
  'undo.moveDay': 'Lieu déplacé vers un autre jour',
  'undo.lock': 'Verrouillage du lieu modifié',
  'undo.importGpx': 'Import GPX',
  'undo.importKeyholeMarkup': 'Import KMZ/KML',
  'undo.importGoogleList': 'Import Google Maps',
  'undo.importNaverList': 'Import Naver Maps',

  // Notifications
  'notifications.title': 'Notifications',
  'notifications.markAllRead': 'Tout marquer comme lu',
  'notifications.deleteAll': 'Tout supprimer',
  'notifications.showAll': 'Voir toutes les notifications',
  'notifications.empty': 'Aucune notification',
  'notifications.emptyDescription': 'Vous êtes à jour !',
  'notifications.all': 'Toutes',
  'notifications.unreadOnly': 'Non lues',
  'notifications.markRead': 'Marquer comme lu',
  'notifications.markUnread': 'Marquer comme non lu',
  'notifications.delete': 'Supprimer',
  'notifications.system': 'Système',
  'notifications.synologySessionCleared.title': 'Synology Photos déconnecté',
  'notifications.synologySessionCleared.text': 'Votre serveur ou compte a changé — allez dans Paramètres pour tester à nouveau votre connexion.',
  'memories.error.loadAlbums': 'Impossible de charger les albums',
  'memories.error.linkAlbum': 'Impossible de lier l\'album',
  'memories.error.unlinkAlbum': 'Impossible de dissocier l\'album',
  'memories.error.syncAlbum': 'Impossible de synchroniser l\'album',
  'memories.error.loadPhotos': 'Impossible de charger les photos',
  'memories.error.addPhotos': 'Impossible d\'ajouter les photos',
  'memories.error.removePhoto': 'Impossible de supprimer la photo',
  'memories.error.toggleSharing': 'Impossible de mettre à jour le partage',
  'undo.addPlace': 'Lieu ajouté',
  'undo.done': 'Annulé : {action}',
  'notifications.test.title': 'Notification test de {actor}',
  'notifications.test.text': 'Ceci est une simple notification de test.',
  'notifications.test.booleanTitle': '{actor} demande votre approbation',
  'notifications.test.booleanText': 'Notification de test booléenne.',
  'notifications.test.accept': 'Approuver',
  'notifications.test.decline': 'Refuser',
  'notifications.test.navigateTitle': 'Allez voir quelque chose',
  'notifications.test.navigateText': 'Notification de test de navigation.',
  'notifications.test.goThere': 'Y aller',
  'notifications.test.adminTitle': 'Diffusion admin',
  'notifications.test.adminText': '{actor} a envoyé une notification de test à tous les admins.',
  'notifications.test.tripTitle': '{actor} a publié dans votre voyage',
  'notifications.test.tripText': 'Notification de test pour le voyage "{trip}".',

  // Todo
  'todo.subtab.packing': 'Liste de bagages',
  'todo.subtab.todo': 'À faire',
  'todo.completed': 'terminé(s)',
  'todo.filter.all': 'Tout',
  'todo.filter.open': 'En cours',
  'todo.filter.done': 'Terminé',
  'todo.uncategorized': 'Sans catégorie',
  'todo.namePlaceholder': 'Nom de la tâche',
  'todo.descriptionPlaceholder': 'Description (facultative)',
  'todo.unassigned': 'Non assigné',
  'todo.noCategory': 'Aucune catégorie',
  'todo.hasDescription': 'Avec description',
  'todo.addItem': 'Nouvelle tâche',
  'todo.sidebar.sortBy': 'Trier par',
  'todo.priority': 'Priorité',
  'todo.newCategoryLabel': 'nouvelle',
  'budget.categoriesLabel': 'catégories',
  'todo.newCategory': 'Nom de la catégorie',
  'todo.addCategory': 'Ajouter une catégorie',
  'todo.newItem': 'Nouvelle tâche',
  'todo.empty': 'Aucune tâche pour l\'instant. Ajoutez une tâche pour commencer !',
  'todo.filter.my': 'Mes tâches',
  'todo.filter.overdue': 'En retard',
  'todo.sidebar.tasks': 'Tâches',
  'todo.sidebar.categories': 'Catégories',
  'todo.detail.title': 'Tâche',
  'todo.detail.description': 'Description',
  'todo.detail.category': 'Catégorie',
  'todo.detail.dueDate': 'Date d\'échéance',
  'todo.detail.assignedTo': 'Assigné à',
  'todo.detail.delete': 'Supprimer',
  'todo.detail.save': 'Enregistrer les modifications',
  'todo.detail.create': 'Créer la tâche',
  'todo.detail.priority': 'Priorité',
  'todo.detail.noPriority': 'Aucune',
  'todo.sortByPrio': 'Priorité',

  // Notification system (added from feat/notification-system)
  'settings.notifyVersionAvailable': 'Nouvelle version disponible',
  'settings.notificationPreferences.noChannels': 'Aucun canal de notification n\'est configuré. Demandez à un administrateur de configurer les notifications par e-mail ou webhook.',
  'settings.webhookUrl.label': 'URL du webhook',
  'settings.webhookUrl.placeholder': 'https://discord.com/api/webhooks/...',
  'settings.webhookUrl.hint': 'Entrez votre URL de webhook Discord, Slack ou personnalisée pour recevoir des notifications.',
  'settings.webhookUrl.saved': 'URL du webhook enregistrée',
  'settings.webhookUrl.test': 'Tester',
  'settings.webhookUrl.testSuccess': 'Webhook de test envoyé avec succès',
  'settings.webhookUrl.testFailed': 'Échec du webhook de test',
  'settings.ntfyUrl.topicLabel': 'Sujet Ntfy',
  'settings.ntfyUrl.topicPlaceholder': 'my-trek-alerts',
  'settings.ntfyUrl.serverLabel': "URL du serveur Ntfy (optionnel)",
  'settings.ntfyUrl.serverPlaceholder': 'https://ntfy.sh',
  'settings.ntfyUrl.hint': "Entrez votre sujet Ntfy pour recevoir des notifications push. Laissez le serveur vide pour utiliser la valeur par défaut configurée par votre administrateur.",
  'settings.ntfyUrl.tokenLabel': "Jeton d'accès (optionnel)",
  'settings.ntfyUrl.tokenHint': 'Requis pour les sujets protégés par mot de passe.',
  'settings.ntfyUrl.saved': 'Paramètres Ntfy enregistrés',
  'settings.ntfyUrl.test': 'Tester',
  'settings.ntfyUrl.testSuccess': 'Notification de test Ntfy envoyée avec succès',
  'settings.ntfyUrl.testFailed': 'Échec de la notification de test Ntfy',
  'settings.ntfyUrl.tokenCleared': "Jeton d'accès effacé",
  'settings.notificationPreferences.inapp': 'In-App',
  'settings.notificationPreferences.webhook': 'Webhook',
  'settings.notificationPreferences.email': 'Email',
  'settings.notificationPreferences.ntfy': 'Ntfy',
  'admin.notifications.emailPanel.title': 'Email (SMTP)',
  'admin.notifications.webhookPanel.title': 'Webhook',
  'admin.notifications.inappPanel.title': 'In-App',
  'admin.notifications.inappPanel.hint': 'Les notifications in-app sont toujours actives et ne peuvent pas être désactivées globalement.',
  'admin.notifications.adminWebhookPanel.title': 'Webhook admin',
  'admin.notifications.adminWebhookPanel.hint': 'Ce webhook est utilisé exclusivement pour les notifications admin (ex. alertes de version). Il est séparé des webhooks utilisateur et s\'active automatiquement si une URL est configurée.',
  'admin.notifications.adminWebhookPanel.saved': 'URL du webhook admin enregistrée',
  'admin.notifications.adminWebhookPanel.testSuccess': 'Webhook de test envoyé avec succès',
  'admin.notifications.adminWebhookPanel.testFailed': 'Échec du webhook de test',
  'admin.notifications.adminWebhookPanel.alwaysOnHint': 'Le webhook admin s\'active automatiquement si une URL est configurée',
  'admin.notifications.ntfy': 'Ntfy',
  'admin.ntfy.hint': 'Permet aux utilisateurs de configurer leurs propres sujets ntfy pour les notifications push. Définissez le serveur par défaut ci-dessous pour pré-remplir les paramètres utilisateur.',
  'admin.notifications.testNtfy': 'Envoyer un Ntfy de test',
  'admin.notifications.testNtfySuccess': 'Ntfy de test envoyé avec succès',
  'admin.notifications.testNtfyFailed': 'Échec de l\'envoi du Ntfy de test',
  'admin.notifications.adminNtfyPanel.title': 'Ntfy admin',
  'admin.notifications.adminNtfyPanel.hint': 'Ce sujet Ntfy est utilisé exclusivement pour les notifications admin (ex. alertes de version). Il est séparé des sujets par utilisateur et s\'active toujours lorsqu\'il est configuré.',
  'admin.notifications.adminNtfyPanel.serverLabel': 'URL du serveur Ntfy',
  'admin.notifications.adminNtfyPanel.serverHint': 'Utilisé également comme serveur par défaut pour les notifications ntfy des utilisateurs. Laisser vide pour utiliser ntfy.sh. Les utilisateurs peuvent le modifier dans leurs propres paramètres.',
  'admin.notifications.adminNtfyPanel.serverPlaceholder': 'https://ntfy.sh',
  'admin.notifications.adminNtfyPanel.topicLabel': 'Sujet admin',
  'admin.notifications.adminNtfyPanel.topicPlaceholder': 'trek-admin-alerts',
  'admin.notifications.adminNtfyPanel.tokenLabel': "Jeton d'accès (optionnel)",
  'admin.notifications.adminNtfyPanel.tokenCleared': "Jeton d'accès admin effacé",
  'admin.notifications.adminNtfyPanel.saved': 'Paramètres Ntfy admin enregistrés',
  'admin.notifications.adminNtfyPanel.test': 'Envoyer un Ntfy de test',
  'admin.notifications.adminNtfyPanel.testSuccess': 'Ntfy de test envoyé avec succès',
  'admin.notifications.adminNtfyPanel.testFailed': 'Échec de l\'envoi du Ntfy de test',
  'admin.notifications.adminNtfyPanel.alwaysOnHint': 'Le Ntfy admin s\'active toujours lorsqu\'un sujet est configuré',
  'admin.notifications.adminNotificationsHint': 'Configurez quels canaux envoient les notifications admin (ex. alertes de version). Le webhook s\'active automatiquement si une URL webhook admin est définie.',
  'admin.notifications.tripReminders.title': 'Rappels de voyage',
  'admin.notifications.tripReminders.hint': 'Envoie une notification de rappel avant le début d\'un voyage (nécessite des jours de rappel définis sur le voyage).',
  'admin.notifications.tripReminders.enabled': 'Rappels de voyage activés',
  'admin.notifications.tripReminders.disabled': 'Rappels de voyage désactivés',
  'admin.tabs.notifications': 'Notifications',
  'notifications.versionAvailable.title': 'Mise à jour disponible',
  'notifications.versionAvailable.text': 'TREK {version} est maintenant disponible.',
  'notifications.versionAvailable.button': 'Voir les détails',
  'notif.test.title': '[Test] Notification',
  'notif.test.simple.text': 'Ceci est une simple notification de test.',
  'notif.test.boolean.text': 'Acceptez-vous cette notification de test ?',
  'notif.test.navigate.text': 'Cliquez ci-dessous pour accéder au tableau de bord.',

  // Notifications
  'notif.trip_invite.title': 'Invitation au voyage',
  'notif.trip_invite.text': '{actor} vous a invité à {trip}',
  'notif.booking_change.title': 'Réservation mise à jour',
  'notif.booking_change.text': '{actor} a mis à jour une réservation dans {trip}',
  'notif.trip_reminder.title': 'Rappel de voyage',
  'notif.trip_reminder.text': 'Votre voyage {trip} approche !',
  'notif.todo_due.title': 'Tâche à échéance',
  'notif.todo_due.text': '{todo} dans {trip} est due le {due}',
  'notif.vacay_invite.title': 'Invitation Vacay Fusion',
  'notif.vacay_invite.text': '{actor} vous invite à fusionner les plans de vacances',
  'notif.photos_shared.title': 'Photos partagées',
  'notif.photos_shared.text': '{actor} a partagé {count} photo(s) dans {trip}',
  'notif.collab_message.title': 'Nouveau message',
  'notif.collab_message.text': '{actor} a envoyé un message dans {trip}',
  'notif.packing_tagged.title': 'Affectation bagages',
  'notif.packing_tagged.text': '{actor} vous a assigné à {category} dans {trip}',
  'notif.version_available.title': 'Nouvelle version disponible',
  'notif.version_available.text': 'TREK {version} est maintenant disponible',
  'notif.action.view_trip': 'Voir le voyage',
  'notif.action.view_collab': 'Voir les messages',
  'notif.action.view_packing': 'Voir les bagages',
  'notif.action.view_photos': 'Voir les photos',
  'notif.action.view_vacay': 'Voir Vacay',
  'notif.action.view_admin': 'Aller à l\'admin',
  'notif.action.view': 'Voir',
  'notif.action.accept': 'Accepter',
  'notif.action.decline': 'Refuser',
  'notif.generic.title': 'Notification',
  'notif.generic.text': 'Vous avez une nouvelle notification',
  'notif.dev.unknown_event.title': '[DEV] Événement inconnu',
  'notif.dev.unknown_event.text': 'Le type d\'événement "{event}" n\'est pas enregistré dans EVENT_NOTIFICATION_CONFIG',

  // Journey, Dashboard, Nav, DayPlan
  'common.justNow': 'à l\'instant',
  'common.hoursAgo': 'il y a {count}h',
  'common.daysAgo': 'il y a {count}j',
  'journey.search.placeholder': 'Rechercher des journaux…',
  'journey.search.noResults': 'Aucun journal ne correspond à « {query} »',
  'journey.title': 'Journal de voyage',
  'journey.subtitle': 'Suivez vos voyages en temps réel',
  'journey.new': 'Nouveau journal',
  'journey.create': 'Créer',
  'journey.titlePlaceholder': 'Où allez-vous ?',
  'journey.empty': 'Aucun journal pour le moment',
  'journey.emptyHint': 'Commencez à documenter votre prochain voyage',
  'journey.deleted': 'Journal supprimé',
  'journey.createError': 'Impossible de créer le journal',
  'journey.deleteError': 'Impossible de supprimer le journal',
  'journey.deleteConfirmTitle': 'Supprimer',
  'journey.deleteConfirmMessage': 'Supprimer « {title} » ? Cette action est irréversible.',
  'journey.deleteConfirmGeneric': 'Êtes-vous sûr de vouloir supprimer ceci ?',
  'journey.notFound': 'Journal introuvable',
  'journey.photos': 'Photos',
  'journey.timelineEmpty': 'Aucune étape pour le moment',
  'journey.timelineEmptyHint': 'Ajoutez un check-in ou écrivez une entrée de journal pour commencer',
  'journey.status.draft': 'Brouillon',
  'journey.status.active': 'Actif',
  'journey.status.completed': 'Terminé',
  'journey.status.upcoming': 'À venir',
  'journey.status.archived': 'Archivé',
  'journey.checkin.add': 'Check-in',
  'journey.checkin.namePlaceholder': 'Nom du lieu',
  'journey.checkin.notesPlaceholder': 'Notes (facultatif)',
  'journey.checkin.save': 'Enregistrer',
  'journey.checkin.error': 'Impossible d\'enregistrer le check-in',
  'journey.entry.add': 'Journal',
  'journey.entry.edit': 'Modifier l\'entrée',
  'journey.entry.titlePlaceholder': 'Titre (facultatif)',
  'journey.entry.bodyPlaceholder': 'Que s\'est-il passé aujourd\'hui ?',
  'journey.entry.save': 'Enregistrer',
  'journey.entry.error': 'Impossible d\'enregistrer l\'entrée',
  'journey.photo.add': 'Photo',
  'journey.photo.uploadError': 'Échec du téléversement',
  'journey.share.share': 'Partager',
  'journey.share.public': 'Public',
  'journey.share.linkCopied': 'Lien public copié',
  'journey.share.disabled': 'Partage public désactivé',
  'journey.editor.titlePlaceholder': 'Donnez un nom à ce moment...',
  'journey.editor.bodyPlaceholder': 'Racontez l\'histoire de cette journée...',
  'journey.editor.placePlaceholder': 'Lieu (facultatif)',
  'journey.editor.tagsPlaceholder': 'Tags : pépite cachée, meilleur repas, à revisiter...',
  'journey.visibility.private': 'Privé',
  'journey.visibility.shared': 'Partagé',
  'journey.visibility.public': 'Public',
  'journey.emptyState.title': 'Votre histoire commence ici',
  'journey.emptyState.subtitle': 'Faites un check-in ou écrivez votre première entrée de journal',
  'journey.frontpage.subtitle': 'Transformez vos voyages en histoires inoubliables',
  'journey.frontpage.createJourney': 'Créer un journal',
  'journey.frontpage.activeJourney': 'Journal actif',
  'journey.frontpage.allJourneys': 'Tous les journaux',
  'journey.frontpage.journeys': 'journaux',
  'journey.frontpage.createNew': 'Créer un nouveau journal',
  'journey.frontpage.createNewSub': 'Choisissez des voyages, écrivez des récits, partagez vos aventures',
  'journey.frontpage.live': 'En direct',
  'journey.frontpage.synced': 'Synchronisé',
  'journey.frontpage.continueWriting': 'Continuer à écrire',
  'journey.frontpage.updated': 'Mis à jour {time}',
  'journey.frontpage.suggestionLabel': 'Voyage terminé récemment',
  'journey.frontpage.suggestionText': 'Transformez <strong>{title}</strong> en journal de voyage',
  'journey.frontpage.dismiss': 'Ignorer',
  'journey.frontpage.journeyName': 'Nom du journal',
  'journey.frontpage.namePlaceholder': 'ex. Asie du Sud-Est 2026',
  'journey.frontpage.selectTrips': 'Sélectionner des voyages',
  'journey.frontpage.tripsSelected': 'voyages sélectionnés',
  'journey.frontpage.trips': 'voyages',
  'journey.frontpage.placesImported': 'lieux seront importés',
  'journey.frontpage.places': 'lieux',
  'journey.detail.backToJourney': 'Retour au journal',
  'journey.detail.syncedWithTrips': 'Synchronisé avec les voyages',
  'journey.detail.addEntry': 'Ajouter une entrée',
  'journey.detail.newEntry': 'Nouvelle entrée',
  'journey.detail.editEntry': 'Modifier l\'entrée',
  'journey.detail.noEntries': 'Aucune entrée pour le moment',
  'journey.detail.noEntriesHint': 'Ajoutez un voyage pour commencer avec des entrées préremplies',
  'journey.detail.noPhotos': 'Aucune photo pour le moment',
  'journey.detail.noPhotosHint': 'Téléversez des photos dans les entrées ou parcourez votre bibliothèque Immich/Synology',
  'journey.detail.journeyStats': 'Statistiques du journal',
  'journey.detail.syncedTrips': 'Voyages synchronisés',
  'journey.detail.noTripsLinked': 'Aucun voyage lié pour le moment',
  'journey.detail.contributors': 'Contributeurs',
  'journey.detail.readMore': 'Lire la suite',
  'journey.detail.prosCons': 'Pour et contre',
  'journey.detail.photos': 'photos',
  'journey.detail.day': 'Jour {number}',
  'journey.detail.places': 'lieux',
  'journey.stats.days': 'Jours',
  'journey.stats.cities': 'Villes',
  'journey.stats.entries': 'Entrées',
  'journey.stats.photos': 'Photos',
  'journey.stats.places': 'Lieux',
  'journey.skeletons.show': 'Afficher les suggestions',
  'journey.skeletons.hide': 'Masquer les suggestions',
  'journey.verdict.lovedIt': 'Adoré',
  'journey.verdict.couldBeBetter': 'Pourrait être mieux',
  'journey.synced.places': 'lieux',
  'journey.synced.synced': 'synchronisé',
  'journey.editor.discardChangesConfirm': 'Vous avez des modifications non enregistrées. Les ignorer ?',
  'journey.editor.uploadPhotos': 'Téléverser des photos',
  'journey.editor.uploading': 'Envoi...',
  'journey.editor.fromGallery': 'Depuis la galerie',
  'journey.editor.allPhotosAdded': 'Toutes les photos ont déjà été ajoutées',
  'journey.editor.writeStory': 'Écrivez votre histoire...',
  'journey.editor.prosCons': 'Pour et contre',
  'journey.editor.pros': 'Pour',
  'journey.editor.cons': 'Contre',
  'journey.editor.proPlaceholder': 'Quelque chose de génial...',
  'journey.editor.conPlaceholder': 'Pas si génial...',
  'journey.editor.addAnother': 'Ajouter un autre',
  'journey.editor.date': 'Date',
  'journey.editor.location': 'Lieu',
  'journey.editor.searchLocation': 'Rechercher un lieu...',
  'journey.editor.mood': 'Humeur',
  'journey.editor.weather': 'Météo',
  'journey.editor.photoFirst': '1er',
  'journey.editor.makeFirst': 'Mettre en 1er',
  'journey.editor.searching': 'Recherche...',
  'journey.mood.amazing': 'Incroyable',
  'journey.mood.good': 'Bien',
  'journey.mood.neutral': 'Neutre',
  'journey.mood.rough': 'Difficile',
  'journey.weather.sunny': 'Ensoleillé',
  'journey.weather.partly': 'Partiellement nuageux',
  'journey.weather.cloudy': 'Nuageux',
  'journey.weather.rainy': 'Pluvieux',
  'journey.weather.stormy': 'Orageux',
  'journey.weather.cold': 'Neigeux',
  'journey.trips.linkTrip': 'Lier un voyage',
  'journey.trips.searchTrip': 'Rechercher un voyage',
  'journey.trips.searchPlaceholder': 'Nom du voyage ou destination...',
  'journey.trips.noTripsAvailable': 'Aucun voyage disponible',
  'journey.trips.link': 'Lier',
  'journey.trips.tripLinked': 'Voyage lié',
  'journey.trips.linkFailed': 'Échec de la liaison du voyage',
  'journey.trips.addTrip': 'Ajouter un voyage',
  'journey.trips.unlinkTrip': 'Délier le voyage',
  'journey.trips.unlinkMessage': 'Délier « {title} » ? Toutes les entrées et photos synchronisées de ce voyage seront définitivement supprimées. Cette action est irréversible.',
  'journey.trips.unlink': 'Délier',
  'journey.trips.tripUnlinked': 'Voyage délié',
  'journey.trips.unlinkFailed': 'Échec de la suppression du lien',
  'journey.trips.noTripsLinkedSettings': 'Aucun voyage lié',
  'journey.contributors.invite': 'Inviter un contributeur',
  'journey.contributors.searchUser': 'Rechercher un utilisateur',
  'journey.contributors.searchPlaceholder': 'Nom d\'utilisateur ou e-mail...',
  'journey.contributors.noUsers': 'Aucun utilisateur trouvé',
  'journey.contributors.role': 'Rôle',
  'journey.contributors.added': 'Contributeur ajouté',
  'journey.contributors.addFailed': 'Échec de l\'ajout du contributeur',
  'journey.share.publicShare': 'Partage public',
  'journey.share.createLink': 'Créer un lien de partage',
  'journey.share.linkCreated': 'Lien de partage créé',
  'journey.share.createFailed': 'Échec de la création du lien',
  'journey.share.copy': 'Copier',
  'journey.share.copied': 'Copié !',
  'journey.share.timeline': 'Chronologie',
  'journey.share.gallery': 'Galerie',
  'journey.share.map': 'Carte',
  'journey.share.removeLink': 'Supprimer le lien de partage',
  'journey.share.linkDeleted': 'Lien de partage supprimé',
  'journey.share.deleteFailed': 'Échec de la suppression',
  'journey.share.updateFailed': 'Échec de la mise à jour',

  // Journey — Invite
  'journey.invite.role': 'Rôle',
  'journey.invite.viewer': 'Lecteur',
  'journey.invite.editor': 'Éditeur',
  'journey.invite.invite': 'Inviter',
  'journey.invite.inviting': 'Invitation...',
  'journey.settings.title': 'Paramètres du journal',
  'journey.settings.coverImage': 'Image de couverture',
  'journey.settings.changeCover': 'Changer la couverture',
  'journey.settings.addCover': 'Ajouter une image de couverture',
  'journey.settings.name': 'Nom',
  'journey.settings.subtitle': 'Sous-titre',
  'journey.settings.subtitlePlaceholder': 'ex. Thaïlande, Vietnam et Cambodge',
  'journey.settings.endJourney': 'Archiver le journal',
  'journey.settings.reopenJourney': 'Restaurer le journal',
  'journey.settings.archived': 'Journal archivé',
  'journey.settings.reopened': 'Journal rouvert',
  'journey.settings.endDescription': 'Masque l\'indicateur En direct. Vous pouvez rouvrir à tout moment.',
  'journey.settings.delete': 'Supprimer',
  'journey.settings.deleteJourney': 'Supprimer le journal',
  'journey.settings.deleteMessage': 'Supprimer « {title} » ? Toutes les entrées et photos seront perdues.',
  'journey.settings.saved': 'Paramètres enregistrés',
  'journey.settings.saveFailed': 'Échec de l\'enregistrement',
  'journey.settings.coverUpdated': 'Couverture mise à jour',
  'journey.settings.coverFailed': 'Échec du téléversement',
  'journey.settings.failedToDelete': 'Échec de la suppression',
  'journey.entries.deleteTitle': "Supprimer l'entrée",
  'journey.photosUploaded': '{count} photos téléversées',
  'journey.photosAdded': '{count} photos ajoutées',
  'journey.public.notFound': 'Introuvable',
  'journey.public.notFoundMessage': 'Ce journal n\'existe pas ou le lien a expiré.',
  'journey.public.readOnly': 'Lecture seule · Journal public',
  'journey.public.tagline': 'Travel Resource & Exploration Kit',
  'journey.public.sharedVia': 'Partagé via',
  'journey.public.madeWith': 'Créé avec',
  'journey.pdf.journeyBook': 'Carnet de voyage',
  'journey.pdf.madeWith': 'Créé avec TREK',
  'journey.pdf.day': 'Jour',
  'journey.pdf.theEnd': 'Fin',
  'journey.pdf.saveAsPdf': 'Enregistrer en PDF',
  'journey.pdf.pages': 'pages',
  'journey.picker.tripPeriod': 'Période du voyage',
  'journey.picker.dateRange': 'Plage de dates',
  'journey.picker.allPhotos': 'Toutes les photos',
  'journey.picker.albums': 'Albums',
  'journey.picker.selected': 'sélectionnés',
  'journey.picker.addTo': 'Ajouter à',
  'journey.picker.newGallery': 'Nouvelle galerie',
  'journey.picker.selectAll': 'Tout sélectionner',
  'journey.picker.deselectAll': 'Tout désélectionner',
  'journey.picker.noAlbums': 'Aucun album trouvé',
  'journey.picker.selectDate': 'Sélectionner une date',
  'journey.picker.search': 'Rechercher',
  'dashboard.greeting.morning': 'Bonjour,',
  'dashboard.greeting.afternoon': 'Bon après-midi,',
  'dashboard.greeting.evening': 'Bonsoir,',
  'dashboard.mobile.liveNow': 'En direct',
  'dashboard.mobile.tripProgress': 'Progression du voyage',
  'dashboard.mobile.daysLeft': '{count} jours restants',
  'dashboard.mobile.places': 'Lieux',
  'dashboard.mobile.buddies': 'Compagnons',
  'dashboard.mobile.newTrip': 'Nouveau voyage',
  'dashboard.mobile.currency': 'Devise',
  'dashboard.mobile.timezone': 'Fuseau horaire',
  'dashboard.mobile.upcomingTrips': 'Voyages à venir',
  'dashboard.mobile.yourTrips': 'Vos voyages',
  'dashboard.mobile.trips': 'voyages',
  'dashboard.mobile.starts': 'Début',
  'dashboard.mobile.duration': 'Durée',
  'dashboard.mobile.day': 'jour',
  'dashboard.mobile.days': 'jours',
  'dashboard.mobile.ongoing': 'En cours',
  'dashboard.mobile.startsToday': 'Commence aujourd\'hui',
  'dashboard.mobile.tomorrow': 'Demain',
  'dashboard.mobile.inDays': 'Dans {count} jours',
  'dashboard.mobile.inMonths': 'Dans {count} mois',
  'dashboard.mobile.completed': 'Terminé',
  'dashboard.mobile.currencyConverter': 'Convertisseur de devises',
  'nav.profile': 'Profil',
  'nav.bottomSettings': 'Paramètres',
  'nav.bottomAdmin': 'Administration',
  'nav.bottomLogout': 'Déconnexion',
  'nav.bottomAdminBadge': 'Admin',
  'dayplan.mobile.addPlace': 'Ajouter un lieu',
  'dayplan.mobile.searchPlaces': 'Rechercher des lieux...',
  'dayplan.mobile.allAssigned': 'Tous les lieux attribués',
  'dayplan.mobile.noMatch': 'Aucun résultat',
  'dayplan.mobile.createNew': 'Créer un nouveau lieu',
  'admin.addons.catalog.journey.name': 'Journal de voyage',
  'admin.addons.catalog.journey.description': 'Suivi de voyages et journal avec check-ins, photos et récits quotidiens',
  // OAuth scope groups
  'oauth.scope.group.trips': 'Voyages',
  'oauth.scope.group.places': 'Lieux',
  'oauth.scope.group.atlas': 'Atlas',
  'oauth.scope.group.packing': 'Bagages',
  'oauth.scope.group.todos': 'Tâches',
  'oauth.scope.group.budget': 'Budget',
  'oauth.scope.group.reservations': 'Réservations',
  'oauth.scope.group.collab': 'Collaboration',
  'oauth.scope.group.notifications': 'Notifications',
  'oauth.scope.group.vacay': 'Congés',
  'oauth.scope.group.geo': 'Géo',
  'oauth.scope.group.weather': 'Météo',
  'oauth.scope.group.journey': 'Journal de voyage',

  // OAuth scope labels & descriptions
  'oauth.scope.trips:read.label': 'Voir les voyages et itinéraires',
  'oauth.scope.trips:read.description': 'Lire les voyages, jours, notes et membres',
  'oauth.scope.trips:write.label': 'Modifier les voyages et itinéraires',
  'oauth.scope.trips:write.description': 'Créer et mettre à jour les voyages, jours, notes et gérer les membres',
  'oauth.scope.trips:delete.label': 'Supprimer des voyages',
  'oauth.scope.trips:delete.description': 'Supprimer définitivement des voyages entiers — cette action est irréversible',
  'oauth.scope.trips:share.label': 'Gérer les liens de partage',
  'oauth.scope.trips:share.description': 'Créer, modifier et révoquer des liens de partage publics',
  'oauth.scope.places:read.label': 'Voir les lieux et données cartographiques',
  'oauth.scope.places:read.description': 'Lire les lieux, affectations de jours, étiquettes et catégories',
  'oauth.scope.places:write.label': 'Gérer les lieux',
  'oauth.scope.places:write.description': 'Créer, modifier et supprimer des lieux, affectations et étiquettes',
  'oauth.scope.atlas:read.label': 'Voir l\'Atlas',
  'oauth.scope.atlas:read.description': 'Lire les pays visités, régions et liste de souhaits',
  'oauth.scope.atlas:write.label': 'Gérer l\'Atlas',
  'oauth.scope.atlas:write.description': 'Marquer des pays et régions visités, gérer la liste de souhaits',
  'oauth.scope.packing:read.label': 'Voir les listes de bagages',
  'oauth.scope.packing:read.description': 'Lire les articles, sacs et assignations de catégories',
  'oauth.scope.packing:write.label': 'Gérer les listes de bagages',
  'oauth.scope.packing:write.description': 'Ajouter, modifier, supprimer, cocher et réordonner les articles et sacs',
  'oauth.scope.todos:read.label': 'Voir les listes de tâches',
  'oauth.scope.todos:read.description': 'Lire les tâches et assignations de catégories',
  'oauth.scope.todos:write.label': 'Gérer les listes de tâches',
  'oauth.scope.todos:write.description': 'Créer, modifier, cocher, supprimer et réordonner les tâches',
  'oauth.scope.budget:read.label': 'Voir le budget',
  'oauth.scope.budget:read.description': 'Lire les dépenses et la répartition du budget',
  'oauth.scope.budget:write.label': 'Gérer le budget',
  'oauth.scope.budget:write.description': 'Créer, modifier et supprimer des dépenses',
  'oauth.scope.reservations:read.label': 'Voir les réservations',
  'oauth.scope.reservations:read.description': 'Lire les réservations et détails d\'hébergement',
  'oauth.scope.reservations:write.label': 'Gérer les réservations',
  'oauth.scope.reservations:write.description': 'Créer, modifier, supprimer et réordonner les réservations',
  'oauth.scope.collab:read.label': 'Voir la collaboration',
  'oauth.scope.collab:read.description': 'Lire les notes, sondages et messages collaboratifs',
  'oauth.scope.collab:write.label': 'Gérer la collaboration',
  'oauth.scope.collab:write.description': 'Créer, modifier et supprimer des notes, sondages et messages',
  'oauth.scope.notifications:read.label': 'Voir les notifications',
  'oauth.scope.notifications:read.description': 'Lire les notifications et le nombre de non-lus',
  'oauth.scope.notifications:write.label': 'Gérer les notifications',
  'oauth.scope.notifications:write.description': 'Marquer les notifications comme lues et y répondre',
  'oauth.scope.vacay:read.label': 'Voir les plans de congés',
  'oauth.scope.vacay:read.description': 'Lire les données, entrées et statistiques de congés',
  'oauth.scope.vacay:write.label': 'Gérer les plans de congés',
  'oauth.scope.vacay:write.description': 'Créer et gérer les entrées de congés, jours fériés et plans d\'équipe',
  'oauth.scope.geo:read.label': 'Cartes et géocodage',
  'oauth.scope.geo:read.description': 'Chercher des lieux, résoudre des URL cartographiques et géocoder des coordonnées',
  'oauth.scope.weather:read.label': 'Prévisions météo',
  'oauth.scope.weather:read.description': 'Obtenir les prévisions météo pour les lieux et dates de voyage',
  'oauth.scope.journey:read.label': 'Voir les journaux de voyage',
  'oauth.scope.journey:read.description': 'Lire les journaux de voyage, les entrées et la liste des contributeurs',
  'oauth.scope.journey:write.label': 'Gérer les journaux de voyage',
  'oauth.scope.journey:write.description': 'Créer, modifier et supprimer les journaux de voyage et leurs entrées',
  'oauth.scope.journey:share.label': 'Gérer les liens de journaux de voyage',
  'oauth.scope.journey:share.description': 'Créer, modifier et révoquer des liens de partage publics pour les journaux de voyage',

  // System notices
  'system_notice.welcome_v1.title': 'Bienvenue sur TREK',
  'system_notice.welcome_v1.body': 'Votre planificateur de voyage tout-en-un. Créez des itinéraires, partagez vos voyages et restez organisé — en ligne ou hors ligne.',
  'system_notice.welcome_v1.cta_label': 'Planifier un voyage',
  'system_notice.welcome_v1.hero_alt': 'Destination de voyage pittoresque avec l\'interface TREK',
  'system_notice.welcome_v1.highlight_plan': 'Itinéraires jour par jour',
  'system_notice.welcome_v1.highlight_share': 'Collaborez avec vos partenaires',
  'system_notice.welcome_v1.highlight_offline': 'Fonctionne hors ligne sur mobile',
  'system_notice.dev_test_modal.title': '[Dev] Test notice',
  'system_notice.dev_test_modal.body': 'This is a dev-only test notice.',
  'system_notice.pager.prev': 'Avis précédent',
  'system_notice.pager.next': 'Avis suivant',
  'system_notice.pager.counter': '{current} / {total}',
  'system_notice.pager.goto': "Aller à l'avis {n}",
  'system_notice.pager.position': 'Avis {current} sur {total}',
  // System notices — 3.0.0 upgrade
  'system_notice.v3_photos.title': 'Les photos ont bougé dans 3.0',
  'system_notice.v3_photos.body': "**Photos** dans le planificateur ont été supprimées. Tes photos sont en sécurité — TREK n'a jamais modifié ta bibliothèque Immich ou Synology.\n\nLes photos vivent désormais dans l'addon **Journey**. Journey est optionnel — s'il n'est pas encore disponible, demande à ton admin de l'activer dans Admin → Modules.",
  'system_notice.v3_journey.title': 'Découvrez Journey — journal de voyage',
  'system_notice.v3_journey.body': 'Documente tes voyages sous forme de récits enrichis avec chronologies, galeries photos et cartes interactives.',
  'system_notice.v3_journey.cta_label': 'Ouvrir Journey',
  'system_notice.v3_journey.highlight_timeline': 'Chronologie et galerie par jour',
  'system_notice.v3_journey.highlight_photos': 'Import depuis Immich ou Synology',
  'system_notice.v3_journey.highlight_share': 'Partage public — sans connexion requise',
  'system_notice.v3_journey.highlight_export': 'Export en livre photo PDF',
  'system_notice.v3_features.title': 'Plus de nouveautés en 3.0',
  'system_notice.v3_features.body': 'Quelques autres choses à savoir sur cette version.',
  'system_notice.v3_features.highlight_dashboard': 'Tableau de bord repensé mobile-first',
  'system_notice.v3_features.highlight_offline': 'Mode hors ligne complet en PWA',
  'system_notice.v3_features.highlight_search': 'Autocomplétion des lieux en temps réel',
  'system_notice.v3_features.highlight_import': 'Importer des lieux depuis KMZ/KML',

  // System notices — MCP OAuth 2.1 upgrade
  'system_notice.v3_mcp.title': 'MCP : mise à niveau OAuth 2.1',
  'system_notice.v3_mcp.body': "L'intégration MCP a été entièrement repensée. OAuth 2.1 est désormais la méthode d'authentification recommandée. Les tokens statiques (trek_\u2026) sont dépréciés et seront supprimés dans une future version.",
  'system_notice.v3_mcp.highlight_oauth':      'OAuth 2.1 recommandé (mcp-remote)',
  'system_notice.v3_mcp.highlight_scopes':     '24 scopes de permissions granulaires',
  'system_notice.v3_mcp.highlight_deprecated': 'Tokens statiques trek_ dépréciés',
  'system_notice.v3_mcp.highlight_tools':      'Outils et prompts étendus',

  // System notices — personal thank you
  'system_notice.v3_thankyou.title': 'Un mot personnel de ma part',
  'system_notice.v3_thankyou.body': 'Avant de continuer — je veux prendre un instant.\n\nTREK a commencé comme un projet perso que j\'ai construit pour mes propres voyages. Je n\'aurais jamais imaginé qu\'il grandirait au point que 4 000 d\'entre vous lui fassent confiance pour planifier vos aventures. Chaque étoile, chaque issue, chaque demande de fonctionnalité — je les lis toutes, et ce sont elles qui me font tenir pendant les nuits blanches entre un travail à temps plein et l\'université.\n\nJe veux que vous sachiez : TREK sera toujours open source, toujours auto-hébergé, toujours à vous. Pas de tracking, pas d\'abonnements, pas de conditions cachées. Juste un outil construit par quelqu\'un qui aime voyager autant que vous.\n\nUn merci tout particulier à [jubnl](https://github.com/jubnl) — tu es devenu un collaborateur incroyable. Une grande partie de ce qui rend la 3.0 géniale porte ton empreinte. Merci d\'avoir cru en ce projet quand il était encore brut.\n\nEt à chacun d\'entre vous qui a signalé un bug, traduit une chaîne, partagé TREK avec un ami ou simplement l\'a utilisé pour planifier un voyage — **merci**. Vous êtes la raison pour laquelle tout ceci existe.\n\nÀ de nombreuses autres aventures ensemble.\n\n— Maurice\n\n---\n\n[Rejoins la communauté sur Discord](https://discord.gg/7Q6M6jDwzf)\n\nSi TREK rend tes voyages meilleurs, un [petit café](https://ko-fi.com/mauriceboe) aide toujours à garder les lumières allumées.',
  // System notices — 3.0.14
  'system_notice.v3014_whitespace_collision.title': "Action requise : conflit de compte utilisateur",
  'system_notice.v3014_whitespace_collision.body': "La mise à niveau 3.0.14 a détecté un ou plusieurs conflits de nom d'utilisateur ou d'adresse e-mail causés par des espaces en début ou en fin de valeur dans les comptes enregistrés. Les comptes concernés ont été renommés automatiquement. Consultez les journaux du serveur pour les lignes commençant par **[migration] WHITESPACE COLLISION** afin d'identifier les comptes nécessitant une vérification.",
  'transport.addTransport': 'Ajouter un transport',
  'transport.modalTitle.create': 'Ajouter un transport',
  'transport.modalTitle.edit': 'Modifier le transport',
  'transport.title': 'Transports',
  'transport.addManual': 'Transport manuel',
}

export default fr

