const fr: Record<string, string> = {
  // Common
  'common.save': 'Enregistrer',
  'common.cancel': 'Annuler',
  'common.delete': 'Supprimer',
  'common.edit': 'Modifier',
  'common.add': 'Ajouter',
  'common.loading': 'Chargement…',
  'common.error': 'Erreur',
  '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.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.archive': 'Archiver',
  '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.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.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.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.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.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',
  'admin.smtp.title': 'E-mail et notifications',
  'admin.smtp.hint': 'Configuration SMTP pour les notifications par e-mail. Optionnel : URL webhook pour Discord, Slack, etc.',
  'admin.smtp.testButton': 'Envoyer un e-mail de test',
  'admin.smtp.testSuccess': 'E-mail de test envoyé avec succès',
  'admin.smtp.testFailed': 'Échec de l\'e-mail de test',
  'dayplan.icsTooltip': 'Exporter le calendrier (ICS)',
  'share.linkTitle': 'Lien public',
  'share.linkHint': 'Créez un lien que n\'importe qui peut utiliser pour consulter ce voyage sans se connecter. Lecture seule — aucune modification possible.',
  'share.createLink': 'Créer un lien',
  'share.deleteLink': 'Supprimer le lien',
  'share.createError': 'Impossible de créer le lien',
  'common.copy': 'Copier',
  'common.copied': 'Copié',
  'share.permMap': 'Carte et plan',
  'share.permBookings': 'Réservations',
  'share.permPacking': 'Bagages',
  'shared.expired': 'Lien expiré ou invalide',
  'shared.expiredHint': 'Ce lien de partage n\'est plus actif.',
  'shared.readOnly': 'Vue en lecture seule',
  'shared.tabPlan': 'Plan',
  'shared.tabBookings': 'Réservations',
  'shared.tabPacking': 'Bagages',
  'shared.tabBudget': 'Budget',
  'shared.tabChat': 'Chat',
  'shared.days': 'jours',
  'shared.places': 'lieux',
  'shared.other': 'Autre',
  'shared.totalBudget': 'Budget total',
  'shared.messages': 'messages',
  'shared.sharedVia': 'Partagé via',
  'shared.confirmed': 'Confirmé',
  'shared.pending': 'En attente',
  'share.permBudget': 'Budget',
  'share.permCollab': 'Chat',
  'settings.on': 'Activé',
  'settings.off': 'Désactivé',
  'settings.mcp.title': 'Configuration MCP',
  'settings.mcp.endpoint': 'Point de terminaison MCP',
  'settings.mcp.clientConfig': 'Configuration du client',
  'settings.mcp.clientConfigHint': 'Remplacez <your_token> par un token API de la liste ci-dessous. Le chemin vers npx devra peut-être être ajusté selon votre système (ex. C:\\PROGRA~1\\nodejs\\npx.cmd sous Windows).',
  'settings.mcp.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.account': 'Compte',
  '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.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 et un chiffre',
  '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.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.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.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 6 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.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.bagTracking.title': 'Suivi des bagages',
  'admin.bagTracking.subtitle': 'Activer le poids et l\'attribution de bagages pour les articles',
  'admin.tabs.config': 'Configuration',
  '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': 'Bagages',
  'admin.addons.catalog.packing.description': 'Listes de contrôle pour préparer vos bagages pour chaque voyage',
  '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': 'Journal d\'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': 'Tokens MCP',
  'admin.mcpTokens.title': 'Tokens MCP',
  'admin.mcpTokens.subtitle': 'Gérer les tokens API de tous les utilisateurs',
  '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',

  // 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 une année',
  '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.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.markVisited': 'Marquer comme visité',
  'atlas.markVisitedHint': 'Ajouter ce pays à votre liste de visités',
  'atlas.addToBucket': 'Ajouter à la bucket list',
  'atlas.addPoi': 'Ajouter un lieu',
  'atlas.bucketNamePlaceholder': 'Nom (pays, ville, lieu…)',
  'atlas.month': 'Mois',
  'atlas.year': 'Année',
  'atlas.addToBucketHint': 'Sauvegarder comme lieu à visiter',
  'atlas.bucketWhen': 'Quand prévoyez-vous d\'y aller ?',

  // Trip Planner
  'trip.tabs.plan': 'Plan',
  'trip.tabs.reservations': 'Réservations',
  'trip.tabs.reservationsShort': 'Résa',
  'trip.tabs.packing': 'Liste de bagages',
  'trip.tabs.packingShort': 'Bagages',
  'trip.tabs.budget': 'Budget',
  'trip.tabs.files': 'Fichiers',
  'trip.loading': 'Chargement du voyage…',
  '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 ?',

  // 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.importGpx': 'Importer GPX',
  'places.gpxImported': '{count} lieux importés depuis GPX',
  'places.gpxError': 'L\'import GPX a échoué',
  'places.urlResolved': 'Lieu importé depuis l\'URL',
  'places.assignToDay': 'Ajouter à quel jour ?',
  'places.all': 'Tous',
  'places.unplanned': 'Non planifiés',
  '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.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.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.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',

  // 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.meta.trainNumber': 'N° de train',
  'reservations.meta.platform': 'Quai',
  'reservations.meta.seat': 'Place',
  'reservations.meta.checkIn': 'Arrivée',
  '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 de location',
  '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)',

  // Budget
  'budget.title': 'Budget',
  '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.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.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.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.assignUser': 'Assigner un utilisateur',
  '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.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)',

  // 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.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.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.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.immichUrl': 'URL du serveur Immich',
  'memories.immichApiKey': 'Clé API',
  'memories.testConnection': 'Tester la connexion',
  'memories.connected': 'Connecté',
  'memories.disconnected': 'Non connecté',
  'memories.connectionSuccess': 'Connecté à Immich',
  'memories.connectionError': 'Impossible de se connecter à Immich',
  'memories.saved': 'Paramètres Immich enregistrés',
  'memories.oldest': 'Plus anciennes',
  'memories.newest': 'Plus récentes',
  'memories.allLocations': 'Tous les lieux',
  'memories.addPhotos': 'Ajouter des photos',
  'memories.selectPhotos': 'Sélectionner des photos depuis Immich',
  '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.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',
}

export default fr
