diff --git a/src/i18n/fr/batch1.ts b/src/i18n/fr/batch1.ts index 8d39129..10051d9 100644 --- a/src/i18n/fr/batch1.ts +++ b/src/i18n/fr/batch1.ts @@ -1,4 +1,290 @@ /** fr — batch 1. Filled by the translation pass; empty until then. */ -const frBatch1 = {}; +const frBatch1 = { + common: { + loading: "Chargement…", + error: "Erreur", + save: "Enregistrer", + cancel: "Annuler", + delete: "Supprimer", + edit: "Modifier", + add: "Ajouter", + remove: "Retirer", + create: "Créer", + submit: "Envoyer", + close: "Fermer", + back: "Retour", + next: "Suivant", + done: "Terminé", + search: "Rechercher", + filter: "Filtrer", + sort: "Trier", + share: "Partager", + more: "Plus", + copy: "Copier", + copied: "Copié !", + viewAll: "Tout voir", + seeMore: "Voir plus", + showMore: "Afficher plus", + showLess: "Afficher moins", + noResults: "Aucun résultat", + tryAgain: "Réessayer", + learnMore: "En savoir plus", + getStarted: "Commencer", + yes: "Oui", + no: "Non", + or: "ou", + and: "et", + free: "Gratuit", + new: "Nouveau", + popular: "Populaire", + featured: "À la une", + verified: "Vérifié", + sats: "sats", + clear: "Effacer", + clearFilters: "Effacer les filtres", + clearAll: "Tout effacer", + hide: "Masquer", + undo: "Annuler", + }, + nav: { + home: "Accueil", + map: "Spots", + lab: "The Lab", + events: "Événements", + crews: "Crews", + wallet: "Portefeuille", + settings: "Paramètres", + more: "Plus", + rewards: "Récompenses", + stats: "Stats de la communauté", + about: "À propos", + food: "Restauration", + marketplace: "Marketplace", + mints: "Mints", + appShop: "Boutique de l'app", + diy: "DIY", + trades: "Marketplace", + stash: "Stash", + collections: "Collections", + contacts: "Contacts", + messages: "Messages", + skaters: "Skaters", + glossary: "Glossaire", + riderCard: "Rider Card", + supporters: "Soutiens ⚡", + newsletter: "Newsletter", + viewProfile: "Voir le profil", + leaderboards: "Classements", + }, + chromeUi: { + skipToContent: "Aller au contenu", + menu: "Menu", + inBadge: "Actif", + loggedIn: "Connecté", + profile: "Profil", + logIn: "Se connecter", + logOut: "Se déconnecter", + notLoggedIn: "Non connecté", + loggedOutPrompt: "Connectez-vous pour ajouter des spots, envoyer des zaps aux skaters et enregistrer vos favoris", + accounts: "Comptes", + addAnotherAccount: "Ajouter un autre compte", + setStatus: "Définir un statut", + setYourStatus: "Définissez votre statut", + status: "Statut", + addSpot: "Ajouter un spot", + myData: "Mes données", + myStash: "Mon Stash", + myCollections: "Mes collections", + viewMyProfile: "Voir mon profil", + customizeNavBar: "Personnaliser la barre de navigation", + ecash: "Ecash", + madeWith: "Fait avec", + forSkateCommunity: "pour la communauté du skate", + beta: "Bêta", + license: "Licence", + privacy: "Confidentialité", + collaborators: "Collaborateurs et amis", + notSponsoredBy: "Non sponsorisé par", + errorTitle: "Impossible de charger", + errorDescription: "La requête réseau a échoué. Vérifiez votre connexion et réessayez.", + tryAgain: "Réessayer", + weatherOn: "Météo activée", + weatherOff: "Météo désactivée", + trustFilter: "Filtre de confiance", + filterByTrustLevel: "Filtrer par niveau de confiance", + trust: { + all: "Tous les utilisateurs", + allDesc: "Afficher le contenu de tout le monde", + verified: "Vérifié", + verifiedDesc: "Vous les suivez ou ils sont vérifiés (confiance ≥90)", + trusted: "De confiance", + trustedDesc: "Amis d'amis ou vérifiés par NIP-05 (confiance ≥60)", + following: "Abonnements uniquement", + followingDesc: "Afficher uniquement le contenu des personnes que vous suivez", + followingShort: "Abonnements", + }, + sort: { + recent: "Plus récents", + recentDesc: "Les plus récents d'abord", + trust: "Confiance la plus élevée", + trustDesc: "Créateurs les plus dignes de confiance", + proximity: "Les plus proches de moi", + proximityDesc: "Lieux les plus proches", + popular: "Les plus populaires", + popularDesc: "Le plus de commentaires/réactions", + zaps: "Les plus zappés", + zapsDesc: "Valeur reçue la plus élevée", + }, + spotType: { + street: "Street", + transition: "Transition", + park: "Park", + plaza: "Plaza", + diy: "DIY", + bowl: "Bowl", + vert: "Vert", + indoor: "Indoor", + skatepark: "Skatepark", + miniramp: "Mini Ramp", + }, + }, + desktopNav: { + title: "Navigation du bureau", + desc: "Choisissez les onglets qui apparaissent dans la barre supérieure et leur ordre. Les onglets masqués restent dans le menu « Plus ».", + fixed: "Fixe", + shownInTopBar: "Affichés dans la barre supérieure ({{count}})", + noExtraTabs: "Aucun onglet supplémentaire affiché — tout est dans le menu « Plus ». Ajoutez-en ci-dessous.", + inMoreMenu: "Dans le menu « Plus » ({{count}})", + moveUp: "Déplacer {{name}} vers le haut", + moveDown: "Déplacer {{name}} vers le bas", + hide: "Masquer {{name}}", + moveToMore: "Déplacer vers le menu Plus", + show: "Afficher", + showInTopBar: "Afficher {{name}} dans la barre supérieure", + showInTopBarTitle: "Afficher dans la barre supérieure", + reset: "Réinitialiser par défaut", + }, + navSheet: { + title: "Personnalisez votre barre", + desc: "Choisissez les {{count}} onglets que vous utilisez le plus. Tout le reste reste dans le menu.", + preview: "Aperçu", + empty: "Vide", + order: "Ordre ({{done}}/{{total}})", + available: "Onglets disponibles", + full: "Barre pleine — retirez-en un pour échanger", + moveUp: "Déplacer {{name}} vers le haut", + moveDown: "Déplacer {{name}} vers le bas", + login: "Connexion", + profile: "Profil", + reset: "Réinitialiser", + done: "Terminé", + }, + pwa: { + installTitle: "Installer SkateSpots", + installSubtitle: "Profitez de l'expérience complète de l'app", + addToHomeScreen: "Ajouter à l'écran d'accueil", + installApp: "Installer l'app", + maybeLater: "Plus tard", + gotIt: "Compris !", + benefits: { + fast: "Ultra rapide", + offline: "Fonctionne hors ligne", + fullAccess: "Accès complet", + }, + iosStep1: "Appuyez sur le bouton Partager", + iosStep1Hint: "en bas de Safari", + iosStep2: "Faites défiler et appuyez sur « Ajouter à l'écran d'accueil »", + iosStep2Hint: "dans le menu de partage", + iosStep3: "Appuyez sur « Ajouter » pour installer", + iosStep3Hint: "L'app apparaîtra sur votre écran d'accueil", + androidStep1: "Appuyez sur le bouton de menu", + androidStep1Hint: "(trois points) dans votre navigateur", + androidStep2: "Sélectionnez « Ajouter à l'écran d'accueil »", + androidStep2Hint: "ou « Installer l'app »", + androidStep3: "Confirmez pour installer", + androidStep3Hint: "L'app apparaîtra sur votre écran d'accueil", + tagline: "Gratuit • Fonctionne hors ligne • Rapide et fiable", + }, + home: { + tagline: "Propulsé par la communauté • Basé sur les relays", + title: "SKATE SPOTS", + subtitle: "Découvrez des spots • Rencontrez-vous • Apprenez des tricks • Soutenez les locaux", + description: "Le vrai skate se passe hors ligne - cet outil vous aide à le trouver.", + betaWarning: "BÊTA - En construction • À utiliser à vos risques et périls", + pwaHint: "Progressive Web App - Installez-la sur votre appareil", + exploreMap: "Explorer la carte", + addSpot: "Ajouter un spot", + globalSpots: "Spots mondiaux", + openCommunity: "Communauté ouverte", + lightningZaps: "Zaps Lightning", + featuredSpots: "Spots à la une", + featuredSpotsDesc: "Spots de skate vérifiés par la communauté aux quatre coins du monde", + upcomingEvents: "Événements à venir", + upcomingEventsDesc: "Contests, rencontres et sessions bientôt au programme", + noSpotsYet: "Aucun spot trouvé pour l'instant", + noSpotsHint: "Soyez le premier à ajouter un spot de skate !", + noEventsYet: "Aucun événement à venir", + noEventsHint: "Revenez plus tard ou créez-en un !", + theLab: "The Lab", + theLabDesc: "Apprenez des tricks, trouvez des coachs et progressez sur votre skate", + coaches: "Coachs", + coachesDesc: "Apprenez auprès de skaters expérimentés qui peuvent vous aider à progresser", + filmers: "Filmeurs", + filmersDesc: "Connectez-vous avec des filmeurs pour capturer vos meilleurs clips", + findCoach: "Trouver un coach", + becomeCoach: "Devenir coach", + findFilmer: "Trouver un filmeur", + becomeFilmer: "Devenir filmeur", + viewAllSpots: "Voir tous les spots", + viewAllEvents: "Voir tous les événements", + createEvent: "Créer un événement", + readyToShare: "Prêt à partager ?", + readyToShareDesc: "Aidez la communauté du skate à grandir en ajoutant vos spots préférés. Chaque lieu que vous partagez aide d'autres skaters à découvrir de nouveaux endroits où rider.", + }, + about: { + title: "À propos de SkateSpots", + subtitle: "Une communauté de skate décentralisée", + whatIs: "Qu'est-ce que SkateSpots ?", + whatIsDesc: "SkateSpots est une plateforme propulsée par la communauté pour découvrir des spots de skate dans le monde entier. Construite sur Nostr, elle donne aux skaters la véritable propriété de leurs données.", + features: "Fonctionnalités", + featuresDesc: "Trouvez des spots, créez des événements, connectez-vous avec des coachs et soutenez vos skate shops locaux — le tout au même endroit.", + nostr: "Construit sur Nostr", + nostrDesc: "Nostr est un protocole simple et ouvert qui permet une communication mondiale véritablement résistante à la censure. Votre compte et vos données vous appartiennent.", + openSource: "Open Source", + openSourceDesc: "SkateSpots est entièrement open source. Contribuez, forkez ou hébergez votre propre instance.", + lightning: "Paiements Lightning", + lightningDesc: "Zappez vos skaters, coachs et créateurs de contenu préférés avec des paiements Bitcoin Lightning.", + }, + faq: { + title: "Questions fréquentes", + subtitle: "Tout ce que vous devez savoir sur SkateSpots", + whatIsNostr: "Qu'est-ce que Nostr ?", + whatIsNostrAnswer: "Nostr est un protocole ouvert pour des réseaux sociaux décentralisés. Contrairement aux plateformes traditionnelles, vos données et votre identité vous appartiennent.", + howToStart: "Comment démarrer ?", + howToStartAnswer: "Cliquez sur « S'inscrire » pour créer un nouveau compte Nostr, ou sur « Se connecter » si vous en avez déjà un. Vous pouvez utiliser une extension de navigateur, une app mobile ou une clé secrète.", + whatAreZaps: "Que sont les Zaps ?", + whatAreZapsAnswer: "Les Zaps sont des pourboires en Bitcoin Lightning que vous pouvez envoyer à d'autres utilisateurs. C'est une façon de montrer votre appréciation pour un bon contenu ou de soutenir des créateurs.", + howToAddSpot: "Comment ajouter un spot ?", + howToAddSpotAnswer: "Connectez-vous à votre compte, cliquez sur « Ajouter un spot » et remplissez les détails, notamment l'emplacement, les photos et la description.", + isItFree: "SkateSpots est-il gratuit ?", + isItFreeAnswer: "Oui ! SkateSpots est entièrement gratuit. Vous pouvez éventuellement envoyer des Zaps (pourboires en Bitcoin) à d'autres utilisateurs.", + canIEditSpot: "Puis-je modifier ou supprimer mes spots ?", + canIEditSpotAnswer: "Oui, vous pouvez modifier les spots que vous avez créés. En raison de la nature décentralisée de Nostr, les demandes de suppression sont envoyées, mais certains relays peuvent conserver les données.", + }, + onboarding: { + welcome: "Bienvenue sur SkateSpots !", + welcomeDesc: "Configurons tout ça en quelques étapes.", + step1Title: "Créez votre compte", + step1Desc: "Vos clés Nostr sont en cours de génération. C'est comme un mot de passe que vous contrôlez.", + step2Title: "Sauvegardez vos clés", + step2Desc: "Conservez votre phrase de récupération en lieu sûr. C'est le seul moyen de récupérer votre compte !", + step3Title: "Configurez votre profil", + step3Desc: "Parlez un peu de vous à la communauté.", + step4Title: "Vous êtes prêt !", + step4Desc: "Commencez à explorer les spots, les événements et à échanger avec d'autres skaters.", + skipForNow: "Passer pour l'instant", + continueToApp: "Continuer vers l'app", + }, +}; export default frBatch1; diff --git a/src/i18n/fr/batch2.ts b/src/i18n/fr/batch2.ts index 81c2aa6..982854a 100644 --- a/src/i18n/fr/batch2.ts +++ b/src/i18n/fr/batch2.ts @@ -1,4 +1,1652 @@ -/** fr — batch 2. Filled by the translation pass; empty until then. */ -const frBatch2 = {}; +/** fr — batch 2. Filled by the 2026-10-07 French translation pass. */ +const frBatch2 = { + mapUi: { + mapFooter: { + links: "Liens", + hide: "Masquer la barre de liens de la carte", + }, + findingSpots: "Recherche de spots", + loadingSpots: "Chargement des spots", + loadingMap: "Chargement de la carte...", + mapViewAria: "Vue carte", + listViewAria: "Vue liste", + layers: "Calques", + mapLayers: "Calques de la carte", + showOnMap: "Afficher sur la carte", + showResults: "Afficher les résultats", + quickActions: "Actions rapides", + spots: "Spots", + shops: "Skateshops", + gear: "Matériel", + tours: "Tours", + events: "Événements", + crews: "Crews", + spotType: "Type de spot", + sortBy: "Trier par", + trustLevel: "Niveau de confiance", + weather: "Météo", + buySellGear: "Acheter/Vendre du matériel", + stash: "Stash", + more: "Plus", + newHere: "Nouveau ici ?", + welcomeDesc: "Découvre des spots de skate, des événements et la communauté.", + getOnZapstore: "Sur Zapstore", + dismiss: "Ignorer", + addedBy: "Ajouté par", + directions: "Itinéraire", + viewDetails: "Voir les détails", + viewDetailsArrow: "Voir les détails →", + spotDetails: "Détails du spot", + skateShop: "Skateshop", + skateSpot: "Spot de skate", + youAreHere: "Vous êtes ici", + conditions: "Conditions", + weatherScoreSuffix: "{{score}}/100 météo", + wind: "Vent", + humidity: "Humidité", + airQuality: "Qualité de l'air", + threeDayForecast: "Prévisions sur 3 jours", + gearForSale: "Matériel à vendre ({{count}})", + viewItems: "Voir les articles →", + viewAllItems: "Voir les {{count}} articles →", + viewGear: "Voir le matériel →", + localTour: "Tour local", + meetAt: "Rendez-vous : {{place}}", + hours: "{{count}} heures", + level: "niveau {{level}}", + viewTour: "Voir le tour →", + upcomingEvent: "Événement à venir", + viewEvent: "Voir l'événement →", + skateCrew: "Crew de skate", + members: "{{count}} membres", + since: "Depuis {{year}}", + viewCrew: "Voir le crew →", + acceptsBitcoin: "Accepte Bitcoin", + boosted: "Boosté", + website: "Site web", + offlineSavedSpots: "Hors ligne · affichage des spots enregistrés", + cantReachRelays: "Impossible de joindre les relays", + relayOnlineNoAnswer: "Vous êtes en ligne, mais le relay de la communauté ne répond pas pour l'instant.", + youreOffline: "Vous êtes hors ligne.", + savedOnDevice: "Les spots que vous avez déjà vus sont enregistrés sur cet appareil et s'afficheront ici.", + noSpotsMatchTitle: "Aucun spot ne correspond", + noSpotsMatchDesc: "Essayez une autre recherche ou effacez vos filtres.", + noSpotsMappedYet: "Aucun spot encore cartographié", + noSpotsMappedDesc: "Soyez le premier à cartographier votre park — ça prend une minute, c'est le vôtre, et le prochain skateur qui passera vous remerciera.", + addFirstSpot: "Ajouter le premier spot", + findSpotsNearMe: "Trouver des spots près de moi", + locating: "Localisation…", + refiningLocation: "Affinage de votre position…", + refiningLocationDesc: "Centrée sur votre dernier spot — on peaufine un nouveau point GPS.", + locatingYou: "Localisation en cours…", + locatingDesc: "Obtention d'un point GPS. Cela peut prendre jusqu'à une minute la première fois.", + foundYou: "Vous êtes localisé", + foundYouDesc: "Carte centrée sur votre position.", + locationPermissionNeeded: "Autorisation de localisation requise", + permissionNeededDesc: "Autorisez la localisation pour SkateSpots dans les Réglages de votre appareil → Applications → SkateSpots → Autorisations, puis appuyez à nouveau sur Près de moi.", + locationTimedOut: "Délai de localisation dépassé", + timeoutNativeDesc: "Impossible d'obtenir un point GPS à temps. Si vous êtes à l'intérieur, le GPS ne voit pas les satellites — activez la localisation réseau (Réglages → Localisation) ou sortez, puis réessayez.", + timeoutWebDesc: "Impossible d'obtenir votre position à temps. Vérifiez votre signal et réessayez.", + noLocationProvider: "Aucun fournisseur de localisation", + noProviderNativeDesc: "Votre téléphone ne fournit pas de position. Sur les ROM axées sur la vie privée (ex. GrapheneOS), activez la localisation réseau dans Réglages → Localisation, ou assurez-vous que le GPS est activé et essayez en extérieur.", + noProviderWebDesc: "Aucun fournisseur de localisation n'est disponible. Activez les services de localisation et réessayez.", + locationUnavailable: "Localisation indisponible", + unavailableNativeDesc: "Activez la localisation/GPS dans les réglages de votre téléphone, autorisez la localisation pour SkateSpots (Réglages → Applications → SkateSpots → Autorisations), puis réessayez.", + unavailableWebDesc: "Votre position n'a pas pu être déterminée. Assurez-vous que les services de localisation sont activés.", + locationBlocked: "Localisation bloquée", + locationBlockedDesc: "Votre navigateur a bloqué l'accès à la localisation pour ce site. Voici comment le réactiver :", + locationPlatformAndroid: "Chrome Android", + locationPlatformIos: "Safari iOS", + locationPlatformDesktop: "Chrome bureau", + locationPlatformFirefox: "Firefox", + locationStepsAndroid: "Appuyez sur l'icône cadenas dans la barre d'adresse → Paramètres du site → Localisation → Autoriser", + locationStepsIos: "Réglages → Safari → Localisation → Autoriser (ou appuyez sur le bouton « AA » dans la barre d'adresse de Safari)", + locationStepsDesktop: "Cliquez sur l'icône cadenas → Paramètres du site → Localisation → Autoriser", + locationStepsFirefox: "Cliquez sur l'icône cadenas → Connexion sécurisée → Plus d'informations → Autorisations → Accéder à votre position → Autoriser", + gotIt: "Compris", + addSpot: "Ajouter un spot", + addShop: "Ajouter un skateshop", + addEvent: "Ajouter un événement", + addSpotHereTitle: "Ajouter un spot ici ?", + addSpotHereDesc: "Placez un repère là où vous avez appuyé", + sellGear: "Vendre du matériel", + offerTour: "Proposer un tour", + closeAddMenu: "Fermer le menu d'ajout", + addMenuAria: "Ajouter un spot, skateshop, événement, matériel ou tour", + localChat: "Chat local", + localChatDesc: "Chat en direct pour l'endroit où la carte est centrée. Choisissez la portée du canal.", + btcMapShowing: "Affichage de {{count}} lieux où vous pouvez Spedn vos sats à proximité", + btcMapShow: "Afficher les lieux où vous pouvez Spedn vos sats (via BTC Map)", + yourPrivateStash: "Votre Stash privé", + stashIntro: "Suivez votre matériel, fixez des prix et trouvez des échanges avec d'autres skateurs.", + encryptionRequired: "Chiffrement requis", + encryptionRequiredDesc: "Utilisez un signer compatible NIP-44 (Alby, nos2x, Amber).", + myStash: "Mon Stash", + encrypted: "Chiffré", + itemsCount: "{{count}} articles", + items: "Articles", + wishlist: "Liste d'envies", + types: "Types", + stashEmpty: "Votre Stash est vide", + addFirstItem: "Ajouter un premier article", + wishlistCount: "Liste d'envies ({{count}})", + myGearCount: "Mon matériel ({{count}})", + openFullStash: "Ouvrir le Stash complet", + addItem: "Ajouter un article", + searchSpotsPlaceholder: "Rechercher des spots...", + selected: "Sélectionné", + noSpotsFound: "Aucun spot trouvé. Essayez une autre recherche.", + addingSpotsHint: "Ajouter des spots aide les utilisateurs à vous trouver en parcourant des lieux précis", + report: "Signaler", + spotSingular: "1 spot", + spotPlural: "{{count}} spots", + view: "Voir", + myCollections: "Mes collections", + collectionsSubtitle: "Organisez vos spots favoris en listes personnalisées", + newCollection: "Nouvelle collection", + loginToCreate: "Connectez-vous pour créer des collections", + loginToCreateDesc: "Enregistrez vos spots favoris dans des listes personnalisées comme « Barcelone 2024 » ou « Meilleurs rails à LA »", + noCollections: "Aucune collection pour l'instant", + noCollectionsDesc: "Créez votre première collection pour commencer à organiser vos spots", + createFirstCollection: "Créez votre première collection", + createNewCollection: "Créer une nouvelle collection", + createCollectionDesc: "Donnez un nom et une description facultative à votre collection", + collectionName: "Nom de la collection", + collectionNamePlaceholder: "Barcelone 2024", + descriptionOptional: "Description (facultative)", + descriptionPlaceholder: "Mes spots préférés de mon voyage à Barcelone...", + creating: "Création...", + createCollection: "Créer la collection", + editCollection: "Modifier la collection", + saving: "Enregistrement...", + saveChanges: "Enregistrer les modifications", + deleteCollectionTitle: "Supprimer la collection ?", + deleteCollectionDesc: "Cela supprimera définitivement « {{title}} ». Les spots eux-mêmes ne seront pas affectés.", + deleting: "Suppression...", + collectionCreated: "Collection créée !", + collectionCreatedDesc: "« {{title}} » est prête à accueillir des spots", + collectionCreateFailed: "Échec de la création de la collection", + collectionUpdated: "Collection mise à jour !", + changesSaved: "Vos modifications ont été enregistrées", + collectionUpdateFailed: "Échec de la mise à jour de la collection", + collectionDeleted: "Collection supprimée", + collectionDeletedDesc: "« {{title}} » a été supprimée", + collectionDeleteFailed: "Échec de la suppression de la collection", + somethingWentWrong: "Une erreur est survenue", + }, + mapPage: { + title: "Skateshops & Spots", + spots: "Spots", + shops: "Skateshops", + filters: "Filtres", + listView: "Liste", + mapView: "Carte", + nearMe: "Près de moi", + searchPlaceholder: "Rechercher des spots...", + noSpotsInArea: "Aucun spot dans cette zone", + zoomIn: "Zoom avant", + zoomOut: "Zoom arrière", + myLocation: "Ma position", + locationsFound: "{{count}} lieux trouvés", + spotsOnly: "Spots uniquement", + shopsOnly: "Skateshops uniquement", + spotsAndShops: "Spots & Skateshops", + noSpotsMatch: "Aucun spot ne correspond à vos filtres.", + noSpotsYet: "Aucun spot n'a encore été ajouté.", + addFirstSpot: "Ajouter le premier spot", + }, + spotUi: { + claim: { + areYouOwner: "C'est votre spot ?", + privateDesc: "Ce spot est marqué privé. Si vous le possédez ou le gérez, revendiquez-le — un modérateur SkateSpots confirme la propriété, puis vous reprenez l'annonce.", + claimSpot: "Revendiquer ce spot", + nip05Required: "Vous avez besoin d'un identifiant NIP-05 vérifié pour revendiquer un spot privé (preuve que vous contrôlez une identité Nostr). Ajoutez-en un dans votre profil, puis revenez.", + addNip05: "Ajouter un NIP-05 dans les réglages", + pendingTitle: "Revendication en attente de révision", + pendingDesc: "Votre revendication a été soumise. Un modérateur SkateSpots l'examinera — vous pourrez finaliser la revendication du spot une fois approuvée.", + approvedTitle: "Revendication approuvée", + approvedDesc: "Un modérateur a approuvé votre revendication. Finalisez pour devenir propriétaire de ce spot.", + complete: "Finaliser la revendication", + submitted: "Revendication soumise", + submittedDesc: "Un modérateur examinera votre revendication. Vous prendrez le contrôle du spot une fois approuvée.", + submitFailed: "Impossible de soumettre la revendication", + submit: "Soumettre la revendication", + submitting: "Envoi…", + confirmTitle: "Revendiquer « {{title}} » ?", + confirmIntro: "Vous demandez à devenir propriétaire de ce spot privé.", + confirmBullet1: "Un modérateur SkateSpots examine la demande (nous ne pouvons pas vérifier la propriété, seulement les clés Nostr)", + confirmBullet2: "Si approuvé, vous finalisez la revendication pour devenir propriétaire et pourrez modifier le spot", + confirmBullet3: "Le spot d'origine reste sur Nostr — le réseau est décentralisé", + adminTitle: "Revendications de propriété en attente", + adminApprove: "Approuver", + adminApproved: "Approuvé", + adminApprovedDesc: "Ils peuvent maintenant finaliser la revendication du spot.", + adminApproveFailed: "Impossible d'approuver la revendication", + loginRequired: "Connectez-vous pour revendiquer ce spot privé, ou pour demander la propriété.", + }, + abandonedDesc: "Dernière mise à jour {{time}}. Si le propriétaire d'origine est inactif, vous pouvez revendiquer ce spot pour l'entretenir et l'améliorer.", + claimedNotice: "Annonce revendiquée", + claimedNoticeDesc: "Ce spot a été republié par un nouveau propriétaire après une revendication. L'annonce d'origine peut encore exister séparément.", + abandonedLoginDesc: "Dernière mise à jour {{time}}. Connectez-vous pour revendiquer et entretenir ce spot.", + accessDeniedDesc: "Vous ne pouvez modifier que les spots que vous avez créés.", + accessDeniedTitle: "Accès refusé", + addAtLeastOneTag: "Veuillez ajouter au moins un tag.", + additionalDetails: "Détails supplémentaires (facultatif)", + additionalDetailsPlaceholder: "Fournissez tout contexte supplémentaire qui pourrait aider...", + addNewTags: "Ajouter de nouveaux tags :", + addNip05InSettings: "Ajouter un NIP-05 dans les réglages", + addPhoto: "Ajouter une photo", + addPhotoDesc: "Contribuez une photo pour aider les autres à découvrir ce spot.", + addPhotoOrDescription: "Ajoutez une photo ou une description", + addPhotoOrDescriptionDesc: "Donnez aux skateurs de quoi se faire une idée — une photo, ou une ligne sur l'endroit.", + addPhotos: "Ajouter des photos", + addPhotoToSpot: "Ajouter une photo au spot", + adminDeleteDialogDesc: "En tant qu'admin SkateSpots, vous retirez « {{title}} ». Il sera masqué dans toute l'app pour tout le monde et une demande de suppression sera envoyée aux relays.", + adminDeleteReason: "L'admin SkateSpots a supprimé le spot « {{title}} »", + airQuality: "Qualité de l'air", + altSkateSpot: "Spot de skate : {{title}}", + areYouShopOwner: "Êtes-vous le propriétaire du skateshop ?", + askBeforeSkating: "Demandez avant de skater", + backToSpot: "Retour au spot", + beFirstToListGear: "Soyez le premier à lister du matériel sur ce spot !", + beFirstToSay: "Soyez le premier à dire quelque chose.", + byAuthor: "par {{name}}", + captionPlaceholder: "Ajoutez une légende (facultatif) - décrivez ce que montre la photo, quand elle a été prise, etc.", + chatPublicNote: "Tout le monde peut lire ceci — les messages sont publics et éphémères. Pour des chats privés, utilisez les messages directs.", + checkPinBelow: "Vérifiez le repère ci-dessous avant d'ajouter un doublon.", + claimBullet1: "Vous devenez propriétaire et pouvez modifier le spot", + claimBullet2: "Le spot d'origine reste (Nostr est décentralisé)", + claimBullet3: "Votre version peut apparaître à côté de l'originale", + claimFailed: "Échec de la revendication", + claiming: "Revendication...", + claimIntro: "Vous êtes sur le point de revendiquer la propriété de ce spot. Cela créera votre propre version du spot que vous pourrez modifier et entretenir.", + claimSpot: "Revendiquer le spot", + claimThisSpot: "Revendiquer ce spot", + claimTitle: "Revendiquer « {{title}} » ?", + claimWhatHappens: "Ce qui se passe quand vous revendiquez :", + coachesAndFilmersAvailable: "Coachs et filmeurs disponibles sur ce spot", + coachesCount: "Coachs ({{count}})", + coachHere: "Coach ici", + community: "Communauté", + communityVerified: "Vérifié par la communauté", + communityVerifiedTitle: "Un autre skateur a contribué ici (photo ou rapport de statut).", + conditions: "Conditions", + contactForPermission: "Contacter pour la permission", + contactInfo: "Coordonnées", + contributePhoto: "Contribuer une photo", + contributing: "Contribution...", + couldNotSendMessage: "Impossible d'envoyer le message.", + couldNotSubmit: "Impossible de soumettre", + couldNotUploadPhoto: "Impossible de téléverser la photo. Vous pouvez en ajouter une ci-dessous.", + crewsThatSkateHere: "Crews qui skatent ici", + current: "Actuel :", + currentTags: "Tags actuels sur ce spot :", + daysAgo: "il y a {{count}} jour", + daysAgoPlural: "il y a {{count}} jours", + deleteDialogDesc: "Cela supprimera définitivement « {{title}} » de tous les relays. Cette action est irréversible.", + deletedSpotReason: "Spot supprimé", + deleteFailed: "Échec de la suppression", + deleteSpot: "Supprimer le spot", + deleteSpotTitle: "Supprimer le spot ?", + differentSpotPublishAnyway: "C'est un spot différent — publier quand même", + dragDropOrClick: "Glissez-déposez ou cliquez", + dropPhotos: "Déposez les photos", + duplicateOne: "Il y a un spot à moins de 60 m de votre repère. S'il s'agit du même endroit, ajoutez plutôt votre photo ou un rapport de statut là-bas au lieu de créer un doublon.", + duplicateOther: "Il y a des spots à moins de 60 m de votre repère. S'il s'agit du même endroit, ajoutez plutôt votre photo ou un rapport de statut là-bas au lieu de créer un doublon.", + editSpotSeoDesc: "Modifiez votre spot de skate.", + failedToContribute: "Échec de la contribution", + failedToPublish: "Échec de la publication", + failedToPublishDesc: "Une erreur est survenue. Consultez la console pour plus de détails.", + failedToSubmitReport: "Échec de l'envoi du signalement", + failedToSuggestTags: "Échec de la suggestion de tags", + failedToUpdate: "Échec de la mise à jour", + failedToUploadImage: "Échec du téléversement de l'image", + failedToUploadPhoto: "Échec du téléversement de la photo", + feelsLikeTemp: "Ressenti {{temp}}°C", + filmersCount: "Filmeurs ({{count}})", + filmHere: "Filmer ici", + gearSwap: "Échange de matériel", + geolocationNotSupported: "Géolocalisation non prise en charge", + geolocationNotSupportedDesc: "Votre navigateur ne prend pas en charge la géolocalisation.", + getDirections: "Obtenir l'itinéraire", + hangTight: "Un instant", + hangTightDesc: "Votre photo est encore en cours de téléversement. Elle sera jointe dans un instant.", + helpImproveSpot: "Aidez à améliorer ce spot en ajoutant des photos ou en suggérant des tags", + hiddenByModerator: "Masqué par un modérateur", + hiddenByModeratorDesc: "Ce spot n'apparaît pas sur la carte ni dans la recherche. Vous pouvez encore le voir car il est à vous. Le modifier ne le rendra pas visible — il reste masqué jusqu'à ce qu'un modérateur annule le verdict.", + humidity: "Humidité", + imageUploaded: "Image téléversée", + imageUploadedDesc: "Votre image a été téléversée avec succès.", + imHere: "Je suis là", + invalidCoordinates: "Coordonnées invalides", + invalidCoordinatesDesc: "Veuillez saisir une latitude (-90 à 90) et une longitude (-180 à 180) valides.", + invalidNpub: "npub invalide", + invalidNpubDesc: "Veuillez saisir une adresse npub valide.", + lastReported: "dernier {{time}}", + listGear: "Lister du matériel", + listYourGearHere: "Listez votre matériel ici", + loadingChat: "Chargement du chat…", + locationError: "Erreur de localisation", + locationFound: "Position trouvée", + locationFoundDesc: "Votre position actuelle a été définie.", + locationRequired: "Localisation requise", + locationRequiredDesc: "Veuillez saisir des coordonnées ou utiliser votre position actuelle.", + loginRequiredTitle: "Connexion requise", + logInToChat: "Connectez-vous pour rejoindre le chat local.", + logInToContributePhotos: "Connectez-vous pour contribuer des photos", + loginToEditSpot: "Vous devez vous connecter pour modifier ce spot.", + logInToReport: "Vous devez être connecté pour signaler du contenu.", + logInToReportStatus: "Connectez-vous pour signaler le statut de ce spot.", + logInToSuggestTags: "Connectez-vous pour suggérer des tags", + manageNip05ToClaim: "Gérer le NIP-05 pour revendiquer", + meetAtSpotForPickup: "💡 Rendez-vous sur ce spot pour un échange en sécurité", + memberOne: "{{count}} membre", + memberOther: "{{count}} membres", + messageFailed: "Échec du message", + messageMapper: "Mapper de messages", + messagePlaceholder: "Envoyez un message à ce spot… (essayez /me ou /who)", + messagesHiddenOne: "{{count}} message masqué par votre filtre de confiance. Abaissez le filtre pour en voir plus.", + messagesHiddenOther: "{{count}} messages masqués par votre filtre de confiance. Abaissez le filtre pour en voir plus.", + messagesHiddenShortOne: "{{count}} message masqué par votre filtre de confiance", + messagesHiddenShortOther: "{{count}} messages masqués par votre filtre de confiance", + metresAway: "à {{distance}} m", + moderatorVouchedDesc: "Un modérateur a examiné ce spot et s'est porté garant. Bien joué.", + monthsAgo: "il y a {{count}} mois", + monthsAgoPlural: "il y a {{count}} mois", + newOwnerNpub: "npub du nouveau propriétaire", + newOwnerNpubHint: "Saisissez le npub de l'utilisateur à qui vous voulez transférer ce spot.", + nip05RequiredToClaim: "⚠️ Vérification NIP-05 requise pour revendiquer des skateshops", + noCommunitySignalTitle: "Aucune photo communautaire ni rapport de statut pour l'instant — personne n'a confirmé cet endroit.", + breakdownPhotos: "{{count}} photo(s)", + breakdownStatus: "{{count}} rapport(s) de statut", + breakdownComments: "{{count}} commentaire(s)", + breakdownReactions: "{{count}} réaction(s)", + breakdownCollections: "{{count}} enregistrement(s)", + breakdownZaps: "{{count}} zap(s)", + breakdownTags: "{{count}} suggestion(s) de tag", + breakdownCrews: "{{count}} crew(s)", + breakdownLab: "{{count}} lien(s) pro", + verifyNudgeTitle: "Soyez le premier à confirmer ce spot", + verifyNudgeBody: "Une photo ou un « j'ai skaté ici » est la façon dont un spot est vérifié — aidez le prochain skateur.", + verifyNudgeStatus: "J'ai skaté ici", + communityChip: "Communauté", + seenChip: "Vu", + noGearListedYet: "Aucun matériel listé pour l'instant", + noMessagesYet: "Aucun message dans ce canal local pour l'instant. Dites bonjour — « quelqu'un skate ce soir ? »", + noPhoto: "Aucune photo", + noReportsYet: "Aucun signalement pour l'instant", + noTags: "Aucun tag", + notASkateSpot: "Pas un spot de skate", + offerServicesHere: "💡 Proposez vos services sur ce spot", + photoCaptured: "Photo capturée !", + photoCapturedDesc: "Votre photo a été téléversée avec succès.", + photoContributed: "Photo contribuée !", + photoContributedDesc: "Votre photo a été ajoutée à ce spot.", + photosAdded: "Vos photos ont été ajoutées.", + photosRecommended: "fortement recommandé — les spots sans photo restent marqués Non vérifié", + photosUploaded: "{{count}} photos téléversées", + photoUploaded: "Photo téléversée", + photoUploadedDesc: "Ajoutez une légende et soumettez pour contribuer !", + photoUploadFailed: "Échec du téléversement de la photo", + pleaseTryAgain: "Veuillez réessayer", + public: "Public", + publicChatTitle: "Tout le monde peut lire les messages de ce canal — il est public et non chiffré.", + recentReports: "Signalements récents", + recipientRequired: "Destinataire requis", + recipientRequiredDesc: "Veuillez saisir le npub du nouveau propriétaire.", + removeAdmin: "Retirer (admin)", + removeSpot: "Retirer le spot", + removeSpotAdminTitle: "Retirer ce spot ? (admin)", + reportOne: "signalement", + reportContent: "Signaler le contenu", + reportContentDesc: "Aidez à garder la communauté sûre en signalant les contenus inappropriés.", + reportedBySkaters: " par {{count}} skateurs — en cours d'examen. Si c'est un vrai spot, ajoutez une photo ou un rapport de statut pour le confirmer.", + reportedNotASpot: "Signalé comme n'étant pas un spot de skate", + reportingType: "Signalement de {{type}}", + reports: "signalements", + reportShop: "Signaler le skateshop", + reportSpot: "Signaler le spot", + reportStatus: "Signaler le statut", + reportSubmitted: "Signalement envoyé", + reportSubmittedDesc: "Merci d'aider à garder SkateSpots sûr.", + reportSubmittedLong: "Merci d'aider à garder SkateSpots sûr et exact. Votre signalement sera examiné par des membres de confiance de la communauté.", + reportSubmittedTitle: "Signalement envoyé", + report: { + notASkateSpot: { + label: "Pas un spot de skate", + description: "Une entrée de test, ou un lieu qui n'est pas du tout destiné au skate", + }, + fakeSpot: { + label: "Spot faux/inexistant", + description: "Ce spot n'existe pas ou la localisation est erronée", + }, + stolenPhotos: { + label: "Photos volées/fausses", + description: "Les photos sont des images de banque ou volées ailleurs", + }, + spamAd: { + label: "Spam ou publicité", + description: "Contenu promotionnel ou annonces en double", + }, + dangerousLocation: { + label: "Lieu dangereux", + description: "Propriété privée, dangereuse ou accès illégal", + }, + inappropriateContent: { + label: "Contenu inapproprié", + description: "Contient du contenu offensant ou pour adultes", + }, + impersonation: { + label: "Usurpation d'identité", + description: "Quelqu'un se fait passer pour quelqu'un d'autre", + }, + other: { + label: "Autre", + description: "Autre chose non listée ci-dessus", + }, + }, + targetType: { + spot: "Spot", + event: "Événement", + tour: "Tour", + shop: "Skateshop", + user: "Utilisateur", + listing: "Annonce", + coach: "Coach", + filmer: "Filmeur", + }, + sameOwner: "Même propriétaire", + sameOwnerDesc: "Impossible de transférer au propriétaire actuel.", + saveChanges: "Enregistrer les modifications", + saving: "Enregistrement...", + services: "Services", + shareSpotText: "Regarde ce spot de skate : {{title}}", + shelter: "Abri", + shelterHint: "Ce spot est-il exposé à la météo ? Aide les skateurs à trouver des spots secs quand il pleut.", + shopClaimDesc: "Si vous possédez ou gérez ce skateshop, vous pouvez le revendiquer pour vérifier la propriété et gérer l'annonce.", + shopClaimNip05Hint: "Pour revendiquer ce skateshop, ajoutez un identifiant NIP-05 correspondant au domaine du site du shop.", + skatersActiveDesc: "Personnes ayant publié dans ce canal au cours des dernières 24 h.", + skatersActiveOne: "{{count}} skateur actif ici", + skatersActiveOther: "{{count}} skateurs actifs ici", + skatersSellingGear: "Des skateurs sur ce spot vendent du matériel", + skateSpot: "Spot de skate", + somethingWentWrong: "Une erreur est survenue", + spot: "Spot", + spotAdded: "Spot ajouté !", + spotAddedDesc: "Votre spot de skate a été publié sur le réseau.", + spotAddedNoPhoto: "Publié — et marqué Non vérifié jusqu'à ce que quelqu'un ajoute une photo. Une photo du spot change tout.", + spotChat: "Chat du spot", + spotClaimed: "Spot revendiqué !", + spotClaimedDesc: "Vous êtes maintenant propriétaire de ce spot. Vous pouvez le modifier depuis votre profil.", + spotDeleted: "Spot supprimé", + spotDeletedDesc: "Demande de suppression envoyée aux relays. La plupart des relays retireront ce contenu.", + spotMayAlreadyBeOnMap: "Ce spot est peut-être déjà sur la carte", + spotMayAlreadyExist: "Ce spot existe peut-être déjà", + spotMayBeAbandoned: "Le spot est peut-être abandonné", + spotPhotoAlt: "Spot", + spotRemoved: "Spot retiré", + spotRemovedDesc: "Ce spot a été retiré et sera masqué dans tout SkateSpots.", + spotSeoDesc: "Consultez ce spot de skate sur SkateSpots.", + spotStatus: "Statut du spot", + spotStatusDesc: "« {{title}} » est-il encore skatable ? Informez la communauté de son état actuel.", + spotTypeRequired: "Type de spot requis", + spotTypeRequiredDesc: "Veuillez choisir un type de spot pour que les skateurs sachent sur quoi ils tombent.", + spotUpdated: "Spot mis à jour !", + spotUpdatedDesc: "Vos modifications ont été publiées sur le réseau.", + staffVerifiedTitle: "Un admin SkateSpots a examiné et garanti ce spot.", + statusNotePlaceholder: "Facultatif : ajoutez des détails (ex. « nouveaux embouts sur le ledge », « le gardien chasse à partir de 18 h »)", + statusReported: "Statut signalé", + statusReportedDesc: "Merci de garder la carte à jour. Votre rapport est en ligne.", + submitReport: "Envoyer le signalement", + submitting: "Envoi...", + suggestedByUser: "Suggéré par {{count}} utilisateur", + suggestedByUsers: "Suggéré par {{count}} utilisateurs", + suggestedTagsContent: "Tags suggérés pour {{title}} : {{tags}}", + suggestNTags: "Suggérer {{count}} tags", + suggestOneTag: "Suggérer 1 tag", + suggestTags: "Suggérer des tags", + suggestTagsDesc: "Aidez à catégoriser ce spot en suggérant des tags pertinents.", + tags: "Tags", + tagsHint: "Ajoutez des tags pour les caractéristiques, surfaces, ambiances (max {{max}})", + tagsSuggested: "Tags suggérés !", + tagsSuggestedDesc: "Vos suggestions de tags ont été soumises.", + takePhoto: "Prendre une photo", + threeDayForecast: "Prévisions sur 3 jours", + tipTheMapper: "Zapper le mapper", + tipTheMapperDesc: "Ce spot vous a été utile ? Envoyez un zap pour remercier le mapper !", + titleRequired: "Titre requis", + titleRequiredDesc: "Veuillez saisir un nom pour ce spot.", + today: "Aujourd'hui", + tomorrow: "Demain", + transferDesc: "Transférer « {{title}} » à un autre utilisateur. Cette action est irréversible.", + transferFailed: "Échec du transfert", + transferOwnership: "Transférer la propriété", + transferRequestContent: "Demande de transfert de propriété pour le spot « {{title}} »", + transferRequested: "Transfert demandé", + transferRequestedDesc: "Le nouveau propriétaire devra revendiquer le spot pour finaliser le transfert.", + transferring: "Transfert...", + transferSpotOwnership: "Transférer la propriété du spot", + transferWarningDesc: "Après le transfert, vous ne pourrez plus modifier ni supprimer ce spot.", + typeToSearchTags: "Tapez pour rechercher ou ajouter des tags...", + underReview: " — en cours d'examen. Si c'est un vrai spot, ajoutez une photo ou un rapport de statut pour le confirmer.", + untitledSpot: "Spot sans titre", + unverified: "Non vérifié", + updateDetailsFor: "Mettez à jour les détails de {{title}}", + updateSpotDesc: "Mettez à jour les informations de ce spot. Tous les champs marqués d'un * sont obligatoires.", + uploadAPhoto: "Téléverser une photo", + uploadAPhotoHint: "Glissez-déposez ou cliquez · JPG, PNG, WebP", + uploadedAlt: "Téléversé", + uploadFailed: "Échec du téléversement", + uploadingPhoto: "Téléversement de la photo…", + uploadPhotoFirst: "Veuillez d'abord téléverser une photo.", + uvIndex: "Indice UV", + verifiedBySkateSpots: "Vérifié par SkateSpots", + viewPhotoFullScreen: "Voir la photo en plein écran", + viewPhotoOf: "Voir la photo {{n}} sur {{total}}", + warning: "Avertissement", + weatherConditions: "Conditions météo", + weatherOnly: "météo uniquement", + weatherOnlyUnconfirmed: "Météo uniquement. Personne n'a encore confirmé qu'il s'agit d'un spot de skate, donc il n'y a pas de score de conditions — ajoutez une photo ou un rapport de statut pour le confirmer.", + whyReporting: "Pourquoi signalez-vous ceci ?", + wind: "Vent", + yearsAgo: "il y a {{count}} an", + yearsAgoPlural: "il y a {{count}} ans", + }, + diyUi: { + title: "DIY — Fais-le toi-même", + tagline: "Guides, outils ouverts et plans pour fabriquer tes propres decks, rampes et spots en béton — puis trouve les personnes, les lieux et le marché qui vont avec.", + doItWithPeople: "Fais-le avec d'autres", + backToDiy: "Retour au DIY", + calc: { + title: "Calculateur de coût de deck", + intro: "Ce que coûte la fabrication d'un deck — main-d'œuvre, équipement, matériaux, temps de process, emballage et marge — et un prix de vente juste. Enregistré sur cet appareil.", + }, + designer: { + title: "Conception de deck", + intro: "Dessinez le contour d'un skateboard ou d'un longboard, puis exportez un gabarit 1:1 imprimable, un SVG ou un DXF pour CNC. Enregistré sur cet appareil.", + presets: "Préréglages", + dimensions: "Dimensions", + shape: "Forme", + kicks: "Kicks", + hardware: "Trous de trucks", + width: "Largeur max", + wheelbase: "Empattement", + nose: "Longueur du nose", + tail: "Longueur du tail", + length: "Longueur totale", + waist: "Taille", + endRound: "Arrondi des extrémités", + concave: "Concave", + thickness: "Épaisseur", + tailKick: "Kick du tail", + noseKick: "Kick du nose", + holeNew: "New school (2.125″)", + holeOld: "Old school (2.5″)", + holeSpacing: "Le new school, c'est 2.125″ × 1.625″ (54 × 41 mm) ; le old school, 2.5″ × 1.625″. Trous de fixation 3/16″.", + topView: "Vue de dessus", + sideView: "Profil latéral", + concaveSection: "Coupe concave", + export: "Exporter", + pdfA4: "PDF 1:1 · A4", + pdfLetter: "PDF 1:1 · Letter", + printNote: "Imprimez le PDF à 100 % (pas de « ajuster à la page »), puis assemblez les feuilles à l'aide des croix d'angle. Le SVG est aussi à l'échelle réelle.", + note: "Ceci est le contour 2D que vous tracez et découpez. Pour des formes 3D complètes et la conception de moules, un vrai outil de CAO reste le bon choix.", + }, + source: "Source", + comingSoon: "Bientôt disponible", + footer: "Des guides pas à pas arrivent. En attendant : trouve les personnes qui fabriquent dans The Lab, cartographie ton spot, et achète ou vends sur le Marketplace. Travaille en sécurité — protections, gants et lunettes.", + categories: { + boards: "Planches", + ramps: "Rampes & obstacles en bois", + concrete: "Béton & spots DIY", + repairs: "Réparations & réglages", + tools: "Outils & plans", + }, + cards: { + ossBuild: { + title: "Fabriquer un skateboard", + blurb: "Fabrication de deck pas à pas — placage, moules, presses et finition.", + }, + sk8cad: { + title: "SK8CAD", + blurb: "CAO open source pour les formes de deck, la concave et la conception de moules.", + }, + deckCost: { + title: "Coût & prix du deck", + blurb: "Calculez matériaux, main-d'œuvre et un prix de vente juste avant de fabriquer.", + }, + deckDesigner: { + title: "Conception de deck", + blurb: "Dessinez un contour et imprimez un gabarit 1:1 — ou exportez SVG/DXF pour CNC.", + }, + ledgeBox: { + title: "Fabriquer un ledge ou un box", + blurb: "Un obstacle en bois accessible aux débutants, à construire en un week-end.", + }, + quarterpipe: { + title: "Fabriquer un quarterpipe", + blurb: "Plans de rampe, transition et coping pour un mini de jardin.", + }, + flatbar: { + title: "Fabriquer une flatbar", + blurb: "Pas cher, portable et la meilleure façon d'apprendre les rails.", + }, + concreteBasics: { + title: "Bases du béton", + blurb: "Mélange, coffrage et finition d'un ledge ou d'une bank qui dure.", + }, + coping: { + title: "Coping & bords", + blurb: "Comment poser un coping et finir une transition pour un grind fluide.", + }, + buyParts: { + title: "Acheter pièces & matériel", + blurb: "Procurez-vous decks, visserie et outils auprès de vendeurs sur le Marketplace.", + }, + mapSpot: { + title: "Cartographier votre spot DIY", + blurb: "Vous avez construit quelque chose ? Ajoutez-le à la carte pour que les autres puissent le trouver et le skater.", + }, + regrip: { + title: "Regripper une planche", + blurb: "Retirez le vieux grip et posez proprement un nouveau grip.", + }, + tune: { + title: "Régler les bearings & trucks", + blurb: "Nettoyez les bearings, changez les bushings et réglez la géométrie de vos trucks.", + }, + printMolds: { + title: "Moules imprimés en 3D", + blurb: "Fichiers de moules et de bases d'alignement imprimables de la communauté.", + }, + sk8cadTools: { + title: "Outils de moule & d'alignement", + blurb: "Concevez des moules avec bases d'alignement intégrées.", + }, + }, + actions: { + findBuilder: { + title: "Trouver un constructeur", + blurb: "Constructeurs de rampes et DIY dans The Lab qui peuvent concevoir ou couler pour vous.", + }, + findCrew: { + title: "Trouver un crew DIY", + blurb: "Des crews axés sur la construction — rejoignez ceux qui transforment les spots en réalité.", + }, + mapSpot: { + title: "Cartographier un spot DIY", + blurb: "Ajoutez le spot que vous avez construit pour qu'il vive sur la carte.", + }, + sellBuilds: { + title: "Vendre vos créations", + blurb: "Listez decks, rampes ou pièces que vous fabriquez sur le Marketplace.", + }, + findCoach: { + title: "Trouver un coach", + blurb: "Des coachs qui enseignent les modules DIY et la construction de spots.", + }, + }, + }, + labelsUi: { + spotCategory: { + street: { + label: "Street", + description: "Spots trouvés au hasard, terrain urbain", + }, + transition: { + label: "Transition", + description: "Surfaces courbes/en rampe", + }, + park: { + label: "Park", + description: "Skateparks construits", + }, + plaza: { + label: "Plaza", + description: "Plazas urbaines (comme MACBA, Love Park)", + }, + }, + spotFeature: { + wallrides: "Wallrides", + stairs: "Escaliers & handrails", + rails: "Rails", + ledges: "Ledges & bordures", + gaps: "Gaps", + flatground: "Flatground", + "manual-pads": "Manual Pads", + "half-pipes": "Half Pipes", + "quarter-pipes": "Quarter Pipes", + "mini-ramps": "Mini Ramps", + bowls: "Bowls", + vert: "Vert Ramps", + "mega-ramps": "Mega Ramps", + hubbas: "Hubbas", + "euro-gaps": "Euro Gaps", + banks: "Banks", + "spine-ramps": "Spine Ramps", + "roll-ins": "Roll-ins", + hips: "Hips", + volcano: "Volcano", + pyramids: "Pyramids / Funboxes", + "snake-runs": "Snake Runs", + "pump-track": "Pump Track Rollers", + "flat-bars": "Flat Bars", + }, + spotType: { + street: "Street", + transition: "Transition", + park: "Park", + plaza: "Plaza", + wallrides: "Wallrides", + stairs: "Escaliers & handrails", + rails: "Rails", + ledges: "Ledges & bordures", + gaps: "Gaps", + flatground: "Flatground", + "manual-pads": "Manual Pads", + "half-pipes": "Half Pipes", + "quarter-pipes": "Quarter Pipes", + "mini-ramps": "Mini Ramps", + bowls: "Bowls", + vert: "Vert Ramps", + "mega-ramps": "Mega Ramps", + hubbas: "Hubbas", + "euro-gaps": "Euro Gaps", + banks: "Banks", + "spine-ramps": "Spine Ramps", + "roll-ins": "Roll-ins", + hips: "Hips", + volcano: "Volcano", + pyramids: "Pyramids / Funboxes", + "snake-runs": "Snake Runs", + "pump-track": "Pump Track Rollers", + "flat-bars": "Flat Bars", + diy: "DIY", + rail: "Rail", + ledge: "Ledge", + gap: "Gap", + bowl: "Bowl", + stall: "Stall", + slappy: "Slappy", + }, + access: { + public: { + label: "Public - Ouvert à tous", + }, + private: { + label: "Propriété privée - Permission requise", + }, + locals: { + label: "Demandez d'abord aux locaux", + }, + }, + shelter: { + outdoor: { + label: "Extérieur", + short: "Extérieur", + description: "Entièrement exposé — la pluie arrête le jeu", + }, + partial: { + label: "Partiellement couvert", + short: "Partiellement couvert", + description: "Certains obstacles restent au sec", + }, + covered: { + label: "Couvert / sous toit", + short: "Couvert", + description: "Extérieur mais sous un toit", + }, + indoor: { + label: "Intérieur", + short: "Intérieur", + description: "Entièrement clos — skate par tous les temps", + }, + }, + eventType: { + contest: "Contest", + demo: "Demo", + session: "Session", + workshop: "Atelier", + premiere: "Première", + tradeshow: "Salon professionnel", + gameskate: "Game of Skate", + concert: "🎸 Concert", + jam: "🎵 Jam", + festival: "🎪 Festival", + popup: "🎯 Pop-Up", + }, + gearCategory: { + deck: "Deck", + trucks: "Trucks", + wheels: "Wheels", + bearings: "Bearings", + shoes: "Chaussures de skate", + clothing: "Vêtements", + protective: "Protections", + stickers: "Stickers", + wax: "Wax", + tools: "Outils", + griptape: "Griptape", + rubbrick: "Rub Brick", + }, + gearCondition: { + new: { + label: "Neuf", + description: "Jamais utilisé, encore emballé", + }, + like_new: { + label: "Comme neuf", + description: "À peine utilisé, excellent état", + }, + good: { + label: "Bon", + description: "Usure normale, fonctionne parfaitement", + }, + well_used: { + label: "Très usé", + description: "Montre de l'usure mais fonctionne encore", + }, + }, + priceType: { + fixed: { + label: "Prix fixe", + description: "Prix défini en USD ou en sats", + }, + free: { + label: "Gratuit", + description: "Donné", + }, + trade: { + label: "Échange", + description: "Cherche à troquer", + }, + offer: { + label: "Faire une offre", + description: "Prix négociable", + }, + }, + listingType: { + selling: { + label: "En vente", + description: "Matériel mis en vente", + }, + wtb: { + label: "Recherché", + description: "Recherche du matériel précis", + }, + }, + tour: { + spotType: { + street: "Street", + park: "Park", + diy: "DIY", + transition: "Transition", + hidden: "Pépites cachées", + }, + category: { + local: { + label: "Tour local", + description: "Montrez des spots cachés dans votre ville", + }, + national: { + label: "Tour national", + description: "Road trips multi-villes à travers le pays", + }, + international: { + label: "Tour international", + description: "Aventures transfrontalières dans plusieurs pays", + }, + destruction: { + label: "World Destruction", + description: "Compétition mondiale d'équipes façon KOTR", + }, + }, + }, + crew: { + vibe: { + street: "Street", + transition: "Transition / Vert", + park: "Park", + diy: "DIY", + cruising: "Cruising / Filming", + oldschool: "Old School", + allterrain: "Tout terrain", + girls: "Fille / Femme", + youth: "Jeunes / Groms", + adaptive: "Adapté", + punk: "Punk", + hiphop: "Rap / Hip-Hop", + }, + focus: { + mixed: "Mixte / Général", + builder: "DIY & Constructeurs", + photo: "Photo & Film", + coaching: "Coaching", + art: "Art & Design", + music: "Groupe & Musique", + wellness: "Entraînement & Kiné", + }, + focusDescription: { + mixed: "Un crew de skate classique — apparaît uniquement sur la page Crews.", + builder: "Un crew DIY / de construction de park — apparaît aussi dans The Lab sous Constructeurs.", + photo: "Un crew de film, photo ou montage — apparaît aussi dans The Lab sous Photo & Film.", + coaching: "Un crew de coaching / cours — apparaît aussi dans The Lab sous Coaching.", + art: "Un collectif d'art, design, graffiti ou tatouage — apparaît aussi dans The Lab sous Art & Design.", + music: "Un groupe ou collectif musical — apparaît aussi dans The Lab sous Musique.", + wellness: "Un crew d'entraînement, fitness ou kiné — apparaît aussi dans The Lab sous Entraînement.", + }, + lookingFor: { + filmer: "Filmeur", + photographer: "Photographe", + editor: "Monteur vidéo", + coach: "Coach", + builder: "Constructeur de rampes", + artist: "Artiste / Designer", + musician: "Musicien / Groupe", + members: "Nouveaux membres", + }, + role: { + filmer: "Filmeur", + photographer: "Photographe", + editor: "Monteur", + coach: "Coach", + builder: "Constructeur", + artist: "Artiste", + graffiti: "Graffiti", + tattoo: "Tatouage", + trainer: "Entraîneur", + musician: "Musicien", + judge: "Juge", + manager: "Manager d'équipe", + og: "OG", + }, + }, + memberVisibility: { + public: { + label: "Public", + description: "N'importe qui peut vous voir dans ce crew — sur la page publique du crew et dans la découverte des membres.", + }, + crew: { + label: "Crew uniquement", + description: "Seuls les membres confirmés et le fondateur vous voient ici. Pour tous les autres, vous apparaissez comme un « membre masqué » anonyme. Remarque : il s'agit d'une confidentialité au niveau de l'app — votre tag d'appartenance existe toujours publiquement sur les relays, il n'est simplement jamais montré aux étrangers.", + }, + }, + tagCategory: { + features: { + name: "Caractéristiques", + description: "Obstacles et terrain", + }, + surfaces: { + name: "Surfaces", + description: "Matériaux et textures", + }, + sizes: { + name: "Tailles", + description: "Dimensions et échelle", + }, + stairs: { + name: "Nombre de marches", + description: "Nombre d'escaliers", + }, + vibes: { + name: "Ambiances", + description: "Atmosphère et état", + }, + location: { + name: "Lieu", + description: "Contexte du lieu", + }, + tricks: { + name: "Tricks", + description: "Bon pour des tricks précis", + }, + }, + spotTagCategory: { + street: { + label: "Street", + description: "Spots de rue - escaliers, rails, ledges", + }, + park: { + label: "Park", + description: "Skateparks - publics ou privés", + }, + diy: { + label: "DIY", + description: "Spots DIY/fait maison", + }, + plaza: { + label: "Plaza", + description: "Plazas publiques à l'architecture skate-friendly", + }, + }, + status: { + active: { + label: "Actif", + description: "Tout roule — skatez-le.", + }, + bust: { + label: "Bust", + description: "Fort risque d'expulsion — sécurité ou flics.", + }, + skate_stopped: { + label: "Skate-stopped", + description: "Bloqué / capuchonné, mais partiellement skatable.", + }, + closed: { + label: "Fermé", + description: "Temporairement fermé — travaux ou événement.", + }, + gone: { + label: "Disparu", + description: "Démoli, bitumé ou définitivement clôturé.", + }, + }, + price: { + free: "GRATUIT", + trade: "Échange", + makeOffer: "Faire une offre", + offer: "Offre", + }, + }, + feesUi: { + feeFeaturedEventLabel: "Événement à la une", + feeFeaturedEventDesc: "Mettez votre événement en avant sur SkateSpots", + feeFeaturedEventBenefit: "Votre événement apparaît en haut de la page des événements", + feeLabProfileLabel: "Profil Lab Pro", + feeLabProfileDesc: "Mettez vos services en avant dans The Lab", + feeLabProfileBenefit: "Badge Pro + placement en vedette quand les skateurs parcourent The Lab", + feeFeaturedShopLabel: "Skateshop à la une", + feeFeaturedShopDesc: "Mettez votre skateshop en avant sur la carte et l'annuaire", + feeFeaturedShopBenefit: "Badge vérifié + épingle en vedette sur la carte", + feeFeaturedTourLabel: "Tour à la une", + feeFeaturedTourDesc: "Mettez votre tour en avant sur SkateSpots", + feeFeaturedTourBenefit: "Badge Pro + placement en tête quand les skateurs parcourent les tours", + duration7d: "7 jours", + duration30d: "1 mois", + duration90d: "3 mois", + duration365d: "12 mois", + metaActive: "{{label}} — Actif", + daysRemainingOne: "{{count}} jour restant", + daysRemainingMany: "{{count}} jours restants", + zapRequestContent: "SkateSpots {{label}} ({{tier}})", + errGenerate: "Échec de la génération de la facture", + paymentReceived: "⚡ Paiement reçu !", + paymentReceivedDesc: "{{amount}} sats — {{label}} est maintenant actif.", + autoPayFailed: "Échec du paiement automatique", + autoPayFailedDesc: "Payez manuellement à l'aide du QR ou de la facture ci-dessous.", + payStatusUnknown: "Statut du paiement inconnu — le paiement a peut-être abouti. Vérifiez votre portefeuille avant de payer à nouveau.", + invoiceCopied: "Facture copiée !", + activeBang: "{{label}} actif !", + chooseDuration: "Choisir la durée", + bestValue: "Meilleur rapport qualité-prix", + perDay: "{{price}}/jour", + validFor: "Valable", + amountLine: "~{{usd}} USD · pour {{name}} · {{tier}}", + payToContinue: "Payez {{amount}} sats pour continuer", + generating: "Génération de la facture…", + processing: "Traitement du paiement…", + invoiceQrAlt: "QR de facture Lightning", + copyInvoice: "Copier la facture", + openWallet: "Ouvrir le portefeuille", + payConnected: "Payer avec le portefeuille connecté", + scanAny: "Scannez avec n'importe quel portefeuille Lightning", + tryAgain: "Réessayer", + proReceiptTitle: "🦧⚡ Sasquatch Pro — c'est parti !", + proReceiptPass: "Pass : {{pass}} ({{sats}} sats)", + proReceiptActiveUntil: "Actif jusqu'au : {{until}}", + proReceiptUnlocked: "Ce que vous avez débloqué :", + proReceiptBullet1: "• Assistant personnel — je lis votre Stash, vos crews, spots & annonces", + proReceiptBullet2: "• Brouillons d'actions — listez du matériel, publiez un statut de spot, planifiez des voyages (vous confirmez)", + proReceiptBullet3: "• Des réponses qui utilisent votre contexte personnel, pas seulement les données publiques", + proReceiptBullet4: "• ⚡ Vous soutenez directement SkateSpots & le gardez gratuit + sans pub", + proReceiptThanks: "Merci de garder SkateSpots gratuit & sans pub. Maintenant, va shredder. 🛹", + proReceiptSubject: "Reçu Sasquatch Pro", + receiptContent: "Sasquatch Pro — pass de soutien {{tier}} 🦧⚡", + receiptAlt: "Pass de soutien Sasquatch Pro ({{tier}}), valable jusqu'au {{until}}", + purchaseComment: "Sasquatch Pro — {{tier}} 🦧", + errLogin: "Connectez-vous pour passer à Pro.", + errStart: "Impossible de démarrer l'achat.", + errRecord: "Impossible d'enregistrer votre pass.", + }, + cardUi: { + save: "Enregistrer la carte sur Nostr", + saved: "Carte enregistrée", + savedDesc: "Votre carte est maintenant signée et vérifiable.", + saveFailed: "Impossible d'enregistrer la carte", + notPublished: "Non publiée", + titleNeon: "Rider", + titleRest: "Card", + saveFrontPng: "Enregistrer le recto (PNG)", + expired: "EXPIRÉ", + logoUploaded: "Logo téléversé", + logoUploadFailed: "Impossible de téléverser le logo", + venue: "Lieu lié (facultatif)", + venueNone: "Aucun lieu", + venueHint: "Choisissez l'un de vos propres spots pour lier ce pass à un lieu. Un vérificateur confirmera que vous le possédez.", + venuePick: "Choisissez votre lieu", + parkNoVenue: "Un pass Park ne peut être émis que par le propriétaire du lieu — cartographiez d'abord un spot que vous possédez.", + parkAddVenue: "Ajouter un spot", + parkNeedsVenue: "Choisissez un lieu que vous possédez", + parkIssued: "Pass émis", + parkRevoke: "Révoquer", + parkRevoked: "Révoqué", + parkRevokeFailed: "Impossible de révoquer", + v: { + valid: "Valide", + validDesc: "Signature valide et émise par le lieu.", + expired: "Expiré", + expiredDesc: "Au-delà de sa date de validité.", + revoked: "Révoqué", + revokedDesc: "L'émetteur a annulé ce pass — ne l'acceptez pas.", + invalid: "Invalide", + invalidDesc: "La signature ne se vérifie pas. Ne vous y fiez pas.", + notFound: "Introuvable", + notFoundDesc: "Aucun enregistrement correspondant sur les relays.", + unverifiedIssuer: "Émetteur non vérifié", + unverifiedIssuerDesc: "Ce pass nomme un lieu qui n'appartient pas à la clé de l'émetteur.", + notBound: "Non lié", + notBoundDesc: "Non lié à un lieu — ne prouve rien quant à l'accès.", + noRsvp: "Aucun RSVP", + noRsvpDesc: "Le détenteur n'a aucun RSVP enregistré pour cet événement.", + admitted: "Admis", + admittedDesc: "Événement de l'organisateur + le détenteur a répondu présent.", + noHolder: "Aucun détenteur dans le lien", + noHolderDesc: "Ce QR n'a pas de détenteur de billet (`?h=`), donc le détenteur ne peut pas être vérifié.", + }, + passes: { + tab: "Mes pass", + pass: "Pass d'accès", + none: "Aucun pass pour l'instant. Quand un lieu ou un organisateur vous en émet un, il apparaît ici.", + }, + facets: { + title: "Afficher les facettes d'identité", + crews: "Crews", + local: "Local", + roles: "Rôles Lab", + }, + roles: { + coach: "Coach", + filmer: "Filmeur", + editor: "Monteur", + photographer: "Photographe", + builder: "Constructeur", + artist: "Artiste", + graffiti: "Graffiti", + tattoo: "Tatouage", + trainer: "Entraîneur", + musician: "Musicien", + judge: "Juge", + organizer: "Organisateur", + barber: "Coiffeur", + }, + crew: { + crewCard: "CARTE DE CREW", + crewSub: "Votre crew, sur une carte", + pick: "Choisir un crew", + none: "Vous n'êtes pas encore dans un crew — rejoignez-en un ou créez-en un d'abord.", + hint: "La carte est construite à partir des propres données signées du crew. Modifiez le crew sur sa page pour la changer.", + members: "MEMBRES", + spots: "SPOTS", + est: "Dep. {{year}}", + openCall: "Appel ouvert", + verifiedCrew: "Crew vérifié", + viewCrew: "Voir le crew", + }, + event: { + pass: "PASS D'ÉVÉNEMENT", + passSub: "Un pass pour un événement où vous allez", + pick: "Choisir un événement", + none: "Aucun événement pour l'instant — créez-en un, ou inscrivez-vous à un, d'abord.", + hint: "Le pass est construit à partir des propres données signées de l'événement. Seul l'organisateur peut le modifier.", + admits: "ADMET", + going: "{{count}} participants", + verifiedEvent: "Événement vérifié", + viewEvent: "Voir l'événement", + issuePass: "Émettre un pass d'entrée", + issuePassBtn: "Émettre le pass", + issuePassHint: "Un pass signé pour un participant précis — il le présente à l'entrée.", + notOrganiser: "Seul l'organisateur peut émettre des pass", + passIssued: "Pass émis", + issueFailed: "Impossible d'émettre le pass", + issuedPasses: "Pass d'entrée émis", + }, + studio: { + unsaved: "Modifications non enregistrées", + saved: "Enregistré", + saveChanges: "Enregistrer les modifications", + allSaved: "Enregistré — à jour", + showOnCard: "Afficher sur la carte", + derived: "Depuis votre profil de skateur", + noSkaterProfile: "Pas encore de profil de skateur —", + editSkaterProfile: "ajoutez vos styles & niveau", + noPhoto: "Pas encore de photo de profil —", + addPhoto: "ajoutez-en une dans votre profil", + finishTitle: "Finalisez votre carte", + finishDesc: "Une photo et un profil de skateur la rendent crédible.", + checkPhoto: "Photo de profil", + checkName: "Nom affiché", + checkProfile: "Styles & niveau", + checkCrew: "Rejoindre un crew", + moreTypes: "D'autres types de cartes se débloquent quand vous cartographiez vos spots, rejoignez des crews ou vous inscrivez à des événements.", + accent: "Couleur d'accent", + accentHint: "Remplace l'accent du thème", + accentClear: "Utiliser la couleur du thème", + logo: "Logo / blason personnalisé", + logoAdd: "Téléverser", + logoChange: "Changer", + logoClear: "Retirer", + }, + back: { + title: "Verso imprimable", + desc: "Crews, rôles, sponsors & liens au dos", + showBack: "Afficher le verso", + showFront: "Afficher le recto", + empty: "Rien ici pour l'instant — ajoutez des crews, rôles ou sponsors.", + }, + verify: { + checking: "Vérification de la carte…", + notFound: "Carte introuvable", + notFoundDesc: "Aucun événement correspondant sur les relays. Il a peut-être été supprimé, ou le lien est erroné.", + invalid: "Signature invalide", + invalidDesc: "Cet événement existe mais sa signature ne se vérifie pas. Ne vous y fiez pas.", + authentic: "Authentique", + authenticDesc: "La signature de l'émetteur est valide.", + kind: "Type", + kindPark: "Carte d'accès Park", + kindRider: "Carte de rider", + kindCrew: "Carte de crew", + kindEvent: "Pass d'événement", + organiser: "Organisateur", + expired: "Expiré", + valid: "Valide", + holder: "Détenteur", + ticketHolder: "Détenteur du billet", + rsvp: "RSVP", + rsvpGoing: "Participe", + rsvpInterested: "Intéressé", + rsvpNone: "Aucun RSVP trouvé", + revoked: "Pass révoqué", + revokedDesc: "L'émetteur a annulé ce pass — ne l'acceptez pas.", + issuedBy: "Émis par", + accessLevel: "Niveau d'accès", + validThru: "Valable jusqu'au", + selfIssued: "Statut", + selfIssuedDesc: "Carte d'identité auto-émise", + venue: "Lieu", + venueVerified: "Vérifié — la clé du propriétaire de ce lieu correspond à l'émetteur.", + venueMismatch: "Ce pass nomme un lieu qui n'appartient pas à la clé de l'émetteur.", + venueNone: "Non lié à un lieu.", + viewCard: "Voir la carte", + disclaimer: "Une signature valide prouve qui a signé cette carte — ce n'est pas une preuve de compétence ni de droits d'accès au-delà de ce que le lieu a émis.", + details: "Détails", + invalidLink: "Lien invalide", + invalidLinkDesc: "Cela ne ressemble pas à un lien de carte valide.", + }, + public: { + invalid: "Cela ne ressemble pas à un lien de carte valide.", + createYourOwn: "Créez votre propre carte", + editYourCard: "Modifier votre carte", + backToEditor: "Retour à l'éditeur", + backHome: "Retour à l'accueil", + notCustomised: "Ce skateur n'a pas encore personnalisé sa carte — voici l'apparence par défaut.", + verifyNote: "Scannez le QR sur la carte pour la vérifier.", + }, + }, + routeUi: { + destination: "Destination", + routeTo: "Itinéraire vers {{label}}", + routeToLabel: "Itinéraire vers", + search: "Rechercher", + description: "Options d'itinéraire et directions dans l'app.", + routeMapAria: "Carte de l'itinéraire", + findingLocation: "Recherche de votre position…", + plottingRoute: "Tracé de votre itinéraire…", + refiningLocation: "Affinage de la position…", + offlineSavedRoute: "Hors ligne · itinéraire enregistré {{age}}", + tapMapStart: "Appuyez sur la carte pour définir votre point de départ", + fitRouteAria: "Afficher tout l'itinéraire sur la carte", + wholeRoute: "Itinéraire complet", + next: "Suivant", + nextStep: "Suivant · étape {{n}}", + followTheLine: "Suivez la ligne", + toTheTurn: "jusqu'au virage", + toGo: "restant", + tryAgain: "Réessayer", + mode: { + foot: "Skate / Marche", + bike: "Vélo", + moto: "Moto", + car: "Voiture", + transit: "Transports", + }, + from: "De", + myLocation: "Ma position", + tapTheMap: "Appuyez sur la carte…", + chooseOnMap: "Choisir sur la carte", + direct: "direct", + transferOne: "1 correspondance", + transfers: "{{count}} correspondances", + options: "{{count}} options", + ride: "trajet", + arrive: "arrivée", + speedAvg: "{{speed}} km/h en moyenne", + stepsCount: "{{count}} étapes", + onABoard: "en skate", + usesDrivingRoads: "emprunte des routes pour voitures", + drivingEstimate: "estimation voiture", + updating: "mise à jour…", + pickMode: "Choisissez un mode pour voir votre itinéraire.", + waitingLocation: "En attente de votre position…", + routeSteps: "Étapes de l'itinéraire", + walkingRoute: "itinéraire piéton — plus rapide en skate", + planningView: "Vue planification — appuyez sur Démarrer pour suivre avec virages en direct, voix et arrivée.", + leaveNow: "Partir maintenant", + departAt: "Partir à", + arriveBy: "Arriver avant", + departureTime: "Heure de départ", + arrivalTime: "Heure d'arrivée", + only: "Seulement", + clear: "effacer", + itinerary: "Itinéraire détaillé", + group: { + bus: "Bus", + tram: "Tram", + metro: "Métro", + train: "Train", + ferry: "Ferry", + }, + walk: "Marche", + rideVerb: "Rouler", + walkLower: "marche", + rideLower: "rouler", + toStop: "vers", + track: "voie {{track}}", + stopOne: "1 arrêt", + stopsCount: "{{count}} arrêts", + tickets: "billets ↗", + done: "Terminé", + stop: "Arrêter", + start: "Démarrer", + arrived: "Vous êtes arrivé. 🛹", + voiceOnNote: "L'écran reste allumé · voix activée — virages et arrivée sont annoncés.", + voiceOffNote: "L'écran reste allumé · voix désactivée.", + followNote: "Virages, voix et arrivée pendant que vous roulez. Garde l'écran allumé.", + voiceOffAria: "Désactiver les indications vocales", + voiceOnAria: "Activer les indications vocales", + voiceStart: "Démarrage de la navigation", + voiceArrived: "Vous êtes arrivé", + voiceIn: "Dans {{metres}} mètres, {{instruction}}", + voiceContinue: "continuez", + voiceContinueCaps: "Continuez", + errPermissionDenied: "Autorisation de localisation refusée.", + errWaitingGps: "En attente d'un point GPS…", + errPermissionDeniedLong: "Autorisation de localisation refusée. Activez la localisation pour calculer l'itinéraire depuis votre position.", + errNoLocation: "Impossible d'obtenir votre position. Réessayez.", + errNoLocationShort: "Impossible d'obtenir votre position.", + errTransitNoRouteFiltered: "Aucun itinéraire pour cette heure ou ce mode de transport — essayez un autre horaire, ou incluez plus de modes.", + errTransitNoRoute: "Aucun itinéraire de transport en commun trouvé ici — cette zone ne publie peut-être pas d'horaires ouverts.", + errTransitUnreachable: "Impossible de joindre le service de transport. Vérifiez votre connexion et réessayez.", + errRoutingBusy: "Le service d'itinéraires est occupé pour l'instant — réessayez dans un moment.", + errNoRouteMode: "Aucun itinéraire pour ce mode — la destination est peut-être hors du réseau routier. Essayez un autre mode.", + errRoutingUnreachable: "Impossible de joindre le service d'itinéraires. Vérifiez votre connexion et réessayez.", + departures: "Départs", + upcomingFrom: "Prochains départs depuis {{stop}}", + loadingDepartures: "Chargement des départs…", + noDepartures: "Aucun départ à venir trouvé à cet arrêt.", + live: "en direct", + cancelled: "annulé", + refresh: "Rafraîchir", + tripLoginTitle: "Connectez-vous pour enregistrer", + tripLoginDesc: "Connectez-vous pour garder ce voyage comme une Collection.", + tripCollectionTitle: "Voyage skate à {{destination}} 🛹", + tripCollectionDesc: "Plan de voyage par The Sasquatch — {{count}} jours à {{destination}}.", + tripCollectionDescOne: "Plan de voyage par The Sasquatch — {{count}} jour à {{destination}}.", + tripSavedTitle: "Enregistré dans les Collections 🦧", + tripSavedDesc: "Votre voyage à {{destination}} est mis en favori.", + tripSaveFailed: "Impossible d'enregistrer", + tripSaveFailedDesc: "Réessayez dans une seconde.", + daysInDestinationOne: "{{count}} jour à {{destination}}", + daysInDestination: "{{count}} jours à {{destination}}", + wetForecast: "Prévisions humides — contactez un crew local pour des options couvertes/en intérieur.", + dayLabel: "Jour {{n}}", + freeSkate: "Skate libre — explorez & filmez. 🎥", + tapToBook: "appuyez pour réserver / zapper ⚡", + localCrews: "Crews locaux", + saving: "Enregistrement…", + savedToCollections: "Enregistré dans les Collections", + saveSpotOne: "Enregistrer {{count}} spot dans une Collection", + saveSpots: "Enregistrer {{count}} spots dans une Collection", + flights: "Vols", + stays: "Hébergements", + gettingAround: "Se déplacer", + noMiddleman: "Je planifie le skate — les vols & hébergements s'ouvrent sur les vrais sites (pas de KYC, pas d'intermédiaire).", + ageJustNow: "à l'instant", + ageMinAgo: "il y a {{count}} min", + ageHourAgo: "il y a {{count}} h", + ageDayAgo: "il y a {{count}} j", + skateRightHere: "juste ici", + skateMin: "~{{count}} min en skate", + skateHours: "~{{hours}} h en skate", + maneuver: { + headOut: "Partez", + arrive: "Arrivez au spot", + continueStraight: "Continuez", + bearLeft: "Serrez à gauche", + bearRight: "Serrez à droite", + turnLeft: "Tournez à gauche", + turnRight: "Tournez à droite", + sharpLeft: "Tournez fortement à gauche", + sharpRight: "Tournez fortement à droite", + turn: "Tournez", + keepLeft: "Restez à gauche", + keepRight: "Restez à droite", + takeFork: "Prenez la fourche", + merge: "Insérez-vous", + roundabout: "Prenez le rond-point", + takeRamp: "Prenez la bretelle", + takeExit: "Prenez la sortie", + }, + maneuverOnto: "{{instruction}} sur {{road}}", + }, + sasquatchUi: { + live: "en direct", + offline: "hors ligne", + genericTitle: "Assistant SkateSpots 🦧", + genericGreeting: "Yo ! Je suis The Sasquatch. Pose-moi n'importe quelle question sur les spots, événements, coachs, matériel ou le fonctionnement de l'app. J'ai des données en direct du relay SkateSpots !", + q1: "Planifie-moi 3 jours à Lisbonne", + q2: "Trouve des spots près de moi", + q3: "Des événements à venir ?", + q4: "C'est quoi les crews ?", + q5: "Comment marchent les zaps ?", + q6: "C'est quoi Nostr ?", + q7: "C'est quoi Mon Stash ?", + q8: "C'est gratuit ?", + bubbleTitle: "Appuyez et faites glisser pour déplacer · Appuyez pour ouvrir", + openGuideAria: "Ouvrir le guide Sasquatch", + hideAria: "Masquer l'assistant Sasquatch", + hide: "Masquer l'assistant", + showAria: "Afficher l'assistant Sasquatch", + activeUntil: "Actif jusqu'au {{date}}", + platformOwner: "Propriétaire de la plateforme", + upgradeTitle: "Passez à Sasquatch Pro", + goPro: "Passer Pro", + goProBlurb: "IA personnelle · à partir de 2k sats", + aiBalanceTitle: "Solde de crédit IA Sasquatch (propriétaire uniquement) — rechargez sur {{provider}}", + aiChip: "⚡ IA {{balance}}", + minimizeToBubbleAria: "Réduire en bulle", + minimize: "Réduire", + closePanelAria: "Fermer le panneau", + close: "Fermer", + askLab: "Demander à propos de Coaching & Film", + askMap: "Demander à propos de Spots, Skateshops & Matériel", + askAnything: "Demande-moi n'importe quoi 🛹", + quickQuestions: "Questions rapides :", + you: "🧑 Vous", + thinking: "réflexion...", + inputPlaceholder: "Posez une question sur les spots, événements, coachs...", + liveDataFrom: "Données en direct de", + nostrRelays: "relays Nostr", + clear: "effacer", + gettingLocation: "📍 Localisation en cours…", + findingClosest: "🔍 Recherche des spots les plus proches…", + checkingLive: "🔍 Vérification des données en direct…", + planningTrip: "🗺️ Planification de votre voyage à {{destination}}...", + searchingRelays: "🔍 Recherche dans les relays de {{tool}}...", + perk1: "Assistant personnel — Sasquatch lit votre propre Stash, vos crews, spots & annonces", + perk2: "Brouillons d'actions : listez du matériel, publiez un statut de skate, planifiez un voyage — vous confirmez avant toute publication", + perk3: "Les réponses utilisent votre contexte personnel, pas seulement les données publiques", + perk4: "⚡ Soutenez directement SkateSpots & gardez-le gratuit et sans pub", + welcomeTitle: "Merci de soutenir Sasquatch Pro ! 🦧⚡", + welcomeDesc: "Paiement envoyé — votre pass s'active dès que le fournisseur le confirme (généralement en moins d'une minute). Merci de garder les rues libres.", + invoiceCopied: "Facture copiée", + dialogDesc: "Boostez votre guide de skate IA. 100 % finance une app communautaire gratuite et sans pub.", + proSupporter: "Vous êtes un soutien Pro ⚡", + extendPrompt: "Envie de prolonger ? Choisissez un palier ci-dessous pour ajouter du temps.", + scanToPayPre: "Scannez pour payer", + scanToPayAmount: "{{sats}} sats", + scanToPayPost: "pour {{label}} de Pro", + invoiceQrAlt: "QR de facture Lightning", + copyInvoice: "Copier la facture", + ivePaid: "J'ai payé", + ivePaidHint: "Appuyez sur « J'ai payé » après la confirmation de votre portefeuille — cela enregistre votre pass sur votre identité Nostr.", + freeStaysPre: "Le Sasquatch gratuit reste gratuit — recherche publique de spots/événements/coachs, planification de voyages + le glossaire complet des tricks. Pro ajoute la couche ", + freeStaysEmphasis: "personnelle + d'actions", + freeStaysPost: ".", + loginFirst: "Connectez-vous d'abord pour passer à Pro.", + paysTo: "Paie à", + overLightning: "via Lightning. Lié à votre npub.", + popular: "Populaire", + sats: "sats", + extend: "Prolonger", + done: "Terminé !", + cancelledNothing: "Annulé — rien n'a été publié.", + draftReview: "Brouillon — vérifiez & confirmez", + statusTextPlaceholder: "Texte du statut", + titlePlaceholder: "Titre", + priceSatsPlaceholder: "Prix (sats)", + conditionPlaceholder: "État", + cancel: "Annuler", + aiTitle: "Sasquatch IA", + owner: "Propriétaire", + notConfigured: "non configuré", + unavailable: "indisponible", + satsValue: "{{balance}} sats", + theNode: "le nœud", + lowBalance: "Solde faible — rechargez sur {{provider}} sinon l'IA basculera sur le fournisseur sans clé.", + aiDesc: "IA au paiement à la requête, financée en sats via Routstr. Se recharge quand le solde est bas.", + tier7d: "7 jours", + tier1m: "1 mois", + tier3m: "3 mois", + tier1y: "1 an", + badgeTry: "Essayer", + badgeOff20: "-20 %", + badgeBest: "Meilleur rapport · -40 %", + draftPostStatusTitle: "Publier un statut de skate", + draftAutoExpires: "Expire automatiquement dans {{count}} min", + draftPostStatusCta: "Publier le statut", + draftCategory: "Catégorie : {{value}}", + draftSize: "Taille : {{value}}", + draftCondition: "État : {{value}}", + draftMaxPrice: "Prix max : {{price}} {{currency}}", + draftPriceOpen: "Prix : ouvert", + draftLookingForTitle: "Recherche « {{title}} »", + draftWantedCta: "Publier une annonce de recherche", + draftPrice: "Prix : {{price}} {{currency}}", + draftPriceOffer: "Prix : faire une offre", + draftListTitle: "Mettre « {{title}} » en vente", + draftPublishCta: "Publier l'annonce", + statusPosted: "Statut publié 🛹", + wantedPublished: "Annonce de recherche publiée 🔎", + listingPublished: "Annonce publiée 💸", + mustBeLoggedIn: "Vous devez être connecté.", + }, + sasquatchChat: { + faq: { + hi: "Hey ! Je suis The Sasquatch 🦧 Ton guide de skate IA. Pose-moi des questions sur les spots, événements, coachs, matériel — ou n'importe quoi sur l'app. De quoi as-tu besoin ?", + hello: "Wassup ! 🛹 Je suis The Sasquatch. Pose-moi des questions sur les spots de skate, événements, coachs, ou le fonctionnement de l'app. Quoi de neuf ?", + hey: "Hey skateur ! 🤙 Pose-moi des questions sur les spots près de chez toi, les événements à venir, les coachs, ou n'importe quoi sur SkateSpots.", + whoAreYou: "Je suis The Sasquatch 🦧 — le guide IA de SkateSpots. Je peux trouver des spots de skate dans le monde entier, chercher des événements, coachs, filmeurs et annonces de matériel. Le tout propulsé par des données Nostr en direct. Vas-y, demande !", + whatCanYouDo: "Je peux trouver des spots de skate par ville ou pays, chercher les événements à venir, trouver des coachs et filmeurs dans The Lab, chercher des annonces de matériel, et répondre aux questions sur le fonctionnement de l'app. Essaie : « spots à Bangkok » ou « trouve un coach » ! 🛹", + whatIsNostr: "Nostr est un protocole simple et ouvert pour des réseaux sociaux décentralisés. Pense à Twitter, mais sans entreprise unique qui le contrôle — tu utilises des clés cryptographiques au lieu de pseudos, tu choisis quels relays stockent tes données (ou tu fais tourner le tien), et un seul compte fonctionne sur toutes les apps Nostr ! 🔑", + isThisPrivate: "Voici le point honnête 🛡️\n\n• Ta **position GPS reste sur ton appareil** — « Près de moi » ne fait que centrer la carte. Elle ne nous est jamais envoyée ni publiée.\n• **Les spots que tu ajoutes sont publics** (c'est le but d'une carte partagée) — donc ne place pas de repère sur ta propre porte d'entrée.\n• **Les DM & les chats de crew sont chiffrés de bout en bout** — seuls les membres peuvent les lire.\n• Comme pour tout site, les serveurs auxquels tu te connectes (tuiles de carte, relays) peuvent voir ton **IP**. Tu veux aussi la masquer ? Utilise un VPN ou Tor.\n\nTous les détails sur la [page Confidentialité](/privacy). 🛹", + privacy: "Version rapide 🛡️ : ton GPS ne quitte jamais ton appareil, les spots que tu publies sont publics par conception, et les DM/chats de crew sont chiffrés de bout en bout. Les serveurs peuvent quand même voir ton IP (normal pour tout site) — un VPN ou Tor masque ça si tu veux. Détails complets sur la [page Confidentialité](/privacy).", + amITracked: "SkateSpots ne te traque pas — pas de pub, pas de profilage analytique, pas de vente de données, et aucun serveur SkateSpots ne collecte ta position. Ton GPS reste sur ton appareil. La seule chose que les serveurs voient (tuiles de carte, relays), c'est ton **IP** — comme pour tout site. Utilise un VPN ou Tor pour la masquer. Plus sur la [page Confidentialité](/privacy). 🛡️", + doYouTrack: "Non — pas de traçage, pas de pub, pas de collecte de données. Ton GPS reste sur ton appareil et aucun serveur central ne te journalise. Les serveurs auxquels tu te connectes peuvent voir ton IP (comme tout site) ; un VPN/Tor masque ça. Voir la [page Confidentialité](/privacy). 🛹", + vpn: "Totalement facultatif, mais solide si tu veux plus de confidentialité 🛡️. Un VPN masque ton **IP** (position approximative) aux serveurs auxquels SkateSpots parle — tuiles de carte, relays, etc. Choisis un fournisseur sans logs en qui tu as confiance (ex. Mullvad) ; évite les gratuits douteux.\n\nÀ savoir : un VPN ne masque **pas** les spots que tu publies (ils sont publics), et n'active pas le GPS du navigateur si tu cherches à rester anonyme. Détails complets sur la [page Confidentialité](/privacy).", + tor: "Le navigateur Tor t'offre la confidentialité IP la plus forte — il te fait passer par plusieurs relays pour que les serveurs ne voient pas ta vraie IP 🧅. Compromis : c'est plus lent, et les cartes + certains relays Nostr peuvent être lents ou bloquer les sorties Tor. Parfait pour les plus prudents.\n\nRappel : Tor masque ton IP, pas les spots que tu publies, et n'active pas le GPS du navigateur si l'anonymat est ton objectif. Plus sur la [page Confidentialité](/privacy).", + hideMyIp: "Deux options gratuites 🛡️ : un **VPN réputé** (facile, rapide — masque ton IP derrière ses serveurs) ou le **navigateur Tor** (confidentialité maximale, plus lent). L'un ou l'autre empêche les serveurs auxquels SkateSpots se connecte de voir ta vraie IP. Note qu'ils ne cachent pas les spots que tu publies. Voir la [page Confidentialité](/privacy).", + isMyLocation: "Ta position est en sécurité 📍 — « Près de moi » lit ton GPS uniquement sur ton appareil, pour centrer la carte et trier les spots proches. Elle n'est jamais publiée sur Nostr, jamais envoyée, jamais partagée. Seuls les spots que tu ajoutes délibérément sont publics. Détails sur la [page Confidentialité](/privacy).", + whatAreZaps: "Les zaps sont des pourboires Bitcoin Lightning instantanés envoyés via Nostr ! Clique sur ⚡ sur n'importe quel contenu, envoie des sats directement au portefeuille du créateur. Comme un « j'aime » mais avec de l'argent réel. Instantané, pair-à-pair, sans intermédiaire. ⚡", + howToLogin: "Deux façons :\n1. **Extension de navigateur** (Bureau) : installe Alby ou nos2x, puis clique sur « Se connecter »\n2. **Nouvel utilisateur** : clique sur « S'inscrire » pour générer des clés. Télécharge ton nsec (clé secrète) et CONSERVE-LE — c'est ton compte pour toujours !", + whatIsCashu: "Portefeuille Bitcoin intégré ! Des jetons Cashu ecash adossés à Lightning — fonctionne hors ligne sur les spots de skate, axé confidentialité (les mints ne peuvent pas tracer les paiements). Va dans Portefeuille dans les réglages pour l'utiliser. 🥜", + whatIsNwc: "Nostr Wallet Connect — comme l'USB-C des portefeuilles Lightning. Connecte Alby, Minibits, Zeus ou Coinos une fois, et zappe en un clic pour toujours. Chiffré, tu contrôles les limites de dépense. 🔌⚡", + isItFree: "100 % gratuit. Pas de pub, pas d'abonnement, pas de conneries d'entreprise. Fait par des skateurs pour des skateurs. Financé par la communauté via Angor — va voir la page Soutiens. Tu peux aussi gagner des Bitcoin grâce aux zaps communautaires en contribuant de bons spots. 🛹", + whatCanIDo: "Découvre des spots dans le monde entier sur la carte, engage des pros dans The Lab (coachs, filmeurs, photographes, monteurs, constructeurs de rampes), roule avec un crew, rejoins des événements, fais des tours, achète/vends du matériel, gère ton Stash privé, zappe les créateurs, consulte la météo des spots et construis la communauté skate décentralisée !", + whatIsTheLab: "The Lab, c'est là où tu engages les pros de la scène skate : Coachs, Filmeurs, Photographes, Monteurs vidéo et Constructeurs de rampes/parks/DIY. Chacun peut être une personne seule ou un collectif (crew/studio) — les membres confirment avec leurs propres clés, donc c'est légitime. Tout sur Nostr, pas de faux comptes. 🎓", + whatIsACrew: "Les crews sont ta famille de skate ancrée sur la carte — ceux avec qui tu skates, pas ceux que tu engages. Chaque crew a son territoire d'origine sur la carte (épingles turquoise), ses spots maison, ses membres, ses ambiances et un manifeste. Les membres confirment depuis leur propre clé. Crée-en un dans Crews → « Créer un crew ». 🤘", + whatAreCrews: "Les crews sont ta famille de skate ancrée sur la carte — ceux avec qui tu skates, pas ceux que tu engages. Chaque crew a son territoire d'origine sur la carte (épingles turquoise), ses spots maison, ses membres et un manifeste. Les membres confirment depuis leur propre clé. Direction l'onglet Crews pour en créer un ou en rejoindre un ! 🤘", + howToStartACrew: "Va dans l'onglet Crews → « Créer un crew ». Donne-lui un nom, place ton territoire d'origine sur la carte, ajoute des ambiances (ou ton propre #hashtag), lie tes spots maison et ajoute des membres par npub. Chaque membre confirme depuis sa propre clé pour que l'effectif soit légitime. 🤘", + whatIsMyStash: "Mon Stash est ton casier de matériel PRIVÉ et chiffré (chiffrement NIP-44). Suis tes decks, trucks, roues, chaussures — avec lieu de stockage, état, rareté et prix. Toi seul peux le lire, sauf si tu marques des articles comme publics. Parfait pour l'assurance ou préparer un échange. 🎒", + whatIsStash: "Mon Stash est ton inventaire de matériel PRIVÉ et chiffré. Note tout ce que tu possèdes — état, lieu de stockage, valeur — le tout chiffré pour que toi seul puisses le voir. Marque des articles comme publics si tu veux les vendre ou les montrer. 🎒", + whatIsABuilder: "Les Constructeurs sont des crews de rampes/parks/DIY dans The Lab que tu peux engager pour construire des transitions, bowls, rails ou tout un park. Ils listent ce qu'ils construisent, les matériaux, l'échelle des projets, et peuvent être licenciés/assurés. Souvent des collectifs — et ils peuvent lier les spots qu'ils ont construits à la carte. 🏗️", + whatIsANutzap: "Les Nutzaps (NIP-61) sont des pourboires ecash envoyés via Nostr — des jetons Cashu privés zappés directement à quelqu'un. Tu peux configurer la RÉCEPTION de nutzaps dans le Portefeuille. (L'envoi complet de nutzaps arrive — pour l'instant, utilise les zaps Lightning.) 🥜⚡", + whatIsClink: "CLINK est un code de paiement natif Nostr (un « noffer »). Les skateshops, crews et pros du Lab peuvent en ajouter un pour que tu puisses les payer sans adresse Lightning — tu verras un bouton « Payer via CLINK » avec un QR. Scanne-le avec un portefeuille CLINK comme ShockWallet. 🔗⚡ [specs](https://clinkme.dev/specs.html) [apps](https://clinkme.dev/apps.html)", + whatIsNoffer: "Un noffer est un code de paiement CLINK — une façon réutilisable, native Nostr, de se faire payer sans serveur web ni adresse Lightning. Ajoute le tien sur ton profil de skateshop/crew/Lab et les gens pourront te payer directement. 🔗", + whatAreTours: "Les tours sont des voyages de skate guidés — sessions locales, road trips nationaux ou tours world destruction. Trouve-les sur la carte ou dans la section Tours, retrouvez-vous et skatez de nouveaux terrains avec les locaux. 🗺️🛹", + whatIsAShop: "Les skateshops sont des shops locaux listés sur la carte. Découvre et soutiens de vrais skateshops (physiques ou en ligne) près de chez toi — certains acceptent même Bitcoin. 🏪", + howToSellGear: "Va dans Échange de matériel / Marketplace et crée une annonce (NIP-99). Ajoute des photos, un prix en sats, l'état, et éventuellement épingle-la sur un spot pour qu'elle apparaisse sur la carte. Les acheteurs te zappent ou t'écrivent directement. 🛹💸", + supporters: "SkateSpots est financé par la communauté via Angor (crowdfunding Bitcoin décentralisé) — pas de pub, pas d'investisseurs, pas de vente de données. Va voir la page Soutiens pour soutenir le projet et garder les rues libres. ❤️⚡", + trustScore: "Scores de confiance (0-100) propulsés par Relatr. Analyse ton réseau Nostr : abonnés, activité, engagement, zaps. Plus élevé = plus fiable. Aide à filtrer les bots et le spam. Consulte n'importe quel profil pour voir son score. 🛡️", + whatRelay: "SkateSpots utilise : 🛹 goskatespots.nostr1.com (principal, sur liste blanche pour la qualité) + relay.ditto.pub (mondial) + purplepag.es (agrégateur de profils). Tes données sont répliquées sur tous pour la redondance.", + tripPlanner: "Donne-moi une ville et je te construis un voyage de skate jour par jour 🗺️ — spots, événements, coachs et crews locaux, en tenant compte de la météo (jour de pluie = conseil de crew pour des spots couverts). Essaie « planifie-moi 3 jours à Lisbonne ». Je peux tout enregistrer dans une Collection, et te rediriger vers les vols/hébergements sur les vrais sites (pas de KYC, pas d'intermédiaire). 🛹", + planATrip: "Dis juste « planifie-moi 3 jours à Barcelone » (ou n'importe quelle ville) et je cartographierai les spots, sessions, coachs et crews locaux pour chaque jour. Enregistre-le comme une Collection et va shredder. 🗺️🛹", + sasquatchPro: "**Sasquatch Pro** 🦧⚡ est un pass de soutien Lightning qui débloque mon côté personnel :\n\n• 🧠 **Assistant personnel** — je lis ton propre Stash, tes crews, spots & annonces\n• ✨ **Brouillons d'actions** — liste du matériel, publie ton statut de skate, planifie des voyages (tu confirmes toujours avant toute publication)\n• 💬 **Contexte personnel** — mes réponses utilisent tes propres données, pas seulement les résultats publics\n• ⚡ **Soutiens le projet** — tu gardes SkateSpots gratuit et sans pub\n\nLe Sasquatch gratuit reste gratuit : recherche publique de spots/événements/coachs/crews, le glossaire & la planification de voyages fonctionnent sans Pro. Pro ajoute juste le côté *personnel*. Appuie sur **⚡ Passer Pro** en haut. Paliers : 7 jours ~2k sats, 1 mois ~5k, 3 mois ~12k, 1 an ~36k.", + proPerks: "Avantages Pro 🦧⚡ : assistant personnel (lit ton Stash/crews/spots/annonces), brouillons d'actions (lister du matériel, publier un statut, planifier des voyages — tu confirmes), et des réponses qui utilisent ton propre contexte personnel. En plus, tu soutiens directement SkateSpots et le gardes gratuit + sans pub. Le gratuit reste gratuit — Pro ajoute la couche personnelle. Appuie sur **⚡ Passer Pro** en haut.", + proVersion: "La version Pro de moi 🦧⚡ ajoute un **assistant personnel** : je peux lire ton propre Stash, tes crews, spots & annonces, rédiger des actions pour toi (lister du matériel, publier un statut, planifier un voyage — tu confirmes toujours d'abord), et utiliser ton contexte personnel dans mes réponses. Ça soutient aussi directement le projet. Le Sasquatch gratuit (recherche spots/événements/coachs/crews, glossaire, planificateur de voyages) reste gratuit. Appuie sur **⚡ Passer Pro** en haut.", + perks: "Avantages Pro 🦧⚡ : assistant personnel (ton Stash/crews/spots/annonces), brouillons d'actions que tu confirmes, et des réponses qui utilisent ton propre contexte — en plus tu gardes l'app gratuite & sans pub. Appuie sur **⚡ Passer Pro** en haut.", + goPro: "Appuie sur le bouton **⚡ Passer Pro** en haut pour ouvrir la fenêtre de mise à niveau. Pro débloque mon assistant personnel (Stash/crews/spots/annonces) et les brouillons d'actions, et soutient directement le projet. Paie avec Lightning — 7 jours ~2k sats jusqu'à 1 an ~36k sats. Les fonctions gratuites restent gratuites. 🦧", + proPricing: "Paliers Pro (paie avec Lightning ⚡) : **7 jours** ~2 000 sats (~1,20 $), **1 mois** ~5 000 sats (~3 $), **3 mois** ~12 000 sats (~7 $, -20 %), **1 an** ~36 000 sats (~21 $, meilleur rapport). Appuie sur **⚡ Passer Pro** en haut.", + howMuchIsPro: "Paliers Pro : 7 jours ~2 000 sats, 1 mois ~5 000 sats, 3 mois ~12 000 sats (-20 %), 1 an ~36 000 sats (meilleur rapport). Paie avec Lightning ⚡. Appuie sur **⚡ Passer Pro** en haut.", + upgrade: "Pour passer à Sasquatch Pro, appuie sur le bouton **⚡ Passer Pro** en haut. Paie avec Lightning (7 jours ~2k sats jusqu'à 1 an ~36k). Pro débloque mon assistant personnel et les brouillons d'actions, et soutient directement le projet. 🦧⚡", + }, + statsTitle: "📊 **SkateSpots en chiffres**", + weatherTemp: "• {{temp}}°C (ressenti {{feels}}°C)", + weatherSkateability: "• Skatabilité : **{{label}}** ({{score}}/100)", + weatherError: "Impossible de lire la météo pour l'instant. Réessaie dans une seconde. 🌧️", + labelSpots: "spots", + labelEvents: "événements", + labelLabPros: "pros du Lab", + labelCrews: "crews", + labelShops: "skateshops", + labelTours: "tours", + labelGear: "annonces de matériel", + unnamed: "Sans nom", + emptyWhere: " à **{{place}}**", + emptyResult: "Je n'ai trouvé aucun {{label}}{{where}} pour l'instant 🦧\n\nCela peut vouloir dire qu'aucun n'est encore listé — ou que les relays ont mis du temps à répondre. Réessaie dans un moment, vérifie l'orthographe, ou [ajoute le premier sur la carte](https://skate-spots.org/map). 🛹", + foundTitle: "{{emoji}} Trouvé **{{count}}** {{label}} :\n{{lines}}{{more}}", + moreResults: "\n\n…et **{{count}}** de plus — [vois-les tous sur la carte](https://skate-spots.org/map) 🗺️", + locationDenied: "Je ne peux pas voir ta position — rien ne quitte jamais ton appareil ; je la lis localement seulement quand tu le demandes, et le navigateur vient de refuser. Appuie sur 🎯 **Près de moi** sur la carte, ou donne-moi une ville : « spots à Bangkok ». 🛹", + noNearbySpots: "Aucun spot cartographié près de toi pour l'instant 🦧 — [sois le premier à en poser un](https://skate-spots.org/create-spot). 🛹", + closestTitle: "Les plus proches de toi en ce moment :", + closestFooter: "_Calculé sur ton appareil — ta position ne l'a jamais quitté._", + proNudge: "Ça, c'est un truc **Sasquatch Pro** 🦧⚡ — avec Pro, je peux lire ton Stash, tes crews, spots et annonces, rédiger des annonces de matériel, des recherches et des statuts de skate, et planifier tes voyages. C'est un pass de soutien Lightning qui garde SkateSpots gratuit & sans pub. Appuie sur le bouton **⚡ Passer Pro** en haut pour le débloquer. 🛹", + draftingProPerk: "Rédiger des actions (publier un statut, lister du matériel), c'est un avantage **Sasquatch Pro** 🦧⚡ — appuie sur **⚡ Passer Pro** en haut pour le débloquer.", + draftIntro: "Voici un brouillon — vérifie-le et appuie pour publier. Rien ne part en ligne avant que tu confirmes. 🛹", + draftFailed: "Je n'ai pas vraiment réussi à construire ce brouillon — essaie de me redonner les détails (ex. « liste mes roues Spitfire pour 8000 sats »).", + tripAskCity: "Où veux-tu aller ? Donne-moi une ville (ex. « planifie-moi 3 jours à Lisbonne ») et je te construirai un voyage. 🗺️", + tripEmptyMap: "Rien sur la carte pour **{{destination}}** pour l'instant 🦧 — sois le premier à poser des spots sur [skate-spots.org](https://skate-spots.org). Une fois que les locaux ajoutent des spots, crews & événements, je te construirai un voyage complet.", + tripLocked: "Mission **{{destination}}** verrouillée pour toi 🛹 — spots, sessions et locaux ci-dessous. Modifie-la ou enregistre-la.", + tripFailed: "Impossible de joindre les données en direct pour planifier ça maintenant. Réessaie dans un moment ! 🛹", + tripEmptyMapLocal: "Rien sur la carte pour **{{destination}}** pour l'instant 🦧 — sois le premier sur [skate-spots.org](https://skate-spots.org).", + tripMissionLocal: "Voici une mission **{{destination}}** 🛹 — spots, sessions & locaux ci-dessous.", + relayFailed: "Les relays n'ont pas répondu à temps 🛰️ — c'est généralement une connexion lente, pas un spot manquant. Retente dans un moment. 🛹", + couldNotProcess: "Hmm, je n'ai pas pu traiter ça. Essaie de reformuler !", + freeTierFallback: "Ça nécessite un raisonnement IA — une fonctionnalité **Sasquatch Pro** ⚡🦧\n\nJe peux quand même trouver **spots, événements, coachs, crews, skateshops, tours et matériel** directement depuis les relays — demande-moi par ex. « spots à Barcelone » — et le [Glossaire](/glossary) couvre plus de 150 tricks & termes. Appuie sur **⚡ Passer Pro** en haut pour débloquer les réponses IA.", + aiDownFallback: "Mon cerveau IA prend un peu d'air pour l'instant 🦧 — mais je t'ai quand même :\n\n• 🗺️ [Carte](/) — spots, skateshops, événements près de toi\n• 🧪 [The Lab](/lab) — coachs, filmeurs, monteurs\n• 📖 [Glossaire](/glossary) — plus de 150 tricks & termes\n• 👥 [Crews](/crews) — trouve les tiens\n\nOu dis-moi juste une **ville** (« spots à Barcelone ») ou un **trick** (« c'est quoi un nollie ») et je te répondrai directement. 🛹", + wentWrong: "Quelque chose a mal tourné de mon côté. Réessaie dans une seconde ! 🦧", + publishError: "Impossible de publier ça : {{error}}. Réessaie dans une seconde.", + unknownError: "erreur inconnue", + }, +}; export default frBatch2; diff --git a/src/i18n/fr/batch3.ts b/src/i18n/fr/batch3.ts index ef2c6d8..28625ed 100644 --- a/src/i18n/fr/batch3.ts +++ b/src/i18n/fr/batch3.ts @@ -1,4 +1,1294 @@ -/** fr — batch 3. Filled by the translation pass; empty until then. */ -const frBatch3 = {}; +/** fr — batch 3. */ +const frBatch3 = { + settingsUi: { + proSupport: { + title: "Pro et soutien", + subtitle: "Des extras facultatifs qui gardent SkateSpots gratuit", + prepaidTitle: "Prépayé, pas un abonnement", + prepaidBody: "Chaque achat est un paiement unique en Bitcoin/Lightning — pas de compte, pas de prélèvement récurrent, pas de garde. Payer à nouveau prolonge votre durée.", + sasquatchTitle: "Sasquatch Pro", + sasquatchBenefit: "Débloque l'assistant IA personnel — il peut lire votre propre Stash, vos crews et vos annonces — et aide à financer le projet.", + active: "Actif", + activeUntil: "Actif jusqu'au {{date}}", + daysLeft: "{{count}} jours restants", + notActive: "Inactif", + goPro: "Passer Pro", + extend: "Prolonger Pro", + day: "jour", + featuredTitle: "Mise en avant", + featuredBenefit: "Placez une annonce en haut avec un badge Pro — pour les profils The Lab, les événements, les shops et les tours.", + featuredHow: "Les paliers de durée s'appliquent à tous les types ; les engagements plus longs coûtent moins cher par jour. Vous mettez une annonce en avant quand vous la créez ou la modifiez.", + featuredUntil: "Jusqu'au {{date}}", + yourFeatured: "Vos annonces mises en avant", + noneFeatured: "Aucune mise en avant active.", + freeTitle: "Parcours gratuits", + freeBody: "La FAQ IA et la recherche locale sont toujours gratuites, et vous pouvez publier une annonce de marketplace avec une preuve de travail gratuite au lieu des frais en sats." + }, + notFound: { + seoTitle: "404 - Page introuvable", + seoDescription: "La page que vous cherchez est introuvable. Retournez à la page d'accueil pour continuer à naviguer.", + message: "Oups ! Page introuvable", + returnHome: "Retour à l'accueil" + }, + loginArea: { + signUp: "S'inscrire", + logIn: "Se connecter" + }, + accountSwitcher: { + switchAccount: "Changer de compte", + walletSettings: "Paramètres du portefeuille", + addAccount: "Ajouter un autre compte", + logout: "Se déconnecter" + }, + amberHint: { + defaultAction: "envoyer", + multiBefore: "Votre signataire vous demandera d'approuver", + multiTimes: "{{approvals}} fois", + multiAfter: "pour {{action}} — c'est normal pour les messages chiffrés (une approbation par destinataire). Approuvez chacune.", + single: "Votre signataire vous demandera d'approuver pour {{action}}." + }, + amberCallback: { + processing: "Traitement de la connexion Amber…", + gotResult: "Résultat reçu : {{result}}", + noResultDebug: "Aucun résultat d'Amber", + noResultToast: "Aucun résultat reçu d'Amber. L'opération a peut-être été annulée.", + validPubkey: "Clé publique valide ! Connexion…", + loginSuccessful: "Connexion réussie !", + loginErrorDebug: "Erreur de connexion : {{error}}", + invalidResultDebug: "Format de résultat invalide : {{result}}", + loggedInTitle: "Connecté", + amberLoginDesc: "Connexion réussie avec Amber !", + loginFailedTitle: "Échec de la connexion", + loginFailedDesc: "Impossible de terminer la connexion Amber. Veuillez réessayer.", + invalidPubkeyDesc: "Clé publique invalide reçue d'Amber.", + sessionLostToast: "Les données de session ont été perdues. Veuillez réessayer.", + eventSignedTitle: "Événement signé", + eventSignedDesc: "Votre événement a été signé par Amber.", + signingFailedTitle: "Échec de la signature", + signingFailedDesc: "Impossible de traiter l'événement signé d'Amber.", + operationCompleteTitle: "Opération terminée", + operationCompleteDesc: "{{op}} terminé." + }, + loginDialog: { + loginWithAmber: "Se connecter avec Amber (Android)", + welcomeTitle: "Bienvenue sur SkateSpots", + welcomeSubtitle: "Inscrivez-vous ou connectez-vous pour continuer", + newHere: "Nouveau ici ?", + createFree: "Créez un compte gratuit. Aucun e-mail requis.", + createAccount: "Créer un compte", + orLogIn: "Ou connectez-vous", + loggedInTitle: "🛹 Connecté !", + loggedIn: "Connecté !", + connectedAmber: "Connecté via Amber !", + amberLoginFailed: "Échec de la connexion Amber", + amberCancelled: "Connexion annulée. Appuyez sur « Ouvrir Amber » pour réessayer.", + amberNotFound: "Amber introuvable. Assurez-vous qu'Amber est installé depuis le ZapStore.", + loginFailed: "Échec de la connexion", + pubkeyError: "Collez votre pubkey hex (64 caractères) ou npub depuis Amber", + pairedSigner: "Associé à votre signataire.", + connectFailed: "Impossible de se connecter à votre signataire.", + openedEncrypted: "Votre clé chiffrée a été ouverte.", + openKeyFailed: "Impossible d'ouvrir cette clé.", + bunkerPrefix: "Doit commencer par bunker://", + connectedBunker: "Connecté via bunker !", + bunkerFailed: "Échec : {{error}}", + checkBunkerUri: "Vérifiez votre URI bunker", + nsecPrefix: "Doit commencer par nsec1", + invalidNsec: "nsec invalide : {{error}}", + checkKey: "Vérifiez votre clé", + noExtensionTitle: "Aucune extension trouvée", + noExtensionDesc: "Installez Alby ou une autre extension NIP-07.", + amberIdleDesc: "Votre clé reste dans Amber. Un appui — approuvez dans Amber et vous revenez ici, connecté. Rien à copier.", + continueWithAmber: "Continuer avec Amber", + noAmberGetIt: "Vous n'avez pas Amber ? Obtenez-le →", + waitingAmberTitle: "En attente d'Amber…", + waitingAmberDesc: "Approuvez la demande dans Amber. Vous serez connecté automatiquement dès votre retour.", + openAmberAgain: "Ouvrir Amber à nouveau", + havingTrouble: "Des difficultés ? Saisissez votre clé manuellement", + enterPublicKey: "Saisissez votre clé publique", + enterPublicKeyDescBefore: "Uniquement si le flux automatique n'a pas fonctionné. Dans Amber : appuyez sur votre profil →", + copyPublicKey: "Copier la clé publique", + enterPublicKeyDescAfter: "puis collez-la ici.", + connect: "Connecter", + back: "← Retour", + signInWithPhone: "Connectez-vous avec votre téléphone", + signInWithPhoneDesc: "Scannez avec une application signataire (Amber, nsec.app). Votre clé ne quitte jamais votre téléphone.", + showPairingCode: "Afficher le code d'appairage", + waitingSigner: "En attente de votre signataire…", + copyLink: "Copier le lien", + orPasteBunker: "ou collez une URL bunker", + bunkerTitle: "Bunker (NIP-46)", + bunkerPasteBefore: "Collez votre", + bunkerPasteAfter: "URI.", + amberInstructions: "Paramètres → Bunker NIP-46 → Créer → Copier", + nsecAppInstructions: "Connecter l'app → Copier l'URI bunker", + secretKeyTitle: "Clé secrète", + secretKeyRawDesc: "Collez directement votre clé secrète Nostr.", + secretKeyEncDesc: "Ouvrez une sauvegarde de clé protégée par mot de passe.", + rawNsec: "nsec brut", + encryptedNip49: "Chiffré (NIP-49)", + nsecWarning: "⚠️ À n'utiliser que sur un appareil de confiance. Ne partagez jamais votre nsec.", + login: "Connexion", + encSaferDesc: "Plus sûr : la clé reste chiffrée jusqu'à ce que vous saisissiez votre mot de passe, la sauvegarde peut donc être conservée en toute sécurité dans le cloud ou un gestionnaire de mots de passe.", + password: "Mot de passe", + openEncryptedKey: "Ouvrir la clé chiffrée", + browserExtensionTitle: "Extension de navigateur (NIP-07)", + browserExtensionDesc: "Idéal sur ordinateur. Compatible avec Alby, nos2x, Flamingo.", + loginWithExtension: "Se connecter avec l'extension" + }, + signupDialog: { + download: "Télécharger", + stepChoose: "Choisir", + stepProfile: "Profil", + stepSaveKey: "Enregistrer la clé", + somethingWrong: "Une erreur est survenue", + createFailed: "Impossible de créer votre compte. Veuillez réessayer.", + keySavedTitle: "Clé secrète enregistrée !", + keySavedDesc: "Votre clé a été stockée en toute sécurité.", + downloadFailedTitle: "Échec du téléchargement", + downloadFailedDesc: "Impossible de télécharger le fichier de clé. Veuillez le copier manuellement.", + encSavedTitle: "Sauvegarde chiffrée enregistrée 🔐", + encSavedDesc: "Conservez le fichier ET le mot de passe — les deux sont nécessaires pour vous reconnecter.", + encFailed: "Impossible de chiffrer cette clé.", + invalidFileTitle: "Type de fichier invalide", + invalidFileDesc: "Veuillez sélectionner un fichier image pour votre avatar.", + fileTooLargeTitle: "Fichier trop volumineux", + fileTooLargeDesc: "L'image d'avatar doit faire moins de 5 Mo.", + avatarUploadedTitle: "Avatar téléversé !", + avatarUploadedDesc: "Votre avatar a été téléversé avec succès.", + uploadFailedTitle: "Échec du téléversement", + uploadFailedDesc: "Impossible de téléverser l'avatar. Veuillez réessayer.", + nameRequiredTitle: "Nom d'affichage requis", + nameRequiredDesc: "Choisissez un nom d'affichage pour que les autres skateurs sachent qui vous êtes. Vous pouvez le modifier à tout moment.", + reserveFailedTitle: "Impossible de réserver ce nom", + reserveFailedDesc: "{{error}} Vous pourrez en réclamer un plus tard dans les Paramètres.", + profileCreatedTitle: "Profil créé !", + profileCreatedDesc: "Votre profil a été configuré.", + profileFailedTitle: "Échec de la configuration du profil", + profileFailedDesc: "Votre compte a été créé mais la configuration du profil a échoué. Vous pourrez le mettre à jour plus tard.", + welcomeToastTitle: "Bienvenue !", + welcomeToastDesc: "Votre compte est prêt.", + titleWelcome: "Rejoindre SkateSpots", + titleProfile: "Configurez votre profil", + titleDone: "Bienvenue !", + createFreeAccount: "Créez votre compte gratuit", + createFreeAccountDesc: "Pas d'e-mail, pas de téléphone, pas de mot de passe. Votre compte est une clé Nostr — choisissez où elle réside.", + recommended: "Recommandé", + signUpWithAmber: "S'inscrire avec Amber", + signUpWithAmberDesc: "Votre clé est créée et stockée dans l'application Amber — SkateSpots n'y touche jamais. Le plus sûr. Un appui pour approuver.", + continueWithAmber: "Continuer avec Amber", + orQuickWay: "ou la méthode rapide", + quickAccount: "Compte rapide sur cet appareil", + quickAccountDesc: "Nous générons une clé qui réside sur cet appareil. Démarrage le plus rapide — nous vous aiderons à enregistrer une sauvegarde juste après.", + createQuickAccount: "Créer un compte rapide", + quickReassurance: "5 secondes · réside sur cet appareil · nous vous aiderons à la sauvegarder ensuite", + preferAnotherSigner: "Vous préférez un autre signataire ?", + iosDesktopNudge: "Sur iOS ou ordinateur ? Une application signataire ou une extension de navigateur est l'option la plus sûre —", + seeAllOptions: "Voir toutes les options", + youreInPickName: "C'est bon ! 🛹 Choisissez un nom d'affichage pour que les skateurs sachent qui vous êtes", + changeAnytime: "Vous pourrez le modifier à tout moment. La bio et l'avatar sont facultatifs.", + publishingProfile: "Publication de votre profil…", + displayName: "Nom d'affichage", + displayNamePlaceholder: "ex. Tony, gnarlyGrind ou le nom de votre crew", + displayNameHint: "Requis — c'est ainsi que vous apparaîtrez sur SkateSpots. Modifiable à tout moment.", + skateName: "Votre nom SkateSpots", + skateNameHint: "Gratuit et facultatif — un identifiant vérifié qui affiche un ✓ sur votre profil.", + bio: "Bio", + bioPlaceholder: "Parlez de vous aux autres…", + avatar: "Avatar", + uploadAvatar: "Téléverser une image d'avatar", + saving: "Enregistrement…", + saveAndStart: "Enregistrer et commencer à skater", + addNameToContinue: "Ajoutez un nom d'affichage pour continuer.", + savingPublishesNote: "L'enregistrement publie votre profil sur Nostr — votre signataire pourra vous demander de l'approuver une fois.", + youreIn: "C'est bon ! 🛹", + oneQuickThing: "Une dernière petite chose avant de vous lancer…", + saveLoginKey: "Enregistrez votre clé de connexion", + saveLoginKeyBefore: "C'est le", + only: "seul", + saveLoginKeyAfter: "moyen de revenir dans votre compte — pas d'e-mail, pas de réinitialisation de mot de passe. Enregistrez-la maintenant et vous pourrez vous connecter sur n'importe quel appareil, partout où vous skatiez.", + revealSaveKey: "Révéler et enregistrer ma clé", + recoveryCopied: "Code de récupération copié. Conservez-le en lieu sûr.", + saved: "Enregistré", + treatLikeBoardKeys: "Traitez-le comme les clés de votre planche — quiconque possède ce code contrôle votre compte. Ne le partagez jamais.", + hideEncBackup: "Masquer la sauvegarde chiffrée", + saveEncBackup: "Enregistrer une sauvegarde chiffrée", + encBackupBefore: "Une copie protégée par mot de passe — sûre à conserver dans le cloud ou un gestionnaire de mots de passe. Vous aurez besoin du fichier", + and: "et", + encBackupAfter: "du mot de passe.", + choosePassword: "Choisissez un mot de passe", + saveEncBackupCta: "Enregistrer la sauvegarde chiffrée", + savedCodeAria: "J'ai enregistré mon code de récupération", + savedCodeLabel: "J'ai enregistré mon code de récupération en lieu sûr — un gestionnaire de mots de passe, ou noté hors ligne.", + letsSkate: "Allons skater", + saveLater: "Je l'enregistrerai plus tard depuis les Paramètres", + advancedSigner: "Avancé : utiliser une application signataire à la place" + }, + mnemonic: { + generatedTitle: "Phrase de récupération générée ! 🎉", + generatedDesc: "Notez ces 12 mots dans l'ordre. Ils sont la clé de votre compte !", + savedTitle: "Phrase de récupération enregistrée !", + savedDesc: "Conservez ce fichier en lieu sûr.", + downloadFailedTitle: "Échec du téléchargement", + downloadFailedDesc: "Impossible de télécharger le fichier. Veuillez copier manuellement.", + copiedTitle: "Copié dans le presse-papiers !", + copiedDesc: "Votre phrase de récupération a été copiée.", + qrWindowTitle: "Code QR de la phrase de récupération", + qrHeading: "Le code QR de votre phrase de récupération", + qrAlt: "Code QR de la phrase de récupération", + qrWarning: "Gardez ce code QR privé et sécurisé !", + qrPrint: "Imprimer le code QR", + qrFailedTitle: "Échec du code QR", + qrFailedDesc: "Impossible de générer le code QR.", + accountCreatedTitle: "Compte créé ! 🎉", + accountCreatedDesc: "Tout est prêt ! Votre phrase de récupération est sécurisée.", + loginFailedTitle: "Échec de la connexion", + loginFailedDesc: "Impossible de créer le compte. Veuillez réessayer.", + verifyFailedTitle: "Échec de la vérification", + verifyFailedDesc: "Les mots ne correspondent pas. Veuillez vérifier et réessayer.", + titlePrefix: "Créer un compte avec", + titleSuffix: "Phrase de récupération", + twelveWordTitle: "Phrase de récupération de 12 mots", + twelveWordDesc: "Votre phrase de récupération est comme un mot de passe principal. Notez-la sur papier et gardez-la en sécurité. Vous en aurez besoin pour accéder à votre compte depuis d'autres appareils ou si vous effacez les données de votre navigateur.", + generate: "Générer la phrase de récupération", + useNsecInstead: "Utiliser plutôt une clé nsec avancée", + yourPhrase: "Votre phrase de récupération", + copy: "Copier", + download: "Télécharger", + qrCode: "Code QR", + criticalWarning: "Avertissement de sécurité critique", + warnWriteStrong: "Notez-la", + warnWrite: "sur papier et conservez-la en lieu sûr", + warnNeverShareStrong: "Ne partagez jamais", + warnNeverShare: "votre phrase de récupération avec qui que ce soit", + warnBackupsStrong: "Gardez plusieurs sauvegardes", + warnBackups: "dans différents lieux sûrs", + warnAnyoneStrong: "Quiconque possède cette phrase", + warnAnyone: "contrôle votre compte pour toujours", + warnLoseStrong: "Si vous la perdez", + warnLose: "vous perdez votre compte définitivement", + savedSecurely: "Je l'ai enregistrée en lieu sûr", + verifyTitle: "Vérifiez votre phrase de récupération", + verifyDesc: "Pour vous assurer que vous l'avez bien enregistrée, veuillez saisir ces mots :", + wordLabel: "Mot n° {{n}}", + wordPlaceholder: "Saisissez le mot n° {{n}}", + goBack: "Retour", + verifyCreate: "Vérifier et créer le compte", + completeTitle: "Compte créé !", + completeDesc: "Votre compte Nostr est prêt !", + signerTitle: "Recommandé : configurer une application signataire", + signerSubtitle: "Gardez vos clés encore plus en sécurité", + signerDesc: "Pour plus de sécurité, utilisez une application signataire dédiée plutôt que de coller votre phrase de récupération partout. Les applications signataires gardent vos clés en sécurité tout en vous laissant utiliser n'importe quelle application Nostr.", + signerCta: "En savoir plus sur les applications signataires", + skip: "Ignorer pour l'instant" + }, + signupMethod: { + titlePrefix: "Choisissez votre", + titleSuffix: "méthode d'inscription", + subtitle: "Les deux méthodes sont sûres. Choisissez celle qui vous convient le mieux !", + recommended: "Recommandé", + mnemonicTitle: "Phrase de récupération", + mnemonicDesc: "12 mots faciles à mémoriser. La norme de l'industrie utilisée par Bitcoin, Ethereum et la plupart des portefeuilles crypto.", + mnemonicF1: "Facile à noter sur papier", + mnemonicF2: "Compatible avec d'autres applications Nostr (NIP-06)", + mnemonicF3: "Peut générer plusieurs comptes", + mnemonicF4: "Familier pour les utilisateurs de crypto", + useMnemonic: "Utiliser une phrase de récupération", + advanced: "Avancé", + nsecTitle: "Clé secrète (nsec)", + nsecDesc: "Clé cryptographique brute. Plus technique mais vous donne un accès direct à votre identité Nostr.", + nsecF1: "Contrôle cryptographique direct", + nsecF2: "Compatible avec toutes les applications Nostr", + nsecF3: "Une seule chaîne à sauvegarder", + nsecF4: "Aucune couche de dérivation", + useNsec: "Utiliser la clé secrète", + footer: "🔒 Les deux méthodes sont tout aussi sûres. Choisissez selon votre préférence !" + }, + skateNip05: { + placeholder: "votrenom", + claimedSuffix: "est à vous — enregistrez votre profil pour le publier.", + checking: "Vérification de la disponibilité…", + available: "{{name}}@{{domain}} est disponible", + claim: "Le réserver", + hint: "Lettres, chiffres, tirets. Gratuit, et affiché comme un badge ✓ sur votre profil." + }, + nip05Required: { + getFree: "Obtenir un NIP-05 gratuit / pas cher", + paid: "Payant", + requiredTitle: "Vérification NIP-05 requise", + bannerReason: "Pour éviter le spam et instaurer la confiance, {{role}} ont besoin d'une adresse Nostr vérifiée (NIP-05).", + gateReason: "Pour éviter le spam et instaurer la confiance, {{role}} doit avoir une vérification NIP-05.", + addInSettings: "Ajouter un NIP-05 dans les Paramètres", + explainer: "Le NIP-05 prouve votre identité en reliant votre profil Nostr à un domaine — comme", + updateProfile: "Mettre à jour votre profil" + }, + editProfile: { + uploadSuccessTitle: "Succès", + uploadSuccessDesc: "{{field}} téléversé avec succès", + uploadErrorDesc: "Impossible de téléverser {{field}}. Veuillez réessayer.", + mustBeLoggedIn: "Vous devez être connecté pour mettre à jour votre profil", + invalidClinkTitle: "Code CLINK invalide", + invalidClinkDesc: "Cela ne ressemble pas à un code noffer1… valide. Effacez-le ou collez-en un valide.", + invalidLightningTitle: "Adresse Lightning invalide", + invalidLightningDesc: "Utilisez une adresse de type e-mail comme vous@walletofsatoshi.com.", + invalidSpTitle: "Adresse Silent Payment invalide", + invalidSpDesc: "Une adresse Silent Payment commence par « sp1 » et est assez longue. Effacez-la ou collez-en une valide.", + invalidCordnTitle: "Lien Cordn invalide", + invalidCordnDesc: "Collez un lien de contact Cordn https://… complet.", + updateSuccessTitle: "Succès", + updateSuccessDesc: "Votre profil a été mis à jour", + updateErrorDesc: "Impossible de publier le profil. Vérifiez vos connexions aux relais dans Paramètres > Relais", + identityTitle: "Identité", + identityDesc: "Comment vous apparaissez sur SkateSpots.", + displayName: "Nom d'affichage", + displayNamePlaceholder: "Votre nom", + bio: "Bio", + bioPlaceholder: "Quelques mots sur vous et votre skate…", + profilePicture: "Photo de profil", + pictureDesc: "Téléversez ou collez une image carrée.", + bannerImage: "Image de bannière", + bannerDesc: "Une image large pour le haut de votre profil.", + website: "Site web", + bitcoinTitle: "Bitcoin et paiements", + bitcoinDesc: "Laissez les gens vous zapper, vous donner un pourboire et vous payer directement — sans intermédiaire.", + lightningAddress: "Adresse Lightning", + lud16Invalid: "Utilisez une adresse de type e-mail, ex. vous@votredomaine.com.", + lud16Ok: "Alimente le bouton « Zap » sur votre profil.", + lud16Hint: "Pourboires Bitcoin instantanés. Alimente le bouton « Zap » sur votre profil.", + silentPaymentAddress: "Adresse Silent Payment", + spInvalid: "Doit commencer par « sp1 » et être assez longue.", + spOk: "Valide — une adresse on-chain réutilisable et privée.", + spHint: "Adresse on-chain statique réutilisable (BIP-352). Partagez-la une fois ; chaque paiement est non traçable.", + clinkTipCode: "Code de pourboire CLINK", + nofferInvalid: "Cela ne ressemble pas à un code noffer1… valide.", + nofferOk: "Valide — un bouton « Pourboire en Bitcoin » s'affichera sur votre profil.", + nofferHint: "Code CLINK auto-dépositaire pour que n'importe qui puisse vous donner un pourboire via Nostr — sans intermédiaire.", + skateProfileTitle: "Profil de skate", + skateProfileDesc: "Pour représenter vos sponsors et indiquer comment le crew vous contacte.", + badges: "Badges", + badgesHint: "(libellé + lien facultatif)", + badgeExample: "ex. Independent Trucks", + badgeLabelPlaceholder: "Libellé du badge…", + badgeUrlPlaceholder: "https://… (facultatif)", + removeBadge: "Supprimer le badge", + addBadge: "Ajouter un badge", + badgesDescBefore: "Sponsors, shops ou personnes qui soutiennent votre skate — et tout ce que vous voulez mettre en avant. Chacun devient une pastille cliquable sur votre profil. Votre", + badgesDescAfter: "badge de membre est ajouté automatiquement.", + coordinator: "Coordinateur", + cordnInvalid: "Cela ne ressemble pas à un coordinateur. Collez un nprofile, un lien cordn.net ou une URL https://.", + cordnOk: "Affiché sur votre profil — les autres peuvent l'ajouter en un appui.", + cordnHint: "Le coordinateur Cordn que les autres utilisent pour vous écrire. Privé, chiffré, à vous.", + useMyCoordinator: "Utiliser mon coordinateur", + accountTitle: "Compte", + accountDesc: "Paramètres de compte supplémentaires.", + botAccount: "Compte bot", + botAccountDesc: "Marquer ce compte comme automatisé ou comme un bot.", + saving: "Enregistrement…", + saveProfile: "Enregistrer le profil", + nip05VerifiedHandle: "Identifiant vérifié NIP-05", + nip05How: "Comment ?", + extraHandles: "Identifiants supplémentaires", + extraHandlesHint: "facultatif — jusqu'à 5", + nip05HintEmpty: "Un identifiant vérifié comme vous@votredomaine.com — la version Nostr de la coche bleue. Affiche un badge ✓ sur votre profil et débloque le filtre « Vérifié » dans l'annuaire des skateurs.", + nip05Invalid: "Utilisez un identifiant de type e-mail, ex. vous@votredomaine.com — sans « https:// » ni espaces.", + nip05Checking: "Vérification de votre domaine…", + nip05Verified: "Vérifié — votre domaine confirme que cet identifiant vous appartient. ✓", + nip05Mismatch: "Votre domaine associe cet identifiant à une clé DIFFÉRENTE. Corrigez votre .well-known/nostr.json pour qu'il pointe vers ce compte.", + nip05Unreachable: "Impossible d'atteindre le /.well-known/nostr.json de votre domaine pour l'instant. Les identifiants enregistrés fonctionneront dès que votre domaine sera correctement configuré.", + nip05Enter: "Saisissez votre identifiant NIP-05.", + freeHandleBefore: "Pas de domaine à vous ? Réclamez un", + freeHandleAfter: "identifiant gratuit auprès de SkateSpots.", + uploadLabel: "Téléverser {{label}}", + previewLabel: "Aperçu de {{label}}" + }, + security: { + recoveryCopied: "Code de récupération copié. Conservez-le en lieu sûr.", + savedTitle: "Enregistré !", + recoveryDownloaded: "Code de récupération téléchargé. Conservez-le en lieu sûr.", + downloadFailedTitle: "Échec du téléchargement", + downloadFailedDesc: "Veuillez le copier manuellement à la place.", + loginRequired: "Connexion requise", + loginRequiredDesc: "Connectez-vous pour accéder aux paramètres de sécurité.", + backupConfirmedTitle: "Sauvegarde confirmée ! ✅", + backupConfirmedDesc: "Parfait ! Vos clés sont en sécurité.", + yourRecoveryCode: "Votre code de récupération", + recoveryCodeDesc: "Vous ne l'avez pas enregistré à l'inscription ? Vous pouvez le récupérer ici à tout moment.", + recoveryCodeBefore: "Ce code est le", + only: "seul", + recoveryCodeAfter: "moyen de vous reconnecter sur un nouvel appareil ou navigateur. Conservez-le en lieu sûr (un gestionnaire de mots de passe, ou noté sur papier). Quiconque le possède contrôle votre compte — ne le partagez jamais.", + revealRecovery: "Révéler mon code de récupération", + qrHint: "Scannez avec une autre application Nostr pour vous connecter. Gardez cet écran privé.", + neverShareHide: "⚠️ Ne le partagez jamais. Masquez-le quand vous avez terminé.", + hide: "Masquer", + amberNoteBefore: "Vous êtes connecté avec", + amberNoteAfter: ". Votre code de récupération réside dans Amber — ouvrez l'application Amber pour le sauvegarder. SkateSpots ne voit jamais votre clé.", + bunkerNoteBefore: "Vous êtes connecté avec un", + remoteSigner: "signataire distant (bunker)", + bunkerNoteAfter: ". Votre code de récupération est détenu par votre service signataire, pas par SkateSpots. Sauvegardez-le là-bas.", + extensionNoteBefore: "Vous êtes connecté avec une", + browserExtension: "extension de navigateur", + extensionNoteAfter: ". Votre code de récupération réside dans l'extension — utilisez sa propre option de sauvegarde/export. SkateSpots ne voit jamais votre clé.", + otherNote: "Votre code de récupération est géré par votre application signataire, pas par SkateSpots. Sauvegardez-le là-bas.", + backupWarningTitle: "⚠️ Avez-vous sauvegardé votre phrase de récupération ou votre clé secrète ?", + backupWarningBody: "Vos clés sont le SEUL moyen d'accéder à votre compte. Si vous les perdez, vous perdez tout — il n'y a pas de réinitialisation de mot de passe !", + iveBackedUp: "J'ai sauvegardé mes clés", + backupConfirmed: "✅ Sauvegarde confirmée", + backupNotConfirmed: "⚠️ Sauvegarde non confirmée", + backupConfirmedStatusDesc: "Vous avez confirmé que vos clés sont sauvegardées en lieu sûr.", + backupNotConfirmedDesc: "Assurez-vous de sauvegarder votre phrase de récupération ou votre clé secrète !", + notSavedYetBefore: "Vous n'avez pas encore enregistré votre code de récupération ? Pas de problème — récupérez-le dans la", + notSavedYetAfter: "section ci-dessus, conservez-le en lieu sûr, puis confirmez ci-dessous.", + yesBackedUp: "Oui, j'ai sauvegardé mes clés", + bestPracticesTitle: "Bonnes pratiques de sécurité des clés", + bestPracticesDesc: "Comment garder votre compte Nostr en sécurité", + bp1Title: "Notez-la sur papier", + bp1Desc: "La sauvegarde physique est la plus sûre. Conservez-la dans un endroit sécurisé comme un coffre-fort.", + bp2Title: "Plusieurs sauvegardes", + bp2Desc: "Gardez des copies dans différents endroits sûrs (coffre à la maison, coffre-fort bancaire, etc.)", + bp3Title: "Ne partagez jamais vos clés", + bp3Desc: "Les vraies applications Nostr ne demandent JAMAIS votre nsec ou votre phrase de récupération après la première connexion", + bp4Title: "Ne stockez pas dans le cloud sans chiffrement", + bp4Desc: "Évitez Google Docs, les brouillons d'e-mails ou le stockage cloud en texte brut", + bp5Title: "Envisagez d'utiliser une extension de navigateur", + bp5Desc: "Alby, nos2x ou Flamingo gardent vos clés en sécurité et ne les exposent jamais aux sites web", + importantReminders: "⚠️ Rappels importants", + rem1: "Si vous perdez vos clés, vous perdez votre compte définitivement", + rem2: "Aucune entreprise ni personne ne peut réinitialiser votre mot de passe — pas même nous", + rem3: "Quiconque possède vos clés a le contrôle total de votre compte", + rem4: "Vos clés contrôlent toutes vos données Nostr dans TOUTES les applications", + recommendedSigners: "🔌 Signataires Nostr recommandés", + recommendedSignersDesc: "Utilisez un signataire Nostr pour plus de sécurité et de commodité", + recommended: "Recommandé", + amberDesc: "Signataire Nostr sécurisé pour Android. Garde vos clés en sécurité sur votre téléphone et signe les événements sans les exposer.", + albyDesc: "Extension complète avec portefeuille Lightning, WebLN et prise en charge de NWC.", + flamingoDesc: "Interface simple et épurée. Se concentre sur la signature Nostr sans fonctionnalités de portefeuille.", + nos2xDesc: "Extension minimale et légère pour utilisateurs avancés.", + nostrConnectTitle: "☁️ Nostr Connect (signataires distants)", + nostrConnectDesc: "Utilisez un signataire distant pour accéder à votre compte depuis n'importe quel appareil", + nostrConnectBody: "Nostr Connect (aussi appelé « bunkers ») vous permet de stocker vos clés sur un serveur sécurisé et de vous connecter depuis n'importe quel appareil. Vos clés ne quittent jamais le serveur, mais vous pouvez utiliser votre compte partout !", + nsecAppDesc: "Signataire distant gratuit et sécurisé. Créez une URI bunker:// et collez-la lors de la connexion.", + nostrumDesc: "Une autre option de signataire distant avec prise en charge mobile.", + howToUse: "💡 Comment l'utiliser :", + howToUseDesc: "Créez un compte sur l'un de ces services, obtenez votre chaîne de connexion bunker://, puis collez-la dans l'onglet « Nostr Connect » lors de la connexion." + }, + relayList: { + connected: "Connecté", + connecting: "Connexion…", + offline: "Hors ligne", + removeUrl: "Supprimer {{url}}", + add: "Ajouter", + publishedTitle: "Liste de relais publiée", + publishedDesc: "Synchronisé sur Nostr (kind 10002).", + publishFailedTitle: "Échec de la publication de la liste de relais", + invalidUrlTitle: "URL de relais invalide", + invalidUrlDesc: "Essayez quelque chose comme wss://relay.example.com", + alreadyInList: "Relais déjà dans votre liste", + keepReadWriteTitle: "Conservez la lecture ou l'écriture sur", + keepReadWriteDesc: "Un relais a besoin d'au moins la lecture ou l'écriture.", + alreadyInThisList: "Relais déjà dans cette liste", + dmPublishedTitle: "Relais de MP publiés", + dmPublishedDesc: "Boîte de réception NIP-17 mise à jour.", + dmPublishFailedTitle: "Échec de la publication des relais de MP", + nip65Title: "Relais (NIP-65)", + nip65DescUser: "Appuyez sur Lecture / Écriture pour basculer. Publié sur Nostr en tant que liste kind 10002.", + nip65DescLoggedOut: "Appuyez sur Lecture / Écriture pour basculer. Connectez-vous pour publier votre liste sur Nostr.", + noRelays: "Aucun relais pour l'instant — ajoutez-en un ci-dessous.", + local: "Local", + read: "Lecture", + readHint: "Récupérer le contenu depuis ce relais", + write: "Écriture", + writeHint: "Publier vos événements sur ce relais", + dmTitle: "Relais de boîte de réception MP", + dmDesc: "Où vous recevez les messages privés NIP-17 (kind 10050). Revient à vos relais d'écriture lorsqu'elle est vide.", + localTitle: "Relais locaux", + localDesc: "Uniquement dans l'application (par ex. un nœud LAN). Utilisés pour la lecture et l'écriture ; jamais publiés.", + blockedTitle: "Relais bloqués", + blockedDesc: "Ne jamais s'y connecter — exclus de toute lecture et écriture." + }, + relatr: { + searchingTitle: "Recherche du service Relatr…", + searchingDesc: "Interrogation de Nostr pour les profils Relatr", + foundTitle: "Service Relatr trouvé !", + foundDesc: "Service : {{name}}", + unknown: "Inconnu", + notFoundTitle: "Aucun service Relatr trouvé", + notFoundDesc: "Essayez de saisir la pubkey manuellement ou consultez https://www.relatr.xyz/", + searchFailedTitle: "Échec de la recherche", + searchFailedDesc: "Impossible d'interroger Nostr pour les profils Relatr", + invalidPubkeyTitle: "Pubkey invalide", + invalidPubkeyDesc: "Veuillez saisir une pubkey hex valide de 64 caractères", + enabledTitle: "Relatr activé !", + enabledDesc: "Les scores de confiance globaux sont maintenant actifs.", + disabledTitle: "Relatr désactivé", + disabledDesc: "Les scores de confiance ne sont plus récupérés.", + title: "Scores de confiance Relatr", + desc: "Les scores de confiance globaux aident à identifier les utilisateurs fiables et à réduire le spam", + status: "Statut", + active: "Actif", + disabled: "Désactivé", + activeStrong: "Relatr est actif.", + activeDesc: "Les scores de confiance issus de l'analyse du réseau global de ContextVM aident à identifier les skateurs fiables et à réduire le spam.", + disabledStrong: "Relatr est désactivé.", + disabledHint: "Activez-le pour obtenir les scores de confiance du réseau Nostr global.", + disable: "Désactiver Relatr", + enable: "Activer Relatr", + advancedSettings: "Paramètres avancés", + servicePubkey: "Pubkey du service Relatr", + pubkeyPlaceholder: "Saisissez une pubkey hex de 64 caractères…", + searching: "Recherche…", + autoDiscover: "Découverte auto", + pubkeyDefault: "Par défaut : service Relatr officiel de ContextVM (npub1dvmc…)", + relayLabel: "Relais (où Relatr publie les scores)", + relayDefault: "Par défaut : wss://relay.contextvm.org (relais officiel de ContextVM)", + applyChanges: "Appliquer les modifications", + learnMore: "En savoir plus :", + website: "Site Relatr", + github: "GitHub Relatr", + nip85Spec: "Spécification NIP-85" + }, + followList: { + unfollow: "Ne plus suivre", + title: "Votre réseau Nostr", + desc: "Gérez qui vous suivez. Suivre des utilisateurs aide à bâtir votre toile de confiance et détermine quels spots affichent des badges de confiance.", + following: "Abonnements ({{count}})", + followers: "Abonnés ({{count}})", + follow: "Suivre", + followHint: "💡 Collez une pubkey Nostr (npub1...), une adresse NIP-05 (user@domain.com) ou une pubkey hex", + notFollowing: "Vous ne suivez encore personne", + notFollowingHint: "Suivez des skateurs pour voir leurs spots avec des badges ✅ VÉRIFIÉ", + trustActiveStrong: "✅ Badges de confiance actifs :", + trustActive: "Les spots créés par les personnes que vous suivez afficheront désormais des badges VÉRIFIÉ. Les spots de leurs amis afficheront des badges DE CONFIANCE.", + noFollowers: "Aucun abonné pour l'instant", + noFollowersHint: "Partagez votre profil Nostr pour gagner des abonnés !", + howTitle: "💡 Comment le suivi affecte les badges de confiance", + verifiedStrong: "✅ VÉRIFIÉ (vert) :", + verifiedDesc: "Spots créés par les personnes que vous suivez directement", + trustedStrong: "🟡 DE CONFIANCE (jaune) :", + trustedDesc: "Spots créés par les personnes que vos amis suivent (2 sauts)", + unverifiedStrong: "⚪ Non vérifié :", + unverifiedDesc: "Spots d'utilisateurs sans lien avec votre réseau", + tip: "💡 Astuce : suivez des skateurs actifs pour voir plus de spots vérifiés et bâtir votre réseau de confiance !" + }, + notify: { + enableTitle: "Activer les notifications", + enableDesc: "Faites vibrer cet appareil quand quelque chose vous attend.", + checkingPermission: "Vérification de l'autorisation…", + unsupported: "Cet appareil ne prend pas en charge les notifications ici. Recompilez l'application Android pour les activer sur votre téléphone.", + denied: "Les notifications sont bloquées pour ce site. Autorisez-les dans les paramètres de votre navigateur/système, puis réessayez.", + backgroundTitle: "Notifications en arrière-plan", + backgroundDesc: "Soyez averti des messages et des échanges même lorsque SkateSpots est fermé.", + pushUnsupported: "Ce navigateur ne prend pas en charge le push en arrière-plan. Sur mobile, ajoutez SkateSpots à votre écran d'accueil.", + pushPrivacy: "Pour vous joindre lorsque l'application est fermée, un serveur de notification SkateSpots reçoit un ping de votre relais lorsque quelque chose arrive pour votre clé et le transmet au service push de votre téléphone. Il voit seulement que votre clé a quelque chose — jamais qui l'a envoyé ni ce qu'il dit, et il ne peut pas déchiffrer vos messages. Optez-y appareil par appareil.", + bgDeliveryTitle: "Livraison en arrière-plan (Android)", + bgDeliveryDesc: "Vérifiez les nouveaux messages, offres et échanges pendant que l'application est fermée — sans services Google.", + off: "Désactivé", + standard: "Standard (~15 min)", + fast: "Rapide (~5 min)", + bgDeliveryNote: "Standard est au mieux — Android peut le différer en mode Doze. Rapide affiche une notification persistante et consomme plus de batterie. Rien n'est déchiffré sur notre serveur.", + notifyMeAbout: "Me notifier à propos de", + couldNotEnable: "Impossible d'activer", + sendTest: "Envoyer une notification de test", + testTitle: "Les notifications SkateSpots sont activées 🛹", + testBody: "Voici à quoi ressembleront un MP, un zap ou une invitation de crew.", + footerBefore: "Les alertes sont construites sur votre appareil à partir des données que l'application possède déjà, et les alertes de messages privés ne déchiffrent jamais vos messages — Amber n'est donc jamais sollicité pour en ouvrir un. Avec", + footerAfter: "désactivé, une application entièrement fermée ne peut pas être jointe, les alertes arrivent donc à la prochaine ouverture de SkateSpots.", + cat_dms_label: "Messages privés", + cat_dms_hint: "Quelqu'un vous envoie un message privé", + cat_crew_label: "Crews", + cat_crew_hint: "Invitations, demandes d'adhésion et confirmations d'adhésion", + cat_social_label: "Zaps, réponses et mentions", + cat_social_hint: "Réactions, reposts, zaps, réponses et mises à jour d'événements", + cat_newsletter_label: "Newsletter", + cat_newsletter_hint: "Nouveautés SkateSpots (abonnés uniquement)", + cat_trades_label: "Offres et échanges", + cat_trades_hint: "Offres, contre-offres et confirmations d'échange", + cat_reminders_label: "Rappels d'événements", + cat_reminders_hint: "Un rappel une heure avant les événements auxquels vous allez (application Android)" + }, + regionBackfill: { + taggedTitle: "{{count}} emplacement{{s}} avec étiquette", + taggedSkipped: "Sans coordonnées ni correspondance de géocodage : {{count}}.", + taggedOk: "Étiquettes de région écrites sur le relais communautaire.", + nothingTitle: "Rien à étiqueter", + nothingDesc: "Aucun pin n'a pu être géocodé. Réessayez plus tard.", + failedTitle: "Échec du remplissage", + title: "Remplir les étiquettes de région", + admin: "Admin", + descBefore: "Les pins créés avant l'existence du géocodage ont des coordonnées mais aucune étiquette de ville/pays, donc la carte les dessine alors que les statistiques communautaires ne peuvent dire que « Non catégorisé ». Ceci redérive les étiquettes de chaque pin et republie", + descStrong: "vos propres", + descAfter: "spots et shops non étiquetés.", + scanning: "Analyse de vos spots…", + allTagged: "Chaque spot et shop que vous possédez a déjà une étiquette de région. 🎉 Les pins restants « Non catégorisés » appartiennent à d'autres cartographes — seules leurs propres clés peuvent les étiqueter.", + countLine: "{{count}} de vos spot{{s}}/shops n'ont pas d'étiquette de région. Votre signataire pourra demander d'approuver chacun.", + tagging: "Étiquetage {{done}}/{{total}}…", + run: "Remplir les étiquettes de région", + summary: "{{updated}} mis à jour · {{skipped}} ignorés · {{failed}} échoués" + }, + adminReview: { + title: "File de révision", + flagged: "Signaux indésirables sur {{count}} spot{{s}} — masquez ou ignorez.", + clean: "Spots qui ressemblent à des entrées de test ou à des pins hors sujet." + }, + grantPro: { + invalidNpub: "Saisissez un npub valide (ou une pubkey hex)", + invalidDays: "Le nombre de jours doit être un nombre positif", + grantedTitle: "Pro accordé ⚡", + grantedDesc: "{{npub}} jusqu'au {{date}}", + failedTitle: "Échec de l'attribution", + title: "Accorder Sasquatch Pro", + owner: "Propriétaire", + desc: "Solution manuelle pour un paiement vérifié que le reçu de zap a manqué. Publie une attribution signée par le propriétaire ; l'utilisateur ne peut pas la falsifier.", + targetPlaceholder: "npub1… (ou hex)", + grant: "Accorder" + }, + myData: { + reactionTitle: "Réaction {{emoji}}", + deleting: "Suppression…", + requestDeletion: "Demander la suppression", + selectContentTitle: "Sélectionner le contenu à supprimer", + selectContentDesc: "Sélectionnez les éléments précis pour lesquels vous voulez demander la suppression.", + all: "Tout", + spots: "Spots", + events: "Événements", + shops: "Shops", + listings: "Annonces", + collections: "Collections", + lab: "Lab", + posts: "Publications", + reactions: "Réactions", + selectAll: "Tout sélectionner", + selectAllVisible: "Tout sélectionner (visible)", + selectedCount: "Sélection : {{count}}", + noItemsCategory: "Aucun élément dans cette catégorie", + decentralizedStrong: "Important :", + decentralizedNote: "Nostr est décentralisé. Les relais devraient honorer les demandes de suppression, mais certains pourraient ne pas le faire. Il ne s'agit pas d'une suppression permanente garantie.", + deleteCount: "Supprimer {{count}} élément{{s}}", + noDataTitle: "Aucune donnée à exporter", + noDataDesc: "Vous n'avez encore publié aucun événement.", + exportedTitle: "Données exportées !", + exportedDesc: "{{count}} événements téléchargés en JSON.", + deletionRequestedTitle: "Suppression demandée", + deletionRequestedDesc: "La demande de suppression a été publiée sur les relais.", + deletionRequestedMany: "Suppression de {{count}} éléments demandée. Remarque : certains relais pourraient ne pas honorer cette demande.", + deletionFailedTitle: "Échec de la suppression", + deletionFailedDesc: "Impossible de publier la demande de suppression. Veuillez réessayer.", + loginRequired: "Connexion requise", + loginRequiredDesc: "Connectez-vous pour consulter et gérer vos données.", + title: "Mes données", + desc: "Votre contenu sur le réseau Nostr. Ces données vous appartiennent — exportez-les à tout moment ou demandez leur suppression.", + coachFilmer: "Coach/Filmeur", + zaps: "Zaps", + received: "Reçus", + exportAll: "Exporter toutes les données", + recentActivity: "Activité récente", + viewAll: "Voir tout ({{count}})", + noDataPublished: "Aucune donnée publiée pour l'instant", + startBy: "Commencez par", + addingASpot: "ajouter un spot", + aboutYourData: "À propos de vos données", + ownDataStrong: "Vos données vous appartiennent.", + ownData: "Tout le contenu est signé avec vos clés cryptographiques et stocké sur des relais Nostr. Aucune entreprise ne le contrôle.", + exportAnytimeStrong: "Exportez à tout moment", + exportAnytime: "- Téléchargez tous vos événements en JSON", + portableStrong: "Portable", + portable: "- Utilisez vos clés dans n'importe quelle application Nostr", + selectiveStrong: "Suppression sélective", + selective: "- Choisissez exactement ce qu'il faut supprimer", + caveatStrong: "Réserve de décentralisation", + caveat: "- Certains relais peuvent conserver les données malgré les demandes de suppression" + }, + settingsPage: { + seoTitle: "Paramètres - SkateSpots", + seoDescription: "Gérez les paramètres de votre compte SkateSpots.", + heading: "PARAMÈTRES", + subtitle: "Préférences du compte et de l'application", + editProfile: "Modifier le profil", + profileRefreshed: "Profil actualisé !", + found: "Trouvé : {{name}}", + unnamed: "sans nom", + profileNotFound: "Profil introuvable", + notFoundOnRelay: "Introuvable sur aucun relais.", + refreshFailed: "Échec de l'actualisation", + refreshFailedDesc: "Impossible de se connecter aux relais.", + loginToEdit: "Connectez-vous pour modifier votre profil", + noProfileRelays: "Nous n'avons pas trouvé de profil sur les relais. Si vous en avez déjà créé un, essayez d'actualiser.", + checkDisplayName: "un nom d'affichage", + checkPhoto: "une photo de profil", + checkBio: "une courte bio", + checkLightning: "une adresse Lightning pour que les gens puissent vous zapper", + checkHandle: "un identifiant @skate-spots.org gratuit", + finishProfile: "Terminez votre profil", + addItem: "Ajouter {{item}}", + nip05Title: "Vérification NIP-05", + nip05Desc: "Obtenez une adresse Nostr vérifiée (comme nom@domaine.com) pour instaurer la confiance. Requise pour créer des événements, des profils de coaching et des shops.", + freeFromSkateSpots: "Gratuit grâce à SkateSpots", + claimHandleBefore: "Réclamez un identifiant comme", + claimHandleAfter: "— sans inscription, sans frais, sans domaine à gérer. Réclamez-le dans l'onglet Profil, puis enregistrez.", + claimInProfile: "Réclamer dans le profil", + nip05Footer: "Après avoir obtenu votre NIP-05, ajoutez-le dans le champ Profil et enregistrez.", + localRelayOn: "Relais local activé", + localRelayOff: "Relais local désactivé", + lookingForCitrine: "Recherche de Citrine sur cet appareil…", + noLongerUsing: "Vous n'utilisez plus le relais sur l'appareil.", + localRelay: "Relais local", + citrineOff: "Lectures plus rapides et sauvegarde hors ligne sur cet appareil", + citrineSearching: "Recherche de Citrine sur cet appareil…", + citrineLive: "Connecté — lecture et sauvegarde locales", + citrineWaiting: "Activé — lancez Citrine pour vous connecter", + toggleCitrine: "Basculer le relais Citrine local", + citrineDetected: "Relais Citrine détecté", + citrineLooking: "Recherche de Citrine…", + citrineNotDetected: "Citrine non détecté", + recheckCitrine: "Revérifier le relais Citrine", + checking: "Vérification", + recheck: "Revérifier", + chipInstantReads: "Lectures instantanées", + chipWorksOffline: "Fonctionne hors ligne", + chipOnDeviceBackup: "Sauvegarde sur l'appareil", + cantReachStrong: "Impossible de joindre Citrine.", + cantReachBefore: "Assurez-vous que l'application gratuite Citrine est installée et que son relais est", + started: "lancé", + cantReachAfter: ", puis appuyez sur Revérifier. Elle exécute un relais Nostr privé sur votre téléphone pour des lectures instantanées et une sauvegarde hors ligne.", + citrineStep1Before: "Ouvrez Citrine → appuyez sur", + start: "Démarrer", + citrineStep2Before: "Revenez ici → appuyez sur", + getCitrine: "Obtenir Citrine", + citrinePrivacy: "Votre Stash et vos messages restent chiffrés de bout en bout ici, exactement comme partout ailleurs. Le relais local ne fait qu'accélérer les choses et garder une copie sur votre appareil — il ne remplace jamais le chiffrement.", + communityRelayDisabled: "Relais communautaire désactivé", + communityRelayEnabled: "Relais communautaire activé", + usingOnlyPersonal: "Utilisation de vos relais configurés uniquement.", + skateRelayIncluded: "Relais SkateSpots inclus.", + relays: "Relais", + relayPrivacyBefore: "Les relais peuvent voir votre", + ipAddress: "adresse IP", + relayPrivacyAfter: "lorsque vous vous connectez. Tor la masque — et considérez un VPN « gratuit » comme un signal d'alerte ; ils monétisent généralement votre trafic.", + communityRelay: "Relais communautaire", + syncingGlobal: "Synchronisation avec la communauté mondiale du skate", + usingOnlyPersonalShort: "Utilisation de relais personnels uniquement", + appearance: "Apparence", + language: "Langue", + darkModeOnly: "Mode sombre uniquement", + darkModeDesc: "SkateSpots adopte une esthétique néon sombre inspirée de la culture du skate. Fond noir, rose néon, vert citron et orange.", + navigation: "Navigation", + sasquatchExpanded: "Le Sasquatch a été déployé ! 🦧 Actualisez la page pour le voir.", + advanced: "Avancé", + sasquatchGuide: "🦧 Guide du Sasquatch", + sasquatchResetDesc: "Réinitialiser le guide d'accueil à la vue déployée", + expandSasquatch: "Déployer le Sasquatch", + wallet: "Portefeuille", + loginToWallet: "Connectez-vous pour gérer votre portefeuille", + openWallet: "Ouvrir le portefeuille", + balanceSendReceive: "Solde, envoi, réception", + connectNwc: "Connecter un portefeuille NWC", + account: "Compte", + security: "Sécurité", + securitySub: "Clés, signature, Amber", + nip05Sub: "Obtenez une adresse Nostr vérifiée", + app: "Application", + myStash: "Mon Stash", + myStashSub: "Inventaire privé du matériel", + relaysSub: "Connexions aux relais Nostr", + appearanceSub: "Langue et thème", + assistant: "Assistant", + showSasquatch: "Afficher l'assistant Sasquatch", + showSasquatchDesc: "Afficher le bouton flottant Sasquatch sur la carte et les autres écrans.", + showMapFooter: "Afficher la barre de liens de la carte", + showMapFooterDesc: "Afficher la fine bande de liens en bas de la carte.", + notifications: "Notifications", + notificationsSub: "Alertes pour les MP, les crews et les zaps", + coordinator: "Coordinateur", + coordinatorSub: "Votre serveur de groupe Cordn", + data: "Données", + myData: "Mes données", + myDataSub: "Exporter, importer, gérer", + advancedSub: "Relatr, Sasquatch, outils", + notLoaded: "Non chargé", + notLoggedIn: "Non connecté" + }, + onboarding: { + seoTitle: "Commencer — SkateSpots", + seoDescription: "Rejoignez la communauté décentralisée du skateboard. Trouvez des spots, connectez-vous avec des coachs, envoyez des zaps. Gratuit pour toujours.", + homeSetTitle: "Zone définie 🛹", + homeSetDesc: "La carte s'ouvrira désormais sur votre région.", + locationFailedTitle: "Impossible d'obtenir votre position", + locationFailedDesc: "Vérifiez les autorisations de localisation, ou choisissez votre région sur la carte.", + niceTitle: "🎉 Sympa !", + niceDesc: "Vous comprenez maintenant comment fonctionne Nostr. Allons skater !", + npubCopied: "npub copié dans le presse-papiers.", + saveLoginNow: "Enregistrez votre connexion — faites-le maintenant", + saveLoginNowDesc: "Votre code de récupération est le seul moyen de revenir dans votre compte. Pas d'e-mail, pas de réinitialisation de mot de passe.", + betaBadge: "Bêta — Ouvert aux skateurs du monde entier", + headline1: "SKATE", + headline2: "TON MONDE", + heroBefore: "Une", + decentralized: "décentralisée", + heroAfter: "communauté de skate. Aucune entreprise ne la possède. Aucun algorithme n'enterre vos spots. Aucun bannissement. Juste des skateurs.", + pillMap: "Carte des spots", + pillCoaches: "Coachs et filmeurs", + pillEvents: "Événements", + pillGear: "Acheter/vendre du matériel", + pillZaps: "Zaps Bitcoin", + pillStash: "Stash de matériel", + pillCrews: "Crews", + createFreeAccount: "Créez votre compte gratuit", + noEmailNoPassword: "Pas d'e-mail. Pas de mot de passe. Votre identité vous appartient pour toujours.", + findSpots: "Trouvez des spots près de chez vous", + addFirstSpot: "Ajoutez votre premier spot", + accountCreated: "C'est bon ! Compte créé ✓", + identityYours: "Votre identité vous appartient — stockée dans votre clé, pas sur nos serveurs.", + whereSkate: "Où skatiez-vous ?", + whereSkateDesc: "Définissez votre région d'origine une fois et la carte s'ouvrira sur vos spots à chaque fois. Votre GPS ne quitte jamais votre appareil.", + useMyLocation: "Utiliser ma position", + pickOnMap: "Choisir sur la carte", + loginSaved: "Connexion enregistrée — votre compte est récupérable en sécurité.", + whyBother: "Pourquoi s'embêter ?", + why1Title: "Chaque spot sur une seule carte", + why1Body: "Ledges, rails, DIY, parks — cartographiés par des skateurs qui les rident vraiment. Vérifiez le statut avant de partir pour ne pas gâcher une session sur un bust.", + why2Title: "Construit par des skateurs, pas des costards", + why2Body: "Pas de pubs, pas d'algorithme qui vous bombarde de déchets, pas de collecte de données. Open source. La carte appartient à la communauté — vous y compris.", + why3Title: "Soyez payé pour rider", + why3Body: "Cartographiez une pépite, filmez un banger, organisez une session — et recevez des zaps en vrai Bitcoin directement dans votre portefeuille. Sans commission, sans intermédiaire.", + why4Title: "Votre compte vous appartient vraiment", + why4Body: "Une seule clé vous connecte à toutes les applications Nostr. Aucune entreprise ne peut vous exclure ou supprimer votre compte sur un coup de tête. Emmenez votre identité partout.", + everythingFree: "Tout ce que vous pouvez faire — gratuit", + featSpots: "Découvrir des spots", + featSpotsDesc: "Carte interactive avec des milliers de spots dans le monde", + featLab: "The Lab", + featLabDesc: "Trouvez des coachs, filmeurs et monteurs vidéo près de chez vous", + featEvents: "Événements", + featEventsDesc: "Compétitions, sessions, rencontres", + featGear: "Acheter / vendre du matériel", + featGearDesc: "Marketplace pair-à-pair pour du matériel de skate d'occasion", + featStash: "Mon Stash", + featStashDesc: "Inventaire privé chiffré de tout ce que vous possédez", + featCrews: "Crews", + featCrewsDesc: "Ridez avec votre crew — spots partagés, chat et sessions", + whatIsNostr: "Qu'est-ce que Nostr ?", + whatIsNostrSub: "Le protocole qui propulse SkateSpots", + nostrBefore: "Nostr est un protocole ouvert — comme l'e-mail, mais pour les applications sociales. Votre compte est une", + cryptoKeyPair: "paire de clés cryptographiques", + nostrAfter: "qui vous appartient. Aucune entreprise ne contrôle votre compte ni vos données — vous choisissez quels relais les stockent, et vous pouvez même gérer le vôtre. Votre identité fonctionne sur toutes les applications Nostr.", + nostrPoint1: "Vos données et clés vous appartiennent", + nostrPoint2: "Aucune entreprise ne peut vous bannir", + nostrPoint3: "L'identité fonctionne partout", + nostrPoint4: "Pourboires Bitcoin directs", + deepDive: "Pour aller plus loin : comment fonctionne Nostr", + privacyTip: "Astuce confidentialité : votre GPS ne quitte jamais votre appareil. Les serveurs auxquels vous vous connectez (comme les tuiles de carte) peuvent toujours voir votre IP — si vous voulez aussi la masquer, un VPN ou Tor fonctionne. Totalement facultatif.", + readPrivacy: "Lire notre page confidentialité", + zapsWallet: "⚡ Zaps et portefeuille", + optional: "Facultatif", + walletDesc: "Les zaps sont des pourboires Bitcoin que vous envoyez directement à un skateur qui a déniché un spot de malade, filmé un clip de fou ou organisé une super session. Sans frais de plateforme. Sans intermédiaire. 100 % lui revient.", + builtInWallet: "Portefeuille Cashu intégré", + builtInWalletDesc: "Recevez des paiements Lightning directement dans l'application. Sans configuration.", + balance: "Solde", + connectExternal: "Connecter un portefeuille externe", + connectExternalDesc: "Vous avez Alby, Mutiny ou un autre portefeuille ? Connectez-le via NWC.", + connectViaNwc: "Connecter via NWC", + loginToConnect: "Connectez-vous pour lier votre propre portefeuille.", + fiveDollars: "💡 5 $ de Bitcoin = des centaines de zaps à répartir dans la communauté", + commonQuestions: "Questions fréquentes", + faq1Q: "SkateSpots est-il gratuit ?", + faq1A: "100 % gratuit. Parcourez les spots, ajoutez des lieux, trouvez des coachs, créez des événements, rejoignez des sessions — tout gratuit, pour toujours. Le Bitcoin (zaps) est facultatif si vous voulez donner un pourboire aux créateurs.", + faq2Q: "Qu'est-ce que Nostr et pourquoi SkateSpots l'utilise-t-il ?", + faq2Before: "Nostr est un protocole ouvert pour des applications décentralisées — pensez à Internet lui-même, détenu par aucune entreprise. Votre compte SkateSpots est une paire de clés cryptographiques que", + faq2Strong: "vous possédez", + faq2After: ". Aucune entreprise ne peut bannir votre compte ni retenir vos données en otage — vous choisissez quels relais stockent vos données, et vous pouvez même gérer le vôtre. Votre identité fonctionne aussi sur d'autres applications Nostr comme Primal, Damus ou Amethyst.", + faq3Q: "Qu'est-ce qu'un nsec et pourquoi est-il important ?", + faq3Before: "Votre", + faq3Mid: "est votre clé privée — c'est la seule preuve que vous possédez votre compte. Contrairement aux mots de passe, il n'y a", + faq3Strong: "pas de « mot de passe oublié »", + faq3After: ". Si vous perdez votre nsec, votre compte disparaît pour toujours. Lorsque vous créez un compte, téléchargez immédiatement votre sauvegarde et conservez-la en lieu sûr (gestionnaire de mots de passe, notée hors ligne).", + faq4Q: "Quels signataires / applications fonctionnent avec SkateSpots ?", + faq4Desktop: "Sur ordinateur :", + faq4Extensions: "extensions de navigateur.", + faq4Android: "Sur Android :", + faq4AndroidAfter: "(meilleure expérience avec l'application native).", + faq4Ios: "Sur iOS :", + faq4IosAfter: "ou collez directement votre nsec (moins sûr).", + faq4Note: "Vous pouvez aussi vous connecter en collant directement votre nsec — mais utiliser une extension signataire est plus sûr.", + faq5Q: "Puis-je utiliser SkateSpots sur mon téléphone ?", + faq5Before: "Oui ! SkateSpots est une PWA (Progressive Web App). Visitez", + faq5Mid: "dans le navigateur de votre téléphone et appuyez sur", + faq5Em: "« Ajouter à l'écran d'accueil »", + faq5After: "pour une expérience d'application complète. Ou téléchargez-la depuis", + faq5End: "— une boutique d'applications décentralisée.", + faq6Q: "Qu'est-ce qu'un zap ?", + faq6A: "Un zap est un pourboire Bitcoin instantané envoyé via le réseau Lightning. Quand vous zappez un skateur, les sats arrivent dans son portefeuille en quelques secondes — sans PayPal, sans Venmo, sans commission. La personne qui a filmé ce 4-marches est payée directement par les fans.", + faq7Q: "Mes spots seront-ils supprimés si SkateSpots ferme ?", + faq7A: "Non. Vos spots sont publiés sur des relais Nostr — des serveurs distribués que n'importe qui peut gérer. Même si SkateSpots disparaissait demain en tant que produit, vos données existeraient toujours sur les relais et n'importe quel client Nostr pourrait les afficher.", + faq8Q: "Puis-je ajouter un spot situé sur une propriété privée ?", + faq8A: "Vous pouvez, mais faites preuve de bon sens. Les spots sur propriété privée doivent être signalés comme tels pour que les skateurs sachent à quoi s'attendre. SkateSpots n'est pas responsable des intrusions — respectez toujours les propriétaires et les locaux.", + faq9Q: "Comment signaler un bug ou donner un retour ?", + faq9Before: "Envoyez un MP à l'équipe SkateSpots directement sur Nostr, ou contactez notre coordinateur bêta :", + faq9Link: "Retour bêta → cordn.net", + readyToShred: "PRÊT À RIDER ?", + stopScrolling: "Arrêtez de scroller. Prenez l'application. Trouvez un spot. Skatiez-le.", + exploreSpots: "Explorer les spots", + betaFeedbackTitle: "Bêta — Nous voulons votre retour", + betaFeedbackDesc: "SkateSpots est en développement actif. Vous pourriez rencontrer des aspérités — c'est de notre faute, pas la vôtre. Signalez des bugs, suggérez des fonctionnalités, dites-nous ce qui ne va pas.", + betaCoordinator: "Coordinateur bêta", + betaCoordinatorDesc: "cordn.net → écrivez-nous", + dmOnNostr: "MP sur Nostr", + fixSameDay: "Vous avez trouvé un bug ? On le corrige le jour même. Vos signalements améliorent l'application pour tous les skateurs.", + relaySetup: "Configuration des relais" + }, + relayEdu: { + understandingNostr: "Comprendre Nostr", + stepOf: "Étape {{current}} sur {{total}}", + step1Title: "Comprendre les relais", + step1Desc: "Pensez aux relais comme aux shops de skate qui partagent des nouvelles sur les spots", + you: "Vous", + relays: "Relais", + skaters: "Skateurs", + s1Good1: "Aucune entreprise ne possède votre compte", + s1Good1Desc: "Votre identité réside sur plusieurs serveurs relais", + s1Good2: "Vous contrôlez où résident vos données", + s1Good2Desc: "Vos publications se synchronisent entre les relais que vous choisissez — choisissez les vôtres ou gérez-en un vous-même", + s1Warn: "Les opérateurs de relais peuvent voir les publications publiques", + s1WarnDesc: "Pensez-y comme à une publication sur un panneau d'affichage", + step2Title: "Public vs privé", + step2Desc: "Sachez ce qui est visible et ce qui est chiffré", + publicTitle: "Public (visible par tous)", + pub1: "Les spots que vous ajoutez à la carte", + pub2: "Avis et commentaires", + pub3: "Les infos de votre profil (nom, photo)", + pub4: "Qui vous suivez", + privateTitle: "Privé (chiffré)", + priv1: "Messages privés", + priv2: "Communications du portefeuille", + noteStrong: "Remarque :", + note: "Les publications peuvent être stockées définitivement sur les relais. Réfléchissez avant de publier — comme dans la vraie vie !", + step3Title: "Vos clés = votre compte", + step3Desc: "C'est la chose la plus importante à comprendre", + secretKeyTitle: "Votre clé secrète (nsec)", + secretKeyDesc: "Pensez-y comme à votre skateboard — ne la prêtez à personne. Elle prouve que le compte vous appartient.", + s3Bad1: "Si vous la perdez, votre compte ne peut pas être récupéré", + s3Bad2: "Pas de « mot de passe oublié » — personne ne peut le réinitialiser", + s3Good: "Sauvegardez-la et conservez-la en lieu sûr", + publicKeyTitle: "Votre clé publique (npub)", + publicKeyDesc: "C'est comme votre nom d'utilisateur — partagez-la librement pour que les autres vous trouvent !", + inControl: "🔐 Vous avez le contrôle — aucune entreprise ne peut vous exclure !", + skip: "Ignorer", + gotIt: "Compris !" + }, + about: { + seoTitle: "À propos - SkateSpots", + seoDescription: "Découvrez SkateSpots et notre mission de bâtir une communauté de skateboard décentralisée.", + npubCopied: "npub copié dans le presse-papiers. Collez-le dans votre client Nostr préféré pour envoyer un MP.", + bugReport: "🐛 Signalement de bug", + bugWhatHappened: "Ce qui s'est passé :", + bugExpected: "Ce à quoi je m'attendais :", + bugSteps: "Étapes pour reproduire :", + aboutWord: "À PROPOS", + heroBefore: "Connectez-vous avec les scènes de skate locales du monde entier.", + skaterOwned: "Des données aux skateurs", + heroAfter: ", des relais gérés par la communauté.", + viewStats: "Voir les statistiques de la communauté", + missionTitle: "Notre mission", + mission1: "SkateSpots aide les skateurs à découvrir des spots, à se connecter avec des pros à The Lab et à organiser des sessions — sans contrôle d'entreprise. Le vrai skate se passe hors ligne, cet outil ne fait que vous y connecter.", + mission2: "Le savoir du skateboard doit vivre avec la communauté, pas enfermé dans des applications d'entreprise. C'est pourquoi SkateSpots fonctionne sur Nostr — un système basé sur des relais où les skateurs contrôlent leurs propres données, choisissent quels relais les stockent, et peuvent même gérer le leur. Aucune entreprise ne possède la carte.", + whyNostr: "Pourquoi Nostr ?", + why1Title: "Contrôlé par la communauté", + why1Desc: "Vos spots vivent sur des relais communautaires. Les skateurs gèrent les serveurs, pas les entreprises.", + why2Title: "Vos données vous appartiennent", + why2Desc: "Votre identité Nostr vous appartient. Emmenez-la dans n'importe quelle application Nostr — sans enfermement.", + why3Title: "Intégration Bitcoin", + why3Desc: "Zappez les créateurs directement en Bitcoin. Aucune plateforme qui prend 30 %.", + why4Title: "Open source", + why4Desc: "Construit à ciel ouvert. N'importe qui peut contribuer ou forker le code.", + getInvolved: "S'impliquer", + getInvolvedDesc: "SkateSpots est open source et piloté par la communauté. Contribuez au code, partagez des spots ou aidez les autres à démarrer.", + betaTitle: "Test bêta", + betaDesc: "Cher utilisateur ! Merci de tester SkateSpots en bêta. Notez que l'application est encore en bêta et qu'il peut y avoir des bugs ou des problèmes de sécurité. Si vous rencontrez un problème ou souhaitez signaler un bug, contactez-nous !", + giveFeedback: "Donnez-nous votre retour :", + copyNpub: "Copier le npub", + reportBug: "Signaler un bug", + viewProfile: "Voir le profil", + downloadApp: "Télécharger l'application", + downloadAppDesc: "Installez SkateSpots sur Android via Zapstore — la boutique d'applications open source et native Bitcoin.", + getOnZapstore: "Obtenir sur Zapstore", + credits: "Crédits", + creditPoweredBy: "Propulsé par", + creditNostr: "Protocole décentralisé", + creditCrewChat: "Chat de crew via", + creditCordn: "Chat de groupe chiffré de bout en bout", + creditEcash: "Ecash via", + creditCashu: "Ecash chaumien pour Lightning", + creditWalletConnect: "Connexion de portefeuille via", + creditNwc: "Nostr Wallet Connect (NIP-47)", + creditSigning: "Signature sur Android avec", + creditAmber: "Signataire Nostr pour Android", + creditMapData: "Données cartographiques Bitcoin de", + creditBtcmap: "Lieux qui acceptent le Bitcoin", + creditCrowdfunding: "Financement participatif", + creditAngor: "Financement participatif Bitcoin décentralisé", + creditDistributed: "Distribué sur", + creditZapstore: "Boutique d'applications open source", + creditTrust: "Confiance et chat de crew via", + creditContextvm: "Scores de confiance Relatr et coordination du chat de crew chiffré", + stillQuestions: "D'autres questions ?", + stillQuestionsDesc: "Le Sasquatch est notre guide IA — propulsé par les données SkateSpots en direct. Interrogez-le sur les spots, les événements, les coachs, le matériel ou le fonctionnement de tout.", + askSasquatch: "Demandez au Sasquatch", + poweredBy: "Propulsé par", + decentralized: "Décentralisé", + communityOwned: "Appartenant à la communauté" + }, + faq: { + seoTitle: "FAQ - SkateSpots", + seoDescription: "Posez toutes vos questions sur SkateSpots au Sasquatch.", + greeting: "Salut ! Je suis le Sasquatch 🦧 — pose-moi n'importe quelle question sur SkateSpots. Spots, événements, matériel, portefeuilles, confidentialité, Nostr — je gère. Que veux-tu savoir ?", + gotQuestions: "Des questions ?", + heroDesc: "Demandez au Sasquatch — il sait tout sur SkateSpots, Nostr, Bitcoin et le skateboard.", + askTitle: "Demandez au Sasquatch", + askDesc: "Le Sasquatch est ouvert dans le coin inférieur gauche de votre écran — cliquez dessus et tapez votre question. Il a un accès en direct aux spots, événements, coachs et à la météo.", + askQuestion: "En quoi peux-tu m'aider sur SkateSpots ?", + openSasquatch: "Ouvrir le Sasquatch", + commonQuestions: "Questions fréquentes — appuyez pour demander", + quickAnswers: "Réponses rapides", + footerHint: "Le Sasquatch utilise les données Nostr en direct du relais SkateSpots + l'IA pour répondre à vos questions. 🛹", + chip1Label: "Qu'est-ce que SkateSpots ?", + chip1Q: "Qu'est-ce que SkateSpots et comment ça marche ?", + chip2Label: "Comment ajouter un spot ?", + chip2Q: "Comment ajouter un spot de skate à la carte ?", + chip3Label: "Que sont les zaps ?", + chip3Q: "Que sont les zaps ?", + chip4Label: "Est-ce gratuit ?", + chip4Q: "SkateSpots est-il gratuit ?", + chip5Label: "Qu'est-ce que Mon Stash ?", + chip5Q: "Qu'est-ce que Mon Stash ?", + chip6Label: "Comment me connecter ?", + chip6Q: "Comment me connecter ou créer un compte ?", + chip7Label: "Qu'est-ce que Nostr ?", + chip7Q: "Qu'est-ce que Nostr ?", + chip8Label: "Confidentialité et données", + chip8Q: "Quelles données sont publiques et lesquelles sont privées sur SkateSpots ?", + chip9Label: "Comment vendre du matériel ?", + chip9Q: "Comment vendre du matériel sur SkateSpots ?", + chip10Label: "Qu'est-ce que The Lab ?", + chip10Q: "Qu'est-ce que The Lab ?", + fact1Label: "Spots de skate dans le monde", + fact1Value: "Découvrir et ajouter", + fact2Label: "Zaps Bitcoin Lightning", + fact2Value: "100 % gratuit", + fact3Label: "Décentralisé sur Nostr", + fact3Value: "Vos données vous appartiennent", + fact4Label: "Inventaire privé du matériel", + fact4Value: "Stash chiffré", + s1Q: "Qu'est-ce que SkateSpots ?", + s1A: "Une carte et une communauté décentralisées pour le skateboard, construites sur Nostr. Découvrez des spots, trouvez des coachs et filmeurs, rejoignez des crews, publiez des événements et achetez/vendez du matériel — sans entreprise au milieu.", + s2Q: "Comment ajouter un spot ?", + s2A: "Appuyez sur la carte, ou utilisez le bouton + / « Ajouter un spot », puis déposez un pin et remplissez les détails. Vous avez besoin d'un compte Nostr gratuit (appuyez sur Connexion → Créer un compte — aucun e-mail requis).", + s3Q: "Que sont les zaps ?", + s3A: "Les zaps sont des pourboires Bitcoin Lightning. Vous pouvez zapper des spots, des événements, des crews et des personnes que vous appréciez. Ils vont directement au destinataire via Lightning — SkateSpots ne détient jamais vos fonds.", + s4Q: "Est-ce gratuit ?", + s4A: "Oui. Créer un compte, ajouter des spots et naviguer sont gratuits. Les extras payants facultatifs (comme les annonces mises en avant) et les pourboires (zaps) sont payés directement entre personnes.", + s5Q: "Quelles données sont publiques ?", + s5A: "Tout ce que vous publiez — spots, événements, votre profil — est public sur les relais Nostr. Vos messages privés et votre Stash sont chiffrés de bout en bout. Consultez la page Confidentialité pour plus de détails.", + s6Q: "Qu'est-ce que The Lab ?", + s6A: "The Lab est l'endroit où vous trouvez des personnes à embaucher ou auprès desquelles apprendre : coachs, entraîneurs, filmeurs, monteurs vidéo, photographes, constructeurs, artistes et plus encore." + }, + privacy: { + seoTitle: "Confidentialité — SkateSpots", + seoDescription: "Comment SkateSpots gère vos données : votre GPS reste sur votre appareil, les spots que vous publiez sont publics, et comment masquer votre IP avec un VPN ou Tor si vous le souhaitez.", + heroBefore: "Votre", + heroHighlight: "Confidentialité", + heroDesc: "Pas de traçage, pas de pubs, pas de vente de données. Voici exactement ce qui reste sur votre appareil, ce qui est public, et comment verrouiller davantage si vous le souhaitez.", + locationTitle: "Votre position reste sur votre appareil", + locationBefore: "Quand vous appuyez sur", + nearMe: "« Près de moi »,", + locationAfter: "votre position GPS est lue sur votre appareil et utilisée uniquement pour centrer la carte et trier les spots à proximité.", + locationGood1: "Elle n'est jamais publiée sur Nostr.", + locationGood2: "Elle n'est jamais envoyée à SkateSpots — aucun serveur SkateSpots ne la collecte.", + locationGood3: "Elle n'est jamais partagée avec un tiers.", + locationGood4: "Sur l'application native, nous utilisons directement le système de localisation de votre téléphone et évitons les Google Play Services — elle fonctionne donc sur les téléphones dé-Googlisés (GrapheneOS, /e/OS) et Google ne la voit jamais.", + weatherBefore: "La météo est désactivée par défaut. Quand vous l'activez, elle recherche les conditions à l'emplacement public du", + weatherEm: "spot", + weatherAfter: "— pas le vôtre.", + publicTitle: "Ce qui est public par conception", + publicDesc: "SkateSpots est une carte partagée, donc certaines choses sont faites pour être vues par tout le monde. Quand vous choisissez de les publier, elles sont publiques sur le réseau Nostr :", + public1Strong: "Les spots que vous ajoutez", + public1: "— y compris leurs coordonnées. Si vous ajoutez un spot à votre position exacte, cette position devient publique. Réfléchissez avant de déposer un pin sur votre propre allée.", + public2Strong: "Avis, commentaires et votre profil public", + public2: "(nom, photo).", + public3: "Qui vous suivez, et les réactions publiques.", + public4Strong: "Les zaps", + public4: "sont publics par défaut : un zap relie votre compte — souvent votre adresse lightning — à la publication que vous avez payée et au pourboire lui-même. Votre portefeuille peut l'envoyer anonymement si vous préférez.", + publicNoteBefore: "Un VPN ou Tor", + notWord: "ne masque pas", + publicNoteAfter: "le contenu de ce que vous publiez — les coordonnées d'un spot sont publiques quoi qu'il arrive. Les outils de confidentialité masquent votre identité réseau (votre IP), pas les choses que vous choisissez de publier.", + encryptedTitle: "Ce qui est privé et chiffré", + enc1Strong: "Les messages privés", + enc1Mid: "et", + enc1Strong2: "les chats de crew", + enc1: "sont chiffrés de bout en bout (NIP-17). Seuls les participants peuvent les lire.", + enc2Strong: "Mon Stash", + enc2: "— votre inventaire privé de matériel — est chiffré avec votre propre clé.", + enc3Strong: "Les membres réservés au crew", + enc3: "peuvent choisir de n'être visibles que par les membres de leur crew.", + ipTitle: "Ce qui quitte votre appareil : votre IP", + ipBefore: "Comme tout site web, les serveurs avec lesquels SkateSpots communique peuvent voir votre", + ipAddress: "adresse IP", + ipAfter: "(un indicateur approximatif de votre région). C'est normal pour toute application web ou cartographique et ne nous est pas propre. Ces serveurs sont :", + ipTileStrong: "Tuiles de carte", + ipTile: "(OpenStreetMap) — voient votre IP et la zone de la carte que vous regardez.", + ipGeoStrong: "Géocodage des spots/shops", + ipGeo: "— quand vous créez ou modifiez un spot ou un shop, ses coordonnées sont envoyées à OpenStreetMap Nominatim pour remplir l'étiquette ville/pays. Quand vous ouvrez les statistiques communautaires, les coordonnées des pins sans étiquette de lieu sont envoyées à BigDataCloud pour être regroupées par région (mises en cache sur votre appareil — au plus une fois par pin). Les deux voient votre IP. Ce sont les coordonnées du pin que vous avez placé / les coordonnées de pin publiques, jamais le GPS en direct de votre appareil.", + ipPushStrong: "Notifications en arrière-plan", + ipPush: "(opt-in) — si vous les activez, un serveur push SkateSpots voit que votre clé a reçu quelque chose et quand (jamais qui l'a envoyé ni ce qu'il dit — les messages restent chiffrés), et le service push de votre OS (Google/Mozilla/Apple) livre l'alerte.", + ipBtcStrong: "Lieux Bitcoin", + ipBtc: "(BTCMap, quand vous activez cette couche) — voient votre IP et la zone que vous consultez.", + ipRelayStrong: "Relais Nostr", + ipRelay: "— voient votre IP quand l'application lit ou publie.", + ipMintStrong: "Mints Cashu", + ipMint: "— voient votre IP chaque fois que votre portefeuille envoie, reçoit ou fond.", + ipRouteStrong: "Itinéraires", + ipRoute: "(OSRM, et Transitous pour les transports) — reçoivent le début et la fin de tout itinéraire que vous demandez, pas seulement votre IP. Le calcul d'itinéraire reste dans l'application : votre point de départ et votre destination ne sont jamais transmis à Google ou Apple Maps.", + ipWeatherStrong: "Météo", + ipWeatherMid: "(Open-Meteo, opt-in) et", + ipUploadStrong: "téléversements d'images", + ipWeather: "(Blossom), quand vous les utilisez.", + ipAiStrong: "IA Sasquatch", + ipAi: "— votre message va à notre propre serveur, puis au fournisseur du modèle.", + ipLink1: "Comme vous envoyez votre clé publique (npub) sur la même connexion, un relais peut relier votre IP à votre personne — pas juste « quelqu'un s'est connecté », mais « cette personne, depuis cette adresse ».", + ipShieldBefore: "Une chose que nous protégeons : le", + ipMintsStrong: "répertoire des mints", + ipShieldAfter: "est récupéré via notre serveur, donc MintRadar ne voit jamais votre IP.", + vpnTitle: "Plus de confidentialité ? VPN ou Tor (facultatif)", + vpnDesc: "Pour la plupart des skateurs, ce n'est pas nécessaire — mais si vous voulez masquer votre IP et votre localisation approximative aux serveurs ci-dessus, vous avez deux options gratuites :", + vpnReputable: "🛡️ Un VPN réputé", + vpnReputableDesc: "Masque votre IP derrière les serveurs du VPN. Simple et rapide. Utilisez-en un que vous payez et en qui vous avez confiance ; les VPN gratuits monétisent généralement votre trafic, considérez donc « gratuit » comme un signal d'alerte.", + torBrowser: "🧅 Navigateur Tor", + torDesc: "Gratuit, confidentialité IP maximale, passe par plusieurs relais. Plus lent — les cartes et certains relais Nostr peuvent ralentir ou bloquer les nœuds de sortie Tor. Idéal pour les plus prudents.", + readThis: "Lisez ceci pour ne pas vous faire avoir", + caveat1Before: "Un VPN/Tor masque votre", + ipWord: "IP", + caveat1: "— pas les spots que vous publiez. Un pin à votre domicile est public, que vous utilisiez un VPN ou non.", + caveat2Before: "N'activez pas", + nearMeGps: "« Près de moi » / GPS du navigateur", + caveat2: "si votre objectif est de rester anonyme — un GPS précis annule tout masquage d'IP.", + caveat3: "Aucun outil ne vous rend totalement « anonyme ». Ils réduisent ce que les serveurs peuvent déduire sur votre localisation réseau — c'est tout.", + keysTitle: "Vos clés, votre compte", + keysBefore: "Votre compte est une paire de clés cryptographiques qui vous appartient. La façon la plus sûre de vous connecter est un", + signer: "signataire", + keysAfter: "(Alby, nos2x ou Amber sur Android) pour que votre clé secrète ne soit jamais collée dans l'application.", + keysCaveatBefore: "Si vous collez votre", + keysCaveatAfter: "directement, elle est stockée dans votre navigateur. Utilisez plutôt une extension signataire quand vous pouvez, et gardez votre sauvegarde nsec en lieu sûr hors ligne.", + footerBefore: "Des questions ? Demandez à", + sasquatchName: "Le Sasquatch", + footerMid: "dans l'application, ou lisez le", + gettingStarted: "guide de démarrage", + about: "À propos" + }, + license: { + seoTitle: "Licence - SkateSpots", + seoDescription: "Licence SkateSpots. Vous êtes libre de faire du skateboard.", + tagline: "Skate, gagne, amuse-toi et dépense des Sats où que tu sois.", + copyright: "Contributeurs de SkateSpots et la communauté", + licenseLabel: "Licence", + freeLine1: "TU ES LIBRE", + freeLine2: "DE FAIRE DU SKATEBOARD", + body: "Ce projet est ouvert. Partage-le, forke-le, construis dessus, skatie-le. Les rues appartiennent à tout le monde. Ce code aussi. Continue à skater, amuse-toi, apprends des tricks, soutiens les bâtisseurs et skatie encore.", + builtBefore: "Construit avec ❤️ sur", + builtMid: "· Propulsé par", + lightning: "Bitcoin Lightning ⚡", + viewSource: "Voir le code source", + aboutSkateSpots: "À propos de SkateSpots", + supporters: "Soutiens" + }, + glossary: { + seoTitle: "Glossaire des tricks · SkateSpots", + seoDescription: "Le glossaire complet du skateboard — {{count}} entrées couvrant flips, grinds, slides, grabs, airs, lip tricks, handplants, freestyle, termes de transition, stance et matériel, avec des noms alternatifs.", + heading: "GLOSSAIRE DES TRICKS", + subheading: "{{count}} entrées · tricks, transition, freestyle, stance et matériel", + searchPlaceholder: "Recherchez des tricks ou surnoms — tre flip, crooks, method…", + clearSearch: "Effacer la recherche", + all: "Tout", + results: "{{count}} résultat{{s}} pour", + noMatch: "Aucun trick ne correspond. Essayez un surnom comme « tre flip », « crooks » ou « melon ».", + tricksCount: "{{count}} tricks", + footerBefore: "Vous connaissez un trick ou un surnom que nous avons oublié ? Les tricks prennent des noms différents selon la scène — contactez", + sasquatch: "Le Sasquatch 🦧", + footerAfter: "et dites-le-nous." + }, + signers: { + seoTitle: "Applications signataires - Sécurisez vos clés Nostr | SkateSpots", + seoDescription: "Découvrez les applications signataires qui gardent vos clés Nostr en sécurité. Trouvez la meilleure option pour Android, iOS ou les navigateurs de bureau.", + securityGuide: "Guide de sécurité", + protect: "Protégez vos", + nostrKeys: "clés Nostr", + heroDesc: "Les applications signataires gardent vos clés privées en sécurité en signant les événements sans les exposer. Au lieu de coller votre clé dans chaque application, laissez un signataire s'en charger en toute sécurité.", + whySignerStrong: "Pourquoi utiliser un signataire ?", + whySigner: "Votre clé privée Nostr est comme un mot de passe qui ne peut jamais être changé. Une application signataire la garde en sécurité tout en vous laissant utiliser n'importe quelle application Nostr.", + androidTitle: "Signataires Android", + androidDesc: "Applications signataires natives pour appareils Android, y compris GrapheneOS.", + iosTitle: "Signataires iOS", + iosDesc: "Options de signataire pour les utilisateurs d'iPhone et d'iPad.", + browserTitle: "Extensions de navigateur", + browserDesc: "Extensions de navigateur de bureau pour signer sur les applications web.", + recommended: "Recommandé", + yourPlatform: "Votre plateforme", + get: "Obtenir {{name}}", + protocolsTitle: "Comprendre les protocoles", + nip07Desc: "Norme d'extension de navigateur. L'extension injecte des capacités de signature dans les applications web. Utilisée par Alby, nos2x, Flamingo et des extensions similaires.", + nip46Desc: "Protocole de signature distant (« bunker »). Votre application signataire approuve les demandes d'autres applications sans partager vos clés. Utilisé par Nsec.app, Nostria et Nowser.", + nip55Desc: "Protocole de signataire spécifique à Android. Les applications natives peuvent demander des signatures à Amber sans exposer les clés. L'expérience Android la plus fluide.", + whichChoose: "Lequel choisir ?", + chooseAndroid: "Android :", + chooseAndroidDesc: "Amber (NIP-55) pour les applications natives", + chooseIos: "iOS :", + chooseIosDesc: "Nsec.app (NIP-46) pour une meilleure compatibilité", + chooseDesktop: "Ordinateur :", + chooseDesktopDesc: "Alby, nos2x ou Flamingo (NIP-07)", + amberDesc: "Signataire Android natif axé sur la sécurité et la facilité d'utilisation. Le meilleur choix pour les utilisateurs Android.", + nsecAppDesc: "Signataire distant multiplateforme qui agit comme un coffre-fort sécurisé pour vos clés.", + nostriaDesc: "Application signataire distante avec clés stockées dans le stockage sécurisé de l'appareil.", + nowserDesc: "Signataire multi-auth prenant en charge à la fois l'extension de navigateur et les protocoles de signature distante.", + nsecAppIosDesc: "La meilleure option pour iOS. Utilisez-le comme signataire distant avec n'importe quel client Nostr.", + nowserTfDesc: "Signataire iOS disponible via TestFlight avec des capacités de signature similaires à Android.", + nostriaIosDesc: "Signataire distant avec stockage sécurisé des clés sur votre appareil.", + nos2xDesc: "Extension de navigateur simple et fiable pour signer des événements Nostr.", + albyDesc: "Portefeuille Bitcoin Lightning avec gestion intégrée des clés Nostr et WebLN.", + flamingoDesc: "Extension de navigateur axée sur Nostr avec une interface épurée.", + kiwiDesc: "Sur Android/GrapheneOS, utilisez le navigateur Kiwi pour charger les extensions nos2x ou Alby.", + fNativeApp: "Application native", + fMultiKey: "Prise en charge de plusieurs clés", + fEventSigning: "Signature d'événements", + fSecureStorage: "Stockage sécurisé des clés", + fRemoteSigning: "Signature distante", + fAnyClient: "Fonctionne avec n'importe quel client", + fCrossDevice: "Synchronisation entre appareils", + fMultiKeySupport: "Prise en charge multi-clés", + fNip07: "Prise en charge NIP-07", + fNip46: "Prise en charge NIP-46", + fFlexibleSigning: "Signature flexible", + fNativeIos: "Application iOS native", + fLightweight: "Léger", + fEasyToUse: "Facile à utiliser", + fChromeSupport: "Prise en charge Chrome/Brave/Edge", + fLightningPayments: "Paiements Lightning", + fNostrSigning: "Signature Nostr", + fWebln: "Prise en charge WebLN", + fNwc: "Prise en charge NWC", + fCleanUi: "Interface épurée", + fPrivacyFocused: "Axé sur la confidentialité", + fExtensionMobile: "Prise en charge des extensions sur mobile", + fFullBrowser: "Expérience de navigateur complète", + fGraphene: "Fonctionne sur GrapheneOS" + }, + betaDisclaimer: { + title: "Attention — ceci est une bêta", + subtitle: "Un petit mot avant de vous lancer.", + ossTitle: "Open source et expérimental", + ossBody: "Construit à ciel ouvert par la communauté. Fouillez, forkez, cassez.", + betaTitle: "En bêta — non audité", + betaBody: "Le code n'a pas encore fait l'objet d'un audit de sécurité formel. Les bugs arrivent.", + moneyTitle: "Manipule de vrais Bitcoin et Lightning", + moneyBody: "Utilisez de l'argent à vos propres risques. Ne chargez que ce que vous pouvez vous permettre de perdre.", + finePrint: "Aucune garantie d'aucune sorte. Vous êtes seul responsable de vos fonds et de vos clés.", + viewCode: "Voir le code", + accept: "Compris, laissez-moi entrer" + } + } +}; export default frBatch3; diff --git a/src/i18n/fr/batch4.ts b/src/i18n/fr/batch4.ts index d3843e9..c42656b 100644 --- a/src/i18n/fr/batch4.ts +++ b/src/i18n/fr/batch4.ts @@ -1,4 +1,1115 @@ -/** fr — batch 4. Filled by the translation pass; empty until then. */ -const frBatch4 = {}; +/** fr — batch 4. */ +const frBatch4 = { + walletUi: { + page: { + title: "Portefeuille", + subtitle: "Bitcoin Lightning + Cashu", + manage: "Gérer", + getAWallet: "Obtenir un portefeuille", + learnPlanB: "En savoir plus à la Plan B Academy", + walletMinibits: "Cashu mobile · NWC", + walletAlby: "Extension navigateur · WebLN + NWC", + walletZeus: "Lightning auto-conservé", + walletCoinos: "Basé sur le web · fonctionne partout", + whatAreZaps: "Que sont les Zaps ?", + whatAreZapsShort: "Que sont les zaps ?", + zapsDesc: "Paiements Bitcoin Lightning instantanés. Envoyez des sats à n'importe quel skater, créateur de spot ou coach — sans intermédiaire, sans commission de plateforme.", + instant: "Instantané", + instantDesc: "Réglé en quelques secondes", + flexible: "Flexible", + flexibleDesc: "Votre portefeuille, vos clés", + private: "Privé", + privateDesc: "Cashu masque qui paie", + direct: "Direct", + directDesc: "La valeur va au créateur", + loginRequired: "Connexion requise", + loginRequiredDesc: "Connectez-vous avec votre compte Nostr pour relier votre portefeuille Lightning et commencer à zapper.", + browseMints: "Parcourir les mints Cashu" + }, + modal: { + walletName: "Nom du portefeuille (facultatif)", + walletNamePlaceholder: "Mon portefeuille Lightning", + connectionUri: "URI de connexion", + spendLimitTitle: "Définissez d'abord une limite de dépenses", + spendLimitBody1: "Cette chaîne permet à SkateSpots de payer des factures Lightning depuis votre portefeuille. Dans votre application de portefeuille, accordez à cette connexion un petit", + dailyBudget: "budget quotidien", + spendLimitBody2: "(par ex. quelques milliers de sats) et activez uniquement", + spendLimitBody3: "Ne collez jamais une connexion avec un budget illimité. Vous pouvez la révoquer dans votre portefeuille à tout moment.", + addWallet: "Ajouter un portefeuille", + nwcConnection: "Connexion NWC", + lightningWallet: "Portefeuille Lightning", + pasteNwc: "Collez votre chaîne de connexion NWC pour envoyer des zaps", + connectWallet: "Connecter le portefeuille", + browserExtension: "Extension navigateur (WebLN)", + autoDetected: "Détectée automatiquement si installée", + ready: "Prêt", + notFound: "Introuvable", + getNwcFrom: "Obtenir NWC depuis :", + connectionRequired: "URI de connexion requise", + connectionRequiredDesc: "Veuillez saisir une URI de connexion NWC valide.", + activeChanged: "Portefeuille actif modifié", + activeChangedDesc: "Le portefeuille sélectionné est maintenant actif pour les zaps.", + connectNwc: "Connecter le portefeuille NWC", + connectNwcDesc: "Saisissez votre chaîne de connexion depuis un portefeuille compatible.", + connect: "Connecter", + connecting: "Connexion...", + walletSettings: "Paramètres du portefeuille", + connectDesc: "Connectez votre portefeuille Lightning pour envoyer des zaps instantanément." + }, + cashu: { + title: "Portefeuille Cashu", + desc: "Portefeuille ecash intégré — aucune configuration externe requise", + initializing: "Initialisation du portefeuille...", + walletError: "Erreur du portefeuille", + balance: "Solde", + balanceAria: "Solde du portefeuille {{amount}} sats", + activeMint: "Mint actif", + selectMint: "Sélectionner un mint", + receive: "Recevoir", + send: "Envoyer", + receiveViaLightning: "⚡ Recevoir via Lightning", + amountSats: "Montant en sats", + generateInvoice: "Générer une facture", + generating: "Génération…", + or: "Ou", + receiveCashu: "🥜 Recevoir un jeton Cashu", + scanQr: "Scanner le QR", + pasteCashu: "Collez un jeton Cashu (cashu...)", + receiveToken: "Recevoir le jeton", + receiving: "Réception…", + createCashu: "🥜 Créer un jeton Cashu", + createToken: "Créer le jeton", + creating: "Création…", + payInvoice: "⚡ Payer une facture Lightning", + pasteInvoice: "Collez une facture Lightning (lnbc...)", + payInvoiceBtn: "Payer la facture", + processing: "Traitement...", + payAddress: "📧 Payer une adresse Lightning", + sendToAddress: "Envoyer à l'adresse", + sending: "Envoi…", + recentActivity: "Activité récente", + receivedLightning: "Reçu ⚡ Lightning", + sentLightning: "Envoyé ⚡ Lightning", + sentToken: "Envoyé 🥜 jeton", + receivedToken: "Reçu 🥜 jeton", + whatIsCashu: "Qu'est-ce que Cashu ?", + whatIsCashuDesc: "Cashu est de l'argent numérique adossé à Bitcoin Lightning. Voyez-le comme des jetons Bitcoin que vous gardez dans votre navigateur.", + benefitOffline: "Fonctionne hors ligne sur les spots de skate", + benefitInstant: "Paiements pair à pair instantanés", + benefitPrivacy: "Axé sur la confidentialité (les mints ne peuvent pas vous suivre)", + benefitRedeemable: "Toujours échangeable contre des sats Lightning", + findMints: "Trouver des mints sur mintradar.pedani.eu", + backupTitle: "Sauvegardez votre portefeuille", + backupDesc: "Votre portefeuille est sécurisé par une phrase de récupération de 12 mots. Conservez-la en lieu sûr — vous en aurez besoin pour restaurer votre solde si vous effacez les données du navigateur.", + viewRecovery: "Voir la phrase de récupération", + backupNote: "C'est comme votre nsec Nostr — gardez-la secrète et sauvegardée !", + tokenReceived: "Jeton reçu", + tokenReceivedDesc: "Jeton Cashu échangé avec succès !", + receiveFailed: "Échec de la réception", + unknownError: "Erreur inconnue", + requestUnsupported: "Requête Cashu pas encore prise en charge", + requestUnsupportedDesc: "Ce portefeuille ne peut pas encore payer une requête Cashu (creq) — demandez plutôt une facture ou une adresse Lightning.", + onchainUnsupported: "On-chain non pris en charge ici", + onchainUnsupportedDesc: "C'est une adresse Bitcoin. Ce portefeuille n'envoie que des jetons Cashu et des paiements Lightning.", + nostrProfile: "C'est un profil Nostr", + nostrProfileDesc: "Scannez un jeton Cashu, une facture Lightning ou une adresse Lightning pour payer.", + clinkUnsupported: "Code de paiement pas encore pris en charge", + clinkUnsupportedDesc: "Ce portefeuille ne peut pas encore payer les codes CLINK. Utilisez plutôt une facture ou une adresse Lightning.", + unrecognizedQr: "Code QR non reconnu", + unrecognizedQrDesc: "Scannez un jeton Cashu, une facture Lightning ou une adresse Lightning.", + invalidAmount: "Montant invalide", + invalidAmountDesc: "Veuillez saisir un montant valide", + paymentSent: "Paiement envoyé", + paymentSentDesc: "Envoyé {{amount}} sats à {{address}}", + paymentFailed: "Échec du paiement", + copied: "Copié", + copiedDesc: "{{label}} copié dans le presse-papiers", + receiveSats: "Recevoir {{amount}} sats", + payInvoiceHint: "Payez cette facture depuis n'importe quel portefeuille Lightning", + invoiceQrAlt: "Code QR de la facture", + lightningInvoice: "Facture Lightning", + invoiceLabel: "Facture", + waiting: "⏳ En attente du paiement...", + tokenReady: "Jeton prêt à envoyer", + shareToken: "Partagez ce jeton avec le destinataire", + tokenQrAlt: "Code QR du jeton", + cashuToken: "Jeton Cashu", + tokenLabel: "Jeton", + copyToken: "Copier le jeton", + tokenWarning: "Toute personne possédant ce jeton peut le réclamer — traitez-le comme de l'argent liquide !", + browser: { + title: "Portefeuille ecash intégré", + appOnly: "Application uniquement", + desc: "Ecash Cashu auto-conservé, propulsé par Bitcoin Lightning", + unlockTitle: "Débloquez le portefeuille complet dans l'application SkateSpots", + unlockDesc: "Le portefeuille ecash intégré vous permet de créer, envoyer et échanger des jetons Cashu directement sur le spot. Il vit dans l'application native, où il peut parler directement aux mints — les navigateurs isolent ces connexions pour votre sécurité.", + zapTipTitle: "Zap et pourboire — fonctionne dans votre navigateur dès maintenant", + zapTipDesc: "Envoyer des sats à des spots, événements, coachs et crews fonctionne directement ici. Connectez simplement un portefeuille Lightning ci-dessous — Nostr Wallet Connect ou une extension navigateur comme Alby. Aucun mint Cashu nécessaire." + } + }, + escrow: { + title: "Séquestre", + desc: "Vendez en toute sécurité : activez le séquestre et un acheteur peut bloquer ses sats pour vous lors d'un échange. Vous les libérez quand vous livrez — sinon, l'acheteur peut les récupérer après le délai convenu.", + active: "Le séquestre est activé", + publish: "Activer le séquestre", + published: "Le séquestre est activé", + publishedDesc: "Les acheteurs peuvent désormais bloquer des fonds pour vous lors d'un échange.", + failed: "Impossible d'activer le séquestre" + }, + escrowSettings: { + title: "Paramètres du séquestre", + desc: "Valeurs par défaut pour les échanges sous séquestre Cashu. Locales à l'appareil.", + lockWindow: "Fenêtre de blocage par défaut", + lockWindowHint: "Durée pendant laquelle les fonds restent bloqués avant que l'acheteur puisse les récupérer. Plus c'est long, plus c'est sûr pour le vendeur.", + days: "jours", + preferredMint: "Mint pour le séquestre", + activeMint: "Mint actif", + preferredMintHint: "Quel mint finance le séquestre. Utilisez-en un digne de confiance.", + requireListings: "Exiger le séquestre sur les nouvelles annonces", + requireListingsHint: "Présélectionne « Exiger le séquestre » lorsque vous publiez un article." + }, + privacy: { + title: "Conseils de confidentialité", + subtitle: "Apprenez à protéger votre vie privée financière", + cashuRecommended: "CASHU (Recommandé)", + anon: "Transactions anonymes", + blind: "Les signatures aveugles masquent l'activité", + noIp: "Aucune exposition de l'IP", + trustMint: "Confier les fonds au mint", + lightningAddress: "ADRESSE LIGHTNING", + linked: "Peut être liée à l'identité", + traceable: "Historique des paiements traçable", + ipVisible: "IP visible lors de la facturation", + selfCustody: "Auto-conservation possible", + bestPractices: "Bonnes pratiques", + tip1Title: "Utilisez Cashu pour recevoir les pourboires", + tip1Desc: "Le portefeuille Cashu intégré est le moyen le plus privé de recevoir des zaps", + tip2Title: "Utilisez un portefeuille distinct pour SkateSpots", + tip2Desc: "N'utilisez pas votre portefeuille d'épargne principal — gardez les fonds de l'application à part", + tip3Title: "Envisagez d'utiliser un VPN ou Tor", + tip3Desc: "Masque votre adresse IP lors des transactions", + tip4Title: "Évitez les adresses Lightning liées à votre identité", + tip4Desc: "Utilisez des adresses pseudonymes non liées à votre vrai nom", + proTip: "Astuce de pro :", + proTipDesc: "Recevez d'abord les paiements sur votre portefeuille Cashu, puis déplacez périodiquement des montants plus importants vers votre portefeuille personnel en utilisant un VPN pour le transfert.", + warnTitle: "Note sur la confidentialité", + warnDesc: "Les adresses Lightning peuvent potentiellement relier votre activité SkateSpots à votre identité réelle.", + betterPrivacy: "Pour plus de confidentialité :", + bullet1: "Utilisez un portefeuille dédié à cette application", + bullet2: "Envisagez plutôt d'utiliser le portefeuille Cashu", + bullet3: "Utilisez un VPN/Tor pour les transactions", + useCashu: "Utiliser Cashu à la place", + understand: "J'ai compris" + }, + mintPrivacy: { + title: "Confidentialité des mints", + desc: "Utiliser plusieurs mints améliore la confidentialité en empêchant un seul mint de voir toutes vos transactions", + distribution: "Répartition des fonds", + singleWarning: "Utiliser un seul mint signifie que ce mint peut voir tout le calendrier et les montants de vos transactions. Envisagez d'ajouter d'autres mints pour une meilleure confidentialité.", + yourMints: "Vos mints ({{count}})", + default: "Par défaut", + addMint: "Ajouter un mint", + addMintDesc: "Ajouter un nouveau mint Cashu à votre portefeuille", + mintUrl: "URL du mint", + add: "Ajouter", + adding: "Ajout...", + orChoose: "Ou choisissez dans la liste", + recommended: "Mints recommandés", + allMints: "Tous les mints (annuaire)", + searchMints: "Rechercher des mints…", + noDirectoryMints: "Aucun mint ne correspond à votre recherche.", + directoryHint: "Issu de l'annuaire communautaire MintRadar — non officiel et susceptible d'être obsolète.", + added: "Ajouté", + soon: "Bientôt", + autoDistribute: "Répartir automatiquement les fonds", + autoDesc: "Répartir les fonds reçus sur plusieurs mints", + autoAria: "Répartir automatiquement les fonds (bientôt disponible)", + tip1: "Utilisez au minimum 2-3 mints différents pour une meilleure confidentialité", + tip2: "Ne gardez pas tous vos fonds dans un seul mint — répartissez-les", + tip3: "Tenez compte de la juridiction du mint (pays différents = accès légal différent)", + tip4: "Les mints voient le moment des transactions mais PAS qui vous payez (signatures aveugles)", + future: "Fonctionnalités à venir : rotation des mints et score de confidentialité — restez à l'écoute !", + findMore: "Trouvez plus de mints sur mintradar.pedani.eu", + trustWarning: "Avertissement de confiance :", + trustWarningDesc: "Les mints sont sous tutelle — ils détiennent vos fonds. N'utilisez que des mints en qui vous avez confiance. Si un mint disparaît, vos fonds peuvent être perdus. Répartir les fonds sur plusieurs mints réduit le risque.", + removeTitle: "Supprimer le mint ?", + removeDesc: "Voulez-vous vraiment supprimer {{name}} ?", + removeMint: "Supprimer le mint", + warning: "Avertissement :", + withdrawWarning: "Ce mint contient {{amount}} sats. Retirez vos fonds avant de le supprimer !", + invalidUrl: "URL invalide", + invalidUrlDesc: "L'URL du mint doit commencer par https://", + mintAdded: "Mint ajouté", + mintAddedDesc: "Nouveau mint ajouté avec succès", + mintAddedNamed: "{{name}} ajouté avec succès", + failedAdd: "Échec de l'ajout du mint", + failed: "Échec", + noMints: "Aucun mint", + singleMint: "Mint unique", + concentrated: "Concentré", + moderate: "Modéré", + wellDistributed: "Bien réparti", + mintCoinosWebDesc: "Mint compatible web (recommandé pour les navigateurs)", + mintMinibitsWebDesc: "⚠ Application native uniquement — inaccessible depuis les navigateurs web", + mintMinibitsNativeDesc: "Mint SkateSpots — recommandé", + mintCoinosDesc: "Mint compatible web", + mintLnbitsDesc: "Mint communautaire sur LNbits" + }, + nwc: { + title: "Portefeuille Lightning", + noConnection: "Portefeuille NWC", + refresh: "Actualiser le solde", + createInvoice: "Créer une facture", + copyInvoice: "Copier la facture", + pasteInvoice: "Collez une facture Lightning (lnbc…)", + amount: "Montant : {{amount}} sats", + pasteToSee: "Collez une facture pour voir le montant", + pay: "Payer", + invoiceQrAlt: "Code QR de la facture Lightning", + enterAmount: "Saisissez un montant en sats", + readBalanceFailed: "Impossible de lire le solde", + readBalanceFailedDesc: "Votre portefeuille n'a pas répondu.", + createInvoiceFailed: "Impossible de créer la facture", + createInvoiceFailedDesc: "Réessayez dans un instant.", + paymentSent: "Paiement envoyé", + paidAmount: "{{amount}} sats payés.", + paid: "Payé.", + paymentRejected: "Le portefeuille a refusé le paiement." + }, + qr: { + title: "Scanner un code QR", + desc: "Placez le code QR dans le champ de la caméra pour le scanner", + paste: "Coller depuis le presse-papiers", + hint: "Scannez un jeton Cashu, une facture Lightning ou une adresse Lightning", + clipboardEmpty: "Presse-papiers vide", + clipboardEmptyDesc: "Aucun texte trouvé dans le presse-papiers", + pasteFailed: "Échec du collage", + pasteFailedDesc: "Impossible de lire depuis le presse-papiers" + }, + recovery: { + title: "Phrase de récupération", + desc: "Ces 12 mots sont le seul moyen de restaurer votre solde ecash. Notez-les dans l'ordre et conservez-les hors ligne — ne les partagez jamais avec personne.", + tapReveal: "Touchez pour révéler", + noWatching: "Assurez-vous que personne ne regarde", + hide: "Masquer", + reveal: "Révéler", + paperHint: "Les écrire sur papier est plus sûr — les copier dans votre presse-papiers peut les exposer à d'autres applications.", + written: "Je les ai notées", + revealFirst: "Révélez d'abord les mots", + copiedDesc: "Phrase de récupération copiée — collez-la dans un endroit sûr, puis videz votre presse-papiers.", + copyFailed: "Échec de la copie", + copyFailedDesc: "Veuillez plutôt noter les mots." + }, + guide: { + quickGuide: "Guide rapide", + fullGuide: "Guide du portefeuille (édition skater)", + cashuSummary: "Confidentialité + Commodité", + mintHoldsFunds: "(le mint détient les fonds)", + lightningSummary: "Contrôle + Sécurité", + youHoldKeys: "(vous détenez les clés)", + useBoth: "Utilisez les deux : Cashu pour les pourboires, Lightning pour l'épargne", + cashuTitle: "PORTEFEUILLE CASHU", + cashuTagline: "Comme de l'argent liquide dans votre poche au skatepark", + cashuBullet1: "Rapide à sortir pour un pourboire", + cashuBullet2: "N'y gardez pas toutes vos économies", + cashuBullet3: "Si le mint disparaît, les fonds peuvent être perdus", + cashuBullet4: "Personne ne sait combien vous avez (confidentialité !)", + cashuPerfectFor: "En-cas de session, zapper des clips, petits pourboires", + lightningTitle: "PORTEFEUILLE LIGHTNING", + lightningTagline: "Comme votre compte bancaire — vous gardez le contrôle", + lightningBullet1: "Sécurisé, vous contrôlez les clés", + lightningBullet2: "Prend un moment à configurer", + lightningBullet3: "Historique complet des transactions", + lightningBullet4: "Mieux adapté aux montants plus importants", + lightningPerfectFor: "Achats de matériel, épargne, gros zaps", + perfectFor: "Parfait pour :", + proTips: "ASTUCES DE PRO", + tip1Title: "Utilisez les deux portefeuilles", + tip1Desc: "Gardez l'argent de session en Cashu, l'épargne en Lightning", + tip2Title: "Essayez différents portefeuilles", + tip2Desc: "Expérimentez pour trouver ce qui vous convient. Chacun a des fonctionnalités et des compromis différents", + tip3Title: "Meilleure confidentialité", + tip3Desc: "Utiliser plusieurs portefeuilles signifie qu'aucune application unique ne voit toute votre activité", + tip4Title: "Acquérez de l'expérience", + tip4Desc: "Plus vous connaissez d'outils, plus vous avez d'options. Commencez petit, apprenez en chemin", + tldr: "TL;DR :", + tldrDesc: "Il n'y a pas de « meilleur » portefeuille — cela dépend de vos besoins. Essayez les deux, utilisez ce qui vous semble juste, et ne gardez pas tous vos sats au même endroit !" + }, + zap: { + count: "{{count}} zaps", + connectFirst: "Connectez d'abord votre portefeuille", + connectFirstDesc: "Pour envoyer des zaps (pourboires Bitcoin), vous devez connecter un portefeuille Lightning.", + quickSetup: "Configuration rapide (30 secondes)", + quickSetupDesc: "Connectez votre portefeuille Lightning existant avec Nostr Wallet Connect (NWC). Aucun compte supplémentaire nécessaire.", + connectNwc: "Connecter le portefeuille avec NWC", + noWallet: "Pas de portefeuille ? Apprenez comment", + skip: "Ignorer pour l'instant (facture manuelle)", + note: "ℹ️ Note :", + noteDesc: "Vous pouvez toujours créer une facture sans connecter de portefeuille, mais vous devrez la copier manuellement pour payer.", + payWithWebln: "Payer avec WebLN", + processing: "Traitement...", + openInWallet: "Ouvrir dans le portefeuille Lightning", + scanHint: "Scannez le code QR ou copiez la facture pour payer avec n'importe quel portefeuille Lightning.", + cashuInstant: "Payez instantanément avec votre portefeuille intégré", + satsAvailable: "sats disponibles", + or: "OU", + customAmount: "Montant personnalisé", + addComment: "Ajouter un commentaire (facultatif)", + insufficientBanner: "⚠️ Solde Cashu insuffisant. Il vous manque {{amount}} sats. Basculez vers Lightning ou rechargez votre portefeuille Cashu.", + creatingInvoice: "Création de la facture...", + zapAmount: "Zapper {{amount}} sats", + zapAmountCashu: "Zapper {{amount}} sats avec Cashu", + lightningInvoice: "Facture Lightning", + qrAlt: "Code QR de la facture Lightning", + enterAmount: "Saisissez un montant", + enterAmountDesc: "Choisissez un préréglage ou saisissez un nombre valide de sats.", + cashuUnavailable: "Portefeuille Cashu indisponible", + cashuUnavailableDesc: "Votre portefeuille Cashu n'est pas prêt. Basculez vers Lightning ou ouvrez d'abord votre portefeuille.", + insufficientCashu: "Solde Cashu insuffisant", + insufficientCashuDesc: "Il vous manque {{amount}} sats. Basculez vers Lightning ou rechargez.", + zapSentCashu: "Zap envoyé ! 🥜", + zapSentCashuDesc: "{{amount}} sats zappés depuis votre portefeuille Cashu.", + cashuFailed: "Échec du paiement Cashu", + cashuFailedDesc: "Échec du paiement avec votre portefeuille Cashu.", + invoiceCopied: "Facture copiée", + invoiceCopiedDesc: "Facture Lightning copiée dans le presse-papiers", + defaultComment: "Zappé sur SkateSpots ! 🛹", + titleConnect: "Connecter le portefeuille", + titlePayment: "Paiement Lightning", + titleZap: "Envoyer un Zap", + descConnect: "Connectez votre portefeuille Lightning pour envoyer des zaps", + descPayment: "Payer avec le réseau Bitcoin Lightning", + descZap: "Les zaps sont de petits paiements Bitcoin qui soutiennent le créateur de cet élément. Si vous avez aimé, pensez à envoyer un zap !", + descZapShort: "Les zaps sont de petits paiements Bitcoin qui soutiennent les créateurs. Pensez à envoyer un zap !" + }, + zapCrew: { + title: "Zapper le crew", + desc: "Répartir un zap équitablement entre {{count}} membres du crew disposant d'une adresse Lightning.", + noMembers: "Aucun autre membre du crew à zapper pour le moment.", + totalAmount: "Montant total", + customTotal: "Total personnalisé", + each: "sats chacun", + rounded: "(arrondi)", + noWallet: "Aucun portefeuille connecté — vous obtiendrez une facture par membre à payer manuellement. Connectez un portefeuille pour un partage en un clic.", + zapAcross: "Zapper {{amount}} sats entre {{count}}", + sentTo: "⚡ Envoyé à {{done}}/{{total}}", + none: "Aucun paiement automatique effectué", + copyPending: "Copiez les factures en attente pour finir de payer manuellement.", + thanks: "Merci de soutenir le crew !", + payingCrew: "Paiement du crew…", + defaultComment: "J'ai zappé le crew {{crew}} ! 🤘", + sent: "Envoyé", + paying: "Paiement", + resolving: "Résolution", + skipped: "Ignoré", + failed: "Échec", + waiting: "En attente", + copyInvoice: "Copier la facture", + invoiceCopied: "Facture copiée", + invoiceCopiedDesc: "Collez-la dans n'importe quel portefeuille Lightning" + }, + zapBadges: { + title: "Badges de zap", + zaps: "zaps", + satsSent: "sats envoyés", + rank: "rang", + footnote: "Basé sur les 30 derniers jours de zaps.", + first: "Premier Zap", + firstHint: "Envoyez votre premier zap", + regular: "Régulier", + regularHint: "Envoyez 10 zaps", + generous: "Généreux", + generousHint: "Envoyez 10 000 sats", + patron: "Mécène", + patronHint: "Envoyez 100 000 sats", + top10: "Top 10", + top10Hint: "Atteignez le top 10 des soutiens" + }, + trust: { + unavailable: "Score de confiance indisponible", + yourContent: "Ceci est votre contenu", + following: "Vous suivez cet utilisateur", + friendOfFriend: "Ami d'un ami (2 sauts)", + nip05: "Utilisateur vérifié NIP-05", + unknown: "Utilisateur inconnu", + help: "Les scores de confiance aident à identifier les contributeurs fiables dans la communauté du skateboard." + }, + share: { + title: "Partager le profil", + desc: "Pointez la caméra d'un téléphone vers le code pour ouvrir le profil de {{name}}.", + qrAlt: "Code QR du profil", + copyLink: "Copier le lien", + copyFailed: "Échec de la copie", + copyFailedDesc: "Impossible de copier le lien.", + shareEllipsis: "Partager…" + }, + addToCollection: { + title: "Enregistrer dans une collection", + desc: "Enregistrer « {{spot}} » dans l'une de vos collections", + loginRequired: "Veuillez vous connecter pour enregistrer des spots dans des collections", + noCollections: "Vous n'avez encore aucune collection", + createFirst: "Créez la première ci-dessous !", + spotCount: "{{count}} spots", + alreadySavedTag: "Déjà enregistré", + alreadySaved: "Déjà enregistré", + alreadySavedDesc: "« {{spot}} » est déjà dans « {{collection}} »", + saved: "Spot enregistré !", + savedDesc: "« {{spot}} » ajouté à « {{collection}} »", + saveFailed: "Échec de l'enregistrement", + somethingWrong: "Une erreur est survenue", + created: "Collection créée !", + createdDesc: "« {{spot}} » ajouté à votre nouvelle collection « {{collection}} »", + createFailed: "Échec de la création de la collection", + name: "Nom de la collection", + descriptionOptional: "Description (facultatif)", + creating: "Création...", + createAndSave: "Créer et enregistrer", + createNew: "Créer une nouvelle collection" + }, + collection: { + back: "Retour aux collections", + created: "Créée {{date}}", + deleteTitle: "Supprimer la collection ?", + deleteDesc: "Cela supprimera définitivement « {{title}} ». Les spots eux-mêmes ne seront pas affectés.", + deleting: "Suppression...", + deleteFailed: "Échec de la suppression de la collection", + deleted: "Collection supprimée", + deletedDesc: "« {{title}} » a été supprimée", + empty: "Aucun spot dans cette collection", + emptyOwner: "Ajoutez des spots à votre collection en cliquant sur « Enregistrer dans une collection » sur n'importe quel spot", + emptyOther: "Cette collection est vide", + browseSpots: "Parcourir les spots", + linkCopied: "Lien copié !", + linkCopiedDesc: "Le lien de la collection a été copié dans le presse-papiers", + map: "Carte de la collection", + removeFailed: "Échec de la suppression du spot", + shareText: "Découvrez cette collection de spots : {{title}}", + spotRemoved: "Spot supprimé", + spotRemovedDesc: "« {{title}} » a été supprimé de cette collection" + }, + mints: { + title: "Mints", + subtitle: "Parcourez les mints Cashu et leur état de santé. Les opérations du portefeuille Cashu se déroulent dans l'application SkateSpots.", + searchPlaceholder: "Rechercher des mints par nom ou URL…", + onlineOnly: "En ligne uniquement", + count: "{{filtered}} sur {{total}} mints", + directoryError: "Impossible de charger l'annuaire des mints.", + directoryHint: "L'annuaire est géré par la communauté et limité en débit — il peut être brièvement indisponible.", + goToWallet: "Aller au portefeuille", + appOnly: "L'ajout d'un mint se fait dans l'application SkateSpots (Cashu est réservé à l'application).", + noMatch: "Aucun mint ne correspond à « {{query}} ».", + footer: "Données de santé issues du projet communautaire MintRadar — non officielles et susceptibles d'être obsolètes. Vérifiez toujours les conditions d'un mint avant de lui confier des fonds.", + archived: "Archivé", + degraded: "Dégradé", + offline: "Hors ligne", + online: "En ligne", + terms: "Conditions", + reliability: "fiabilité", + add: "Ajouter", + addToWallet: "Ajouter au portefeuille", + copyUrl: "Copier l'URL", + openMint: "Ouvrir le mint", + inWallet: "Dans votre portefeuille", + addedBadge: "Ajouté", + urlCopied: "URL du mint copiée", + added: "Mint ajouté", + addedDesc: "{{host}} est maintenant dans votre portefeuille.", + couldNotAdd: "Impossible d'ajouter le mint", + communityRating: "Note de la communauté", + reliabilityLabel: "Fiabilité", + uptime: "Disponibilité 24 h / 7 j", + location: "Emplacement", + latency: "Latence", + nuts: "NUTs pris en charge", + units: "Unités", + version: "Version", + ratedBy: "Noté {{rating}}/5 par {{count}} personnes sur MintRadar.", + noRating: "Pas encore de note communautaire sur MintRadar.", + reviewsNote1: "Les avis écrits ne font pas partie de l'annuaire —", + openMintRadar: "ouvrir MintRadar", + reviewsNote2: "pour en lire ou en laisser un.", + liveness: "Audit de disponibilité : {{mints}} mints et {{melts}} melts testés", + livenessErrors: " · {{errors}}/{{total}} erreurs récentes", + whatsAMint: "Qu'est-ce qu'un mint ?", + whatsAMintDesc: "Un mint Cashu émet et échange l'ecash de votre portefeuille. Il détient le Bitcoin qui adosse vos jetons — donc un mint que vous n'exploitez pas vous-même est un mint à qui vous devez faire confiance.", + mintWarning: "Les mints peuvent passer hors ligne, changer de conditions ou disparaître avec les fonds. Ne gardez que de petits soldes, sauf si vous faites confiance à l'opérateur.", + healthDisclaimer: "Les données de santé sont gérées par la communauté (MintRadar) — non officielles et potentiellement obsolètes." + }, + appShop: { + title: "Boutique de l'app", + subtitle: "Merch SkateSpots pour ceux qui font tourner la scène.", + comingSoon: "Bientôt disponible", + wearThe: "Portez la", + scene: "Scène", + heroDesc1: "Du merch pour ceux qui font tourner la machine — vendu", + locally: "localement, sur demande", + heroDesc2: ". Vous m'envoyez un message, on règle les détails, et vous payez en", + heroDesc3: "— Lightning ou Cashu — quand vous le récupérez. Pas de cartes, pas de comptes, pas de robot de paiement, pas d'intermédiaire qui ponctionne le drop.", + requestItem: "Demander un article", + dmHint: "Ouvre un DM privé et chiffré avec moi.", + lightning: "Lightning", + cashu: "Cashu", + localHandover: "Remise en main propre", + inTheWorks: "En préparation", + notForSale: "pas encore en vente", + soon: "bientôt", + tees: "T-shirts et hoodies", + decks: "Decks", + shopTools: "Outils de shop", + stickerPacks: "Packs de stickers", + stickerPacksDesc: "Les packs arrivent. Les designs, non — imprimez ces deux-ci tout de suite, gratuitement.", + sticker: "Sticker", + stickerTip: "Découpe noire. Imprimez sur du papier autocollant, découpez le long du bord noir.", + poster: "Affiche", + posterTip: "S'imprime en A3 ; réduisez en A4 (50 %) et il se scanne toujours très bien.", + printableAlt: "SkateSpots {{title}} — imprimable", + print: "Imprimer", + printNote1: "Imprimez à", + actualSize: "100 % / « Taille réelle »", + printNote2: "pour que la taille soit exacte et que le QR reste net — il pointe vers skate-spots.org. Fichiers vectoriels, donc ils s'agrandissent sans devenir flous.", + howBuying: "Comment se passe l'achat", + dmNotCart: "c'est un DM, pas un panier", + step1Title: "Envoyez-moi un message", + step1Desc: "Envoyez un DM avec ce que vous voulez — article, taille, couleur, ce que vous cherchez.", + step2Title: "On règle ça", + step2Desc: "Prix en sats, et où et quand se rencontrer. C'est une conversation, pas un paiement.", + step3Title: "Payez en sats", + step3Desc: "Lightning ou Cashu à la remise, puis c'est à vous. Pas de livraison, pas de salles d'attente." + }, + newsletter: { + newIssue: "Nouvelle édition", + composerTitle: "Publier une édition de newsletter", + composerDesc: "Publié comme article NIP-23 (kind 30023) sur le relay communautaire. Les abonnés le reçoivent dans leur cloche de notifications. Le corps prend en charge le Markdown.", + fieldTitle: "Titre", + identifier: "Identifiant (slug)", + leaveBlank: "laisser vide pour générer automatiquement", + reusingSlug: "Réutiliser un slug existant modifie cette édition au lieu d'en créer une nouvelle.", + summary: "Résumé", + optional: "facultatif", + coverImage: "URL de l'image de couverture", + bodyMarkdown: "Corps (Markdown)", + characters: "{{count}} caractères", + publishIssue: "Publier l'édition", + issuePublished: "Édition publiée ! 🛹", + issuePublishedDesc: "Les abonnés la verront dans leur cloche de notifications.", + publishFailed: "Échec de la publication", + couldNotReachRelay: "Impossible d'atteindre un relay — vérifiez votre connexion et réessayez.", + tryAgain: "Veuillez réessayer.", + publishedToNostr: "Publié sur Nostr", + publishedToast: "Publié !", + postedToNostr: "Drop {{number}} publié sur Nostr.", + postToNostr: "Publier sur Nostr", + previewLabel: "Aperçu", + editFirst: "Modifier d'abord", + previewNoteDesc: "Voici comment la note apparaîtra sur la plupart des clients Nostr. Le formatage varie selon le client.", + editNoteDesc: "Modifiez le texte de la note ci-dessous. Les modifications n'affectent que cette publication — le fichier source reste inchangé.", + dropNumber: "Drop {{number}}", + publish: "Publier", + publishing: "Publication...", + dropIsOut: "Le drop {{number}} est sorti", + daysAgo: "il y a {{count}} j", + dismiss: "Ignorer", + itsMonday: "C'est lundi", + mondayDesc: "Il est temps de publier la newsletter hebdomadaire. Un clic et l'IA la rédige à partir du journal git.", + writeDrop: "Rédiger le Drop {{number}}", + dismissReminder: "Ignorer le rappel", + loginPrompt: "Connectez-vous avec Nostr pour recevoir les nouveaux drops dans votre boîte.", + subscribedToast: "Vous êtes abonné ! 🛹", + subscribedToastDesc: "Les nouveaux drops arriveront dans votre cloche de notifications sous « News ».", + unsubscribed: "Désabonné", + unsubscribedDesc: "Vous pouvez toujours lire chaque édition ici à tout moment.", + checking: "Vérification…", + subscribed: "Abonné", + unsubscribe: "Se désabonner", + subscribeCta: "S'abonner à la newsletter", + archiveSynced: "Archive synchronisée avec Nostr", + missingCount: "{{count}} éditions d'archive ne sont pas encore sur Nostr", + backfillDesc: "Publiez {{list}} comme articles NIP-23 pour que les abonnés et les lecteurs de format long puissent voir l'archive complète. La page conserve sa mise en page riche dans tous les cas.", + backfill: "Compléter {{count}} vers Nostr", + publishing2: "Publication…", + publishingLabel: "Publication…", + backfilled: "{{count}} éditions complétées 🛹", + backfilledDesc: "L'archive vit maintenant sur Nostr pour les abonnés et les lecteurs.", + partialBackfill: "{{published}} publiées, {{failed}} échouées", + retryFinish: "Réessayer pour terminer : {{list}}.", + notLoggedIn: "Non connecté", + allIssues: "Toutes les éditions", + brand: "Newsletter SkateSpots", + digTheDrop: "Vous aimez le drop ? Zappez-le et ne manquez jamais le prochain.", + sectionStats: "La communauté en chiffres", + sectionWhatsNew: "Quoi de neuf", + sectionSpotOfWeek: "Spot de la semaine", + sectionCommunity: "Communauté", + sectionSupport: "Soutenir le projet", + sectionLatestDrops: "Derniers drops · En direct de Nostr", + mappedBy: "Cartographié par", + viewOnMap: "Voir sur la carte", + noSpotPicked: "Aucun spot choisi cette semaine. Proposez le vôtre et il pourrait figurer dans le prochain drop.", + browseMap: "Parcourir la carte", + spotMap: "Carte des spots", + statsBadge: "Stats", + supportDesc: "100 % open source, financé par la communauté, sans publicité, sans investisseurs. Si c'est utile, zappez-le ou soutenez-le sur Angor.", + readFull: "Lire l'édition complète", + joinSkaters: "Rejoignez {{count}} skaters qui reçoivent les drops", + weeklyDrops: "Drops hebdomadaires", + tagline: "Une newsletter hebdomadaire · publiée quand on veut bien", + freeNote: "Gratuit. Propulsé par Nostr — votre abonnement vit sur vos clés et vous suit sur tous vos appareils. Les nouveaux drops arrivent dans votre cloche de notifications.", + live: "En direct", + builtOn: "Construit sur", + openSource: "Open source", + supportUs: "Soutenez-nous", + freeToSkate: "Vous êtes libre de faire du skateboard" + }, + stats: { + subtitle: "Mesures en direct directement issues du réseau Nostr. Transparent, décentralisé, vérifiable par tous.", + dataSource: "Source des données :", + updated: "mis à jour {{age}}", + refresh: "Actualiser", + partial: "Impossible d'atteindre tous les relais — ces chiffres peuvent être incomplets.", + error: "Impossible d'atteindre le relay pour le moment. Les stats se chargeront dès que la connexion sera rétablie.", + atAGlance: "La communauté en un coup d'œil", + skateSpots: "Spots de skate", + listedShops: "Shops référencés", + events: "Événements", + mappers: "Cartographes", + uniqueContributors: "contributeurs uniques", + labHeader: "The Lab · Créateurs et services", + total: "{{count}} au total", + coaches: "Coachs", + filmers: "Filmeurs", + editors: "Monteurs", + photographers: "Photographes", + builders: "Constructeurs", + artists: "Artistes", + graffiti: "Graffiti", + tattoo: "Tatouage", + trainers: "Entraîneurs", + musicians: "Musiciens", + judges: "Juges", + organizers: "Organisateurs", + barbers: "Coiffeurs", + showFewer: "Afficher moins", + showAllCrafts: "Afficher les 13 disciplines", + community: "Communauté", + tours: "Tours", + crews: "Crews", + marketplace: "Marketplace", + liveListings: "Annonces en ligne", + tradesRecorded: "Échanges enregistrés", + satsTraded: "Sats échangés", + zapsToMappers: "Zaps aux cartographes", + tradesNote1: "échanges mutuels entre", + tradesNote2: "personnes. Les sats sont déclarés par les échangistes eux-mêmes — l'application ne peut pas observer un paiement hors application — donc le chiffre principal ne compte que les", + mutual: "échanges mutuels", + tradesNote3: "échanges avec un plafond par paire ; la réclamation brute est de", + tradesNote4: "sats. « Zaps aux cartographes » ne compte que les reçus adressés à nos meilleurs contributeurs — ce n'est", + not: "pas", + tradesNote5: "le volume global de zaps.", + byRegion: "Spots et shops par région", + resolving: "Résolution de {{count}} emplacements non étiquetés à partir de leurs coordonnées… une seule fois, puis mis en cache sur cet appareil.", + topCountries: "Principaux pays", + topCities: "Principales villes", + other: "Autres", + otherCountriesTitle: "Pays hors du top 6", + otherCitiesTitle: "Villes hors du top 6", + uncategorised: "Non catégorisé", + uncategorisedTitle: "Aucune étiquette ville/pays", + regionNote1: "Compte", + spotsAndShops: "spots et shops", + regionNote2: ", pas les skaters — à partir de l'étiquette ville/pays de chacun, ou dérivé des coordonnées de son épingle lorsqu'il n'en a pas (mis en cache sur votre appareil ; pays regroupés par code ISO le cas échéant), relay communautaire uniquement, contenu masqué par la modération exclu.", + ofTotal: "{{count}} sur {{total}}", + regionNote3: "emplacements n'ont aucune étiquette de lieu et apparaissent comme « Non catégorisé ».", + growth: "Croissance dans le temps", + chartCumulativeTitle: "Spots cartographiés (cumulatif)", + chartCumulativeDesc: "Total des spots ajoutés à la carte au fil du temps", + chartMonthlyTitle: "Activité mensuelle", + chartMonthlyDesc: "Nouveau contenu publié chaque mois", + chartMappersTitle: "Cartographes actifs / mois", + chartMappersDesc: "Contributeurs uniques publiant chaque mois", + chartMixTitle: "Répartition du contenu", + chartMixDesc: "Répartition par type de contenu (depuis toujours)", + noData: "Pas encore de données", + topMappers: "Meilleurs cartographes", + mostSpots: "— plus de spots ajoutés", + noMapperData: "Pas encore de données de cartographes", + topShops: "Meilleurs shops", + mostShops: "— plus de shops ajoutés", + shopCount: "{{count}} shops", + noShopData: "Pas encore de données de shops", + supporters: "Soutiens de la communauté", + fundedTitle: "Financé par la communauté", + fundedDesc1: "Financement participatif Bitcoin décentralisé via Angor.", + fundedDesc2: "Pas de publicité, pas d'investisseurs, pas de vente de données.", + backAngor: "Soutenez-nous sur Angor", + communityLink: "Communauté →", + footer1: "Toutes les données sont tirées en direct de", + footer2: "— un relay Nostr public.", + footer3: "Chaque événement est signé par son créateur et cryptographiquement vérifiable.", + footer4: "Aucun chiffre ne peut être falsifié.", + spots: "Spots", + shops: "Shops", + lab: "Lab", + thisMonth: "+{{count}} ce mois-ci", + fromActive: "{{count}} de comptes actifs", + viewAll: "Voir tout", + spotCount: "{{count}} spots" + }, + leaderboard: { + mapEarn: "Cartographier et gagner", + helpMap: "AIDEZ À CARTOGRAPHIER LE MONDE", + intro: "Ajoutez des spots et des shops, recevez des zaps de skaters reconnaissants. Les meilleurs contributeurs peuvent recevoir des récompenses bonus !", + howItWorks: "Comment ça marche", + step1Title: "1. Cartographier", + step1Desc: "Ajoutez des spots et des shops avec photos et détails", + step2Title: "2. Gagner des Zaps", + step2Desc: "Les skaters qui trouvent vos spots utiles vous donneront un pourboire", + step3Title: "3. Récompenses bonus", + step3Desc: "Les meilleurs cartographes peuvent recevoir des récompenses bonus de notre fonds", + proTips: "💡 Astuces de pro pour plus de zaps :", + tipPhotos: "Ajoutez 3+ photos", + tipDescriptions: "Rédigez des descriptions détaillées", + tipLocation: "Emplacement précis", + mapShop: "Cartographier un shop", + mapShopDesc: "Skate shops, magasins de boards", + mapSpot: "Cartographier un spot", + mapSpotDesc: "Parcs, spots de rue, DIY", + shops: "Shops", + spotsLower: "spots", + shopsLower: "shops", + contributions: "contributions", + yourRanking: "Votre classement", + spotsShops: "{{spots}} spots • {{shops}} shops", + totalLower: "total", + overall: "Global", + noContributions: "Pas encore de contributions. Soyez le premier !", + addFirstSpot: "Ajouter le premier spot", + noShops: "Aucun shop cartographié pour l'instant", + addFirstShop: "Ajouter le premier shop", + noSpots: "Aucun spot cartographié pour l'instant", + poweredBy: "Propulsé par les zaps de la communauté", + poweredByDesc: "Quand vous trouvez un spot utile, zappez le cartographe ! C'est la meilleure façon de dire merci et d'encourager plus de contributions.", + you: "Vous", + zapTitle: "Classements de zaps", + zapSubtitle: "Les spots qui reçoivent le plus d'amour — et les skaters qui le donnent.", + thisWeek: "Cette semaine", + thisMonth: "Ce mois-ci", + allTime: "Depuis toujours", + topZappedSpots: "Spots les plus zappés", + noZaps: "Pas encore de zaps sur cette période. Soyez le premier — cliquez sur le ⚡ d'un spot que vous aimez.", + topSupporters: "Meilleurs soutiens", + noZapsSent: "Pas encore de zaps envoyés sur cette période.", + fromTop10: "⚡ {{amount}} sats provenant du top 10", + supporter: "Soutien", + skateShop: "Skate shop", + skateSpot: "Spot de skate" + }, + supporters: { + our: "NOTRE", + community: "COMMUNAUTÉ", + heroDesc: "SkateSpots est construit par et pour la communauté. Soutiens, collaborateurs, partenaires et amis qui gardent ce projet gratuit et décentralisé.", + backAngor: "Soutenez-nous sur Angor", + backers: "Soutiens", + backersDesc: "Skaters qui ont soutenu SkateSpots — financement on-chain via Angor, et zaps Lightning au projet.", + sourceAngor: "Angor", + supportersTotals: "{{count}} soutiens · {{angor}} sats via Angor · {{zap}} sats zappés", + quietNote: "Plus tous ceux qui ont donné discrètement — merci. ❤️", + silentTitle: "On-chain privé (paiements silencieux)", + silentDesc: "Un nom, une adresse fraîche pour chaque paiement — on-chain via paiements silencieux, ou Lightning depuis le même enregistrement. Rien à réutiliser, rien à relier.", + silentCopyName: "Copier le nom", + silentCopied: "Copié", + silentWallets: "Nécessite un portefeuille compatible avec les noms de paiement / paiements silencieux : Sparrow, Cake, Dana, Phoenix, BlueWallet, Wasabi, Nunchuk ou BitBox02.", + wayLightningTitle: "Instantané et public", + wayLightningDesc: "Zappez SkateSpots, ou payez discrètement. Fonctionne sans être connecté.", + waySilentTitle: "On-chain privé", + waySilentDesc: "Un nom de paiements silencieux — une nouvelle adresse pour chaque paiement.", + wayAngorTitle: "Financer la construction", + wayAngorDesc: "Angor — libération par étapes, remboursable au-delà de 100k sats.", + donateTitle: "Soutenir SkateSpots", + donateDesc: "Trois canaux, trois raisons — choisissez ce qui vous convient. Chaque sat garde la carte gratuite, sans publicité et open source.", + donatePageLink: "Ouvrir la page de don simple", + updatedAt: "Mis à jour {{when}}", + tiersNote: "Paliers : Soutien en dessous de 100k sats · Mécène 100k–1M · Légende 1M+", + tierEmpty: "Personne pour l'instant — soyez le premier.", + joinSupporters: "Rejoindre {{count}} soutiens", + showAll: "Afficher les {{count}}", + showLess: "Afficher moins", + impactSeeStats: "Voir le tableau complet →", + impactAsOf: "en direct des relais communautaires", + anonymousBacker: "Soutien anonyme", + beFirstBacker: "Pas encore de soutiens publics — soyez le premier.", + backersTotal: "{{count}} soutiens · {{amount}} sats collectés", + verifiedOnChain: "Vérifié on-chain", + supportedBy: "Soutenu par {{count}}", + tierSupporter: "Soutien", + tierPatron: "Mécène", + tierLegend: "Légende", + topZappers: "Ont zappé SkateSpots", + topZappersDesc: "Skaters qui ont envoyé un zap public directement au projet. Les paiements discrets ne sont pas listés.", + paysFor: "Ce que votre soutien finance", + paysForDesc: "Où va chaque sat — pas de salaires, pas de bureaux, pas de publicité.", + payRelay: "Hébergement des relais", + payDomain: "Domaine et TLS", + payAi: "Nœud IA / ContextVM", + payDev: "Temps de développement", + payOps: "Opérations", + payMarketing: "Marketing", + payRelayDesc: "Garde la carte en ligne et résiliente.", + payDomainDesc: "Le nom, le certificat, la connexion sécurisée.", + payAiDesc: "Sasquatch, le guide de la communauté.", + payDevDesc: "Construire et réparer SkateSpots.", + payOpsDesc: "Le travail ingrat qui maintient tout en marche.", + payMarketingDesc: "Atteindre de nouvelles scènes locales et skateshops.", + impact: "Impact à ce jour", + impactDesc: "Ce que la communauté a construit — financé par les skaters.", + impactSpots: "Spots", + impactCrews: "Crews", + impactEvents: "Événements", + impactLab: "Pros du Lab", + impactShops: "Shops", + impactMappers: "Cartographes", + support: "Soutenir", + supportDesc: "Financez SkateSpots sur Angor — financement participatif Bitcoin décentralisé et on-chain. Sans intermédiaire, sans KYC.", + collaborators: "Collaborateurs", + collaboratorsDesc: "Des personnes qui construisent activement SkateSpots — développeurs, designers, opérateurs de relais.", + partners: "Partenaires", + partnersDesc: "Organisations et projets avec lesquels nous travaillons étroitement.", + friends: "Amis", + friendsDesc: "Des personnes avec qui on vibre.", + backTitle: "Soutenir le projet sur Angor", + backDesc: "Angor est un financement Bitcoin on-chain décentralisé construit sur Nostr — vos fonds restent sous votre contrôle, libérés par étapes, sans dépositaire qui détient la cagnotte. Les contributions jusqu'à 100 000 sats fonctionnent comme un don (pas de poignée de main de récupération) ; les montants plus élevés sont des investissements dont les fonds non dépensés peuvent être récupérés. Chaque sat va au développement, à l'hébergement des relais et au maintien de SkateSpots gratuit pour chaque skater sur terre.", + donateNote: "Vous préférez un don direct ? ⚡ Zappez ci-dessous — rien à rembourser, rien à récupérer.", + openAngor: "Ouvrir Angor", + orZap: "ou ⚡ zappez n'importe quel spot, crew ou créateur directement dans l'application", + wantCollaborate: "Vous voulez collaborer ?", + wantCollaborateDesc: "Développeurs, designers, skaters avec des compétences — contactez-nous.", + viewNostrHub: "Voir sur NostrHub", + wantPartner: "Vous voulez devenir partenaire de SkateSpots ? Contactez-nous sur Nostr.", + comingSoon: "Bientôt disponible", + wantListed: "Vous voulez figurer ici ?", + wantListedDesc: "Envoyez un logo (PNG/WebP, fond transparent, min 200×200px) et votre URL par DM sur Nostr, uniquement si vous avez les vibes.", + whyTitle1: "Pourquoi nous avons besoin de votre", + whyTitle2: "soutien", + whyDesc: "SkateSpots est 100 % gratuit, open source et construit sur Nostr — un protocole décentralisé sans serveur central pour le fermer. Pas de publicité, pas de vente de données, pas d'investisseurs. Chaque sat va directement au développement, à l'hébergement des relais et au maintien de ce projet gratuit pour chaque skater sur terre.", + why1Title: "Natif Nostr", + why1Desc: "Aucun serveur central. Vos données vivent sur les relais que vous choisissez.", + why2Title: "Propulsé par Bitcoin", + why2Desc: "Gagnez des sats en cartographiant des spots. Dépensez-les dans les shops locaux.", + why3Title: "Gratuit pour toujours", + why3Desc: "Open source, pas de paywalls, pas de traçage, pas de financement par des VC.", + thankYou: "Merci. Chaque sat garde les spots sur la carte. 🛹⚡", + license: "Licence", + faq: "FAQ" + }, + admin: { + confirmed: "Confirmé", + title: "File de révision", + subtitle: "Spots, shops, événements, tours et matériel qui déclenchent les signaux de déchet. Masquer et Confirmer sont des étiquettes douces et réversibles ; les signalements passent en premier. Rien n'est supprimé.", + tabReports: "Signalements", + tabSpots: "Spots", + tabShops: "Shops", + tabEvents: "Événements", + tabTours: "Tours", + tabGear: "Matériel", + tabCrews: "Crews", + tabLab: "Lab", + tabClaims: "Réclamations", + nothingToReview: "Rien à réviser — aucun élément de ce type ne déclenche les signaux de déchet.", + hideActioned: "Masquer les traités", + showActioned: "Afficher les traités ({{count}})", + undoAll: "Annuler tout {{count}}", + undoAllTitle: "Annuler chaque verdict de cet onglet ?", + undoAllDesc: "Cela remet chaque élément à neutre — ni masqué, ni approuvé. Cela publie une étiquette publique par élément, donc avec Amber vous obtiendrez {{count}} écrans d'approbation.", + undoCount: "Annuler {{count}}", + undo: "Annuler", + confirm: "Confirmer", + hide: "Masquer", + hideIt: "Le masquer", + hideForEveryone: "Le masquer pour tout le monde ?", + hideForEveryoneDesc: "Cela retire l'élément de la navigation et de la recherche pour tous les utilisateurs de SkateSpots. C'est une étiquette publique et réversible — vous pouvez l'annuler depuis cette file.", + hidden: "Masqué", + hiddenDesc: "Retiré de l'application via une étiquette publique. Réversible.", + couldNotHide: "Impossible de masquer", + notASpot: "Pas un spot de skate", + lookAtIt: "Regardez-le" + }, + profile: { + nip05Verified: "NIP-05 vérifié", + nip05NotVerified: "NIP-05 non vérifié pour cette clé", + message: "Message", + zapsReceived: "zaps reçus", + memberSince: "Membre depuis", + badges: "Badges", + sponsorsSupport: "Sponsors et soutien", + skater: "Skater", + stance: "Position", + skating: "Pratique", + homeSpot: "Spot habituel", + basedIn: "Basé à", + addSkateDetails: "Ajoutez vos détails de skate", + addSkateDetailsDesc: "Définissez votre position, styles et niveau pour apparaître dans l'annuaire des skaters.", + spotsAdded: "Spots ajoutés", + shopsAdded: "Shops ajoutés", + noSpots: "Vous n'avez encore ajouté aucun spot", + noSpotsDesc: "Mettez votre spot local sur la carte →", + stash: "Stash", + gear: "Matériel", + crews: "Crews", + info: "Infos", + lightning: "Lightning", + silentPayment: "Paiement silencieux", + coordinator: "Coordinateur", + coordinatorAdded: "Coordinateur ajouté", + add: "Ajouter", + messagePrivately: "Message privé", + founder: "Fondateur", + member: "Membre", + supportSkater: "Soutenir ce skater", + supportSkaterDesc: "Envoyez un pourboire pour les remercier de leurs contributions" + }, + index: { + joinCommunity: "Rejoignez la communauté pour ajouter des spots, créer des événements et plus", + topZapped: "LES PLUS ZAPPÉS", + topZappedDesc: "Spots les plus soutenus ce mois-ci", + leaderboard: "Classement", + newHere: "NOUVEAU ICI ?", + newHereDesc: "Créez un compte gratuit pour ajouter des spots, rejoindre des événements, échanger avec des skaters et faire partie de la communauté. Aucun e-mail requis.", + followFounder: "Suivre le fondateur", + followFounderDesc: "Maintenez l'avatar appuyé pendant 3 secondes pour suivre et rester informé des nouvelles fonctionnalités et événements !", + createAccount: "Créer un compte", + accountWorks: "Votre compte fonctionne dans toutes les applications du réseau", + footerTagline: "Open Source • Géré par la communauté • Sans publicité" + }, + stash: { + title: "Mon Stash", + loginDesc: "Votre inventaire de matériel privé. Suivez ce que vous possédez, fixez des prix et partagez sélectivement avec des échangistes.", + encrypted: "Chiffré", + syncsEverywhere: "Synchronisé partout", + p2pTrading: "Échange P2P", + encryptionRequired: "Chiffrement requis", + encryptionRequiredDesc: "Votre Stash est chiffré pour la confidentialité. Veuillez utiliser un signataire prenant en charge le chiffrement NIP-44 (comme Alby, nos2x ou Amber).", + learnSigners: "En savoir plus sur les signataires", + select: "Sélectionner", + stash: "Stash", + wishlist: "Liste de souhaits", + allCategories: "Toutes les catégories", + sortNewest: "Plus récents", + sortValue: "Valeur", + sortCondition: "État", + sortAz: "A–Z", + friendsOnly: "Amis uniquement", + addToWishlist: "Ajouter à la liste de souhaits", + addItemToStash: "Ajouter un article au Stash", + addItem: "Ajouter un article", + editItem: "Modifier l'article", + publicStash: "Stash public", + listView: "Vue liste", + gridView: "Vue grille", + uploading: "Téléversement...", + addPhotos: "Ajouter des photos", + wishlistReqPlaceholder: "Exigences particulières...", + itemDescPlaceholder: "Décrivez l'article, tout dommage...", + itemsCount: "{{count}} article(s)", + wishlistEmpty: "Liste de souhaits vide", + wishlistEmptyDesc: "Ajoutez le matériel que vous recherchez — nous vous mettrons en relation avec les stashes de vos amis.", + stashEmpty: "Votre Stash est vide", + stashEmptyDesc: "Commencez à suivre votre matériel. Decks, trucks, chaussures — ajoutez-le une fois, accédez-y partout via Nostr.", + noMatch: "Aucun article ne correspond", + noMatchDesc: "Essayez d'ajuster vos filtres.", + backupTransfer: "Sauvegarde et transfert", + backupDesc: "Votre Stash est chiffré sur Nostr. Gardez une copie que vous contrôlez — un relay mort ou un nouveau compte ne peut pas perdre votre liste de matériel.", + exportTitle: "Sauvegarde chiffrée", + exportDialogDesc: "Enregistrez {{count}} article(s) dans un fichier. Chiffrez-le pour qu'un fichier divulgué ne soit pas une fuite.", + modePassword: "Mot de passe", + modeKey: "Ma clé", + password: "Mot de passe", + confirmPassword: "Confirmer le mot de passe", + passwordHint: "Utilisez au moins 8 caractères. Il n'y a pas de récupération — ne l'oubliez pas.", + keyModeHint: "Chiffré avec votre clé Nostr. Seule cette clé peut l'ouvrir — rien à mémoriser.", + exportPlaintext: "Exporter sans chiffrement", + pwTooShort: "Utilisez au moins 8 caractères.", + pwMismatch: "Les mots de passe ne correspondent pas.", + exportFailed: "Impossible de créer la sauvegarde.", + unlockTitle: "Déverrouiller la sauvegarde", + unlockDesc: "Cette sauvegarde est protégée par mot de passe.", + unlock: "Déverrouiller", + unlockFailed: "Impossible de déverrouiller la sauvegarde.", + show: "Afficher", + hide: "Masquer", + strength: "Force du mot de passe", + strengthWeak: "Faible", + strengthFair: "Moyen", + strengthGood: "Bon", + strengthStrong: "Fort", + filenameWillSave: "Sera enregistré sous {{name}}", + export: "Exporter", + import: "Importer", + exported: "Stash exporté", + exportedDesc: "{{count}} articles enregistrés dans un fichier.", + noItemsInFile: "Aucun article trouvé dans ce fichier.", + noValidItems: "Aucun article valide trouvé dans ce fichier.", + imported: "{{count}} articles importés", + importSkipped: "{{count}} ignorés (déjà dans votre Stash).", + importAdded: "Ajouté à votre Stash.", + importFailed: "Échec de l'import", + couldNotRead: "Impossible de lire ce fichier.", + updateFailed: "Impossible de mettre à jour votre Stash", + updatedCount: "{{count}} articles mis à jour", + markedForSale: "{{count}} marqués à vendre", + unmarkedCount: "{{count}} démarqués", + removedCount: "{{count}} articles supprimés", + selectedCount: "{{count}} sélectionnés", + selectAll: "Tout sélectionner", + visibilityPublic: "Public", + visibilityPrivate: "Privé", + forSale: "À vendre", + remove: "Retirer", + bulkDeleteTitle: "Retirer {{count}} articles ?", + bulkDeleteDesc: "Cela réécrit votre Stash chiffré en une seule signature et ne peut pas être annulé ici. Exportez d'abord une sauvegarde si vous n'êtes pas sûr.", + deleteTitle: "Retirer de votre Stash ?", + deleteDesc: "« {{title}} » sera retiré de votre Stash", + deleteDescPublic: " et déréférencé de votre vitrine publique", + deleteUndone: ". Cela ne peut pas être annulé.", + deleteDescGeneric: "Cet article sera retiré de votre Stash. Cela ne peut pas être annulé.", + listOnMarketplace: "Mettre en vente sur le Marketplace", + noPriceSet: "Aucun prix fixé", + categoryLabel: "Catégorie", + photosLabel: "Photos", + willingToSell: "Prêt à vendre", + willingToTrade: "Prêt à échanger", + whereIsThisItem: "Où se trouve cet article ?", + visibilityLabel: "Visibilité", + visibilityPrivateOnlyYou: "Privé - Vous uniquement", + visibilityFriendsMutual: "Amis - Abonnements mutuels", + visibilityPublicAnyone: "Public - Tout le monde", + visibilityFriends: "Amis", + brandLabel: "Marque", + sizeLabel: "Taille", + descriptionLabel: "Description", + conditionLabel: "État", + itemName: "Nom de l'article", + saveChanges: "Enregistrer les modifications", + listItemDialogTitle: "Mettre en vente « {{title}} »", + pickUpWhere: "Où les acheteurs peuvent-ils récupérer cet article ?", + linkToSpot: "Lier à un Spot de skate", + linkToSpotDesc: "Idéal pour les ventes locales • Apparaît sur la page du spot et la carte", + recommended: "Recommandé", + noSpecificSpot: "Aucun spot spécifique", + noSpecificSpotDesc: "Visible uniquement sur la page Marketplace", + tipLinkedSpots: "💡 Astuce : les annonces liées à des spots sont plus faciles à trouver pour les skaters locaux.", + anyoneCanSee: "Tout le monde peut les voir sur votre profil.", + seeWhatOthersSee: "Voir ce que les autres voient", + inventory: "Inventaire", + publicWantsNote: "Les envies publiques sont publiées sur le Marketplace comme annonces « recherché », pour que les vendeurs puissent vous trouver.", + howItWorks: "Comment ça marche", + tapToMarketplace: "Touchez pour aller au Marketplace →", + viewWishlist: "Voir la liste de souhaits", + tipEditItems: "Modifiez les articles avec le bouton stylo", + tipListForSale: "Mettez en vente avec le bouton boutique", + tipAddPhotos: "Ajoutez des photos pour de meilleures offres d'échange", + tipKeySyncs: "La clé Nostr se synchronise sur tous les appareils", + itemsReadyToSell: "{{count}} article(s) prêts à vendre" + } + } +}; export default frBatch4; diff --git a/src/i18n/fr/batch5.ts b/src/i18n/fr/batch5.ts index ba4cc0f..889ba1d 100644 --- a/src/i18n/fr/batch5.ts +++ b/src/i18n/fr/batch5.ts @@ -1,4 +1,1597 @@ -/** fr — batch 5. Filled by the translation pass; empty until then. */ -const frBatch5 = {}; +/** fr — batch 5. */ +const frBatch5 = { + labUi: { + activeCount: "{{count}} actifs", + addMusicProfile: "Ajouter un profil Musicien", + all: "Tout", + clearAll: "Tout effacer", + collective: "Collectif", + filters: "Filtres", + following: "Abonnements", + getRiderCard: "Obtenir la Rider Card", + judgeEvents: "Juger des événements", + justASkater: "Juste un", + labForServices: "The Lab, c'est pour les services. Parcourez et rejoignez toute la communauté des skateurs", + loginToOffer: "Connectez-vous pour proposer des services", + newest: "Plus récents", + noResults: "Aucun résultat", + offer: "Proposer", + offerBuilding: "Proposer de la construction", + offerCoaching: "Proposer du coaching", + offerCuts: "Proposer des coupes", + offerDesignArt: "Proposer du design / art", + offerEditing: "Proposer du montage", + offerFilming: "Proposer du tournage", + offerGraffiti: "Proposer du graffiti", + offerPhotography: "Proposer de la photographie", + offerServices: "Proposer des services", + yourProfiles: "Vos profils Lab", + preview: { + button: "Aperçu", + title: "Aperçu en direct", + desc: "Voici à quoi ressemblera votre profil {{noun}} une fois publié.", + untitled: "Votre nom", + noBio: "Pas encore de bio — ajoutez une ligne sur ce que vous proposez.", + years: "{{count}} ans d'expérience", + portfolio: "Portfolio", + note: "Aperçu uniquement — rien n'est encore publié.", + }, + draft: { + title: "Vous avez un brouillon non enregistré", + body: "Reprenez où vous en étiez — rien n'est publié tant que vous n'appuyez pas sur Publier.", + resume: "Reprendre le brouillon", + discard: "Supprimer le brouillon", + }, + progress: { + title: "Complétude du profil", + count: "{{done}} sur {{total}} terminés", + photo: "Photo", + bio: "Bio", + skills: "Compétences", + rate: "Tarif", + location: "Localisation", + contact: "Contact", + }, + wizard: { + identity: "Identité", + offer: "Ce que vous proposez", + rates: "Tarifs", + contact: "Contact", + media: "Médias", + }, + offerTattoo: "Proposer du tatouage", + offerTraining: "Proposer de l'entraînement / kiné", + organizeEvents: "Organiser des événements", + resultsMany: "{{count}} résultats", + resultsOne: "{{count}} résultat", + searchCityPlaceholder: "Ville…", + searchNamePlaceholder: "Nom, bio…", + showResults: "Afficher les résultats", + showResultsActive: "Afficher les résultats · {{count}} actifs", + skaterWord: "skateur", + sortBy: "Trier par", + theCrew: "The Crew", + topRated: "Les mieux notés", + trusted: "De confiance", + trustLevel: "Niveau de confiance", + yearsExp: "{{count}} ans d'exp.", + tabCoaches: "Coaches", + tabFilmers: "Filmers", + tabPhoto: "Photo", + tabEditors: "Editors", + tabBuilders: "Builders", + tabArtists: "Artistes", + tabGraffiti: "Graffiti", + tabTattoo: "Tatouage", + tabTrainers: "Entraîneurs", + tabMusic: "Musique", + tabJudges: "Juges", + tabOrganizers: "Organisateurs", + tabBarbers: "Barbiers", + filterSkillsToLearn: "Compétences à apprendre", + filterContentType: "Type de contenu", + filterEquipmentStyle: "Équipement et style", + filterServices: "Services", + filterCamera: "Caméra", + filterLenses: "Objectifs", + filterLighting: "Éclairage", + filterSupportRig: "Support et matériel", + filterStyle: "Style", + filterWhatTheyBuild: "Ce qu'ils construisent", + filterMaterialsTrade: "Matériaux et métier", + filterProjectScale: "Échelle du projet", + filterWhatTheyMake: "Ce qu'ils créent", + filterMedium: "Médium", + filterSoftwareTools: "Logiciels et outils", + filterWorkContext: "Contexte de travail", + filterMethod: "Méthode", + filterFocus: "Spécialité", + filterInjuriesTreated: "Blessures traitées", + filterCredentialsSetting: "Certifications et cadre", + filterGenre: "Genre", + filterInstrumentsRole: "Instruments et rôle", + filterEventFormats: "Formats d'événement", + filterSpecialty: "Spécialité", + filterLevelCircuit: "Niveau / circuit", + filterEventTypes: "Types d'événement", + filterWhatYouHandle: "Ce que vous gérez", + filterScale: "Échelle", + filterWhatTheyOffer: "Ce qu'ils proposent", + filterSignatureStyles: "Styles signature", + filterSetting: "Cadre", + filterEditType: "Type de montage", + role: { + coach: "Coach", + filmer: "Filmer", + builder: "Builder", + editor: "Editor", + photographer: "Photographer", + skater: "Skateur", + }, + empty: { + footer: "Des questions ? Consultez la FAQ →", + loginSuffix: "pour créer un profil.", + coachesTitle: "Aucun Coach pour l'instant", + coachesBody: "Soyez le premier à proposer du coaching de skate dans votre région.", + filmersTitle: "Aucun Filmer pour l'instant", + filmersBody: "Soyez le premier à proposer du tournage de skate — clips, parts complètes, couverture de contest et plus encore.", + photographersTitle: "Aucun Photographer pour l'instant", + photographersBody: "Soyez le premier à proposer de la photographie de skate dans votre région — clichés d'action, séquences, éditorial et plus encore.", + editorsTitle: "Aucun Editor pour l'instant", + editorsBody: "Soyez le premier à proposer des services de montage vidéo de skate.", + buildersTitle: "Aucun Builder pour l'instant", + buildersBody: "Soyez le premier à référencer votre construction de rampe, park ou DIY — béton, bois, rails et plus encore.", + artistsTitle: "Aucun artiste pour l'instant", + artistsBody: "Soyez le premier à proposer des graphismes de planches, logos, affiches et merch pour la scène.", + graffitiTitle: "Aucun graffeur pour l'instant", + graffitiBody: "Soyez le premier à proposer des pièces, fresques et œuvres de skatepark dans votre région.", + tattooTitle: "Aucun tatoueur pour l'instant", + tattooBody: "Soyez le premier tatoueur de la culture skate à vous référencer — flash, personnalisé, fine line et plus encore.", + trainersTitle: "Aucun entraîneur pour l'instant", + trainersBody: "Soyez le premier entraîneur ou kiné à aider les skateurs à devenir plus forts et à rester en bonne santé.", + musiciansTitle: "Aucun musicien pour l'instant", + musiciansBody: "Vous skatiez et faites de la musique ? Ajoutez votre groupe ou projet solo — genres, instruments et liens.", + judgesTitle: "Aucun juge pour l'instant", + judgesBody: "Vous organisez un contest équitable ? Référencez-vous pour juger des Game of S.K.A.T.E., best trick jams, contests et étapes de tournée.", + organizersTitle: "Aucun organisateur pour l'instant", + organizersBody: "Vous organisez des jams, contests, meetups ou démos ? Référencez-vous pour que les skateurs puissent vous trouver et vous engager.", + barbersTitle: "Aucun barbier pour l'instant", + barbersBody: "Vous coupez les cheveux des skateurs ? Référencez votre fauteuil ou service mobile pour que la scène puisse se faire rafraîchir la coupe.", + }, + become: { + addNip05: "Ajouter un NIP-05 dans les paramètres", + backToLab: "Retour à The Lab", + bioWorkLabel: "Bio / à propos de votre travail", + checkContact: "Vérifiez vos coordonnées", + cityArea: "Ville / zone", + cityCountry: "Ville, pays", + connectWallet: "Connecter le portefeuille", + connectWalletNwc: "Connecter le portefeuille avec NWC", + contactInfo: "Coordonnées", + contactInfoDesc: "Comment vos clients peuvent vous joindre (tout facultatif, mais recommandé)", + coordinatesOptional: "Coordonnées (facultatif)", + email: "E-mail", + failedToPublish: "Échec de la publication", + fromNostrProfile: "Depuis votre profil Nostr", + geolocationUnsupported: "Géolocalisation non prise en charge", + getting: "Récupération…", + headline: "Titre", + headlineHint: "Affiché comme titre sur votre carte Lab — ex. « {{example}} ». Par défaut, votre nom.", + imageUploaded: "Image importée", + instagram: "Instagram", + invalidEmail: "Saisissez une adresse e-mail valide.", + invalidPortfolio: "Saisissez une URL de portfolio valide.", + invalidWebsite: "Saisissez une URL de site web valide.", + latitude: "Latitude", + learnHow: "Comment faire", + locationError: "Erreur de localisation", + locationFound: "Localisation trouvée", + loginRequired: "Connexion requise", + loginRequiredDesc: "Vous devez vous connecter pour créer un profil {{role}}.", + loginRequiredDescCraft: "Vous devez vous connecter pour créer un profil {{noun}}.", + longitude: "Longitude", + nip05Recommended: "Vérification NIP-05 recommandée", + nip05RecommendedDesc: "Vérifiez votre identité pour instaurer la confiance avec vos clients.", + noWallet: "Aucun portefeuille connecté", + otherSocial: "Autres réseaux", + paymentSetup: "⚡ Configuration du paiement requise", + phoneNumber: "Numéro de téléphone", + profilePhoto: "Photo de profil", + profilePublished: "Votre profil a été publié.", + publishing: "Publication...", + socialMedia: "Réseaux sociaux", + tip: "💡 Astuce : la plupart des portefeuilles Lightning prennent en charge NWC (Alby, Minibits, Zeus, Coinos).", + tipWithTime: "💡 Astuce : la plupart des portefeuilles Lightning prennent en charge NWC (Alby, Minibits, Zeus, Coinos). Configuration en 30 secondes.", + upload: "Importer", + uploadFailed: "Échec de l'import", + uploadImage: "Importer une image", + uploading: "Importation…", + useCurrentLocation: "Utiliser la position actuelle", + useMyLocation: "Utiliser ma position", + usingNwc: "Utilisation de Nostr Wallet Connect", + usingWebln: "Utilisation de l'extension de navigateur WebLN", + walletConnected: "Portefeuille connecté — prêt à recevoir des paiements !", + website: "Site web", + yearsExperience: "Années d'expérience", + }, + coachForm: { + anonymous: "Coach anonyme", + bioLabel: "Bio / philosophie d'entraînement", + bioPlaceholder: "Votre parcours, votre style d'enseignement...", + create: "CRÉER LE PROFIL COACH", + created: "Profil Coach créé !", + createPro: "CRÉER LE PROFIL COACH PRO", + dmNote: "💬 Les élèves peuvent vous écrire directement via la messagerie chiffrée de SkateSpots", + heading: "Devenir Coach", + headlineExample: "Skate Coach Berlin", + hourlyRate: "Tarif horaire", + identity: "Votre identité de Coach", + nip05Reason: "Ajoutez un identifiant NIP-05 pour vérifier votre identité et instaurer la confiance avec vos élèves — cela leur montre que vous êtes un Coach légitime.", + paymentDesc: "Pour recevoir les paiements des leçons de vos élèves, vous devez connecter un portefeuille Lightning. Les élèves vous zap directement pour les sessions de coaching.", + profileDesc: "Parlez à vos élèves de votre expérience", + profileTitle: "Profil Coach", + ratePlaceholder: "5000 sats/h", + selectSkill: "Sélectionnez au moins une compétence.", + skillsLabel: "Compétences que j'enseigne * (sélectionnez-en au moins une)", + skillsRequired: "Compétences requises", + formatsLabel: "Formats de session", + formatsHint: "Comment vous dispensez le coaching.", + levelsLabel: "Niveaux enseignés", + agesLabel: "Tranches d'âge", + credentialsLabel: "Certifications et sécurité", + credentialsHint: "Déclaratif — SkateSpots ne les vérifie pas.", + languagesLabel: "Langues parlées", + languagesHint: "Ajoutez les langues dans lesquelles vous pouvez coacher.", + languagePlaceholder: "ex. anglais, espagnol", + availabilityLabel: "Disponibilités", + bookingLabel: "Lien de réservation", + bookingHint: "Facultatif — une page où les élèves peuvent réserver et payer.", + galleryLabel: "Photos du portfolio", + galleryHint: "Montrez de vraies sessions, élèves et Spots (jusqu'à 12).", + galleryAdd: "Ajouter des photos de portfolio", + galleryUploaded: "{{count}} photo(s) importée(s)", + videoLabel: "Bande démo", + videoHint: "Facultatif — une vidéo YouTube ou Instagram de votre coaching.", + formatOneOnOne: "En tête-à-tête", + formatGroup: "Groupe", + formatCamp: "Camp", + formatVideo: "Analyse vidéo", + formatContestPrep: "Préparation de contest", + formatParkLesson: "Leçon au park", + formatAdaptive: "Adapté", + formatGirls: "Session filles", + formatAfterSchool: "Après l'école", + levelBeginner: "Débutant", + levelIntermediate: "Intermédiaire", + levelAdvanced: "Avancé", + levelCompetition: "Compétition", + ageKids: "Enfants", + ageTeens: "Ados", + ageAdults: "Adultes", + ageSeniors: "Seniors", + certFirstAid: "Premiers secours", + certCpr: "RCP", + certSafeguarding: "Protection de l'enfance", + certBackgroundCheck: "Casier judiciaire", + certInsured: "Assuré", + certFederation: "Coach de fédération nationale", + certQualification: "Diplôme de coaching", + certJudge: "Juge de compétition", + certNoteLabel: "Autres certifications (facultatif)", + certNotePlaceholder: "ex. Brevet d'État, 8 ans de coaching…", + availWeekdays: "En semaine", + availWeekends: "Week-ends", + availEvenings: "Soirées", + availAfterSchool: "Après l'école", + availHolidays: "Vacances scolaires", + availSeasonal: "Saisonnier", + sectionWhatYouCoach: "Ce que vous coachez", + sectionCredentials: "Certifications et sécurité", + sectionAvailability: "Disponibilités et réservation", + sectionWhereYouCoach: "Où vous coachez", + sectionPortfolio: "Portfolio", + rateAmountLabel: "Tarif", + rateCurrencySats: "sats", + rateCurrencyUsd: "USD", + rateCurrencyEur: "EUR", + rateCurrencyGbp: "GBP", + perHour: "par heure", + perSession: "par session", + perHalfDay: "par demi-journée", + perDay: "par jour", + perCamp: "par camp", + perProject: "par projet", + perEvent: "par événement", + perGig: "par concert", + perShoot: "par shooting", + perPiece: "par pièce", + perCut: "par coupe", + perMonth: "par mois", + availByAppointment: "Sur rendez-vous", + rateNotesLabel: "Notes sur le tarif (facultatif)", + rateNotesPlaceholder: "Tarif dégressif, première session gratuite, déplacement inclus…", + sectionPayments: "Paiements", + paymentMethodsHint: "Comment vos clients peuvent vous payer. Il s'agit d'une déclaration — SkateSpots ne conserve jamais les fonds.", + payMethodCash: "Espèces sur place", + payMethodLightning: "Lightning", + payMethodCashu: "Cashu", + payMethodBank: "Virement bancaire", + payMethodOther: "Autre", + payWhatYouCanLabel: "Tarif dégressif / payez ce que vous pouvez", + bookingFeeLabel: "Frais de réservation (facultatif)", + bookingFeeHint: "De petits frais payés directement à vous pour confirmer une réservation. SkateSpots ne les conserve ni ne les rembourse.", + paymentNoteLabel: "Note de paiement (facultatif)", + paymentNotePlaceholder: "Première session gratuite, déplacement inclus, paiement après la session…", + spotsDesc: "Sélectionnez les Spots où vous proposez des sessions de coaching", + spotsLabel: "Spots où vous coachez", + tagline: "Partagez vos connaissances du skate", + update: "METTRE À JOUR LE PROFIL COACH", + updated: "Profil Coach mis à jour !", + }, + filmerForm: { + anonymous: "Filmer anonyme", + bioPlaceholder: "Votre parcours, style, matériel...", + camerasLabel: "Caméras et matériel * (sélectionnez-en au moins une)", + create: "CRÉER LE PROFIL FILMER", + created: "Profil Filmer créé !", + createPro: "CRÉER LE PROFIL FILMER PRO", + dmNote: "💬 Les clients peuvent vous écrire directement via la messagerie chiffrée de SkateSpots", + gearHelper: "Listez vos caméras, objectifs et rigs exacts — les skateurs s'intéressent au setup.", + gearLabel: "Contenu du sac (facultatif)", + gearPlaceholder: "ex. Sony VX1000 + fisheye MK1, Panasonic HVX200, gimbal DJI RS3, GoPro Hero 12, micro Sennheiser...", + heading: "Devenir Filmer", + headlineExample: "Skate Filmer Berlin", + identity: "Votre identité de Filmer", + nip05Reason: "Ajoutez un identifiant NIP-05 pour vérifier votre identité et instaurer la confiance avec vos clients — cela leur montre que vous êtes un Filmer légitime.", + paymentDesc: "Pour recevoir les paiements des clients pour vos services de tournage, vous devez connecter un portefeuille Lightning. Les clients vous zap directement pour votre travail.", + profileDesc: "Parlez à vos clients de votre expertise en tournage", + profileTitle: "Profil Filmer", + rate: "Tarif", + ratePlaceholder: "10000 sats/vidéo", + reelLabel: "Reel / portfolio", + selectService: "Sélectionnez au moins un service.", + selectSkill: "Sélectionnez au moins une compétence de tournage.", + servicesLabel: "Services proposés * (sélectionnez-en au moins un)", + servicesRequired: "Services requis", + skillsRequired: "Compétences requises", + spotsDesc: "Sélectionnez les Spots où vous proposez vos services de tournage", + spotsLabel: "Spots où vous filmez", + tagline: "Proposez votre tournage de vidéos de skate — clips, lignes, parts complètes et couverture de contest", + update: "METTRE À JOUR LE PROFIL FILMER", + updated: "Profil Filmer mis à jour !", + }, + editorForm: { + anonymous: "Editor anonyme", + bioPlaceholder: "Votre style de montage, parcours, projets notables…", + contactPortfolio: "Contact et portfolio", + create: "Publier le profil Editor", + created: "Profil Editor créé !", + createPro: "Publier le profil Editor Pro", + editTypes: "Types de montage proposés * (sélectionnez-en au moins un)", + hardware: "Matériel", + hardwarePlaceholder: "ex. MacBook Pro M3, Sony FX3", + heading: "Devenir Editor", + headlineExample: "Skate Editor", + identity: "Votre identité", + locationOptional: "Localisation (facultatif)", + loginDesc: "Connectez-vous pour créer votre profil d'Editor.", + phoneTelegram: "Téléphone / Telegram", + portfolioPlaceholder: "Portfolio (Vimeo, YouTube…)", + profileDesc: "Parlez à la communauté de votre style de montage et de vos compétences", + profileTitle: "Profil Editor", + published: "Votre profil a été publié sur SkateSpots.", + rate: "Tarif / prix", + ratePlaceholder: "ex. 50k sats/min, DM pour un devis", + selectService: "Sélectionnez au moins un type de montage.", + servicesRequired: "Services requis", + socialPlaceholder: "Identifiant Instagram / réseaux", + software: "Logiciels", + softwareHardware: "Compétences logiciels et matériel", + softwarePlaceholder: "ex. DaVinci Resolve, Premiere", + tagline: "Proposez vos services de montage vidéo à la communauté du skate", + thumbnail: "Miniature de profil / showreel", + update: "Mettre à jour le profil Editor", + updated: "Profil Editor mis à jour !", + walletConnected: "Portefeuille connecté ✓", + walletDesc: "Recevez des paiements Bitcoin ⚡ directement de vos clients pour votre travail de montage.", + walletTitle: "⚡ Portefeuille Lightning pour les paiements", + yearsExperience: "Années d'expérience", + yearsPlaceholder: "ex. 5 ans", + }, + photoForm: { + anonymous: "Photographer anonyme", + bioPlaceholder: "Votre parcours, style, ce que vous aimez shooter...", + cameraLabel: "Boîtiers * (sélectionnez-en au moins un)", + cameraRequired: "Caméra requise", + contactDesc: "Comment les riders peuvent voir votre travail et vous joindre (tout facultatif, mais recommandé)", + create: "CRÉER LE PROFIL PHOTOGRAPHER", + created: "Profil Photographer créé !", + createPro: "CRÉER LE PROFIL PHOTOGRAPHER PRO", + dmNote: "💬 Les riders peuvent vous écrire directement via la messagerie chiffrée de SkateSpots", + gearHelper: "Listez les boîtiers, objectifs et lumières exacts — les riders adorent connaître le setup.", + gearPlaceholder: "ex. Canon R6 II, fisheye 8-15 mm, 70-200 mm f/2.8, 2× Godox AD200, déclencheurs radio, trépied Manfrotto...", + heading: "Devenir Photographer", + headlineExample: "Photographie skate", + identity: "Votre identité de Photographer", + lensesLabel: "Objectifs", + lightingLabel: "Matériel d'éclairage", + nip05Reason: "Ajoutez un identifiant NIP-05 pour vérifier votre identité et instaurer la confiance avec vos clients.", + paymentDesc: "Pour être payé pour vos shootings, connectez un portefeuille Lightning. Les clients vous zap directement pour votre travail.", + portfolioLabel: "Portfolio / Instagram", + profileDesc: "Parlez aux riders de votre œil, de votre matériel et de vos services", + profileTitle: "Profil Photographer", + ratePlaceholder: "20000 sats/shooting", + selectCamera: "Sélectionnez au moins un type de caméra avec lequel vous shootez.", + selectService: "Sélectionnez au moins un service que vous proposez.", + servicesLabel: "Services proposés * (sélectionnez-en au moins un)", + servicesRequired: "Services requis", + spotsDesc: "Sélectionnez les Spots où vous proposez de la photographie", + spotsLabel: "Spots où vous shootez", + styleLabel: "Style de shooting", + supportLabel: "Support et matériel", + tagline: "Shootez les sessions — proposez votre photographie de skate", + update: "METTRE À JOUR LE PROFIL PHOTOGRAPHER", + updated: "Profil Photographer mis à jour !", + }, + builderForm: { + anonymous: "Builder anonyme", + bioLabel: "Bio / à propos de vos constructions", + bioPlaceholder: "Votre Crew, constructions notables, votre approche d'un projet...", + buildTypesLabel: "Ce que vous construisez * (sélectionnez-en au moins un)", + buildTypesRequired: "Types de construction requis", + cityBase: "Ville / base", + contactPortfolio: "Contact et portfolio", + contactPortfolioDesc: "Comment la scène peut voir vos constructions et vous joindre (tout facultatif, mais recommandé)", + create: "CRÉER LE PROFIL BUILDER", + created: "Profil Builder créé !", + createPro: "CRÉER LE PROFIL BUILDER PRO", + dmNote: "💬 Les clients peuvent vous écrire directement via la messagerie chiffrée de SkateSpots", + gearHelper: "Les Crews et les clients aiment connaître votre matériel et votre méthode.", + gearLabel: "Votre méthode / équipement (facultatif)", + gearPlaceholder: "ex. Équipe béton complète, bétonnière + lance à béton, soudure mobile, permis et drainage gérés...", + heading: "Devenir Builder", + headlineExample: "Builder rampes et parks", + identity: "Votre identité de Builder", + insured: "Licence / assurance", + insuredHelper: "Utile pour les parks publics et les marchés publics", + logoPhoto: "Logo / photo", + materialsLabel: "Matériaux et compétences métier", + nip05Reason: "Ajoutez un identifiant NIP-05 pour vérifier votre identité et instaurer la confiance avec vos clients.", + pastBuilds: "Constructions passées / Instagram", + paymentDesc: "Pour être payé pour vos constructions, connectez un portefeuille Lightning. Les clients vous zap directement pour votre travail.", + profileDesc: "Dites à la scène ce que vous construisez et comment vous travaillez", + profileTitle: "Profil Builder", + rateLabel: "Tarif / base de devis", + ratePlaceholder: "au m² / par projet", + scaleLabel: "Échelle du projet", + selectBuild: "Sélectionnez au moins une chose que vous construisez.", + serviceArea: "Zone d'intervention", + serviceAreaPlaceholder: "ex. Catalogne, déplacements dans toute l'UE", + spotsDesc: "Reliez les Spots et parks que vous avez construits pour que les gens voient votre travail sur la carte", + spotsLabel: "Spots que vous avez construits", + tagline: "Coulez, soudez, construisez — listez votre activité de rampes et parks", + update: "METTRE À JOUR LE PROFIL BUILDER", + updated: "Profil Builder mis à jour !", + yearsBuilding: "Années de construction", + }, + skaterForm: { + backToSkaters: "Retour aux skateurs", + bioHelperPulled: "Récupérée de votre profil — adaptez-la pour votre carte de skateur, ou laissez-la telle quelle.", + bioHelperShort: "Une courte intro pour votre carte de skateur.", + bioPlaceholder: "Depuis combien de temps vous skatiez, ce qui vous plaît, sur quoi vous travaillez…", + browseSpots: "Parcourir les Spots", + changePhoto: "Changer la photo de profil", + chipBio: "Bio", + chipPhoto: "Photo", + cityArea: "Ville / zone", + created: "Vous êtes sur la carte ! 🛹", + custom: "Personnalisé", + customHelper: "Votre propre libellé — affiché sur votre carte de skateur au lieu d'un préréglage.", + customPlaceholder: "ex. OG, Week-end Warrior, Retraité…", + discoverable: "Les autres skateurs peuvent maintenant vous découvrir.", + editFullProfile: "modifier votre profil complet", + fromProfile: "Depuis votre profil", + heroEditPrefix: "Modifier votre", + heroJoinPrefix: "Rejoindre le", + heroSuffix: "annuaire", + homeHelper: "Saisissez-le librement, ou reliez un vrai Spot depuis la carte pour que les gens puissent s'y rendre.", + homePlaceholder: "Park / place local — ou appuyez sur « Parcourir les Spots »", + homeSpot: "Spot favori", + layerEnd: "pour les modifier partout.", + layerIntro: "Ceci est votre", + layerMid: ", construit sur votre profil Nostr. Votre nom, photo, bio, Lightning et vérification viennent de là —", + layerWord: "couche skate", + level: "Niveau", + linked: "Relié à un Spot sur la carte", + loadingProfile: "Chargement de votre profil…", + loadingSpots: "Chargement des Spots…", + locationHelper: "Aide les autres à trouver des skateurs près d'eux. Seule une zone approximative est partagée.", + loginToJoin: "Connectez-vous pour rejoindre", + loginToJoinDesc: "Créez votre profil de skateur pour que la communauté puisse vous trouver.", + mappedSpot: "Spot cartographié", + noSpots: "Aucun Spot trouvé pour l'instant.", + noSpotsMatch: "Aucun Spot ne correspond à votre recherche.", + openMap: "Ouvrir la carte", + pickEverything: "Choisissez tout ce qui correspond à votre style.", + pickHomeSpot: "Choisissez votre Spot favori", + pickStyles: "Choisissez vos styles", + pickStylesDesc: "Choisissez au moins une chose que vous skatez.", + profilePic: "Photo de profil", + profilePicHelper: "Votre carte de skateur utilise votre photo de profil Nostr — la même image partout.", + publishingAs: "Publication en tant que", + putOnMap: "Mettre sur la carte", + searchSpots: "Rechercher des Spots par nom ou ville…", + skateStory: "Votre histoire de skate", + stance: "Stance", + unlinkSpot: "Dissocier le Spot", + updateButton: "Mettre à jour mon profil", + updated: "Profil mis à jour !", + whatYouSkate: "Ce que vous skatez *", + yearsPlaceholder: "ex. 8", + yearsSkating: "Années de skate", + yourProfilePic: "Votre photo de profil", + zapsOn: "Zaps activés", + }, + skaters: { + clearSearch: "Effacer la recherche", + community: "La communauté", + countMany: "skateurs", + countOne: "skateur", + editProfile: "Modifier mon profil de skateur", + heroDesc: "Trouvez votre tribu. Parcourez la Crew de skateurs qui représente SkateSpots — par style, stance, niveau et ville.", + nip05Verified: "Vérifié NIP-05", + noMatches: "Aucun résultat", + noneDesc: "Soyez le premier à rejoindre l'annuaire et à mettre SkateSpots sur la carte.", + noneTitle: "Aucun skateur pour l'instant", + noVerifiedMatch: "Aucun skateur vérifié ne correspond", + searchPlaceholder: "Rechercher par nom, ville ou npub…", + tryDifferentSearch: "Essayez une autre recherche ou effacez vos filtres.", + tryTurnOffVerified: "Essayez de désactiver le filtre « Vérifié » pour voir tout le monde.", + verifiedFilterTitle: "Afficher uniquement les skateurs avec une identité NIP-05 vérifiée", + }, + skaterCard: { + inDirectory: "Vous êtes dans l'annuaire des skateurs", + joinDesc: "Ajoutez votre stance, styles et niveau pour que les skateurs puissent vous trouver.", + joinTitle: "Rejoindre l'annuaire des skateurs", + }, + crewsStrip: { + allCrews: "Toutes les Crews", + memberMany: "{{count}} membres", + memberOne: "{{count}} membre", + title: "Crews de cette scène", + }, + labLink: { + coach: "Coach", + filmer: "Filmer", + editor: "Editor", + photographer: "Photographer", + builder: "Builder", + artist: "Artiste", + graffiti: "Graffiti", + tattoo: "Tatouage", + trainer: "Entraîneur", + musician: "Musicien", + judge: "Juge", + barber: "Barbier", + organizer: "Organisateur", + lab: "Lab", + linkedProfiles: "Profils Lab liés", + desc: "Vous dirigez aussi un studio, du coaching ou une activité de construction ? Liez vos fiches Lab pour que les gens puissent engager votre Crew. Facultatif. Lorsque le profil Lab renvoie aussi à cette Crew, les deux affichent un", + descEnd: "badge vert.", + empty: "Vous n'avez encore aucun profil Lab. Créez-en un dans The Lab pour le lier ici.", + }, + proUpgrade: { + goPro: "Passer Pro", + optional: "· facultatif", + freeTo: "Inscription gratuite. Pro ajoute un", + proBadge: "badge Pro", + featuredPlacement: "placement en vedette", + atTop: "en haut de The Lab.", + active: "Actif", + benefit1: "Badge « Pro » doré sur votre profil et vos cartes", + benefit2: "Mis en avant en premier quand les skateurs parcourent The Lab", + benefit3: "Soutient SkateSpots — sans pub, sans intermédiaires", + platformOwner: "Propriétaire de la plateforme — Pro est toujours actif.", + proActiveOne: "Pro actif · {{count}} jour restant. Votre profil sera mis en avant.", + proActiveMany: "Pro actif · {{count}} jours restants. Votre profil sera mis en avant.", + context: "Votre profil reste en ligne gratuitement après l'expiration de Pro — vous perdez seulement le badge et le boost.", + }, + profilePreview: { + viewPublic: "Voir le profil public", + unnamed: "Skateur sans nom", + noHandle: "Pas encore d'identifiant", + }, + pyramid: { + pyramidWord: "PYRAMIDE", + rankingsWord: "CLASSEMENTS", + subtitle: "Meilleurs contributeurs de votre ville", + yourRank: "Votre rang", + keepContributing: "Continuez à contribuer pour grimper !", + topContributors: "Meilleurs contributeurs", + noContributors: "Aucun contributeur pour l'instant. Soyez le premier à ajouter un Spot ou à créer un événement !", + spots: "Spots", + events: "Événements", + total: "Total", + trust: "Confiance", + }, + detail: { + joined: "Inscrit", + about: "À propos", + howWeWork: "Notre méthode", + inTheBag: "Dans le sac", + hardware: "Matériel", + software: "Logiciels", + eventsJudged: "Événements jugés", + eventsOrganized: "Événements organisés", + spots: "Spots", + viewSpot: "Voir le Spot", + credentialsTitle: "Certifications et sécurité", + selfAttested: "Déclaré par le Coach — non vérifié par SkateSpots.", + formats: "Formats", + levels: "Niveaux", + ages: "Âges", + languages: "Langues", + availability: "Disponibilités", + bookSession: "Réserver une session", + portfolio: "Portfolio", + watchReel: "Regarder sur {{platform}}", + paymentsTitle: "Paiements", + payWhatYouCan: "Payez ce que vous pouvez", + bookingFee: "Frais de réservation", + payBookingFee: "Payer les frais de réservation", + bookingFeeNote: "Payés directement au Coach. SkateSpots ne les conserve ni ne les rembourse.", + bookingFeeNoRail: "Ce Coach n'a pas d'adresse Lightning configurée, le paiement dans l'app n'est donc pas disponible — contactez-le pour convenir du paiement.", + serviceArea: "Zone d'intervention", + licensedInsured: "Licence / assurance", + studio: "Studio", + shopStudio: "Boutique / studio", + booksOpen: "Réservations ouvertes", + credentials: "Certifications", + remoteOnline: "À distance / en ligne possible", + graffitiCrew: "Crew de graffiti", + act: "Action", + listen: "Écouter", + upcomingGigs: "Concerts à venir", + past: "Passés", + experience: "Expérience", + yearsCount: "{{count}} ans", + rate: "Tarif", + contact: "Contact", + sendMessage: "Envoyer un message", + bookGig: "Réserver pour un concert", + portfolioDomain: "Portfolio · {{domain}}", + manage: "Gérer", + admin: "Admin", + editProfile: "Modifier le profil", + publishedTitle: "Vous êtes en ligne", + publishedBody: "Votre profil est publié dans The Lab. Partagez-le pour que les skateurs puissent vous trouver.", + manageRemove: "Retirer votre profil {{noun}} de The Lab.", + adminTakeDown: "Retirer ce profil {{noun}}. Il sera masqué dans tout SkateSpots.", + entityLabel: "Profil {{noun}}", + deleteProfile: "Supprimer le profil", + location: "Localisation", + servicesSkills: "Services et compétences", + noun: { + coach: "Coach", + filmer: "Filmer", + editor: "Editor", + photographer: "Photographer", + builder: "Builder", + artist: "artiste", + graffiti: "graffeur", + tattoo: "tatoueur", + trainer: "entraîneur", + musician: "musicien", + judge: "juge d'événement", + organizer: "organisateur d'événement", + barber: "barbier", + profile: "profil", + }, + skillsTitle: { + skills: "Compétences", + servicesGear: "Services et matériel", + whatWeBuild: "Ce que nous construisons", + whatTheyMake: "Ce qu'ils créent", + stylesWork: "Styles et travail", + styles: "Styles", + focusSpecialties: "Spécialités", + genresInstruments: "Genres et instruments", + formatsSpecialties: "Formats et spécialités", + servicesStyles: "Services et styles", + eventTypesServices: "Types d'événement et services", + }, + }, + rider: { + heroDesc: "Votre identité de skateur vérifiable. Signée par Nostr, prête à imprimer, impossible à falsifier.", + heroDesc2: "Gagnez des badges de compétence attestés par d'autres skateurs. Obtenez des passes d'accès aux parks. Partagez votre carte partout.", + headerTagline: "Signée Nostr · prête à imprimer · vérifiée par QR", + tabCard: "Ma carte", + tabBadges: "Badges", + tabAward: "Décerner", + rendering: "Rendu…", + shareCard: "Partager la carte", + savePng: "Enregistrer en PNG", + print: "Imprimer", + copyId: "Copier l'ID", + cardType: "Type de carte", + licenseLabel: "Licence de skateur", + licenseSub: "Votre identité personnelle de rider", + parkLabel: "Accès au park", + parkSub: "Émettre des passes en tant que propriétaire de park", + theme: "Thème", + holoTitle: "Reflet holographique", + holoDesc: "Effet de feuille animée", + cardDetails: "Détails de la carte", + skateStyle: "Style de skate", + ridesFor: "Ride pour", + ridesForPlaceholder: "Boutique locale…", + sponsors: "Sponsors", + sponsorsPlaceholder: "Marques…", + showOnCard: "Afficher sur la carte", + zaps: "Zaps ⚡", + skills: "Compétences", + selected: "{{count}}/6 sélectionnés", + goldBadgesHint1: "Les badges dorés sur votre carte viennent d'autres skateurs qui vous ont vu — voir les", + goldBadgesHint2: ".", + parkOwnersOnly: "Propriétaires de park uniquement.", + parkOwnersDesc: "Émettez ceci avec la même clé Nostr qui a publié votre fiche de park. N'importe qui peut scanner le QR et vérifier la signature on-chain — aucune autorité centrale nécessaire.", + parkDetails: "Détails du park", + parkName: "Nom du park", + parkNamePlaceholder: "The Berrics…", + riderName: "Nom du rider", + riderNamePlaceholder: "Nom sur la carte", + riderNpub: "ID Nostr du rider (npub)", + accessLevel: "Niveau d'accès", + validThru: "Valable jusqu'au", + publishToNostr: "Publier sur Nostr", + badgesIntro: "Ces badges ont été attestés et signés par d'autres skateurs sur Nostr. Ils apparaissent comme jetons ⭐ dorés sur votre carte.", + earnMore: "Vous en voulez plus ? Skatiez devant quelqu'un et demandez-lui d'attester votre trick.", + awardSomeone: "Décerner un badge à quelqu'un d'autre", + youSawIt: "Vous l'avez vu", + youSawItDesc: "Signez la preuve sur Nostr. Elle fait partie de son dossier permanent — liée cryptographiquement à votre clé.", + skillsWitnessed: "Compétences que vous avez vues", + whereSeen: "Où l'avez-vous vu ?", + optional: "(facultatif)", + signingOnNostr: "Signature sur Nostr…", + awardBadge: "Décerner le badge", + addRiderSkill: "Ajoutez le npub du rider + au moins une compétence", + invalidNpub: "npub invalide", + badgeAwarded: "🏅 Badge décerné !", + badgeSent: "{{skills}} envoyés.", + failed: "Échec", + couldNotRender: "Impossible de générer la carte", + popupBlocked: "Popup bloquée", + popupBlockedDesc: "Autorisez les popups pour ce site.", + linkCopied: "🔗 Lien copié !", + enterRiderNpub: "Saisissez le npub du rider", + parkPublished: "✅ Carte d'accès au park publiée !", + publishFailed: "Échec de la publication", + noBadges: "Aucun badge pour l'instant. Skatiez devant quelqu'un et demandez-lui d'attester vos tricks !", + showMore: "Afficher {{count}} de plus", + witnessedBy: "Attesté par", + at: "à", + previewLicense: "Licence de skateur", + previewSince: "Depuis {{year}}", + previewEvts: "Évts", + previewScan: "Scannez pour vérifier", + previewSkatepark: "Skatepark", + previewAccessPass: "Passe d'accès", + previewMemberName: "Nom du membre", + previewIssuedBy: "Émis par le propriétaire du park · signé Nostr", + previewValidThru: "Valable jusqu'au", + previewNostrVerified: "Vérifié Nostr", + }, + craftFields: { + detailsTitle: "Détails supplémentaires", + deliverables: "Livrables", + turnaround: "Délai", + surfaces: "Surfaces / murs", + maxSize: "Taille max", + setLength: "Durée du set", + techRider: "Tech rider", + travel: "Déplacement", + certifications: "Certifications", + insurance: "Assurance", + permits: "Permis", + deposit: "Acompte", + minimum: "Minimum", + modalities: "Modalités", + duration: "Durée du rendez-vous", + drone: "Drone", + leadTime: "Délai de préparation", + warranty: "Garantie", + }, + craftForm: { + profileImage: "Image de profil", + nameHeadline: "Nom / titre", + about: "À propos", + aboutPlaceholder: "Parlez aux skateurs de votre travail de {{noun}}…", + required: "requis", + nip05Title: "Ajoutez un NIP-05 pour instaurer la confiance", + nip05Desc: "Un identifiant NIP-05 aide les skateurs à vérifier que vous êtes légitime. Fortement recommandé avant de publier.", + editingNote: "Vous modifiez votre profil {{noun}} existant — publier le remplacera.", + location: "Localisation", + pinned: "📍 Épinglé sur la carte ({{lat}}, {{lng}})", + experienceYears: "Expérience (années)", + expPlaceholder: "ex. 5", + ratePlaceholder: "ex. 20k sats / par projet", + contactLinks: "Contact et liens", + phoneOptional: "Téléphone (facultatif)", + emailOptional: "E-mail (facultatif)", + socialPlaceholder: "Réseaux (Instagram, etc.)", + gettingPaid: "Se faire payer", + updateProfile: "Mettre à jour le profil", + publishProfile: "Publier le profil", + rateLeftBlankNote: "Facultatif — laissez vide si le tarif ci-dessus suffit.", + sectionRequired: "{{section}} requis", + sectionRequiredDesc: "Sélectionnez au moins une option dans « {{section}} ».", + updated: "Profil mis à jour !", + created: "Profil créé !", + headlineExample: "Skate Coach Berlin", + }, + }, + socialUi: { + agentPanel: { + spot: "Spot", + event: "Événement", + labPro: "Lab pro", + gear: "Matériel", + crew: "Crew", + description: "Connaît cette Crew — ses jams, son effectif et son appel à rejoindre — ainsi que la scène plus large avec des données en direct.", + greeting: "Yo ! Je suis Sasquatch, le guide de {{crew}}. Posez-moi des questions sur la Crew — notre prochaine jam, qui la gère, ce que nous cherchons — ou sur la scène plus large.", + suggestion1: "C'est quoi notre prochaine jam ?", + suggestion2: "Qui gère cette Crew ?", + suggestion3: "Qu'est-ce qu'on recherche ?", + suggestion4: "Les meilleurs Spots près de nous ?", + suggestion5: "Quel temps pour skater ?", + thinking: "Sasquatch réfléchit…", + placeholder: "Posez une question sur votre scène locale…", + disclaimer: "L'IA peut se tromper — les liens mènent à de vraies annonces.", + }, + badge: { + upcomingOne: "{{count}} événement à venir", + upcomingMany: "{{count}} événements à venir", + comingOne: "{{count}} événement arrive", + comingMany: "{{count}} événements arrivent", + }, + bell: { + youAreIn: "Vous êtes dans {{crew}} ! 🛹", + membershipConfirmed: "Adhésion confirmée.", + couldNotConfirm: "Confirmation impossible", + addedYouTo: "vous a ajouté à", + confirmToAppear: "Confirmez pour apparaître comme membre.", + notifications: "Notifications", + notificationsNew: "Notifications ({{count}} nouvelles)", + unreadCount: "{{count}} notifications non lues", + markRead: "Marquer comme lu", + allClear: "Tout est clair", + tabAll: "Tout", + tabTrades: "Échanges", + tabSocial: "Social", + tabNews: "Actus", + tabCrews: "Crews", + checkingUpdates: "Recherche de mises à jour…", + checkingTrades: "Vérification des offres et échanges…", + loadingDrops: "Chargement des dernières sorties…", + emptyAll: "Offres, échanges, Zaps, réponses, sorties de newsletter et activité des Crews apparaîtront ici.", + emptyTrades: "Offres, contre-offres et confirmations d'échange arrivent toutes ici — que vous vendiez, achetiez ou échangiez.", + emptySocial: "Zaps, réactions, reposts, mentions, réponses, RSVP d'événements et mises à jour des hôtes arrivent ici.", + emptyNews: "Les sorties de la newsletter SkateSpots arriveront ici. Abonnez-vous sur la page Newsletter.", + emptyCrews: "Invitations de Crew, demandes de collectif et demandes d'adhésion apparaîtront ici.", + subscribeBanner: "Abonnez-vous pour recevoir les nouvelles sorties dans votre cloche", + read: "Lu", + allCaughtUp: "Vous êtes à jour", + }, + chat: { + hidden: "Masqué", + hideMessageAria: "Masquer ce message", + hideMessageTitle: "Masquer le message (admin)", + messageHidden: "Message masqué", + messageHiddenDesc: "Masqué du chat de la Crew pour tout le monde.", + messageHideFailed: "Échec du masquage du message", + encryptionUnavailable: "Chiffrement indisponible", + encryptionUnavailableDesc: "Votre signataire ne prend pas en charge le chiffrement NIP-44. Veuillez mettre à jour votre extension.", + messageFailed: "Échec du message", + couldNotSend: "Impossible d'envoyer le message.", + noOneToMessage: "Personne à qui écrire pour l'instant", + noOneToMessageDesc: "Cette Crew n'a pas d'autres membres avec qui discuter.", + subject: "Chat de la Crew {{crew}}", + title: "Chat de Crew", + cordnBadgeTitle: "Acheminé via le coordinateur Cordn de cette Crew à travers ContextVM. Chiffré de bout en bout.", + private: "Privé", + privateBadgeTitle: "Chiffré de bout en bout — seuls les membres de la Crew peuvent lire ces messages.", + encryptedCordn: "Chiffré et acheminé via le coordinateur de la Crew (Cordn) — aucun message ne touche les relais publics.", + encryptedNip17: "Chat de groupe chiffré pour le fondateur et tous les membres listés de la Crew.", + moderatorNote: " Vous pouvez masquer des messages de la Crew en tant que modérateur.", + loginToSee: "Connectez-vous pour voir si vous pouvez rejoindre le chat de la Crew.", + membersOnly: "Ce chat est privé aux membres de la Crew. Demandez au fondateur de vous ajouter à la Crew pour rejoindre la conversation.", + noMessages: "Aucun message pour l'instant. Lancez le chat de la Crew — planifiez une session, partagez un Spot, chauffez un clip.", + newMessages: "Nouveaux messages", + new: "Nouveau", + placeholder: "Écrivez à votre Crew…", + sendAria: "Envoyer le message", + }, + collectiveJoinRequest: { + addedTitle: "{{name}} ajouté à {{collective}} 🛹", + addedDesc: "Il/elle confirmera de son côté pour apparaître comme membre vérifié.", + couldNotAdd: "Impossible d'ajouter le membre", + couldNotDismiss: "Impossible d'ignorer", + addedDone: "Ajouté", + addedTo: "à", + dismissedDone: "Demande de {{name}} ignorée", + wantsToJoin: "veut rejoindre", + alreadyOnRoster: "Déjà dans l'effectif", + openCollective: "Ouvrir le collectif", + dismiss: "Ignorer", + addToCollective: "Ajouter au collectif", + }, + collectiveMembers: { + confirmed: "Confirmé", + pending: "En attente", + pendingTooltip: "Listé par le collectif — en attente de la confirmation de ce membre.", + crewOnly: "Crew uniquement", + crewOnlyTooltip: "Ce membre a choisi d'être visible uniquement pour ses camarades de Crew. Vous pouvez le voir car vous êtes dans la Crew.", + hiddenMember: "Membre masqué", + title: "Membres", + verifiedOf: "{{confirmed}} sur {{total}} vérifiés — chaque membre confirmé a signé avec sa propre clé Nostr.", + verifiedPerMember: "L'adhésion est vérifiée par membre. Chaque membre confirme avec sa propre clé Nostr.", + adminsOne: "{{count}} admin aide à gérer la Crew.", + adminsMany: "{{count}} admins aident à gérer la Crew.", + }, + confirmMembership: { + public: "Public", + crewOnly: "Crew uniquement", + confirmedTitle: "Adhésion confirmée !", + confirmedCrew: "Vous êtes vérifié dans {{name}} — visible uniquement par vos camarades de Crew.", + confirmedPublic: "Vous apparaissez maintenant comme membre vérifié de {{name}}.", + failed: "Échec de la confirmation", + addedTo: "Vous avez été ajouté à {{name}}", + addedDesc: "Confirmez votre adhésion pour qu'elle apparaisse comme vérifiée sur votre profil et le leur.", + yourVisibility: "Votre visibilité", + confirming: "Confirmation…", + confirmButton: "Confirmer l'adhésion", + }, + contacts: { + message: "Message", + removePrivate: "Retirer des contacts privés", + savePrivate: "Enregistrer dans les contacts privés", + seoTitle: "Contacts - SkateSpots", + seoDescription: "Votre scène — camarades de Crew, personnes que vous suivez et conversations récentes, avec des contacts privés chiffrés.", + encryptionUnavailableDesc: "Votre signataire ne prend pas en charge le chiffrement NIP-44.", + removed: "Retiré des contacts privés", + saved: "Enregistré dans les contacts privés", + savedDesc: "Vous seul pouvez voir cette liste.", + updateFailed: "Impossible de mettre à jour les contacts", + loginTitle: "Votre scène, au même endroit", + loginDesc: "Connectez-vous pour voir vos camarades de Crew, les personnes que vous suivez et vos conversations récentes — et tenir une liste de contacts privée et chiffrée.", + title: "Contacts", + subtitle: "Votre scène — camarades de Crew, abonnements et conversations", + filterPlaceholder: "Filtrer par npub…", + tabCrew: "Crew", + tabFollows: "Abonnements", + tabDms: "DM", + tabSaved: "Enregistrés", + emptyCrewmates: "Aucun camarade de Crew pour l'instant. Rejoignez ou créez une Crew pour bâtir votre réseau.", + emptyFollowing: "Vous ne suivez encore personne.", + emptyDms: "Aucune conversation pour l'instant. Écrivez à un skateur pour en démarrer une.", + savedHint: "Cette liste est chiffrée avec votre clé — vous seul pouvez la lire. Appuyez sur l'étoile de quelqu'un pour l'ajouter.", + emptySaved: "Aucun contact enregistré pour l'instant. Ajoutez des personnes depuis n'importe quel onglet pour bâtir votre carnet d'adresses privé.", + }, + conversation: { + unknown: "Inconnu", + seoTitle: "Chat avec {{name}} - SkateSpots", + seoDescription: "Conversation privée chiffrée", + sendFailed: "Échec de l'envoi du message", + sendFailedDesc: "Veuillez réessayer dans un instant.", + tradeConfirmed: "Échange confirmé", + tradeConfirmedDesc: "Réputation mise à jour pour vous deux.", + tradeConfirmFailed: "Impossible de confirmer l'échange", + somethingWrong: "Un problème est survenu.", + soldNote: "Vendu à {{name}}.", + saleConfirmed: "Vente confirmée", + saleConfirmedDesc: "{{name}} peut maintenant confirmer de son côté.", + saleConfirmFailed: "Impossible de confirmer la vente", + escrowRedeemed: "Séquestre libéré", + escrowRedeemedDesc: "Les fonds sont maintenant dans votre portefeuille Cashu.", + escrowRedeemFailed: "Impossible de libérer le séquestre", + loginTitle: "Connectez-vous pour voir les messages", + secureLoginTitle: "Connexion sécurisée requise", + secureLoginDesc: "Les messages nécessitent une application de signature sécurisée.", + encrypted: "Chiffré", + refresh: "Actualiser", + didCompleteTrade: "Avez-vous finalisé cet échange ?", + recordedSale: "{{name}} a enregistré la vente. Confirmez pour mettre à jour la réputation de vous deux.", + confirm: "Confirmer", + confirmSale: "Confirmer cette vente ?", + askedToRecord: "{{name}} vous a demandé de l'enregistrer. Confirmer renforce la réputation de vous deux.", + confirmSaleButton: "Confirmer la vente", + redeemEscrow: "Libérer le séquestre", + escrowAppOnly: "Le séquestre Cashu est réservé à l'app — ouvrez SkateSpots sur votre téléphone pour le libérer.", + startThread: "Envoyez un message pour démarrer la conversation", + placeholder: "Écrivez un message...", + e2eeNote: "Les messages sont chiffrés de bout en bout avec NIP-17", + }, + coordinator: { + secondsAgo: "il y a {{count}} s", + minutesAgo: "il y a {{count}} min", + hoursAgo: "il y a {{count}} h", + daysAgo: "il y a {{count}} j", + statusIdle: "Non vérifié", + statusChecking: "Vérification…", + statusOnline: "Connecté", + statusStale: "Silencieux", + statusOffline: "Non vu", + statusError: "Injoignable", + notACoordinator: "Ce n'est pas un coordinateur", + notACoordinatorDesc: "Collez un nprofile, un npub ou un lien cordn.net.", + added: "Coordinateur ajouté", + relayOne: "{{count}} relais", + relayMany: "{{count}} relais", + lastSeen: "vu {{time}}", + onlineDesc: "Annonce en cours. Les groupes qui l'utilisent peuvent livrer des messages maintenant.", + staleDesc: "Trouvé, mais il ne s'est pas annoncé récemment — il est peut-être en veille.", + offlineDesc: "Aucune annonce vue. Il est peut-être privé (c'est normal), ou simplement hors ligne.", + errorDesc: "Impossible de joindre les relais.", + idleDesc: "Vérification…", + checkingDesc: "Recherche de son annonce…", + eventFoundOne: "{{count}} événement trouvé.", + eventFoundMany: "{{count}} événements trouvés.", + check: "Vérifier", + addLinkCopied: "Lien d'ajout copié", + copyFailed: "Échec de la copie", + copyManually: "Copiez-le manuellement.", + addLink: "Ajouter le lien", + removeConfirm: "Retirer ce coordinateur de cet appareil ?", + scanToJoin: "Scannez dans Cordn pour rejoindre ce coordinateur.", + noCoordinator: "Aucun coordinateur pour l'instant", + noCoordinatorDescA: "Un coordinateur livre les messages de groupe", + encryptedWord: "chiffrés", + noCoordinatorDescB: "de votre Crew dans l'ordre. Il voit qui, quand et quel groupe — jamais le contenu. Choisissez-en un, ou faites tourner le vôtre.", + change: "Changer de coordinateur", + addTitle: "Ajouter un coordinateur", + add: "Ajouter", + scanQR: "Scanner un QR de coordinateur", + inputPlaceholder: "nprofile… ou un lien cordn.net", + runOwn: "Faites tourner le vôtre", + runOwnDesc: "Il peut tourner sur un vieux téléphone, un Raspberry Pi ou n'importe quelle petite machine que vous laissez allumée. Votre groupe continue de fonctionner tant qu'il est en marche — et vous pouvez déplacer le groupe quand vous voulez.", + onPhone: "Sur un téléphone", + onPhoneDesc: "Utilisez l'app Cordn Coordinator, puis scannez son QR ici pour l'ajouter.", + openCordn: "Ouvrir Cordn", + scanItsQR: "Scanner son QR", + onServer: "Sur un serveur", + commandCopied: "Commande copiée", + copyCommand: "Copier la commande", + androidSleep: "Android peut mettre en veille un coordinateur sur téléphone. Attendez-vous à déplacer un groupe de temps en temps.", + privacyNote: "🔒 Un coordinateur ne voit que le texte chiffré et les métadonnées — jamais le contenu des messages. Faites tourner le vôtre pour que même les métadonnées vous appartiennent.", + customTitle: "Coordinateur de chat personnalisé", + customBadge: "· expérimental · votre propre relais", + customDescShort: "Facultatif — votre Crew dispose déjà d'un chat chiffré de bout en bout intégré, vous n'en avez donc pas besoin. Ne le configurez que si vous faites tourner le vôtre", + remove: "Retirer", + pointerNote: "Pointeur uniquement pour l'instant : un point de terminaison wss:// sert de relais de chat à la Crew ; un https:// passe par le relais ContextVM partagé. Le vrai protocole Cordn MLS n'est pas encore branché.", + cordnCoordinator: "Coordinateur Cordn", + invalid: "Cela ne ressemble pas à un coordinateur. Collez un nprofile, un lien cordn.net ou une URL https/wss.", + useMine: "Utiliser mon coordinateur", + }, + createCrew: { + seoTitle: "Créer une Crew - SkateSpots", + seoDescription: "Créez votre Crew de skate — terrain d'attache, membres et Spots.", + loginRequired: "Connexion requise", + loginRequiredDesc: "Vous devez vous connecter pour créer une Crew.", + backToCrews: "Retour aux Crews", + title: "Créer une Crew", + intro: "Votre famille de skate — les personnes avec qui vous skatiez. Un simple nom suffit pour commencer ; tout le reste est facultatif.", + }, + crew: { + seoTitleNamed: "{{name}} - Crew SkateSpots", + seoTitle: "Crew - SkateSpots", + seoDescription: "Une Crew de skate sur SkateSpots.", + postHidden: "Publication masquée", + postHiddenDesc: "Retirée du fil de la Crew pour tout le monde.", + postHideFailed: "Échec du masquage de la publication", + backToCrews: "Retour aux Crews", + disband: "Dissoudre", + youAreCaptain: "Vous êtes capitaine", + member: "Membre", + askSasquatch: "Demander à Sasquatch", + agent: "Agent de Crew", + agentDesc: "Le guide IA de votre Crew — Spots à proximité, événements, Coachs et matériel, avec des données en direct.", + eventsTab: "Événements", + chatTab: "Chat", + newMessages: "Nouveaux messages", + hostJam: "Organiser une jam", + noEvents: "Aucun événement de Crew pour l'instant. Organisez une jam, un contest ou un meetup en tant que Crew — cela relie votre Crew au calendrier des événements et permet de la zaper.", + support: "Soutenir", + zapCrew: "Zaper la Crew", + bandTitle: "Groupe de la Crew", + bandTagline: "Musique live · skate et son", + listenTitle: "Écouter : {{domain}}", + listen: "Écouter les morceaux", + setUpGig: "Organiser un concert", + bookGigMessage: "Salut {{crew}} — intéressé pour réserver {{band}} pour un concert. Vous êtes dispo pour parler des dates ?", + messageAboutGig: "Écrire à propos d'un concert", + gigHintA: "ajoute un événement musical au calendrier, organisé par cette Crew.", + messageShort: "Message", + gigHintB: "ouvre un DM chiffré à la Crew pour caler les dates et détails.", + homeSpots: "Spots favoris", + viewSpot: "Voir le Spot", + seeOnMap: "Voir sur la carte →", + founderLinks: "Fondateur et liens", + startedBy: "Lancée par {{name}}", + opens: "Ouvre : {{domain}}", + }, + crews: { + seoTitle: "Crews - SkateSpots", + seoDescription: "Trouvez votre tribu. Découvrez les Crews de skate, collectifs et communautés près de chez vous.", + videoPartTooltip: "Cette Crew a une part vidéo", + part: "Part", + bandTooltip: "Groupe de la Crew : {{name}}", + band: "Groupe", + focusAll: "Tout", + focusAllShort: "Tout", + focusDiy: "DIY", + focusPhoto: "Photo", + focusCoaching: "Coaching", + focusArt: "Art", + focusMusic: "Musique", + focusPhysio: "Kiné", + focusMixed: "Mixte", + title: "Crews", + heroLine: "Votre famille de skate ancrée sur la carte — les personnes avec qui vous skatiez", + heroWith: "avec", + heroRest: ", pas celles que vous engagez (ça, c'est The Lab).", + crewCountOne: "{{count}} Crew", + crewCountMany: "{{count}} Crews", + cityCountOne: "{{count}} ville", + cityCountMany: "{{count}} villes", + createCrew: "Créer une Crew", + create: "Créer", + searchPlaceholder: "Rechercher des Crews par nom ou ville…", + filterTitle: "Filtrer les Crews", + filterDesc: "Ce qui anime la Crew.", + nearMe: "Près de moi", + emptySearchTitle: "Aucune Crew ne correspond à votre recherche", + emptySearchHint: "Rien trouvé pour « {{query}} ». Essayez un autre nom ou une autre ville.", + clearSearch: "Effacer la recherche", + emptyFocusTitle: "Aucune Crew {{label}} pour l'instant", + emptyFocusHint: "Personne ne hisse encore le drapeau « {{label}} » ici. Affichez toutes les Crews, ou lancez celle-ci vous-même.", + showAll: "Afficher toutes les Crews", + claimTitle: "Revendiquez votre scène locale", + claimHint: "Aucune Crew implantée ici pour l'instant. Soyez le premier — lancez votre Crew, reliez vos Spots favoris et mettez votre scène sur la carte pour que tout le monde la trouve.", + }, + crewCoordinator: { + privateChat: "Chat privé de Crew", + on: "Activé", + defaultA: "L'onglet", + chatWord: "Chat", + defaultB: "est", + e2ee: "chiffré de bout en bout", + defaultC: "pour le fondateur et tous les membres listés — rien à configurer. Les messages sont scellés avec la clé de chaque membre (NIP-17), donc seule votre Crew peut les lire.", + advancedA: "Avancé : faites tourner votre propre", + cordnCoordinator: "coordinateur Cordn", + routeThrough: "Acheminer le chat via lui", + coordinator: "Coordinateur", + deliveredOver: "Livré via", + sharedRelay: "— le relais ContextVM partagé.", + ownRelay: "— le relais propre à votre Crew.", + chatLive: "Le chat privé est actif", + routesA: "L'onglet", + routesB: "achemine via ce coordinateur : les messages sont chiffrés de bout en bout (NIP-44, scellés pour chaque membre), donc il ne traite que du trafic scellé.", + publicWarning: "Attention : il est adressé via le relais ContextVM partagé, donc le texte chiffré et ses métadonnées (quelle Crew, et quand) sont publiquement visibles — mais illisibles. Pointez la Crew vers un relais wss:// privé pour que même cela reste privé.", + ownRelaySafe: "Rien de spécifique à la Crew ne quitte le relais propre à votre Crew.", + manage: "Gérer le coordinateur", + open: "Ouvrir {{domain}}", + runBy: "Coordinateur géré par", + }, + dms: { + securityReminder: "Rappel de sécurité", + phishingStrong: "SkateSpots ne vous enverra jamais de DM", + phishingRest: "pour vous demander de vérifier votre compte, partager vos clés ou envoyer des paiements. Si quelqu'un prétend être le support SkateSpots par DM — c'est une arnaque.", + dismissReminder: "Ignorer le rappel de sécurité", + peopleCount: "{{count}} personnes", + youPrefix: "Vous : ", + unreadMessages: "Messages non lus", + seoTitle: "Messages - SkateSpots", + seoDescription: "Messages privés chiffrés avec la communauté du skate", + loginTitle: "Connectez-vous pour accéder aux messages", + loginDesc: "Messagerie privée et chiffrée avec les skateurs de la communauté", + secureLoginTitle: "Connexion sécurisée requise", + secureLoginDesc: "Les messages privés nécessitent une application de signature sécurisée pour chiffrer vos conversations.", + onAndroid: "Sur Android :", + useAmber: "Utilisez l'app Amber", + getAmber: "Obtenir Amber →", + onIOS: "Sur iOS :", + iosHint: "Essayez de vous connecter avec une connexion bunker (nsec.app) depuis les paramètres", + browserHint: "Essayez de vous connecter avec une extension de navigateur comme Alby ou nos2x qui prend en charge le chiffrement.", + title: "Messages", + subtitleFull: "Chiffré de bout en bout avec NIP-17", + subtitleShort: "Chiffré", + newMessage: "Nouveau message", + groups: "Groupes", + loadFailed: "Échec du chargement des messages", + emptyTitle: "Aucun message pour l'instant", + emptyDesc: "Démarrez une conversation avec quelqu'un de la communauté", + startConversation: "Démarrer une conversation", + undecryptableOne: "{{count}} message chiffré n'a pas pu être ouvert par votre signataire.", + undecryptableMany: "{{count}} messages chiffrés n'ont pas pu être ouverts par votre signataire.", + }, + editCrew: { + seoTitleNamed: "Modifier {{name}} - SkateSpots", + seoTitle: "Modifier la Crew - SkateSpots", + seoDescription: "Modifiez votre Crew de skate.", + loginRequired: "Connexion requise", + notYours: "Ce n'est pas votre Crew", + notYoursDesc: "Seul le fondateur de la Crew peut modifier cette Crew.", + backToCrew: "Retour à la Crew", + title: "Modifier la Crew", + }, + form: { + add: "Ajouter", + added: "Ajouté", + addNameInBasicsA: "Ajoutez un nom de Crew dans", + addNameInBasicsB: "pour terminer.", + adminsDescA: "Faites de membres de confiance des", + adminsWord: "admins", + adminsDescB: "— ils peuvent inviter des membres et modérer le fil et le chat de la Crew avec leurs propres clés. Vous (le fondateur) restez toujours propriétaire de l'identité de la Crew.", + agentDescA: "Ajoutez", + agentDescB: ", un guide IA qui connaît vraiment votre Crew. Les membres peuvent poser des questions sur", + agentDescC: "— ainsi que sur les Spots, événements, Coachs et matériel à proximité à partir des données en direct de SkateSpots. Tourne directement dans le navigateur ; aucune clé ni configuration. C'est récent (IA gratuite, donc parfois lente).", + agentDescStrong: "votre prochaine jam, qui gère la Crew, ce que vous recherchez et votre ambiance", + agentEnabledNote: "Sasquatch apparaîtra sur la page de votre Crew dès que vous enregistrerez.", + bandDesc: "Vous avez un groupe ? Les scènes de skate et la musique locale vont de pair — indiquez le nom de votre groupe et un lien vers les morceaux.", + bandFooterA: "Pour un profil de groupe complet (genres, instruments, concerts), créez un", + musicianWord: "Musicien", + bandFooterB: "dans The Lab, puis liez-le dans la section", + linkedLabWord: "Profils Lab liés", + bandFooterC: "ci-dessus.", + bandMusicWord: "Groupe et musique", + bandName: "Nom du groupe", + bandNamePlaceholder: "ex. The Bail Outs", + bandNudgeA: "Vous avez un groupe — appuyez pour définir votre", + crewTypeWord: "Type de Crew", + bandNudgeB: "sur", + bandNudgeC: "pour apparaître aussi dans la scène Musique de The Lab.", + beta: "Bêta", + bioLabel: "À propos / manifeste", + bioPlaceholder: "Qui vous êtes, ce que vous skatiez, votre histoire...", + continue: "Continuer", + crewCreated: "Crew créée !", + crewUpdated: "Crew mise à jour !", + crewName: "Nom de la Crew", + crewOnlyWord: "Crew uniquement", + crewType: "Type de Crew", + crewTypeDescA: "Votre Crew est-elle axée sur un métier ? Choisissez-en un pour apparaître aussi dans cette scène dans", + theLab: "The Lab", + crewTypeDescB: ". Les Crews de skate classiques restent", + mixedWord: "Mixtes", + crewTypeDescC: ".", + customVibeHint: "Ajoutez votre propre ambiance ou spécialité avec un #", + customVibePlaceholder: "ex. descente, sessions de nuit, no-comply", + editDesc: "L'identité, le terrain d'attache et les membres de votre Crew", + enableAgent: "Activer l'agent de Crew", + enableTreasury: "Activer la cagnotte de Crew", + failed: "Échec", + founded: "Fondée (année)", + geolocationUnsupported: "Géolocalisation non prise en charge", + gettingLocation: "Récupération...", + goalHint: "Assurez-vous que votre profil Nostr a une adresse Lightning (lud16) pour que les contributions arrivent.", + goalPlaceholder: "ex. Bétonner le Spot DIY", + goalTarget: "Objectif (sats)", + goalWhat: "Quel est l'objectif ?", + homeSpots: "Spots favoris", + homeSpotsDesc: "Reliez les Spots que fréquente votre Crew — ils se connecteront à votre Crew sur la carte", + homeTurf: "Terrain d'attache (ville / zone)", + homeTurfPlaceholder: "Bristol, UK", + instagramDetected: "Clip Instagram détecté", + invalidMember: "Saisissez un npub, nprofile ou pubkey hex valide.", + latitude: "Latitude", + leaveBlankLocation: "Laissez vide pour conserver la localisation actuelle du terrain d'attache.", + links: "Liens", + locationError: "Erreur de localisation", + locationFound: "Localisation trouvée", + logoAlt: "Crew", + logoHint: "Un logo rend votre Crew immédiatement reconnaissable sur la carte et dans les fils. Un format carré fonctionne mieux.", + logoLabel: "Logo / photo de la Crew", + logoUploaded: "Logo importé", + longitude: "Longitude", + looksGood: "Ça a l'air bon", + makeAdmin: "Nommer admin", + mapPin: "Épingle sur la carte", + mapPinHint: "Placez votre Crew sur la carte pour que les locaux puissent vous trouver. Appuyez sur le bouton — aucune saisie nécessaire.", + memberAlreadyAdded: "Ce membre est déjà ajouté.", + members: "Membres", + membersDesc: "Ajoutez les comptes Nostr de votre Crew. Chaque membre confirme avec sa propre clé — jusque-là, il apparaît comme « en attente ».", + musicLink: "Lien musical", + nameCrew: "Nommez votre Crew", + nameCrewDesc: "Une Crew a besoin d'un nom avant de continuer.", + nameCrewFirst: "Nommez d'abord votre Crew", + nameHint: "La seule chose vraiment nécessaire. Vous pourrez la changer plus tard.", + namePlaceholder: "ex. Backyard Bandits", + nameRequired: "Nom requis", + nameRequiredDesc: "Donnez un nom à votre Crew.", + nip05DescA: "Un identifiant vérifiable que vous contrôlez sur n'importe quel domaine, ex.", + nip05DescB: ". Il est vérifié par rapport à la clé du fondateur de cette Crew, et vous pouvez en ajouter plusieurs — chacun affiche une coche verte quand son domaine le confirme.", + nip05Label: "NIP-05 de la Crew", + nip05Placeholder: "crew@votredomaine.com", + nip05Add: "Ajouter", + nip05Invalid: "Saisissez un identifiant comme crew@votredomaine.com", + nip05TooMany: "Vous pouvez ajouter jusqu'à {{count}} identifiants.", + nip05Unverified: "Non vérifié", + nip05Remove: "Retirer {{handle}}", + notAKeyA: "Cela ne ressemble pas encore à une clé Nostr — collez un", + notAKeyB: ",", + notAKeyC: ", ou une pubkey hex.", + onlyYouTubeInstagram: "Seuls les liens YouTube et Instagram sont pris en charge.", + openCall: "Appel à rejoindre", + openCallDescA: "Vous cherchez un Filmer, un monteur ou du sang neuf ? Lancez un appel — il s'affiche sur la page de votre Crew pour que les personnes correspondantes de", + openCallDescB: "puissent vous contacter.", + optional: "· facultatif", + optionalParen: "(facultatif)", + otherSocials: "Autres réseaux", + otherSocialsDesc: "Ajoutez-en autant que vous voulez — YouTube, TikTok, Discord, Telegram, etc.", + ownVisibility: "sa propre visibilité", + progress: "Progression", + publicWord: "Public", + publishedToScene: "Publié à la scène.", + publishFailed: "Échec de la publication", + publishing: "Publication...", + ready: "Prêt", + readyToRollA: "Prêt à rouler — appuyez sur", + readyToRollB: "quand vous voulez.", + removeAdminRole: "Retirer le rôle admin", + removeMember: "Retirer le membre", + removeSocial: "Retirer le lien social", + removeVibe: "Retirer {{vibe}}", + roles: "Rôles :", + sasquatch: "Sasquatch", + saveCrew: "Enregistrer la Crew", + skipToEnd: "Aller à la fin", + socialPlaceholder: "@nomutilisateur ou lien", + sponsorDesc: "Si une boutique locale soutient votre Crew, choisissez-la ici pour afficher une bannière « Sponsorisé par » renvoyant à sa boutique.", + stepAria: "Étape {{step}} : {{title}}", + stepBasics: "Les bases", + stepBasicsShort: "Bases", + stepBasicsHint: "Juste l'essentiel — vous pouvez créer une Crew avec cette seule étape.", + stepVibe: "Identité et ambiance", + stepVibeShort: "Ambiance", + stepVibeHint: "Comment votre Crew apparaît dans l'app. Tout est facultatif.", + stepSquad: "Équipe et Spots", + stepSquadShort: "Équipe", + stepSquadHint: "Ajoutez vos personnes et votre terrain d'attache. Vous pouvez toujours le faire plus tard.", + stepExtras: "Extras", + stepExtrasShort: "Extras", + stepExtrasHint: "Des bonus pour plus tard — ignorez ce dont vous n'êtes pas sûr.", + extrasAllOptional: "Tout dans cette étape est facultatif.", + groupIdentity: "Identité", + groupIdentityHint: "Identifiant, liens", + groupAi: "IA Sasquatch", + groupShowcase: "Vitrine", + groupPayments: "Paiements et cagnotte", + groupIntegrations: "Intégrations", + groupAdvanced: "Avancé", + groupAdvancedHint: "expérimental", + pro: "Pro", + agentProNote: "Propulsé par Sasquatch. Pro obtient les meilleurs modèles ; sans Pro, un modèle de repli gratuit est utilisé.", + stepOf: "Étape {{step}} sur {{total}}", + treasuryDescA: "Récoltez des sats pour un objectif commun — réparer le Spot DIY local, un voyage de Crew, une cagnotte de contest. C'est un objectif Lightning transparent ; les Zaps vont", + treasuryDescStrong: "directement dans votre portefeuille", + treasuryDescB: "(via l'adresse Lightning de votre profil). SkateSpots ne conserve jamais les fonds.", + upload: "Importer", + uploadFailed: "Échec de l'import", + useCurrentLocation: "Utiliser la position actuelle", + vibeLabel: "Ambiance / spécialité", + videoDescA: "La part complète, le montage ou le dernier clip de votre Crew. Collez un lien", + videoDescB: "— il se lira directement sur la page de votre Crew.", + visibilityDescA: "Chaque membre contrôle sa", + visibilityDescB: "— quand il confirme avec sa clé, il peut choisir", + visibilityDescC: "— masqué aux étrangers). Vous ne pouvez pas le définir à leur place ; c'est leur choix.", + website: "Site web", + yourRoles: "Vos rôles (Team Leader)", + youtubeDetected: "Vidéo YouTube détectée", + invalidUrl: "Saisissez un lien valide (ex. https://example.com).", + }, + groupConversation: { + seoTitle: "Chat de groupe - SkateSpots", + invalidLink: "Ce lien de chat de groupe est invalide.", + loginTitle: "Connectez-vous pour voir ce groupe", + secureSignerTitle: "Signataire sécurisé requis", + secureSignerDesc: "Les messages de groupe nécessitent un signataire compatible NIP-44.", + encryptedGroup: "Groupe chiffré de bout en bout", + empty: "Aucun message pour l'instant — dites bonjour au groupe.", + placeholder: "Écrivez au groupe...", + }, + hero: { + established: "Depuis {{year}}", + teamLeader: "Team leader : {{name}}", + ledBy: "Dirigé par", + }, + inviteCard: { + acceptedTitle: "Invitation acceptée 🛹", + acceptedDesc: "Le fondateur de la Crew confirme les membres sur {{crew}}. Vous apparaîtrez dans l'effectif une fois approuvé.", + couldNotAccept: "Impossible d'accepter", + couldNotDecline: "Impossible de refuser", + acceptedDone: "Accepté —", + confirmsMembers: "confirme les membres", + declinedDone: "Invitation à {{crew}} refusée", + invitedYou: "vous a invité à rejoindre", + admin: "Admin", + accept: "Accepter", + decline: "Refuser", + }, + inviteDialog: { + messageIntro: "Yo — rejoins la Crew {{crew}} sur SkateSpots 🛹", + messageBody: "Connecte-toi avec ta clé Nostr, puis demande à rejoindre depuis la page de la Crew.", + copyFailed: "Échec de la copie", + shareTitle: "Rejoindre {{crew}}", + sentTitle: "Invitation envoyée ! 🛹", + sentDesc: "Il/elle recevra une notification pour accepter ou refuser.", + couldNotSend: "Impossible d'envoyer l'invitation", + trigger: "Inviter", + title: "Inviter dans {{crew}}", + description: "Envoyez une invitation à la clé Nostr de quelqu'un, ou partagez un lien.", + sendTab: "Envoyer l'invitation", + shareTab: "Partager le lien", + npubLabel: "npub du skateur", + invalidNpub: "Cela ne ressemble pas à un npub valide.", + noteLabel: "Note", + optional: "(facultatif)", + notePlaceholder: "Viens skater avec nous…", + inviteAsAdmin: "Inviter comme admin", + inviteAsAdminDesc: "Peut gérer la Crew et inviter d'autres personnes.", + sendButton: "Envoyer l'invitation", + sendFooter: "Il/elle recevra une notification pour accepter ou refuser. L'adhésion ne compte qu'une fois acceptée.", + inviteLink: "Lien d'invitation", + messageLabel: "Message", + copyMessage: "Copier le message", + founderHint: "En tant que fondateur, vous pouvez aussi ajouter directement la clé d'un membre, puis il confirme.", + addMemberSettings: "Ajouter un membre dans les paramètres de la Crew", + }, + joinRequest: { + moreCount: "+{{count}} de plus", + addedTitle: "{{name}} ajouté à {{crew}} 🛹", + addedDesc: "Il/elle confirmera de son côté pour apparaître comme membre.", + vouchedTitle: "Vous vous êtes porté garant pour {{name}} 🤝", + vouchedDesc: "Le fondateur de {{crew}} verra votre recommandation et pourra l'ajouter.", + couldNotEndorse: "Impossible de recommander", + endorsedDoneA: "Vous vous êtes porté garant pour", + endorsedDoneB: "— le fondateur confirmera", + vouchedBy: "Garanti par", + approveAndAdd: "Approuver et ajouter", + addToCrew: "Ajouter à la Crew", + vouchedWaiting: "Garanti — en attente du fondateur", + vouchForThem: "Se porter garant", + leadershipOnly: "Réservé à la direction de la Crew.", + adminHelp: "Les admins ne peuvent pas ajouter de membres directement — se porter garant indique au fondateur que vous soutenez ce rider.", + }, + leadership: { + teamLeader: "Team Leader", + captain: "Capitaine", + verifiedMember: "Membre vérifié", + messageName: "Écrire à {{name}}", + title: "Direction", + captainsOne: "{{count}} Capitaine", + captainsMany: "{{count}} Capitaines", + footer: "Le Team Leader gère l'effectif ; les Capitaines aident à inviter, organiser les jams et garder la Crew en ordre.", + }, + linkField: { + title: "Crew liée", + description: "Vous gérez aussi une Crew ? Liez-la pour que les gens puissent passer de votre studio à votre Crew. Facultatif. Liez cette Crew au profil depuis l'éditeur de Crew et elle affichera un", + descriptionRest: "badge vert sur les deux.", + none: "Vous n'avez encore aucune Crew. Créez-en une sur la page Crews pour la lier ici.", + linkedCrew: "Crew liée ({{id}})", + }, + lookingFor: { + title: "Appel à rejoindre", + subtitle: "Cette Crew recherche :", + }, + memberVisibility: { + updatedTitle: "Visibilité mise à jour", + updatedCrew: "Vous n'apparaissez plus qu'aux camarades de Crew.", + updatedPublic: "Vous apparaissez maintenant publiquement dans cette Crew.", + couldNotUpdate: "Impossible de mettre à jour", + title: "Votre visibilité dans cette Crew", + save: "Enregistrer la visibilité", + }, + newMessage: { + inCrew: "Dans votre Crew : {{crews}}", + crewmate: "Camarade de Crew", + following: "Abonnement", + invalidKey: "Cela ne ressemble pas à un npub ou une clé publique valide.", + description: "Recherchez vos contacts par nom, ou collez un npub pour écrire à n'importe qui. Sélectionnez-en deux ou plus pour créer un groupe.", + searchPlaceholder: "Rechercher un nom ou coller npub1...", + messageThisKey: "Écrire à cette clé", + loadingPeople: "Chargement de vos contacts...", + noPeople: "Aucun camarade de Crew ni abonnement pour l'instant.", + noPeopleHint: "Collez le npub de quelqu'un ci-dessus pour démarrer une conversation.", + yourCrews: "Vos Crews", + selected: "{{count}} sélectionnés", + startGroup: "Créer un groupe ({{count}})", + message: "Message", + }, + nip05: { + mismatch: "Ce domaine pointe l'identifiant vers une clé Nostr différente de celle du fondateur de la Crew. Non vérifié.", + verified: "Vérifié — le domaine confirme que cet identifiant appartient à la clé du fondateur de la Crew.", + }, + requestCollective: { + sentTitle: "Demande envoyée 🤝", + sentDesc: "{{name}} la verra dans ses notifications et pourra vous ajouter.", + couldNotSend: "Impossible d'envoyer la demande", + title: "Rejoindre ce collectif", + waiting: "Demande envoyée — en attente de {{name}}.", + askA: "Demandez à la Crew derrière", + askB: "de vous ajouter à l'effectif. Elle recevra une notification et pourra vous ajouter en un tap.", + placeholder: "Facultatif : dites pourquoi vous seriez un bon atout…", + sendButton: "Envoyer la demande", + }, + requestToJoin: { + sentTitle: "Demande envoyée ! 🛹", + sentDesc: "La direction de {{crew}} la verra dans ses notifications.", + couldNotSend: "Impossible d'envoyer la demande", + trigger: "Demander à rejoindre", + title: "Rejoindre {{crew}}", + description: "Prévient le fondateur et les admins de la Crew pour qu'ils puissent vous ajouter.", + placeholder: "Dites bonjour — où vous skatiez, qui vous connaissez, pourquoi vous voulez rejoindre…", + sending: "Envoi…", + sendButton: "Envoyer la demande d'adhésion", + }, + sponsorBanner: { + loading: "Chargement du sponsor…", + sponsoredBy: "Sponsorisé par", + }, + sponsorPicker: { + selected: "Sponsor sélectionné", + setLoading: "Sponsor défini (chargement de la boutique…)", + set: "Sponsor défini", + clearAria: "Effacer le sponsor", + searchPlaceholder: "Rechercher des skateshops par nom ou ville…", + loading: "Chargement des boutiques…", + noMatch: "Aucune boutique ne correspond — essayez une autre recherche.", + none: "Aucune boutique trouvée pour l'instant.", + }, + treasury: { + title: "Cagnotte de Crew", + ofGoal: "sur un objectif de {{target}}", + goalReached: "Objectif atteint !", + funded: "financé à {{percent}} %", + contributionOne: "{{count}} contribution", + contributionMany: "{{count}} contributions", + daysLeft: "{{days}} j restants", + closed: "clôturée", + nonCustodial: "Non custodial · les Zaps vont directement dans le portefeuille Lightning de la Crew", + }, + userStatus: { + atSpot: "📍 À un Spot", + autoClears: "⏱️ S'efface automatiquement dans {{min}} min", + }, + video: { + title: "La Part", + fullVideo: "Vidéo complète · montage", + latestClip: "Dernier clip", + watch: "Regarder", + iframeTitle: "{{crew}} — vidéo", + playAria: "Lire la vidéo de {{crew}}", + thumbAlt: "Miniature de la vidéo de {{crew}}", + instagramTitle: "Clip Instagram", + }, + vouch: { + removedTitle: "Garantie retirée", + vouchedTitle: "Garanti !", + removedDesc: "Vous ne vous portez plus garant pour {{name}}.", + vouchedDesc: "Vous vous êtes porté garant pour {{name}}. La scène fait confiance aux siens.", + couldNotVouch: "Impossible de se porter garant", + title: "Garanties de la scène", + sceneVerified: "Vérifié par la scène", + vouched: "Garanti", + newUnvouched: "Nouveau · sans garantie", + checking: "Vérification de la scène…", + empty: "Aucune garantie pour l'instant. Les garanties de skateurs de vos cercles sont le meilleur signe que quelqu'un est légitime — pas un inconnu qui est passé par là.", + countOne: "{{count}} garantie", + countMany: "{{count}} garanties", + trusted: "{{count}} de skateurs dans votre réseau de confiance", + remove: "Retirer la garantie", + vouchFor: "Se porter garant pour {{name}}", + ownerNote: "Les skateurs qui connaissent votre travail peuvent se porter garants ici.", + }, + }, +}; export default frBatch5; diff --git a/src/i18n/fr/batch6.ts b/src/i18n/fr/batch6.ts index ffc62d0..10e171d 100644 --- a/src/i18n/fr/batch6.ts +++ b/src/i18n/fr/batch6.ts @@ -1,4 +1,1948 @@ -/** fr — batch 6. Filled by the translation pass; empty until then. */ -const frBatch6 = {}; +/** fr — batch 6. Traductions françaises (fr-FR). */ +const frBatch6 = { + placesUi: { + addToCalendar: { + add: "Ajouter au calendrier", + appleOutlook: "Apple / Outlook (.ics)", + google: "Google Agenda", + }, + attendees: { + goingCount: "participants", + goingTab: "Participants ({{count}})", + interestedTab: "Intéressés ({{count}})", + nobodyGoing: "Personne n'a encore confirmé.", + nobodyInterested: "Personne n'a encore marqué son intérêt.", + noRsvps: "Pas encore de RSVP — sois le premier à dire que tu viens.", + trusted: "Fiable", + trustedTitle: "Quelqu'un que tu suis ou un cartographe de confiance", + youTrust: "en qui tu as confiance", + }, + bounty: { + addressCoords: "Adresse et coordonnées", + basic: "Basique", + contactInfo: "Coordonnées", + description: "Description", + earningPotential: "Potentiel de gains", + excellent: "Excellent !", + gettingStarted: "Pour commencer", + good: "Bien", + onePhoto: "Au moins 1 photo", + openingHours: "Horaires d'ouverture", + shopName: "Nom du Shop", + threePhotos: "3+ photos", + tip: "💡 Plus la qualité est élevée, plus tu reçois de zaps de la communauté !", + }, + calendar: { + allDay: "Toute la journée", + eventDay: "Jour de l'Event", + eventsOnDay: "{{count}} Events", + eventsThisMonth: "Events ce mois-ci", + going: "participants", + months: { + january: "Janvier", + february: "Février", + march: "Mars", + april: "Avril", + may: "Mai", + june: "Juin", + july: "Juillet", + august: "Août", + september: "Septembre", + october: "Octobre", + november: "Novembre", + december: "Décembre", + }, + nextMonth: "Mois suivant", + nothingOnDay: "Rien ce jour-là.", + prevMonth: "Mois précédent", + tapHighlighted: "Touche un jour en surbrillance pour voir ce qui s'y passe.", + today: "Aujourd'hui", + tourDay: "Jour de Tour", + toursOnDay: "{{count}} Tours", + toursThisMonth: "Tours ce mois-ci", + weekdays: { + sun: "Dim", + mon: "Lun", + tue: "Mar", + wed: "Mer", + thu: "Jeu", + fri: "Ven", + sat: "Sam", + }, + weekdaysShort: { + sun: "D", + mon: "L", + tue: "M", + wed: "M", + thu: "J", + fri: "V", + sat: "S", + }, + }, + countdown: { + ended: "Terminé", + happeningNow: "En cours", + inDays: "Dans {{count}} jours", + inHoursMins: "Dans {{hours}} h {{mins}} min", + inMins: "Dans {{count}} min", + startingNow: "Ça commence maintenant", + tomorrow: "Demain", + }, + createEvent: { + add: "Ajouter", + addNewSpot: "Ajouter un nouveau Spot →", + changeSpot: "Changer de Spot", + created: "Event créé !", + createdDesc: "Ton Event a été publié sur le réseau.", + entryFee: "Frais d'entrée", + entryFeeHint: "(facultatif — ex. « 500 sats » ou « 10 £ »)", + entryFeePlaceholder: "Laisse vide pour les Events gratuits", + featuring: "Avec {{name}}", + featuringDesc: "Cet acte sera tagué comme live music et affiché dans sa liste de concerts.", + fundingGoal: "Objectif de financement", + fundingGoalHint: "(facultatif — sats à financer via des zaps)", + fundingGoalPlaceholder: "ex. 50000", + geoNotSupported: "Géolocalisation non prise en charge", + geoNotSupportedDesc: "Ton navigateur ne prend pas en charge la géolocalisation.", + hideSpots: "Masquer les Spots", + hostingAs: "Organisé en tant que {{name}}", + hostingAsDesc: "Cet Event apparaîtra sur ta page de Crew et sera tagué comme organisé par une Crew.", + imageUploaded: "Image téléversée", + imageUploadedDesc: "Ton image a bien été téléversée.", + invalidDate: "Date invalide", + invalidDateDesc: "Saisis une date et une heure de début valides.", + invalidEnd: "Heure de fin invalide", + invalidEndDesc: "L'heure de fin doit être postérieure à l'heure de début.", + linkedTo: "Lié à : {{title}}", + linkToSpot: "Lier à un Skate Spot", + linkToShop: "Lier à un Shop", + selectedShop: "Lié à {{name}}", + selectShopHint: "Facultatif — organisé dans ou par un skate shop.", + selectShop: "Sélectionner un Shop", + changeShop: "Changer de Shop", + hideShops: "Masquer les Shops", + searchShops: "Rechercher des Shops…", + noShopsMatch: "Aucun Shop ne correspond à ta recherche.", + noShopsAvailable: "Aucun Shop disponible pour le moment.", + linkToTour: "Lier à un Tour (facultatif)", + linkTourDesc: "Lie cet Event à un Tour pour montrer qu'il fait partie d'une série plus large. Idéal pour les Tours nationaux, les aventures internationales ou les journées de défi du World Destruction Tour.", + loadingSpots: "Chargement des Spots...", + loadingTours: "Chargement des Tours...", + locationError: "Erreur de localisation", + locationFound: "Localisation trouvée", + locationFoundDesc: "Ta position actuelle a été définie.", + logoUrl: "URL du logo (facultatif)", + noSpotsAvailable: "Aucun Spot disponible", + noSpotsMatch: "Aucun Spot ne correspond à ta recherche", + noTourLinked: "Aucun Tour lié", + optional: "(facultatif)", + pastDesc: "Choisis une date et une heure dans le futur pour que les skateurs puissent RSVP et venir.", + pastTitle: "Cette heure de début est déjà passée", + publishFailed: "Échec de la publication", + publishFeatured: "Publier l'Event à la une", + removeSponsor: "Retirer le sponsor", + searchSpots: "Rechercher des Spots par nom, lieu ou catégorie...", + selectedSpot: "Sélectionné : {{name}}", + selectSpot: "Sélectionner un Spot", + selectSpotHint: "Sélectionne un Spot sur la carte où cet Event a lieu", + selectTour: "Sélectionner un Tour", + somethingWrong: "Une erreur est survenue", + sponsorName: "Nom du sponsor", + sponsors: "Sponsors", + sponsorsHint: "Un Shop ou une marque soutient cet Event ? Ajoute son logo — il s'affiche comme une bande « Présenté par » sur l'Event.", + startRequired: "Heure de début requise", + startRequiredDesc: "Indique quand l'Event commence.", + titleRequired: "Titre requis", + titleRequiredDesc: "Saisis un nom pour cet Event.", + uploadFailed: "Échec du téléversement", + uploadFailedDesc: "Échec du téléversement de l'image", + websiteUrl: "URL du site web (facultatif)", + }, + createShop: { + address: "Adresse du Shop", + addressPlaceholder: "ex. 411 N Fairfax Ave, Los Angeles, CA 90036", + addressRequired: "Adresse requise", + addressRequiredDesc: "Saisis l'adresse de ton Shop.", + contactHint: "Aide les clients à te joindre (au moins un moyen de contact recommandé)", + contactInfo: "Coordonnées", + created: "🎉 Shop ajouté !", + createdDesc: "Ton skate shop est maintenant sur la carte. Les skateurs peuvent te zapper pour te remercier !", + descriptionPlaceholder: "Parle de ton Shop, de ce que tu vends, de ta spécialité...", + detailsDesc: "Parle de ton Shop à la communauté. Tous les champs marqués d'un * sont obligatoires.", + email: "E-mail", + hoursOfOperation: "Horaires d'ouverture", + hoursPlaceholder: "ex. Lun-Sam 10h-20h, Dim 12h-18h", + instagram: "Instagram", + invalidCoords: "Coordonnées invalides", + invalidCoordsDesc: "Saisis une latitude (-90 à 90) et une longitude (-180 à 180) valides.", + latPlaceholder: "Latitude (ex. 34.0737)", + lngPlaceholder: "Longitude (ex. -118.3614)", + locationRequired: "Localisation requise", + locationRequiredDesc: "Saisis des coordonnées ou utilise ta position actuelle.", + loginToAdd: "Tu dois te connecter pour ajouter un skate shop.", + namePlaceholder: "ex. Supreme Los Angeles", + nameRequired: "Nom du Shop requis", + nameRequiredDesc: "Saisis un nom pour ton Shop.", + phoneNumber: "Numéro de téléphone", + publishFailedDesc: "Une erreur est survenue. Consulte la console pour plus de détails.", + shopPhotoAlt: "Shop", + shopPhotos: "Photos du Shop", + subtitle: "Référence ton Shop sur la carte et connecte-toi à la communauté", + upload: "Téléverser", + }, + createTour: { + acceptedClipSources: "Sources de clips acceptées", + acceptedClipSourcesDesc: "Quels formats acceptes-tu pour les clips soumis ?", + accommodationInfo: "Infos hébergement", + accommodationPlaceholder: "Recommandations ou arrangements d'hébergement, ex. « Auberges pas chères le long du trajet », « Matériel de camping requis », « Airbnb inclus »", + addChallenge: "Ajouter un défi", + addCity: "Ajouter une ville...", + addCountry: "Ajouter un pays...", + addShopFirst: "Ajoute d'abord un Shop", + alsoSelected: "Également sélectionné :", + availabilityPlaceholder: "ex. Week-ends, Matins uniquement, Sur rendez-vous", + availabilityQuestion: "Quand es-tu généralement disponible ?", + availableShops: "Skate shops disponibles ({{count}})", + challengeDescPlaceholder: "Description facultative...", + challenges: "Défis", + challengesRequired: "Défis requis", + challengesRequiredDesc: "Ajoute au moins un défi à relever pour les équipes.", + challengesSecret: "Tous les défis sont SECRETS jusqu'à la date de début de la compétition. Les équipes ne les verront pas avant !", + challengeTitlePlaceholder: "Titre du défi, ex. « Kickflip a 10 stair »", + citiesLabel: "Villes", + citiesOnTour: "Villes du Tour", + cityPlaceholder: "ex. Berlin, Allemagne", + cityRegion: "Ville / Région", + cityRequired: "Ville/région requise", + cityRequiredDesc: "Saisis ta ville ou ta région.", + clipAnyUrl: "🔗 N'importe quelle URL", + clipBlossom: "📦 Téléversement Blossom", + clipInstagram: "📸 Instagram", + clipYouTube: "▶️ YouTube", + competitionDates: "Dates de la compétition", + competitionDatesWarning: "⚠️ Tous les défis sont SECRETS jusqu'à la date de début ! Les équipes ne verront pas les défis avant le début de la compétition.", + competitionLocations: "Lieux de la compétition", + competitionLocationsDesc: "Où les équipes s'affronteront-elles ? Ajoute toutes les villes et tous les pays concernés.", + coordsHint: "Les coordonnées sont facultatives. Ajoute-les pour épingler ton point de rendez-vous sur la carte.", + countriesLabel: "Pays", + countriesRequired: "Pays requis", + countriesRequiredDesc: "Ajoute au moins un pays pour ton Tour international.", + createdDestruction: "💀 WORLD DESTRUCTION TOUR CRÉÉ !", + createdDestructionDesc: "Les équipes peuvent s'inscrire. Défis révélés à la date de début !", + createDestructionTour: "Créer un World Destruction Tour", + createdInternational: "✈️ Tour international créé !", + createdInternationalDesc: "Ton aventure mondiale est en ligne ! Connecte-toi à des skateurs du monde entier.", + createdLocal: "🏠 Tour local créé !", + createdLocalDesc: "Ton Tour est maintenant visible. Les skateurs peuvent réserver par DM !", + createdNational: "🚐 Tour national créé !", + createdNationalDesc: "Ton road trip est en ligne ! Commence à coordonner avec les skateurs intéressés.", + departure: "Départ *", + departureRequired: "Date de départ requise", + departureRequiredDesc: "Indique quand le voyage part pour que les skateurs puissent planifier et réserver.", + descriptionPlaceholder: "Décris ce que les skateurs vivront : les Spots que vous visiterez, l'ambiance, ce qui rend ton Tour unique...", + destructionDesc: "Mets en place ta compétition mondiale style KOTR — tu définis TOUT !", + discountHint: "Les participants au Tour peuvent montrer leur confirmation de réservation au Shop pour bénéficier de cette réduction", + discountPercentage: "Pourcentage de réduction", + dropTour: "Publier un Tour", + duration: "Durée", + durationHintDestruction: "Combien de temps dure la compétition ? (1-12 mois)", + durationHintInternational: "Combien de semaines dure l'aventure ? (jusqu'à 2 mois)", + durationHintLocal: "Combien de temps dure ton Tour typique ?", + durationHintNational: "Combien de jours dure le road trip ?", + durationWeeksMonths: "{{weeks}} semaines (~{{months}} mois)", + editTour: "Modifier le Tour", + enable: "Activer", + enabled: "Activé", + endBeforeStart: "Fin avant le début", + endBeforeStartDesc: "La date de fin de la compétition doit être égale ou postérieure à la date de début.", + endDate: "Date de fin", + entryFeeHint: "Tu gardes 95 % • La plateforme prend 5 % • Laisse vide pour une entrée gratuite", + entryFeePerTeam: "Frais d'entrée par équipe (sats)", + entryFeePlaceholder: "ex. 100000", + entryPrizes: "Entrée et prix", + filmPremieres: "Premières des films d'équipe", + filmPremieresDesc: "Après la compétition, les clips de chaque équipe deviennent un film complet qui peut être projeté en première dans les skate shops du monde entier.", + filmPremieresInfo: "🎥 Les équipes compilent leurs clips de défis en un film final. Les Shops peuvent organiser des soirées de première, reliant la compétition mondiale aux communautés locales.", + filmReleaseDate: "Date de sortie du film (facultatif)", + filmReleaseDateHint: "Quand les films seront disponibles. Laisse vide pour une sortie immédiatement après la fin de la compétition.", + fixedSession: "Session fixe", + fixedSessionDesc: "Une date et une heure définies", + flexible: "Flexible", + flexibleDesc: "Réserve à tout moment par DM", + hide: "Masquer", + howDestruction1: "• Compétition mondiale par équipes - jusqu'à 12 mois", + howDestruction2: "• TOI tu définis les défis, les points, les prix - nous fournissons juste la plateforme", + howDestruction3: "• Tous les défis sont SECRETS jusqu'à la date de début de la compétition", + howDestruction4: "• Clips via téléversement Blossom OU liens externes (YouTube, Instagram, n'importe quelle URL)", + howDestruction5: "• Niveau avancé uniquement - tous les types de Spots inclus automatiquement", + howDestruction6: "• La plateforme ne prend que 5 % des frais d'entrée (PAS la cagnotte)", + howDestructionTitle: "💀 WORLD DESTRUCTION TOUR - Style KOTR", + howInternational1: "• Aventures transfrontalières dans plusieurs pays", + howInternational2: "• Tu fixes le prix — la plateforme ne prend que 5 %", + howInternational3: "• Fixe les dates de départ et de retour pour que la Crew puisse réserver ses vols", + howInternational4: "• Connecte des skateurs du monde entier", + howInternational5: "• Crée des expériences mondiales inoubliables !", + howInternationalTitle: "Comment fonctionnent les Tours internationaux", + howItWorks: "Comment ça marche :", + howLocal1: "• Tu fixes ton prix — la plateforme prend 10 %", + howLocal2: "• Les Spots cachés restent cachés — tu les montres en personne", + howLocal3: "• Organise une session programmée ou reste flexible / sur rendez-vous", + howLocal4: "• Les skateurs réservent par DM, paient en Lightning et peuvent l'ajouter à leur calendrier", + howLocal5: "• Développe ta réputation avec des avis et des zaps", + howLocalTitle: "Comment fonctionnent les Tours locaux", + howNational1: "• Road trips multi-villes à travers ton pays", + howNational2: "• Tu fixes le prix — la plateforme ne prend que 7 %", + howNational3: "• Fixe les dates du voyage pour que les skateurs puissent poser des congés et voyager", + howNational4: "• Inclus les infos de transport / hébergement pour la Crew", + howNational5: "• Crée des aventures de skate légendaires !", + howNationalTitle: "Comment fonctionnent les Tours nationaux", + imageUploadedDesc: "Ton image de Tour a été téléversée.", + incompleteCoords: "Coordonnées incomplètes", + incompleteCoordsDesc: "Saisis à la fois la latitude et la longitude, ou laisse les deux vides.", + internationalDetails: "Détails de l'aventure internationale", + languagesSelected: "{{count}} sélectionnées", + languagesSpoken: "Langues parlées", + latOptional: "Latitude (facultatif)", + lngOptional: "Longitude (facultatif)", + loadingProfile: "Chargement du profil...", + loadingProfileDesc: "Vérification de ton statut de vérification NIP-05.", + loadingShops: "Chargement des Shops...", + localShopPremieres: "Premières en Shop local", + localShopPremieresDesc: "Les skate shops du monde entier peuvent organiser des soirées film", + loginToCreate: "Tu dois te connecter pour créer un Tour.", + maxGroupSize: "Taille max du groupe", + maxTeams: "Équipes max", + maxTeamSize: "Taille max d'équipe", + meetingLocationSet: "Ta position actuelle a été définie comme point de rendez-vous.", + meetingPointDesc: "Où rencontreras-tu les participants au Tour ? Choisis un lieu public et bien connu.", + meetingPointLabel: "Point de rendez-vous", + meetingPointPlaceholder: "ex. Gare de Warschauer Straße", + meetingPointRequired: "Point de rendez-vous requis", + meetingPointRequiredDesc: "Indique où tu rencontreras les participants au Tour.", + minTeamSize: "Taille min d'équipe", + noChallenges: "Aucun défi pour le moment", + noChallengesDesc: "Ajoute des défis à relever pour les équipes", + noPartnerShop: "Aucun Shop partenaire", + noShopsFound: "Aucun skate shop trouvé sur le réseau pour le moment.", + noShopsRegistered: "Aucun skate shop encore inscrit", + onlineRelease: "Sortie en ligne", + onlineReleaseDesc: "Diffuse aussi les films sur YouTube/Nostr", + organizerContact: "Coordonnées de l'organisateur", + organizerContactHint: "Ceci sera visible par les équipes inscrites", + organizerContactPlaceholder: "Comment les équipes peuvent-elles te contacter ? ex. npub Nostr, e-mail, Telegram, etc.", + partnerDiscountDesc: "Offre une réduction aux participants du Tour dans un skate shop local", + partnerStep1: "1. Associe-toi à un skate shop local de confiance", + partnerStep2: "2. Définis un pourcentage de réduction pour les participants du Tour", + partnerStep3: "3. Après le Tour, remets aux participants une confirmation à montrer au Shop", + partnerStep4: "4. Le Shop honore la réduction - ça renforce la communauté et attire du passage !", + percentOff: "{{percent}} % DE RÉDUCTION", + photoHint: "Ajoute une photo de toi en skate ou d'un Spot sympa de ton Tour.", + pickRide: "Choisis ton véhicule", + place1: "🥇 1er", + place2: "🥈 2e", + place3: "🥉 3e", + platformFee: "Tu fixes le prix • La plateforme prend {{percent}}", + points: "Points :", + pricePerPerson: "Prix par personne (sats)", + pricePlaceholder: "ex. 25000", + prizeDistribution: "Répartition des prix", + prizePoolHint: "Facultatif - total des prix disponibles", + prizePoolPlaceholder: "ex. 2000000", + proTipDesc: "Avant de proposer une réduction partenaire, contacte le propriétaire du Shop par DM pour convenir du pourcentage de réduction. Ça garantit qu'il est d'accord et qu'il honorera la réduction pour les participants de ton Tour.", + proTipTitle: "💡 Astuce : coordonne-toi d'abord avec le Shop !", + return: "Retour", + returnBeforeDeparture: "Retour avant le départ", + returnBeforeDepartureDesc: "La date de retour doit être égale ou postérieure à la date de départ.", + roadTripDetails: "Détails du road trip", + schedule: "Programme", + scheduleDesc: "Organise ce Tour comme une session programmée ponctuelle, ou reste flexible et laisse les skateurs réserver un créneau par DM.", + secretUntilStart: "Secret jusqu'au début", + selectPartnerShop: "Sélectionner un Shop partenaire", + sessionDateRequired: "Date de session requise", + sessionDateRequiredDesc: "Choisis la date et l'heure de ta session programmée, ou passe à un programme flexible.", + sessionDateTime: "Date et heure de la session", + sessionDateTimeHint: "Les skateurs verront cette heure et pourront l'ajouter à leur calendrier depuis la page du Tour.", + shopPremieresContact: "Contacte ces Shops directement pour organiser des soirées de première. Tous les arrangements sont privés.", + shopPremieresHow: "💡 Comment fonctionnent les Premières en Shop : contacte les Shops directement pour organiser des soirées de première. Tous les arrangements sont privés entre toi et les Shops.", + shopsCanRegister: "Les Shops peuvent s'inscrire sur /create-shop", + show: "Afficher", + showAllLanguages: "Afficher les {{count}} langues", + somethingWrong: "Une erreur est survenue.", + spotTypes: "Types de Spots", + spotTypesRequired: "Types de Spots requis", + spotTypesRequiredDesc: "Sélectionne au moins un type de Spot que tu montreras.", + startDate: "Date de début", + startDateRequired: "Date de début requise", + startDateRequiredDesc: "Indique quand la compétition commence (les défis seront révélés à cette date).", + startingCity: "Ville de départ", + startingCityPlaceholder: "ex. Los Angeles, États-Unis", + teamSettings: "Paramètres des équipes", + teamsCount: "{{count}} équipes", + titlePlaceholder: "ex. Berlin Kreuzberg - Tour des Spots underground", + titleRequired: "Titre du Tour requis", + titleRequiredDesc: "Saisis un nom pour ton Tour.", + totalPercent: "Total : {{percent}} %", + totalPrizePool: "Cagnotte totale (sats)", + tourDesc: "Dis aux skateurs à quoi s'attendre lors de ton Tour", + tourDetails: "Détails du Tour", + tourPhoto: "Photo du Tour", + tourTitle: "Titre du Tour", + transportDestructionPlaceholder: "Comment les équipes se déplaceront-elles entre les lieux ? Un transport est-il fourni ou recommandé ?", + transportInfo: "Infos transport", + transportPlaceholder: "Comment les participants voyageront-ils ? ex. « Van fourni », « Vol jusqu'à Barcelone, on loue un van », « Train entre les villes »", + tripDatesDesc: "Fixe les dates pour que les skateurs puissent poser des congés, réserver des vols et planifier le voyage.", + tripDatesTitle: "Dates du voyage", + updated: "Tour mis à jour !", + updatedDesc: "Tes modifications ont été publiées.", + upload: "Téléverser", + view: "Voir →", + worldDestruction: "World Destruction Tour", + youReceive: "Tu reçois : {{amount}} sats par personne", + }, + editEvent: { + accessDenied: "Accès refusé", + accessDeniedDesc: "Tu ne peux modifier que les Events que tu as créés.", + backToEvent: "Retour à l'Event", + detailsDesc: "Mets à jour les informations de cet Event. Tous les champs marqués d'un * sont obligatoires.", + eventCover: "Bannière de l'Event", + locationUpdated: "Localisation mise à jour.", + loginToEdit: "Tu dois te connecter pour modifier cet Event.", + newSpot: "Nouveau Spot : {{location}}.", + newTime: "Nouvelle heure : {{date}} à {{time}}.", + saveChanges: "Enregistrer les modifications", + saving: "Enregistrement...", + title: "Modifier l'Event", + updated: "Event mis à jour !", + updatedDesc: "Tes modifications ont été publiées sur le réseau.", + updateDetails: "Mettre à jour les détails de {{title}}", + updatedNotified: "Modifications publiées — {{count}} participants notifiés.", + updateFailed: "Échec de la mise à jour", + updateMessage: "{{parts}} — consulte l'Event pour les détails.", + }, + editShop: { + accessDeniedDesc: "Tu ne peux modifier que les Shops que tu as créés.", + backToShop: "Retour au Shop", + detailsDesc: "Mets à jour les informations de ton Shop. Tous les champs marqués d'un * sont obligatoires.", + loginToEdit: "Tu dois te connecter pour modifier ce Shop.", + updated: "Shop mis à jour !", + updateDetails: "Mettre à jour les détails de {{name}}", + }, + editTour: { + accessDeniedDesc: "Tu ne peux modifier que les Tours que tu as créés.", + loginToEdit: "Tu dois te connecter pour modifier ce Tour.", + }, + eventCard: { + report: "Signaler", + }, + eventDetail: { + aCrew: "une Crew", + addToCalendar: "Ajouter au calendrier", + backToEvents: "Retour aux Events", + cancelled: "Cet Event a été annulé", + checkUpdate: "— consulte la mise à jour", + copyFailed: "Échec de la copie", + date: "Date", + editEvent: "Modifier l'Event", + eventFallback: "Event", + eventOrganizer: "Organisateur de l'Event", + getDirections: "Itinéraire", + linkCopied: "Lien copié", + linkCopiedDesc: "Lien de l'Event copié dans ton presse-papiers — colle-le où tu veux.", + live: "En direct :", + liveMusic: "live music", + location: "Lieu", + newLocation: "Nouveau lieu", + noRsvps: "Aucun RSVP enregistré.", + organizer: "Organisateur", + rsvpsClosed: "Les RSVP sont fermés — cet Event a été annulé par l'hôte.", + seeMap: "Voir la carte", + shareEvent: "Partager l'Event", + shareText: "{{title}} — un Event de skate sur SkateSpots", + shareTextFallback: "Découvre cet Event de skate sur SkateSpots", + time: "Heure", + timeChanged: "Heure modifiée", + updatesFromHost: "Mises à jour de l'hôte", + where: "Où", + whoCame: "Qui est venu", + whosGoing: "Qui y va", + }, + events: { + calendar: "Calendrier", + createTour: "Créer un Tour", + events: "Events", + faqFooter: "Des questions ? Consulte la FAQ →", + hosting: "Organisation", + hostingSubtitle: "Tes Events — RSVP, mises à jour et modifications rapides", + list: "Liste", + noEventsMatchFilters: "Aucun Event ne correspond à tes filtres. Essaie de les ajuster ou de les effacer.", + noPast: "Aucun Event passé", + noPastBody: "Aucun Event de skate passé trouvé avec tes filtres actuels.", + noTours: "Aucun Tour trouvé", + noToursBody: "Pas encore de Tours de skate. Crée le premier et emmène des skateurs à la découverte de Spots !", + noToursMatchFilters: "Aucun Tour ne correspond à tes filtres. Essaie de les ajuster ou de les effacer.", + noUpcoming: "Aucun Event à venir", + noUpcomingBody: "Aucun Event de skate à venir trouvé. Sois le premier à en créer un !", + past: "Passés", + resultsCount: "{{count}} résultats", + searchCity: "Ville…", + searchEvent: "Nom de l'Event…", + searchTour: "Nom du Tour…", + tours: "Tours", + toursSubtitle: "Guides locaux, road trips et compétitions mondiales", + upcoming: "À venir", + }, + eventTypes: { + contest: "Contest", + demo: "Démo", + jam: "Jam", + meetup: "Meetup", + premiere: "Première", + session: "Session", + workshop: "Atelier", + }, + featured: { + active: "Actif", + bodyEvent: "Gratuit à publier. Les Events à la une obtiennent un badge et apparaissent en haut de la page des Events.", + bodyTour: "Gratuit à publier. Les Tours à la une obtiennent un badge et apparaissent en haut de la liste des Tours.", + contextEvent: "Ton Event reste listé gratuitement dans tous les cas — la une ajoute juste le badge et un coup de boost.", + contextTour: "Ton Tour reste listé gratuitement dans tous les cas — la une ajoute juste le badge et un coup de boost.", + daysRemaining: "À la une actif · {{count}} jours restants.", + headingEvent: "Mettre cet Event à la une", + headingTour: "Mettre ce Tour à la une", + optional: "facultatif", + platformOwner: "Propriétaire de la plateforme — la une est toujours activée.", + }, + filters: { + activeCount: "{{count}} actifs", + all: "Tous", + allLevels: "Tous niveaux", + eventType: "Type d'Event", + following: "Abonnements", + newest: "Plus récents", + popular: "Populaires", + showResults: "Afficher les résultats", + showResultsActive: "Afficher les résultats · {{count}} actifs", + skillLevel: "Niveau", + sortBy: "Trier par", + topRated: "Mieux notés", + tourCategory: "Catégorie de Tour", + trusted: "Fiable", + trustLevel: "Niveau de confiance", + verified: "Vérifié", + }, + food: { + bar: "Bar", + cafe: "Café", + call: "Appeler", + chooseSpot: "Choisir un Spot...", + directions: "Itinéraire", + fastFood: "Fast-food", + foodCourt: "Food court", + locationLabel: "Lieu :", + noneFound: "Aucun lieu de restauration trouvé", + noneFoundDesc: "Nous n'avons trouvé aucun restaurant ni café à moins de 1 km de ce Spot. Essaie de sélectionner un autre lieu.", + placesFound: "{{count}} lieux trouvés à moins de 1 km de {{spot}}", + pub: "Pub", + restaurant: "Restaurant", + selectSpot: "Sélectionner un skate Spot", + selectSpotDesc: "Choisis un skate Spot dans le menu ci-dessus pour trouver des restaurants, cafés et autres options de restauration à proximité.", + selectSpotTitle: "Sélectionner un Skate Spot", + subtitle: "Trouve où manger près de tes skate Spots préférés", + title: "Restauration près des Spots", + unknown: "Inconnu", + website: "Site web", + }, + rsvp: { + areYouGoing: "Tu y vas ?", + cant: "Non", + cantMakeIt: "Je ne peux pas venir", + going: "J'y vais", + goingCount: "participants", + goingShort: "J'y vais", + hostNote: "Tu héberges cet Event — mais tu peux quand même définir ton statut.", + interested: "Intéressé", + interestedCount: "intéressés", + loginToRsvp: "Connecte-toi pour RSVP.", + maybe: "Peut-être", + toastError: "Impossible de RSVP", + toastGoing: "Tu y vas ! 🛹", + toastInterested: "Marqué comme intéressé.", + toastNotGoing: "Marqué comme absent.", + tryAgain: "Réessaie.", + }, + shop: { + addNip05Settings: "Ajouter un NIP-05 dans les paramètres", + adminRemovedReason: "Un admin SkateSpots a retiré le Shop « {{name}} »", + areYouOwner: "Es-tu le propriétaire du Shop ?", + backToMap: "Retour à la carte", + claimDesc: "Si tu possèdes ou gères ce Shop, tu peux le revendiquer pour vérifier la propriété via NIP-05.", + claimNip05Intro: "Pour revendiquer ce Shop, ajoute un identifiant NIP-05 correspondant au domaine du site du Shop. Par exemple, si le site du Shop est", + claimNip05Your: "ton NIP-05 devrait être", + contactShop: "Contacter le Shop", + deleted: "Shop supprimé", + deletedDesc: "Demande de suppression envoyée aux relais. La plupart des relais retireront ce contenu.", + deleteDialogDesc: "Cela supprimera définitivement « {{name}} » de tous les relais. Cette action est irréversible.", + deleteDialogTitle: "Supprimer le Shop ?", + deletedReason: "Shop supprimé", + deleteFailed: "Échec de la suppression", + deleteShop: "Supprimer le Shop", + linkCopied: "Lien copié !", + linkCopiedDesc: "Lien du Shop copié dans le presse-papiers.", + nip05Required: "⚠️ Vérification NIP-05 requise pour revendiquer des Shops", + opens: "Ouvre : {{domain}}", + removeAdmin: "Retirer (admin)", + removed: "Shop retiré", + removedDesc: "Ce Shop a été retiré et sera masqué dans tout SkateSpots.", + removeDialogDesc: "En tant qu'admin SkateSpots, tu retires « {{name}} ». Il sera masqué dans toute l'app pour tout le monde et une demande de suppression sera envoyée aux relais.", + removeDialogTitle: "Retirer ce Shop ? (admin)", + removeShop: "Retirer le Shop", + tipMapper: "Zapper le cartographe", + tipMapperDesc: "Ce Shop a été ajouté par un membre de la communauté. Zappe-le pour le remercier !", + updateNip05: "Mets à jour ton NIP-05 pour revendiquer", + viewPhotoFull: "Voir la photo en plein écran", + viewPhotoOf: "Voir la photo {{index}} sur {{total}}", + }, + sponsors: { + presentedBy: "Présenté par", + }, + tourCard: { + active: "Actif", + completed: "Terminé", + contactForPrice: "Prix sur demande", + durationDays: "{{count}} jours", + durationHours: "{{count}} heures", + durationMonths: "{{count}} mois", + durationWeeks: "{{count}} semaines", + entry: "Entrée : {{amount}} sats", + happeningNow: "En cours", + inDays: "Dans {{count}} jours", + inHours: "Dans {{count}} h", + inMonths: "Dans {{count}} mois", + inWeeks: "Dans {{count}} semaines", + maxGroup: "Max {{count}}", + price: "{{amount}} sats", + prizePool: "{{amount}} sats", + registrationOpen: "Inscriptions ouvertes", + startingSoon: "Bientôt", + teamsMax: "{{count}} équipes max", + tomorrow: "Demain", + worldwide: "Monde entier", + }, + tourDetail: { + about: "À propos de ce Tour", + availability: "Disponibilité", + competitionWindow: "Fenêtre de compétition", + contactToBook: "Contacter le guide pour réserver", + discountAt: "{{percent}} % DE RÉDUCTION chez {{shop}}", + duration: "Durée", + languages: "Langues", + loginToBook: "Connecte-toi pour réserver", + loginToBookDesc: "Connecte-toi pour contacter le guide et réserver ce Tour", + maxGroup: "Groupe max", + meetingPoint: "Point de rendez-vous", + notFound: "Tour introuvable", + notFoundDesc: "Ce Tour a peut-être été retiré ou n'existe pas.", + organizer: "Organisateur", + partnerDiscount: "Réduction Shop partenaire", + partnerDiscountDesc: "Réserve ce Tour pour bénéficier d'une réduction dans le skate shop partenaire. Montre ta confirmation de réservation au personnel du Shop.", + people: "{{count}} personnes", + perPerson: "par personne", + price: "Prix", + runsAbout: "Dure environ {{duration}}", + scheduledSession: "Session programmée", + shareText: "Découvre ce Tour de skate local : {{title}}", + skillLevel: "Niveau", + spotTypes: "Types de Spots", + tourGuide: "Guide du Tour", + tourSponsors: "Sponsors du Tour", + tripDates: "Dates du voyage", + viewProfile: "Voir le profil", + }, + updates: { + admin: "Admin", + adminNote: "Tu publies en tant qu'admin SkateSpots. Ce sera clairement indiqué comme une notification d'admin, pas de l'hôte.", + kindCancelled: "Annulé", + kindNewSpot: "Nouveau Spot", + kindNewTime: "Nouvelle heure", + kindUpdate: "Mise à jour", + loading: "Chargement des mises à jour…", + notifiedCount: "{{count}} personnes notifiées.", + notifiedEveryone: "Tout le monde le verra sur l'Event.", + notifiesRsvps: "Notifie {{count}} RSVP", + noUpdates: "Aucune mise à jour de l'hôte pour le moment. Fais un RSVP et tu seras notifié si quelque chose change.", + placeholder: "Pluie — déplacé à dimanche 14h. Rendez-vous au ledge arrière…", + post: "Publier", + postAdminUpdate: "Publier une mise à jour admin", + posted: "Mise à jour publiée", + postError: "Impossible de publier la mise à jour", + postUpdate: "Publier une mise à jour", + tryAgain: "Réessaie.", + visibleToEveryone: "Visible par tout le monde sur cet Event", + }, + destination: { + bitcoin: "Bitcoin", + closeSearch: "Fermer la recherche", + nothingMatches: "Rien ne correspond à « {{query}} ».", + placeholder: "Rechercher des Spots, Shops, marchands Bitcoin…", + shop: "Shop", + spot: "Spot", + typeChars: "Saisis au moins 2 caractères. Recherche des skate Spots, skate shops et marchands Bitcoin.", + typeCharsNear: "Saisis au moins 2 caractères. Recherche des skate Spots, skate shops et marchands Bitcoin à proximité.", + }, + dateWindow: { + any: "Tous", + anytime: "N'importe quand", + month: "Ce mois-ci", + monthShort: "Mois", + today: "Aujourd'hui", + todayShort: "Aujourd'hui", + week: "Cette semaine", + weekend: "Week-end", + weekendShort: "W.-e.", + weekShort: "Sem.", + }, + }, + marketUi: { + gearSwap: { + title: "Gear Swap", + subtitle: "Achète et vends du matériel de skate d'occasion avec d'autres skateurs", + listGear: "Mettre du Gear en vente", + searchPlaceholder: "Rechercher du Gear...", + allCategories: "Toutes les catégories", + forSale: "À vendre", + wtb: "WTB", + trust: "Confiance", + filterByTrust: "Filtrer par confiance", + allSellers: "Tous les vendeurs", + verifiedOnly: "Vérifiés uniquement", + trustedPlus: "Fiables+", + followingOnly: "Abonnements uniquement", + pickupOrShip: "Retrait ou envoi", + localPickup: "Retrait local", + ships: "Envoi", + sortBy: "Trier par", + newest: "Plus récents", + priceLowHigh: "Prix : croissant", + priceHighLow: "Prix : décroissant", + trustScore: "Score de confiance", + nearest: "Plus proches (local)", + listingFound: "{{count}} annonce trouvée", + listingsFound: "{{count}} annonces trouvées", + loadFailed: "Échec du chargement des annonces", + tryLater: "Réessaie plus tard.", + noneTitle: "Aucune annonce trouvée", + noneFiltered: "Aucun Gear ne correspond à tes filtres actuels. Essaie de les effacer ou de chercher autre chose.", + noneFirst: "Sois le premier à mettre ton Gear en vente — decks, trucks, wheels, chaussures, tout ce qui touche au skate !", + listYourGear: "Mets ton Gear en vente", + faqLink: "Des questions ? Consulte la FAQ →", + }, + hub: { + browse: "Parcourir", + selling: "En vente", + myTrades: "Mes échanges", + reputation: "Réputation", + loginListings: "Connecte-toi pour gérer tes annonces.", + loginReputation: "Connecte-toi pour voir ta réputation et tes avis.", + }, + marketplace: { + heroTitle: "Shops et Marketplace", + heroBefore: "Notre Marketplace est propulsée par", + heroAfter: "- une place de marché décentralisée sur Nostr. Les skate shops peuvent lister leurs produits, et tu peux acheter/vendre du Gear d'occasion directement en Bitcoin.", + whatIsTitle: "Qu'est-ce que Plebeian Market ?", + whatIsBody: "Plebeian Market est une place de marché décentralisée construite sur Nostr. Achète et vends du matériel de skate directement avec d'autres skateurs en Bitcoin. Pas d'intermédiaires, pas de frais, liberté totale.", + noFeesTitle: "Sans frais", + noFeesBody: "Pas de plateforme qui prend 30 %. Ventes directes de particulier à particulier.", + bitcoinTitle: "Paiements en Bitcoin", + bitcoinBody: "Paie en Bitcoin. Rapide, sécurisé, mondial.", + decentralizedTitle: "Décentralisé", + decentralizedBody: "Construit sur Nostr. Aucune entreprise ne le contrôle.", + visit: "Visiter Plebeian Market", + buySellTitle: "Ce que tu peux acheter et vendre", + catCompletes: "Completes", + preBuilt: "Completes prêts à rouler", + customSetups: "Configurations personnalisées", + beginnerBoards: "Planches pour débuter", + catParts: "Pièces de Deck", + decks: "Decks", + trucks: "Trucks", + wheels: "Wheels", + bearings: "Bearings", + gripTape: "Griptape", + hardware: "Visserie", + catApparel: "Vêtements et protection", + skateShoes: "Chaussures de skate", + clothing: "Vêtements", + helmets: "Casques", + pads: "Protections", + backpacks: "Sacs à dos", + catAccessories: "Accessoires", + tools: "Outils", + wax: "Cire", + rails: "Rails", + stickers: "Stickers", + videos: "Vidéos", + magazines: "Magazines", + howItWorks: "Comment ça marche", + step1Title: "Parcourir les produits", + step1Body: "Visite Plebeian Market et parcours du matériel de skate de shops et de particuliers du monde entier.", + step2Title: "Contacter les vendeurs", + step2Body: "Écris directement aux vendeurs via Nostr. Négocie les prix, pose tes questions, organise l'envoi.", + step3Title: "Payer en Bitcoin", + step3Body: "Finalise ton achat avec Bitcoin Lightning pour des paiements instantanés et à faibles frais.", + step4Title: "Laisser un avis", + step4Body: "Note ton expérience et construis la réputation du vendeur sur Nostr. Tes avis aident la communauté.", + needBitcoinTitle: "Besoin de Bitcoin ?", + needBitcoinBefore: "Tu auras besoin d'un portefeuille Lightning avec des sats pour faire des achats. Consulte le", + onboardingGuide: "guide de démarrage", + needBitcoinAfter: "pour des recommandations de portefeuille.", + ownShopTitle: "Tu as un skate shop ?", + ownShopBody: "Référence ton Shop sur SkateSpots et vends tes produits sur Plebeian Market. Touche des clients du monde entier sans frais de plateforme.", + addShop: "Ajoute ton Shop", + startSelling: "Commence à vendre", + }, + listingDetail: { + notFound: "Annonce introuvable", + notFoundBody: "Elle a peut-être été supprimée, ou le lien est erroné.", + backToGearSwap: "Retour au Gear Swap", + gearSwap: "Gear Swap", + viewPhoto: "Voir la photo {{n}}", + photoAlt: "{{title}} — photo {{n}}", + wantToBuy: "RECHERCHE", + sold: "VENDU", + description: "Description", + usuallyHere: "Généralement ici {{availability}}", + listed: "Publiée {{date}}", + listingCountOne: "{{count}} annonce · il y a {{age}} j", + listingCountMany: "{{count}} annonces · il y a {{age}} j", + relistActive: "Remettre en ligne", + markSold: "Marquer comme vendu", + deleteListing: "Supprimer l'annonce", + makeOffer: "Faire une offre", + shareListing: "Partager l'annonce", + unknown: "Inconnu", + linkCopied: "Lien copié", + linkCopiedBody: "Partage-le avec un skateur.", + copyFailed: "Impossible de copier le lien", + relisted: "Remise en ligne", + relistedBody: "Ton annonce est de nouveau active.", + couldNotUpdate: "Impossible de mettre à jour", + somethingWrong: "Une erreur est survenue", + }, + create: { + imageUploaded: "Image téléversée", + uploadFailed: "Échec du téléversement", + failed: "Échec", + cooldownActive: "Délai actif", + cooldownWait: "Patiente {{time}} avant de créer une autre annonce", + limitReached: "Limite d'annonces atteinte", + limitReachedBody: "Tu as atteint ta limite mensuelle de {{limit}} annonces", + feeRequired: "Frais requis", + feeRequiredBody: "Paie les frais anti-spam pour continuer", + titleRequired: "Titre requis", + categoryRequired: "Catégorie requise", + photoRequired: "Photo requise", + photoRequiredBody: "Au moins une photo est requise pour vendre du Gear", + nip05Required: "Vérification NIP-05 requise", + nip05RequiredBody: "Tu as besoin d'une adresse Nostr vérifiée pour mettre du Gear en vente", + priceRequired: "Prix requis pour les annonces à prix fixe", + sizeRequired: "Taille requise", + sizeRequiredBody: "Sélectionne une taille pour {{category}}", + conditionRequired: "État requis", + conditionRequiredBody: "Sélectionne l'état de ton {{category}}", + wtbPosted: "Recherche publiée !", + wtbPostedBody: "Les vendeurs pourront trouver ta demande.", + listingCreated: "Annonce créée !", + listingCreatedBody: "Ton Gear est maintenant en vente.", + publishFailed: "Échec de la publication", + loginRequired: "Connexion requise", + loginRequiredBody: "Tu dois te connecter pour mettre du Gear en vente.", + backToStash: "Retour au Stash", + backToSpot: "Retour à {{title}}", + backToMarketplace: "Retour à la Marketplace", + backToMap: "Retour à la carte", + wantToBuy: "Recherche", + listYourGear: "Mets ton Gear en vente", + wtbSubtitle: "Dis à la communauté quel Gear tu recherches", + sellSubtitle: "Vends du matériel de skate à la communauté", + fromStashTitle: "Annonce depuis ton Stash", + fromStashBody: "Pré-rempli avec les détails de ton article du Stash. Vérifie et choisis un point de rendez-vous !", + nip05Banner: "Pour éviter le spam et protéger les acheteurs, tu as besoin d'une adresse Nostr vérifiée (NIP-05) pour mettre du Gear en vente.", + verifiedLabel: "Vérifié :", + checkingTrust: "Vérification de ton niveau de confiance...", + trustLevel: "Niveau de confiance :", + trusted: "Fiable", + active: "Actif", + newcomer: "Nouveau venu", + newUser: "Nouvel utilisateur", + remaining: "{{remaining}} annonces restantes sur {{limit}} ce mois-ci", + cooldownBody: "Les nouveaux utilisateurs ont un délai de 24 heures entre les annonces.", + timeRemaining: "Temps restant : {{time}}", + monthlyLimitTitle: "Limite mensuelle atteinte", + monthlyLimitBody: "Tu as atteint ta limite de {{limit}} annonces ce mois-ci. Construis ta réputation en créant des Spots ou en finalisant des ventes pour augmenter ta limite.", + powAccepted: "Proof of work accepté !", + feePaid: "Frais payés !", + canCreateNow: "Tu peux maintenant créer ton annonce.", + whatDoTitle: "Que veux-tu faire ?", + sellGear: "VENDRE DU GEAR", + categoryTitle: "Catégorie *", + categoryHint: "Quel type de Gear ?", + detailsTitle: "Détails du Gear", + detailsWtbHint: "Décris ce que tu recherches", + detailsSellHint: "Parle de ton article aux acheteurs", + titleLabel: "Titre *", + titlePlaceholderWtb: "Recherche Deck 8.0\"", + titlePlaceholderSell: "Deck Palace 8.25\" presque neuf", + summaryLabel: "Résumé court", + summaryPlaceholderWtb: "N'importe quelle marque, graphismes sobres de préférence", + summaryPlaceholderSell: "Très bon état, à peine utilisé", + descriptionLabel: "Description", + descriptionPlaceholderWtb: "Décris exactement ce que tu recherches - marques préférées, état exigé, etc.", + descriptionPlaceholderSell: "J'ai eu ce Deck à Noël mais je préfère une taille plus petite. Avec plaisir de te le laisser essayer avant d'acheter !", + fulfilmentLabel: "Comment est-ce livré ?", + pickup: "Retrait", + pickupHint: "Rendez-vous en local", + ships: "Envoi", + shipsHint: "Par la poste", + both: "Les deux", + bothHint: "Au choix", + addressNote: "Nous ne collectons jamais ton adresse — pour l'envoi, partage-la en privé dans le chat de l'échange.", + postageLabel: "Qui paie les frais de port ?", + requireEscrow: "Exiger un escrow", + requireEscrowHint: "Demande à l'acheteur de régler via un escrow Cashu.", + postageBuyer: "L'acheteur paie", + postageSeller: "Je paie", + postageSplit: "Partagé", + sizeLabel: "Taille", + selectSize: "Sélectionner une taille", + truckHeight: "Hauteur de truck", + selectHeight: "Sélectionner une hauteur", + wheelHardness: "Dureté des wheels", + selectHardness: "Sélectionner une dureté", + pricingTitle: "Prix", + pricingWtbHint: "Comment veux-tu payer ?", + pricingSellHint: "Comment veux-tu vendre ?", + priceLabel: "Prix *", + currencyLabel: "Devise", + photosTitle: "Photos", + photosSellHint: "Au moins une photo est requise", + photosWtbHint: "Facultatif - ajoute des images de référence", + productPhoto: "Produit {{n}}", + upload: "Téléverser", + photosNote: "Ajoute jusqu'à 5 photos. La première image sera la photo principale.", + pickupLocationTitle: "Lieu de retrait", + pickupLocationHint: "Lie à un skate Spot pour des rendez-vous faciles", + searchSpots: "Rechercher des Spots...", + noSpotsFound: "Aucun Spot trouvé. Essaie une autre recherche.", + availabilityLabel: "Quand es-tu généralement disponible ?", + availabilityPlaceholder: "Week-ends 10h-14h, mardi/jeudi soir", + availabilityHint: "Aide les acheteurs à organiser des rendez-vous avec toi", + durationTitle: "Durée de l'annonce", + durationHint: "Combien de temps cette annonce doit-elle rester active ?", + publishing: "Publication...", + checkingEligibility: "Vérification de l'éligibilité...", + cooldownButton: "DÉLAI : {{time}}", + limitReachedButton: "LIMITE ATTEINTE", + payFeeButton: "PAYER LES FRAIS POUR CONTINUER", + postWtbButton: "PUBLIER LA RECHERCHE", + listForSaleButton: "METTRE LE GEAR EN VENTE", + }, + trades: { + title: "Mes échanges", + loginBody: "Connecte-toi pour gérer tes échanges sur la Marketplace et ta réputation.", + subtitle: "Confirmations, demandes et la réputation qu'elles construisent. Le paiement se règle avec l'autre skateur — l'app enregistre seulement l'accord.", + actionNeeded: "Action requise", + askedToConfirmSale: "t'a demandé de confirmer une vente", + recordedSale: "a enregistré une vente — confirme ton côté", + confirmSale: "Confirmer la vente", + confirm: "Confirmer", + nothingWaiting: "Rien ne t'attend pour le moment. 🛹", + yourRecords: "Tes enregistrements d'échanges", + noTrades: "Aucun échange pour le moment. Conclus un accord et confirme-le pour commencer à bâtir ta réputation.", + browseGearSwap: "Parcourir le Gear Swap", + roleSold: "Vendu", + roleBought: "Acheté", + roleTrade: "Échange", + with: "avec", + viewListing: "Voir l'annonce", + revoke: "Révoquer", + revokeTitle: "Révoquer cet enregistrement d'échange ?", + revokeBody: "Il cessera de compter pour ta réputation. L'autre partie conserve son propre témoignage. À utiliser pour un accord litigieux ou erroné.", + revokeNote: "Retiré par l'auteur.", + revoked: "Enregistrement d'échange révoqué", + revokedBody: "Il ne compte plus pour la réputation.", + revokeFailed: "Impossible de révoquer l'échange", + saleConfirmed: "Vente confirmée", + saleConfirmedBody: "Il peut maintenant confirmer son côté.", + saleConfirmFailed: "Impossible de confirmer la vente", + tradeConfirmed: "Échange confirmé", + tradeConfirmedBody: "Réputation mise à jour pour vous deux.", + tradeConfirmFailed: "Impossible de confirmer l'échange", + somethingWrong: "Une erreur est survenue.", + }, + card: { + listingDeleted: "Annonce supprimée", + listingRemoved: "Annonce retirée", + listingDeletedBody: "Ton annonce a été supprimée. Les relais qui honorent les suppressions cesseront de la servir.", + listingRemovedBody: "Cette annonce a été retirée et sera masquée dans tout SkateSpots.", + removeFailed: "Échec du retrait", + somethingWrong: "Une erreur est survenue", + markedSold: "Marquée comme vendue", + markedSoldBody: "Ton annonce est maintenant affichée comme vendue.", + couldNotUpdate: "Impossible de mettre à jour", + relisted: "Remise en ligne", + relistedBody: "Ton annonce est de nouveau active.", + listingOptions: "Options de l'annonce", + report: "Signaler", + removeAdmin: "Retirer (admin)", + postage: "frais de port", + newSeller: "Nouveau vendeur", + saleOne: "{{count}} vente", + saleMany: "{{count}} ventes", + iHaveThis: "Je l'ai !", + deleteTitle: "Supprimer « {{title}} » ?", + adminRemoveTitle: "Retirer cette annonce ? (admin)", + deleteBody: "Cela demande aux relais de retirer ton annonce « {{title}} ». C'est irréversible depuis ici — tu devrais en créer une nouvelle.", + adminRemoveBody: "En tant qu'admin SkateSpots, tu retires « {{title}} ». Elle sera masquée dans toute l'app pour tout le monde et une demande de suppression sera envoyée aux relais.", + deleting: "Suppression…", + removing: "Retrait…", + deleteListing: "Supprimer l'annonce", + removeListing: "Retirer l'annonce", + reportCount: "{{count}} signalement", + reports: "{{count}} signalements", + viewTitle: "Voir {{title}}", + reportListing: "Signaler l'annonce", + manageListing: "Gérer l'annonce", + trusted: "Fiable", + daysOld: "{{n}} j", + monthsOld: "{{n}} mois", + yearsOld: "{{n}} ans", + listingsCount: "{{count}} annonces", + postageBuyer: "frais de port : acheteur", + postageSeller: "frais de port : vendeur", + postageSplit: "frais de port : partagés", + powTitle: "Proof of work NIP-13 — anti-spam gratuit", + verifiedTradeOne: "{{count}} échange vérifié", + verifiedTrades: "{{count}} échanges vérifiés", + reportSubmitted: "Signalement envoyé", + reportSubmittedBody: "Merci d'aider à garder la Marketplace sûre.", + reportFailed: "Échec de l'envoi du signalement", + selectReason: "Sélectionne un motif", + reportDialogBody: "Aide à garder la Marketplace sûre en signalant les annonces inappropriées ou trompeuses.", + reasonLabel: "Motif du signalement *", + detailsLabel: "Détails supplémentaires (facultatif)", + detailsPlaceholder: "Fournis tout contexte supplémentaire qui pourrait aider...", + reportNote: "Les signalements sont publiés sur Nostr et aident la communauté à identifier les annonces problématiques. Les annonces avec plusieurs signalements peuvent être automatiquement masquées.", + submitting: "Envoi...", + submitReport: "Envoyer le signalement", + }, + tradeActions: { + tradeConfirmed: "Échange confirmé", + tradeConfirmedWithProof: "Un reçu vérifiable a été joint — cela compte pour les échanges vérifiés.", + tradeConfirmedBody: "Réputation mise à jour pour vous deux.", + tradeConfirmFailed: "Impossible de confirmer l'échange", + somethingWrong: "Une erreur est survenue.", + requestNote: "Merci de confirmer notre échange pour « {{title}} ».", + requestSent: "Confirmation demandée", + requestSentBody: "Le vendeur peut maintenant confirmer la vente et bâtir vos deux réputations.", + requestFailed: "Impossible d'envoyer la demande", + escrowRefunded: "Escrow remboursé", + escrowRefundedBody: "Les fonds sont de retour dans ton portefeuille Cashu.", + escrowRefundFailed: "Impossible de rembourser l'escrow", + confirmThisTrade: "Confirmer cet échange", + escrowAndRequest: "Escrow et demande", + shipsEscrowHint: "Échange expédié — utilise l'escrow pour qu'aucun côté n'expédie dans le vide. Partage ton adresse en privé dans le chat de l'échange, jamais ici.", + shipsHint: "Échange expédié — préfère l'escrow si le vendeur le propose, et partage ton adresse uniquement dans le chat.", + askSeller: "Demander au vendeur de confirmer", + waitingSeller: "Confirmation demandée — en attente du vendeur.", + refundEscrow: "Rembourser l'escrow", + buyWithSats: "Acheter en sats", + depositTitle: "Acompte de bonne foi (facultatif)", + payDeposit: "Payer l'acompte", + depositBefore: "Un échange n'a pas de facture, c'est donc ainsi qu'il obtient un", + verifiableCost: "coût vérifiable", + depositAfter: ". Remboursé à la livraison (ou utilise l'escrow Cashu pour un remboursement automatique). ⚠️ Prouve l'engagement, pas la livraison.", + depositPaid: "Acompte payé", + depositPaidBody: "Enregistré — il sera joint lorsque l'échange sera confirmé.", + paid: "Payé ⚡", + paidWithProof: "Reçu vérifiable enregistré — confirme l'échange pour qu'il compte.", + paidBody: "Demande au vendeur de confirmer l'échange pour qu'il compte pour vous deux.", + }, + offers: { + accepted: "Acceptée", + declined: "Refusée", + withdrawn: "Retirée", + open: "Ouverte", + noAmount: "sans montant", + titleOwner: "Offres ({{count}})", + titleBuyer: "Tes négociations", + you: "Toi", + them: "Eux", + paidAskConfirm: "Payé — demande au vendeur de confirmer l'échange.", + payWithSats: "Payer en sats", + accept: "Accepter", + decline: "Refuser", + counter: "Contre-offre", + counterPlaceholder: "Ta contre-offre (sats)", + send: "Envoyer", + counterItemPlaceholder: "…ou propose un article en échange (facultatif)", + waitingOn: "En attente de", + waitingOnSuffix: "— ton tour reviendra s'il fait une contre-offre.", + withdraw: "Retirer", + dmAccepted: "✅ Ton offre a été acceptée ! Écris pour organiser la remise.", + dmDeclined: "❌ Ton offre a été refusée.", + offerAccepted: "Offre acceptée", + offerDeclined: "Offre refusée", + respondFailed: "Impossible de répondre", + somethingWrong: "Une erreur est survenue.", + offerWithdrawn: "Offre retirée", + withdrawFailed: "Impossible de retirer", + enterAmountOrItem: "Saisis un montant ou un article à échanger", + counterDm: "Contre-offre", + counterSent: "Contre-offre envoyée", + counterSentBody: "C'est son tour maintenant.", + counterFailed: "Impossible d'envoyer la contre-offre", + }, + offer: { + validAmount: "Saisis un montant valide", + describeOffer: "Décris ton offre", + describeOfferBody: "Ajoute un montant, un article à échanger ou un message.", + dmAmount: " pour {{amount}} sats", + dmItem: " (offre : {{item}})", + dmBody: "🛹 Nouvelle offre sur ton annonce « {{title}} »{{amount}}{{item}}.{{note}}", + sent: "Offre envoyée", + sentBody: "{{sellerName}} peut l'accepter ou la refuser.", + sendFailed: "Impossible d'envoyer l'offre", + somethingWrong: "Une erreur est survenue.", + title: "Faire une offre", + description: "Propose des sats, ou un échange — {{sellerName}} peut accepter, refuser ou faire une contre-offre. Vous organisez la remise entre vous.", + amountLabel: "Montant (sats, facultatif)", + amountPlaceholder: "ex. 45000", + itemLabel: "Ou échanger un article (facultatif)", + itemPlaceholder: "ex. mon deck 8.25 + des wheels de rechange", + itemHint: "Un échange ? Mets ici ce que tu proposes — tu peux le combiner avec des sats.", + messageLabel: "Message (facultatif)", + messagePlaceholder: "Tout ce que le vendeur devrait savoir…", + send: "Envoyer l'offre", + }, + markSold: { + enterBuyer: "Saisis le npub de l'acheteur", + dealClosed: "Accord conclu 🎉", + dealClosedBody: "Annonce marquée vendue et l'échange a été publié pour la réputation.", + closeFailed: "Impossible de conclure l'accord", + somethingWrong: "Une erreur est survenue.", + title: "Conclure l'accord", + description: "Marque cette annonce comme vendue et enregistre une attestation d'échange signée pour toi et l'acheteur.", + buyerLabel: "npub de l'acheteur", + methodLabel: "Comment le paiement a-t-il été fait ? (auto-déclaré)", + amountLabel: "Montant en sats (facultatif)", + submit: "Marquer vendu", + }, + handoff: { + title: "Organiser la remise", + suggest: "Proposer un lieu et une heure", + suggestDm: "Salut ! J'aimerais acheter « {{title}} ». Propose un lieu et une heure pour se retrouver — avec plaisir de se voir dans un skate Spot public.", + orMeetAt: "Ou retrouvons-nous dans un Spot public proche :", + spotDm: "Salut ! J'aimerais acheter « {{title}} ». On se retrouve à {{spot}} ? {{url}}", + shareDelivery: "Partager les détails de livraison", + deliveryDm: "Salut ! J'aimerais acheter « {{title}} ». Voici mes détails de livraison :\n\nNom :\nAdresse :\n\n(Ne partage que ce dont le transporteur a besoin.)", + useLocker: "Utiliser un locker / point relais", + lockerDm: "Salut ! J'aimerais acheter « {{title}} ». Pourrait-on utiliser un locker / point relais plutôt qu'une adresse personnelle ?", + noteBefore: "Ces détails restent dans le chat privé — SkateSpots ne les voit jamais. Pour les échanges expédiés, préfère", + escrow: "l'escrow", + noteMiddle: ", et", + neverPay: "ne paie jamais en dehors des rails de l'app", + noteAfter: ". Retrouvez-vous dans un lieu public.", + }, + shipping: { + noCounterparty: "Pas encore de contrepartie", + noCounterpartyBody: "Le vendeur doit d'abord enregistrer la vente (en nommant l'acheteur).", + markedShipped: "Marqué comme expédié", + markedReceived: "Marqué comme reçu", + issueReported: "Problème signalé", + receivedBody: "Merci — cela ne libère pas l'escrow ; règle directement avec le vendeur.", + notifiedBody: "L'autre partie a été notifiée.", + updateFailed: "Impossible de mettre à jour", + somethingWrong: "Une erreur est survenue.", + title: "Expédition", + shipped: "expédié", + received: "reçu", + issue: "problème", + trackingPlaceholder: "Numéro de suivi (facultatif)", + iShipped: "Je l'ai expédié", + iReceived: "Je l'ai reçu", + reportIssue: "Signaler un problème", + noteBefore: "Auto-déclaré — une note logistique,", + notProof: "pas une preuve", + noteAfter: ". Marquer « reçu » ne libère pas l'escrow. ⚠️ Ne photographie pas un colis avec une adresse visible, et ne partage un numéro de suivi que si tu es à l'aise qu'il soit public.", + }, + pay: { + sent: "Paiement envoyé ⚡", + sentWithProof: "Reçu de paiement vérifiable enregistré — il comptera comme paiement vérifié.", + sentBody: "Préviens le vendeur — il peut confirmer l'échange pour qu'il compte pour vous deux.", + failed: "Échec du paiement", + title: "Payer en sats", + descSendPrefix: "Envoie", + descSendSuffix: "à {{sellerName}} pour régler cette transaction.", + descSettle: "Règle cette transaction directement avec {{sellerName}}.", + paid: "Payé !", + paidBody: "Demande au vendeur de confirmer l'échange — deux confirmations bâtissent vos deux réputations.", + noMethod: "{{sellerName}} n'a pas défini de moyen de paiement (pas de facture Lightning ni d'adresse). Écris-lui pour organiser le paiement.", + ownListing: "C'est ta propre annonce.", + paying: "Paiement…", + pay: "Payer", + payAmount: "Payer {{amount}} sats", + footnote: "Paie depuis ton portefeuille connecté (NWC, WebLN ou Cashu) directement à {{sellerName}} — SkateSpots ne détient jamais les fonds.", + }, + spamFee: { + invoiceComment: "Frais d'annonce SkateSpots", + generateFailed: "Échec de la génération de la facture", + paymentSuccess: "Paiement réussi !", + satsSent: "{{amount}} sats envoyés à {{name}}", + autoPayFailed: "Échec du paiement automatique", + autoPayFailedBody: "Paie manuellement avec le QR code ou la facture", + invoiceCopied: "Facture copiée !", + copyFailed: "Échec de la copie", + received: "Paiement reçu !", + receivedBody: "Tes {{amount}} sats de frais ont été payés. Tu peux maintenant créer ton annonce.", + title: "Frais d'annonce uniques", + subtitle: "En tant que nouveau membre, de petits frais sont requis pour ta première annonce.", + whyTitle: "Pourquoi dois-je payer ?", + spamLabel: "Prévention du spam :", + spamBody: "Ces frais empêchent les bots et les arnaqueurs d'inonder la Marketplace de fausses annonces.", + trustLabel: "Construction de la confiance :", + trustBody: "Les nouveaux comptes doivent prouver leur engagement avant de publier. Après quelques annonces réussies, ces frais sont abandonnés.", + supportsLabel: "Soutient la communauté :", + supportsPrefix: "Les frais vont à", + supportsSpotOwner: " — la personne qui a créé ce Spot !", + supportsPlatform: " — pour aider à faire tourner SkateSpots.", + oneTimeFee: "~{{usd}} $ US • Frais uniques", + payToContinue: "Payer {{amount}} sats pour continuer", + proveWork: "Prouve ton travail à la place — gratuit", + proveWorkBody: "Consacre quelques secondes de CPU au lieu de {{amount}} sats. Pas d'argent, pas de portefeuille — une taxe anti-spam, pas un paiement.", + generating: "Génération de la facture...", + processing: "Traitement du paiement...", + qrAlt: "QR code de paiement", + copyInvoice: "Copier la facture", + openWallet: "Ouvrir le portefeuille", + payWithWallet: "Payer avec le portefeuille connecté", + scanHint: "Scanne le QR code avec un portefeuille Lightning ou utilise les boutons ci-dessus", + skipTitle: "Comment éviter ces frais à l'avenir :", + skip1: "Ajoute un skate Spot à la carte", + skip2: "Finalise 2-3 annonces réussies", + skip3: "Développe ta réputation dans la communauté", + skipNote: "Les membres fiables obtiennent des annonces gratuites illimitées !", + }, + reputation: { + highlyTrusted: "Trader hautement fiable", + building: "Réputation en construction", + newTrader: "Nouveau trader", + title: "Échanges", + verified: "Vérifié", + sales: "Ventes", + purchases: "Achats", + tradeConfirmedOne: "échange confirmé mutuellement", + tradeConfirmedMany: "échanges confirmés mutuellement", + with: "avec", + personOne: "personne", + personMany: "personnes", + awaiting: "En attente de confirmation mutuelle", + withPaymentProof: "avec une preuve de paiement jointe", + selfReported: "(auto-déclaré — non vérifié)", + paymentVerified: "paiement vérifié", + zapReceipt: "(reçu de zap)", + singlePartnerWarning: "Toutes les confirmations viennent du même compte. La confirmation mutuelle est auto-déclarée, alors traite cet enregistrement avec prudence.", + lowDiversityWarning: "La plupart des confirmations viennent de très peu de comptes. Un petit groupe qui se cautionne mutuellement peut sembler actif — traite cet enregistrement avec prudence.", + ringWarning: "Ces comptes échangent principalement entre eux — un groupe fermé. La confirmation mutuelle au sein d'un réseau fermé est une preuve faible.", + weighted: "Pondéré par la confiance et l'activité", + footnote: "Auto-déclaré et signé mutuellement — un signal, pas une preuve de paiement.", + }, + reputationPanel: { + reviewOfYou: "Avis sur toi", + yourRecord: "ton bilan", + listing: "Annonce", + averageOne: "moyenne sur {{count}} évaluation", + averageMany: "moyenne sur {{count}} évaluations", + reviewsTitle: "Avis et historiques d'échanges", + fromOthers: "{{count}} d'autres", + emptyBefore: "Aucun historique d'échange pour le moment. Conclus un accord et confirme-le dans", + emptyAfter: "— chaque confirmation devient un avis sur les deux profils.", + }, + recommendations: { + published: "Recommandation publiée", + publishedBody: "Merci pour ton cautionnement.", + failed: "Impossible de recommander", + somethingWrong: "Une erreur est survenue.", + title: "Trader fiable", + recommendedBy: "Recommandé par", + skaterOne: "skateur", + skaterMany: "skateurs", + none: "Aucune recommandation pour le moment.", + youRecommend: "Tu recommandes ce trader ✓", + recommend: "Recommander comme trader fiable", + }, + notification: { + newOffer: "Nouvelle offre", + counterOffer: "Contre-offre", + offerAccepted: "Offre acceptée", + offerDeclined: "Offre refusée", + offerWithdrawn: "Offre retirée", + confirmTrade: "Confirmer un échange", + tradeConfirmed: "Échange confirmé", + reviewOffer: "Examiner l'offre", + openListing: "Ouvrir l'annonce", + }, + confirmRow: { + rateTrade: "Note l'échange :", + }, + deckRating: { + title: "{{value}}/10 decks", + aria: "{{n}} sur 10", + }, + clink: { + tip: "Zapper en Bitcoin", + copiedBody: "Code CLINK copié dans le presse-papiers.", + copyFailed: "Échec de la copie", + copyFailedBody: "Impossible d'accéder au presse-papiers.", + whatIs: "Qu'est-ce que CLINK ?", + tooltipTitle: "Paie directement en Bitcoin via Nostr", + tooltipBody: "CLINK est un code de paiement auto-conservé — pas de compte, pas d'intermédiaire. Scanne-le avec un portefeuille Lightning compatible et le zap lui parvient directement.", + descRecipient: "Envoie un paiement Bitcoin (Lightning) auto-conservé à {{recipientName}} — sans intermédiaire.", + descGeneric: "Envoie un paiement Bitcoin (Lightning) auto-conservé via Nostr — sans intermédiaire.", + qrAlt: "QR code de l'offre CLINK", + copyCode: "Copier le code CLINK", + openWallet: "Ouvrir dans un portefeuille CLINK", + copyToWallet: "Copier le code pour ton portefeuille", + priceFixed: "Fixe — {{amount}} sats", + priceFixedShort: "Prix fixe", + priceVariable: "Prix variable", + priceVariableCurrency: "Libellé en {{currency}}", + priceSpontaneous: "Tu choisis le montant", + footnote: "Scanne avec un portefeuille compatible CLINK (ex. ShockWallet). Si rien ne s'ouvre, copie le code ci-dessus — tu n'as peut-être pas de portefeuille compatible CLINK installé. Pas de dépositaire, pas de serveur web : la facture est demandée directement via Nostr.", + }, + paymentReadiness: { + ready: "Tu peux être payé", + notReady: "Configure les paiements pour être payé", + readyBefore: "Ton adresse Lightning", + readyAfter: "est sur ton profil — les gens peuvent te zapper et te payer directement.", + silentSet: " Une adresse Bitcoin Silent Payment est aussi configurée.", + notReadyBefore: "Ajoute une adresse Lightning (et éventuellement une adresse Bitcoin Silent Payment) à ton", + nostrProfile: "profil Nostr", + notReadyAfter: "pour que les skateurs puissent te payer. Ça se configure une fois et fonctionne sur tous tes profils ici.", + }, + seller: { + trade: "Échange", + active: "Actif", + markSold: "Marquer vendu", + yourListings: "Tes annonces", + activeCount: "{{count}} actives", + listItem: "Mettre un article en vente", + loading: "Chargement de tes annonces…", + empty: "Tu n'as encore aucune annonce.", + listFirst: "Mets ton premier article en vente", + }, + noffer: { + label: "Code d'offre CLINK", + optional: "(facultatif, avancé)", + offerId: "Offre : {{id}}", + relay: "Relay : {{relay}}", + invalidBefore: "Cela ne ressemble pas à un code", + invalidAfter: "valide.", + valid: "Code CLINK valide — un bouton « Payer via CLINK » apparaîtra sur ton profil.", + help: "Colle un code de paiement CLINK auto-conservé (ex. depuis ShockWallet / Lightning.Pub) pour accepter des paiements Lightning natifs Nostr — sans serveur web ni dépositaire.", + learnSpecs: "En savoir plus sur les specs", + }, + escrowPanel: { + escrowed: "{{amount}} sats sous escrow", + mint: "Mint", + refundSinceBefore: "L'acheteur peut se faire rembourser depuis le", + redeemBefore: "Le vendeur peut encaisser maintenant · l'acheteur est remboursé après le", + noExpiry: "Aucune expiration définie sur ce token.", + }, + escrowRequest: { + enterAmount: "Saisis un montant d'escrow", + minLock: "Bloque pendant au moins {{days}} jour", + requestNote: "{{amount}} sats sous escrow pour notre échange — merci de confirmer la vente.", + created: "Escrow créé 🎉", + createdBody: "{{amount}} sats bloqués pendant {{days}} jours. {{sellerName}} peut encaisser à la livraison.", + createFailed: "Impossible de créer l'escrow", + somethingWrong: "Une erreur est survenue.", + title: "Mettre cet échange sous escrow", + description: "Les fonds sont bloqués pour {{sellerName}} et remboursables par toi si l'accord échoue après la date limite. Nécessite un portefeuille Lightning connecté.", + amountLabel: "Montant (sats)", + daysLabel: "Remboursement acheteur après (jours)", + daysHint: "Après ce nombre de jours, tu peux récupérer les fonds si le vendeur n'a pas livré.", + nativeOnly: "L'escrow Cashu est disponible uniquement dans l'app SkateSpots (pas la version web).", + lockAndRequest: "Bloquer et demander", + }, + }, + labOptions: { + coach: { + skill: { + basics: "Bases", + ollies: "Ollies", + kickflips: "Kickflips", + grinds: "Grinds et Slides", + manuals: "Manuals", + inverts: "Inverts", + vert: "Vert/Ramp", + bowl: "Bowl", + street: "Street", + freestyle: "Freestyle", + safety: "Sécurité", + diy: "Modules de skate DIY", + }, + skillDesc: { + basics: "Pousser, position, équilibre, virages", + ollies: "Ollie et variantes (nollie, fakie)", + kickflips: "Kickflip, heelflip et variantes", + grinds: "50-50, 5-0, boardslide, et plus", + manuals: "Manual, nose manual, combos", + inverts: "Invert, handplant, eggplant, andrecht", + vert: "Half-pipe, quarter-pipe, drop-ins", + bowl: "Carving en bowl, pumping, lignes", + street: "Obstacles de street et créativité", + freestyle: "Figures en flat et flow", + safety: "Comment tomber, équipement de protection, prévention des blessures", + diy: "Construire des rampes, rails, ledges et autres obstacles de skate", + }, + }, + filmer: { + service: { + miniclips: "Mini Clips", + longparts: "Parties vidéo longues", + koth: "Style King of the Road", + documentaries: "Documentaires", + contests: "Tournage pour contests", + raw: "Rushes bruts", + followlines: "Tournage follow / ligne", + lines: "Tournage de lignes et B-roll", + }, + serviceDesc: { + miniclips: "Clips de 15-60 s pour les réseaux sociaux", + longparts: "Parties vidéo complètes de 3-10 min avec musique", + koth: "Vidéos de skate style aventure/défi", + documentaries: "Contenu sur la culture skate et histoires", + contests: "Couverture professionnelle de contests et compétitions", + raw: "Rushes multi-angles non montés", + followlines: "Follow-cam fisheye pour les lignes", + lines: "Lignes au long objectif et b-roll cinématographique", + }, + skill: { + vx1000: "VX1000", + hvx: "HVX / HPX", + cinema: "Caméra cinéma", + dslr: "DSLR / Hybride", + actioncam: "GoPro / Caméra d'action", + phone: "Tournage au téléphone", + drone: "Drone / Aérien", + gimbal: "Gimbal / Stabilisateur", + fisheye: "Objectif fisheye", + longlens: "Long objectif", + "4k": "4K / Haute cadence", + editing: "Montage vidéo", + color: "Étalonnage couleur", + }, + skillDesc: { + vx1000: "Esthétique skate classique du VX1000", + hvx: "Look SD/HD du Panasonic HVX/HPX", + cinema: "Caméra cinéma (FX3, série C, RED, BMPCC)", + dslr: "Appareil DSLR ou hybride de haute qualité", + actioncam: "POV et fixations GoPro / caméra d'action", + phone: "Tournage mobile avec smartphones modernes", + drone: "Images aériennes et de drone", + gimbal: "Mouvement stabilisé au gimbal", + fisheye: "Plans au fisheye grand-angle", + longlens: "Long objectif pour des plans détaillés", + "4k": "Résolution 4K et ralenti haute cadence", + editing: "Montage vidéo professionnel et post-production", + color: "Correction et étalonnage couleur", + }, + }, + editor: { + service: { + parts: "Parties vidéo", + montages: "Montages", + reels: "Reels / Clips courts", + documentaries: "Documentaires", + contest: "Montages de contests", + brand: "Vidéos de marque / promo", + motion: "Motion design", + colorgrade: "Étalonnage couleur uniquement", + }, + serviceDesc: { + parts: "Parties vidéo de skate complètes avec bande-son", + montages: "Montages compilation à partir de rushes", + reels: "Clips et reels de 15–60 s pour les réseaux", + documentaries: "Films de culture skate portés par une histoire", + contest: "Montages récap pour contests et Events", + brand: "Contenu promotionnel pour marques et Shops", + motion: "Titres, transitions, effets et graphismes", + colorgrade: "Correction couleur et étalonnage via LUT", + }, + skill: { + premiere: "Adobe Premiere", + resolve: "DaVinci Resolve", + finalcut: "Final Cut Pro", + aftereffects: "After Effects", + luts: "LUT personnalisées", + vhs: "Esthétique VHS / rétro", + "4k": "Workflows 4K et RAW", + sound: "Sound design / mixage", + }, + skillDesc: { + premiere: "Montage sur Adobe Premiere Pro", + resolve: "Montage et étalonnage sur DaVinci Resolve", + finalcut: "Montage sur Final Cut Pro", + aftereffects: "Motion design et compositing", + luts: "Développement de looks couleur personnalisés", + vhs: "Glitch VHS, super-8, looks de film rétro", + "4k": "Workflows caméra RAW/LOG haute résolution", + sound: "Synchro musique, SFX, mastering audio", + }, + }, + photo: { + service: { + action: "Action / Photos de figures", + sequence: "Séquences", + portraits: "Portraits", + editorial: "Éditorial / Magazine", + product: "Photo produit / Shop", + events: "Couverture d'Events", + lifestyle: "Lifestyle / Documentaire", + prints: "Tirages et fanzines", + }, + serviceDesc: { + action: "Photos au pic de l'action des figures et lignes", + sequence: "Séquences de figures en plusieurs images", + portraits: "Portraits de riders et photos d'équipe", + editorial: "Doubles pages éditoriales prêtes pour magazine", + product: "Photographie de Decks, Gear et produits de Shop", + events: "Couverture de contests, jams et premières", + lifestyle: "Making-of et documentaire culturel", + prints: "Tirages physiques, fanzines et livres photo", + }, + camera: { + dslr: "DSLR", + mirrorless: "Hybride", + medium: "Format moyen", + film35: "Film 35 mm", + filmmedium: "Film format moyen", + point: "Compact", + phone: "Téléphone", + }, + lens: { + fisheye: "Fisheye", + wide: "Grand-angle", + standard: "Standard / Fixe", + telephoto: "Téléobjectif / Long objectif", + macro: "Macro", + zoom: "Zoom", + }, + lighting: { + strobes: "Flashs de studio", + speedlights: "Flashs cobra", + profoto: "Profoto", + elinchrom: "Elinchrom", + godox: "Godox", + triggers: "Déclencheurs à distance", + continuous: "Continu / LED", + reflectors: "Réflecteurs / Diffuseurs", + naturallight: "Lumière naturelle uniquement", + }, + support: { + tripod: "Trépied", + monopod: "Monopode", + lightstands: "Pieds d'éclairage", + gimbal: "Gimbal", + bag: "Rig mobile / Sac", + laptop: "Tethering sur place", + }, + style: { + flashfisheye: "Fisheye au flash", + natural: "Lumière naturelle", + bw: "Noir et blanc", + film: "Esthétique argentique", + longlens: "Long objectif", + studio: "Studio / Éclairé", + street: "Street / Documentaire", + }, + }, + builder: { + service: { + diy: "Spots DIY", + concrete: "Parcs en béton", + wood: "Rampes en bois", + bowls: "Bowls et piscines", + transitions: "Transitions et quarters", + rails: "Rails et ledges", + boxes: "Manny pads et boxes", + minis: "Mini rampes", + pumptrack: "Pump tracks", + foam: "Fosses en mousse / Indoor", + repairs: "Réparations et resurfaçage", + design: "Conception et conseil", + }, + serviceDesc: { + diy: "Spots DIY communautaires et constructions sauvages", + concrete: "Skateparks et modules en béton coulé", + wood: "Rampes, launch boxes et obstacles en bois", + bowls: "Bowls, piscines et deep transition", + transitions: "Quarterpipes, banks et transitions", + rails: "Rails en acier, ledges et modules de grind", + boxes: "Manny pads, funboxes et modules de street", + minis: "Mini rampes et installations de jardin", + pumptrack: "Pump tracks et lignes de flow", + foam: "Fosses en mousse, resi et modules d'entraînement indoor", + repairs: "Réparation, rapiéçage et resurfaçage des spots existants", + design: "Plans, dessins et conseil de construction", + }, + skill: { + concretework: "Béton / Projeté", + welding: "Soudure / Fabrication acier", + carpentry: "Charpente / Bois", + formwork: "Coffrage et ferraillage", + masonry: "Maçonnerie / Parpaing", + coping: "Coping (piscine / acier)", + surfacing: "Skatelite / Revêtement", + earthworks: "Terrassement / Excavation", + }, + scale: { + backyard: "Jardin / Mini", + diycommunity: "DIY communautaire", + publicpark: "Parc public complet", + indoor: "Installation indoor", + event: "Parcours d'Event / contest", + }, + }, + artist: { + service: { + boardart: "Graphismes de board", + logos: "Logos et branding", + posters: "Affiches et flyers", + merch: "Merch et vêtements", + zines: "Fanzines et print", + illustration: "Illustration", + stickers: "Stickers et décalques", + webdesign: "Web / Digital", + typography: "Typographie / Lettering", + animation: "Animation / Motion", + }, + serviceDesc: { + boardart: "Graphismes de Deck et art sur griptape", + logos: "Identité de marque, logos et wordmarks", + posters: "Affiches d'Events, flyers et art de concert", + merch: "Graphismes de t-shirts, hoodies et vêtements", + zines: "Fanzines, éditorial et mise en page print", + illustration: "Illustration personnalisée et création de personnages", + stickers: "Packs de stickers, décalques et slaps", + webdesign: "Sites web, digital et UI", + typography: "Lettering à la main et typographie personnalisée", + animation: "Motion design et animation", + }, + medium: { + digital: "Digital / Vectoriel", + handdrawn: "Dessin à la main", + screenprint: "Sérigraphie", + paint: "Peinture / Acrylique", + collage: "Collage / Mixte", + photo: "Photo / Photoshop", + "3d": "3D / Rendu", + }, + tool: { + illustrator: "Adobe Illustrator", + photoshop: "Adobe Photoshop", + procreate: "Procreate", + affinity: "Affinity", + figma: "Figma", + blender: "Blender", + aftereffects: "After Effects", + clipstudio: "Clip Studio", + }, + }, + graffiti: { + style: { + throwups: "Throw-ups", + pieces: "Pieces / Burners", + murals: "Murales", + characters: "Personnages", + lettering: "Lettering / Wildstyle", + stencil: "Pochoir", + handstyles: "Handstyles / Tags", + "3dstyle": "Style 3D", + abstract: "Abstrait", + }, + styleDesc: { + throwups: "Remplissages rapides en deux couleurs", + pieces: "Pieces et burners en couleurs", + murals: "Murales et productions grand format", + characters: "Personnages et figures", + lettering: "Wildstyle et structure des lettres", + stencil: "Pochoir et street art", + handstyles: "Tags et handstyles", + "3dstyle": "Lettrage 3D et anamorphique", + abstract: "Abstrait et freestyle", + }, + medium: { + spray: "Bombes aérosol", + rollers: "Rouleaux / Emulsion", + markers: "Marqueurs / Encres", + brush: "Pinceau / Peinture", + digital: "Digital / Procreate", + }, + context: { + legalwalls: "Murs légaux", + commissions: "Commandes", + liveart: "Peinture en direct", + skateparks: "Murales de skatepark", + interiors: "Intérieurs / Shops", + workshops: "Ateliers", + }, + }, + tattoo: { + style: { + traditional: "Traditionnel / Old School", + neotraditional: "Néo-traditionnel", + fineline: "Fine line", + blackwork: "Blackwork", + realism: "Réalisme", + lettering: "Lettering / Script", + illustrative: "Illustratif", + skateflash: "Flash skate", + ignorant: "Style ignorant / handpoke", + japanese: "Japonais / Irezumi", + }, + styleDesc: { + traditional: "Traits gras, Americana classique", + neotraditional: "Traditionnel avec des détails modernes", + fineline: "Travail délicat à l'aiguille unique", + blackwork: "Noir massif et motifs", + realism: "Photoréaliste et portraits", + lettering: "Script, lettering et citations", + illustrative: "Illustratif et graphique", + skateflash: "Motifs flash de la culture skate", + ignorant: "Style ignorant / naïf handpoke", + japanese: "Traditionnel japonais / irezumi", + }, + method: { + machine: "Machine", + handpoke: "Hand-poke / Stick & Poke", + flash: "Flash disponible", + custom: "Motifs personnalisés", + coverup: "Cover-ups", + }, + }, + trainer: { + focus: { + strength: "Force et conditionnement", + mobility: "Mobilité et souplesse", + injuryprevention: "Prévention des blessures", + rehab: "Rééducation / Kiné", + recovery: "Récupération et bodywork", + balance: "Équilibre et stabilité", + cardio: "Cardio / Endurance", + nutrition: "Conseils nutrition", + }, + focusDesc: { + strength: "Développer force et puissance pour le skate", + mobility: "Amplitude articulaire et souplesse", + injuryprevention: "Préhabilitation et réduction du risque de blessure", + rehab: "Kinésithérapie et rééducation après blessure", + recovery: "Massage, bodywork et récupération", + balance: "Proprioception, équilibre et stabilité", + cardio: "Conditionnement et endurance", + nutrition: "Conseils d'alimentation et de nutrition", + }, + injury: { + ankles: "Chevilles", + knees: "Genoux", + wrists: "Poignets", + hips: "Hanches", + back: "Dos / Colonne", + shoulders: "Épaules", + heelbruise: "Contusions au talon", + concussion: "Protocole de commotion", + }, + credential: { + physio: "Kinésithérapeute diplômé", + osteo: "Ostéopathe", + certtrainer: "Entraîneur certifié", + sportstherapist: "Thérapeute du sport", + massage: "Masseur", + inperson: "En personne", + remote: "À distance / En ligne", + }, + }, + musician: { + genre: { + punk: "Punk", + hardcore: "Hardcore", + metal: "Metal", + rock: "Rock", + indie: "Indie / Alt", + hiphop: "Hip-Hop / Rap", + electronic: "Électronique", + lofi: "Lo-Fi / Beats", + reggae: "Reggae / Dub", + ska: "Ska", + jazz: "Jazz", + funk: "Funk / Soul", + flamenco: "Flamenco", + folk: "Folk / Acoustique", + experimental: "Expérimental", + grunge: "Grunge", + }, + instrument: { + vocals: "Chant", + guitar: "Guitare", + bass: "Basse", + drums: "Batterie", + keys: "Claviers / Synthé", + dj: "DJ / Platines", + producer: "Producteur / Beats", + sax: "Sax / Cuivres", + strings: "Cordes", + other: "Autre", + }, + act: { + solo: "Artiste solo", + band: "Groupe", + dj: "DJ", + producer: "Producteur", + collective: "Collectif", + }, + }, + judge: { + format: { + game_of_skate: "Game of S.K.A.T.E.", + best_trick: "Best Trick", + jam: "Format Jam", + contest: "Contest / Comp", + street_league: "Style Street League", + bowl: "Bowl / Vert", + mini_ramp: "Mini Ramp", + park: "Park", + street: "Street", + freestyle: "Freestyle", + world_tour: "World Destruction Tour", + am_series: "Am Series / Qualifs", + local_jam: "Jam local / Grassroots", + online: "Contest en ligne / IG", + }, + specialty: { + head_judge: "Juge principal", + scoring: "Notation / Dépouillement", + mc: "MC / Annonceur", + format_design: "Conception de format", + rules: "Règlement / Arbitrage", + brackets: "Brackets / Séries", + livestream: "Jugement en livestream", + am_scout: "Repérage Am", + }, + level: { + local: "Local", + regional: "Régional", + national: "National", + international: "International", + pro: "Circuit pro", + }, + }, + organizer: { + event: { + street_jam: "Street Jam", + best_trick: "Best Trick", + game_of_skate: "Game of S.K.A.T.E.", + contest: "Contest / Comp", + bowl: "Bowl / Vert", + mini_ramp: "Mini Ramp", + park: "Session park", + demo: "Démo pro", + clinic: "Clinic / Atelier", + meetup: "Meetup / Cruise", + downhill: "Descente / Course", + slalom: "Slalom", + kids: "Enfants / Jeunes", + charity: "Caritatif / Collecte", + tour_stop: "Étape de Tour", + premiere: "Première vidéo", + market: "Marché / Expo d'art", + }, + service: { + organizing: "Organisation complète", + hosting: "Animation / MC", + permits: "Permis et autorités", + sponsorship: "Sponsoring / Accords de marque", + promotion: "Promotion et marketing", + livestream: "Livestream / Couverture", + sound: "Son et musique", + ramps: "Rampes et obstacles", + safety: "Sécurité et premiers secours", + vendors: "Restauration et stands", + media: "Couverture photo / vidéo", + registration: "Inscriptions et brackets", + }, + scale: { + grassroots: "Grassroots", + local: "Local", + regional: "Régional", + national: "National", + international: "International", + pro: "Circuit pro", + }, + }, + barber: { + service: { + haircut: "Coupe de cheveux", + fade: "Fade", + beard: "Taille de barbe", + lineup: "Line-up / Contours", + colour: "Coloration et teinture", + kids: "Coupes enfants", + }, + serviceDesc: { + haircut: "Une coupe classique — tondeuse et ciseaux.", + fade: "Un fade dégradé — bas, moyen ou haut.", + beard: "Taille, dessin et entretien de la barbe.", + lineup: "Contours nets autour de la ligne de cheveux et de la nuque.", + colour: "Couleur, décoloration, teinture et toning.", + kids: "Des coupes patientes pour les plus jeunes skateurs.", + }, + style: { + skin_fade: "Skin Fade", + taper: "Taper", + buzz: "Coupe rasée", + mohawk: "Crête", + mullet: "Mulet", + curly: "Boucles / Afro", + long: "Cheveux longs / Dégradé", + classic: "Coupe classique aux ciseaux", + }, + setting: { + shop: "Shop / Barber", + mobile: "À domicile / Déplacements", + event: "Events et contests de skate", + }, + }, + tour: { + skill: { + beginner: { + label: "Débutant", + description: "Nouveau en skate ou figures de base", + }, + intermediate: { + label: "Intermédiaire", + description: "À l'aise sur la plupart des terrains", + }, + advanced: { + label: "Avancé", + description: "Skateur expérimenté, spots costauds", + }, + all: { + label: "Tous niveaux", + description: "Convient à tout le monde", + }, + }, + }, + }, +}; export default frBatch6; diff --git a/src/i18n/fr/batch7.ts b/src/i18n/fr/batch7.ts index 992c711..76bb661 100644 --- a/src/i18n/fr/batch7.ts +++ b/src/i18n/fr/batch7.ts @@ -1,4 +1,908 @@ -/** fr — batch 7. Filled by the translation pass; empty until then. */ -const frBatch7 = {}; +/** fr — batch 7. Translated from the English source. */ +const frBatch7 = { + events: { + title: 'Événements de skate', + createEvent: 'Créer un événement', + editEvent: 'Modifier l’événement', + eventDetails: 'Détails de l’événement', + eventName: 'Nom de l’événement', + eventType: 'Type d’événement', + date: 'Date', + time: 'Heure', + startDate: 'Date de début', + endDate: 'Date de fin', + venue: 'Lieu', + organizer: 'Organisateur', + attendees: 'Participants', + going: 'Participe', + interested: 'Intéressé', + rsvp: 'RSVP', + ticketPrice: 'Prix du billet', + freeEntry: 'Entrée gratuite', + register: 'S’inscrire', + moreInfo: 'Plus d’infos', + upcomingEvents: 'À venir', + pastEvents: 'Passés', + noEvents: 'Aucun événement trouvé', + findEvents: 'Trouve des contests, démos, sessions et plus', + searchPlaceholder: 'Rechercher des événements...', + loginToCreate: 'Connecte-toi pour créer des événements', + noEventsMatch: 'Aucun événement à venir ne correspond à tes filtres.', + noUpcoming: 'Aucun événement à venir trouvé.', + noPast: 'Aucun événement passé trouvé.', + types: { + contest: 'Contest', + session: 'Session', + meetup: 'Rencontre', + premiere: 'Première vidéo', + workshop: 'Atelier', + demo: 'Démo', + jam: 'Jam', + }, + }, + wallet: { + title: 'Portefeuille', + balance: 'Solde', + send: 'Envoyer', + receive: 'Recevoir', + transactions: 'Transactions', + history: 'Historique', + noTransactions: 'Aucune transaction pour le moment', + sendSats: 'Envoyer des sats', + receiveSats: 'Recevoir des sats', + amount: 'Montant', + recipient: 'Destinataire', + lightning: 'Lightning', + onChain: 'On-chain', + invoice: 'Facture', + address: 'Adresse', + scanQR: 'Scanner le QR', + paste: 'Coller', + payInvoice: 'Payer la facture', + createInvoice: 'Créer une facture', + copied: 'Copié dans le presse-papiers !', + insufficientFunds: 'Fonds insuffisants', + paymentSent: 'Paiement envoyé !', + paymentReceived: 'Paiement reçu !', + cashu: { + title: 'Portefeuille Cashu', + tokens: 'Jetons', + mint: 'Mint', + mints: 'Mints', + manageMints: 'Gérer les mints', + addMint: 'Ajouter un mint', + removeMint: 'Supprimer le mint', + defaultMint: 'Mint par défaut', + backup: 'Sauvegarde', + restore: 'Restaurer', + recoveryPhrase: 'Phrase de récupération', + viewRecoveryPhrase: 'Voir la phrase de récupération', + seedWarning: 'C’est comme ton nsec Nostr - garde-le secret et sauvegardé !', + }, + }, + spots: { + addSpot: 'Ajouter un Spot', + editSpot: 'Modifier le Spot', + spotDetails: 'Détails du Spot', + spotName: 'Nom du Spot', + spotType: 'Type de Spot', + description: 'Description', + location: 'Emplacement', + address: 'Adresse', + photos: 'Photos', + addPhotos: 'Ajouter des photos', + obstacles: 'Obstacles', + features: 'Caractéristiques', + bustLevel: 'Niveau de risque', + bestTime: 'Meilleur moment', + tips: 'Astuces', + reviews: 'Avis', + addReview: 'Ajouter un avis', + reportSpot: 'Signaler le Spot', + directions: 'Itinéraire', + shareSpot: 'Partager le Spot', + createdBy: 'Créé par', + lastUpdated: 'Dernière mise à jour', + types: { + park: 'Skatepark', + street: 'Spot de rue', + diy: 'Spot DIY', + plaza: 'Plaza', + indoor: 'Intérieur', + bowl: 'Bowl', + vert: 'Vert', + miniramp: 'Mini Ramp', + }, + bustLevels: { + chill: 'Tranquille', + moderate: 'Modéré', + sketchy: 'Sketchy', + heavy: 'Intense', + }, + }, + settings: { + title: 'Paramètres', + profile: 'Profil', + editProfile: 'Modifier le profil', + account: 'Compte', + security: 'Sécurité', + relays: 'Relays', + appearance: 'Apparence', + language: 'Langue', + notifications: 'Notifications', + privacy: 'Confidentialité', + about: 'À propos', + help: 'Aide', + feedback: 'Retours', + version: 'Version', + displayName: 'Nom affiché', + username: 'Nom d’utilisateur', + bio: 'Bio', + website: 'Site web', + lightningAddress: 'Adresse Lightning', + profilePicture: 'Photo de profil', + banner: 'Bannière', + saveProfile: 'Enregistrer le profil', + backupKeys: 'Sauvegarder les clés', + exportKeys: 'Exporter les clés', + secretKey: 'Clé secrète', + publicKey: 'Clé publique', + showSecretKey: 'Afficher la clé secrète', + hideSecretKey: 'Masquer la clé secrète', + copyKey: 'Copier la clé', + keysBackedUp: 'Tu as confirmé que tes clés sont bien sauvegardées.', + keysNotBackedUp: 'Assure-toi de sauvegarder ta phrase de récupération ou ta clé secrète !', + selectLanguage: 'Choisir la langue', + english: 'Anglais', + spanish: 'Espagnol', + }, + createSpot: { + title: 'Ajouter un Spot de skate', + subtitle: 'Partage un spot de skate avec la communauté', + backToMap: 'Retour à la carte', + namePlaceholder: 'ex. : Hollywood High School', + descriptionPlaceholder: 'Décris le spot, les obstacles, les meilleurs moments pour skater, les infos de sécurité, etc.', + addressPlaceholder: 'ex. : 1521 N Highland Ave, Los Angeles, CA', + selectType: 'Choisir le type de Spot', + selectBustLevel: 'Choisir le niveau de risque', + uploadPhotos: 'Importer', + dragDrop: 'Glisse-dépose ou clique pour importer', + maxPhotos: '5 photos max', + publishing: 'Publication...', + success: 'Spot publié avec succès !', + error: 'Échec de la publication du Spot', + locationRequired: 'Sélectionne un emplacement sur la carte', + useCurrentLocation: 'Utiliser ma position actuelle', + pickOnMap: 'Choisir l’emplacement sur la carte', + loginToAdd: 'Tu dois te connecter pour ajouter un spot de skate.', + locationLabel: 'Emplacement', + tapToPlace: 'Touche la carte pour placer l’épingle, ou glisse-la pour affiner.', + manualCoords: 'Saisir les coordonnées manuellement', + moreDetails: 'Plus de détails (facultatif)', + photoHint: 'une photo est requise pour publier', + nameRequired: 'Saisis un nom pour ce Spot.', + descriptionRequired: 'Décris ce Spot.', + addressRequired: 'Ajoute une adresse ou un nom de quartier.', + photoRequired: 'Ajoute au moins une photo.', + draftTitle: 'Tu as un brouillon non enregistré', + draftBody: 'Reprends là où tu t’es arrêté, ou supprime-le.', + draftResume: 'Reprendre', + draftDiscard: 'Supprimer le brouillon', + requiredFields: 'Parle-nous de ce Spot. Tous les champs marqués d’un * sont obligatoires.', + coordinates: 'Coordonnées', + latitudePlaceholder: 'Latitude (ex. : 34.1012)', + longitudePlaceholder: 'Longitude (ex. : -118.3389)', + gettingLocation: 'Localisation en cours...', + accessType: 'Type d’accès', + publicTitle: 'Public - Ouvert à tous', + publicDesc: 'Skateparks, places publiques, spots de rue', + privateTitle: 'Propriété privée - Autorisation nécessaire', + privateDesc: 'Ramps de jardin, terrain privé, spots fermés', + localsTitle: 'Demander aux locaux d’abord', + localsDesc: 'Respecte le spot, ne le grille pas', + contactInfo: 'Coordonnées de contact', + contactPlaceholder: 'ex. : numéro de téléphone, Instagram, e-mail...', + contactHintPrivate: 'Comment les gens peuvent-ils te contacter pour l’autorisation ?', + contactHintLocals: 'Comment les gens peuvent-ils te contacter pour se renseigner sur le Spot ?', + }, + marketplace: { + title: 'Marché', + subtitle: 'Achète, vends et échange du gear de skate', + addListing: 'Ajouter une annonce', + condition: 'État', + conditions: { + new: 'Neuf', + likeNew: 'Comme neuf', + good: 'Bon', + fair: 'Correct', + poor: 'Mauvais', + }, + categories: { + all: 'Tout', + decks: 'Planches', + trucks: 'Trucks', + wheels: 'Roues', + bearings: 'Roulements', + shoes: 'Chaussures', + clothing: 'Vêtements', + protection: 'Protection', + other: 'Autre', + }, + priceRange: 'Fourchette de prix', + location: 'Emplacement', + seller: 'Vendeur', + contact: 'Contacter le vendeur', + makeOffer: 'Faire une offre', + sold: 'Vendu', + available: 'Disponible', + gear: 'Gear', + sellGear: 'Vendre du gear', + wantToBuy: 'Je recherche', + }, + auth: { + login: 'Se connecter', + logout: 'Se déconnecter', + signUp: 'S’inscrire', + signUpTitle: 'Nouveau sur Nostr ?', + signUpDesc: 'Crée un nouveau compte pour commencer. C’est gratuit et ouvert.', + orLogIn: 'Ou connecte-toi', + loginWithExtension: 'Se connecter avec l’extension', + loginWithAmber: 'Se connecter avec Amber (Android)', + loginWithKey: 'Clé secrète (nsec) ou phrase de récupération', + loginWithBunker: 'Se connecter avec Nostr Connect', + bunkerUri: 'Chaîne de connexion Bunker', + openAmber: 'Ouvrir Amber', + connectToBunker: 'Se connecter au Bunker', + noExtension: 'Aucune extension détectée.', + extensionHelp: 'Essaie le bouton S’inscrire ci-dessus pour créer un nouveau compte, ou utilise les onglets Amber, Clé ou Bunker si tu as déjà des identifiants.', + amberDesc: 'Amber est une application de signature Nostr sécurisée pour Android. Clique sur le bouton ci-dessous pour ouvrir Amber et autoriser l’accès.', + bunkerDesc: 'Accède à ton compte depuis n’importe quel appareil avec un signer distant (bunker). Tes clés restent en sécurité sur le serveur, jamais exposées aux sites web.', + keyPlaceholder: 'nsec1... ou ta phrase de récupération de 12 mots', + keyHint: 'Tu peux coller ta clé nsec ou ta phrase de récupération de 12 mots', + uploadKeyFile: 'Importer ton fichier de clé', + loggingIn: 'Connexion...', + connecting: 'Connexion...', + verifying: 'Vérification...', + }, + createEvent: { + title: 'Créer un événement', + subtitle: 'Organise un événement de skate pour la communauté', + backToEvents: 'Retour aux événements', + namePlaceholder: 'ex. : Summer Skate Session', + descriptionPlaceholder: 'Décris l’événement, ce qui t’attend, les règles, les lots, etc.', + selectType: 'Choisir le type d’événement', + venuePlaceholder: 'ex. : Venice Beach Skatepark, CA', + selectDate: 'Choisir la date', + selectTime: 'Choisir l’heure', + ticketPricePlaceholder: 'Laisse vide pour les événements gratuits', + publishing: 'Publication...', + success: 'Événement publié avec succès !', + error: 'Échec de la publication de l’événement', + loginToCreate: 'Tu dois te connecter pour créer un événement.', + requiredFields: 'Parle-nous de cet événement. Tous les champs marqués d’un * sont obligatoires.', + startDateTime: 'Date et heure de début', + endDateTime: 'Date et heure de fin (facultatif)', + coordinatesOptional: 'Coordonnées (facultatif)', + coverImage: 'Image de couverture', + uploadCover: 'Importer une image de couverture', + nip05Recommended: 'Vérification NIP-05 recommandée', + nip05Desc: 'Ajoute un identifiant NIP-05 à ton profil pour vérifier ton identité et gagner la confiance des participants.', + addNip05: 'Ajouter un NIP-05 dans les Paramètres', + }, + labPage: { + title: 'The Lab', + subtitle: 'Apprends des tricks. Capture des moments. Connecte-toi avec d’autres Skaters', + coachesTab: 'Coaching', + filmersTab: 'Tournage', + offerCoaching: 'PROPOSER DU COACHING', + offerFilming: 'PROPOSER DU TOURNAGE', + loginToOffer: 'Connecte-toi pour proposer des services', + whatToLearn: 'QU’EST-CE QUE TU VEUX APPRENDRE ?', + whatContent: 'QUEL TYPE DE CONTENU ?', + selectSkillsDesc: 'Sélectionne des compétences et on te mettra en relation avec des coachs', + selectFilmingDesc: 'Sélectionne les services de tournage que tu recherches', + searchPlaceholder: 'Rechercher par nom, lieu ou compétences...', + noServicesYet: 'AUCUN SERVICE POUR LE MOMENT', + beFirstToOffer: 'Sois le premier à proposer du coaching ou du tournage à la communauté !', + skills: 'Compétences', + rate: 'Tarif', + perHour: '/heure', + contact: 'Contacter', + viewProfile: 'Voir le profil', + noProfilesYet: 'Aucun profil pour le moment', + beFirstCoach: 'Sois le premier à t’inscrire comme coach !', + beFirstFilmer: 'Sois le premier à t’inscrire comme filmer !', + yearsExperience: 'ans d’expérience', + }, + skills: { + kickflip: 'Kickflip', + heelflip: 'Heelflip', + ollie: 'Ollie', + treflip: '360 Flip', + shuvit: 'Shuvit', + hardflip: 'Hardflip', + varial: 'Varial', + nollie: 'Nollie', + fakie: 'Fakie', + switch: 'Switch', + grind: 'Grind', + slide: 'Slide', + manual: 'Manual', + transition: 'Transition', + bowl: 'Bowl', + vert: 'Vert', + street: 'Street', + flatground: 'Flatground', + }, + lab: { + title: 'The Lab', + subtitle: 'Fais passer ton skate au niveau supérieur', + coaches: 'Coachs', + filmers: 'Filmers', + findCoach: 'Trouver un coach', + becomeCoach: 'Devenir coach', + findFilmer: 'Trouver un filmer', + becomeFilmer: 'Devenir filmer', + hourlyRate: 'Tarif horaire', + experience: 'Expérience', + specialties: 'Spécialités', + availability: 'Disponibilité', + bookSession: 'Réserver une session', + contactCoach: 'Contacter le coach', + noCoaches: 'Aucun coach trouvé dans ta région', + noFilmers: 'Aucun filmer trouvé dans ta région', + }, + shops: { + title: 'Skate Shops', + addShop: 'Ajouter un Shop', + editShop: 'Modifier le Shop', + shopDetails: 'Détails du Shop', + shopName: 'Nom du Shop', + hours: 'Horaires', + phone: 'Téléphone', + website: 'Site web', + services: 'Services', + brands: 'Marques', + supportLocal: 'Soutiens le local', + nip05: 'NIP-05 du Shop', + nip05Hint: 'Un identifiant facultatif que tu contrôles pour ce Shop (ex. shop@yourdomain.com), vérifié avec ta clé. Ajoutes-en jusqu’à 5.', + }, + becomeFilmer: { + title: 'Devenir filmer', + subtitle: 'Capture les meilleurs clips pour la communauté', + bioPlaceholder: 'Parle-nous de ton expérience de tournage et de ton matériel...', + specialtiesPlaceholder: 'ex. : fisheye, longue focale, drone, montage', + selectSpecialties: 'Sélectionne tes spécialités', + hourlyRate: 'Tarif horaire (sats)', + ratePlaceholder: 'ex. : 5000', + locationPlaceholder: 'Ta ville ou ta région', + portfolioUrl: 'URL du portfolio', + portfolioPlaceholder: 'Lien vers ton travail (YouTube, Instagram, etc.)', + publishing: 'Publication du profil...', + success: 'Profil de filmer créé !', + error: 'Échec de la création du profil', + }, + food: { + title: 'Spots bouffe', + subtitle: 'Fais le plein avant ou après ta session', + addFood: 'Ajouter un spot bouffe', + categories: { + all: 'Tout', + burgers: 'Burgers', + pizza: 'Pizza', + tacos: 'Tacos', + coffee: 'Café', + drinks: 'Boissons', + snacks: 'Snacks', + }, + skaterFriendly: 'Adapté aux skaters', + nearSpots: 'Près des spots de skate', + }, + profile: { + posts: 'Publications', + spots: 'Spots', + events: 'Événements', + following: 'Abonnements', + followers: 'Abonnés', + editProfile: 'Modifier le profil', + follow: 'Suivre', + unfollow: 'Ne plus suivre', + noPostsYet: 'Aucune publication pour le moment', + noBio: 'Pas encore de bio', + zapProfile: 'Zap ce skater', + }, + becomeCoach: { + title: 'Devenir coach', + subtitle: 'Partage tes compétences et aide d’autres skaters à progresser', + bioPlaceholder: 'Parle-nous de ton parcours de skate et de ton style d’enseignement...', + skillsPlaceholder: 'ex. : kickflip, heelflip, grinds, bowls', + selectSkills: 'Sélectionne les compétences que tu peux enseigner', + hourlyRate: 'Tarif horaire (sats)', + ratePlaceholder: 'ex. : 5000', + locationPlaceholder: 'Ta ville ou ta région', + publishing: 'Publication du profil...', + success: 'Profil de coach créé !', + error: 'Échec de la création du profil', + }, + weather: { + title: 'Météo', + current: 'Conditions actuelles', + forecast: 'Prévisions', + humidity: 'Humidité', + wind: 'Vent', + feelsLike: 'Ressenti', + goodForSkating: 'Bon pour skater !', + notIdeal: 'Conditions pas idéales', + allWeather: 'Tous les temps', + goodWeather: 'Beau temps', + perfectWeather: 'Temps parfait', + }, + errors: { + somethingWentWrong: 'Une erreur est survenue', + tryAgainLater: 'Réessaie plus tard', + notFound: 'Introuvable', + pageNotFound: 'Page introuvable', + unauthorized: 'Non autorisé', + loginRequired: 'Connecte-toi pour continuer', + networkError: 'Erreur réseau', + checkConnection: 'Vérifie ta connexion internet', + invalidInput: 'Saisie invalide', + requiredField: 'Ce champ est obligatoire', + }, + time: { + today: 'Aujourd’hui', + yesterday: 'Hier', + tomorrow: 'Demain', + thisWeek: 'Cette semaine', + nextWeek: 'La semaine prochaine', + thisMonth: 'Ce mois-ci', + justNow: 'À l’instant', + minutesAgo: 'il y a {{count}} minutes', + hoursAgo: 'il y a {{count}} heures', + daysAgo: 'il y a {{count}} jours', + }, + spotDetail: { + postedBy: 'Publié par', + getDirections: 'Obtenir l’itinéraire', + reviews: 'Avis', + noReviews: 'Aucun avis pour le moment', + beFirstReview: 'Sois le premier à donner ton avis sur ce Spot !', + writeReview: 'Écrire un avis', + submitReview: 'Envoyer l’avis', + rating: 'Note', + reviewPlaceholder: 'Partage ton expérience à ce Spot...', + relatedSpots: 'Spots à proximité', + }, + eventDetail: { + organizedBy: 'Organisé par', + eventInfo: 'Infos de l’événement', + location: 'Lieu', + dateTime: 'Date et heure', + price: 'Prix', + attendeeCount: '{{count}} participants', + interested: 'Intéressé', + going: 'Participe', + notGoing: 'Ne participe pas', + share: 'Partager l’événement', + }, + venueAccess: { + title: 'Pass d’accès', + desc: 'Émet un pass signé pour un rider afin qu’il puisse prouver son accès à l’entrée — il montre sa carte et n’importe qui peut scanner le QR pour la vérifier.', + active: '{{count}} actif(s)', + revoked: '{{count}} révoqué(s)', + issue: 'Émettre un pass', + verifyHint: 'Vérifié par scan — aucune app ni compte nécessaire pour contrôler.', + publicTitle: 'Pass d’accès', + publicDesc: 'Ce lieu émet des pass d’accès. Scanne la carte d’un rider à l’entrée pour la vérifier.', + badge: 'Pass', + sellerHint: 'Le lieu de ce vendeur émet des pass d’accès', + }, + zaps: { + zapButton: 'Zap', + sendZap: 'Envoyer un Zap', + zapAmount: 'Montant du Zap', + customAmount: 'Montant personnalisé', + addMessage: 'Ajouter un message (facultatif)', + sending: 'Envoi...', + sent: 'Zap envoyé !', + failed: 'Échec du Zap', + received: 'Tu as reçu un Zap !', + }, + rewards: { + title: 'Récompenses', + yourPoints: 'Tes points', + earnPoints: 'Gagner des points', + redeemPoints: 'Échanger des points', + leaderboard: 'Classement', + achievements: 'Succès', + dailyTasks: 'Tâches quotidiennes', + weeklyTasks: 'Tâches hebdomadaires', + }, + errorsUi: { + slammedTitle: 'Slam', + slammedBody: 'Quelque chose a fait trébucher cet écran. Ton compte et tes données sont en sécurité — on te remet en selle.', + tryAgain: 'Réessayer', + reloadApp: 'Recharger l’app', + pageSlammedTitle: 'Cette page a slammé', + pageSlammedBody: 'Quelque chose sur cet écran a fait trébucher. Ton compte et tes données sont en sécurité. Un simple rechargement règle souvent le problème.', + reload: 'Recharger', + goBack: 'Retour', + }, + backup: { + title: 'Sauvegarde ta connexion', + subtitle: 'Ça prend 10 secondes — à faire une fois', + message: 'Ton code de récupération est le seul moyen de revenir dans ton compte. Sauvegarde-le et tu pourras te connecter sur n’importe quel appareil.', + warning: 'Perds-le et il n’y a pas de réinitialisation — pas d’e-mail, pas de récupération de mot de passe.', + backupNow: 'Sauvegarder maintenant', + confirmed: 'Je l’ai sauvegardé', + remindLater: 'Plus tard', + }, + bootUi: { + ariaLoading: 'Chargement de SkateSpots', + ariaReady: 'SkateSpots prêt', + ready: 'Prêt', + statusWaking: 'Réveil du réseau', + statusTuning: 'Accord des relays', + statusPulling: 'Récupération des spots', + statusDropping: 'Arrivée imminente', + }, + footer: { + vibedWith: 'Vibes avec', + poweredBy: 'Propulsé par', + openSource: 'Open Source', + contribute: 'Contribuer', + decentralized: 'Décentralisé', + communityOwned: 'Appartient à la communauté', + }, + role: { + owner: 'Propriétaire', + admin: 'Admin', + organiser: 'Organisateur', + verifiedOwner: 'Propriétaire vérifié', + }, + nfc: { + write: 'Écrire sur une balise NFC', + written: 'Balise écrite', + writtenDesc: 'Approche la balise d’un téléphone pour ouvrir la page de vérification.', + failed: 'Impossible d’écrire sur la balise', + }, + collectionUi: { + namePlaceholder: 'Voyage à Barcelone 2024', + descriptionPlaceholder: 'Mes spots préférés de mon voyage à Barcelone...', + }, + toastsUi: { + followingSuccess: 'Abonnement réussi', + followingSuccessDesc: 'Cet utilisateur fait maintenant partie de ton réseau', + followFailed: 'Échec de l’abonnement', + unfollowSuccess: 'Désabonnement réussi', + unfollowSuccessDesc: 'Retiré de ton réseau', + unfollowFailed: 'Échec du désabonnement', + reportThanks: 'Merci — envoyé pour examen', + reportFailed: 'Impossible d’envoyer le signalement', + savedOffline: 'Enregistré hors ligne', + savedOfflineDesc: 'On le publiera automatiquement quand tu seras de nouveau en ligne.', + cacheCleaned: 'Cache nettoyé', + cacheCleanedDesc: '{{count}} anciens spots retirés du cache', + cacheCleared: 'Cache vidé', + cacheClearedDesc: 'Tous les spots en cache ont été supprimés', + backOnline: 'De nouveau en ligne', + backOnlineDesc: '{{count}} action(s) enregistrée(s) envoyée(s).', + postQueued: 'Publication en file', + postQueuedDesc: 'Ta publication sera publiée quand tu seras de nouveau en ligne', + invalidIdentifier: 'Identifiant invalide. Utilise npub1..., user@domain.com, ou une clé publique hex', + notASpotThanks: 'Merci — envoyé pour examen', + notASpotThanksDesc: 'Pas de rancune : ça signale l’épingle comme hors sujet pour que chacun puisse décider.', + notASpotFailed: 'Impossible d’envoyer le signalement', + pleaseTryAgain: 'Réessaie.', + relayUnreachable: 'Impossible d’atteindre un relay — vérifie ta connexion et réessaie.', + loginToReport: 'Connecte-toi pour signaler un Spot.', + zapLoginRequired: 'Connexion requise', + zapLoginRequiredDesc: 'Tu dois être connecté pour envoyer un Zap.', + zapEventNotFound: 'Événement introuvable', + zapEventNotFoundDesc: 'Impossible de trouver l’événement à zapper.', + zapAuthorNotFound: 'Auteur introuvable', + zapAuthorNotFoundDesc: 'Impossible de trouver l’auteur de cet élément.', + zapSuccess: 'Zap réussi !', + zapSuccessNwcDesc: 'Tu as envoyé {{amount}} sats à l’auteur via NWC.', + zapSuccessDesc: 'Tu as envoyé {{amount}} sats à l’auteur.', + zapStatusUnknown: 'Statut du paiement inconnu', + zapStatusUnknownDesc: 'Ton portefeuille est peut-être encore en train de régler ce Zap. Vérifie ton portefeuille avant de réessayer — ne paie pas deux fois.', + zapNwcFailed: 'Échec du paiement NWC', + zapWeblnFailed: 'Échec du paiement WebLN', + zapFallingBack: '{{error}}. Retour aux autres méthodes de paiement...', + zapFailed: 'Échec du Zap', + zapUnknownNwcError: 'Erreur NWC inconnue', + zapUnknownWeblnError: 'Erreur WebLN inconnue', + nwcInvalidUri: 'URI NWC invalide', + nwcInvalidUriDesc: 'Vérifie la chaîne de connexion et réessaie.', + nwcExists: 'La connexion existe déjà', + nwcExistsDesc: 'Ce portefeuille est déjà connecté.', + nwcConnected: 'Portefeuille connecté', + nwcConnectedDesc: 'Connexion réussie à {{alias}}.', + nwcFailed: 'Échec de la connexion', + nwcFailedDesc: 'Impossible de se connecter au portefeuille : {{error}}', + nwcUnknownError: 'Une erreur inconnue est survenue', + nwcDisconnected: 'Portefeuille déconnecté', + nwcDisconnectedDesc: 'La connexion au portefeuille a été supprimée.', + deleteApproveAmber: 'Approuve dans Amber', + deleteApproveAmberDesc: 'Amber va s’ouvrir — touche Approuver pour confirmer la suppression.', + deleteCancelled: 'Annulé', + deleteCancelledDesc: 'Tu as rejeté la demande dans Amber.', + deleteCouldntSign: 'Impossible de signer', + deletePublishing: 'Étape 2/2 : publication…', + deletePublishingDesc: 'Envoi de la suppression aux relays.', + deleteStuck: 'Bloqué à PUBLICATION', + deleteStuckDesc: 'Échec de l’étape relay : {{error}}. La signature a réussi ; le relay n’a pas confirmé.', + stashMerged: 'Modifications fusionnées depuis un autre appareil', + stashMergedDesc: 'Ton Stash a été modifié ailleurs — les deux ensembles de modifications ont été conservés.', + statusUpdated: 'Statut mis à jour !', + statusUpdatedDesc: 'Ton statut de skate est maintenant visible par les autres.', + statusFailed: 'Échec de la définition du statut', + statusCleared: 'Statut effacé', + statusClearedDesc: 'Ton statut a été supprimé.', + statusClearFailed: 'Échec de l’effacement du statut', + nutzapEnabled: 'Réception Nutzap activée', + nutzapEnabledDesc: 'Tu peux maintenant recevoir des Zaps ecash !', + nutzapSetupFailed: 'Échec de la configuration', + nutzapUnavailable: 'Envoi Nutzap indisponible', + tokenReceived: 'Jeton reçu', + tokenReceivedDesc: 'Jeton Cashu échangé avec succès !', + receiveFailed: 'Échec de la réception', + invalidAmount: 'Montant invalide', + invalidAmountDesc: 'Saisis un montant valide', + tokenCreated: 'Jeton créé', + sendFailed: 'Échec de l’envoi', + mintAdded: 'Mint ajouté', + mintAddedDesc: 'Mint ajouté et approuvé avec succès', + mintAddFailed: 'Échec de l’ajout du mint', + mintRemoved: 'Mint supprimé', + mintRemoveFailed: 'Échec de la suppression du mint', + paymentReceived: 'Paiement reçu', + paymentReceivedDesc: '{{amount}} sats reçus avec succès !', + paymentSent: 'Paiement envoyé', + paymentSentDesc: 'Paiement Lightning effectué avec succès', + loginRequired: 'Connexion requise', + loginToFollowFounder: 'Connecte-toi pour suivre le fondateur', + alreadyFollowing: 'Déjà abonné', + alreadyFollowingDesc: 'Tu suis déjà {{name}} !', + couldNotComplete: 'Impossible de terminer ça', + tryAgainLower: 'Réessaie.', + couldNotLoadProfile: 'Impossible de charger le profil', + couldNotLoadProfileDesc: 'Vérifie ta connexion internet et actualise.', + undone: 'Annulé', + undoneDesc: 'Retour à neutre — ni masqué, ni approuvé.', + confirmed: 'Confirmé', + confirmedDesc: 'Approuvé — ça sort de cette file.', + hiddenToast: 'Masqué', + couldNotUndo: 'Impossible d’annuler', + couldNotConfirm: 'Impossible de confirmer', + deleteFailed: 'Échec de la suppression', + somethingWentWrong: 'Une erreur est survenue', + }, + seoUi: { + becomeBuilderTitle: 'Devenir constructeur - SkateSpots', + becomeBuilderDesc: 'Répertorie tes services de construction de ramps, parks et DIY — ce que tu construis, les matériaux et l’échelle.', + tradesTitle: 'Mes échanges — SkateSpots', + tradesDesc: 'Gère tes échanges sur le marché, tes confirmations et ta réputation.', + eventsTitle: 'Événements et tours de skate - SkateSpots', + eventsDesc: 'Découvre les événements, compétitions, tours et sessions de skate près de chez toi.', + editShopDesc: 'Modifie ton skate shop.', + createTourDesc: 'Organise des tours de skate - tours de spots cachés locaux, road trips nationaux, aventures internationales, ou compétitions de destruction à la KOTR.', + deckDesignerTitle: 'Designer de planches — SkateSpots DIY', + deckDesignerDesc: 'Dessine le contour d’un skateboard ou longboard, puis exporte un gabarit imprimable 1:1, un SVG ou un DXF — concave, kicks, empattement et trous de trucks inclus.', + createEventTitle: 'Créer un événement de skate - SkateSpots', + createEventDesc: 'Crée un nouvel événement de skate pour la communauté.', + editTourDesc: 'Modifie ton tour de skate — mets à jour les étapes, les dates et les détails.', + walletTitle: 'Portefeuille - SkateSpots', + walletDesc: 'Connecte ton portefeuille Lightning pour envoyer des Zaps aux skaters et aux créateurs de spots.', + becomePhotographerTitle: 'Devenir photographe - SkateSpots', + becomePhotographerDesc: 'Crée ton profil de photographe de skate — appareils, objectifs, éclairage et services.', + newsletterTitle: 'Newsletter - SkateSpots', + newsletterDesc: 'Chaque semaine, des nouvelles de la communauté SkateSpots. Mises à jour de l’app, nouveaux spots, événements et les personnes qui font vivre le skate.', + homeTitle: 'SkateSpots - Découvre des spots de skate dans le monde entier', + zapLeaderboardTitle: 'Classements des Zaps - SkateSpots', + zapLeaderboardDesc: 'Les spots de skate les plus zappés et les membres de la communauté qui les soutiennent.', + adminReviewTitle: 'File de modération — SkateSpots', + gearSwapTitle: 'Échange de gear - SkateSpots', + gearSwapDesc: 'Achète et vends du gear de skate d’occasion avec d’autres skaters. Planches, trucks, roues, chaussures et plus.', + donateTitle: 'Faire un don — SkateSpots', + donateDesc: 'Soutiens SkateSpots — Lightning, on-chain privé (paiements silencieux), ou finance la construction sur Angor.', + verifyCardTitle: 'Vérifier — SkateSpots', + verifyCardDesc: 'Vérifie une carte SkateSpots ou un pass d’accès.', + mapTitle: 'Carte des spots de skate - SkateSpots', + mapDesc: 'Explore les spots de skate du monde entier sur notre carte interactive.', + diyTitle: 'DIY — Fabrique le tien | SkateSpots', + diyDesc: 'Guides, outils ouverts et plans pour fabriquer tes propres skateboards, ramps et spots en béton — ainsi que les personnes et les lieux pour le faire.', + appShopTitle: 'Boutique de l’app — SkateSpots', + becomeSkaterTitle: 'Rejoins l’annuaire des skaters - SkateSpots', + becomeSkaterDesc: 'Crée ton profil de skater pour que la communauté puisse te trouver.', + marketplaceTitle: 'Marché - SkateSpots', + marketplaceDesc: 'Achète et vends du gear de skate sur le Plebeian Market décentralisé.', + becomeEditorTitle: 'Devenir monteur vidéo - SkateSpots', + becomeEditorDesc: 'Crée ton profil de monteur vidéo de skate sur SkateSpots.', + amberCallbackTitle: 'Connexion avec Amber - SkateSpots', + amberCallbackDesc: 'Finalisation de ta connexion Amber (NIP-55).', + supportersTitle: 'Soutiens - SkateSpots', + supportersDesc: 'La communauté qui fait vivre SkateSpots — soutiens, collaborateurs, partenaires et amis.', + becomeCoachTitle: 'Devenir coach - SkateSpots', + becomeCoachDesc: 'Crée ton profil de coach de skate.', + riderCardTitle: 'Carte de skater — SkateSpots', + riderCardDesc: 'Crée ta licence de skater ou ta carte d’accès au park SkateSpots imprimable.', + editEventDesc: 'Modifie ton événement de skate.', + createShopTitle: 'Ajouter un skate shop - SkateSpots', + createShopDesc: 'Ajoute ton skate shop à la communauté.', + deckCostTitle: 'Calculateur de coût de planche — SkateSpots DIY', + deckCostDesc: 'Calcule ce que coûte la fabrication d’une planche — main-d’œuvre, équipement, matériaux, temps de process, emballage et marge — et un prix de vente juste.', + pyramidTitle: 'Classements Pyramid - SkateSpots', + pyramidDesc: 'Meilleurs contributeurs et leaders de la communauté.', + foodTitle: 'Bouffe près des spots - SkateSpots', + foodDesc: 'Trouve des restaurants, cafés et options de bouffe près des spots de skate.', + createListingTitle: 'Mettre du gear en vente - SkateSpots', + createListingDesc: 'Mets du gear de skate en vente ou trouve le gear que tu veux acheter.', + becomeFilmerTitle: 'Devenir filmer - SkateSpots', + becomeFilmerDesc: 'Crée ton profil de filmer de skate.', + skatersTitle: 'Skaters - SkateSpots', + skatersDesc: 'Découvre les skaters de la communauté SkateSpots. Parcours par style, stance, niveau et lieu.', + communityStatsTitle: 'Stats de la communauté — SkateSpots', + communityStatsDesc: 'Métriques en direct de la communauté SkateSpots — spots, événements, coachs, filmers, monteurs, tours et croissance dans le temps. Récupérées directement depuis Nostr.', + labTitle: 'The Lab - SkateSpots', + labDesc: 'Trouve des coachs, filmers, photographes et monteurs vidéo de skate.', + stashTitle: 'Mon Stash - SkateSpots', + stashDesc: 'Gère ton inventaire privé de gear. Suis ce que tu possèdes, ce que tu veux vendre ou échanger.', + bountyLeaderboardTitle: 'Cartographie et gagne - SkateSpots', + bountyLeaderboardDesc: 'Cartographie des spots de skate et des shops, gagne des Zaps de la communauté. Découvre les meilleurs contributeurs.', + spotCollectionsTitle: 'Mes collections de spots - SkateSpots', + spotCollectionsDesc: 'Organise tes spots de skate préférés en collections personnalisées', + mintsTitle: 'Mints Cashu — SkateSpots', + mintsDesc: 'Parcours les mints Cashu, vérifie leur santé et ajoutes-en un à ton portefeuille.', + }, + miscUi: { + openingCamera: 'Ouverture de la caméra…', + usePhoneCamera: 'Utilise l’appareil photo de ton téléphone, puis reviens ici', + startingCamera: 'Démarrage de la caméra...', + cameraAccessRequired: 'Accès à la caméra requis', + cameraAccessHint: 'Autorise l’accès à la caméra dans les réglages de ton navigateur, ou utilise le sélecteur de fichiers ci-dessous.', + cameraErrorTitle: 'Erreur de caméra', + cameraErrorDesc: 'Impossible d’ouvrir la caméra. Vérifie les autorisations de l’app dans les Paramètres.', + cameraDeniedTitle: 'Accès à la caméra refusé', + cameraDeniedDesc: 'Autorise l’accès à la caméra dans les réglages de ton navigateur.', + uploadFromGallery: 'Importer depuis la galerie', + uploading: 'Importation...', + usePhoto: 'Utiliser la photo', + earningPotential: 'Potentiel de revenus', + qualityExcellent: 'Excellent !', + qualityGood: 'Bon', + qualityBasic: 'Basique', + qualityGettingStarted: 'Pour commencer', + qualityLocationAdded: 'Lieu ajouté', + qualityOnePhoto: 'Au moins 1 photo', + qualityThreePhotos: '3+ photos', + qualityMoreAngles: 'Plus d’angles = mieux', + qualityDescription: 'Description', + qualityDetailedDesc: 'Description détaillée (100+ caractères)', + qualityContact: 'Infos de contact', + qualityPhoneOrWebsite: 'Téléphone ou site web', + qualityHours: 'Horaires d’ouverture', + qualitySpotType: 'Type de Spot sélectionné', + failedToLoadComments: 'Échec du chargement des commentaires', + commentsTitle: 'Commentaires', + noCommentsYet: 'Aucun commentaire pour le moment', + beFirstComment: 'Sois le premier à partager ton avis !', + removeMember: 'Retirer le membre', + whoIsThisFor: 'Pour qui est ce profil ?', + individual: 'Individuel', + individualDesc: 'Une seule personne', + collective: 'Collectif', + collectiveDesc: 'Crew, studio ou entreprise', + membersLabel: 'Membres', + dismissReport: 'Ignorer le signalement', + reportedBy: 'signalé par', + completingLoginAmber: 'Finalisation de la connexion avec Amber...', + entityMembersHint: 'Ajoute les comptes Nostr de ton crew. Chaque membre confirme son propre Spot avec sa clé — jusque-là, ils apparaissent comme « en attente ».', + entityVerifiedHint: 'L’appartenance est vérifiée membre par membre — personne ne peut être ajouté à ton crew sans confirmer depuis son propre compte.', + entityInvalidPubkey: 'Saisis un npub, nprofile, ou une clé publique hex de 64 caractères valide.', + entityAlreadyAdded: 'Ce membre est déjà ajouté.', + offline: 'Hors ligne', + connected: 'Connecté', + offlineMode: 'Mode hors ligne', + allFeaturesAvailable: 'Toutes les fonctionnalités disponibles', + browsingCachedSpots: 'Navigation dans les spots en cache', + queuedActions: '{{count}} action(s) en file', + syncing: 'Synchronisation', + publishingWhenStable: 'Publication dès que la connexion se stabilise...', + willPublishOnline: 'Sera publié une fois de nouveau en ligne', + availableOffline: 'Disponible hors ligne :', + offlineBrowseSpots: 'Parcourir les spots déjà consultés', + offlineViewDetails: 'Voir les détails des spots en cache', + offlineKeepActing: 'Continue d’agir — publications, RSVP, annonces et messages sont mis en file et envoyés dès que tu te reconnectes', + }, + sasquatchGuide: { + homeTitle: 'Bienvenue sur SkateSpots ! 🦧', + homeMessage: 'Yo, je suis The Sasquatch. Gardien des planches, des spots et des rides sauvages. Bienvenue dans le monde du skate indompté sur Nostr — pas de costumes, pas de pubs, juste des skaters qui tracent leur propre voie. Ici, tu possèdes tes tricks, tes données, et tu peux même gagner des Bitcoin en laissant ta marque. Connecte-toi avec des skaters de ton quartier ou du monde entier. Pas de règles hormis le shred, aucune trace hormis la tienne.', + homeQ1: 'Organise-moi 3 jours à Barcelone', + homeQ2: 'Trouve des spots pour débutants', + homeQ3: 'Des événements à venir ?', + homeQ4: 'Stats de la communauté', + homeQ5: 'Trouve des coachs près de moi', + homeQ6: 'Du gear à vendre ?', + homeQ7: 'C’est quoi Nostr ?', + homeQ8: 'C’est gratuit ?', + homeLearnMore: 'En savoir plus', + onboardingTitle: 'Pour commencer 🚀', + onboardingMessage: 'Laisse-moi t’expliquer les bases ! Nostr est ton identité, Bitcoin Lightning te permet de gagner des sats pour tes contributions, et les Zaps sont des pourboires instantanés. Pose-moi n’importe quelle question pour démarrer !', + onboardingQ1: 'Comment se connecter ?', + onboardingQ2: 'C’est quoi Nostr ?', + onboardingQ3: 'Comment fonctionne Nostr ?', + onboardingQ4: 'C’est quoi Cashu ?', + onboardingQ5: 'Comment utiliser le portefeuille Cashu ?', + onboardingQ6: 'C’est quoi les mints ?', + onboardingQ7: 'C’est quoi les Zaps ?', + onboardingQ8: 'C’est quoi NWC ?', + onboardingStart: 'Commencer à explorer', + onboardingLogin: 'Connecte-toi pour commencer', + labTitle: 'Bienvenue dans The Lab ! 🎓', + labMessage: 'C’est ici que la magie opère ! Trouve des coachs qui peuvent t’apprendre de tout, du kickflip au darkslide, ou connecte-toi avec des filmers pour capturer tes meilleures sessions. Filtre par compétences, consulte leur expérience et réserve une session. Rappelle-toi — tout le monde a commencé quelque part !', + labQ1: 'Trouver des coachs', + labQ2: 'Trouver des filmers', + labQ3: 'Trouver des photographes', + labQ4: 'Trouver des monteurs vidéo', + labQ5: 'Trouver un constructeur de ramps', + labQ6: 'C’est quoi The Lab ?', + labQ7: 'C’est quoi un builder ?', + labQ8: 'Comment proposer du coaching ?', + labLogin: 'Connecte-toi pour proposer des services', + crewsTitle: 'Crews 🤘', + crewsMessage: 'Les Crews sont ta famille de skate ancrée sur la carte — les personnes avec qui tu skates, pas celles que tu embauches. Chaque crew a son territoire sur la carte, ses spots, ses membres et un manifeste. Les membres confirment depuis leurs propres clés, donc la liste est légitime. Lance le tien ou trouve les tiens !', + crewsQ1: 'C’est quoi les crews ?', + crewsQ2: 'Comment lancer un crew ?', + crewsQ3: 'En quoi un crew est différent de The Lab ?', + crewsQ4: 'Comment les membres confirment ?', + crewsQ5: 'C’est quoi Nostr ?', + crewsQ6: 'Comment marchent les Zaps ?', + crewsLogin: 'Connecte-toi pour créer un Crew', + }, + supportUi: { + keepMapFree: 'Garde la carte gratuite', + keepMapFreeDesc: 'Pas de pubs, pas de tracking, pas de VC. Tes sats financent l’hébergement, le nœud IA et le relay.', + thankYou: 'Merci ! ⚡', + satsKeepMapFree: 'Tes sats gardent la carte gratuite.', + keptFreeNext: 'Tu viens de garder SkateSpots gratuit pour le prochain skater.', + scanToPay: 'Scanne pour payer', + zapSkateSpots: 'Zap SkateSpots', + payQuietly: 'Payer discrètement', + pickAmount: 'Choisis un montant', + enterAmount: 'Indique combien de sats tu veux envoyer.', + couldNotStartPayment: 'Impossible de lancer le paiement.', + customAmountAria: 'Montant personnalisé en sats', + commentPlaceholder: 'Dis quelque chose (facultatif — Zaps publics uniquement)', + publicZapTitle: 'Zap public avec ton commentaire', + loginToZapTitle: 'Connecte-toi pour envoyer un Zap public', + anonymousTitle: 'Anonyme — pas de connexion, pas de trace', + copyLightningTitle: 'Copier l’adresse Lightning', + copiedSuffix: '{{label}} copié', + invoiceLabel: 'Facture', + addressLabel: 'Adresse', + notAPurchase: 'Soutien, pas un achat — ça n’achète rien et il n’y a pas de remboursement. Les goodies et Sasquatch Pro sont séparés. Ta position et ton identité ne sont jamais impliquées dans un paiement discret.', + }, + statusUi: { + quickStatus: 'Statut rapide', + skating: 'En skate', + skatingDesc: 'En train de skater', + filming: 'Tournage', + filmingDesc: 'Tourne des tricks', + lookingForSesh: 'Cherche une session', + lookingForSeshDesc: 'Veut skater avec d’autres', + coaching: 'Coaching', + coachingDesc: 'Enseigne/coache', + chilling: 'Chill', + chillingDesc: 'Traîne au spot', + onMyWay: 'En route', + onMyWayDesc: 'Se dirige vers un spot', + takingABreak: 'Pause', + takingABreakDesc: 'Repos/hydratation', + doneForToday: 'Fini pour aujourd’hui', + doneForTodayDesc: 'A fini de skater', + }, +}; export default frBatch7; diff --git a/src/i18n/fr/batch8.ts b/src/i18n/fr/batch8.ts index 72b7830..fca8afb 100644 --- a/src/i18n/fr/batch8.ts +++ b/src/i18n/fr/batch8.ts @@ -1,4 +1,622 @@ -/** fr — batch 8. Filled by the translation pass; empty until then. */ -const frBatch8 = {}; +/** fr — batch 8. Filled by the translation pass. */ +const frBatch8 = { + deckCostUi: { + presetPrompt: 'Nommer ce préréglage', + presetDefaultName: 'Préréglage {{n}}', + summaryCopied: 'Résumé copié', + couldNotCopy: 'Impossible de copier', + resetConfirm: 'Réinitialiser tout aux valeurs de l’exemple ?', + logoTooLarge: 'Logo trop volumineux (max 500 Ko)', + loginToFill: 'Connecte-toi pour remplir depuis ton profil Nostr', + filledFromProfile: 'Rempli depuis ton profil Nostr', + warnRetailBelowOne: 'La marge de vente est inférieure à 1× — tu vendrais à perte.', + warnWholesaleAboveRetail: 'La marge de gros devrait être inférieure à la marge de vente.', + warnZeroBoards: '{{count}} ligne(s) utilisent 0 planche — le coût de cette ligne est ignoré.', + warnFixedNoBoards: 'Des coûts mensuels fixes sont définis mais le nombre de planches/mois est 0, donc le coût d’exploitation est ignoré.', + warnNoMaterials: 'Aucun coût de matériaux — ajoute au moins un matériau.', + warnEquipmentOverhead: 'L’équipement + les frais généraux dépassent 60 % du coût — ce modèle suppose un gros volume ; vérifie ton nombre de planches.', + warnOneBoard: 'Une partie de l’équipement est répartie sur une seule planche — augmente son nombre de planches pour l’amortir.', + templateStarterName: 'Débutant loisir', + templateStarterBlurb: 'Quelques lignes, aucun coût fixe', + templateShopName: 'Petit atelier', + templateShopBlurb: 'Feuille complète avec loyer et frais généraux', + currency: 'Devise', + noCurrencyMatches: 'Aucune devise correspondante.', + ratesUnavailable: 'Taux en direct indisponibles — le changement ne fait que réétiqueter.', + liveRates: 'taux BTC en direct · sats inclus', + chipCost: 'coût', + chipSell: 'vente', + chipTotal: 'total', + startFrom: 'Partir de', + advancedToggleHint: 'Afficher les taux par opération et les chutes, la configuration par lot, la taxe et la courbe coût-quantité', + advanced: 'Avancé', + simple: 'Simple', + sectionLabor: 'Main-d’œuvre', + sectionEquipment: 'Équipement', + sectionOperations: 'Frais d’exploitation', + sectionMaterials: 'Matériaux', + sectionProcesses: 'Coûts de traitement', + sectionPackaging: 'Emballage', + sectionMargins: 'Marges', + subtotalLoaded: '{{value}}/h chargé', + subtotalPerBoard: '{{value}}/planche', + hourlyRate: 'Taux horaire ({{unit}})', + labourBurden: 'Charges sur la main-d’œuvre (×)', + loadedRate: 'Taux chargé', + loadedRateHintBefore: 'Taux chargé = salaire × charges (impôts et assurances patronales sur la main-d’œuvre). Le loyer et les factures vont sous ', + loadedRateHintAfter: ' — ne les compte pas deux fois.', + colEquipment: 'Équipement', + colCostUnit: 'Coût ({{unit}})', + colCost: 'Coût', + colSetupH: 'Installation (h)', + colLifetimeBoards: 'Planches sur la durée de vie', + colPerBoard: 'Par planche', + colMaterial: 'Matériau', + colOrderUnit: 'Commande ({{unit}})', + colShipUnit: 'Livraison ({{unit}})', + colBoardsOrder: 'Planches / commande', + colOrderM: 'Commande (m)', + colUnloadM: 'Déchargement (m)', + colOrder: 'Commande', + colShipping: 'Livraison', + colOrderMin: 'Commande (min)', + colUnloadMin: 'Déchargement (min)', + colProcess: 'Traitement', + colTimeM: 'Temps (m)', + colBoardsRun: 'Planches / exécution', + colRateHr: 'Taux/h (0 = atelier)', + colRateHrShort: 'Taux/h', + colScrapPct: 'Chutes %', + colTimeMin: 'Temps (min)', + colPackaging: 'Emballage', + colTimeBoardM: 'Temps/planche (m)', + colTimeBoardMin: 'Temps/planche (min)', + colMaterialsBoardUnit: 'Matériaux/planche ({{unit}})', + colMaterialsBoard: 'Matériaux/planche', + equipmentPerBoard: 'Équipement par planche :', + materialsPerBoard: 'Matériaux par planche :', + processesPerBoard: 'Traitements par planche :', + packagingPerBoard: 'Emballage par planche :', + perBoard: 'Par planche :', + addEquipment: 'Ajouter un équipement', + addMaterial: 'Ajouter un matériau', + addProcess: 'Ajouter un traitement', + addPackagingStep: 'Ajouter une étape d’emballage', + duplicate: 'Dupliquer', + remove: 'Supprimer', + boardsPerMonth: 'Planches / mois', + rentPerMonth: 'Loyer / mois', + utilitiesPerMonth: 'Charges / mois', + subscriptionsPerMonth: 'Abonnements / mois', + markup: 'Marge (×)', + wholesaleMarkup: 'Marge de gros (×)', + scrapWaste: 'Chutes / rebuts (%)', + quantityDecks: 'Quantité (decks)', + targetMonthlyProfit: 'Bénéfice mensuel visé ({{unit}})', + costNoPackaging: 'Coût / planche (sans emballage)', + costWithPackaging: 'Coût / planche (avec emballage)', + batchSetupHours: 'Configuration par lot (h / exécution)', + batchSetupCost: 'Coût de configuration par lot ({{unit}} / exécution)', + taxVat: 'Taxe / TVA (%)', + quoteTax: 'Taxe du devis', + includedInPrice: 'Incluse dans le prix', + addedOnTop: 'Ajoutée en plus', + setupPerBoard: 'Configuration / planche', + marginNoteBefore: 'Marge {{markup}}× ≈ ', + grossMargin: '{{pct}} % de marge brute', + marginNoteAfter: ' · les chutes de {{waste}} % sont réparties sur les bonnes planches.', + sellingPriceNoPackaging: 'Prix de vente · sans emballage', + sellingPriceWithPackaging: 'Prix de vente · avec emballage', + profitPerDeck: 'Bénéfice / deck', + wholesalePerDeck: 'Gros / deck', + orderTotalQty: 'Total de la commande ({{qty}})', + orderTotal: 'Total de la commande', + breakeven: 'Seuil de rentabilité', + breakevenPerMonth: '{{count}}/mois', + targetDecksHint: 'Pour dégager {{amount}}/mois au-dessus des coûts fixes, vends {{decks}} decks/mois.', + priceIncludesTax: 'Le prix inclut {{pct}} % de taxe : {{amount}} du total.', + plusTax: 'Plus {{pct}} % de taxe : {{amount}} → {{total}} au total.', + costVsQuantity: 'Coût selon la quantité (configuration amortie)', + deckOne: 'deck', + deckOther: 'decks', + perDeckSuffix: '/ deck', + orderSuffix: 'commande {{amount}}', + shippingNotIncluded: 'N’inclut pas la livraison à l’acheteur.', + clientQuoteDetails: 'Détails du devis client (pour le PDF)', + fillFromProfileTitle: 'Remplir le nom, le site web, le NIP-05, Lightning et le npub depuis ton profil Nostr', + fillFromProfile: 'Remplir depuis le profil', + businessName: 'Nom de l’entreprise / atelier', + email: 'E-mail', + phone: 'Téléphone', + website: 'Site web', + address: 'Adresse', + quoteNumber: 'Devis n°', + nextNumber: 'Numéro suivant', + validDays: 'Validité (jours)', + nip05: 'NIP-05', + lightningAddress: 'Adresse Lightning', + nostrNpub: 'Nostr (npub)', + depositPct: 'Acompte à verser d’avance (%)', + deliveryTerms: 'Conditions de livraison (Incoterm, facultatif)', + paymentMethods: 'Moyens de paiement', + paymentTerms: 'Conditions de paiement', + paymentDetails: 'Détails de paiement', + notesTerms: 'Notes / conditions', + changeLogo: 'Changer le logo', + addLogo: 'Ajouter un logo', + incotermNone: 'Aucun', + incotermExw: 'EXW — enlèvement chez le vendeur', + incotermFca: 'FCA — remis au transporteur de l’acheteur', + incotermDap: 'DAP — livré à l’adresse de l’acheteur', + incotermDdp: 'DDP — livré, droits acquittés', + payMethodCash: 'Espèces', + payMethodLightning: 'Lightning', + payMethodCashu: 'Cashu', + payMethodBank: 'Virement bancaire', + payMethodCard: 'Carte', + payMethodOther: 'Autre', + listDeckAtPrice: 'Mettre un deck en vente à ce prix', + getItMade: 'Le faire fabriquer — trouver un fabricant', + savePreset: 'Enregistrer le préréglage', + load: 'Charger', + export: 'Exporter', + import: 'Importer', + reset: 'Réinitialiser', + deletePreset: 'Supprimer le préréglage', + exportPdfFull: 'PDF — feuille complète', + exportPdfQuote: 'PDF — devis client', + exportPng: 'Image PNG', + exportXlsx: 'Classeur XLSX', + exportCsv: 'CSV (tableur)', + exportMarkdown: 'Markdown', + exportJson: 'JSON (sauvegarde)', + exportCopySummary: 'Copier le résumé', + }, + becomeRolesUi: { + artist: { + seoTitle: 'Devenir Designer / Artiste - SkateSpots', + seoDescription: 'Présente ton design et ton art skate — graphismes de planches, logos, affiches, merch et plus.', + heading: 'Designer / Artiste', + tagline: 'Graphismes de planches, logos, affiches, merch — mets ton art dans la scène', + noun: 'artiste', + rateLabel: 'Tarif', + portfolioLabel: 'Lien portfolio / boutique', + sectionWhatYouMake: 'Ce que tu crées', + sectionMedium: 'Support', + sectionSoftwareTools: 'Logiciels et outils', + deliverablesPlaceholder: 'ex. fichiers prêts à imprimer, fichiers sources, graphismes de deck', + turnaroundPlaceholder: 'ex. 3–5 jours', + }, + graffiti: { + seoTitle: 'Proposer du graffiti / des fresques - SkateSpots', + seoDescription: 'Présente ton travail de graffiti et de fresque — pièces, fresques, art de skatepark et plus.', + heading: 'Artiste graffiti / fresque', + tagline: 'Pièces, fresques, art de skatepark — peins la scène', + noun: 'artiste graffiti', + rateLabel: 'Tarif', + portfolioLabel: 'Lien portfolio (IG, site)', + sectionStyle: 'Style', + sectionMedium: 'Support', + sectionWorkContext: 'Contexte de travail', + crewLabel: 'Crew graffiti', + crewPlaceholder: 'Ton crew d’écriture (facultatif)', + crewHelper: 'Différent de ton Crew de skate — les writers avec qui tu peins.', + surfacesPlaceholder: 'ex. béton, brique, murs autorisés', + maxSizePlaceholder: 'ex. jusqu’à 10 m', + }, + musician: { + seoTitle: 'Ajouter un profil musical - SkateSpots', + seoDescription: 'Tu fais du skate et de la musique ? Présente ton groupe ou ton projet solo — genres, instruments et liens.', + heading: 'Musicien / Groupe', + tagline: 'Tu fais du skate et de la musique ? Fais-toi réserver pour des démos, jams et after-parties', + noun: 'musicien', + rateLabel: 'Tarif de réservation', + portfolioLabel: 'Lien site web / EPK', + sectionGenre: 'Genre', + sectionInstruments: 'Instruments et rôle', + actLabel: 'Type d’acte', + actPlaceholder: 'solo / groupe / dj / producteur', + spotifyLabel: 'Spotify', + spotifyPlaceholder: 'https://open.spotify.com/…', + bandcampLabel: 'Bandcamp', + bandcampPlaceholder: 'https://…bandcamp.com', + soundcloudLabel: 'SoundCloud', + soundcloudPlaceholder: 'https://soundcloud.com/…', + youtubeLabel: 'YouTube', + youtubePlaceholder: 'https://youtube.com/…', + setLengthPlaceholder: 'ex. 30–45 min', + techRiderPlaceholder: 'ex. sono, micros, backline', + }, + judge: { + seoTitle: 'Juger des événements de skate - SkateSpots', + seoDescription: 'Inscris-toi comme juge d’événements de skate — Game of S.K.A.T.E., jams de best trick, contests, séries am et étapes de world tour. Fais-toi réserver pour des événements équitables et crédibles.', + heading: 'Juge d’événements de skate', + tagline: 'Du Game of S.K.A.T.E. au sol au World Destruction Tour — organise-le de façon équitable et crédible', + noun: 'juge', + rateLabel: 'Tarif journalier / honoraires', + portfolioLabel: 'Archive des résultats / lien profil', + sectionEventFormats: 'Formats d’événement', + sectionSpecialty: 'Spécialité', + sectionLevelCircuit: 'Niveau / circuit', + eventsJudgedLabel: 'Événements jugés', + eventsJudgedPlaceholder: 'ex. 40+ contests, 3 étapes de World Tour', + eventsJudgedHelper: 'Événements, compétitions ou tournées notables que tu as arbitrés.', + travelPlaceholder: 'ex. régional / national / international', + certificationsPlaceholder: 'ex. formation nationale de jugement', + }, + organizer: { + seoTitle: 'Organiser des événements de skate - SkateSpots', + seoDescription: 'Inscris-toi comme organisateur d’événements de skate — jams de rue, best trick, contests, meetups, démos et étapes de tournée. Fais-toi découvrir et réserver pour mener la session.', + heading: 'Organisateur d’événements', + tagline: 'Jams, contests, meetups et démos — organise la session et rassemble la scène', + noun: 'organisateur', + rateLabel: 'Tarif / budget d’événement', + portfolioLabel: 'Événements passés / lien résultats', + sectionEventTypes: 'Types d’événement', + sectionWhatYouHandle: 'Ce que tu gères', + sectionScale: 'Échelle', + eventsHostedLabel: 'Événements organisés', + eventsHostedPlaceholder: 'ex. 25 jams, 3 comps de ville', + eventsHostedHelper: 'Événements, compétitions ou meetups notables que tu as organisés.', + insurancePlaceholder: 'ex. responsabilité civile incluse', + permitsPlaceholder: 'ex. permis municipaux gérés', + }, + tattoo: { + seoTitle: 'Devenir tatoueur - SkateSpots', + seoDescription: 'Présente ton travail de tatouage pour la scène skate — styles, flash, custom et plus.', + heading: 'Tatoueur', + tagline: 'De l’encre pour la scène — flash, custom, fine line et plus', + noun: 'tatoueur', + rateLabel: 'Tarif / heure', + portfolioLabel: 'Lien portfolio (IG, site)', + sectionStyles: 'Styles', + sectionMethod: 'Méthode', + studioLabel: 'Studio / boutique', + studioPlaceholder: 'Nom du studio (facultatif)', + booksOpenLabel: 'Agenda ouvert', + booksOpenHelper: 'Prends-tu actuellement des rendez-vous ?', + depositPlaceholder: 'ex. 50 EUR non remboursable', + minimumPlaceholder: 'ex. 80 EUR', + }, + trainer: { + seoTitle: 'Devenir coach / kiné - SkateSpots', + seoDescription: 'Aide les skateurs à devenir forts et à rester en bonne santé — force, mobilité, prévention des blessures et récupération.', + heading: 'Coach / kiné', + tagline: 'Force, mobilité, prévention des blessures et récupération pour les skateurs', + noun: 'coach', + rateLabel: 'Tarif / séance', + portfolioLabel: 'Lien profil / réservation', + sectionFocus: 'Spécialité', + sectionInjuries: 'Blessures que tu traites', + sectionCredentialsSetting: 'Qualifications et cadre', + credentialsPlaceholder: 'ex. diplôme de kinésithérapie, CSCS…', + credentialsHelper: 'Indique de vraies qualifications — les skateurs font confiance aux diplômes vérifiables.', + remoteLabel: 'À distance / en ligne', + remoteHelper: 'Proposes-tu du coaching ou des consultations en ligne ?', + modalitiesPlaceholder: 'ex. manuel, renforcement, dry needling', + }, + barber: { + seoTitle: 'Devenir coiffeur / barbier - SkateSpots', + seoDescription: 'Présente ton salon ou ton fauteuil pour la scène skate — coupes, dégradés, tailles de barbe, couleur et plus. Fais-toi réserver par les skateurs.', + heading: 'Barbier / coiffeur', + tagline: 'Coupes, dégradés et tailles de barbe pour la scène — salon ou à domicile', + noun: 'barbier', + rateLabel: 'Prix / coupe', + portfolioLabel: 'Galerie de coupes / lien IG', + sectionWhatYouOffer: 'Ce que tu proposes', + sectionSignatureStyles: 'Styles signature', + sectionSetting: 'Cadre', + studioLabel: 'Salon / studio', + studioPlaceholder: 'Nom du salon ou du studio (facultatif)', + booksOpenLabel: 'Agenda ouvert', + booksOpenHelper: 'Prends-tu actuellement des rendez-vous ?', + durationPlaceholder: 'ex. 30–45 min', + }, + }, + weatherUi: { + condition: { + clearSky: 'Ciel dégagé', + mainlyClear: 'Plutôt dégagé', + partlyCloudy: 'Partiellement nuageux', + overcast: 'Couvert', + foggy: 'Brouillard', + depositingRimeFog: 'Brouillard givrant déposant du givre', + lightDrizzle: 'Bruine légère', + moderateDrizzle: 'Bruine modérée', + denseDrizzle: 'Bruine dense', + lightFreezingDrizzle: 'Bruine verglaçante légère', + denseFreezingDrizzle: 'Bruine verglaçante dense', + slightRain: 'Pluie faible', + moderateRain: 'Pluie modérée', + heavyRain: 'Pluie forte', + lightFreezingRain: 'Pluie verglaçante légère', + heavyFreezingRain: 'Pluie verglaçante forte', + slightSnow: 'Neige faible', + moderateSnow: 'Neige modérée', + heavySnow: 'Neige forte', + snowGrains: 'Grains de neige', + slightRainShowers: 'Averses de pluie faibles', + moderateRainShowers: 'Averses de pluie modérées', + violentRainShowers: 'Averses de pluie violentes', + slightSnowShowers: 'Averses de neige faibles', + heavySnowShowers: 'Averses de neige fortes', + thunderstorm: 'Orage', + thunderstormSlightHail: 'Orage avec grêle légère', + thunderstormHeavyHail: 'Orage avec grêle forte', + unknown: 'Inconnu', + }, + aqi: { + good: 'Bon', + moderate: 'Modéré', + unhealthySensitive: 'Mauvais pour les groupes sensibles', + unhealthy: 'Mauvais', + veryUnhealthy: 'Très mauvais', + hazardous: 'Dangereux', + }, + skateability: { + perfect: 'Parfait', + good: 'Bon', + okay: 'Correct', + poor: 'Médiocre', + bad: 'Mauvais', + unrideable: 'Impraticable', + }, + reason: { + currentlyRaining: 'Il pleut actuellement', + raining: 'Il pleut', + snowing: 'Il neige', + thunderstorm: 'Orage', + freezingTemperature: 'Température glaciale', + veryCold: 'Très froid', + extremelyHot: 'Extrêmement chaud', + veryHot: 'Très chaud', + veryStrongWind: 'Vent très fort', + strongWind: 'Vent fort', + moderateWind: 'Vent modéré', + veryUnhealthyAir: 'Air très malsain', + unhealthyAir: 'Air malsain', + moderateAirQuality: 'Qualité de l’air modérée', + veryHumid: 'Très humide', + humid: 'Humide', + extremeUv: 'UV extrêmes - mets de la crème solaire', + highUv: 'UV élevés - protection solaire recommandée', + perfectConditions: 'Conditions parfaites pour skater', + }, + }, + skaterLabelsUi: { + stance: { + regular: 'Regular', + goofy: 'Goofy', + }, + style: { + street: 'Street', + park: 'Park', + vert: 'Vert', + transition: 'Transition', + bowl: 'Bowl', + cruising: 'Cruising', + downhill: 'Downhill', + freestyle: 'Freestyle', + ledges: 'Ledges', + stairs: 'Stairs', + diy: 'DIY', + }, + level: { + grom: 'Grom', + intermediate: 'Intermédiaire', + advanced: 'Avancé', + ripper: 'Ripper', + }, + sponsor: { + title: 'Sponsor principal', + gold: 'Or', + silver: 'Argent', + partner: 'Partenaire', + }, + }, + notifyUi: { + activity: { + zappedWithAmount: 'Tu as reçu {{sats}} sats', + zapped: 'Tu as reçu un zap', + liked: 'Quelqu’un a aimé ta publication', + reposted: 'Quelqu’un t’a repartagé', + mentioned: 'Quelqu’un t’a mentionné', + replied: 'Quelqu’un t’a répondu', + rsvp: 'Quelqu’un a confirmé sa présence à ton événement', + eventUpdated: 'Un événement auquel tu vas a été mis à jour', + newActivity: 'Nouvelle activité', + tapToOpen: 'Touche pour ouvrir SkateSpots', + }, + crew: { + inviteTitle: 'Invitation de Crew', + inviteBody: 'Tu es invité à rejoindre {{crew}}', + addedTitle: 'Tu as été ajouté à un Crew', + addedBody: '{{crew}} — confirme pour rejoindre', + joinRequestTitle: 'Demande d’adhésion', + joinRequestBody: 'Quelqu’un veut rejoindre {{name}}', + }, + dm: { + title: 'Nouveau message direct', + body: 'Touche pour le lire', + }, + trade: { + confirm: 'Confirmer un échange', + confirmed: 'Échange confirmé', + newOffer: 'Nouvelle offre sur ton annonce', + counter: 'Contre-offre', + accepted: 'Offre acceptée 🎉', + declined: 'Offre refusée', + withdrawn: 'Offre retirée', + }, + newsletter: { + drop: 'Nouveau drop SkateSpots', + }, + summary: { + moreUpdates: '{{count}} mises à jour de plus', + openToCatchUp: 'Ouvre SkateSpots pour te rattraper', + }, + }, + legacyMiscUi: { + hostingGoing: '{{count}} présents', + hostingInterested: '{{count}} intéressés', + hostingPostUpdate: 'Publier une mise à jour', + hostingEdit: 'Modifier', + hostingLoginToSee: 'Connecte-toi pour voir les événements que tu organises.', + hostingEmptyTitle: 'Tu n’organises encore rien', + hostingEmptyBody: 'Organise un jam, une compétition ou une session. Crée un événement et les skateurs pourront confirmer leur présence, recevoir des mises à jour et débarquer.', + hostingCreateEvent: 'Créer un événement', + hostingUpcoming: 'À venir · {{count}}', + hostingPast: 'Passés · {{count}}', + sponsorPartners: 'Partenaires', + sponsorTitleSponsor: 'Sponsor principal', + sponsorPlatformPartners: 'Partenaires plateforme', + reportsUntitled: '(sans titre)', + reportsResolveFailed: 'Impossible de résoudre l’événement signalé (il a peut-être été supprimé, ou le signalement vise un profil plutôt qu’une publication).', + reportsLookAtIt: 'Regarder', + reportsNoReports: 'Aucun signalement pour l’instant. Soit tout va bien, soit personne n’a trouvé le bouton.', + statusSetYourStatus: 'Définir ton statut', + statusSetDesc: 'Montre aux autres ce que tu fais. Ton statut sera visible sur ton profil et sur les Spots liés.', + statusClear: 'Effacer', + statusOrWriteOwn: 'Ou écris le tien', + statusCustomPlaceholder: 'Qu’est-ce que tu fais ?', + statusLinkToSpot: 'Lier à un Spot (facultatif)', + statusSpotSelected: 'Spot sélectionné', + statusSearchSpots: 'Rechercher des spots...', + statusNoSpotsFound: 'Aucun spot trouvé.', + statusSelectSpot: 'Sélectionner un spot', + statusAutoClearAfter: 'Effacement auto après : {{time}}', + statusExpMin: '{{count}} min', + statusExpOneHour: '1 heure', + statusExpHours: '{{count}} heures', + statusExpOneDay: '1 jour', + statusExpDays: '{{count}} jours', + statusSlider15: '15 min', + statusSlider1h: '1 h', + statusSlider4h: '4 h', + statusSlider24h: '24 h', + statusSetting: 'Définition du statut...', + statusSet: 'Définir le statut', + statusSomethingWrong: 'Une erreur est survenue', + seoProfileTitle: 'Profil - SkateSpots', + seoViewProfile: 'Voir le profil.', + bannerAlt: 'Bannière', + openInCordn: 'Ouvrir dans Cordn', + modHelp: 'Masquer publie org.skatespots.moderation / hidden ; Confirmer publie … / verified ; Annuler publie … / cleared (retour à neutre). Les trois sont des étiquettes publiques et réversibles — rien n’est jamais supprimé des relays.', + zapNoActiveMint: 'Aucun mint Cashu actif trouvé.', + altProfile: 'Profil', + altCardPreview: 'Aperçu de la carte', + altCard: 'Carte', + altCaptured: 'Capturé', + ariaPrevPhoto: 'Photo précédente', + ariaNextPhoto: 'Photo suivante', + ariaCommentOptions: 'Options de commentaire', + ariaMessageConversation: 'Conversation de messages', + exportTitle: 'SkateSpots — Calculateur de coût de deck', + exportQuoteTitle: 'DEVIS', + exportPngTitle: 'Coût du deck', + exportMarkdownTitle: 'Calculateur de coût de deck', + exportSectionLabor: 'Main-d’œuvre', + exportSectionEquipment: 'Équipement', + exportSectionOperations: 'Frais d’exploitation', + exportSectionMaterials: 'Matériaux', + exportSectionProcesses: 'Coûts de traitement', + exportSectionPackaging: 'Emballage', + exportSectionResult: 'Résultat', + exportLabelOperations: 'Opérations', + exportLabelProcesses: 'Traitements', + exportKvHourlyRate: 'Taux horaire', + exportKvLabourBurden: 'Charges sur la main-d’œuvre', + exportKvLoadedRate: 'Taux chargé', + exportKvEquipmentPerBoard: 'Équipement par planche', + exportKvBoardsPerMonth: 'Planches / mois', + exportKvRentPerMonth: 'Loyer / mois', + exportKvUtilitiesPerMonth: 'Charges / mois', + exportKvSubscriptionsPerMonth: 'Abonnements / mois', + exportKvPerBoard: 'Par planche', + exportKvMaterialsPerBoard: 'Matériaux par planche', + exportKvProcessesPerBoard: 'Traitements par planche', + exportKvPackagingPerBoard: 'Emballage par planche', + exportKvMarkup: 'Marge', + exportMarkupValue: '{{markup}}× (≈ {{pct}} % de marge brute)', + exportKvWasteEffective: 'Chutes (effectif)', + exportKvCostNoPack: 'Coût / planche (sans emballage)', + exportKvCostWithPack: 'Coût / planche (avec emballage)', + exportKvBatchSetupPerBoard: 'Configuration par lot / planche', + exportKvTax: 'Taxe ({{pct}} %)', + exportKvTaxIncluded: 'Taxe ({{pct}} %, incluse)', + exportKvSellingNoPack: 'Prix de vente (sans emballage)', + exportKvSellingWithPack: 'Prix de vente (avec emballage)', + exportShippingNote: 'N’inclut pas la livraison à l’acheteur.', + exportGeneratedBy: 'Généré par SkateSpots · skate-spots.org', + exportGeneratedWith: 'Généré avec SkateSpots · skate-spots.org', + exportDetailSetup: '+ {{hours}} h de configuration', + exportDetailBoards: '{{boards}} planches', + exportDetailShip: '+ {{amount}} de livraison', + exportDetailMinutes: '{{minutes}} min', + exportDetailPerBoards: '/ {{boards}} planches', + exportDetailScrap: '{{pct}} % de chutes', + exportDetailMaterials: '{{materials}} matériaux', + exportQuoteRef: 'Réf. {{ref}}', + exportQuoteLineItem: 'Deck de skateboard personnalisé', + exportQuoteLineItemQty: 'Deck de skateboard personnalisé × {{qty}}', + exportQuoteLineDesc: 'Fabriqué à la main, fini et emballé. Quantité 1.', + exportQuoteLineDescQty: 'Fabriqué à la main, fini et emballé. {{price}} l’unité.', + exportQuoteSubtotal: 'Sous-total', + exportQuoteSubtotalQty: 'Sous-total ({{qty}} decks)', + exportQuoteTax: 'Taxe / TVA ({{pct}} %)', + exportQuoteTotal: 'Total', + exportQuoteTotalQty: 'Total ({{qty}} decks)', + exportQuoteIncludesTax: 'Inclut {{pct}} % de taxe ({{amount}})', + exportQuoteDeposit: 'Acompte à verser maintenant ({{pct}} %)', + exportQuoteBalance: 'Solde à la réalisation', + exportQuotePayment: 'Paiement : {{value}}', + exportQuoteLightning: 'Lightning : {{value}}', + exportQuoteDetails: 'Détails : {{value}}', + exportQuoteTerms: 'Conditions : {{value}}', + exportQuoteDelivery: 'Livraison : {{value}}', + exportQuoteValidUntil: 'N’inclut pas la livraison. Devis valable jusqu’au {{date}}.', + exportPngSellingWith: 'PRIX DE VENTE · AVEC EMBALLAGE', + exportPngSellingNo: 'PRIX DE VENTE · SANS EMBALLAGE', + exportPngCostWith: 'COÛT / PLANCHE (AVEC EMBALLAGE)', + exportPngDeposit: 'Acompte {{pct}} % : {{amount}}', + exportXlsxSummary: 'Résumé', + exportXlsxCurrency: 'Devise', + exportXlsxDate: 'Date', + exportXlsxOperationsPerBoard: 'Opérations par planche', + exportColCost: 'Coût', + exportColSetupH: 'Installation (h)', + exportColBoards: 'Planches', + exportColPerBoard: 'Par planche', + exportColMaterial: 'Matériau', + exportColOrderCost: 'Coût de commande', + exportColShipping: 'Livraison', + exportColOrderMin: 'Commande (min)', + exportColUnloadMin: 'Déchargement (min)', + exportColProcess: 'Traitement', + exportColTimeMin: 'Temps (min)', + exportColTimeBoardMin: 'Temps/planche (min)', + exportColMaterialsBoard: 'Matériaux/planche', + exportCopyTitle: 'Coût du deck — {{currency}}', + exportCopyCostWith: 'Coût / planche (avec emballage) : {{amount}}', + exportCopySellingNo: 'Prix de vente (sans emballage) : {{amount}}', + exportCopySellingWith: 'Prix de vente (avec emballage) : {{amount}}', + exportCopyBreakdown: 'Équipement {{equipment}} · Opérations {{operations}} · Matériaux {{materials}} · Traitements {{processes}} · Emballage {{packaging}}', + exportMdHourlyRate: 'Taux horaire : {{value}}', + exportMdLabourBurden: 'Charges sur la main-d’œuvre : {{value}}', + exportMdLoadedRate: 'Taux chargé : {{value}}', + exportMdBoardsPerMonth: 'Planches/mois : {{value}}', + exportMdRent: 'Loyer : {{value}}', + exportMdUtilities: 'Charges : {{value}}', + exportMdSubscriptions: 'Abonnements : {{value}}', + exportMdPerBoard: 'Par planche : {{value}}', + exportMdMarkupWaste: 'Marge : {{markup}}× (≈ {{pct}} % de marge brute) · Chutes : {{waste}} %', + exportMdCostNoPack: 'Coût/planche (sans emballage) : {{value}}', + exportMdCostWithPack: 'Coût/planche (avec emballage) : {{value}}', + exportMdBatchSetup: 'Configuration par lot/planche : {{value}}', + exportMdSellingNo: 'Prix de vente (sans emballage) : {{value}}', + exportMdSellingWith: 'Prix de vente (avec emballage) : {{value}}', + exportMdDisclaimer: 'N’inclut pas la livraison à l’acheteur. Généré par SkateSpots.', + }, +}; export default frBatch8;