const fr: Record = { // 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.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 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 et 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.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.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 {title} 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.', '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