mirror of
https://github.com/mauriceboe/TREK.git
synced 2026-06-19 13:21:46 +00:00
4974013995
Mobile UI: - #722 timeline carousel no longer cut off by BottomNav (uses --bottom-nav-h var) - #723 scroll-snap-type relaxed to proximity so small swipes no longer skip entries - #724 defensive padding-bottom fix in JourneySettingsDialog for iOS PWA - #725 add back/settings buttons + journey title subtitle to mobile activity view - #726 active entry re-centers after scroll settle; tap inactive card activates it (does not jump straight into editor) Entry editor flow: - #727 photo uploads queue locally until Save for existing entries too (previously fired upload immediately; Cancel silently kept the new photo) - #728 Cancel/Close with unsaved changes now requires confirm (window.confirm) - #729 linking a Gallery photo into an entry now copies the row (old MOVE behavior meant Remove-from-Entry also nuked the Gallery original) - #731 addPhoto / addProviderPhoto / linkPhotoToEntry promote skeleton entries to concrete 'entry' type when content is added Permissions: - #732 updateJourney switched from canEdit to isOwner — editors can still edit entries and photos, just not the journey shell (title, cover, status) - #733 Contributors list gains a per-row remove (X) control with confirm - #734 my_role is computed server-side and returned with the journey; UI gates Settings/Add/Edit/Delete controls based on role - #736 createOrUpdateJourneyShareLink + deleteJourneyShareLink now require isOwner (previously NO permission check at all — anyone authenticated could publish or unpublish a journey) Immich upload (#730): - migration 111: add users.immich_auto_upload (default 0) - migration 112: seed provider_field for the toggle (idempotent, FK-safe) - journey photo upload only mirrors to Immich when the user has opted in - Settings UI gets a "Mirror journey photos to Immich on upload" checkbox Test updates: - JOURNEY-SVC-019 inverted to assert editor cannot update journey settings - JOURNEY-SHARE-007 now passes userId (owner) to deleteJourneyShareLink - FE-PAGE-JOURNEYDETAIL-148 inverted to assert photos stay pending until Save - client/tests still green (2676/2676) Also fixed en route: gallery entry title is now the literal 'Gallery' on the wire (used to send the translated label, which broke server-side title === 'Gallery' checks in non-English locales); confirm interpolation uses {username} single braces matching the existing i18n runtime; Settings footer uses icon-only delete/archive buttons on mobile so the row doesn't wrap.
2301 lines
129 KiB
TypeScript
2301 lines
129 KiB
TypeScript
const fr: Record<string, string> = {
|
||
// Common
|
||
'common.save': 'Enregistrer',
|
||
'common.showMore': 'Voir plus',
|
||
'common.showLess': 'Voir moins',
|
||
'common.cancel': 'Annuler',
|
||
'common.clear': 'Effacer',
|
||
'common.delete': 'Supprimer',
|
||
'common.edit': 'Modifier',
|
||
'common.add': 'Ajouter',
|
||
'common.loading': 'Chargement…',
|
||
'common.import': 'Importer',
|
||
'common.select': 'Sélectionner',
|
||
'common.selectAll': 'Tout sélectionner',
|
||
'common.deselectAll': 'Tout désélectionner',
|
||
'common.error': 'Erreur',
|
||
'common.unknownError': 'Erreur inconnue',
|
||
'common.tooManyAttempts': 'Trop de tentatives. Veuillez réessayer plus tard.',
|
||
'common.back': 'Retour',
|
||
'common.all': 'Tout',
|
||
'common.close': 'Fermer',
|
||
'common.open': 'Ouvrir',
|
||
'common.upload': 'Importer',
|
||
'common.search': 'Rechercher',
|
||
'common.confirm': 'Confirmer',
|
||
'common.ok': 'OK',
|
||
'common.yes': 'Oui',
|
||
'common.no': 'Non',
|
||
'common.or': 'ou',
|
||
'common.none': 'Aucun',
|
||
'common.date': 'Date',
|
||
'common.rename': 'Renommer',
|
||
'common.name': 'Nom',
|
||
'common.email': 'E-mail',
|
||
'common.password': 'Mot de passe',
|
||
'common.saving': 'Enregistrement…',
|
||
'common.saved': 'Enregistré',
|
||
'trips.memberRemoved': '{username} supprimé',
|
||
'trips.memberRemoveError': 'Échec de la suppression',
|
||
'trips.memberAdded': '{username} ajouté',
|
||
'trips.memberAddError': "Échec de l'ajout",
|
||
'common.expand': 'Développer',
|
||
'common.collapse': 'Réduire',
|
||
'trips.reminder': 'Rappel',
|
||
'trips.reminderNone': 'Aucun',
|
||
'trips.reminderDay': 'jour',
|
||
'trips.reminderDays': 'jours',
|
||
'trips.reminderCustom': 'Personnalisé',
|
||
'trips.reminderDaysBefore': 'jours avant le départ',
|
||
'trips.reminderDisabledHint': 'Les rappels de voyage sont désactivés. Activez-les dans Admin > Paramètres > Notifications.',
|
||
'common.update': 'Mettre à jour',
|
||
'common.change': 'Modifier',
|
||
'common.uploading': 'Import en cours…',
|
||
'common.backToPlanning': 'Retour à la planification',
|
||
'common.reset': 'Réinitialiser',
|
||
|
||
// Navbar
|
||
'nav.trip': 'Voyage',
|
||
'nav.share': 'Partager',
|
||
'nav.settings': 'Paramètres',
|
||
'nav.admin': 'Admin',
|
||
'nav.logout': 'Déconnexion',
|
||
'nav.lightMode': 'Mode clair',
|
||
'nav.darkMode': 'Mode sombre',
|
||
'nav.autoMode': 'Mode auto',
|
||
'nav.administrator': 'Administrateur',
|
||
|
||
// Dashboard
|
||
'dashboard.title': 'Mes voyages',
|
||
'dashboard.subtitle.loading': 'Chargement des voyages…',
|
||
'dashboard.subtitle.trips': '{count} voyages ({archived} archivés)',
|
||
'dashboard.subtitle.empty': 'Commencez votre premier voyage',
|
||
'dashboard.subtitle.activeOne': '{count} voyage actif',
|
||
'dashboard.subtitle.activeMany': '{count} voyages actifs',
|
||
'dashboard.subtitle.archivedSuffix': ' · {count} archivés',
|
||
'dashboard.newTrip': 'Nouveau voyage',
|
||
'dashboard.gridView': 'Vue en grille',
|
||
'dashboard.listView': 'Vue en liste',
|
||
'dashboard.currency': 'Devise',
|
||
'dashboard.timezone': 'Fuseau horaire',
|
||
'dashboard.localTime': 'Heure locale',
|
||
'dashboard.timezoneCustomTitle': 'Fuseau horaire personnalisé',
|
||
'dashboard.timezoneCustomLabelPlaceholder': 'Libellé (facultatif)',
|
||
'dashboard.timezoneCustomTzPlaceholder': 'ex. America/New_York',
|
||
'dashboard.timezoneCustomAdd': 'Ajouter',
|
||
'dashboard.timezoneCustomErrorEmpty': 'Saisissez un identifiant de fuseau horaire',
|
||
'dashboard.timezoneCustomErrorInvalid': 'Fuseau horaire invalide. Utilisez un format comme Europe/Berlin',
|
||
'dashboard.timezoneCustomErrorDuplicate': 'Déjà ajouté',
|
||
'dashboard.emptyTitle': 'Aucun voyage',
|
||
'dashboard.emptyText': 'Créez votre premier voyage et commencez à planifier !',
|
||
'dashboard.emptyButton': 'Créer un premier voyage',
|
||
'dashboard.nextTrip': 'Prochain voyage',
|
||
'dashboard.shared': 'Partagé',
|
||
'dashboard.sharedBy': 'Partagé par {name}',
|
||
'dashboard.days': 'Jours',
|
||
'dashboard.places': 'Lieux',
|
||
'dashboard.members': 'Compagnons de voyage',
|
||
'dashboard.archive': 'Archiver',
|
||
'dashboard.copyTrip': 'Copier',
|
||
'dashboard.copySuffix': 'copie',
|
||
'dashboard.restore': 'Restaurer',
|
||
'dashboard.archived': 'Archivé',
|
||
'dashboard.status.ongoing': 'En cours',
|
||
'dashboard.status.today': "Aujourd'hui",
|
||
'dashboard.status.tomorrow': 'Demain',
|
||
'dashboard.status.past': 'Passé',
|
||
'dashboard.status.daysLeft': '{count} jours restants',
|
||
'dashboard.toast.loadError': 'Impossible de charger les voyages',
|
||
'dashboard.toast.created': 'Voyage créé avec succès !',
|
||
'dashboard.toast.createError': 'Impossible de créer le voyage',
|
||
'dashboard.toast.updated': 'Voyage mis à jour !',
|
||
'dashboard.toast.updateError': 'Impossible de mettre à jour le voyage',
|
||
'dashboard.toast.deleted': 'Voyage supprimé',
|
||
'dashboard.toast.deleteError': 'Impossible de supprimer le voyage',
|
||
'dashboard.toast.archived': 'Voyage archivé',
|
||
'dashboard.toast.archiveError': "Impossible d'archiver le voyage",
|
||
'dashboard.toast.restored': 'Voyage restauré',
|
||
'dashboard.toast.restoreError': 'Impossible de restaurer le voyage',
|
||
'dashboard.toast.copied': 'Voyage copié !',
|
||
'dashboard.toast.copyError': 'Impossible de copier le voyage',
|
||
'dashboard.confirm.delete': 'Supprimer le voyage « {title} » ? Tous les lieux et plans seront définitivement supprimés.',
|
||
'dashboard.editTrip': 'Modifier le voyage',
|
||
'dashboard.createTrip': 'Créer un nouveau voyage',
|
||
'dashboard.tripTitle': 'Titre',
|
||
'dashboard.tripTitlePlaceholder': 'ex. Été au Japon',
|
||
'dashboard.tripDescription': 'Description',
|
||
'dashboard.tripDescriptionPlaceholder': 'De quoi parle ce voyage ?',
|
||
'dashboard.startDate': 'Date de début',
|
||
'dashboard.endDate': 'Date de fin',
|
||
'dashboard.dayCount': 'Nombre de jours',
|
||
'dashboard.dayCountHint': 'Nombre de jours à planifier lorsqu\'aucune date de voyage n\'est définie.',
|
||
'dashboard.noDateHint': 'Aucune date définie — 7 jours par défaut seront créés. Vous pouvez modifier cela à tout moment.',
|
||
'dashboard.coverImage': 'Image de couverture',
|
||
'dashboard.addCoverImage': 'Ajouter une image de couverture',
|
||
'dashboard.addMembers': 'Compagnons de voyage',
|
||
'dashboard.addMember': 'Ajouter un membre',
|
||
'dashboard.coverSaved': 'Image de couverture enregistrée',
|
||
'dashboard.coverUploadError': 'Échec de l\'import',
|
||
'dashboard.coverRemoveError': 'Échec de la suppression',
|
||
'dashboard.titleRequired': 'Le titre est obligatoire',
|
||
'dashboard.endDateError': 'La date de fin doit être postérieure à la date de début',
|
||
|
||
// Settings
|
||
'settings.title': 'Paramètres',
|
||
'settings.subtitle': 'Configurez vos paramètres personnels',
|
||
'settings.tabs.display': 'Affichage',
|
||
'settings.tabs.map': 'Carte',
|
||
'settings.tabs.notifications': 'Notifications',
|
||
'settings.tabs.integrations': 'Intégrations',
|
||
'settings.tabs.account': 'Compte',
|
||
'settings.tabs.offline': 'Offline',
|
||
'settings.tabs.about': 'À propos',
|
||
'settings.map': 'Carte',
|
||
'settings.mapTemplate': 'Modèle de carte',
|
||
'settings.mapTemplatePlaceholder.select': 'Sélectionner un modèle…',
|
||
'settings.mapDefaultHint': 'Laissez vide pour OpenStreetMap (par défaut)',
|
||
'settings.mapTemplatePlaceholder': 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',
|
||
'settings.mapHint': 'Modèle d\'URL pour les tuiles de carte',
|
||
'settings.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',
|
||
'settings.notificationsDisabled': 'Les notifications ne sont pas configurées. Demandez à un administrateur d\'activer les notifications par e-mail ou webhook.',
|
||
'settings.notificationsActive': 'Canal actif',
|
||
'settings.notificationsManagedByAdmin': 'Les événements de notification sont configurés par votre administrateur.',
|
||
'admin.notifications.title': 'Notifications',
|
||
'admin.notifications.hint': 'Choisissez un canal de notification. Un seul peut être actif à la fois.',
|
||
'admin.notifications.none': 'Désactivé',
|
||
'admin.notifications.email': 'E-mail (SMTP)',
|
||
'admin.notifications.webhook': 'Webhook',
|
||
'admin.notifications.save': 'Enregistrer les paramètres de notification',
|
||
'admin.notifications.saved': 'Paramètres de notification enregistrés',
|
||
'admin.notifications.testWebhook': 'Envoyer un webhook de test',
|
||
'admin.notifications.testWebhookSuccess': 'Webhook de test envoyé avec succès',
|
||
'admin.notifications.testWebhookFailed': 'Échec du webhook de test',
|
||
'admin.smtp.title': 'E-mail et notifications',
|
||
'admin.smtp.hint': 'Configuration SMTP pour l\'envoi des notifications par e-mail.',
|
||
'admin.smtp.testButton': 'Envoyer un e-mail de test',
|
||
'admin.webhook.hint': 'Envoyer des notifications vers un webhook externe (Discord, Slack, etc.).',
|
||
'admin.smtp.testSuccess': 'E-mail de test envoyé avec succès',
|
||
'admin.smtp.testFailed': 'Échec de l\'e-mail de test',
|
||
'dayplan.icsTooltip': 'Exporter le calendrier (ICS)',
|
||
'share.linkTitle': 'Lien public',
|
||
'share.linkHint': 'Créez un lien que n\'importe qui peut utiliser pour consulter ce voyage sans se connecter. Lecture seule — aucune modification possible.',
|
||
'share.createLink': 'Créer un lien',
|
||
'share.deleteLink': 'Supprimer le lien',
|
||
'share.createError': 'Impossible de créer le lien',
|
||
'common.copy': 'Copier',
|
||
'common.copied': 'Copié',
|
||
'share.permMap': 'Carte et plan',
|
||
'share.permBookings': 'Réservations',
|
||
'share.permPacking': 'Bagages',
|
||
'shared.expired': 'Lien expiré ou invalide',
|
||
'shared.expiredHint': 'Ce lien de partage n\'est plus actif.',
|
||
'shared.readOnly': 'Vue en lecture seule',
|
||
'shared.tabPlan': 'Plan',
|
||
'shared.tabBookings': 'Réservations',
|
||
'shared.tabPacking': 'Bagages',
|
||
'shared.tabBudget': 'Budget',
|
||
'shared.tabChat': 'Chat',
|
||
'shared.days': 'jours',
|
||
'shared.places': 'lieux',
|
||
'shared.other': 'Autre',
|
||
'shared.totalBudget': 'Budget total',
|
||
'shared.messages': 'messages',
|
||
'shared.sharedVia': 'Partagé via',
|
||
'shared.confirmed': 'Confirmé',
|
||
'shared.pending': 'En attente',
|
||
'share.permBudget': 'Budget',
|
||
'share.permCollab': 'Chat',
|
||
'settings.on': 'Activé',
|
||
'settings.off': 'Désactivé',
|
||
'settings.mcp.title': 'Configuration MCP',
|
||
'settings.mcp.endpoint': 'Point de terminaison MCP',
|
||
'settings.mcp.clientConfig': 'Configuration du client',
|
||
'settings.mcp.clientConfigHint': 'Remplacez <your_token> par un token API de la liste ci-dessous. Le chemin vers npx devra peut-être être ajusté selon votre système (ex. C:\\PROGRA~1\\nodejs\\npx.cmd sous Windows).',
|
||
'settings.mcp.clientConfigHintOAuth': 'Remplacez <your_client_id> et <your_client_secret> par les identifiants affichés dans le client OAuth 2.1 créé ci-dessus. mcp-remote ouvrira votre navigateur pour finaliser l\'autorisation lors de la première connexion. Le chemin vers npx devra peut-être être ajusté selon votre système (ex. C:\\PROGRA~1\\nodejs\\npx.cmd sous Windows).',
|
||
'settings.mcp.copy': 'Copier',
|
||
'settings.mcp.copied': 'Copié !',
|
||
'settings.mcp.apiTokens': 'Tokens API',
|
||
'settings.mcp.createToken': 'Créer un token',
|
||
'settings.mcp.noTokens': 'Aucun token pour l\'instant. Créez-en un pour connecter des clients MCP.',
|
||
'settings.mcp.tokenCreatedAt': 'Créé',
|
||
'settings.mcp.tokenUsedAt': 'Utilisé',
|
||
'settings.mcp.deleteTokenTitle': 'Supprimer le token',
|
||
'settings.mcp.deleteTokenMessage': 'Ce token cessera de fonctionner immédiatement. Tout client MCP l\'utilisant perdra l\'accès.',
|
||
'settings.mcp.modal.createTitle': 'Créer un token API',
|
||
'settings.mcp.modal.tokenName': 'Nom du token',
|
||
'settings.mcp.modal.tokenNamePlaceholder': 'ex. Claude Desktop, Ordinateur pro',
|
||
'settings.mcp.modal.creating': 'Création…',
|
||
'settings.mcp.modal.create': 'Créer le token',
|
||
'settings.mcp.modal.createdTitle': 'Token créé',
|
||
'settings.mcp.modal.createdWarning': 'Ce token ne sera affiché qu\'une seule fois. Copiez-le et conservez-le maintenant — il ne pourra pas être récupéré.',
|
||
'settings.mcp.modal.done': 'Terminé',
|
||
'settings.mcp.toast.created': 'Token créé',
|
||
'settings.mcp.toast.createError': 'Impossible de créer le token',
|
||
'settings.mcp.toast.deleted': 'Token supprimé',
|
||
'settings.mcp.toast.deleteError': 'Impossible de supprimer le token',
|
||
'settings.mcp.apiTokensDeprecated': 'Les tokens API sont dépréciés et seront supprimés dans une prochaine version. Veuillez utiliser les clients OAuth 2.1 à la place.',
|
||
'settings.oauth.clients': 'Clients OAuth 2.1',
|
||
'settings.oauth.clientsHint': 'Enregistrez des clients OAuth 2.1 pour permettre à des applications MCP tierces (Claude Web, Cursor, etc.) de se connecter sans tokens statiques.',
|
||
'settings.oauth.createClient': 'Nouveau client',
|
||
'settings.oauth.noClients': 'Aucun client OAuth enregistré.',
|
||
'settings.oauth.clientId': 'ID client',
|
||
'settings.oauth.clientSecret': 'Secret client',
|
||
'settings.oauth.deleteClient': 'Supprimer le client',
|
||
'settings.oauth.deleteClientMessage': 'Ce client et toutes les sessions actives seront définitivement supprimés. Toute application l\'utilisant perdra immédiatement l\'accès.',
|
||
'settings.oauth.rotateSecret': 'Renouveler le secret',
|
||
'settings.oauth.rotateSecretMessage': 'Un nouveau secret client sera généré et toutes les sessions existantes seront immédiatement invalidées. Mettez à jour votre application avant de fermer cette fenêtre.',
|
||
'settings.oauth.rotateSecretConfirm': 'Renouveler',
|
||
'settings.oauth.rotateSecretConfirming': 'Renouvellement…',
|
||
'settings.oauth.rotateSecretDoneTitle': 'Nouveau secret généré',
|
||
'settings.oauth.rotateSecretDoneWarning': 'Ce secret n\'est affiché qu\'une seule fois. Copiez-le maintenant et mettez à jour votre application — toutes les sessions précédentes ont été invalidées.',
|
||
'settings.oauth.activeSessions': 'Sessions OAuth actives',
|
||
'settings.oauth.sessionScopes': 'Portées',
|
||
'settings.oauth.sessionExpires': 'Expire',
|
||
'settings.oauth.revoke': 'Révoquer',
|
||
'settings.oauth.revokeSession': 'Révoquer la session',
|
||
'settings.oauth.revokeSessionMessage': 'Cela révoquera immédiatement l\'accès pour cette session OAuth.',
|
||
'settings.oauth.modal.createTitle': 'Enregistrer un client OAuth',
|
||
'settings.oauth.modal.presets': 'Préréglages rapides',
|
||
'settings.oauth.modal.clientName': 'Nom de l\'application',
|
||
'settings.oauth.modal.clientNamePlaceholder': 'ex. Claude Web, Mon app MCP',
|
||
'settings.oauth.modal.redirectUris': 'URIs de redirection',
|
||
'settings.oauth.modal.redirectUrisPlaceholder': 'https://your-app.com/callback\nhttps://your-app.com/auth',
|
||
'settings.oauth.modal.redirectUrisHint': 'Une URI par ligne. HTTPS requis (localhost exempté). Correspondance exacte.',
|
||
'settings.oauth.modal.scopes': 'Portées autorisées',
|
||
'settings.oauth.modal.scopesHint': 'list_trips et get_trip_summary sont toujours disponibles — aucune portée requise. Ils permettent à l\'IA de découvrir les IDs de voyage nécessaires.',
|
||
'settings.oauth.modal.selectAll': 'Tout sélectionner',
|
||
'settings.oauth.modal.deselectAll': 'Tout désélectionner',
|
||
'settings.oauth.modal.creating': 'Enregistrement…',
|
||
'settings.oauth.modal.create': 'Enregistrer le client',
|
||
'settings.oauth.modal.createdTitle': 'Client enregistré',
|
||
'settings.oauth.modal.createdWarning': 'Le secret client n\'est affiché qu\'une seule fois. Copiez-le maintenant — il ne peut pas être récupéré.',
|
||
'settings.oauth.toast.createError': 'Impossible d\'enregistrer le client OAuth',
|
||
'settings.oauth.toast.deleted': 'Client OAuth supprimé',
|
||
'settings.oauth.toast.deleteError': 'Impossible de supprimer le client OAuth',
|
||
'settings.oauth.toast.revoked': 'Session révoquée',
|
||
'settings.oauth.toast.revokeError': 'Impossible de révoquer la session',
|
||
'settings.oauth.toast.rotateError': 'Impossible de renouveler le secret client',
|
||
'settings.account': 'Compte',
|
||
'settings.about': 'À propos',
|
||
'settings.about.reportBug': 'Signaler un bug',
|
||
'settings.about.reportBugHint': 'Un problème ? Faites-le nous savoir',
|
||
'settings.about.featureRequest': 'Proposer une fonctionnalité',
|
||
'settings.about.featureRequestHint': 'Suggérez une nouvelle fonctionnalité',
|
||
'settings.about.wikiHint': 'Documentation et guides',
|
||
'settings.about.supporters.badge': 'Soutiens Mensuels',
|
||
'settings.about.supporters.title': 'Compagnons de voyage pour TREK',
|
||
'settings.about.supporters.subtitle': 'Pendant que tu planifies ton prochain itinéraire, ces personnes aident à planifier l\'avenir de TREK. Leur contribution mensuelle va directement au développement et aux heures réellement passées — pour que TREK reste Open Source.',
|
||
'settings.about.supporters.since': 'soutien depuis {date}',
|
||
'settings.about.supporters.tierEmpty': 'Sois le premier',
|
||
'settings.about.supporter.tier.noReturnTicket': 'No Return Ticket',
|
||
'settings.about.supporter.tier.lostLuggageVip': 'Lost Luggage VIP',
|
||
'settings.about.supporter.tier.businessClassDreamer': 'Business Class Dreamer',
|
||
'settings.about.supporter.tier.budgetTraveller': 'Budget Traveller',
|
||
'settings.about.supporter.tier.hostelBunkmate': 'Hostel Bunkmate',
|
||
'settings.about.description': 'TREK est un planificateur de voyage auto-hébergé qui vous aide à organiser vos voyages de la première idée au dernier souvenir. Planification journalière, budget, listes de bagages, photos et bien plus — le tout au même endroit, sur votre propre serveur.',
|
||
'settings.about.madeWith': 'Fait avec',
|
||
'settings.about.madeBy': 'par Maurice et une communauté open-source grandissante.',
|
||
'settings.username': 'Nom d\'utilisateur',
|
||
'settings.email': 'E-mail',
|
||
'settings.role': 'Rôle',
|
||
'settings.roleAdmin': 'Administrateur',
|
||
'settings.oidcLinked': 'Lié avec',
|
||
'settings.changePassword': 'Changer le mot de passe',
|
||
'settings.mustChangePassword': 'Vous devez changer votre mot de passe avant de continuer. Veuillez définir un nouveau mot de passe ci-dessous.',
|
||
'settings.currentPassword': 'Mot de passe actuel',
|
||
'settings.currentPasswordRequired': 'Le mot de passe actuel est requis',
|
||
'settings.newPassword': 'Nouveau mot de passe',
|
||
'settings.confirmPassword': 'Confirmer le nouveau mot de passe',
|
||
'settings.updatePassword': 'Mettre à jour le mot de passe',
|
||
'settings.passwordRequired': 'Veuillez saisir le mot de passe actuel et le nouveau',
|
||
'settings.passwordTooShort': 'Le mot de passe doit comporter au moins 8 caractères',
|
||
'settings.passwordMismatch': 'Les mots de passe ne correspondent pas',
|
||
'settings.passwordWeak': 'Le mot de passe doit contenir des majuscules, des minuscules, un chiffre et un caractère spécial',
|
||
'settings.passwordChanged': 'Mot de passe modifié avec succès',
|
||
'settings.deleteAccount': 'Supprimer le compte',
|
||
'settings.deleteAccountTitle': 'Supprimer votre compte ?',
|
||
'settings.deleteAccountWarning': 'Votre compte ainsi que tous vos voyages, lieux et fichiers seront définitivement supprimés. Cette action est irréversible.',
|
||
'settings.deleteAccountConfirm': 'Supprimer définitivement',
|
||
'settings.deleteBlockedTitle': 'Suppression impossible',
|
||
'settings.deleteBlockedMessage': 'Vous êtes le seul administrateur. Promouvez un autre utilisateur en tant qu\'administrateur avant de supprimer votre compte.',
|
||
'settings.roleUser': 'Utilisateur',
|
||
'settings.saveProfile': 'Enregistrer le profil',
|
||
'settings.mfa.title': 'Authentification à deux facteurs (2FA)',
|
||
'settings.mfa.description': 'Ajoute une étape supplémentaire lors de la connexion. Utilisez une application d\'authentification (Google Authenticator, Authy, etc.).',
|
||
'settings.mfa.requiredByPolicy': 'Votre administrateur exige l\'authentification à deux facteurs. Configurez une application d\'authentification ci-dessous avant de continuer.',
|
||
'settings.mfa.backupTitle': 'Codes de secours',
|
||
'settings.mfa.backupDescription': 'Utilisez ces codes à usage unique si vous perdez l\'accès à votre application d\'authentification.',
|
||
'settings.mfa.backupWarning': 'Enregistrez ces codes maintenant. Chaque code n\'est utilisable qu\'une seule fois.',
|
||
'settings.mfa.backupCopy': 'Copier les codes',
|
||
'settings.mfa.backupDownload': 'Télécharger TXT',
|
||
'settings.mfa.backupPrint': 'Imprimer / PDF',
|
||
'settings.mfa.backupCopied': 'Codes de secours copiés',
|
||
'settings.mfa.enabled': '2FA est activé sur votre compte.',
|
||
'settings.mfa.disabled': '2FA n\'est pas activé.',
|
||
'settings.mfa.setup': 'Configurer l\'authentificateur',
|
||
'settings.mfa.scanQr': 'Scannez ce code QR avec votre application ou entrez la clé manuellement.',
|
||
'settings.mfa.secretLabel': 'Clé secrète (saisie manuelle)',
|
||
'settings.mfa.codePlaceholder': 'Code à 6 chiffres',
|
||
'settings.mfa.enable': 'Activer 2FA',
|
||
'settings.mfa.cancelSetup': 'Annuler',
|
||
'settings.mfa.disableTitle': 'Désactiver 2FA',
|
||
'settings.mfa.disableHint': 'Entrez votre mot de passe et un code actuel de votre authentificateur.',
|
||
'settings.mfa.disable': 'Désactiver 2FA',
|
||
'settings.mfa.toastEnabled': 'Authentification à deux facteurs activée',
|
||
'settings.mfa.toastDisabled': 'Authentification à deux facteurs désactivée',
|
||
'settings.mfa.demoBlocked': 'Non disponible en mode démo',
|
||
'settings.toast.mapSaved': 'Paramètres de carte enregistrés',
|
||
'settings.toast.keysSaved': 'Clés API enregistrées',
|
||
'settings.toast.displaySaved': 'Paramètres d\'affichage enregistrés',
|
||
'settings.toast.profileSaved': 'Profil enregistré',
|
||
'settings.uploadAvatar': 'Importer une photo de profil',
|
||
'settings.removeAvatar': 'Supprimer la photo de profil',
|
||
'settings.avatarUploaded': 'Photo de profil mise à jour',
|
||
'settings.avatarRemoved': 'Photo de profil supprimée',
|
||
'settings.avatarError': 'Échec de l\'import',
|
||
|
||
// Login
|
||
'login.error': 'Échec de la connexion. Veuillez vérifier vos identifiants.',
|
||
'login.tagline': 'Vos voyages.\nVotre organisation.',
|
||
'login.description': 'Planifiez vos voyages en collaboration avec des cartes interactives, des budgets et la synchronisation en temps réel.',
|
||
'login.features.maps': 'Cartes interactives',
|
||
'login.features.mapsDesc': 'Google Places, itinéraires et regroupement',
|
||
'login.features.realtime': 'Synchronisation en temps réel',
|
||
'login.features.realtimeDesc': 'Planifiez ensemble via WebSocket',
|
||
'login.features.budget': 'Suivi du budget',
|
||
'login.features.budgetDesc': 'Catégories, graphiques et coûts par personne',
|
||
'login.features.collab': 'Collaboration',
|
||
'login.features.collabDesc': 'Multi-utilisateurs avec voyages partagés',
|
||
'login.features.packing': 'Listes de bagages',
|
||
'login.features.packingDesc': 'Catégories, progression et suggestions',
|
||
'login.features.bookings': 'Réservations',
|
||
'login.features.bookingsDesc': 'Vols, hôtels, restaurants et plus',
|
||
'login.features.files': 'Documents',
|
||
'login.features.filesDesc': 'Importez et gérez vos documents',
|
||
'login.features.routes': 'Itinéraires intelligents',
|
||
'login.features.routesDesc': 'Optimisation automatique et export Google Maps',
|
||
'login.selfHosted': 'Auto-hébergé · Open Source · Vos données restent les vôtres',
|
||
'login.title': 'Connexion',
|
||
'login.subtitle': 'Bon retour',
|
||
'login.signingIn': 'Connexion en cours…',
|
||
'login.signIn': 'Se connecter',
|
||
'login.createAdmin': 'Créer un compte administrateur',
|
||
'login.createAdminHint': 'Configurez le premier compte administrateur pour TREK.',
|
||
'login.setNewPassword': 'Définir un nouveau mot de passe',
|
||
'login.setNewPasswordHint': 'Vous devez changer votre mot de passe avant de continuer.',
|
||
'login.createAccount': 'Créer un compte',
|
||
'login.createAccountHint': 'Créez un nouveau compte.',
|
||
'login.creating': 'Création…',
|
||
'login.noAccount': 'Pas encore de compte ?',
|
||
'login.hasAccount': 'Vous avez déjà un compte ?',
|
||
'login.register': 'S\'inscrire',
|
||
'login.emailPlaceholder': 'votre@email.com',
|
||
'login.username': 'Nom d\'utilisateur',
|
||
'login.oidc.registrationDisabled': 'Les inscriptions sont désactivées. Contactez votre administrateur.',
|
||
'login.oidc.noEmail': 'Aucun e-mail reçu du fournisseur.',
|
||
'login.mfaTitle': 'Authentification à deux facteurs',
|
||
'login.mfaSubtitle': 'Entrez le code à 6 chiffres de votre application d\'authentification.',
|
||
'login.mfaCodeLabel': 'Code de vérification',
|
||
'login.mfaCodeRequired': 'Entrez le code de votre application d\'authentification.',
|
||
'login.mfaHint': 'Ouvrez Google Authenticator, Authy ou une autre application TOTP.',
|
||
'login.mfaBack': '← Retour à la connexion',
|
||
'login.mfaVerify': 'Vérifier',
|
||
'login.invalidInviteLink': 'Lien d\'invitation invalide ou expiré',
|
||
'login.oidcFailed': 'Échec de connexion OIDC',
|
||
'login.usernameRequired': 'Le nom d\'utilisateur est obligatoire',
|
||
'login.passwordMinLength': 'Le mot de passe doit comporter au moins 8 caractères',
|
||
'login.oidc.tokenFailed': 'L\'authentification a échoué.',
|
||
'login.oidc.invalidState': 'Session invalide. Veuillez réessayer.',
|
||
'login.demoFailed': 'Échec de la connexion démo',
|
||
'login.oidcSignIn': 'Se connecter avec {name}',
|
||
'login.oidcOnly': 'L\'authentification par mot de passe est désactivée. Veuillez vous connecter via votre fournisseur SSO.',
|
||
'login.oidcLoggedOut': 'Vous avez été déconnecté. Reconnectez-vous via votre fournisseur SSO.',
|
||
'login.demoHint': 'Essayez la démo — aucune inscription nécessaire',
|
||
|
||
// Register
|
||
'register.passwordMismatch': 'Les mots de passe ne correspondent pas',
|
||
'register.passwordTooShort': 'Le mot de passe doit comporter au moins 8 caractères',
|
||
'register.failed': 'Échec de l\'inscription',
|
||
'register.getStarted': 'Commencer',
|
||
'register.subtitle': 'Créez un compte et commencez à planifier vos voyages de rêve.',
|
||
'register.feature1': 'Plans de voyage illimités',
|
||
'register.feature2': 'Vue carte interactive',
|
||
'register.feature3': 'Gérez les lieux et catégories',
|
||
'register.feature4': 'Suivez les réservations',
|
||
'register.feature5': 'Créez des listes de bagages',
|
||
'register.feature6': 'Stockez photos et fichiers',
|
||
'register.createAccount': 'Créer un compte',
|
||
'register.startPlanning': 'Commencez à planifier vos voyages',
|
||
'register.minChars': 'Min. 6 caractères',
|
||
'register.confirmPassword': 'Confirmer le mot de passe',
|
||
'register.repeatPassword': 'Répéter le mot de passe',
|
||
'register.registering': 'Inscription en cours…',
|
||
'register.register': 'S\'inscrire',
|
||
'register.hasAccount': 'Vous avez déjà un compte ?',
|
||
'register.signIn': 'Se connecter',
|
||
|
||
// Admin
|
||
'admin.title': 'Administration',
|
||
'admin.subtitle': 'Gestion des utilisateurs et paramètres système',
|
||
'admin.tabs.users': 'Utilisateurs',
|
||
'admin.tabs.categories': 'Catégories',
|
||
'admin.tabs.backup': 'Sauvegarde',
|
||
'admin.stats.users': 'Utilisateurs',
|
||
'admin.stats.trips': 'Voyages',
|
||
'admin.stats.places': 'Lieux',
|
||
'admin.stats.photos': 'Photos',
|
||
'admin.stats.files': 'Fichiers',
|
||
'admin.table.user': 'Utilisateur',
|
||
'admin.table.email': 'E-mail',
|
||
'admin.table.role': 'Rôle',
|
||
'admin.table.created': 'Créé le',
|
||
'admin.table.lastLogin': 'Dernière connexion',
|
||
'admin.table.actions': 'Actions',
|
||
'admin.you': '(Vous)',
|
||
'admin.editUser': 'Modifier l\'utilisateur',
|
||
'admin.newPassword': 'Nouveau mot de passe',
|
||
'admin.newPasswordHint': 'Laissez vide pour conserver le mot de passe actuel',
|
||
'admin.deleteUser': 'Supprimer l\'utilisateur « {name} » ? Tous les voyages seront définitivement supprimés.',
|
||
'admin.deleteUserTitle': 'Supprimer l\'utilisateur',
|
||
'admin.newPasswordPlaceholder': 'Saisir le nouveau mot de passe…',
|
||
'admin.toast.loadError': 'Impossible de charger les données d\'administration',
|
||
'admin.toast.userUpdated': 'Utilisateur mis à jour',
|
||
'admin.toast.updateError': 'Échec de la mise à jour',
|
||
'admin.toast.userDeleted': 'Utilisateur supprimé',
|
||
'admin.toast.deleteError': 'Échec de la suppression',
|
||
'admin.toast.cannotDeleteSelf': 'Impossible de supprimer votre propre compte',
|
||
'admin.toast.userCreated': 'Utilisateur créé',
|
||
'admin.toast.createError': 'Échec de la création de l\'utilisateur',
|
||
'admin.toast.fieldsRequired': 'Le nom d\'utilisateur, l\'e-mail et le mot de passe sont requis',
|
||
'admin.createUser': 'Créer un utilisateur',
|
||
'admin.invite.title': 'Liens d\'invitation',
|
||
'admin.invite.subtitle': 'Créer des liens d\'inscription à usage unique',
|
||
'admin.invite.create': 'Créer un lien',
|
||
'admin.invite.createAndCopy': 'Créer et copier',
|
||
'admin.invite.empty': 'Aucun lien d\'invitation créé',
|
||
'admin.invite.maxUses': 'Utilisations max.',
|
||
'admin.invite.expiry': 'Expire après',
|
||
'admin.invite.uses': 'utilisé(s)',
|
||
'admin.invite.expiresAt': 'expire le',
|
||
'admin.invite.createdBy': 'par',
|
||
'admin.invite.active': 'Actif',
|
||
'admin.invite.expired': 'Expiré',
|
||
'admin.invite.usedUp': 'Épuisé',
|
||
'admin.invite.copied': 'Lien d\'invitation copié',
|
||
'admin.invite.copyLink': 'Copier le lien',
|
||
'admin.invite.deleted': 'Lien d\'invitation supprimé',
|
||
'admin.invite.createError': 'Erreur lors de la création du lien',
|
||
'admin.invite.deleteError': 'Erreur lors de la suppression du lien',
|
||
'admin.tabs.settings': 'Paramètres',
|
||
'admin.allowRegistration': 'Autoriser les inscriptions',
|
||
'admin.allowRegistrationHint': 'Les nouveaux utilisateurs peuvent s\'inscrire eux-mêmes',
|
||
'admin.authMethods': 'Authentication Methods',
|
||
'admin.passwordLogin': 'Password Login',
|
||
'admin.passwordLoginHint': 'Allow users to sign in with email and password',
|
||
'admin.passwordRegistration': 'Password Registration',
|
||
'admin.passwordRegistrationHint': 'Allow new users to register with email and password',
|
||
'admin.oidcLogin': 'SSO Login',
|
||
'admin.oidcLoginHint': 'Allow users to sign in with SSO',
|
||
'admin.oidcRegistration': 'SSO Auto-Provisioning',
|
||
'admin.oidcRegistrationHint': 'Automatically create accounts for new SSO users',
|
||
'admin.envOverrideHint': 'Password login settings are controlled by the OIDC_ONLY environment variable and cannot be changed here.',
|
||
'admin.lockoutWarning': 'At least one login method must remain enabled',
|
||
'admin.requireMfa': 'Exiger l\'authentification à deux facteurs (2FA)',
|
||
'admin.requireMfaHint': 'Les utilisateurs sans 2FA doivent terminer la configuration dans Paramètres avant d\'utiliser l\'application.',
|
||
'admin.apiKeys': 'Clés API',
|
||
'admin.apiKeysHint': 'Facultatif. Active les données de lieu étendues comme les photos et la météo.',
|
||
'admin.mapsKey': 'Clé API Google Maps',
|
||
'admin.mapsKeyHint': 'Requise pour la recherche de lieux. Obtenez-la sur console.cloud.google.com',
|
||
'admin.mapsKeyHintLong': 'Sans clé API, OpenStreetMap est utilisé pour la recherche de lieux. Avec une clé Google API, les photos, notes et horaires d\'ouverture peuvent également être chargés. Obtenez-en une sur console.cloud.google.com.',
|
||
'admin.recommended': 'Recommandé',
|
||
'admin.weatherKey': 'Clé API OpenWeatherMap',
|
||
'admin.weatherKeyHint': 'Pour les données météo. Gratuit sur openweathermap.org',
|
||
'admin.validateKey': 'Tester',
|
||
'admin.keyValid': 'Connecté',
|
||
'admin.keyInvalid': 'Invalide',
|
||
'admin.keySaved': 'Clés API enregistrées',
|
||
'admin.oidcTitle': 'Authentification unique (OIDC)',
|
||
'admin.oidcSubtitle': 'Autorisez la connexion via des fournisseurs externes comme Google, Apple, Authentik ou Keycloak.',
|
||
'admin.oidcDisplayName': 'Nom d\'affichage',
|
||
'admin.oidcIssuer': 'URL de l\'émetteur',
|
||
'admin.oidcIssuerHint': 'L\'URL de l\'émetteur OpenID Connect du fournisseur. ex. https://accounts.google.com',
|
||
'admin.oidcSaved': 'Configuration OIDC enregistrée',
|
||
'admin.oidcOnlyMode': 'Désactiver l\'authentification par mot de passe',
|
||
'admin.oidcOnlyModeHint': 'Lorsqu\'activé, seule la connexion SSO est autorisée. La connexion et l\'inscription par mot de passe sont bloquées.',
|
||
|
||
// File Types
|
||
'admin.fileTypes': 'Types de fichiers autorisés',
|
||
'admin.fileTypesHint': 'Configurez les types de fichiers que les utilisateurs peuvent importer.',
|
||
'admin.fileTypesFormat': 'Extensions séparées par des virgules (ex. jpg,png,pdf,doc). Utilisez * pour autoriser tous les types.',
|
||
'admin.fileTypesSaved': 'Paramètres des types de fichiers enregistrés',
|
||
|
||
'admin.placesPhotos.title': 'Photos de lieux',
|
||
'admin.placesPhotos.subtitle': "Récupère les photos depuis l'API Google Places. Désactivez pour économiser le quota API. Les photos Wikimedia ne sont pas affectées.",
|
||
'admin.placesAutocomplete.title': 'Autocomplétion des lieux',
|
||
'admin.placesAutocomplete.subtitle': "Utilise l'API Google Places pour les suggestions de recherche. Désactivez pour économiser le quota API.",
|
||
'admin.placesDetails.title': 'Détails du lieu',
|
||
'admin.placesDetails.subtitle': "Récupère les informations détaillées du lieu (horaires, note, site web) depuis l'API Google Places. Désactivez pour économiser le quota API.",
|
||
'admin.bagTracking.title': 'Suivi des bagages',
|
||
'admin.bagTracking.subtitle': 'Activer le poids et l\'attribution de bagages pour les articles',
|
||
'admin.collab.chat.title': 'Chat',
|
||
'admin.collab.chat.subtitle': 'Messagerie en temps réel pour la collaboration',
|
||
'admin.collab.notes.title': 'Notes',
|
||
'admin.collab.notes.subtitle': 'Notes et documents partagés',
|
||
'admin.collab.polls.title': 'Sondages',
|
||
'admin.collab.polls.subtitle': 'Sondages et votes de groupe',
|
||
'admin.collab.whatsnext.title': 'Et ensuite',
|
||
'admin.collab.whatsnext.subtitle': "Suggestions d'activités et prochaines étapes",
|
||
'admin.tabs.config': 'Personnalisation',
|
||
'admin.tabs.defaults': 'Valeurs par défaut',
|
||
'admin.defaultSettings.title': 'Paramètres utilisateur par défaut',
|
||
'admin.defaultSettings.description': "Définissez des valeurs par défaut pour toute l'instance. Les utilisateurs n'ayant pas modifié un paramètre verront ces valeurs. Leurs propres modifications ont toujours la priorité.",
|
||
'admin.defaultSettings.saved': 'Valeur par défaut enregistrée',
|
||
'admin.defaultSettings.reset': 'Réinitialiser à la valeur par défaut intégrée',
|
||
'admin.defaultSettings.resetToBuiltIn': 'réinitialiser',
|
||
'admin.tabs.templates': 'Modèles de bagages',
|
||
'admin.packingTemplates.title': 'Modèles de bagages',
|
||
'admin.packingTemplates.subtitle': 'Créer des listes de bagages réutilisables pour vos voyages',
|
||
'admin.packingTemplates.create': 'Nouveau modèle',
|
||
'admin.packingTemplates.namePlaceholder': 'Nom du modèle (ex. Vacances à la plage)',
|
||
'admin.packingTemplates.empty': 'Aucun modèle créé',
|
||
'admin.packingTemplates.items': 'articles',
|
||
'admin.packingTemplates.categories': 'catégories',
|
||
'admin.packingTemplates.itemName': 'Nom de l\'article',
|
||
'admin.packingTemplates.itemCategory': 'Catégorie',
|
||
'admin.packingTemplates.categoryName': 'Nom de catégorie (ex. Vêtements)',
|
||
'admin.packingTemplates.addCategory': 'Ajouter une catégorie',
|
||
'admin.packingTemplates.created': 'Modèle créé',
|
||
'admin.packingTemplates.deleted': 'Modèle supprimé',
|
||
'admin.packingTemplates.loadError': 'Erreur de chargement des modèles',
|
||
'admin.packingTemplates.createError': 'Erreur de création du modèle',
|
||
'admin.packingTemplates.deleteError': 'Erreur de suppression du modèle',
|
||
'admin.packingTemplates.saveError': 'Erreur de sauvegarde',
|
||
|
||
// Addons
|
||
'admin.tabs.addons': 'Extensions',
|
||
'admin.addons.title': 'Extensions',
|
||
'admin.addons.subtitle': 'Activez ou désactivez des fonctionnalités pour personnaliser votre expérience TREK.',
|
||
'admin.addons.catalog.memories.name': 'Photos (Immich)',
|
||
'admin.addons.catalog.memories.description': 'Partagez vos photos de voyage via votre instance Immich',
|
||
'admin.addons.catalog.mcp.name': 'MCP',
|
||
'admin.addons.catalog.mcp.description': 'Protocole de contexte de modèle pour l\'intégration d\'assistants IA',
|
||
'admin.addons.catalog.packing.name': 'Listes',
|
||
'admin.addons.catalog.packing.description': 'Listes de bagages et tâches à faire pour vos voyages',
|
||
'admin.addons.catalog.budget.name': 'Budget',
|
||
'admin.addons.catalog.budget.description': 'Suivez les dépenses et planifiez votre budget de voyage',
|
||
'admin.addons.catalog.documents.name': 'Documents',
|
||
'admin.addons.catalog.documents.description': 'Stockez et gérez vos documents de voyage',
|
||
'admin.addons.catalog.vacay.name': 'Vacances',
|
||
'admin.addons.catalog.vacay.description': 'Planificateur de vacances personnel avec vue calendrier',
|
||
'admin.addons.catalog.atlas.name': 'Atlas',
|
||
'admin.addons.catalog.atlas.description': 'Carte du monde avec pays visités et statistiques de voyage',
|
||
'admin.addons.catalog.collab.name': 'Collaboration',
|
||
'admin.addons.catalog.collab.description': 'Notes en temps réel, sondages et chat pour la planification de voyage',
|
||
'admin.addons.subtitleBefore': 'Activez ou désactivez des fonctionnalités pour personnaliser votre expérience ',
|
||
'admin.addons.subtitleAfter': '.',
|
||
'admin.addons.enabled': 'Activé',
|
||
'admin.addons.disabled': 'Désactivé',
|
||
'admin.addons.type.trip': 'Voyage',
|
||
'admin.addons.type.global': 'Global',
|
||
'admin.addons.type.integration': 'Intégration',
|
||
'admin.addons.tripHint': 'Disponible comme onglet dans chaque voyage',
|
||
'admin.addons.globalHint': 'Disponible comme section autonome dans la navigation principale',
|
||
'admin.addons.integrationHint': 'Services backend et intégrations API sans page dédiée',
|
||
'admin.addons.toast.updated': 'Extension mise à jour',
|
||
'admin.addons.toast.error': 'Échec de la mise à jour de l\'extension',
|
||
'admin.addons.noAddons': 'Aucune extension disponible',
|
||
// Weather info
|
||
'admin.weather.title': 'Données météo',
|
||
'admin.weather.badge': 'Depuis le 24 mars 2026',
|
||
'admin.weather.description': 'TREK utilise Open-Meteo comme source de données météo. Open-Meteo est un service météo gratuit et open source — aucune clé API requise.',
|
||
'admin.weather.forecast': 'Prévisions sur 16 jours',
|
||
'admin.weather.forecastDesc': 'Auparavant 5 jours (OpenWeatherMap)',
|
||
'admin.weather.climate': 'Données climatiques historiques',
|
||
'admin.weather.climateDesc': 'Moyennes des 85 dernières années pour les jours au-delà des prévisions de 16 jours',
|
||
'admin.weather.requests': '10 000 requêtes / jour',
|
||
'admin.weather.requestsDesc': 'Gratuit, aucune clé API requise',
|
||
'admin.weather.locationHint': 'La météo est basée sur le premier lieu avec des coordonnées de chaque jour. Si aucun lieu n\'est attribué à un jour, un lieu de la liste est utilisé comme référence.',
|
||
|
||
'admin.tabs.audit': 'Audit',
|
||
|
||
'admin.audit.subtitle': 'Événements sensibles de sécurité et d\'administration (sauvegardes, utilisateurs, 2FA, paramètres).',
|
||
'admin.audit.empty': 'Aucune entrée d\'audit.',
|
||
'admin.audit.refresh': 'Actualiser',
|
||
'admin.audit.loadMore': 'Charger plus',
|
||
'admin.audit.showing': '{count} chargées · {total} au total',
|
||
'admin.audit.col.time': 'Heure',
|
||
'admin.audit.col.user': 'Utilisateur',
|
||
'admin.audit.col.action': 'Action',
|
||
'admin.audit.col.resource': 'Ressource',
|
||
'admin.audit.col.ip': 'IP',
|
||
'admin.audit.col.details': 'Détails',
|
||
|
||
// MCP Tokens
|
||
'admin.tabs.mcpTokens': 'Accès MCP',
|
||
'admin.mcpTokens.title': 'Accès MCP',
|
||
'admin.mcpTokens.subtitle': 'Gérer les sessions OAuth et les tokens API de tous les utilisateurs',
|
||
'admin.mcpTokens.sectionTitle': 'Tokens API',
|
||
'admin.mcpTokens.owner': 'Propriétaire',
|
||
'admin.mcpTokens.tokenName': 'Nom du token',
|
||
'admin.mcpTokens.created': 'Créé',
|
||
'admin.mcpTokens.lastUsed': 'Dernière utilisation',
|
||
'admin.mcpTokens.never': 'Jamais',
|
||
'admin.mcpTokens.empty': 'Aucun token MCP n\'a encore été créé',
|
||
'admin.mcpTokens.deleteTitle': 'Supprimer le token',
|
||
'admin.mcpTokens.deleteMessage': 'Ce token sera révoqué immédiatement. L\'utilisateur perdra l\'accès MCP via ce token.',
|
||
'admin.mcpTokens.deleteSuccess': 'Token supprimé',
|
||
'admin.mcpTokens.deleteError': 'Impossible de supprimer le token',
|
||
'admin.mcpTokens.loadError': 'Impossible de charger les tokens',
|
||
'admin.oauthSessions.sectionTitle': 'Sessions OAuth',
|
||
'admin.oauthSessions.clientName': 'Client',
|
||
'admin.oauthSessions.owner': 'Propriétaire',
|
||
'admin.oauthSessions.scopes': 'Portées',
|
||
'admin.oauthSessions.created': 'Créé',
|
||
'admin.oauthSessions.empty': 'Aucune session OAuth active',
|
||
'admin.oauthSessions.revokeTitle': 'Révoquer la session',
|
||
'admin.oauthSessions.revokeMessage': 'Cette session OAuth sera révoquée immédiatement. Le client perdra l\'accès MCP.',
|
||
'admin.oauthSessions.revokeSuccess': 'Session révoquée',
|
||
'admin.oauthSessions.revokeError': 'Impossible de révoquer la session',
|
||
'admin.oauthSessions.loadError': 'Impossible de charger les sessions OAuth',
|
||
|
||
// GitHub
|
||
'admin.tabs.github': 'GitHub',
|
||
'admin.github.title': 'Historique des versions',
|
||
'admin.github.subtitle': 'Dernières mises à jour de {repo}',
|
||
'admin.github.latest': 'Dernière',
|
||
'admin.github.prerelease': 'Pré-version',
|
||
'admin.github.showDetails': 'Afficher les détails',
|
||
'admin.github.hideDetails': 'Masquer les détails',
|
||
'admin.github.loadMore': 'Charger plus',
|
||
'admin.github.loading': 'Chargement…',
|
||
'admin.github.support': 'Aidez à poursuivre le développement de TREK',
|
||
'admin.github.error': 'Impossible de charger les versions',
|
||
'admin.github.by': 'par',
|
||
|
||
'admin.update.available': 'Mise à jour disponible',
|
||
'admin.update.text': 'TREK {version} est disponible. Vous utilisez {current}.',
|
||
'admin.update.button': 'Voir sur GitHub',
|
||
'admin.update.install': 'Installer la mise à jour',
|
||
'admin.update.confirmTitle': 'Installer la mise à jour ?',
|
||
'admin.update.confirmText': 'TREK sera mis à jour de {current} vers {version}. Le serveur redémarrera automatiquement ensuite.',
|
||
'admin.update.dataInfo': 'Toutes vos données (voyages, utilisateurs, clés API, importations, Vacances, Atlas, budgets) seront préservées.',
|
||
'admin.update.warning': 'L\'application sera brièvement indisponible pendant le redémarrage.',
|
||
'admin.update.confirm': 'Mettre à jour maintenant',
|
||
'admin.update.installing': 'Mise à jour…',
|
||
'admin.update.success': 'Mise à jour installée ! Le serveur redémarre…',
|
||
'admin.update.failed': 'Échec de la mise à jour',
|
||
'admin.update.backupHint': 'Nous recommandons de créer une sauvegarde avant la mise à jour.',
|
||
'admin.update.backupLink': 'Aller aux sauvegardes',
|
||
'admin.update.howTo': 'Comment mettre à jour',
|
||
'admin.update.dockerText': 'Votre instance TREK fonctionne dans Docker. Pour mettre à jour vers {version}, exécutez les commandes suivantes sur votre serveur :',
|
||
'admin.update.reloadHint': 'Veuillez recharger la page dans quelques secondes.',
|
||
|
||
// Vacay addon
|
||
'vacay.subtitle': 'Planifiez et gérez vos jours de congés',
|
||
'vacay.settings': 'Paramètres',
|
||
'vacay.year': 'Année',
|
||
'vacay.addYear': 'Ajouter l\'année suivante',
|
||
'vacay.addPrevYear': 'Ajouter l\'année précédente',
|
||
'vacay.removeYear': 'Supprimer l\'année',
|
||
'vacay.removeYearConfirm': 'Supprimer {year} ?',
|
||
'vacay.removeYearHint': 'Toutes les entrées de vacances et jours fériés d\'entreprise de cette année seront définitivement supprimés.',
|
||
'vacay.remove': 'Supprimer',
|
||
'vacay.persons': 'Personnes',
|
||
'vacay.noPersons': 'Aucune personne ajoutée',
|
||
'vacay.addPerson': 'Ajouter une personne',
|
||
'vacay.editPerson': 'Modifier la personne',
|
||
'vacay.removePerson': 'Supprimer la personne',
|
||
'vacay.removePersonConfirm': 'Supprimer {name} ?',
|
||
'vacay.removePersonHint': 'Toutes les entrées de vacances de cette personne seront définitivement supprimées.',
|
||
'vacay.personName': 'Nom',
|
||
'vacay.personNamePlaceholder': 'Saisir le nom',
|
||
'vacay.color': 'Couleur',
|
||
'vacay.add': 'Ajouter',
|
||
'vacay.legend': 'Légende',
|
||
'vacay.publicHoliday': 'Jour férié',
|
||
'vacay.companyHoliday': 'Jour férié d\'entreprise',
|
||
'vacay.weekend': 'Week-end',
|
||
'vacay.modeVacation': 'Vacances',
|
||
'vacay.modeCompany': 'Jour férié d\'entreprise',
|
||
'vacay.entitlement': 'Droits',
|
||
'vacay.entitlementDays': 'Jours',
|
||
'vacay.used': 'Utilisés',
|
||
'vacay.remaining': 'Restants',
|
||
'vacay.carriedOver': 'de {year}',
|
||
'vacay.weekendDays': 'Jours de week-end',
|
||
'vacay.mon': 'Lun',
|
||
'vacay.tue': 'Mar',
|
||
'vacay.wed': 'Mer',
|
||
'vacay.thu': 'Jeu',
|
||
'vacay.fri': 'Ven',
|
||
'vacay.sat': 'Sam',
|
||
'vacay.sun': 'Dim',
|
||
'vacay.blockWeekends': 'Bloquer les week-ends',
|
||
'vacay.blockWeekendsHint': 'Empêcher les entrées de vacances les samedis et dimanches',
|
||
'vacay.publicHolidays': 'Jours fériés',
|
||
'vacay.publicHolidaysHint': 'Marquer les jours fériés dans le calendrier',
|
||
'vacay.selectCountry': 'Sélectionner un pays',
|
||
'vacay.selectRegion': 'Sélectionner une région (facultatif)',
|
||
'vacay.companyHolidays': 'Jours fériés d\'entreprise',
|
||
'vacay.companyHolidaysHint': 'Autoriser le marquage des jours fériés d\'entreprise',
|
||
'vacay.companyHolidaysNoDeduct': 'Les jours fériés d\'entreprise ne sont pas déduits des jours de vacances.',
|
||
'vacay.weekStart': 'La semaine commence le',
|
||
'vacay.weekStartHint': 'Choisissez si la semaine commence le lundi ou le dimanche',
|
||
'vacay.carryOver': 'Report',
|
||
'vacay.carryOverHint': 'Reporter automatiquement les jours de vacances restants à l\'année suivante',
|
||
'vacay.sharing': 'Partage',
|
||
'vacay.sharingHint': 'Partagez votre plan de vacances avec d\'autres utilisateurs TREK',
|
||
'vacay.owner': 'Propriétaire',
|
||
'vacay.shareEmailPlaceholder': 'E-mail de l\'utilisateur TREK',
|
||
'vacay.shareSuccess': 'Plan partagé avec succès',
|
||
'vacay.shareError': 'Impossible de partager le plan',
|
||
'vacay.dissolve': 'Séparer les calendriers',
|
||
'vacay.dissolveHint': 'Séparer à nouveau les calendriers. Vos entrées seront conservées.',
|
||
'vacay.dissolveAction': 'Dissoudre',
|
||
'vacay.dissolved': 'Calendrier séparé',
|
||
'vacay.fusedWith': 'Partagé avec',
|
||
'vacay.you': 'vous',
|
||
'vacay.noData': 'Aucune donnée',
|
||
'vacay.changeColor': 'Changer la couleur',
|
||
'vacay.inviteUser': 'Inviter un utilisateur',
|
||
'vacay.inviteHint': 'Invitez un autre utilisateur TREK à partager un calendrier de vacances combiné.',
|
||
'vacay.selectUser': 'Sélectionner un utilisateur',
|
||
'vacay.sendInvite': 'Envoyer l\'invitation',
|
||
'vacay.inviteSent': 'Invitation envoyée',
|
||
'vacay.inviteError': 'Impossible d\'envoyer l\'invitation',
|
||
'vacay.pending': 'en attente',
|
||
'vacay.noUsersAvailable': 'Aucun utilisateur disponible',
|
||
'vacay.accept': 'Accepter',
|
||
'vacay.decline': 'Refuser',
|
||
'vacay.acceptFusion': 'Accepter et fusionner',
|
||
'vacay.inviteTitle': 'Demande de fusion',
|
||
'vacay.inviteWantsToFuse': 'souhaite partager un calendrier de vacances avec vous.',
|
||
'vacay.fuseInfo1': 'Vous verrez tous les deux toutes les entrées de vacances dans un calendrier partagé.',
|
||
'vacay.fuseInfo2': 'Les deux parties peuvent créer et modifier des entrées pour l\'autre.',
|
||
'vacay.fuseInfo3': 'Les deux parties peuvent supprimer des entrées et modifier les droits aux vacances.',
|
||
'vacay.fuseInfo4': 'Les paramètres comme les jours fériés et les jours d\'entreprise sont partagés.',
|
||
'vacay.fuseInfo5': 'La fusion peut être dissoute à tout moment par l\'une ou l\'autre partie. Vos entrées seront préservées.',
|
||
'vacay.addCalendar': 'Ajouter un calendrier',
|
||
'vacay.calendarColor': 'Couleur',
|
||
'vacay.calendarLabel': 'Libellé',
|
||
'vacay.noCalendars': 'Aucun calendrier',
|
||
'nav.myTrips': 'Mes voyages',
|
||
|
||
// Atlas addon
|
||
'atlas.subtitle': 'Votre empreinte de voyage à travers le monde',
|
||
'atlas.countries': 'Pays',
|
||
'atlas.trips': 'Voyages',
|
||
'atlas.places': 'Lieux',
|
||
'atlas.days': 'Jours',
|
||
'atlas.visitedCountries': 'Pays visités',
|
||
'atlas.cities': 'Villes',
|
||
'atlas.noData': 'Aucune donnée de voyage',
|
||
'atlas.noDataHint': 'Créez un voyage et ajoutez des lieux pour voir votre carte du monde',
|
||
'atlas.lastTrip': 'Dernier voyage',
|
||
'atlas.nextTrip': 'Prochain voyage',
|
||
'atlas.daysLeft': 'jours restants',
|
||
'atlas.streak': 'Série',
|
||
'atlas.year': 'an',
|
||
'atlas.years': 'ans',
|
||
'atlas.yearInRow': 'année consécutive',
|
||
'atlas.yearsInRow': 'années consécutives',
|
||
'atlas.tripIn': 'voyage en',
|
||
'atlas.tripsIn': 'voyages en',
|
||
'atlas.since': 'depuis',
|
||
'atlas.europe': 'Europe',
|
||
'atlas.asia': 'Asie',
|
||
'atlas.northAmerica': 'Amérique du N.',
|
||
'atlas.southAmerica': 'Amérique du S.',
|
||
'atlas.africa': 'Afrique',
|
||
'atlas.oceania': 'Océanie',
|
||
'atlas.other': 'Autre',
|
||
'atlas.firstVisit': 'Premier voyage',
|
||
'atlas.lastVisitLabel': 'Dernier voyage',
|
||
'atlas.tripSingular': 'Voyage',
|
||
'atlas.tripPlural': 'Voyages',
|
||
'atlas.placeVisited': 'Lieu visité',
|
||
'atlas.placesVisited': 'Lieux visités',
|
||
'atlas.statsTab': 'Statistiques',
|
||
'atlas.bucketTab': 'Bucket List',
|
||
'atlas.addBucket': 'Ajouter à la bucket list',
|
||
'atlas.bucketNamePlaceholder': 'Lieu ou destination...',
|
||
'atlas.bucketNotesPlaceholder': 'Notes (optionnel)',
|
||
'atlas.bucketEmpty': 'Votre bucket list est vide',
|
||
'atlas.bucketEmptyHint': 'Ajoutez des lieux que vous rêvez de visiter',
|
||
'atlas.unmark': 'Retirer',
|
||
'atlas.confirmMark': 'Marquer ce pays comme visité ?',
|
||
'atlas.confirmUnmark': 'Retirer ce pays de votre liste ?',
|
||
'atlas.confirmUnmarkRegion': 'Retirer cette région de votre liste ?',
|
||
'atlas.markVisited': 'Marquer comme visité',
|
||
'atlas.markVisitedHint': 'Ajouter ce pays à votre liste de visités',
|
||
'atlas.markRegionVisitedHint': 'Ajouter cette région à votre liste de visités',
|
||
'atlas.addToBucket': 'Ajouter à la bucket list',
|
||
'atlas.addPoi': 'Ajouter un lieu',
|
||
'atlas.searchCountry': 'Rechercher un pays…',
|
||
'atlas.month': 'Mois',
|
||
'atlas.addToBucketHint': 'Sauvegarder comme lieu à visiter',
|
||
'atlas.bucketWhen': 'Quand prévoyez-vous d\'y aller ?',
|
||
|
||
// Trip Planner
|
||
'trip.tabs.plan': 'Plan',
|
||
'trip.tabs.transports': 'Transports',
|
||
'trip.tabs.reservations': 'Réservations',
|
||
'trip.tabs.reservationsShort': 'Résa',
|
||
'trip.tabs.packing': 'Liste de bagages',
|
||
'trip.tabs.packingShort': 'Bagages',
|
||
'trip.tabs.lists': 'Listes',
|
||
'trip.tabs.listsShort': 'Listes',
|
||
'trip.tabs.budget': 'Budget',
|
||
'trip.tabs.files': 'Fichiers',
|
||
'trip.loading': 'Chargement du voyage…',
|
||
'trip.loadingPhotos': 'Chargement des photos des lieux...',
|
||
'trip.mobilePlan': 'Plan',
|
||
'trip.mobilePlaces': 'Lieux',
|
||
'trip.toast.placeUpdated': 'Lieu mis à jour',
|
||
'trip.toast.placeAdded': 'Lieu ajouté',
|
||
'trip.toast.placeDeleted': 'Lieu supprimé',
|
||
'trip.toast.selectDay': 'Veuillez d\'abord sélectionner un jour',
|
||
'trip.toast.assignedToDay': 'Lieu attribué au planning',
|
||
'trip.toast.reorderError': 'Échec de la réorganisation',
|
||
'trip.toast.reservationUpdated': 'Réservation mise à jour',
|
||
'trip.toast.reservationAdded': 'Réservation ajoutée',
|
||
'trip.toast.deleted': 'Supprimé',
|
||
'trip.confirm.deletePlace': 'Voulez-vous vraiment supprimer ce lieu ?',
|
||
'trip.confirm.deletePlaces': 'Supprimer {count} lieux?',
|
||
'trip.toast.placesDeleted': '{count} lieux supprimés',
|
||
|
||
// Day Plan Sidebar
|
||
'dayplan.emptyDay': 'Aucun lieu prévu pour ce jour',
|
||
'dayplan.addNote': 'Ajouter une note',
|
||
'dayplan.editNote': 'Modifier la note',
|
||
'dayplan.noteAdd': 'Ajouter une note',
|
||
'dayplan.noteEdit': 'Modifier la note',
|
||
'dayplan.noteTitle': 'Note',
|
||
'dayplan.noteSubtitle': 'Note du jour',
|
||
'dayplan.totalCost': 'Coût total',
|
||
'dayplan.days': 'Jours',
|
||
'dayplan.dayN': 'Jour {n}',
|
||
'dayplan.calculating': 'Calcul en cours…',
|
||
'dayplan.route': 'Itinéraire',
|
||
'dayplan.optimize': 'Optimiser',
|
||
'dayplan.optimized': 'Itinéraire optimisé',
|
||
'dayplan.routeError': 'Impossible de calculer l\'itinéraire',
|
||
'dayplan.toast.needTwoPlaces': 'Au moins deux lieux nécessaires pour optimiser l\'itinéraire',
|
||
'dayplan.toast.routeOptimized': 'Itinéraire optimisé',
|
||
'dayplan.toast.noGeoPlaces': 'Aucun lieu avec des coordonnées trouvé pour le calcul d\'itinéraire',
|
||
'dayplan.confirmed': 'Confirmé',
|
||
'dayplan.pendingRes': 'En attente',
|
||
'dayplan.pdf': 'PDF',
|
||
'dayplan.pdfTooltip': 'Exporter le plan du jour en PDF',
|
||
'dayplan.pdfError': 'Échec de l\'export PDF',
|
||
'dayplan.cannotReorderTransport': 'Les réservations avec une heure fixe ne peuvent pas être réorganisées',
|
||
'dayplan.confirmRemoveTimeTitle': 'Supprimer l\'heure ?',
|
||
'dayplan.confirmRemoveTimeBody': 'Ce lieu a une heure fixe ({time}). Le déplacer supprimera l\'heure et permettra un tri libre.',
|
||
'dayplan.confirmRemoveTimeAction': 'Supprimer l\'heure et déplacer',
|
||
'dayplan.cannotDropOnTimed': 'Les éléments ne peuvent pas être placés entre des entrées à heure fixe',
|
||
'dayplan.cannotBreakChronology': 'Cela briserait l\'ordre chronologique des éléments et réservations planifiés',
|
||
|
||
// Places Sidebar
|
||
'places.addPlace': 'Ajouter un lieu/activité',
|
||
'places.importFile': 'Importer un fichier',
|
||
'places.sidebarDrop': 'Déposer pour importer',
|
||
'places.importFileHint': 'Importez des fichiers .gpx, .kml ou .kmz depuis des outils comme Google My Maps, Google Earth ou un traceur GPS.',
|
||
'places.importFileDropHere': 'Cliquez pour sélectionner un fichier ou glissez-déposez ici',
|
||
'places.importFileDropActive': 'Déposez le fichier pour le sélectionner',
|
||
'places.importFileUnsupported': 'Type de fichier non pris en charge. Utilisez .gpx, .kml ou .kmz.',
|
||
'places.importFileTooLarge': 'Le fichier est trop volumineux. La taille maximale est de {maxMb} MB.',
|
||
'places.importFileError': 'Importation échouée',
|
||
'places.importAllSkipped': 'Tous les lieux étaient déjà dans le voyage.',
|
||
'places.gpxImported': '{count} lieux importés depuis GPX',
|
||
'places.gpxImportTypes': 'Que voulez-vous importer?',
|
||
'places.gpxImportWaypoints': 'Points de passage',
|
||
'places.gpxImportRoutes': 'Itinéraires',
|
||
'places.gpxImportTracks': 'Traces (avec géométrie)',
|
||
'places.gpxImportNoneSelected': 'Sélectionnez au moins un type à importer.',
|
||
'places.kmlImportTypes': 'Que souhaitez-vous importer ?',
|
||
'places.kmlImportPoints': 'Points (Placemarks)',
|
||
'places.kmlImportPaths': 'Chemins (LineStrings)',
|
||
'places.kmlImportNoneSelected': 'Sélectionnez au moins un type.',
|
||
'places.selectionCount': '{count} sélectionné(s)',
|
||
'places.deleteSelected': 'Supprimer la sélection',
|
||
'places.kmlKmzImported': '{count} lieux importés depuis KMZ/KML',
|
||
'places.urlResolved': 'Lieu importé depuis l\'URL',
|
||
'places.importList': 'Import de liste',
|
||
'places.kmlKmzSummaryValues': 'Placemarks : {total} • Importés : {created} • Ignorés : {skipped}',
|
||
'places.importGoogleList': 'Liste Google',
|
||
'places.importNaverList': 'Liste Naver',
|
||
'places.googleListHint': 'Collez un lien de liste Google Maps partagée pour importer tous les lieux.',
|
||
'places.googleListImported': '{count} lieux importés depuis "{list}"',
|
||
'places.googleListError': 'Impossible d\'importer la liste Google Maps',
|
||
'places.naverListHint': 'Collez un lien de liste Naver Maps partagée pour importer tous les lieux.',
|
||
'places.naverListImported': '{count} lieux importés depuis "{list}"',
|
||
'places.naverListError': 'Impossible d\'importer la liste Naver Maps',
|
||
'places.viewDetails': 'Voir les détails',
|
||
'places.assignToDay': 'Ajouter à quel jour ?',
|
||
'places.all': 'Tous',
|
||
'places.unplanned': 'Non planifiés',
|
||
'places.filterTracks': 'Traces',
|
||
'places.search': 'Rechercher des lieux…',
|
||
'places.allCategories': 'Toutes les catégories',
|
||
'places.categoriesSelected': 'catégories',
|
||
'places.clearFilter': 'Effacer le filtre',
|
||
'places.count': '{count} lieux',
|
||
'places.countSingular': '1 lieu',
|
||
'places.allPlanned': 'Tous les lieux sont planifiés',
|
||
'places.noneFound': 'Aucun lieu trouvé',
|
||
'places.editPlace': 'Modifier le lieu',
|
||
'places.formName': 'Nom',
|
||
'places.formNamePlaceholder': 'ex. Tour Eiffel',
|
||
'places.formDescription': 'Description',
|
||
'places.formDescriptionPlaceholder': 'Brève description…',
|
||
'places.formAddress': 'Adresse',
|
||
'places.formAddressPlaceholder': 'Rue, ville, pays',
|
||
'places.formLat': 'Latitude (ex. 48.8566)',
|
||
'places.formLng': 'Longitude (ex. 2.3522)',
|
||
'places.formCategory': 'Catégorie',
|
||
'places.noCategory': 'Sans catégorie',
|
||
'places.categoryNamePlaceholder': 'Nom de la catégorie',
|
||
'places.formTime': 'Heure',
|
||
'places.startTime': 'Début',
|
||
'places.endTime': 'Fin',
|
||
'places.endTimeBeforeStart': 'L\'heure de fin est antérieure à l\'heure de début',
|
||
'places.timeCollision': 'Chevauchement horaire avec :',
|
||
'places.formWebsite': 'Site web',
|
||
'places.formNotes': 'Notes',
|
||
'places.formNotesPlaceholder': 'Notes personnelles…',
|
||
'places.formReservation': 'Réservation',
|
||
'places.reservationNotesPlaceholder': 'Notes de réservation, numéro de confirmation…',
|
||
'places.mapsSearchPlaceholder': 'Rechercher des lieux…',
|
||
'places.mapsSearchError': 'La recherche de lieu a échoué.',
|
||
'places.loadingDetails': 'Chargement des détails du lieu…',
|
||
'places.osmHint': 'Recherche via OpenStreetMap (pas de photos, horaires ni notes). Ajoutez une clé API Google dans les paramètres pour plus de détails.',
|
||
'places.osmActive': 'Recherche via OpenStreetMap (pas de photos, notes ni horaires). Ajoutez une clé API Google dans les paramètres pour des données enrichies.',
|
||
'places.categoryCreateError': 'Impossible de créer la catégorie',
|
||
'places.nameRequired': 'Veuillez saisir un nom',
|
||
'places.saveError': 'Échec de l\'enregistrement',
|
||
// Place Inspector
|
||
'inspector.opened': 'Ouvert',
|
||
'inspector.closed': 'Fermé',
|
||
'inspector.openingHours': 'Horaires d\'ouverture',
|
||
'inspector.showHours': 'Afficher les horaires',
|
||
'inspector.files': 'Fichiers',
|
||
'inspector.filesCount': '{count} fichiers',
|
||
'inspector.removeFromDay': 'Retirer du jour',
|
||
'inspector.remove': 'Supprimer',
|
||
'inspector.addToDay': 'Ajouter au jour',
|
||
'inspector.confirmedRes': 'Réservation confirmée',
|
||
'inspector.pendingRes': 'Réservation en attente',
|
||
'inspector.google': 'Ouvrir dans Google Maps',
|
||
'inspector.website': 'Ouvrir le site web',
|
||
'inspector.addRes': 'Réservation',
|
||
'inspector.editRes': 'Modifier la réservation',
|
||
'inspector.participants': 'Participants',
|
||
'inspector.trackStats': 'Données du parcours',
|
||
|
||
// Reservations
|
||
'reservations.title': 'Réservations',
|
||
'reservations.empty': 'Aucune réservation',
|
||
'reservations.emptyHint': 'Ajoutez des réservations pour les vols, hôtels et plus',
|
||
'reservations.add': 'Ajouter une réservation',
|
||
'reservations.addManual': 'Réservation manuelle',
|
||
'reservations.placeHint': 'Conseil : les réservations sont mieux créées directement depuis un lieu pour les lier à votre plan du jour.',
|
||
'reservations.confirmed': 'Confirmée',
|
||
'reservations.pending': 'En attente',
|
||
'reservations.summary': '{confirmed} confirmées, {pending} en attente',
|
||
'reservations.fromPlan': 'Du plan',
|
||
'reservations.showFiles': 'Afficher les fichiers',
|
||
'reservations.editTitle': 'Modifier la réservation',
|
||
'reservations.status': 'Statut',
|
||
'reservations.datetime': 'Date et heure',
|
||
'reservations.startTime': 'Heure de début',
|
||
'reservations.endTime': 'Heure de fin',
|
||
'reservations.date': 'Date',
|
||
'reservations.time': 'Heure',
|
||
'reservations.timeAlt': 'Heure (alternative, ex. 19h30)',
|
||
'reservations.notes': 'Notes',
|
||
'reservations.notesPlaceholder': 'Notes supplémentaires…',
|
||
'reservations.meta.airline': 'Compagnie aérienne',
|
||
'reservations.meta.flightNumber': 'N° de vol',
|
||
'reservations.meta.from': 'De',
|
||
'reservations.meta.to': 'À',
|
||
'reservations.needsReview': 'Vérifier',
|
||
'reservations.needsReviewHint': 'L\'aéroport n\'a pas pu être identifié automatiquement — veuillez confirmer l\'emplacement.',
|
||
'reservations.searchLocation': 'Rechercher une gare, un port, une adresse…',
|
||
'airport.searchPlaceholder': 'Code ou ville de l\'aéroport (ex. FRA)',
|
||
'map.connections': 'Connexions',
|
||
'map.showConnections': 'Afficher les itinéraires',
|
||
'map.hideConnections': 'Masquer les itinéraires',
|
||
'settings.bookingLabels': 'Étiquettes des itinéraires',
|
||
'settings.bookingLabelsHint': 'Affiche les noms des gares / aéroports sur la carte. Si désactivé, seule l\'icône est affichée.',
|
||
'reservations.meta.trainNumber': 'N° de train',
|
||
'reservations.meta.platform': 'Quai',
|
||
'reservations.meta.seat': 'Place',
|
||
'reservations.meta.checkIn': 'Arrivée',
|
||
'reservations.meta.checkInUntil': "Check-in jusqu'à",
|
||
'reservations.meta.checkOut': 'Départ',
|
||
'reservations.meta.linkAccommodation': 'Hébergement',
|
||
'reservations.meta.pickAccommodation': 'Lier à un hébergement',
|
||
'reservations.meta.noAccommodation': 'Aucun',
|
||
'reservations.meta.hotelPlace': 'Hébergement',
|
||
'reservations.meta.pickHotel': 'Sélectionner un hébergement',
|
||
'reservations.meta.fromDay': 'Du',
|
||
'reservations.meta.toDay': 'Au',
|
||
'reservations.meta.selectDay': 'Sélectionner un jour',
|
||
'reservations.type.flight': 'Vol',
|
||
'reservations.type.hotel': 'Hébergement',
|
||
'reservations.type.restaurant': 'Restaurant',
|
||
'reservations.type.train': 'Train',
|
||
'reservations.type.car': 'Voiture',
|
||
'reservations.type.cruise': 'Croisière',
|
||
'reservations.type.event': 'Événement',
|
||
'reservations.type.tour': 'Visite',
|
||
'reservations.type.other': 'Autre',
|
||
'reservations.confirm.delete': 'Voulez-vous vraiment supprimer la réservation « {name} » ?',
|
||
'reservations.confirm.deleteTitle': 'Supprimer la réservation ?',
|
||
'reservations.confirm.deleteBody': '« {name} » sera définitivement supprimé.',
|
||
'reservations.toast.updated': 'Réservation mise à jour',
|
||
'reservations.toast.removed': 'Réservation supprimée',
|
||
'reservations.toast.fileUploaded': 'Fichier importé',
|
||
'reservations.toast.uploadError': 'Échec de l\'import',
|
||
'reservations.newTitle': 'Nouvelle réservation',
|
||
'reservations.bookingType': 'Type de réservation',
|
||
'reservations.titleLabel': 'Titre',
|
||
'reservations.titlePlaceholder': 'ex. Lufthansa LH123, Hôtel Adlon, …',
|
||
'reservations.locationAddress': 'Lieu / Adresse',
|
||
'reservations.locationPlaceholder': 'Adresse, aéroport, hôtel…',
|
||
'reservations.confirmationCode': 'Code de réservation',
|
||
'reservations.confirmationPlaceholder': 'ex. ABC12345',
|
||
'reservations.day': 'Jour',
|
||
'reservations.noDay': 'Aucun jour',
|
||
'reservations.place': 'Lieu',
|
||
'reservations.noPlace': 'Aucun lieu',
|
||
'reservations.pendingSave': 'sera enregistré…',
|
||
'reservations.uploading': 'Importation…',
|
||
'reservations.attachFile': 'Joindre un fichier',
|
||
'reservations.linkExisting': 'Lier un fichier existant',
|
||
'reservations.toast.saveError': 'Échec de l\'enregistrement',
|
||
'reservations.toast.updateError': 'Échec de la mise à jour',
|
||
'reservations.toast.deleteError': 'Échec de la suppression',
|
||
'reservations.confirm.remove': 'Supprimer la réservation pour « {name} » ?',
|
||
'reservations.linkAssignment': 'Lier à l\'affectation du jour',
|
||
'reservations.pickAssignment': 'Sélectionnez une affectation de votre plan…',
|
||
'reservations.noAssignment': 'Aucun lien (autonome)',
|
||
'reservations.price': 'Prix',
|
||
'reservations.budgetCategory': 'Catégorie budgétaire',
|
||
'reservations.budgetCategoryPlaceholder': 'ex. Transport, Hébergement',
|
||
'reservations.budgetCategoryAuto': 'Auto (selon le type de réservation)',
|
||
'reservations.budgetHint': 'Une entrée budgétaire sera créée automatiquement lors de l\'enregistrement.',
|
||
'reservations.departureDate': 'Départ',
|
||
'reservations.arrivalDate': 'Arrivée',
|
||
'reservations.departureTime': 'Heure dép.',
|
||
'reservations.arrivalTime': 'Heure arr.',
|
||
'reservations.pickupDate': 'Prise en charge',
|
||
'reservations.returnDate': 'Restitution',
|
||
'reservations.pickupTime': 'Heure prise en charge',
|
||
'reservations.returnTime': 'Heure restitution',
|
||
'reservations.endDate': 'Date de fin',
|
||
'reservations.meta.departureTimezone': 'TZ dép.',
|
||
'reservations.meta.arrivalTimezone': 'TZ arr.',
|
||
'reservations.span.departure': 'Départ',
|
||
'reservations.span.arrival': 'Arrivée',
|
||
'reservations.span.inTransit': 'En transit',
|
||
'reservations.span.pickup': 'Prise en charge',
|
||
'reservations.span.return': 'Restitution',
|
||
'reservations.span.active': 'Actif',
|
||
'reservations.span.start': 'Début',
|
||
'reservations.span.end': 'Fin',
|
||
'reservations.span.ongoing': 'En cours',
|
||
'reservations.validation.endBeforeStart': 'La date/heure de fin doit être postérieure à la date/heure de début',
|
||
'reservations.addBooking': 'Ajouter une réservation',
|
||
|
||
// Budget
|
||
'budget.title': 'Budget',
|
||
'budget.exportCsv': 'Exporter CSV',
|
||
'budget.emptyTitle': 'Aucun budget créé',
|
||
'budget.emptyText': 'Créez des catégories et des entrées pour planifier votre budget de voyage',
|
||
'budget.emptyPlaceholder': 'Nom de la catégorie…',
|
||
'budget.createCategory': 'Créer une catégorie',
|
||
'budget.category': 'Catégorie',
|
||
'budget.categoryName': 'Nom de la catégorie',
|
||
'budget.table.name': 'Nom',
|
||
'budget.table.total': 'Total',
|
||
'budget.table.persons': 'Personnes',
|
||
'budget.table.days': 'Jours',
|
||
'budget.table.perPerson': 'Par personne',
|
||
'budget.table.perDay': 'Par jour',
|
||
'budget.table.perPersonDay': 'P. p / Jour',
|
||
'budget.table.note': 'Note',
|
||
'budget.table.date': 'Date',
|
||
'budget.newEntry': 'Nouvelle entrée',
|
||
'budget.defaultEntry': 'Nouvelle entrée',
|
||
'budget.defaultCategory': 'Nouvelle catégorie',
|
||
'budget.total': 'Total',
|
||
'budget.totalBudget': 'Budget total',
|
||
'budget.byCategory': 'Par catégorie',
|
||
'budget.editTooltip': 'Cliquez pour modifier',
|
||
'budget.linkedToReservation': 'Lié à une réservation — modifiez le nom depuis celle-ci',
|
||
'budget.confirm.deleteCategory': 'Voulez-vous vraiment supprimer la catégorie « {name} » avec {count} entrées ?',
|
||
'budget.deleteCategory': 'Supprimer la catégorie',
|
||
'budget.perPerson': 'Par personne',
|
||
'budget.paid': 'Payé',
|
||
'budget.open': 'Ouvert',
|
||
'budget.noMembers': 'Aucun membre assigné',
|
||
'budget.settlement': 'Règlement',
|
||
'budget.settlementInfo': 'Cliquez sur l\'avatar d\'un membre sur un poste budgétaire pour le marquer en vert — cela signifie qu\'il a payé. Le règlement indique ensuite qui doit combien à qui.',
|
||
'budget.netBalances': 'Soldes nets',
|
||
|
||
// Files
|
||
'files.title': 'Fichiers',
|
||
'files.pageTitle': 'Fichiers et documents',
|
||
'files.subtitle': '{count} fichiers pour {trip}',
|
||
'files.downloadPdf': 'Télécharger le PDF',
|
||
'files.count': '{count} fichiers',
|
||
'files.countSingular': '1 fichier',
|
||
'files.uploaded': '{count} importés',
|
||
'files.uploadError': 'Échec de l\'import',
|
||
'files.dropzone': 'Déposez les fichiers ici',
|
||
'files.dropzoneHint': 'ou cliquez pour parcourir',
|
||
'files.allowedTypes': 'Images, PDF, DOC, DOCX, XLS, XLSX, TXT, CSV · Max 50 Mo',
|
||
'files.uploading': 'Importation…',
|
||
'files.filterAll': 'Tous',
|
||
'files.filterPdf': 'PDF',
|
||
'files.filterImages': 'Images',
|
||
'files.filterDocs': 'Documents',
|
||
'files.filterCollab': 'Notes Collab',
|
||
'files.sourceCollab': 'Depuis les notes Collab',
|
||
'files.empty': 'Aucun fichier',
|
||
'files.emptyHint': 'Importez des fichiers pour les joindre à votre voyage',
|
||
'files.openTab': 'Ouvrir dans un nouvel onglet',
|
||
'files.confirm.delete': 'Voulez-vous vraiment supprimer ce fichier ?',
|
||
'files.toast.deleted': 'Fichier supprimé',
|
||
'files.toast.deleteError': 'Impossible de supprimer le fichier',
|
||
'files.sourcePlan': 'Plan du jour',
|
||
'files.sourceBooking': 'Réservation',
|
||
'files.attach': 'Joindre',
|
||
'files.pasteHint': 'Vous pouvez aussi coller des images depuis le presse-papiers (Ctrl+V)',
|
||
'files.trash': 'Corbeille',
|
||
'files.trashEmpty': 'La corbeille est vide',
|
||
'files.emptyTrash': 'Vider la corbeille',
|
||
'files.restore': 'Restaurer',
|
||
'files.star': 'Favori',
|
||
'files.unstar': 'Retirer des favoris',
|
||
'files.assign': 'Assigner',
|
||
'files.assignTitle': 'Assigner le fichier',
|
||
'files.assignPlace': 'Lieu',
|
||
'files.assignBooking': 'Réservation',
|
||
'files.unassigned': 'Non attribué',
|
||
'files.unlink': 'Supprimer le lien',
|
||
'files.toast.trashed': 'Déplacé dans la corbeille',
|
||
'files.toast.restored': 'Fichier restauré',
|
||
'files.toast.trashEmptied': 'Corbeille vidée',
|
||
'files.toast.assigned': 'Fichier attribué',
|
||
'files.toast.assignError': 'Échec de l\'assignation',
|
||
'files.toast.restoreError': 'Échec de la restauration',
|
||
'files.confirm.permanentDelete': 'Supprimer définitivement ce fichier ? Cette action est irréversible.',
|
||
'files.confirm.emptyTrash': 'Supprimer définitivement tous les fichiers de la corbeille ? Cette action est irréversible.',
|
||
'files.noteLabel': 'Note',
|
||
'files.notePlaceholder': 'Ajouter une note…',
|
||
|
||
// Packing
|
||
'packing.title': 'Liste de bagages',
|
||
'packing.empty': 'La liste de bagages est vide',
|
||
'packing.import': 'Importer',
|
||
'packing.importTitle': 'Importer la liste',
|
||
'packing.importHint': 'Un élément par ligne. Catégorie et quantité optionnelles séparées par virgule, point-virgule ou tabulation : Nom, Catégorie, Quantité',
|
||
'packing.importPlaceholder': 'Brosse à dents\nCrème solaire, Hygiène\nT-Shirts, Vêtements, 5\nPasseport, Documents',
|
||
'packing.importCsv': 'Charger CSV/TXT',
|
||
'packing.importAction': 'Importer {count}',
|
||
'packing.importSuccess': '{count} éléments importés',
|
||
'packing.importError': 'Échec de l\'import',
|
||
'packing.importEmpty': 'Aucun élément à importer',
|
||
'packing.progress': '{packed} sur {total} emballés ({percent} %)',
|
||
'packing.clearChecked': 'Supprimer {count} cochés',
|
||
'packing.clearCheckedShort': 'Supprimer {count}',
|
||
'packing.suggestions': 'Suggestions',
|
||
'packing.suggestionsTitle': 'Ajouter des suggestions',
|
||
'packing.allSuggested': 'Toutes les suggestions ajoutées',
|
||
'packing.allPacked': 'Tout est emballé !',
|
||
'packing.addPlaceholder': 'Ajouter un nouvel article…',
|
||
'packing.categoryPlaceholder': 'Catégorie…',
|
||
'packing.filterAll': 'Tous',
|
||
'packing.filterOpen': 'À faire',
|
||
'packing.filterDone': 'Fait',
|
||
'packing.emptyTitle': 'La liste de bagages est vide',
|
||
'packing.emptyHint': 'Ajoutez des articles ou utilisez les suggestions',
|
||
'packing.emptyFiltered': 'Aucun article ne correspond à ce filtre',
|
||
'packing.menuRename': 'Renommer',
|
||
'packing.menuCheckAll': 'Tout cocher',
|
||
'packing.menuUncheckAll': 'Tout décocher',
|
||
'packing.menuDeleteCat': 'Supprimer la catégorie',
|
||
'packing.addItem': 'Ajouter un article',
|
||
'packing.addItemPlaceholder': 'Nom de l\'article...',
|
||
'packing.addCategory': 'Ajouter une catégorie',
|
||
'packing.newCategoryPlaceholder': 'Nom de catégorie (ex. Vêtements)',
|
||
'packing.applyTemplate': 'Appliquer un modèle',
|
||
'packing.template': 'Modèle',
|
||
'packing.templateApplied': '{count} articles ajoutés depuis le modèle',
|
||
'packing.templateError': 'Erreur lors de l\'application du modèle',
|
||
'packing.saveAsTemplate': 'Enregistrer comme modèle',
|
||
'packing.templateName': 'Nom du modèle',
|
||
'packing.templateSaved': 'Liste de voyage enregistrée comme modèle',
|
||
'packing.noMembers': 'Aucun membre',
|
||
'packing.bags': 'Bagages',
|
||
'packing.noBag': 'Non assigné',
|
||
'packing.totalWeight': 'Poids total',
|
||
'packing.bagName': 'Nom...',
|
||
'packing.addBag': 'Ajouter un bagage',
|
||
'packing.changeCategory': 'Changer de catégorie',
|
||
'packing.confirm.clearChecked': 'Voulez-vous vraiment supprimer {count} articles cochés ?',
|
||
'packing.confirm.deleteCat': 'Voulez-vous vraiment supprimer la catégorie « {name} » avec {count} articles ?',
|
||
'packing.defaultCategory': 'Autre',
|
||
'packing.toast.saveError': 'Échec de l\'enregistrement',
|
||
'packing.toast.deleteError': 'Échec de la suppression',
|
||
'packing.toast.renameError': 'Échec du renommage',
|
||
'packing.toast.addError': 'Échec de l\'ajout',
|
||
|
||
// Packing suggestions
|
||
'packing.suggestions.items': [
|
||
{ name: 'Passeport', category: 'Documents' },
|
||
{ name: 'Carte d\'identité', category: 'Documents' },
|
||
{ name: 'Assurance voyage', category: 'Documents' },
|
||
{ name: 'Billets d\'avion', category: 'Documents' },
|
||
{ name: 'Carte bancaire', category: 'Finances' },
|
||
{ name: 'Espèces', category: 'Finances' },
|
||
{ name: 'Visa', category: 'Documents' },
|
||
{ name: 'T-shirts', category: 'Vêtements' },
|
||
{ name: 'Pantalons', category: 'Vêtements' },
|
||
{ name: 'Sous-vêtements', category: 'Vêtements' },
|
||
{ name: 'Chaussettes', category: 'Vêtements' },
|
||
{ name: 'Veste', category: 'Vêtements' },
|
||
{ name: 'Pyjama', category: 'Vêtements' },
|
||
{ name: 'Maillot de bain', category: 'Vêtements' },
|
||
{ name: 'Imperméable', category: 'Vêtements' },
|
||
{ name: 'Chaussures confortables', category: 'Vêtements' },
|
||
{ name: 'Brosse à dents', category: 'Hygiène' },
|
||
{ name: 'Dentifrice', category: 'Hygiène' },
|
||
{ name: 'Shampooing', category: 'Hygiène' },
|
||
{ name: 'Déodorant', category: 'Hygiène' },
|
||
{ name: 'Crème solaire', category: 'Hygiène' },
|
||
{ name: 'Rasoir', category: 'Hygiène' },
|
||
{ name: 'Chargeur', category: 'Électronique' },
|
||
{ name: 'Batterie externe', category: 'Électronique' },
|
||
{ name: 'Écouteurs', category: 'Électronique' },
|
||
{ name: 'Adaptateur de voyage', category: 'Électronique' },
|
||
{ name: 'Appareil photo', category: 'Électronique' },
|
||
{ name: 'Antidouleurs', category: 'Santé' },
|
||
{ name: 'Pansements', category: 'Santé' },
|
||
{ name: 'Désinfectant', category: 'Santé' },
|
||
],
|
||
|
||
// Members / Sharing
|
||
'members.shareTrip': 'Partager le voyage',
|
||
'members.inviteUser': 'Inviter un utilisateur',
|
||
'members.selectUser': 'Sélectionner un utilisateur…',
|
||
'members.invite': 'Inviter',
|
||
'members.allHaveAccess': 'Tous les utilisateurs ont déjà accès.',
|
||
'members.access': 'Accès',
|
||
'members.person': 'personne',
|
||
'members.persons': 'personnes',
|
||
'members.you': 'vous',
|
||
'members.owner': 'Propriétaire',
|
||
'members.leaveTrip': 'Quitter le voyage',
|
||
'members.removeAccess': 'Retirer l\'accès',
|
||
'members.confirmLeave': 'Quitter le voyage ? Vous perdrez l\'accès.',
|
||
'members.confirmRemove': 'Retirer l\'accès à cet utilisateur ?',
|
||
'members.loadError': 'Impossible de charger les membres',
|
||
'members.added': 'ajouté',
|
||
'members.addError': 'Échec de l\'ajout',
|
||
'members.removed': 'Membre retiré',
|
||
'members.removeError': 'Échec de la suppression',
|
||
|
||
// Categories (Admin)
|
||
'categories.title': 'Catégories',
|
||
'categories.subtitle': 'Gérer les catégories de lieux',
|
||
'categories.new': 'Nouvelle catégorie',
|
||
'categories.empty': 'Aucune catégorie',
|
||
'categories.namePlaceholder': 'Nom de la catégorie',
|
||
'categories.icon': 'Icône',
|
||
'categories.color': 'Couleur',
|
||
'categories.customColor': 'Choisir une couleur personnalisée',
|
||
'categories.preview': 'Aperçu',
|
||
'categories.defaultName': 'Catégorie',
|
||
'categories.update': 'Mettre à jour',
|
||
'categories.create': 'Créer',
|
||
'categories.confirm.delete': 'Supprimer la catégorie ? Les lieux de cette catégorie ne seront pas supprimés.',
|
||
'categories.toast.loadError': 'Impossible de charger les catégories',
|
||
'categories.toast.nameRequired': 'Veuillez saisir un nom',
|
||
'categories.toast.updated': 'Catégorie mise à jour',
|
||
'categories.toast.created': 'Catégorie créée',
|
||
'categories.toast.saveError': 'Échec de l\'enregistrement',
|
||
'categories.toast.deleted': 'Catégorie supprimée',
|
||
'categories.toast.deleteError': 'Échec de la suppression',
|
||
|
||
// Backup (Admin)
|
||
'backup.title': 'Sauvegarde des données',
|
||
'backup.subtitle': 'Base de données et tous les fichiers importés',
|
||
'backup.refresh': 'Actualiser',
|
||
'backup.upload': 'Importer une sauvegarde',
|
||
'backup.uploading': 'Importation…',
|
||
'backup.create': 'Créer une sauvegarde',
|
||
'backup.creating': 'Création…',
|
||
'backup.empty': 'Aucune sauvegarde',
|
||
'backup.createFirst': 'Créer la première sauvegarde',
|
||
'backup.download': 'Télécharger',
|
||
'backup.restore': 'Restaurer',
|
||
'backup.confirm.restore': 'Restaurer la sauvegarde « {name} » ?\n\nToutes les données actuelles seront remplacées par la sauvegarde.',
|
||
'backup.confirm.uploadRestore': 'Importer et restaurer le fichier de sauvegarde « {name} » ?\n\nToutes les données actuelles seront écrasées.',
|
||
'backup.confirm.delete': 'Supprimer la sauvegarde « {name} » ?',
|
||
'backup.toast.loadError': 'Impossible de charger les sauvegardes',
|
||
'backup.toast.created': 'Sauvegarde créée avec succès',
|
||
'backup.toast.createError': 'Impossible de créer la sauvegarde',
|
||
'backup.toast.restored': 'Sauvegarde restaurée. La page va se recharger…',
|
||
'backup.toast.restoreError': 'Échec de la restauration',
|
||
'backup.toast.uploadError': 'Échec de l\'import',
|
||
'backup.toast.deleted': 'Sauvegarde supprimée',
|
||
'backup.toast.deleteError': 'Échec de la suppression',
|
||
'backup.toast.downloadError': 'Échec du téléchargement',
|
||
'backup.toast.settingsSaved': 'Paramètres de sauvegarde automatique enregistrés',
|
||
'backup.toast.settingsError': 'Impossible d\'enregistrer les paramètres',
|
||
'backup.auto.title': 'Sauvegarde automatique',
|
||
'backup.auto.subtitle': 'Sauvegarde automatique programmée',
|
||
'backup.auto.enable': 'Activer la sauvegarde automatique',
|
||
'backup.auto.enableHint': 'Les sauvegardes seront créées automatiquement selon le calendrier choisi',
|
||
'backup.auto.interval': 'Intervalle',
|
||
'backup.auto.hour': 'Exécuter à l\'heure',
|
||
'backup.auto.hourHint': 'Heure locale du serveur (format {format})',
|
||
'backup.auto.dayOfWeek': 'Jour de la semaine',
|
||
'backup.auto.dayOfMonth': 'Jour du mois',
|
||
'backup.auto.dayOfMonthHint': 'Limité à 1–28 pour la compatibilité avec tous les mois',
|
||
'backup.auto.scheduleSummary': 'Planification',
|
||
'backup.auto.summaryDaily': 'Tous les jours à {hour}h00',
|
||
'backup.auto.summaryWeekly': 'Chaque {day} à {hour}h00',
|
||
'backup.auto.summaryMonthly': 'Le {day} de chaque mois à {hour}h00',
|
||
'backup.auto.envLocked': 'Docker',
|
||
'backup.auto.envLockedHint': 'La sauvegarde automatique est configurée via les variables d\'environnement Docker. Pour modifier ces paramètres, mettez à jour votre docker-compose.yml et redémarrez le conteneur.',
|
||
'backup.auto.copyEnv': 'Copier les variables d\'env Docker',
|
||
'backup.auto.envCopied': 'Variables d\'env Docker copiées dans le presse-papiers',
|
||
'backup.auto.keepLabel': 'Supprimer les anciennes sauvegardes après',
|
||
'backup.dow.sunday': 'Dim',
|
||
'backup.dow.monday': 'Lun',
|
||
'backup.dow.tuesday': 'Mar',
|
||
'backup.dow.wednesday': 'Mer',
|
||
'backup.dow.thursday': 'Jeu',
|
||
'backup.dow.friday': 'Ven',
|
||
'backup.dow.saturday': 'Sam',
|
||
'backup.interval.hourly': 'Toutes les heures',
|
||
'backup.interval.daily': 'Quotidien',
|
||
'backup.interval.weekly': 'Hebdomadaire',
|
||
'backup.interval.monthly': 'Mensuel',
|
||
'backup.keep.1day': '1 jour',
|
||
'backup.keep.3days': '3 jours',
|
||
'backup.keep.7days': '7 jours',
|
||
'backup.keep.14days': '14 jours',
|
||
'backup.keep.30days': '30 jours',
|
||
'backup.keep.forever': 'Conserver indéfiniment',
|
||
|
||
// Photos
|
||
'photos.title': 'Photos',
|
||
'photos.subtitle': '{count} photos pour {trip}',
|
||
'photos.dropHere': 'Déposez des photos ici...',
|
||
'photos.dropHereActive': 'Déposez des photos ici',
|
||
'photos.captionForAll': 'Légende (pour tous)',
|
||
'photos.captionPlaceholder': 'Légende optionnelle...',
|
||
'photos.addCaption': 'Ajouter une légende...',
|
||
'photos.allDays': 'Tous les jours',
|
||
'photos.noPhotos': 'Aucune photo',
|
||
'photos.uploadHint': 'Importez vos photos de voyage',
|
||
'photos.clickToSelect': 'ou cliquez pour sélectionner',
|
||
'photos.linkPlace': 'Lier au lieu',
|
||
'photos.noPlace': 'Aucun lieu',
|
||
'photos.uploadN': '{n} photo(s) importée(s)',
|
||
'photos.linkDay': 'Lier le jour',
|
||
'photos.noDay': 'Aucun jour',
|
||
'photos.dayLabel': 'Jour {number}',
|
||
'photos.photoSelected': 'Photo sélectionnée',
|
||
'photos.photosSelected': 'Photos sélectionnées',
|
||
'photos.fileTypeHint': "JPG, PNG, WebP · max. 10 Mo · jusqu'à 30 photos",
|
||
|
||
// Backup restore modal
|
||
'backup.restoreConfirmTitle': 'Restaurer la sauvegarde ?',
|
||
'backup.restoreWarning': 'Toutes les données actuelles (voyages, lieux, utilisateurs, importations) seront définitivement remplacées par la sauvegarde. Cette action est irréversible.',
|
||
'backup.restoreTip': 'Conseil : créez une sauvegarde de l\'état actuel avant de restaurer.',
|
||
'backup.restoreConfirm': 'Oui, restaurer',
|
||
|
||
// PDF
|
||
'pdf.travelPlan': 'Plan de voyage',
|
||
'pdf.planned': 'Planifié',
|
||
'pdf.costLabel': 'Coût EUR',
|
||
'pdf.preview': 'Aperçu PDF',
|
||
'pdf.saveAsPdf': 'Enregistrer en PDF',
|
||
|
||
// Planner
|
||
'planner.places': 'Lieux',
|
||
'planner.bookings': 'Réservations',
|
||
'planner.packingList': 'Liste de bagages',
|
||
'planner.documents': 'Documents',
|
||
'planner.dayPlan': 'Plan du jour',
|
||
'planner.reservations': 'Réservations',
|
||
'planner.minTwoPlaces': 'Au moins 2 lieux avec coordonnées nécessaires',
|
||
'planner.noGeoPlaces': 'Aucun lieu avec coordonnées disponible',
|
||
'planner.routeCalculated': 'Itinéraire calculé',
|
||
'planner.routeCalcFailed': 'L\'itinéraire n\'a pas pu être calculé',
|
||
'planner.routeError': 'Erreur lors du calcul de l\'itinéraire',
|
||
'planner.icsExportFailed': 'Échec de l\'export ICS',
|
||
'planner.routeOptimized': 'Itinéraire optimisé',
|
||
'planner.reservationUpdated': 'Réservation mise à jour',
|
||
'planner.reservationAdded': 'Réservation ajoutée',
|
||
'planner.confirmDeleteReservation': 'Supprimer la réservation ?',
|
||
'planner.reservationDeleted': 'Réservation supprimée',
|
||
'planner.days': 'Jours',
|
||
'planner.allPlaces': 'Tous les lieux',
|
||
'planner.totalPlaces': '{n} lieux au total',
|
||
'planner.noDaysPlanned': 'Aucun jour planifié',
|
||
'planner.editTrip': 'Modifier le voyage \u2192',
|
||
'planner.placeOne': '1 lieu',
|
||
'planner.placeN': '{n} lieux',
|
||
'planner.addNote': 'Ajouter une note',
|
||
'planner.noEntries': 'Aucune entrée pour ce jour',
|
||
'planner.addPlace': 'Ajouter un lieu ou une activité',
|
||
'planner.addPlaceShort': '+ Ajouter un lieu ou une activité',
|
||
'planner.resPending': 'Réservation en attente · ',
|
||
'planner.resConfirmed': 'Réservation confirmée · ',
|
||
'planner.notePlaceholder': 'Note…',
|
||
'planner.noteTimePlaceholder': 'Heure (facultatif)',
|
||
'planner.noteExamplePlaceholder': 'ex. S3 à 14h30 depuis la gare centrale, ferry depuis le quai 7, pause déjeuner…',
|
||
'planner.totalCost': 'Coût total',
|
||
'planner.searchPlaces': 'Rechercher des lieux…',
|
||
'planner.allCategories': 'Toutes les catégories',
|
||
'planner.noPlacesFound': 'Aucun lieu trouvé',
|
||
'planner.addFirstPlace': 'Ajouter un premier lieu',
|
||
'planner.noReservations': 'Aucune réservation',
|
||
'planner.addFirstReservation': 'Ajouter une première réservation',
|
||
'planner.new': 'Nouveau',
|
||
'planner.addToDay': '+ Jour',
|
||
'planner.calculating': 'Calcul…',
|
||
'planner.route': 'Itinéraire',
|
||
'planner.optimize': 'Optimiser',
|
||
'planner.openGoogleMaps': 'Ouvrir dans Google Maps',
|
||
'planner.selectDayHint': 'Sélectionnez un jour dans la liste de gauche pour voir le plan du jour',
|
||
'planner.noPlacesForDay': 'Aucun lieu pour ce jour',
|
||
'planner.addPlacesLink': 'Ajouter des lieux \u2192',
|
||
'planner.minTotal': 'min. total',
|
||
'planner.noReservation': 'Pas de réservation',
|
||
'planner.removeFromDay': 'Retirer du jour',
|
||
'planner.addToThisDay': 'Ajouter au jour',
|
||
'planner.overview': 'Aperçu',
|
||
'planner.noDays': 'Aucun jour',
|
||
'planner.editTripToAddDays': 'Modifiez le voyage pour ajouter des jours',
|
||
'planner.dayCount': '{n} jours',
|
||
'planner.clickToUnlock': 'Cliquez pour déverrouiller',
|
||
'planner.keepPosition': 'Maintenir la position lors de l\'optimisation de l\'itinéraire',
|
||
'planner.dayDetails': 'Détails du jour',
|
||
'planner.dayN': 'Jour {n}',
|
||
|
||
// Dashboard Stats
|
||
'stats.countries': 'Pays',
|
||
'stats.cities': 'Villes',
|
||
'stats.trips': 'Voyages',
|
||
'stats.places': 'Lieux',
|
||
'stats.worldProgress': 'Progression mondiale',
|
||
'stats.visited': 'visités',
|
||
'stats.remaining': 'restants',
|
||
'stats.visitedCountries': 'Pays visités',
|
||
|
||
// Day Detail Panel
|
||
'day.precipProb': 'Probabilité de pluie',
|
||
'day.precipitation': 'Précipitations',
|
||
'day.wind': 'Vent',
|
||
'day.sunrise': 'Lever du soleil',
|
||
'day.sunset': 'Coucher du soleil',
|
||
'day.hourlyForecast': 'Prévisions horaires',
|
||
'day.climateHint': 'Moyennes historiques — prévisions réelles disponibles dans les 16 jours précédant cette date.',
|
||
'day.noWeather': 'Aucune donnée météo disponible. Ajoutez un lieu avec des coordonnées.',
|
||
'day.overview': 'Aperçu du jour',
|
||
'day.accommodation': 'Hébergement',
|
||
'day.addAccommodation': 'Ajouter un hébergement',
|
||
'day.hotelDayRange': 'Appliquer aux jours',
|
||
'day.noPlacesForHotel': 'Ajoutez d\'abord des lieux à votre voyage',
|
||
'day.allDays': 'Tous',
|
||
'day.checkIn': 'Arrivée',
|
||
'day.checkInUntil': "Jusqu'à",
|
||
'day.checkOut': 'Départ',
|
||
'day.confirmation': 'Confirmation',
|
||
'day.editAccommodation': 'Modifier l\'hébergement',
|
||
'day.reservations': 'Réservations',
|
||
|
||
// Memories / Immich
|
||
'memories.title': 'Photos',
|
||
'memories.notConnected': 'Immich non connecté',
|
||
'memories.notConnectedHint': 'Connectez votre instance Immich dans les paramètres pour voir vos photos de voyage ici.',
|
||
'memories.notConnectedMultipleHint': 'Connectez un de ces fournisseurs de photos : {provider_names} dans les Paramètres pour pouvoir ajouter des photos à ce voyage.',
|
||
'memories.noDates': 'Ajoutez des dates à votre voyage pour charger les photos.',
|
||
'memories.noPhotos': 'Aucune photo trouvée',
|
||
'memories.noPhotosHint': 'Aucune photo trouvée dans Immich pour la période de ce voyage.',
|
||
'memories.photosFound': 'photos',
|
||
'memories.fromOthers': 'd\'autres',
|
||
'memories.sharePhotos': 'Partager les photos',
|
||
'memories.sharing': 'Partagé',
|
||
'memories.reviewTitle': 'Vérifier vos photos',
|
||
'memories.reviewHint': 'Cliquez sur les photos pour les exclure du partage.',
|
||
'memories.shareCount': 'Partager {count} photos',
|
||
'memories.providerUrl': 'URL du serveur',
|
||
'memories.providerApiKey': 'Clé API',
|
||
'memories.providerUsername': 'Nom d\'utilisateur',
|
||
'memories.providerPassword': 'Mot de passe',
|
||
'memories.providerOTP': 'Code MFA (si activé)',
|
||
'memories.skipSSLVerification': 'Ignorer la vérification du certificat SSL',
|
||
'memories.immichAutoUpload': 'Répliquer les photos du journey vers Immich au téléversement',
|
||
'memories.providerUrlHintSynology': 'Incluez le chemin de l\'application Photos dans l\'URL, ex. https://nas:5001/photo',
|
||
'memories.testConnection': 'Tester la connexion',
|
||
'memories.testFirst': 'Testez la connexion avant de sauvegarder',
|
||
'memories.connected': 'Connecté',
|
||
'memories.disconnected': 'Non connecté',
|
||
'memories.connectionSuccess': 'Connecté à Immich',
|
||
'memories.connectionError': 'Impossible de se connecter à Immich',
|
||
'memories.saved': 'Paramètres {provider_name} enregistrés',
|
||
'memories.providerDisconnectedBanner': 'Votre connexion {provider_name} est perdue. Reconnectez-vous dans les Paramètres pour voir les photos.',
|
||
'memories.saveError': 'Impossible d\'enregistrer les paramètres de {provider_name}',
|
||
'memories.saveRouteNotConfigured': "La route de sauvegarde n'est pas configurée pour ce fournisseur",
|
||
'memories.testRouteNotConfigured': "La route de test n'est pas configurée pour ce fournisseur",
|
||
'memories.fillRequiredFields': 'Veuillez remplir tous les champs obligatoires',
|
||
'memories.oldest': 'Plus anciennes',
|
||
'memories.newest': 'Plus récentes',
|
||
'memories.allLocations': 'Tous les lieux',
|
||
'memories.addPhotos': 'Ajouter des photos',
|
||
'memories.linkAlbum': 'Lier un album',
|
||
'memories.selectAlbum': 'Choisir un album Immich',
|
||
'memories.selectAlbumMultiple': 'Sélectionner un album',
|
||
'memories.noAlbums': 'Aucun album trouvé',
|
||
'memories.syncAlbum': 'Synchroniser',
|
||
'memories.unlinkAlbum': 'Délier',
|
||
'memories.photos': 'photos',
|
||
'memories.selectPhotos': 'Sélectionner des photos depuis Immich',
|
||
'memories.selectPhotosMultiple': 'Sélectionner des photos',
|
||
'memories.selectHint': 'Appuyez sur les photos pour les sélectionner.',
|
||
'memories.selected': 'sélectionné(s)',
|
||
'memories.addSelected': 'Ajouter {count} photos',
|
||
'memories.alreadyAdded': 'Ajouté',
|
||
'memories.private': 'Privé',
|
||
'memories.stopSharing': 'Arrêter le partage',
|
||
'memories.tripDates': 'Dates du voyage',
|
||
'memories.allPhotos': 'Toutes les photos',
|
||
'memories.confirmShareTitle': 'Partager avec les membres du voyage ?',
|
||
'memories.confirmShareHint': '{count} photos seront visibles par tous les membres de ce voyage. Vous pourrez rendre des photos individuelles privées plus tard.',
|
||
'memories.confirmShareButton': 'Partager les photos',
|
||
|
||
// Collab Addon
|
||
'collab.tabs.chat': 'Discussion',
|
||
'collab.tabs.notes': 'Notes',
|
||
'collab.tabs.polls': 'Sondages',
|
||
'collab.whatsNext.title': 'À venir',
|
||
'collab.whatsNext.today': 'Aujourd\'hui',
|
||
'collab.whatsNext.tomorrow': 'Demain',
|
||
'collab.whatsNext.empty': 'Aucune activité à venir',
|
||
'collab.whatsNext.until': 'à',
|
||
'collab.whatsNext.emptyHint': 'Les activités avec des horaires apparaîtront ici',
|
||
'collab.chat.send': 'Envoyer',
|
||
'collab.chat.placeholder': 'Écrire un message…',
|
||
'collab.chat.empty': 'Commencez la conversation',
|
||
'collab.chat.emptyHint': 'Les messages sont partagés avec tous les membres du voyage',
|
||
'collab.chat.emptyDesc': 'Partagez des idées, des plans et des mises à jour avec votre groupe de voyage',
|
||
'collab.chat.today': 'Aujourd\'hui',
|
||
'collab.chat.yesterday': 'Hier',
|
||
'collab.chat.deletedMessage': 'a supprimé un message',
|
||
'collab.chat.reply': 'Répondre',
|
||
'collab.chat.loadMore': 'Charger les messages précédents',
|
||
'collab.chat.justNow': 'à l\'instant',
|
||
'collab.chat.minutesAgo': 'il y a {n} min',
|
||
'collab.chat.hoursAgo': 'il y a {n} h',
|
||
'collab.notes.title': 'Notes',
|
||
'collab.notes.new': 'Nouvelle note',
|
||
'collab.notes.empty': 'Aucune note',
|
||
'collab.notes.emptyHint': 'Commencez à capturer vos idées et plans',
|
||
'collab.notes.all': 'Toutes',
|
||
'collab.notes.titlePlaceholder': 'Titre de la note',
|
||
'collab.notes.contentPlaceholder': 'Écrivez quelque chose…',
|
||
'collab.notes.categoryPlaceholder': 'Catégorie',
|
||
'collab.notes.newCategory': 'Nouvelle catégorie…',
|
||
'collab.notes.category': 'Catégorie',
|
||
'collab.notes.noCategory': 'Sans catégorie',
|
||
'collab.notes.color': 'Couleur',
|
||
'collab.notes.save': 'Enregistrer',
|
||
'collab.notes.cancel': 'Annuler',
|
||
'collab.notes.edit': 'Modifier',
|
||
'collab.notes.delete': 'Supprimer',
|
||
'collab.notes.pin': 'Épingler',
|
||
'collab.notes.unpin': 'Désépingler',
|
||
'collab.notes.daysAgo': 'il y a {n} j',
|
||
'collab.notes.categorySettings': 'Gérer les catégories',
|
||
'collab.notes.create': 'Créer',
|
||
'collab.notes.website': 'Site web',
|
||
'collab.notes.websitePlaceholder': 'https://…',
|
||
'collab.notes.attachFiles': 'Joindre des fichiers',
|
||
'collab.notes.noCategoriesYet': 'Aucune catégorie',
|
||
'collab.notes.emptyDesc': 'Créez une note pour commencer',
|
||
'collab.polls.title': 'Sondages',
|
||
'collab.polls.new': 'Nouveau sondage',
|
||
'collab.polls.empty': 'Aucun sondage',
|
||
'collab.polls.emptyHint': 'Posez des questions au groupe et votez ensemble',
|
||
'collab.polls.question': 'Question',
|
||
'collab.polls.questionPlaceholder': 'Que devrait-on faire ?',
|
||
'collab.polls.addOption': '+ Ajouter une option',
|
||
'collab.polls.optionPlaceholder': 'Option {n}',
|
||
'collab.polls.create': 'Créer le sondage',
|
||
'collab.polls.close': 'Fermer',
|
||
'collab.polls.closed': 'Fermé',
|
||
'collab.polls.votes': '{n} votes',
|
||
'collab.polls.vote': '{n} vote',
|
||
'collab.polls.multipleChoice': 'Choix multiples',
|
||
'collab.polls.multiChoice': 'Choix multiples',
|
||
'collab.polls.deadline': 'Date limite',
|
||
'collab.polls.option': 'Option',
|
||
'collab.polls.options': 'Options',
|
||
'collab.polls.delete': 'Supprimer',
|
||
'collab.polls.closedSection': 'Fermés',
|
||
|
||
// Permissions
|
||
'admin.tabs.permissions': 'Permissions',
|
||
'perm.title': 'Paramètres des permissions',
|
||
'perm.subtitle': 'Contrôlez qui peut effectuer des actions dans l\'application',
|
||
'perm.saved': 'Paramètres des permissions enregistrés',
|
||
'perm.resetDefaults': 'Réinitialiser par défaut',
|
||
'perm.customized': 'personnalisé',
|
||
'perm.level.admin': 'Administrateur uniquement',
|
||
'perm.level.tripOwner': 'Propriétaire du voyage',
|
||
'perm.level.tripMember': 'Membres du voyage',
|
||
'perm.level.everybody': 'Tout le monde',
|
||
'perm.cat.trip': 'Gestion des voyages',
|
||
'perm.cat.members': 'Gestion des membres',
|
||
'perm.cat.files': 'Fichiers',
|
||
'perm.cat.content': 'Contenu et planning',
|
||
'perm.cat.extras': 'Budget, bagages et collaboration',
|
||
'perm.action.trip_create': 'Créer des voyages',
|
||
'perm.action.trip_edit': 'Modifier les détails du voyage',
|
||
'perm.action.trip_delete': 'Supprimer des voyages',
|
||
'perm.action.trip_archive': 'Archiver / désarchiver des voyages',
|
||
'perm.action.trip_cover_upload': 'Télécharger l\'image de couverture',
|
||
'perm.action.member_manage': 'Ajouter / supprimer des membres',
|
||
'perm.action.file_upload': 'Télécharger des fichiers',
|
||
'perm.action.file_edit': 'Modifier les métadonnées des fichiers',
|
||
'perm.action.file_delete': 'Supprimer des fichiers',
|
||
'perm.action.place_edit': 'Ajouter / modifier / supprimer des lieux',
|
||
'perm.action.day_edit': 'Modifier les jours, notes et affectations',
|
||
'perm.action.reservation_edit': 'Gérer les réservations',
|
||
'perm.action.budget_edit': 'Gérer le budget',
|
||
'perm.action.packing_edit': 'Gérer les listes de bagages',
|
||
'perm.action.collab_edit': 'Collaboration (notes, sondages, chat)',
|
||
'perm.action.share_manage': 'Gérer les liens de partage',
|
||
'perm.actionHint.trip_create': 'Qui peut créer de nouveaux voyages',
|
||
'perm.actionHint.trip_edit': 'Qui peut modifier le nom, les dates, la description et la devise du voyage',
|
||
'perm.actionHint.trip_delete': 'Qui peut supprimer définitivement un voyage',
|
||
'perm.actionHint.trip_archive': 'Qui peut archiver ou désarchiver un voyage',
|
||
'perm.actionHint.trip_cover_upload': 'Qui peut télécharger ou modifier l\'image de couverture',
|
||
'perm.actionHint.member_manage': 'Qui peut inviter ou supprimer des membres du voyage',
|
||
'perm.actionHint.file_upload': 'Qui peut télécharger des fichiers vers un voyage',
|
||
'perm.actionHint.file_edit': 'Qui peut modifier les descriptions et liens des fichiers',
|
||
'perm.actionHint.file_delete': 'Qui peut déplacer des fichiers vers la corbeille ou les supprimer définitivement',
|
||
'perm.actionHint.place_edit': 'Qui peut ajouter, modifier ou supprimer des lieux',
|
||
'perm.actionHint.day_edit': 'Qui peut modifier les jours, notes de jours et affectations de lieux',
|
||
'perm.actionHint.reservation_edit': 'Qui peut créer, modifier ou supprimer des réservations',
|
||
'perm.actionHint.budget_edit': 'Qui peut créer, modifier ou supprimer des éléments de budget',
|
||
'perm.actionHint.packing_edit': 'Qui peut gérer les articles de bagages et les sacs',
|
||
'perm.actionHint.collab_edit': 'Qui peut créer des notes, des sondages et envoyer des messages',
|
||
'perm.actionHint.share_manage': 'Qui peut créer ou supprimer des liens de partage publics',
|
||
// Undo
|
||
'undo.button': 'Annuler',
|
||
'undo.tooltip': 'Annuler : {action}',
|
||
'undo.assignPlace': 'Lieu ajouté au jour',
|
||
'undo.removeAssignment': 'Lieu retiré du jour',
|
||
'undo.reorder': 'Lieux réorganisés',
|
||
'undo.optimize': 'Itinéraire optimisé',
|
||
'undo.deletePlace': 'Lieu supprimé',
|
||
'undo.deletePlaces': 'Lieux supprimés',
|
||
'undo.moveDay': 'Lieu déplacé vers un autre jour',
|
||
'undo.lock': 'Verrouillage du lieu modifié',
|
||
'undo.importGpx': 'Import GPX',
|
||
'undo.importKeyholeMarkup': 'Import KMZ/KML',
|
||
'undo.importGoogleList': 'Import Google Maps',
|
||
'undo.importNaverList': 'Import Naver Maps',
|
||
|
||
// Notifications
|
||
'notifications.title': 'Notifications',
|
||
'notifications.markAllRead': 'Tout marquer comme lu',
|
||
'notifications.deleteAll': 'Tout supprimer',
|
||
'notifications.showAll': 'Voir toutes les notifications',
|
||
'notifications.empty': 'Aucune notification',
|
||
'notifications.emptyDescription': 'Vous êtes à jour !',
|
||
'notifications.all': 'Toutes',
|
||
'notifications.unreadOnly': 'Non lues',
|
||
'notifications.markRead': 'Marquer comme lu',
|
||
'notifications.markUnread': 'Marquer comme non lu',
|
||
'notifications.delete': 'Supprimer',
|
||
'notifications.system': 'Système',
|
||
'notifications.synologySessionCleared.title': 'Synology Photos déconnecté',
|
||
'notifications.synologySessionCleared.text': 'Votre serveur ou compte a changé — allez dans Paramètres pour tester à nouveau votre connexion.',
|
||
'memories.error.loadAlbums': 'Impossible de charger les albums',
|
||
'memories.error.linkAlbum': 'Impossible de lier l\'album',
|
||
'memories.error.unlinkAlbum': 'Impossible de dissocier l\'album',
|
||
'memories.error.syncAlbum': 'Impossible de synchroniser l\'album',
|
||
'memories.error.loadPhotos': 'Impossible de charger les photos',
|
||
'memories.error.addPhotos': 'Impossible d\'ajouter les photos',
|
||
'memories.error.removePhoto': 'Impossible de supprimer la photo',
|
||
'memories.error.toggleSharing': 'Impossible de mettre à jour le partage',
|
||
'undo.addPlace': 'Lieu ajouté',
|
||
'undo.done': 'Annulé : {action}',
|
||
'notifications.test.title': 'Notification test de {actor}',
|
||
'notifications.test.text': 'Ceci est une simple notification de test.',
|
||
'notifications.test.booleanTitle': '{actor} demande votre approbation',
|
||
'notifications.test.booleanText': 'Notification de test booléenne.',
|
||
'notifications.test.accept': 'Approuver',
|
||
'notifications.test.decline': 'Refuser',
|
||
'notifications.test.navigateTitle': 'Allez voir quelque chose',
|
||
'notifications.test.navigateText': 'Notification de test de navigation.',
|
||
'notifications.test.goThere': 'Y aller',
|
||
'notifications.test.adminTitle': 'Diffusion admin',
|
||
'notifications.test.adminText': '{actor} a envoyé une notification de test à tous les admins.',
|
||
'notifications.test.tripTitle': '{actor} a publié dans votre voyage',
|
||
'notifications.test.tripText': 'Notification de test pour le voyage "{trip}".',
|
||
|
||
// Todo
|
||
'todo.subtab.packing': 'Liste de bagages',
|
||
'todo.subtab.todo': 'À faire',
|
||
'todo.completed': 'terminé(s)',
|
||
'todo.filter.all': 'Tout',
|
||
'todo.filter.open': 'En cours',
|
||
'todo.filter.done': 'Terminé',
|
||
'todo.uncategorized': 'Sans catégorie',
|
||
'todo.namePlaceholder': 'Nom de la tâche',
|
||
'todo.descriptionPlaceholder': 'Description (facultative)',
|
||
'todo.unassigned': 'Non assigné',
|
||
'todo.noCategory': 'Aucune catégorie',
|
||
'todo.hasDescription': 'Avec description',
|
||
'todo.addItem': 'Nouvelle tâche',
|
||
'todo.sidebar.sortBy': 'Trier par',
|
||
'todo.priority': 'Priorité',
|
||
'todo.newCategoryLabel': 'nouvelle',
|
||
'budget.categoriesLabel': 'catégories',
|
||
'todo.newCategory': 'Nom de la catégorie',
|
||
'todo.addCategory': 'Ajouter une catégorie',
|
||
'todo.newItem': 'Nouvelle tâche',
|
||
'todo.empty': 'Aucune tâche pour l\'instant. Ajoutez une tâche pour commencer !',
|
||
'todo.filter.my': 'Mes tâches',
|
||
'todo.filter.overdue': 'En retard',
|
||
'todo.sidebar.tasks': 'Tâches',
|
||
'todo.sidebar.categories': 'Catégories',
|
||
'todo.detail.title': 'Tâche',
|
||
'todo.detail.description': 'Description',
|
||
'todo.detail.category': 'Catégorie',
|
||
'todo.detail.dueDate': 'Date d\'échéance',
|
||
'todo.detail.assignedTo': 'Assigné à',
|
||
'todo.detail.delete': 'Supprimer',
|
||
'todo.detail.save': 'Enregistrer les modifications',
|
||
'todo.detail.create': 'Créer la tâche',
|
||
'todo.detail.priority': 'Priorité',
|
||
'todo.detail.noPriority': 'Aucune',
|
||
'todo.sortByPrio': 'Priorité',
|
||
|
||
// Notification system (added from feat/notification-system)
|
||
'settings.notifyVersionAvailable': 'Nouvelle version disponible',
|
||
'settings.notificationPreferences.noChannels': 'Aucun canal de notification n\'est configuré. Demandez à un administrateur de configurer les notifications par e-mail ou webhook.',
|
||
'settings.webhookUrl.label': 'URL du webhook',
|
||
'settings.webhookUrl.placeholder': 'https://discord.com/api/webhooks/...',
|
||
'settings.webhookUrl.hint': 'Entrez votre URL de webhook Discord, Slack ou personnalisée pour recevoir des notifications.',
|
||
'settings.webhookUrl.saved': 'URL du webhook enregistrée',
|
||
'settings.webhookUrl.test': 'Tester',
|
||
'settings.webhookUrl.testSuccess': 'Webhook de test envoyé avec succès',
|
||
'settings.webhookUrl.testFailed': 'Échec du webhook de test',
|
||
'settings.ntfyUrl.topicLabel': 'Sujet Ntfy',
|
||
'settings.ntfyUrl.topicPlaceholder': 'my-trek-alerts',
|
||
'settings.ntfyUrl.serverLabel': "URL du serveur Ntfy (optionnel)",
|
||
'settings.ntfyUrl.serverPlaceholder': 'https://ntfy.sh',
|
||
'settings.ntfyUrl.hint': "Entrez votre sujet Ntfy pour recevoir des notifications push. Laissez le serveur vide pour utiliser la valeur par défaut configurée par votre administrateur.",
|
||
'settings.ntfyUrl.tokenLabel': "Jeton d'accès (optionnel)",
|
||
'settings.ntfyUrl.tokenHint': 'Requis pour les sujets protégés par mot de passe.',
|
||
'settings.ntfyUrl.saved': 'Paramètres Ntfy enregistrés',
|
||
'settings.ntfyUrl.test': 'Tester',
|
||
'settings.ntfyUrl.testSuccess': 'Notification de test Ntfy envoyée avec succès',
|
||
'settings.ntfyUrl.testFailed': 'Échec de la notification de test Ntfy',
|
||
'settings.ntfyUrl.tokenCleared': "Jeton d'accès effacé",
|
||
'settings.notificationPreferences.inapp': 'In-App',
|
||
'settings.notificationPreferences.webhook': 'Webhook',
|
||
'settings.notificationPreferences.email': 'Email',
|
||
'settings.notificationPreferences.ntfy': 'Ntfy',
|
||
'admin.notifications.emailPanel.title': 'Email (SMTP)',
|
||
'admin.notifications.webhookPanel.title': 'Webhook',
|
||
'admin.notifications.inappPanel.title': 'In-App',
|
||
'admin.notifications.inappPanel.hint': 'Les notifications in-app sont toujours actives et ne peuvent pas être désactivées globalement.',
|
||
'admin.notifications.adminWebhookPanel.title': 'Webhook admin',
|
||
'admin.notifications.adminWebhookPanel.hint': 'Ce webhook est utilisé exclusivement pour les notifications admin (ex. alertes de version). Il est séparé des webhooks utilisateur et s\'active automatiquement si une URL est configurée.',
|
||
'admin.notifications.adminWebhookPanel.saved': 'URL du webhook admin enregistrée',
|
||
'admin.notifications.adminWebhookPanel.testSuccess': 'Webhook de test envoyé avec succès',
|
||
'admin.notifications.adminWebhookPanel.testFailed': 'Échec du webhook de test',
|
||
'admin.notifications.adminWebhookPanel.alwaysOnHint': 'Le webhook admin s\'active automatiquement si une URL est configurée',
|
||
'admin.notifications.ntfy': 'Ntfy',
|
||
'admin.ntfy.hint': 'Permet aux utilisateurs de configurer leurs propres sujets ntfy pour les notifications push. Définissez le serveur par défaut ci-dessous pour pré-remplir les paramètres utilisateur.',
|
||
'admin.notifications.testNtfy': 'Envoyer un Ntfy de test',
|
||
'admin.notifications.testNtfySuccess': 'Ntfy de test envoyé avec succès',
|
||
'admin.notifications.testNtfyFailed': 'Échec de l\'envoi du Ntfy de test',
|
||
'admin.notifications.adminNtfyPanel.title': 'Ntfy admin',
|
||
'admin.notifications.adminNtfyPanel.hint': 'Ce sujet Ntfy est utilisé exclusivement pour les notifications admin (ex. alertes de version). Il est séparé des sujets par utilisateur et s\'active toujours lorsqu\'il est configuré.',
|
||
'admin.notifications.adminNtfyPanel.serverLabel': 'URL du serveur Ntfy',
|
||
'admin.notifications.adminNtfyPanel.serverHint': 'Utilisé également comme serveur par défaut pour les notifications ntfy des utilisateurs. Laisser vide pour utiliser ntfy.sh. Les utilisateurs peuvent le modifier dans leurs propres paramètres.',
|
||
'admin.notifications.adminNtfyPanel.serverPlaceholder': 'https://ntfy.sh',
|
||
'admin.notifications.adminNtfyPanel.topicLabel': 'Sujet admin',
|
||
'admin.notifications.adminNtfyPanel.topicPlaceholder': 'trek-admin-alerts',
|
||
'admin.notifications.adminNtfyPanel.tokenLabel': "Jeton d'accès (optionnel)",
|
||
'admin.notifications.adminNtfyPanel.tokenCleared': "Jeton d'accès admin effacé",
|
||
'admin.notifications.adminNtfyPanel.saved': 'Paramètres Ntfy admin enregistrés',
|
||
'admin.notifications.adminNtfyPanel.test': 'Envoyer un Ntfy de test',
|
||
'admin.notifications.adminNtfyPanel.testSuccess': 'Ntfy de test envoyé avec succès',
|
||
'admin.notifications.adminNtfyPanel.testFailed': 'Échec de l\'envoi du Ntfy de test',
|
||
'admin.notifications.adminNtfyPanel.alwaysOnHint': 'Le Ntfy admin s\'active toujours lorsqu\'un sujet est configuré',
|
||
'admin.notifications.adminNotificationsHint': 'Configurez quels canaux envoient les notifications admin (ex. alertes de version). Le webhook s\'active automatiquement si une URL webhook admin est définie.',
|
||
'admin.notifications.tripReminders.title': 'Rappels de voyage',
|
||
'admin.notifications.tripReminders.hint': 'Envoie une notification de rappel avant le début d\'un voyage (nécessite des jours de rappel définis sur le voyage).',
|
||
'admin.notifications.tripReminders.enabled': 'Rappels de voyage activés',
|
||
'admin.notifications.tripReminders.disabled': 'Rappels de voyage désactivés',
|
||
'admin.tabs.notifications': 'Notifications',
|
||
'notifications.versionAvailable.title': 'Mise à jour disponible',
|
||
'notifications.versionAvailable.text': 'TREK {version} est maintenant disponible.',
|
||
'notifications.versionAvailable.button': 'Voir les détails',
|
||
'notif.test.title': '[Test] Notification',
|
||
'notif.test.simple.text': 'Ceci est une simple notification de test.',
|
||
'notif.test.boolean.text': 'Acceptez-vous cette notification de test ?',
|
||
'notif.test.navigate.text': 'Cliquez ci-dessous pour accéder au tableau de bord.',
|
||
|
||
// Notifications
|
||
'notif.trip_invite.title': 'Invitation au voyage',
|
||
'notif.trip_invite.text': '{actor} vous a invité à {trip}',
|
||
'notif.booking_change.title': 'Réservation mise à jour',
|
||
'notif.booking_change.text': '{actor} a mis à jour une réservation dans {trip}',
|
||
'notif.trip_reminder.title': 'Rappel de voyage',
|
||
'notif.trip_reminder.text': 'Votre voyage {trip} approche !',
|
||
'notif.vacay_invite.title': 'Invitation Vacay Fusion',
|
||
'notif.vacay_invite.text': '{actor} vous invite à fusionner les plans de vacances',
|
||
'notif.photos_shared.title': 'Photos partagées',
|
||
'notif.photos_shared.text': '{actor} a partagé {count} photo(s) dans {trip}',
|
||
'notif.collab_message.title': 'Nouveau message',
|
||
'notif.collab_message.text': '{actor} a envoyé un message dans {trip}',
|
||
'notif.packing_tagged.title': 'Affectation bagages',
|
||
'notif.packing_tagged.text': '{actor} vous a assigné à {category} dans {trip}',
|
||
'notif.version_available.title': 'Nouvelle version disponible',
|
||
'notif.version_available.text': 'TREK {version} est maintenant disponible',
|
||
'notif.action.view_trip': 'Voir le voyage',
|
||
'notif.action.view_collab': 'Voir les messages',
|
||
'notif.action.view_packing': 'Voir les bagages',
|
||
'notif.action.view_photos': 'Voir les photos',
|
||
'notif.action.view_vacay': 'Voir Vacay',
|
||
'notif.action.view_admin': 'Aller à l\'admin',
|
||
'notif.action.view': 'Voir',
|
||
'notif.action.accept': 'Accepter',
|
||
'notif.action.decline': 'Refuser',
|
||
'notif.generic.title': 'Notification',
|
||
'notif.generic.text': 'Vous avez une nouvelle notification',
|
||
'notif.dev.unknown_event.title': '[DEV] Événement inconnu',
|
||
'notif.dev.unknown_event.text': 'Le type d\'événement "{event}" n\'est pas enregistré dans EVENT_NOTIFICATION_CONFIG',
|
||
|
||
// Journey, Dashboard, Nav, DayPlan
|
||
'common.justNow': 'à l\'instant',
|
||
'common.hoursAgo': 'il y a {count}h',
|
||
'common.daysAgo': 'il y a {count}j',
|
||
'journey.search.placeholder': 'Rechercher des journaux…',
|
||
'journey.search.noResults': 'Aucun journal ne correspond à « {query} »',
|
||
'journey.title': 'Journal de voyage',
|
||
'journey.subtitle': 'Suivez vos voyages en temps réel',
|
||
'journey.new': 'Nouveau journal',
|
||
'journey.create': 'Créer',
|
||
'journey.titlePlaceholder': 'Où allez-vous ?',
|
||
'journey.empty': 'Aucun journal pour le moment',
|
||
'journey.emptyHint': 'Commencez à documenter votre prochain voyage',
|
||
'journey.deleted': 'Journal supprimé',
|
||
'journey.createError': 'Impossible de créer le journal',
|
||
'journey.deleteError': 'Impossible de supprimer le journal',
|
||
'journey.deleteConfirmTitle': 'Supprimer',
|
||
'journey.deleteConfirmMessage': 'Supprimer « {title} » ? Cette action est irréversible.',
|
||
'journey.deleteConfirmGeneric': 'Êtes-vous sûr de vouloir supprimer ceci ?',
|
||
'journey.notFound': 'Journal introuvable',
|
||
'journey.photos': 'Photos',
|
||
'journey.timelineEmpty': 'Aucune étape pour le moment',
|
||
'journey.timelineEmptyHint': 'Ajoutez un check-in ou écrivez une entrée de journal pour commencer',
|
||
'journey.status.draft': 'Brouillon',
|
||
'journey.status.active': 'Actif',
|
||
'journey.status.completed': 'Terminé',
|
||
'journey.status.upcoming': 'À venir',
|
||
'journey.status.archived': 'Archivé',
|
||
'journey.checkin.add': 'Check-in',
|
||
'journey.checkin.namePlaceholder': 'Nom du lieu',
|
||
'journey.checkin.notesPlaceholder': 'Notes (facultatif)',
|
||
'journey.checkin.save': 'Enregistrer',
|
||
'journey.checkin.error': 'Impossible d\'enregistrer le check-in',
|
||
'journey.entry.add': 'Journal',
|
||
'journey.entry.edit': 'Modifier l\'entrée',
|
||
'journey.entry.titlePlaceholder': 'Titre (facultatif)',
|
||
'journey.entry.bodyPlaceholder': 'Que s\'est-il passé aujourd\'hui ?',
|
||
'journey.entry.save': 'Enregistrer',
|
||
'journey.entry.error': 'Impossible d\'enregistrer l\'entrée',
|
||
'journey.photo.add': 'Photo',
|
||
'journey.photo.uploadError': 'Échec du téléversement',
|
||
'journey.share.share': 'Partager',
|
||
'journey.share.public': 'Public',
|
||
'journey.share.linkCopied': 'Lien public copié',
|
||
'journey.share.disabled': 'Partage public désactivé',
|
||
'journey.editor.titlePlaceholder': 'Donnez un nom à ce moment...',
|
||
'journey.editor.bodyPlaceholder': 'Racontez l\'histoire de cette journée...',
|
||
'journey.editor.placePlaceholder': 'Lieu (facultatif)',
|
||
'journey.editor.tagsPlaceholder': 'Tags : pépite cachée, meilleur repas, à revisiter...',
|
||
'journey.visibility.private': 'Privé',
|
||
'journey.visibility.shared': 'Partagé',
|
||
'journey.visibility.public': 'Public',
|
||
'journey.emptyState.title': 'Votre histoire commence ici',
|
||
'journey.emptyState.subtitle': 'Faites un check-in ou écrivez votre première entrée de journal',
|
||
'journey.frontpage.subtitle': 'Transformez vos voyages en histoires inoubliables',
|
||
'journey.frontpage.createJourney': 'Créer un journal',
|
||
'journey.frontpage.activeJourney': 'Journal actif',
|
||
'journey.frontpage.allJourneys': 'Tous les journaux',
|
||
'journey.frontpage.journeys': 'journaux',
|
||
'journey.frontpage.createNew': 'Créer un nouveau journal',
|
||
'journey.frontpage.createNewSub': 'Choisissez des voyages, écrivez des récits, partagez vos aventures',
|
||
'journey.frontpage.live': 'En direct',
|
||
'journey.frontpage.synced': 'Synchronisé',
|
||
'journey.frontpage.continueWriting': 'Continuer à écrire',
|
||
'journey.frontpage.updated': 'Mis à jour {time}',
|
||
'journey.frontpage.suggestionLabel': 'Voyage terminé récemment',
|
||
'journey.frontpage.suggestionText': 'Transformez <strong>{title}</strong> en journal de voyage',
|
||
'journey.frontpage.dismiss': 'Ignorer',
|
||
'journey.frontpage.journeyName': 'Nom du journal',
|
||
'journey.frontpage.namePlaceholder': 'ex. Asie du Sud-Est 2026',
|
||
'journey.frontpage.selectTrips': 'Sélectionner des voyages',
|
||
'journey.frontpage.tripsSelected': 'voyages sélectionnés',
|
||
'journey.frontpage.trips': 'voyages',
|
||
'journey.frontpage.placesImported': 'lieux seront importés',
|
||
'journey.frontpage.places': 'lieux',
|
||
'journey.detail.backToJourney': 'Retour au journal',
|
||
'journey.detail.syncedWithTrips': 'Synchronisé avec les voyages',
|
||
'journey.detail.addEntry': 'Ajouter une entrée',
|
||
'journey.detail.newEntry': 'Nouvelle entrée',
|
||
'journey.detail.editEntry': 'Modifier l\'entrée',
|
||
'journey.detail.noEntries': 'Aucune entrée pour le moment',
|
||
'journey.detail.noEntriesHint': 'Ajoutez un voyage pour commencer avec des entrées préremplies',
|
||
'journey.detail.noPhotos': 'Aucune photo pour le moment',
|
||
'journey.detail.noPhotosHint': 'Téléversez des photos dans les entrées ou parcourez votre bibliothèque Immich/Synology',
|
||
'journey.detail.journeyStats': 'Statistiques du journal',
|
||
'journey.detail.syncedTrips': 'Voyages synchronisés',
|
||
'journey.detail.noTripsLinked': 'Aucun voyage lié pour le moment',
|
||
'journey.detail.contributors': 'Contributeurs',
|
||
'journey.detail.readMore': 'Lire la suite',
|
||
'journey.detail.prosCons': 'Pour et contre',
|
||
'journey.detail.photos': 'photos',
|
||
'journey.detail.day': 'Jour {number}',
|
||
'journey.detail.places': 'lieux',
|
||
'journey.stats.days': 'Jours',
|
||
'journey.stats.cities': 'Villes',
|
||
'journey.stats.entries': 'Entrées',
|
||
'journey.stats.photos': 'Photos',
|
||
'journey.stats.places': 'Lieux',
|
||
'journey.skeletons.show': 'Afficher les suggestions',
|
||
'journey.skeletons.hide': 'Masquer les suggestions',
|
||
'journey.verdict.lovedIt': 'Adoré',
|
||
'journey.verdict.couldBeBetter': 'Pourrait être mieux',
|
||
'journey.synced.places': 'lieux',
|
||
'journey.synced.synced': 'synchronisé',
|
||
'journey.editor.discardChangesConfirm': 'Vous avez des modifications non enregistrées. Les ignorer ?',
|
||
'journey.editor.uploadPhotos': 'Téléverser des photos',
|
||
'journey.editor.uploading': 'Envoi...',
|
||
'journey.editor.fromGallery': 'Depuis la galerie',
|
||
'journey.editor.allPhotosAdded': 'Toutes les photos ont déjà été ajoutées',
|
||
'journey.editor.writeStory': 'Écrivez votre histoire...',
|
||
'journey.editor.prosCons': 'Pour et contre',
|
||
'journey.editor.pros': 'Pour',
|
||
'journey.editor.cons': 'Contre',
|
||
'journey.editor.proPlaceholder': 'Quelque chose de génial...',
|
||
'journey.editor.conPlaceholder': 'Pas si génial...',
|
||
'journey.editor.addAnother': 'Ajouter un autre',
|
||
'journey.editor.date': 'Date',
|
||
'journey.editor.location': 'Lieu',
|
||
'journey.editor.searchLocation': 'Rechercher un lieu...',
|
||
'journey.editor.mood': 'Humeur',
|
||
'journey.editor.weather': 'Météo',
|
||
'journey.editor.photoFirst': '1er',
|
||
'journey.editor.makeFirst': 'Mettre en 1er',
|
||
'journey.editor.searching': 'Recherche...',
|
||
'journey.mood.amazing': 'Incroyable',
|
||
'journey.mood.good': 'Bien',
|
||
'journey.mood.neutral': 'Neutre',
|
||
'journey.mood.rough': 'Difficile',
|
||
'journey.weather.sunny': 'Ensoleillé',
|
||
'journey.weather.partly': 'Partiellement nuageux',
|
||
'journey.weather.cloudy': 'Nuageux',
|
||
'journey.weather.rainy': 'Pluvieux',
|
||
'journey.weather.stormy': 'Orageux',
|
||
'journey.weather.cold': 'Neigeux',
|
||
'journey.trips.linkTrip': 'Lier un voyage',
|
||
'journey.trips.searchTrip': 'Rechercher un voyage',
|
||
'journey.trips.searchPlaceholder': 'Nom du voyage ou destination...',
|
||
'journey.trips.noTripsAvailable': 'Aucun voyage disponible',
|
||
'journey.trips.link': 'Lier',
|
||
'journey.trips.tripLinked': 'Voyage lié',
|
||
'journey.trips.linkFailed': 'Échec de la liaison du voyage',
|
||
'journey.trips.addTrip': 'Ajouter un voyage',
|
||
'journey.trips.unlinkTrip': 'Délier le voyage',
|
||
'journey.trips.unlinkMessage': 'Délier « {title} » ? Toutes les entrées et photos synchronisées de ce voyage seront définitivement supprimées. Cette action est irréversible.',
|
||
'journey.trips.unlink': 'Délier',
|
||
'journey.trips.tripUnlinked': 'Voyage délié',
|
||
'journey.trips.unlinkFailed': 'Échec de la suppression du lien',
|
||
'journey.trips.noTripsLinkedSettings': 'Aucun voyage lié',
|
||
'journey.contributors.invite': 'Inviter un contributeur',
|
||
'journey.contributors.searchUser': 'Rechercher un utilisateur',
|
||
'journey.contributors.searchPlaceholder': 'Nom d\'utilisateur ou e-mail...',
|
||
'journey.contributors.noUsers': 'Aucun utilisateur trouvé',
|
||
'journey.contributors.role': 'Rôle',
|
||
'journey.contributors.added': 'Contributeur ajouté',
|
||
'journey.contributors.addFailed': 'Échec de l\'ajout du contributeur',
|
||
'journey.share.publicShare': 'Partage public',
|
||
'journey.share.createLink': 'Créer un lien de partage',
|
||
'journey.share.linkCreated': 'Lien de partage créé',
|
||
'journey.share.createFailed': 'Échec de la création du lien',
|
||
'journey.share.copy': 'Copier',
|
||
'journey.share.copied': 'Copié !',
|
||
'journey.share.timeline': 'Chronologie',
|
||
'journey.share.gallery': 'Galerie',
|
||
'journey.share.map': 'Carte',
|
||
'journey.share.removeLink': 'Supprimer le lien de partage',
|
||
'journey.share.linkDeleted': 'Lien de partage supprimé',
|
||
'journey.share.deleteFailed': 'Échec de la suppression',
|
||
'journey.share.updateFailed': 'Échec de la mise à jour',
|
||
|
||
// Journey — Invite
|
||
'journey.invite.role': 'Rôle',
|
||
'journey.invite.viewer': 'Lecteur',
|
||
'journey.invite.editor': 'Éditeur',
|
||
'journey.invite.invite': 'Inviter',
|
||
'journey.invite.inviting': 'Invitation...',
|
||
'journey.settings.title': 'Paramètres du journal',
|
||
'journey.settings.coverImage': 'Image de couverture',
|
||
'journey.settings.changeCover': 'Changer la couverture',
|
||
'journey.settings.addCover': 'Ajouter une image de couverture',
|
||
'journey.settings.name': 'Nom',
|
||
'journey.settings.subtitle': 'Sous-titre',
|
||
'journey.settings.subtitlePlaceholder': 'ex. Thaïlande, Vietnam et Cambodge',
|
||
'journey.settings.endJourney': 'Archiver le journal',
|
||
'journey.settings.reopenJourney': 'Restaurer le journal',
|
||
'journey.settings.archived': 'Journal archivé',
|
||
'journey.settings.reopened': 'Journal rouvert',
|
||
'journey.settings.endDescription': 'Masque l\'indicateur En direct. Vous pouvez rouvrir à tout moment.',
|
||
'journey.settings.delete': 'Supprimer',
|
||
'journey.settings.deleteJourney': 'Supprimer le journal',
|
||
'journey.settings.deleteMessage': 'Supprimer « {title} » ? Toutes les entrées et photos seront perdues.',
|
||
'journey.settings.saved': 'Paramètres enregistrés',
|
||
'journey.settings.saveFailed': 'Échec de l\'enregistrement',
|
||
'journey.settings.coverUpdated': 'Couverture mise à jour',
|
||
'journey.settings.coverFailed': 'Échec du téléversement',
|
||
'journey.settings.failedToDelete': 'Échec de la suppression',
|
||
'journey.entries.deleteTitle': "Supprimer l'entrée",
|
||
'journey.photosUploaded': '{count} photos téléversées',
|
||
'journey.photosAdded': '{count} photos ajoutées',
|
||
'journey.public.notFound': 'Introuvable',
|
||
'journey.public.notFoundMessage': 'Ce journal n\'existe pas ou le lien a expiré.',
|
||
'journey.public.readOnly': 'Lecture seule · Journal public',
|
||
'journey.public.tagline': 'Travel Resource & Exploration Kit',
|
||
'journey.public.sharedVia': 'Partagé via',
|
||
'journey.public.madeWith': 'Créé avec',
|
||
'journey.pdf.journeyBook': 'Carnet de voyage',
|
||
'journey.pdf.madeWith': 'Créé avec TREK',
|
||
'journey.pdf.day': 'Jour',
|
||
'journey.pdf.theEnd': 'Fin',
|
||
'journey.pdf.saveAsPdf': 'Enregistrer en PDF',
|
||
'journey.pdf.pages': 'pages',
|
||
'journey.picker.tripPeriod': 'Période du voyage',
|
||
'journey.picker.dateRange': 'Plage de dates',
|
||
'journey.picker.allPhotos': 'Toutes les photos',
|
||
'journey.picker.albums': 'Albums',
|
||
'journey.picker.selected': 'sélectionnés',
|
||
'journey.picker.addTo': 'Ajouter à',
|
||
'journey.picker.newGallery': 'Nouvelle galerie',
|
||
'journey.picker.selectAll': 'Tout sélectionner',
|
||
'journey.picker.deselectAll': 'Tout désélectionner',
|
||
'journey.picker.noAlbums': 'Aucun album trouvé',
|
||
'journey.picker.selectDate': 'Sélectionner une date',
|
||
'journey.picker.search': 'Rechercher',
|
||
'dashboard.greeting.morning': 'Bonjour,',
|
||
'dashboard.greeting.afternoon': 'Bon après-midi,',
|
||
'dashboard.greeting.evening': 'Bonsoir,',
|
||
'dashboard.mobile.liveNow': 'En direct',
|
||
'dashboard.mobile.tripProgress': 'Progression du voyage',
|
||
'dashboard.mobile.daysLeft': '{count} jours restants',
|
||
'dashboard.mobile.places': 'Lieux',
|
||
'dashboard.mobile.buddies': 'Compagnons',
|
||
'dashboard.mobile.newTrip': 'Nouveau voyage',
|
||
'dashboard.mobile.currency': 'Devise',
|
||
'dashboard.mobile.timezone': 'Fuseau horaire',
|
||
'dashboard.mobile.upcomingTrips': 'Voyages à venir',
|
||
'dashboard.mobile.yourTrips': 'Vos voyages',
|
||
'dashboard.mobile.trips': 'voyages',
|
||
'dashboard.mobile.starts': 'Début',
|
||
'dashboard.mobile.duration': 'Durée',
|
||
'dashboard.mobile.day': 'jour',
|
||
'dashboard.mobile.days': 'jours',
|
||
'dashboard.mobile.ongoing': 'En cours',
|
||
'dashboard.mobile.startsToday': 'Commence aujourd\'hui',
|
||
'dashboard.mobile.tomorrow': 'Demain',
|
||
'dashboard.mobile.inDays': 'Dans {count} jours',
|
||
'dashboard.mobile.inMonths': 'Dans {count} mois',
|
||
'dashboard.mobile.completed': 'Terminé',
|
||
'dashboard.mobile.currencyConverter': 'Convertisseur de devises',
|
||
'nav.profile': 'Profil',
|
||
'nav.bottomSettings': 'Paramètres',
|
||
'nav.bottomAdmin': 'Administration',
|
||
'nav.bottomLogout': 'Déconnexion',
|
||
'nav.bottomAdminBadge': 'Admin',
|
||
'dayplan.mobile.addPlace': 'Ajouter un lieu',
|
||
'dayplan.mobile.searchPlaces': 'Rechercher des lieux...',
|
||
'dayplan.mobile.allAssigned': 'Tous les lieux attribués',
|
||
'dayplan.mobile.noMatch': 'Aucun résultat',
|
||
'dayplan.mobile.createNew': 'Créer un nouveau lieu',
|
||
'admin.addons.catalog.journey.name': 'Journal de voyage',
|
||
'admin.addons.catalog.journey.description': 'Suivi de voyages et journal avec check-ins, photos et récits quotidiens',
|
||
// OAuth scope groups
|
||
'oauth.scope.group.trips': 'Voyages',
|
||
'oauth.scope.group.places': 'Lieux',
|
||
'oauth.scope.group.atlas': 'Atlas',
|
||
'oauth.scope.group.packing': 'Bagages',
|
||
'oauth.scope.group.todos': 'Tâches',
|
||
'oauth.scope.group.budget': 'Budget',
|
||
'oauth.scope.group.reservations': 'Réservations',
|
||
'oauth.scope.group.collab': 'Collaboration',
|
||
'oauth.scope.group.notifications': 'Notifications',
|
||
'oauth.scope.group.vacay': 'Congés',
|
||
'oauth.scope.group.geo': 'Géo',
|
||
'oauth.scope.group.weather': 'Météo',
|
||
|
||
// OAuth scope labels & descriptions
|
||
'oauth.scope.trips:read.label': 'Voir les voyages et itinéraires',
|
||
'oauth.scope.trips:read.description': 'Lire les voyages, jours, notes et membres',
|
||
'oauth.scope.trips:write.label': 'Modifier les voyages et itinéraires',
|
||
'oauth.scope.trips:write.description': 'Créer et mettre à jour les voyages, jours, notes et gérer les membres',
|
||
'oauth.scope.trips:delete.label': 'Supprimer des voyages',
|
||
'oauth.scope.trips:delete.description': 'Supprimer définitivement des voyages entiers — cette action est irréversible',
|
||
'oauth.scope.trips:share.label': 'Gérer les liens de partage',
|
||
'oauth.scope.trips:share.description': 'Créer, modifier et révoquer des liens de partage publics',
|
||
'oauth.scope.places:read.label': 'Voir les lieux et données cartographiques',
|
||
'oauth.scope.places:read.description': 'Lire les lieux, affectations de jours, étiquettes et catégories',
|
||
'oauth.scope.places:write.label': 'Gérer les lieux',
|
||
'oauth.scope.places:write.description': 'Créer, modifier et supprimer des lieux, affectations et étiquettes',
|
||
'oauth.scope.atlas:read.label': 'Voir l\'Atlas',
|
||
'oauth.scope.atlas:read.description': 'Lire les pays visités, régions et liste de souhaits',
|
||
'oauth.scope.atlas:write.label': 'Gérer l\'Atlas',
|
||
'oauth.scope.atlas:write.description': 'Marquer des pays et régions visités, gérer la liste de souhaits',
|
||
'oauth.scope.packing:read.label': 'Voir les listes de bagages',
|
||
'oauth.scope.packing:read.description': 'Lire les articles, sacs et assignations de catégories',
|
||
'oauth.scope.packing:write.label': 'Gérer les listes de bagages',
|
||
'oauth.scope.packing:write.description': 'Ajouter, modifier, supprimer, cocher et réordonner les articles et sacs',
|
||
'oauth.scope.todos:read.label': 'Voir les listes de tâches',
|
||
'oauth.scope.todos:read.description': 'Lire les tâches et assignations de catégories',
|
||
'oauth.scope.todos:write.label': 'Gérer les listes de tâches',
|
||
'oauth.scope.todos:write.description': 'Créer, modifier, cocher, supprimer et réordonner les tâches',
|
||
'oauth.scope.budget:read.label': 'Voir le budget',
|
||
'oauth.scope.budget:read.description': 'Lire les dépenses et la répartition du budget',
|
||
'oauth.scope.budget:write.label': 'Gérer le budget',
|
||
'oauth.scope.budget:write.description': 'Créer, modifier et supprimer des dépenses',
|
||
'oauth.scope.reservations:read.label': 'Voir les réservations',
|
||
'oauth.scope.reservations:read.description': 'Lire les réservations et détails d\'hébergement',
|
||
'oauth.scope.reservations:write.label': 'Gérer les réservations',
|
||
'oauth.scope.reservations:write.description': 'Créer, modifier, supprimer et réordonner les réservations',
|
||
'oauth.scope.collab:read.label': 'Voir la collaboration',
|
||
'oauth.scope.collab:read.description': 'Lire les notes, sondages et messages collaboratifs',
|
||
'oauth.scope.collab:write.label': 'Gérer la collaboration',
|
||
'oauth.scope.collab:write.description': 'Créer, modifier et supprimer des notes, sondages et messages',
|
||
'oauth.scope.notifications:read.label': 'Voir les notifications',
|
||
'oauth.scope.notifications:read.description': 'Lire les notifications et le nombre de non-lus',
|
||
'oauth.scope.notifications:write.label': 'Gérer les notifications',
|
||
'oauth.scope.notifications:write.description': 'Marquer les notifications comme lues et y répondre',
|
||
'oauth.scope.vacay:read.label': 'Voir les plans de congés',
|
||
'oauth.scope.vacay:read.description': 'Lire les données, entrées et statistiques de congés',
|
||
'oauth.scope.vacay:write.label': 'Gérer les plans de congés',
|
||
'oauth.scope.vacay:write.description': 'Créer et gérer les entrées de congés, jours fériés et plans d\'équipe',
|
||
'oauth.scope.geo:read.label': 'Cartes et géocodage',
|
||
'oauth.scope.geo:read.description': 'Chercher des lieux, résoudre des URL cartographiques et géocoder des coordonnées',
|
||
'oauth.scope.weather:read.label': 'Prévisions météo',
|
||
'oauth.scope.weather:read.description': 'Obtenir les prévisions météo pour les lieux et dates de voyage',
|
||
|
||
// System notices
|
||
'system_notice.welcome_v1.title': 'Bienvenue sur TREK',
|
||
'system_notice.welcome_v1.body': 'Votre planificateur de voyage tout-en-un. Créez des itinéraires, partagez vos voyages et restez organisé — en ligne ou hors ligne.',
|
||
'system_notice.welcome_v1.cta_label': 'Planifier un voyage',
|
||
'system_notice.welcome_v1.hero_alt': 'Destination de voyage pittoresque avec l\'interface TREK',
|
||
'system_notice.welcome_v1.highlight_plan': 'Itinéraires jour par jour',
|
||
'system_notice.welcome_v1.highlight_share': 'Collaborez avec vos partenaires',
|
||
'system_notice.welcome_v1.highlight_offline': 'Fonctionne hors ligne sur mobile',
|
||
'system_notice.dev_test_modal.title': '[Dev] Test notice',
|
||
'system_notice.dev_test_modal.body': 'This is a dev-only test notice.',
|
||
'system_notice.pager.prev': 'Avis précédent',
|
||
'system_notice.pager.next': 'Avis suivant',
|
||
'system_notice.pager.counter': '{current} / {total}',
|
||
'system_notice.pager.goto': "Aller à l'avis {n}",
|
||
'system_notice.pager.position': 'Avis {current} sur {total}',
|
||
// System notices — 3.0.0 upgrade
|
||
'system_notice.v3_photos.title': 'Les photos ont bougé dans 3.0',
|
||
'system_notice.v3_photos.body': "**Photos** dans le planificateur ont été supprimées. Tes photos sont en sécurité — TREK n'a jamais modifié ta bibliothèque Immich ou Synology.\n\nLes photos vivent désormais dans l'addon **Journey**. Journey est optionnel — s'il n'est pas encore disponible, demande à ton admin de l'activer dans Admin → Modules.",
|
||
'system_notice.v3_journey.title': 'Découvrez Journey — journal de voyage',
|
||
'system_notice.v3_journey.body': 'Documente tes voyages sous forme de récits enrichis avec chronologies, galeries photos et cartes interactives.',
|
||
'system_notice.v3_journey.cta_label': 'Ouvrir Journey',
|
||
'system_notice.v3_journey.highlight_timeline': 'Chronologie et galerie par jour',
|
||
'system_notice.v3_journey.highlight_photos': 'Import depuis Immich ou Synology',
|
||
'system_notice.v3_journey.highlight_share': 'Partage public — sans connexion requise',
|
||
'system_notice.v3_journey.highlight_export': 'Export en livre photo PDF',
|
||
'system_notice.v3_features.title': 'Plus de nouveautés en 3.0',
|
||
'system_notice.v3_features.body': 'Quelques autres choses à savoir sur cette version.',
|
||
'system_notice.v3_features.highlight_dashboard': 'Tableau de bord repensé mobile-first',
|
||
'system_notice.v3_features.highlight_offline': 'Mode hors ligne complet en PWA',
|
||
'system_notice.v3_features.highlight_search': 'Autocomplétion des lieux en temps réel',
|
||
'system_notice.v3_features.highlight_import': 'Importer des lieux depuis KMZ/KML',
|
||
|
||
// System notices — MCP OAuth 2.1 upgrade
|
||
'system_notice.v3_mcp.title': 'MCP : mise à niveau OAuth 2.1',
|
||
'system_notice.v3_mcp.body': "L'intégration MCP a été entièrement repensée. OAuth 2.1 est désormais la méthode d'authentification recommandée. Les tokens statiques (trek_\u2026) sont dépréciés et seront supprimés dans une future version.",
|
||
'system_notice.v3_mcp.highlight_oauth': 'OAuth 2.1 recommandé (mcp-remote)',
|
||
'system_notice.v3_mcp.highlight_scopes': '24 scopes de permissions granulaires',
|
||
'system_notice.v3_mcp.highlight_deprecated': 'Tokens statiques trek_ dépréciés',
|
||
'system_notice.v3_mcp.highlight_tools': 'Outils et prompts étendus',
|
||
|
||
// System notices — personal thank you
|
||
'system_notice.v3_thankyou.title': 'Un mot personnel de ma part',
|
||
'system_notice.v3_thankyou.body': 'Avant de continuer — je veux prendre un instant.\n\nTREK a commencé comme un projet perso que j\'ai construit pour mes propres voyages. Je n\'aurais jamais imaginé qu\'il grandirait au point que 4 000 d\'entre vous lui fassent confiance pour planifier vos aventures. Chaque étoile, chaque issue, chaque demande de fonctionnalité — je les lis toutes, et ce sont elles qui me font tenir pendant les nuits blanches entre un travail à temps plein et l\'université.\n\nJe veux que vous sachiez : TREK sera toujours open source, toujours auto-hébergé, toujours à vous. Pas de tracking, pas d\'abonnements, pas de conditions cachées. Juste un outil construit par quelqu\'un qui aime voyager autant que vous.\n\nUn merci tout particulier à [jubnl](https://github.com/jubnl) — tu es devenu un collaborateur incroyable. Une grande partie de ce qui rend la 3.0 géniale porte ton empreinte. Merci d\'avoir cru en ce projet quand il était encore brut.\n\nEt à chacun d\'entre vous qui a signalé un bug, traduit une chaîne, partagé TREK avec un ami ou simplement l\'a utilisé pour planifier un voyage — **merci**. Vous êtes la raison pour laquelle tout ceci existe.\n\nÀ de nombreuses autres aventures ensemble.\n\n— Maurice\n\n---\n\n[Rejoins la communauté sur Discord](https://discord.gg/7Q6M6jDwzf)\n\nSi TREK rend tes voyages meilleurs, un [petit café](https://ko-fi.com/mauriceboe) aide toujours à garder les lumières allumées.',
|
||
'transport.addTransport': 'Add transport',
|
||
'transport.modalTitle.create': 'Add transport',
|
||
'transport.modalTitle.edit': 'Edit transport',
|
||
'transport.title': 'Transports',
|
||
'transport.addManual': 'Transport manuel',
|
||
}
|
||
|
||
export default fr
|
||
|