Files
TREK/client/src/i18n/translations/fr.ts
Maurice 069fd99341 Merge branch 'pr-169'
# Conflicts:
#	client/src/i18n/translations/ar.ts
#	client/src/i18n/translations/br.ts
#	client/src/i18n/translations/cs.ts
#	client/src/i18n/translations/de.ts
#	client/src/i18n/translations/en.ts
#	client/src/i18n/translations/es.ts
#	client/src/i18n/translations/fr.ts
#	client/src/i18n/translations/hu.ts
#	client/src/i18n/translations/it.ts
#	client/src/i18n/translations/nl.ts
#	client/src/i18n/translations/ru.ts
#	client/src/i18n/translations/zh.ts
#	client/src/pages/SettingsPage.tsx
2026-03-30 23:46:32 +02:00

1396 lines
71 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
const fr: 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é à 128 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