mirror of
https://github.com/mauriceboe/TREK.git
synced 2026-10-18 21:16:47 +00:00
a9907e2f10
TREK searches its own place index and OpenStreetMap. Neither carries a rating, so "the best rated hotel around here" has never been answerable, and an operator with a better index for their region had no way to reach the search box at all. The searchProvider hook is that way in: a plugin is handed the query, a limit, the language and the coordinate the search is biased toward, and answers with places in the same shape the core search returns, plus a rating. It sits beside the core search rather than inside it. The plugin runtime already imports PlacesModule, which imports MapsModule, so asking the providers from the maps service would close a module cycle — the same reason the other fourteen contribution controllers stand next to what they contribute to. The client asks both at once and merges, at the single point every caller already goes through, so all nine search surfaces get plugin hits without knowing the hook exists. A plugin index may never hold up the list: the client stops waiting at two and a half seconds and the host gives a provider two, which is also why the budget is the shortest of any hook here. With no such plugin installed the route answers without reaching the runtime at all. Every hit is normalized host-side and shared by the REST route and the MCP tool, so a cap that holds for the browser holds for the assistant: coordinates are range-checked, strings capped, the rating clamped to 0..5, a website must be http or https, and ids are namespaced so they can never collide with an OSM one. search_places_via_plugins is the MCP half, because what the user can see the assistant has to be able to see; search_place now points at it.
803 lines
58 KiB
TypeScript
803 lines
58 KiB
TypeScript
import type { TranslationStrings } from '../types';
|
||
|
||
const admin: TranslationStrings = {
|
||
'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",
|
||
'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': "D'où viennent les données de lieux. L'index TREK ne demande aucune clé ; les deux fournisseurs ci-dessous sont facultatifs.",
|
||
'admin.trekApi.badgeDefault': 'Source recommandée par défaut',
|
||
'admin.googleCaveat.badge': 'Déconseillé',
|
||
'admin.googleCaveat.body':
|
||
"TREK est un logiciel libre et nous ne sommes pas neutres ici. À cette échelle, les avis et les photos de commerces ordinaires n'existent que chez Google, et c'est cela, un monopole. Le champ est là faute d'alternative, pas parce que nous le recommandons. Chaque requête part alors chez Google.",
|
||
'admin.trekApi.tagline':
|
||
'L\'index de lieux propre à TREK. Chercher sans clé Google, sans quota et sans que personne ne compte vos recherches.',
|
||
'admin.trekApi.factPlaces':
|
||
'73,6 millions de lieux dans le monde',
|
||
'admin.trekApi.factNoKey':
|
||
'Sans clé, sans quota',
|
||
'admin.trekApi.factOffline':
|
||
'Paquets par pays utilisables hors ligne',
|
||
'admin.trekApi.factPrivacy':
|
||
'Les recherches ne sont jamais journalisées',
|
||
'admin.trekApi.more':
|
||
'Ce qu\'il contient',
|
||
'admin.trekApi.fieldPhone':
|
||
'Téléphone',
|
||
'admin.trekApi.fieldStableId':
|
||
'Identifiant stable',
|
||
'admin.trekApi.includedNote':
|
||
'Les descriptions viennent du site du lieu lui-même ; les horaires d\'OpenStreetMap là où ils sont renseignés.',
|
||
'admin.trekApi.notRatings':
|
||
'Avis',
|
||
'admin.trekApi.notPhotos':
|
||
'Photos des commerces ordinaires',
|
||
'admin.trekApi.notIncludedNote':
|
||
'Aucune source ouverte ne propose l\'un ni l\'autre, à aucun prix. Une clé Google reste le seul chemin vers ces deux-là.',
|
||
'admin.trekApi.sourcesLabel':
|
||
'Sources',
|
||
'admin.trekApi.sourcesNote':
|
||
'Chaque champ d\'une réponse indique de laquelle il provient.',
|
||
'admin.trekApi.included':
|
||
'Inclus',
|
||
'admin.trekApi.notIncluded':
|
||
'Non inclus',
|
||
'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 Google, l'API TREK recommandée est utilisée. Avec une clé, les photos, les avis et les horaires peuvent être chargés en plus. Créez-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.unsplashKey': 'Clé API Unsplash',
|
||
'admin.unsplashKeyHint': 'Pour la recherche d’images. Gratuit sur unsplash.com/developers',
|
||
'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.",
|
||
'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.googleOptions': 'Ce à quoi sert la clé',
|
||
'admin.googleOptionsSummary': '{on} sur {total} activé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.placesEnrich.title': 'Enrichissement des lieux',
|
||
'admin.placesEnrich.subtitle':
|
||
"Affiche des images et une description lors de l'ajout d'un lieu. Wikipédia et OpenStreetMap sont toujours utilisés ; Google s'y ajoute si Photos de lieux ou Détails de lieux sont activés.",
|
||
'admin.transitProvider.title': 'Fournisseur de transports en commun',
|
||
'admin.transitProvider.subtitle': 'Quel service répond à la recherche de transports en commun.',
|
||
'admin.transitProvider.transitous': 'Transitous (gratuit)',
|
||
'admin.transitProvider.google': 'Google',
|
||
'admin.transitProvider.transitousHint': 'Flux GTFS communautaires. Gratuit et sans clé, avec la meilleure couverture en Europe.',
|
||
'admin.transitProvider.googleHint': 'Utilise la clé Google ci-dessus, pour les régions sans données Transitous. Facturé à la recherche — tant qu\'aucune clé n\'est définie, Transitous est utilisé.',
|
||
'admin.transitProvider.noKeyWarning': 'Google est sélectionné, mais aucune clé Google n\'est configurée — la recherche de transports utilise toujours Transitous. Ajoutez une clé dans Clés d\'API ci-dessus.',
|
||
'admin.transitProvider.personalKeyWarning': 'Seule votre propre clé Google est définie : la recherche des autres membres continue de basculer sur Transitous. Enregistrez la clé ci-dessus en tant qu\'administrateur pour l\'appliquer à toute l\'instance.',
|
||
'admin.placeShadow.title': 'Journal des recherches de lieux',
|
||
'admin.placeShadow.subtitle':
|
||
'Enregistrer quel résultat de recherche a été retenu, afin de pouvoir évaluer plus tard un autre index de lieux sur de vraies recherches. Rien ne quitte cette instance, et un administrateur peut exporter ou supprimer le journal à tout moment.',
|
||
'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.deleteCategoryError': 'Échec de la suppression de la catégorie',
|
||
'admin.packingTemplates.deleteItemError': 'Échec de la suppression de cet élément',
|
||
'admin.packingTemplates.saveError': 'Erreur de sauvegarde',
|
||
'admin.tabs.addons': 'Extensions',
|
||
'admin.tabs.plugins': 'Plugins',
|
||
'admin.tabs.storage': 'Stockage',
|
||
'admin.plugins.rescan': 'Réanalyser',
|
||
'admin.plugins.rescanned': 'Dossier des plugins réanalysé',
|
||
'admin.plugins.upload': 'Téléverser un plugin',
|
||
'admin.plugins.dropToUpload': "Déposez un .zip de plugin pour l'installer",
|
||
'admin.plugins.uploaded': "Plugin “{name}” téléversé — activez-le pour l'exécuter",
|
||
'admin.plugins.sideloaded': 'Chargé manuellement',
|
||
'admin.plugins.devLinkBadge': 'Dev-Link',
|
||
'admin.plugins.devLinkHint':
|
||
'Chargé depuis un dossier de build local et rechargé à chaud avec des données réelles — dev uniquement',
|
||
'admin.plugins.devLinkTitle': 'Lier un plugin local',
|
||
'admin.plugins.devLinkPathPlaceholder': '/absolute/path/to/your/plugin',
|
||
'admin.plugins.devLinkButton': 'Lier',
|
||
'admin.plugins.devLinkLinked': "{id} lié — activez-le pour l'exécuter",
|
||
'admin.plugins.sideloadedHint': 'Téléversé manuellement — pas depuis le registre, non signé et non vérifié',
|
||
'admin.plugins.browse': 'Parcourir les plugins',
|
||
'admin.plugins.installed': 'Installé',
|
||
'admin.plugins.install': 'Installer',
|
||
'admin.plugins.registryEmpty': 'Aucun plugin disponible dans le registre pour le moment.',
|
||
'admin.plugins.actionError': "L'action a échoué",
|
||
'admin.plugins.activate': 'Activer',
|
||
'admin.plugins.activated': 'Plugin activé',
|
||
'admin.plugins.deactivate': 'Désactiver',
|
||
'admin.plugins.deactivated': 'Plugin désactivé',
|
||
'admin.plugins.viewErrors': "Voir le journal d'erreurs",
|
||
'admin.plugins.errorLog': "Journal d'erreurs",
|
||
'admin.plugins.allowedHosts': 'Hôtes autorisés',
|
||
'admin.plugins.allowedHosts.hint':
|
||
'Ce plugin communique avec un service que vous seul pouvez nommer (un serveur auto-hébergé). Ajoutez les hôtes qu’il peut joindre — il ne joindra aucun autre.',
|
||
'admin.plugins.allowedHosts.none': 'Aucun hôte ajouté pour l’instant.',
|
||
'admin.plugins.allowedHosts.unsupported':
|
||
'Ce plugin n’utilise pas d’hôtes fournis par l’opérateur. Ses hôtes autorisés sont fixés dans son manifeste.',
|
||
'admin.plugins.allowedHosts.restartNote':
|
||
'L’enregistrement redémarre le plugin pour qu’il prenne en compte la nouvelle liste.',
|
||
'admin.plugins.allowedHosts.add': 'Ajouter un hôte autorisé',
|
||
'admin.plugins.allowedHosts.count': '{n} hôte(s) autorisé(s)',
|
||
'admin.plugins.operatorEgressPill': '+ hôtes que vous ajoutez',
|
||
'admin.plugins.operatorEgressHint':
|
||
'Ce plugin communique avec un service que vous seul pouvez nommer (un serveur auto-hébergé). Après installation, ajoutez les hôtes qu’il peut joindre via ⋯ → Hôtes autorisés. Il ne joindra aucun autre.',
|
||
'admin.plugins.noErrors': 'Aucune erreur enregistrée.',
|
||
'admin.plugins.uninstalled': 'Plugin désinstallé',
|
||
'admin.plugins.uninstallTitle': 'Désinstaller le plugin ?',
|
||
'admin.plugins.uninstallBody':
|
||
'Cela arrête le plugin, supprime son code et efface toutes ses données. Cette action est irréversible.',
|
||
'admin.plugins.status.starting': 'Démarrage…',
|
||
'admin.plugins.type.widget': 'Widget',
|
||
'admin.plugins.type.page': 'Page',
|
||
'admin.plugins.type.integration': 'Intégration',
|
||
'admin.plugins.type.trip-page': 'Page de voyage',
|
||
'admin.plugins.reviewed': 'Vérifié',
|
||
'admin.plugins.unreviewed': 'Non vérifié',
|
||
'admin.plugins.updated': 'Plugin mis à jour',
|
||
'admin.plugins.updateTo': 'Update → v{version}',
|
||
'admin.plugins.enabledToggle': 'Activer le plugin',
|
||
'plugins.notFound': 'Plugin introuvable',
|
||
'plugins.frameLoadFailed': "Ce plugin n'a pas pu être chargé.",
|
||
'admin.plugins.title': 'Plugins',
|
||
'admin.plugins.subtitle': 'Installez et gérez des plugins tiers sur votre instance.',
|
||
'admin.plugins.disabledTitle': 'Les plugins sont désactivés',
|
||
'admin.plugins.disabledBody':
|
||
"L'environnement d'exécution des plugins est désactivé (TREK_PLUGINS_ENABLED). Aucun plugin ne peut fonctionner tant qu'un administrateur ne l'active pas dans la configuration du serveur.",
|
||
'admin.plugins.empty': 'Aucun plugin installé pour le moment.',
|
||
'admin.plugins.loadError': 'Impossible de charger les plugins.',
|
||
'admin.plugins.scaffoldNote':
|
||
"L'installation et l'activation des plugins arriveront dans une mise à jour ultérieure. Ce panneau liste actuellement uniquement les plugins installés.",
|
||
'admin.plugins.status.active': 'Actif',
|
||
'admin.plugins.status.inactive': 'Inactif',
|
||
'admin.plugins.status.disabled': 'Désactivé',
|
||
'admin.plugins.status.error': 'Erreur',
|
||
'admin.plugins.status.incompatible': 'Incompatible',
|
||
'admin.plugins.details': 'Détails',
|
||
'admin.plugins.detailError': 'Impossible de charger les détails du plugin.',
|
||
'admin.plugins.permissionsTitle': 'Permissions',
|
||
'admin.plugins.noPermissions': 'Ce plugin ne demande aucune permission spéciale.',
|
||
'admin.plugins.egressNote': 'Peut se connecter à : {hosts}',
|
||
'admin.plugins.setupTitle': 'Configuration',
|
||
'admin.plugins.noSetup': 'Fonctionne immédiatement — rien à configurer.',
|
||
'admin.plugins.scope.instance': "Toute l'instance",
|
||
'admin.plugins.scope.user': 'Par utilisateur',
|
||
'admin.plugins.fieldRequired': 'Requis',
|
||
'admin.plugins.sourceRepo': 'Dépôt source',
|
||
'admin.plugins.reportIssue': 'Signaler un problème',
|
||
'admin.plugins.homepage': 'Site web',
|
||
'admin.plugins.requiresTrek': 'Nécessite TREK {version}+',
|
||
'admin.plugins.reviewedOn': 'Vérifié le {date}',
|
||
'admin.plugins.perm.db:own': 'Stocker ses propres données dans une base de données isolée',
|
||
'admin.plugins.perm.db:read:trips': "Lire les voyages accessibles à l'utilisateur actif",
|
||
'admin.plugins.perm.db:read:users': 'Lire les informations de profil de base (nom, avatar — jamais les identifiants)',
|
||
'admin.plugins.perm.db:read:costs': "Lire les dépenses (postes de budget) accessibles à l'utilisateur actif",
|
||
'admin.plugins.perm.db:read:packing': "Lire les listes de bagages des voyages accessibles à l'utilisateur actif",
|
||
'admin.plugins.perm.db:write:packing':
|
||
"Créer, modifier et supprimer des articles de la liste de bagages sur les voyages que l'utilisateur actif peut modifier",
|
||
'admin.plugins.perm.weather:read': "Lire les prévisions météo en cache de l'hôte (par coordonnées)",
|
||
'admin.plugins.perm.db:read:categories': 'Lire la liste globale des catégories de lieux',
|
||
'admin.plugins.perm.db:read:tags': "Lire les étiquettes de l'utilisateur actif",
|
||
'admin.plugins.perm.db:write:tags': "Créer, modifier et supprimer les étiquettes de l'utilisateur actif",
|
||
'admin.plugins.perm.db:read:todos': "Lire les tâches des voyages accessibles à l'utilisateur actif",
|
||
'admin.plugins.perm.db:write:todos':
|
||
"Créer, modifier et supprimer des tâches sur les voyages que l'utilisateur actif peut modifier",
|
||
'admin.plugins.perm.db:write:atlas':
|
||
"Marquer des pays et régions comme visités et gérer la liste d'envies de l'utilisateur actif (nécessite le module Atlas)",
|
||
'admin.plugins.perm.db:write:vacay':
|
||
"Basculer les jours de congé et les fermetures d'entreprise sur le plan actif de l'utilisateur actif (nécessite le module Vacay)",
|
||
'admin.plugins.perm.db:write:journal':
|
||
"Créer, modifier et supprimer des entrées de journal dans les journaux que l'utilisateur actif peut modifier (nécessite le module Journey)",
|
||
'admin.plugins.perm.db:write:collections':
|
||
"Créer et modifier des collections et y enregistrer des lieux, avec le rôle de collection de l'utilisateur actif (nécessite le module Collections)",
|
||
'admin.plugins.perm.db:write:files':
|
||
"Joindre des fichiers aux voyages que l'utilisateur actif peut modifier (limite de 10 Mo, extensions bloquées refusées) et gérer leurs liens",
|
||
'admin.plugins.perm.db:write:collab':
|
||
"Publier des notes, des sondages et des messages de chat sur les voyages que l'utilisateur actif peut modifier (nécessite le module Collab)",
|
||
'admin.plugins.perm.db:write:members':
|
||
"Ajouter des utilisateurs aux voyages — accorde l'accès au voyage ; protégé par le droit de gestion des membres de l'utilisateur actif",
|
||
'admin.plugins.perm.notify:send':
|
||
"Envoyer une notification (boîte de réception + e-mail/ntfy) à l'utilisateur actif ou à un voyage auquel il appartient — jamais à un destinataire arbitraire",
|
||
'admin.plugins.perm.ai:invoke':
|
||
"Utiliser le fournisseur d'IA configuré par l'administrateur (complétion de texte + extraction de documents) au nom de l'utilisateur actif — le module ne détient jamais de clé",
|
||
'admin.plugins.perm.oauth:client':
|
||
"Se connecter à un service tiers en votre nom via OAuth géré par l'hôte (l'hôte détient les jetons, le module ne les voit jamais)",
|
||
'admin.plugins.perm.db:read:files': "Lire les fichiers des voyages accessibles à l'utilisateur actif",
|
||
'admin.plugins.perm.db:write:reservations':
|
||
"Créer, modifier et supprimer des réservations sur les voyages que l'utilisateur actif peut modifier",
|
||
'admin.plugins.perm.db:write:accommodations':
|
||
"Créer, modifier et supprimer des hébergements sur les voyages que l'utilisateur actif peut modifier",
|
||
'admin.plugins.perm.db:read:journal':
|
||
"Lire les journaux de voyage de l'utilisateur actif (nécessite le module Journey)",
|
||
'admin.plugins.perm.db:read:atlas':
|
||
"Lire les pays et régions visités par l'utilisateur actif (nécessite le module Atlas)",
|
||
'admin.plugins.perm.db:read:vacay': "Lire le plan de vacances de l'utilisateur actif (nécessite le module Vacay)",
|
||
'admin.plugins.perm.db:read:daynotes': "Lire les notes de journée des voyages accessibles à l'utilisateur actif",
|
||
'admin.plugins.perm.db:read:collections':
|
||
"Lire les collections de lieux enregistrés de l'utilisateur actif (nécessite le module Collections)",
|
||
'admin.plugins.perm.db:write:daynotes':
|
||
"Créer, modifier et supprimer des notes de journée sur les voyages que l'utilisateur actif peut modifier",
|
||
'admin.plugins.perm.jobs:run':
|
||
"Exécuter ses tâches d'arrière-plan selon une planification (sans contexte utilisateur — ne peut pas lire les données utilisateur)",
|
||
'admin.plugins.perm.db:write:costs':
|
||
"Créer des dépenses (postes de budget) sur les voyages que l'utilisateur actif peut modifier",
|
||
'admin.plugins.perm.db:write:places':
|
||
"Ajouter, modifier et supprimer des lieux sur les voyages que l'utilisateur actif peut modifier",
|
||
'admin.plugins.perm.db:write:days':
|
||
"Ajouter, modifier et supprimer des jours sur les voyages que l'utilisateur actif peut modifier",
|
||
'admin.plugins.perm.db:write:itinerary':
|
||
"Attribuer et retirer des lieux aux jours des voyages que l'utilisateur actif peut modifier",
|
||
'admin.plugins.perm.db:write:trips':
|
||
"Modifier les détails du voyage (titre, dates, devise…) sur les voyages que l'utilisateur actif peut modifier",
|
||
'admin.plugins.perm.db:meta':
|
||
"Associer ses propres données privées aux voyages, lieux et jours auxquels l'utilisateur actif a accès",
|
||
'admin.plugins.perm.ws:broadcast:trip': 'Envoyer des mises à jour en temps réel aux membres du voyage',
|
||
'admin.plugins.perm.ws:broadcast:user': 'Envoyer des mises à jour en temps réel à des utilisateurs individuels',
|
||
'admin.plugins.perm.hook:photo-provider': 'Fournir des photos à Photos',
|
||
'admin.plugins.perm.hook:calendar-source': 'Fournir des événements au calendrier',
|
||
'admin.plugins.perm.hook:place-detail-provider': 'Ajouter des détails supplémentaires (avis, notes, liens) à un lieu',
|
||
'admin.plugins.perm.hook:search-provider':
|
||
'Répondre aux recherches de lieux depuis son propre index, à côté des résultats de TREK',
|
||
'admin.plugins.perm.hook:trip-warning-provider':
|
||
'Émettre des avertissements de validation sur un voyage (affichés dans le planificateur)',
|
||
'admin.plugins.perm.hook:table-contributor':
|
||
'Ajouter des colonnes et des actions aux vues du voyage (réservations, lieux, jours)',
|
||
'admin.plugins.perm.hook:map-marker-provider':
|
||
'Ajouter des marqueurs à la carte du voyage (p. ex. afficher réservations ou POIs)',
|
||
'admin.plugins.perm.hook:map-layer-provider':
|
||
'Tracer des itinéraires, des corridors et des zones sur la carte du voyage',
|
||
'admin.plugins.perm.hook:route-provider':
|
||
'Proposer des profils de routage avec lesquels le planificateur calcule les itinéraires des jours (p. ex. routage pour véhicule électrique avec arrêts de recharge)',
|
||
'admin.plugins.perm.hook:day-schedule-provider':
|
||
'Ajouter des entrées horaires au plan de la journée (arrêts de recharge, marges de sécurité)',
|
||
'admin.plugins.perm.hook:day-tint-provider':
|
||
'Colorer les jours du plan de la journée (par exemple, à quelle étape du voyage appartient un jour)',
|
||
'admin.plugins.cap.mcpTools': 'Publie des outils IA',
|
||
'admin.plugins.mcpToolsTitle': 'Outils IA publiés',
|
||
'admin.plugins.mcpToolsHint': "Un assistant peut les exécuter au nom d'un utilisateur. Chacun agit avec les accès accordés ci-dessus.",
|
||
'admin.plugins.perm.mcp:tools':
|
||
"Publier des outils qu'un assistant IA peut exécuter en votre nom (il agit avec les accès que vous accordez ici à l'extension, pas avec les siens)",
|
||
'admin.plugins.perm.geolocation:read':
|
||
"Demander votre position en temps réel tant que l'une de ses vues est ouverte (TREK la lit avec l'autorisation de localisation de ce site, pas avec une autorisation propre à l'extension)",
|
||
'admin.plugins.perm.hook:pdf-section-provider': "Ajouter des sections de texte à l'export PDF du voyage",
|
||
'admin.plugins.perm.hook:atlas-layer-provider':
|
||
"Mettre en évidence des pays sur la carte du monde Atlas (p. ex. listes d'envies ou avis aux voyageurs)",
|
||
'admin.plugins.perm.hook:journal-entry-provider':
|
||
'Ajouter des lignes supplémentaires (liens, statistiques) aux entrées du journal',
|
||
'admin.plugins.perm.hook:user-data':
|
||
"Effacer ou exporter les données qu'il stocke sur un utilisateur (RGPD : suppression de compte et demandes d'accès)",
|
||
'admin.plugins.perm.hook:trip-card-provider':
|
||
'Ajouter de petits badges (statut, compteurs) aux cartes de voyage du tableau de bord',
|
||
'admin.plugins.perm.hook:notification-channel': 'Envoyer vos notifications via un canal supplémentaire',
|
||
'admin.plugins.perm.events:subscribe':
|
||
'Réagir aux événements d’activité principaux (nom de l’événement et voyage uniquement, jamais le contenu)',
|
||
'admin.plugins.perm.http:outbound': 'Effectuer des requêtes sortantes vers ses hôtes déclarés',
|
||
'admin.plugins.perm.db:read:collab':
|
||
"Lire les notes, sondages et messages de chat des voyages accessibles à l'utilisateur actif (nécessite le module Collab)",
|
||
'admin.plugins.perm.db:read:files:content':
|
||
"Lire le contenu (octets) des fichiers des voyages accessibles à l'utilisateur actif",
|
||
'admin.plugins.perm.db:create:trips': "Créer de nouveaux voyages appartenant à l'utilisateur actif",
|
||
'admin.plugins.perm.rates:read': "Lire les taux de change en cache de l'hôte",
|
||
'admin.plugins.updateConsentTitle': 'Cette mise à jour nécessite de nouvelles permissions',
|
||
'admin.plugins.updateConsentBody':
|
||
"{name} v{version} demande des droits que vous n'avez pas encore accordés. La nouvelle version est installée mais reste désactivée jusqu'à ce que vous l'approuviez.",
|
||
'admin.plugins.updateNewPermissions': 'Nouvelles permissions demandées',
|
||
'admin.plugins.updateNewEgress': 'Nouvelles connexions sortantes',
|
||
'admin.plugins.updateApprove': 'Approuver et activer',
|
||
'admin.plugins.updateLater': "Laisser désactivé pour l'instant",
|
||
'admin.plugins.updateKeptOff':
|
||
"Mise à jour installée — laissée désactivée jusqu'à ce que vous approuviez les nouvelles permissions",
|
||
'admin.plugins.reviewedMeaning':
|
||
"« Vérifié » signifie qu'un mainteneur de TREK a analysé ce plugin à la recherche de logiciels malveillants à chaque version — non pour sa qualité ni son bon fonctionnement. Ce n'est pas une garantie qu'un plugin est inoffensif.",
|
||
'admin.plugins.security.title': 'Comment les plugins sont confinés — et les limites',
|
||
'admin.plugins.security.isolationTitle': "Chaque plugin s'exécute en isolation",
|
||
'admin.plugins.security.isolationBody':
|
||
"Un plugin s'exécute comme son propre processus verrouillé qui ne peut lire que ses propres fichiers. Il ne peut pas lire votre base de données, votre secret de connexion ou votre clé de chiffrement, ne peut pas lancer d'autres programmes et ne peut écrire de fichiers nulle part. Son interface s'exécute dans un cadre de navigateur scellé qui ne peut pas lire votre cookie de session ni toucher à la page TREK qui l'entoure.",
|
||
'admin.plugins.security.permsTitle': 'Ce que signifient les permissions',
|
||
'admin.plugins.security.permsBody':
|
||
"Les permissions affichées avant l'installation constituent une limite stricte que TREK applique pendant l'exécution du plugin — il ne peut littéralement rien faire qui ne figure pas dans la liste. Mais elles vous indiquent ce qu'un plugin peut faire, pas ce qu'il fait réellement. Un plugin autorisé à lire vos voyages et à contacter un serveur peut envoyer vos voyages à ce serveur ; lisez donc les permissions et les hôtes sortants, pas seulement la description.",
|
||
'admin.plugins.security.limitsTitle': 'Ce que nous ne pouvons pas promettre',
|
||
'admin.plugins.security.limitsBody':
|
||
"L'isolation est une frontière logicielle solide, mais pas absolue. Un plugin agit avec exactement les droits que vous approuvez ; dans les limites de ces droits, il peut donc se comporter autrement que ne le laisse penser sa description, et il peut envoyer aux hôtes qu'il a déclarés les données qu'il détient légitimement. TREK ne lit ni ne juge ce que fait réellement le code d'un plugin.",
|
||
'admin.plugins.security.worstTitle': 'Le pire scénario',
|
||
'admin.plugins.security.worstBody':
|
||
"Un plugin malveillant que vous activez peut détourner les données et connexions que vous lui avez accordées — par exemple, divulguer les voyages qu'il est autorisé à lire. Il ne peut pas voler de mots de passe, falsifier une connexion admin, exécuter des commandes sur votre serveur ni atteindre des données que vous n'avez pas accordées. Les dégâts restent limités à ce que vous avez approuvé, et désactiver le plugin l'arrête.",
|
||
'admin.plugins.security.reviewedTitle': 'Ce que signifie « Vérifié »',
|
||
'admin.plugins.security.reviewedBody':
|
||
"Un plugin vérifié a été analysé manuellement à la recherche de logiciels malveillants par un mainteneur de TREK à chaque version — contrôlé pour du code hostile, non pour son bon fonctionnement. Ce n'est pas une promesse que le plugin est inoffensif.",
|
||
'admin.plugins.security.signedTitle': 'Ce que signifie « Signé »',
|
||
'admin.plugins.security.signedBody':
|
||
"La somme de contrôle que TREK vérifie à chaque installation prouve que les fichiers sont exactement ceux dont le registre se porte garant. Une signature prouve autre chose : qu'ils proviennent de l'auteur, signés avec une clé que lui seul détient. Un plugin signé possède les deux. Un plugin non signé n'est pas dangereux — il porte simplement une garantie de moins, et la plupart des plugins du registre ne sont pas signés aujourd'hui.",
|
||
'admin.plugins.signed': 'Signé',
|
||
'admin.plugins.signedHint': "Vérifié avec la clé de signature de l'auteur au moment de l'installation",
|
||
'admin.plugins.unsigned': 'Non signé',
|
||
'admin.plugins.unsignedHint':
|
||
"Les fichiers correspondent à ce dont le registre se porte garant, mais rien ne les relie à l'auteur. Une garantie de moins — pas un danger.",
|
||
'admin.plugins.updateBlocked': 'Mise à jour bloquée — {reason}',
|
||
'admin.plugins.reviewBlock': 'Examiner',
|
||
'admin.plugins.retrusted': 'Nouvelle clé de signature approuvée — le plugin est mis à jour',
|
||
'admin.plugins.sig.title': "La signature de {name} n'a pas pu être vérifiée",
|
||
'admin.plugins.sig.keyChangedBody':
|
||
"La clé de signature de l'auteur n'est pas celle avec laquelle ce plugin a été installé. Les auteurs changent bel et bien de clé — mais un attaquant ayant pris le contrôle du plugin ressemblerait exactement à ceci.",
|
||
'admin.plugins.sig.invalidBody':
|
||
"Les fichiers ne correspondent pas à la signature de l'auteur. Ce n'est pas ce que l'auteur a signé — soit ils ont été corrompus, soit ils ont été altérés. Impossible de passer outre.",
|
||
'admin.plugins.sig.missingBody':
|
||
"Ce plugin était signé lorsque vous l'avez installé, mais la nouvelle version ne fournit aucune signature. TREK n'acceptera pas ce recul en silence. Impossible de passer outre.",
|
||
'admin.plugins.sig.incompleteBody':
|
||
"L'entrée du registre est à moitié signée : elle déclare une clé d'auteur mais la version ne porte aucune signature (ou l'inverse). C'est une erreur du côté du plugin. Impossible de passer outre.",
|
||
'admin.plugins.sig.pinnedKey': "Clé utilisée lors de l'installation",
|
||
'admin.plugins.sig.newKey': "Clé proposée aujourd'hui",
|
||
'admin.plugins.sig.confirmOutOfBand':
|
||
"TREK ne peut pas distinguer un changement de clé légitime d'une prise de contrôle — vus d'ici, les deux sont identiques. Confirmez la nouvelle clé auprès de l'auteur via un canal auquel vous faites déjà confiance avant de l'accepter. Une fois que c'est fait, le plugin est mis à jour et la nouvelle clé est mémorisée.",
|
||
'admin.plugins.sig.retrustConfirm': 'Faire confiance à la nouvelle clé et mettre à jour',
|
||
'admin.plugins.sig.cancel': 'Ne pas lui faire confiance',
|
||
'admin.plugins.sig.consentUnsigned':
|
||
"Rien ne relie cette version à son auteur — les fichiers correspondent au registre, mais ne portent aucune signature d'auteur.",
|
||
'admin.plugins.security.trustTitle': 'En résumé',
|
||
'admin.plugins.security.trustBody':
|
||
"Installer un plugin revient à installer n'importe quelle application tierce : n'ajoutez que du code provenant d'auteurs de confiance et, en cas de doute, inspectez-le vous-même au préalable. TREK décline toute responsabilité concernant les plugins tiers.",
|
||
'admin.plugins.runtimeOn': 'Exécution activée',
|
||
'admin.plugins.tabDiscover': 'Découvrir',
|
||
'admin.plugins.searchPlaceholder': 'Rechercher des plugins…',
|
||
'admin.plugins.filterType': 'Type',
|
||
'admin.plugins.filterStatus': 'Statut',
|
||
'admin.plugins.sortBy': 'Trier',
|
||
'admin.plugins.allTypes': 'Tous les types',
|
||
'admin.plugins.allStatuses': 'Tous',
|
||
'admin.plugins.stateOff': 'Désactivé',
|
||
'admin.plugins.filterUpdate': 'Mise à jour disponible',
|
||
'admin.plugins.sortName': 'Nom',
|
||
'admin.plugins.sortRecent': 'Récemment mis à jour',
|
||
'admin.plugins.sortUpdates': 'Mises à jour en premier',
|
||
'admin.plugins.sortDownloads': 'Plus téléchargés',
|
||
'admin.plugins.updatesAvailable': '{count} mises à jour disponibles pour vos plugins.',
|
||
'admin.plugins.newerNeedsTrek': 'v{version} disponible — nécessite TREK {range}',
|
||
'admin.plugins.versionsTitle': 'Versions',
|
||
'admin.plugins.versionPickerTitle': 'Changer de version — {name}',
|
||
'admin.plugins.versionSwitch': 'Passer à {version}',
|
||
'admin.plugins.versionNeedsTrek': 'nécessite TREK {range}',
|
||
'admin.plugins.changeVersion': 'Changer de version…',
|
||
'admin.plugins.noVersions': 'Aucune version publiée trouvée dans le registre.',
|
||
'admin.plugins.downgradeTitle': 'Revenir à une version antérieure de ce plugin ?',
|
||
'admin.plugins.downgradeBody': 'Passage de v{from} à v{to} : les données écrites par la version plus récente restent en place, et la version plus ancienne pourrait ne pas les comprendre.',
|
||
'admin.plugins.downgradeConfirm': 'Rétrograder',
|
||
'admin.plugins.updatesHeld': 'Mises à jour en pause à la v{version}',
|
||
'admin.plugins.resumeUpdates': 'Reprendre les mises à jour',
|
||
'admin.plugins.updatesResumed': 'Mises à jour reprises',
|
||
'admin.plugins.updateAll': 'Tout mettre à jour',
|
||
'admin.plugins.noMatchInstalled': 'Aucun plugin installé ne correspond à votre recherche.',
|
||
'admin.plugins.noMatchRegistry': 'Aucun plugin du registre ne correspond à votre recherche.',
|
||
'admin.plugins.restart': 'Redémarrer',
|
||
'admin.plugins.restarted': 'Plugin redémarré',
|
||
'admin.plugins.instanceSettings': 'Paramètres de l’instance',
|
||
'admin.plugins.settingsSaved': 'Paramètres enregistrés',
|
||
'admin.plugins.settingsSavedRestarted': 'Paramètres enregistrés — plugin redémarré',
|
||
'admin.plugins.actions': 'Actions',
|
||
'admin.plugins.actions.confirm': 'Exécuter cette action ?',
|
||
'admin.plugins.actions.inactive': 'Activez le plugin pour exécuter ses actions',
|
||
'admin.plugins.requiredMissing': '« {field} » est obligatoire',
|
||
'admin.plugins.cap.readsTrips': 'Lit vos voyages',
|
||
'admin.plugins.cap.readsUsers': 'Lit les profils de base',
|
||
'admin.plugins.cap.readsCosts': 'Lit vos dépenses',
|
||
'admin.plugins.cap.readsPacking': 'Lit les listes de bagages',
|
||
'admin.plugins.cap.readsFiles': 'Lit les fichiers du voyage',
|
||
'admin.plugins.cap.writesCosts': 'Ajoute des dépenses',
|
||
'admin.plugins.cap.writesPlaces': 'Modifie les lieux',
|
||
'admin.plugins.cap.writesDays': 'Modifie les jours',
|
||
'admin.plugins.cap.writesItinerary': "Modifie l'itinéraire",
|
||
'admin.plugins.cap.writesTrips': 'Modifie les voyages',
|
||
'admin.plugins.cap.metadata': 'Ajoute des métadonnées',
|
||
'admin.plugins.cap.widget': 'Widget de tableau de bord',
|
||
'admin.plugins.cap.heroWidget': "Widget carte d'embarquement",
|
||
'admin.plugins.cap.placeSlot': 'Détail du lieu',
|
||
'admin.plugins.cap.daySlot': 'Détail du jour',
|
||
'admin.plugins.cap.reservationSlot': 'Détail de la réservation',
|
||
'admin.plugins.cap.replacesTabs': 'Remplace des onglets du planificateur',
|
||
'admin.plugins.cap.realtime': 'Mises à jour en temps réel',
|
||
'admin.plugins.cap.notificationChannel': 'Canal de notification',
|
||
'admin.plugins.cap.photos': 'Fournit des photos',
|
||
'admin.plugins.cap.calendar': 'Fournit des événements de calendrier',
|
||
'admin.plugins.cap.placeDetails': 'Enrichit les lieux',
|
||
'admin.plugins.cap.search': 'Répond aux recherches',
|
||
'admin.plugins.cap.warnings': 'Signale les problèmes',
|
||
'admin.plugins.cap.mapLayers': 'Dessine sur la carte',
|
||
'admin.plugins.cap.routing': 'Propose des itinéraires',
|
||
'admin.plugins.cap.daySchedule': 'Ajoute des horaires',
|
||
'admin.plugins.cap.dayTint': 'Colore les jours',
|
||
'admin.plugins.cap.geolocation': 'Lit votre position',
|
||
'admin.plugins.cap.events': 'Réagit à l’activité',
|
||
'admin.plugins.cap.requiresAddon': 'Nécessite {addon}',
|
||
'admin.plugins.cap.dependsOn': 'Requiert {id} {version}',
|
||
'admin.plugins.dep.addonDisabledToast': 'Activez d’abord le ou les modules requis : {addons}',
|
||
'admin.plugins.dep.autoEnabled': 'Plugin(s) requis activé(s) au préalable : {plugins}',
|
||
'admin.plugins.dep.downloaded': '{id} téléchargé',
|
||
'admin.plugins.dep.resolveTitle': 'Dépendances manquantes',
|
||
'admin.plugins.dep.resolveBody': '« {name} » nécessite l’installation de ces plugins avant de pouvoir être activé.',
|
||
'admin.plugins.dep.requires': 'Nécessite {version}',
|
||
'admin.plugins.dep.mismatch': 'Nécessite {wanted} — {installed} est installé',
|
||
'admin.plugins.dep.download': 'Télécharger',
|
||
'admin.plugins.dep.update': 'Mettre à jour',
|
||
'admin.plugins.dep.resolveHint': 'Télécharge la dernière version compatible, y compris ses propres dépendances.',
|
||
'admin.plugins.dep.trekIncompatible': 'Nécessite TREK {range} — ce serveur exécute {host}',
|
||
'admin.plugins.dep.trekUnknown': 'N’indique pas quelles versions de TREK sont prises en charge',
|
||
'admin.plugins.installCompatible': 'Installer {version}',
|
||
'admin.plugins.installAnyway': 'Installer quand même',
|
||
'admin.plugins.rangeBypass.pill': 'Contrôles de version désactivés',
|
||
'admin.plugins.rangeBypass.pillHint':
|
||
'TREK_PLUGINS_IGNORE_TREK_RANGE est défini — les plugins peuvent s’installer et s’exécuter en dehors des versions de TREK déclarées par leurs auteurs',
|
||
'admin.plugins.rangeBypass.title': 'Hors des versions de TREK prises en charge',
|
||
'admin.plugins.rangeBypass.noticeTitle': 'Installé hors des versions de TREK prises en charge',
|
||
'admin.plugins.rangeBypass.body':
|
||
'« {name} » déclare prendre en charge TREK {range}, et ce serveur exécute {host}. TREK le laisse passer uniquement parce que TREK_PLUGINS_IGNORE_TREK_RANGE est défini. Son auteur n’a pas mis à jour la plage de versions du plugin pour ce TREK : rien ne garantit qu’il fonctionne — et dans de rares cas, un plugin incompatible peut corrompre les données de TREK. Ne continuez que si vous acceptez ce risque.',
|
||
'admin.plugins.rangeBypass.bodyUnknown':
|
||
'« {name} » n’indique pas quelles versions de TREK il prend en charge ; ce serveur exécute {host}. TREK le laisse passer uniquement parce que TREK_PLUGINS_IGNORE_TREK_RANGE est défini. Rien n’indique que son auteur l’a testé sur ce TREK : rien ne garantit qu’il fonctionne — et dans de rares cas, un plugin incompatible peut corrompre les données de TREK. Ne continuez que si vous acceptez ce risque.',
|
||
'admin.plugins.dep.trekBypassed':
|
||
'Hors de sa plage TREK ({range}) — contrôles de version désactivés',
|
||
'admin.plugins.dep.trekBypassedUnknown':
|
||
'Ne déclare aucune plage TREK — contrôles de version désactivés',
|
||
'admin.plugins.incompatible': 'Incompatible',
|
||
'admin.plugins.accessTitle': 'Ce à quoi il peut accéder',
|
||
'admin.plugins.connectsTitle': 'Se connecte à',
|
||
'admin.plugins.detailsTitle': 'Détails',
|
||
'admin.plugins.noAccess': 'Ne nécessite aucun accès particulier.',
|
||
'admin.plugins.metaVersion': 'Version',
|
||
'admin.plugins.metaSize': 'Taille',
|
||
'admin.plugins.metaRequires': 'Nécessite',
|
||
'admin.plugins.metaReviewed': 'Vérifié le',
|
||
'admin.plugins.downloads': 'Téléchargements',
|
||
'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': 'Coûts',
|
||
'admin.addons.catalog.budget.description': 'Suivez les dépenses du voyage et répartissez-les entre les voyageurs',
|
||
'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, sondages, chat et suggestions pour planifier à plusieurs',
|
||
'admin.addons.catalog.roadtrip.name': 'Road trip',
|
||
'admin.addons.catalog.roadtrip.description': 'Planifiez des trajets avec étapes : temps de conduite et heures d’arrivée se recalculent seuls',
|
||
'admin.addons.subtitleBefore': 'Activez ou désactivez des fonctionnalités pour personnaliser votre expérience ',
|
||
'admin.addons.subtitleAfter': '.',
|
||
'admin.addons.catalog.naver_list_import.name': 'Naver List Import',
|
||
'admin.addons.catalog.naver_list_import.description': 'Importez des lieux depuis une liste Naver Maps partagée',
|
||
'admin.addons.catalog.airtrail.name': 'AirTrail',
|
||
'admin.addons.catalog.airtrail.description': 'Synchronisez les vols depuis votre instance AirTrail',
|
||
'admin.addons.catalog.llm_parsing.name': 'Analyse par IA',
|
||
'admin.addons.catalog.llm_parsing.description': 'Lit les réservations que l’analyseur intégré ne comprend pas, via un modèle d’IA de votre choix',
|
||
'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.group.count': '{enabled} sur {total} activés',
|
||
'admin.addons.noAddons': 'Aucune extension disponible',
|
||
'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',
|
||
'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',
|
||
'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.nonDockerText':
|
||
"Cette instance TREK ne fonctionne pas dans Docker. Pour mettre à jour vers {version}, relancez la méthode d'installation ou de mise à jour que vous avez utilisée — par exemple, sur Proxmox Community Scripts, lancez la mise à jour depuis la console LXC :",
|
||
'admin.update.wikiLink': 'Ouvrir le guide de mise à jour',
|
||
'admin.update.reloadHint': 'Veuillez recharger la page dans quelques secondes.',
|
||
'admin.tabs.permissions': 'Permissions',
|
||
'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',
|
||
'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',
|
||
'admin.addons.catalog.collections.name': 'Collections',
|
||
'admin.addons.catalog.collections.description': 'Rassemblez des lieux de tous vos voyages dans des listes nommées et réutilisez-les',
|
||
'admin.passkey.title': 'Connexion par passkey',
|
||
'admin.passkey.cardHint':
|
||
'Permettez aux utilisateurs de se connecter avec des passkeys (WebAuthn). Désactivé par défaut.',
|
||
'admin.passkey.login': 'Activer la connexion par passkey',
|
||
'admin.passkey.loginHint':
|
||
"Affiche une option « Se connecter avec une passkey » et permet aux utilisateurs d'enregistrer des passkeys dans leurs paramètres.",
|
||
'admin.passkey.notConfigured':
|
||
'Aucun domaine WebAuthn ne peut encore être résolu pour ce déploiement. Définissez APP_URL ou le Relying Party ID ci-dessous — les passkeys restent masquées jusque-là.',
|
||
'admin.passkey.rpId': 'Relying Party ID (domaine)',
|
||
'admin.passkey.rpIdHint':
|
||
"Le domaine nu auquel les passkeys sont liées, ex. trek.example.org. Laissez vide pour le déduire d'APP_URL. Le modifier ultérieurement invalide les passkeys existantes.",
|
||
'admin.passkey.origins': 'Origines autorisées',
|
||
'admin.passkey.originsHint':
|
||
'Origines complètes séparées par des virgules, ex. https://trek.example.org. Laissez vide pour utiliser APP_URL.',
|
||
'admin.passkey.reset': 'Réinitialiser les passkeys',
|
||
'admin.passkey.resetHint':
|
||
"Supprime toutes les passkeys de cet utilisateur (ex. en cas d'appareil perdu). Il pourra toujours se connecter avec son mot de passe.",
|
||
'admin.passkey.resetConfirm': 'Supprimer toutes les passkeys de {name} ?',
|
||
'admin.passkey.resetDone': '{count} passkey(s) supprimée(s)',
|
||
'admin.defaultSettings.mapProvider': 'Moteur cartographique',
|
||
'admin.defaultSettings.mapProviderHint':
|
||
'La carte par défaut pour tous les utilisateurs de cette instance. Chaque utilisateur peut toujours la remplacer dans ses propres paramètres.',
|
||
'admin.defaultSettings.providerLeaflet': 'Standard (gratuit)',
|
||
'admin.defaultSettings.providerMapbox': 'Mapbox (3D)',
|
||
'admin.defaultSettings.providerMapLibre': 'MapLibre (OpenFreeMap)',
|
||
'admin.defaultSettings.mapboxToken': 'Jeton Mapbox partagé',
|
||
'admin.defaultSettings.mapboxTokenHint':
|
||
"Utilisé pour chaque utilisateur n'ayant pas saisi son propre jeton — ainsi toute l'instance bénéficie de Mapbox sans partager la clé individuellement. Stocké de façon chiffrée.",
|
||
'admin.defaultSettings.mapboxStyle': 'Style de carte',
|
||
'admin.defaultSettings.mapboxStylePlaceholder': 'Choisissez un style…',
|
||
'admin.defaultSettings.mapbox3d': 'Bâtiments & terrain en 3D',
|
||
'admin.defaultSettings.mapboxQuality': 'Mode haute qualité',
|
||
'admin.defaultSettings.cartoKey': 'Clé CARTO partagée',
|
||
'admin.defaultSettings.cartoKeyHint':
|
||
"Utilisée pour chaque utilisateur n'ayant pas saisi sa propre clé, ainsi toute l'instance reçoit les tuiles CARTO sans filigrane. Stockée de façon chiffrée.",
|
||
'admin.group.users': 'Users',
|
||
'admin.group.config': 'Configuration',
|
||
'admin.group.integration': 'Integrations',
|
||
'admin.group.maintenance': 'Maintenance',
|
||
'admin.invite.tripLabel': 'Ajouter à un voyage (facultatif)',
|
||
'admin.invite.tripNone': 'Aucun voyage',
|
||
'admin.invite.tripHint':
|
||
"Le nouvel utilisateur est automatiquement ajouté à ce voyage lorsqu'il s'inscrit via le lien.",
|
||
'admin.invite.boundTo': 'ajoute à {trip}',
|
||
};
|
||
export default admin;
|