feat: sponsorship opt-in and Bitcoin grantmaker inquiry

This commit is contained in:
SkateSpots 2026-10-29 20:57:43 +07:00
parent 8a6968735c
commit 3f35a6f3a4
53 changed files with 736 additions and 10 deletions

View file

@ -20,7 +20,7 @@ import { Input } from '@/components/ui/input';
import { Textarea } from '@/components/ui/textarea';
import { Switch } from '@/components/ui/switch';
import { Label } from '@/components/ui/label';
import { Loader2, Upload, Zap, ShieldCheck, AlertCircle, Bitcoin, Award, MessageSquareLock, UserRound, X, Plus, Bot, BadgeCheck, HelpCircle, Server, AtSign } from 'lucide-react';
import { Loader2, Upload, Zap, ShieldCheck, AlertCircle, Bitcoin, Award, MessageSquareLock, UserRound, Handshake, X, Plus, Bot, BadgeCheck, HelpCircle, Server, AtSign } from 'lucide-react';
import { NSchema as n, type NostrMetadata } from '@nostrify/nostrify';
import { useQueryClient } from '@tanstack/react-query';
import { useUploadFile } from '@/hooks/useUploadFile';
@ -72,6 +72,8 @@ export const EditProfileForm: React.FC = () => {
// pointer formats as Settings → Coordinator (nprofile / cordn.net link /
// npub / hex) as well as an http(s) URL — this is the discovery field.
const [cordn, setCordn] = useState('');
const [openToSponsorships, setOpenToSponsorships] = useState(false);
const [sponsorNote, setSponsorNote] = useState('');
// Extra personal NIP-05 handles — stored in a separate kind-30078 record so
// another client re-saving the profile can't drop them.
@ -131,6 +133,8 @@ export const EditProfileForm: React.FC = () => {
);
}
if (typeof raw.cordn === 'string') setCordn(raw.cordn);
setOpenToSponsorships(raw.sponsorships_open === true);
if (typeof raw.sponsorships_note === 'string') setSponsorNote(raw.sponsorships_note);
}
}, [metadata, form]);
@ -252,6 +256,17 @@ export const EditProfileForm: React.FC = () => {
// Retire the legacy field now that badges supersede it.
delete data.sponsors;
// Sponsorship opt-in (custom kind-0 fields). The profile only claims
// this when the skater explicitly turned it on.
if (openToSponsorships) {
data.sponsorships_open = true;
if (sponsorNote.trim()) data.sponsorships_note = sponsorNote.trim();
else delete data.sponsorships_note;
} else {
delete data.sponsorships_open;
delete data.sponsorships_note;
}
// Cordn contact link (custom field).
if (cordnTrimmed) {
// Normalise a bare pointer (nprofile/npub/hex) to Cordn's canonical
@ -402,6 +417,41 @@ export const EditProfileForm: React.FC = () => {
)}
/>
{/* Sponsorship opt-in — explicit consent, never inferred from activity. */}
<div className="space-y-3 rounded-xl border border-pink-500/20 bg-pink-500/[0.04] p-3">
<div className="flex items-center justify-between gap-3">
<div className="min-w-0">
<Label htmlFor="profile-open-sponsorships" className="flex items-center gap-2 text-sm font-semibold">
<Handshake className="h-4 w-4 text-pink-400" />
{t('settingsUi.editProfile.openToSponsorships')}
</Label>
<p className="mt-1 text-xs text-muted-foreground">
{t('settingsUi.editProfile.openToSponsorshipsHint')}
</p>
</div>
<Switch
id="profile-open-sponsorships"
checked={openToSponsorships}
onCheckedChange={setOpenToSponsorships}
/>
</div>
{openToSponsorships && (
<div className="space-y-1.5">
<Label htmlFor="profile-sponsor-note" className="text-xs font-bold uppercase tracking-wide text-pink-300">
{t('settingsUi.editProfile.sponsorNote')}
</Label>
<Textarea
id="profile-sponsor-note"
value={sponsorNote}
onChange={(event) => setSponsorNote(event.target.value)}
placeholder={t('settingsUi.editProfile.sponsorNotePlaceholder')}
maxLength={180}
rows={2}
/>
</div>
)}
</div>
{/* NIP-05 — the verified-handle field. Given real prominence + live
verification feedback so people know if it's actually working. */}
<FormField

View file

@ -353,6 +353,10 @@ const batch3 = {
"bannerImage": "Imatge de portada",
"bannerDesc": "Una imatge ampla per a la part superior del teu perfil.",
"website": "Lloc web",
"openToSponsorships": "Obert a patrocinis",
"openToSponsorshipsHint": "Mostra una targeta de patrocini/col·laboració al teu perfil. No es comparteix res fins que algú t'escriu.",
"sponsorNote": "Nota de patrocini (opcional)",
"sponsorNotePlaceholder": "p. ex. Obert a socis de taules, sabates, viatges i esdeveniments.",
"bitcoinTitle": "Bitcoin i pagaments",
"bitcoinDesc": "Deixa que la gent t'enviï zaps, propines i pagaments directament, sense intermediaris.",
"lightningAddress": "Adreça Lightning",

View file

@ -833,6 +833,21 @@ const batch6 = {
our: "LA NOSTRA",
community: "COMUNITAT",
heroDesc: "SkateSpots està fet per a la comunitat i per la comunitat. Suportadors, col·laboradors, socis i amics que el mantenen gratuït i descentralitzat.",
grantsSection: "Entitats finançadores de Bitcoin",
grantsSectionDesc: "Per a organitzacions que atorguen subvencions a projectes Bitcoin de codi obert.",
grantsTitle: "Oberts a patrocinis · Entitats finançadores de Bitcoin",
grantsDisclaimer: "Vols donar a aquest projecte? Omple el formulari. No per fer-nos KYC a nosaltres — sinó per fer-te KYC a TU.",
grantsDisclaimerDesc: "Aquest canal és només per a entitats finançadores que fan KYC/KYB als seus beneficiaris. Si ets un skater que només vol donar, usa les vies Lightning, Silent Payments o Angor de dalt — ningú no necessita el teu passaport.",
grantsOrg: "Organització",
grantsContact: "Contacte (npub, correu electrònic o nom d'usuari)",
grantsWebsite: "Lloc web",
grantsProgram: "Programa / ronda de subvencions",
grantsSize: "Import de la subvenció",
grantsKyc: "Procés de KYC / KYB",
grantsFund: "Què vols finançar?",
grantsAck: "Confirmo que som una entitat finançadora que fa KYC/KYB als seus beneficiaris.",
grantsSend: "Obrir conversa sobre la subvenció",
grantsNote: "Obre un missatge privat al propietari de SkateSpots. No es desa res en aquesta pàgina.",
backAngor: "Dona'ns suport a Angor",
backers: "Suportadors",
backersDesc: "Skaters que han donat suport a SkateSpots — finançament on-chain via Angor i zaps Lightning al projecte.",
@ -963,12 +978,14 @@ const batch6 = {
nip05NotVerified: "NIP-05 no verificat amb aquesta clau",
message: "Missatge",
eventsHosted: "Esdeveniments organitzats",
openToSponsorships: "Obert a patrocinis",
forSponsors: "Per a patrocinadors i col·laboracions",
sponsorPitch: "Patrocini, col·laboració, foto/vídeo o esdeveniment? Comença una conversa.",
startCollab: "Inicia un xat de col·laboració",
viewRiderCard: "Veure la fitxa del patinador",
collabMessage: "Hola {{name}}, voldria parlar d'un patrocini o d'una col·laboració.",
followers: "Seguidors",
followersHint: "Llistes de seguidors reportades pels relés: no són analítiques auditades.",
following: "Seguint",
follow: "Segueix",
unfollow: "Deixa de seguir",

View file

@ -349,6 +349,10 @@ const csBatch3 = {
bannerImage: "Obrázek banneru",
bannerDesc: "Široký obrázek pro horní část tvého profilu.",
website: "Web",
openToSponsorships: "Otevřeno sponzorům",
openToSponsorshipsHint: "Na profilu zobrazí kartu pro sponzory a spolupráce. Nic se nesdílí, dokud ti někdo nenapíše.",
sponsorNote: "Poznámka ke sponzoringu (volitelné)",
sponsorNotePlaceholder: "např. Otevřeno partnerům pro prkna, boty, cestování a akce.",
bitcoinTitle: "Bitcoin a platby",
bitcoinDesc: "Nech lidi posílat ti zaps, spropitné a platby přímo — bez prostředníka.",
lightningAddress: "Lightning adresa",

View file

@ -807,6 +807,21 @@ export const csBatch4 = {
our: "NAŠE",
community: "KOMUNITA",
heroDesc: "SkateSpots je tvořen komunitou a pro komunitu. Podporovatelé, spolupracovníci, partneři a přátelé, kteří drží tohle zdarma a decentralizované.",
grantsSection: "Poskytovatelé grantů na Bitcoin",
grantsSectionDesc: "Pro organizace, které udělují granty otevřeným bitcoinovým projektům.",
grantsTitle: "Otevřeno sponzorství · Poskytovatelé grantů na Bitcoin",
grantsDisclaimer: "Chceš tomuto projektu přispět? Vyplň formulář. Ne abychom prošli KYC my — ale abys prošel KYC TY.",
grantsDisclaimerDesc: "Tato kolonka je jen pro poskytovatele grantů, kteří dělají KYC/KYB svým příjemcům. Pokud jsi skejťák, který chce jen přispět, použij výše uvedené cesty Lightning, Silent Payments nebo Angor — tvůj pas nikdo nepotřebuje.",
grantsOrg: "Organizace",
grantsContact: "Kontakt (npub, e-mail nebo přezdívka)",
grantsWebsite: "Web",
grantsProgram: "Grantový program / kolo",
grantsSize: "Velikost grantu",
grantsKyc: "Proces KYC / KYB",
grantsFund: "Co bys chtěl financovat?",
grantsAck: "Potvrzuji, že jsme poskytovatel grantů, který dělá KYC/KYB svým příjemcům.",
grantsSend: "Zahájit rozhovor o grantu",
grantsNote: "Otevře soukromou zprávu majiteli SkateSpots. Na této stránce se nic neukládá.",
backAngor: "Podpoř nás na Angor",
backers: "Podporovatelé",
backersDesc: "Skejťáci, kteří podpořili SkateSpots — on-chain financování přes Angor a Lightning zaps pro projekt.",
@ -937,12 +952,14 @@ export const csBatch4 = {
nip05NotVerified: "NIP-05 neověřeno vůči tomuto klíči",
message: "Zpráva",
eventsHosted: "Uspořádané akce",
openToSponsorships: "Otevřeno sponzorům",
forSponsors: "Pro sponzory a spolupráce",
sponsorPitch: "Sponzorství, spolupráce, foto/video nebo akce? Začni konverzaci.",
startCollab: "Začít chat o spolupráci",
viewRiderCard: "Zobrazit kartu jezdce",
collabMessage: "Ahoj {{name}}, chtěl bych mluvit o sponzorství nebo spolupráci.",
followers: "Sledující",
followersHint: "Seznamy sledujících hlášené relayi — nejde o auditovanou analytiku.",
following: "Sleduji",
follow: "Sledovat",
unfollow: "Přestat sledovat",

View file

@ -349,6 +349,10 @@ const deBatch3 = {
bannerImage: "Bannerbild",
bannerDesc: "Ein breites Bild für den oberen Bereich deines Profils.",
website: "Website",
openToSponsorships: "Offen für Sponsoring",
openToSponsorshipsHint: "Zeigt eine Sponsoring-/Kooperationskarte in deinem Profil. Es wird nichts geteilt, bis dir jemand schreibt.",
sponsorNote: "Sponsoring-Notiz (optional)",
sponsorNotePlaceholder: "z. B. offen für Partner bei Decks, Schuhen, Reisen und Events.",
bitcoinTitle: "Bitcoin & Zahlungen",
bitcoinDesc: "Lass andere dich direkt zappen, bezahlen und dir Trinkgeld geben — ohne Mittelsmann.",
lightningAddress: "Lightning-Adresse",

View file

@ -807,6 +807,21 @@ const deBatch4 = {
our: "UNSERE",
community: "COMMUNITY",
heroDesc: "SkateSpots wird von und für die Community gebaut. Unterstützer, Mitwirkende, Partner und Freunde, die das hier kostenlos und dezentral halten.",
grantsSection: "Bitcoin-Förderorganisationen",
grantsSectionDesc: "Für Organisationen, die Zuschüsse an quelloffene Bitcoin-Projekte vergeben.",
grantsTitle: "Offen für Sponsoring · Bitcoin-Förderorganisationen",
grantsDisclaimer: "Du willst dieses Projekt unterstützen? Füll das Formular aus. Nicht um uns zu KYCen – sondern um DICH zu KYCen.",
grantsDisclaimerDesc: "Dieser Bereich ist nur für Förderorganisationen, die bei ihren Empfängern KYC/KYB durchführen. Wenn du ein Skater bist, der einfach nur spenden will, nutz die Lightning-, Silent-Payments- oder Angor-Wege oben – niemand braucht deinen Pass.",
grantsOrg: "Organisation",
grantsContact: "Kontakt (npub, E-Mail oder Nutzername)",
grantsWebsite: "Webseite",
grantsProgram: "Förderprogramm / Runde",
grantsSize: "Förderhöhe",
grantsKyc: "KYC-/KYB-Verfahren",
grantsFund: "Was möchtest du finanzieren?",
grantsAck: "Ich bestätige, dass wir eine Förderorganisation sind, die bei unseren Empfängern KYC/KYB durchführt.",
grantsSend: "Fördergespräch starten",
grantsNote: "Öffnet eine private Direktnachricht an den Betreiber von SkateSpots. Auf dieser Seite wird nichts gespeichert.",
backAngor: "Unterstütze uns auf Angor",
backers: "Unterstützer",
backersDesc: "Skater, die SkateSpots unterstützt haben – On-Chain-Finanzierung über Angor und Lightning-Zaps an das Projekt.",
@ -937,12 +952,14 @@ const deBatch4 = {
nip05NotVerified: "NIP-05 nicht gegen diesen Schlüssel verifiziert",
message: "Nachricht",
eventsHosted: "Organisierte Events",
openToSponsorships: "Offen für Sponsoring",
forSponsors: "Für Sponsoren & Kooperationen",
sponsorPitch: "Sponsoring, Kooperation, Foto/Video oder Event? Starte ein Gespräch.",
startCollab: "Kooperations-Chat starten",
viewRiderCard: "Skateboarder-Karte ansehen",
collabMessage: "Hi {{name}}, ich würde gern über ein Sponsoring oder eine Kooperation sprechen.",
followers: "Follower",
followersHint: "Von Relays gemeldete Follower-Listen – keine geprüften Analysedaten.",
following: "Folge ich",
follow: "Folgen",
unfollow: "Entfolgen",

View file

@ -349,6 +349,10 @@ const elBatch3 = {
bannerImage: "Εικόνα banner",
bannerDesc: "Μια φαρδιά εικόνα για το πάνω μέρος του προφίλ σου.",
website: "Ιστοσελίδα",
openToSponsorships: "Ανοιχτός σε χορηγίες",
openToSponsorshipsHint: "Εμφανίζει μια κάρτα χορηγίας/συνεργασίας στο προφίλ σου. Τίποτα δεν κοινοποιείται μέχρι να σου στείλει κάποιος μήνυμα.",
sponsorNote: "Σημείωση χορηγίας (προαιρετικό)",
sponsorNotePlaceholder: "π.χ. Ανοιχτός σε συνεργάτες για σανίδες, παπούτσια, ταξίδια και εκδηλώσεις.",
bitcoinTitle: "Bitcoin & Πληρωμές",
bitcoinDesc: "Άφησε τους άλλους να σου κάνουν zap, tip και να σε πληρώνουν απευθείας — χωρίς μεσάζοντα.",
lightningAddress: "Διεύθυνση Lightning",

View file

@ -807,6 +807,21 @@ const elBatch4 = {
our: "Η ΔΙΚΗ ΜΑΣ",
community: "ΚΟΙΝΟΤΗΤΑ",
heroDesc: "Το SkateSpots χτίζεται από και για την κοινότητα. Υποστηρικτές, συνεργάτες, partners και φίλοι που το κρατούν δωρεάν και αποκεντρωμένο.",
grantsSection: "Χρηματοδότες του Bitcoin",
grantsSectionDesc: "Για οργανισμούς που χορηγούν επιχορηγήσεις σε έργα Bitcoin ανοιχτού κώδικα.",
grantsTitle: "Ανοιχτό σε χορηγίες · Χρηματοδότες του Bitcoin",
grantsDisclaimer: "Θέλεις να δωρίσεις σε αυτό το έργο; Συμπλήρωσε τη φόρμα. Όχι για να μας κάνουν KYC — αλλά για να σου κάνουν KYC ΕΣΕΝΑ.",
grantsDisclaimerDesc: "Αυτό το κανάλι είναι μόνο για χρηματοδότες που κάνουν KYC/KYB στους αποδέκτες τους. Αν είσαι skater και θέλεις απλώς να δωρίσεις, χρησιμοποίησε τις διαδρομές Lightning, Silent Payments ή Angor παραπάνω — κανείς δεν χρειάζεται το διαβατήριό σου.",
grantsOrg: "Οργανισμός",
grantsContact: "Επικοινωνία (npub, ηλεκτρονικό ταχυδρομείο ή ψευδώνυμο)",
grantsWebsite: "Ιστότοπος",
grantsProgram: "Πρόγραμμα / γύρος επιχορηγήσεων",
grantsSize: "Μέγεθος επιχορήγησης",
grantsKyc: "Διαδικασία KYC / KYB",
grantsFund: "Τι θα ήθελες να χρηματοδοτήσεις;",
grantsAck: "Επιβεβαιώνω ότι είμαστε χρηματοδότης που κάνει KYC/KYB στους αποδέκτες του.",
grantsSend: "Άνοιγμα συζήτησης για επιχορήγηση",
grantsNote: "Ανοίγει ιδιωτικό μήνυμα στον ιδιοκτήτη του SkateSpots. Δεν αποθηκεύεται τίποτα σε αυτή τη σελίδα.",
backAngor: "Στήριξέ μας στο Angor",
backers: "Υποστηρικτές",
backersDesc: "Skaters που στήριξαν το SkateSpots — χρηματοδότηση on-chain μέσω Angor και Lightning zaps στο έργο.",
@ -937,12 +952,14 @@ const elBatch4 = {
nip05NotVerified: "Το NIP-05 δεν επαληθεύτηκε με αυτό το κλειδί",
message: "Μήνυμα",
eventsHosted: "Εκδηλώσεις που διοργάνωσες",
openToSponsorships: "Ανοιχτός σε χορηγίες",
forSponsors: "Για χορηγούς και συνεργασίες",
sponsorPitch: "Χορηγία, συνεργασία, φωτογραφία/βίντεο ή εκδήλωση; Ξεκίνα μια συζήτηση.",
startCollab: "Έναρξη συνομιλίας συνεργασίας",
viewRiderCard: "Προβολή κάρτας σκέιτερ",
collabMessage: "Γεια σου {{name}}, θα ήθελα να μιλήσουμε για χορηγία ή συνεργασία.",
followers: "Ακόλουθοι",
followersHint: "Λίστες ακολούθων από τα relays — όχι ελεγμένα αναλυτικά στοιχεία.",
following: "Ακολουθείς",
follow: "Ακολούθησε",
unfollow: "Σταμάτα να ακολουθείς",

View file

@ -4838,6 +4838,10 @@ settingsUi: {
bannerImage: 'Banner image',
bannerDesc: 'A wide image for the top of your profile.',
website: 'Website',
openToSponsorships: 'Open to sponsorships',
openToSponsorshipsHint: 'Shows a sponsor/collab card on your profile. Nothing is shared until someone messages you.',
sponsorNote: 'Sponsorship note (optional)',
sponsorNotePlaceholder: 'e.g. Open to deck, shoe, travel and event partners.',
bitcoinTitle: 'Bitcoin & Payments',
bitcoinDesc: 'Let people zap, tip and pay you directly — no middleman.',
lightningAddress: 'Lightning address',
@ -6615,6 +6619,21 @@ walletUi: {
our: 'OUR',
community: 'COMMUNITY',
heroDesc: 'SkateSpots is built by and for the community. Supporters, collaborators, partners and friends keeping this free and decentralized.',
grantsSection: 'Bitcoin grantmakers',
grantsSectionDesc: 'For organizations that issue grants to open-source Bitcoin projects.',
grantsTitle: 'Open to sponsorships · Bitcoin grantmakers',
grantsDisclaimer: 'Want to donate to this project? Fill the form. Not to KYC us — to KYC YOU.',
grantsDisclaimerDesc: "This lane is only for grantmakers that KYC/KYB their grantees. If you're a skater who just wants to donate, use the Lightning, Silent Payments or Angor rails above — nobody needs your passport.",
grantsOrg: 'Organization',
grantsContact: 'Contact (npub, email or handle)',
grantsWebsite: 'Website',
grantsProgram: 'Grant program / round',
grantsSize: 'Grant size',
grantsKyc: 'KYC / KYB process',
grantsFund: 'What would you like to fund?',
grantsAck: 'I confirm we are a grantmaker that KYC/KYB our grantees.',
grantsSend: 'Open grant conversation',
grantsNote: 'Opens a private DM to the SkateSpots owner. Nothing is stored on this page.',
backAngor: 'Back us on Angor',
backers: 'Supporters',
backersDesc: 'Skaters who backed SkateSpots — on-chain funding via Angor, and Lightning zaps to the project.',
@ -6745,12 +6764,14 @@ walletUi: {
nip05NotVerified: 'NIP-05 not verified against this key',
message: 'Message',
eventsHosted: 'Events hosted',
openToSponsorships: 'Open to sponsorships',
forSponsors: 'For sponsors & collabs',
sponsorPitch: 'Sponsorship, collab, photo/video or event? Start a conversation.',
startCollab: 'Start a collab chat',
viewRiderCard: 'View rider card',
collabMessage: "Hi {{name}}, I'd like to talk about a sponsorship or collaboration.",
followers: 'Followers',
followersHint: 'Relay-reported follow lists — not audited analytics.',
following: 'Following',
follow: 'Follow',
unfollow: 'Unfollow',

View file

@ -4838,6 +4838,10 @@ settingsUi: {
bannerImage: 'Imagen de portada',
bannerDesc: 'Una imagen ancha para la parte superior de tu perfil.',
website: 'Sitio web',
openToSponsorships: 'Abierto a patrocinios',
openToSponsorshipsHint: 'Muestra una tarjeta de patrocinio/colaboración en tu perfil. No se comparte nada hasta que alguien te escriba.',
sponsorNote: 'Nota de patrocinio (opcional)',
sponsorNotePlaceholder: 'p. ej. Abierto a tablas, zapatillas, viajes y eventos.',
bitcoinTitle: 'Bitcoin y pagos',
bitcoinDesc: 'Deja que te den zaps, propinas y pagos directamente, sin intermediarios.',
lightningAddress: 'Dirección Lightning',
@ -6615,6 +6619,21 @@ walletUi: {
our: 'NUESTRA',
community: 'COMUNIDAD',
heroDesc: 'SkateSpots lo construye y lo mantiene la comunidad. Patrocinadores, colaboradores, socios y amigos que lo mantienen libre y descentralizado.',
grantsSection: 'Grantmakers de Bitcoin',
grantsSectionDesc: 'Para organizaciones que conceden ayudas a proyectos Bitcoin de código abierto.',
grantsTitle: 'Abierto a patrocinios · grantmakers de Bitcoin',
grantsDisclaimer: '¿Quieres donar a este proyecto? Rellena el formulario. No para hacernos KYC a nosotros, sino para hacerte KYC a TI.',
grantsDisclaimerDesc: 'Este canal es solo para grantmakers que hacen KYC/KYB a sus beneficiarios. Si eres un skater que solo quiere donar, usa las vías de Lightning, Silent Payments o Angor de arriba: nadie necesita tu pasaporte.',
grantsOrg: 'Organización',
grantsContact: 'Contacto (npub, email o usuario)',
grantsWebsite: 'Sitio web',
grantsProgram: 'Programa / ronda de ayudas',
grantsSize: 'Tamaño de la ayuda',
grantsKyc: 'Proceso de KYC / KYB',
grantsFund: '¿Qué te gustaría financiar?',
grantsAck: 'Confirmo que somos un grantmaker que hace KYC/KYB a sus beneficiarios.',
grantsSend: 'Abrir conversación de ayuda',
grantsNote: 'Abre un DM privado al propietario de SkateSpots. No se guarda nada en esta página.',
backAngor: 'Apóyanos en Angor',
backers: 'Patrocinadores',
backersDesc: 'Patinadores que han apoyado SkateSpots — financiación on-chain vía Angor y zaps Lightning al proyecto.',
@ -6745,12 +6764,14 @@ walletUi: {
nip05NotVerified: 'NIP-05 no verificado con esta clave',
message: 'Mensaje',
eventsHosted: 'Eventos organizados',
openToSponsorships: 'Abierto a patrocinios',
forSponsors: 'Para patrocinadores y colaboraciones',
sponsorPitch: '¿Patrocinio, colaboración, foto/vídeo o evento? Empieza una conversación.',
startCollab: 'Iniciar chat de colaboración',
viewRiderCard: 'Ver tarjeta de rider',
collabMessage: 'Hola {{name}}, me gustaría hablar sobre un patrocinio o una colaboración.',
followers: 'Seguidores',
followersHint: 'Listas de seguidores reportadas por relays; no son analíticas auditadas.',
following: 'Siguiendo',
follow: 'Seguir',
unfollow: 'Dejar de seguir',

View file

@ -353,6 +353,10 @@ const batch3 = {
bannerImage: "Banner irudia",
bannerDesc: "Irudi zabal bat zure profilaren goialderako.",
website: "Webgunea",
openToSponsorships: "Babesleentzako irekita",
openToSponsorshipsHint: "Zure profilean babesle/lankidetza txartel bat erakusten du. Ez da ezer partekatzen norbaitek mezua idatzi arte.",
sponsorNote: "Babesleei buruzko oharra (aukerakoa)",
sponsorNotePlaceholder: "adib. Irekita taula, oinetako, bidaia eta ekitaldietako bazkideentzat.",
bitcoinTitle: "Bitcoin eta ordainketak",
bitcoinDesc: "Utzi jendeari zuzenean zap egiten, dirua ematen eta ordaintzen — bitartekaririk gabe.",
lightningAddress: "Lightning helbidea",

View file

@ -833,6 +833,21 @@ const batch6 = {
our: "GURE",
community: "KOMUNITATEA",
heroDesc: "SkateSpots komunitateak egiten du eta komunitatearentzat da. Babesleek, kolaboratzaileek, bazkideek eta lagunek doakoa eta deszentralizatua mantentzen dute.",
grantsSection: "Bitcoin dirulaguntza emaileak",
grantsSectionDesc: "Kode irekiko Bitcoin proiektuei dirulaguntzak ematen dizkieten erakundeentzat.",
grantsTitle: "Babeslekuetara irekita · Bitcoin dirulaguntza emaileak",
grantsDisclaimer: "Proiektu honi eman nahi diozu? Bete formularioa. Ez guri KYC egiteko — ZURI KYC egiteko.",
grantsDisclaimerDesc: "Bide hau beren onuradunei KYC/KYB egiten dieten dirulaguntza emaileentzat soilik da. Donatu besterik ez duen skater bat bazara, erabili goiko Lightning, Silent Payments edo Angor bideak — inork ez du zure pasaportearen beharrik.",
grantsOrg: "Erakundea",
grantsContact: "Kontaktua (npub, helbide elektronikoa edo erabiltzaile-izena)",
grantsWebsite: "Webgunea",
grantsProgram: "Dirulaguntza programa / txanda",
grantsSize: "Dirulaguntzaren zenbatekoa",
grantsKyc: "KYC / KYB prozesua",
grantsFund: "Zer finantzatu nahi duzu?",
grantsAck: "Baieztatzen dut gure onuradunei KYC/KYB egiten dien dirulaguntza emailea garela.",
grantsSend: "Hasi dirulaguntzaren elkarrizketa",
grantsNote: "SkateSpots-en jabeari mezu pribatua irekitzen dio. Orri honetan ez da ezer gordetzen.",
backAngor: "Babestu gaitzazu Angor-en",
backers: "Babesleak",
backersDesc: "SkateSpots babestu zuten skaterrak — Angor bidezko katean egindako finantzaketa eta proiektura zuzendutako Lightning zapak.",
@ -963,12 +978,14 @@ const batch6 = {
nip05NotVerified: "NIP-05 ez da gako honekin egiaztatu",
message: "Mezua",
eventsHosted: "Antolatutako ekitaldiak",
openToSponsorships: "Babesleentzako irekita",
forSponsors: "Babesleentzat eta lankidetzetarako",
sponsorPitch: "Babesa, lankidetza, argazki/bideoa edo ekitaldia? Hasi solasaldia.",
startCollab: "Hasi lankidetza-txata",
viewRiderCard: "Ikusi patinatzailearen txartela",
collabMessage: "Kaixo {{name}}, babes edo lankidetza bati buruz hitz egin nahi nuke.",
followers: "Jarraitzaileak",
followersHint: "Relayek jakinarazitako jarraitzaileen zerrendak — ez dira auditutako analisiak.",
following: "Jarraitzen",
follow: "Jarraitu",
unfollow: "Utzi jarraitzeari",

View file

@ -349,6 +349,10 @@ const frBatch3 = {
bannerImage: "Image de bannière",
bannerDesc: "Une image large pour le haut de votre profil.",
website: "Site web",
openToSponsorships: "Ouvert au sponsoring",
openToSponsorshipsHint: "Affiche une carte sponsoring/collab sur ton profil. Rien n'est partagé tant que personne ne t'écrit.",
sponsorNote: "Note de sponsoring (facultatif)",
sponsorNotePlaceholder: "p. ex. ouvert aux partenaires decks, chaussures, voyages et événements.",
bitcoinTitle: "Bitcoin et paiements",
bitcoinDesc: "Laissez les gens vous zapper, vous donner un pourboire et vous payer directement — sans intermédiaire.",
lightningAddress: "Adresse Lightning",

View file

@ -807,6 +807,21 @@ const frBatch4 = {
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é.",
grantsSection: "Bailleurs de fonds Bitcoin",
grantsSectionDesc: "Pour les organisations qui accordent des subventions à des projets Bitcoin libres.",
grantsTitle: "Ouverts aux parrainages · Bailleurs de fonds Bitcoin",
grantsDisclaimer: "Vous voulez faire un don à ce projet ? Remplissez le formulaire. Pas pour nous faire un KYC — mais pour VOUS en faire un.",
grantsDisclaimerDesc: "Cette voie est réservée aux bailleurs de fonds qui font un KYC/KYB de leurs bénéficiaires. Si vous êtes un skateur qui veut juste faire un don, utilisez les rails Lightning, Silent Payments ou Angor ci-dessus — personne n'a besoin de votre passeport.",
grantsOrg: "Organisation",
grantsContact: "Contact (npub, courriel ou pseudonyme)",
grantsWebsite: "Site web",
grantsProgram: "Programme / cycle de subventions",
grantsSize: "Montant de la subvention",
grantsKyc: "Processus KYC / KYB",
grantsFund: "Que souhaitez-vous financer ?",
grantsAck: "Je confirme que nous sommes un bailleur de fonds qui fait un KYC/KYB de ses bénéficiaires.",
grantsSend: "Ouvrir la discussion sur la subvention",
grantsNote: "Ouvre un message privé au propriétaire de SkateSpots. Rien n'est stocké sur cette page.",
backAngor: "Soutenez-nous sur Angor",
backers: "Soutiens",
backersDesc: "Skaters qui ont soutenu SkateSpots — financement on-chain via Angor, et zaps Lightning au projet.",
@ -937,12 +952,14 @@ const frBatch4 = {
nip05NotVerified: "NIP-05 non vérifié pour cette clé",
message: "Message",
eventsHosted: "Événements organisés",
openToSponsorships: "Ouvert au sponsoring",
forSponsors: "Pour les sponsors et collaborations",
sponsorPitch: "Sponsoring, collaboration, photo/vidéo ou événement ? Lance la conversation.",
startCollab: "Démarrer une discussion de collaboration",
viewRiderCard: "Voir la fiche du skateur",
collabMessage: "Salut {{name}}, j'aimerais parler d'un sponsoring ou d'une collaboration.",
followers: "Abonnés",
followersHint: "Listes d'abonnés rapportées par les relais — pas des statistiques auditées.",
following: "Abonnements",
follow: "Suivre",
unfollow: "Ne plus suivre",

View file

@ -353,6 +353,10 @@ const batch3 = {
bannerImage: "Imaxe de portada",
bannerDesc: "Unha imaxe ancha para a parte superior do teu perfil.",
website: "Sitio web",
openToSponsorships: "Aberto a patrocinios",
openToSponsorshipsHint: "Mostra unha tarxeta de patrocinio/colaboración no teu perfil. Non se comparte nada ata que alguén che escriba.",
sponsorNote: "Nota de patrocinio (opcional)",
sponsorNotePlaceholder: "p. ex. Aberto a socios de táboas, zapatillas, viaxes e eventos.",
bitcoinTitle: "Bitcoin e pagamentos",
bitcoinDesc: "Deixa que a xente che faga zaps, dea propinas e pague directamente, sen intermediarios.",
lightningAddress: "Dirección Lightning",

View file

@ -833,6 +833,21 @@ const batch6 = {
"our": "NOSA",
"community": "COMUNIDADE",
"heroDesc": "SkateSpots está feito por e para a comunidade. Apoios, colaboradores, socios e amigos que o manteñen libre e descentralizado.",
"grantsSection": "Entidades financiadoras de Bitcoin",
"grantsSectionDesc": "Para organizacións que conceden axudas a proxectos Bitcoin de código aberto.",
"grantsTitle": "Abertos a patrocinios · Entidades financiadoras de Bitcoin",
"grantsDisclaimer": "Queres doar a este proxecto? Enche o formulario. Non para facernos KYC a nós — senón para facerche KYC a TI.",
"grantsDisclaimerDesc": "Esta vía é só para entidades financiadoras que fan KYC/KYB aos seus beneficiarios. Se es un skater que só quere doar, usa as rutas Lightning, Silent Payments ou Angor de arriba — ninguén necesita o teu pasaporte.",
"grantsOrg": "Organización",
"grantsContact": "Contacto (npub, correo electrónico ou nome de usuario)",
"grantsWebsite": "Sitio web",
"grantsProgram": "Programa / rolda de axudas",
"grantsSize": "Importe da axuda",
"grantsKyc": "Proceso de KYC / KYB",
"grantsFund": "Que che gustaría financiar?",
"grantsAck": "Confirmo que somos unha entidade financiadora que fai KYC/KYB aos seus beneficiarios.",
"grantsSend": "Abrir conversa sobre a axuda",
"grantsNote": "Abre unha mensaxe privada ao propietario de SkateSpots. Non se garda nada nesta páxina.",
"backAngor": "Apóianos en Angor",
"backers": "Apoios",
"backersDesc": "Skaters que apoiaron SkateSpots — financiamento on-chain mediante Angor e zaps Lightning ao proxecto.",
@ -963,12 +978,14 @@ const batch6 = {
"nip05NotVerified": "NIP-05 non verificado con esta chave",
"message": "Mensaxe",
"eventsHosted": "Eventos organizados",
"openToSponsorships": "Aberto a patrocinios",
"forSponsors": "Para patrocinadores e colaboracións",
"sponsorPitch": "Patrocinio, colaboración, foto/vídeo ou evento? Comeza unha conversa.",
"startCollab": "Iniciar chat de colaboración",
"viewRiderCard": "Ver a ficha do patinador",
"collabMessage": "Ola {{name}}, gustaríame falar dun patrocinio ou dunha colaboración.",
"followers": "Seguidores",
"followersHint": "Listas de seguidores informadas polos relays — non son analíticas auditadas.",
"following": "Seguindo",
"follow": "Seguir",
"unfollow": "Deixar de seguir",

View file

@ -353,6 +353,10 @@ const batch3 = {
"bannerImage": "बैनर इमेज",
"bannerDesc": "आपकी प्रोफ़ाइल के ऊपर के लिए चौड़ी इमेज।",
"website": "वेबसाइट",
"openToSponsorships": "प्रायोजन के लिए उपलब्ध",
"openToSponsorshipsHint": "आपकी प्रोफ़ाइल पर स्पॉन्सर/सहयोग कार्ड दिखाता है। जब तक कोई आपको संदेश नहीं भेजता, कुछ भी साझा नहीं होता।",
"sponsorNote": "प्रायोजन नोट (वैकल्पिक)",
"sponsorNotePlaceholder": "उदा. डेक, जूते, यात्रा और इवेंट पार्टनर के लिए उपलब्ध।",
"bitcoinTitle": "Bitcoin और भुगतान",
"bitcoinDesc": "लोगों को सीधे zap, tip और भुगतान करने दें — कोई बिचौलिया नहीं।",
"lightningAddress": "Lightning पता",

View file

@ -833,6 +833,21 @@ const batch6 = {
"our": "हमारा",
"community": "समुदाय",
"heroDesc": "SkateSpots समुदाय द्वारा और समुदाय के लिए बनाया गया है। समर्थक, सहयोगी, साझेदार और मित्र इसे मुफ़्त और विकेंद्रीकृत बनाए रखते हैं।",
"grantsSection": "बिटकॉइन अनुदानदाता",
"grantsSectionDesc": "उन संगठनों के लिए जो मुक्त स्रोत बिटकॉइन परियोजनाओं को अनुदान देते हैं।",
"grantsTitle": "प्रायोजन के लिए खुला · बिटकॉइन अनुदानदाता",
"grantsDisclaimer": "इस परियोजना को दान देना चाहते हैं? फ़ॉर्म भरें। हमारा KYC करने के लिए नहीं — आपका KYC करने के लिए।",
"grantsDisclaimerDesc": "यह मार्ग केवल उन अनुदानदाताओं के लिए है जो अपने अनुदान प्राप्तकर्ताओं का KYC/KYB करते हैं। अगर आप सिर्फ़ दान देना चाहने वाले स्केटर हैं, तो ऊपर दिए Lightning, Silent Payments या Angor मार्गों का उपयोग करें — किसी को आपके पासपोर्ट की ज़रूरत नहीं है।",
"grantsOrg": "संगठन",
"grantsContact": "संपर्क (npub, ईमेल या उपयोगकर्ता नाम)",
"grantsWebsite": "वेबसाइट",
"grantsProgram": "अनुदान कार्यक्रम / दौर",
"grantsSize": "अनुदान राशि",
"grantsKyc": "KYC / KYB प्रक्रिया",
"grantsFund": "आप किसे वित्तपोषित करना चाहेंगे?",
"grantsAck": "मैं पुष्टि करता/करती हूँ कि हम एक अनुदानदाता हैं जो अपने अनुदान प्राप्तकर्ताओं का KYC/KYB करते हैं।",
"grantsSend": "अनुदान बातचीत शुरू करें",
"grantsNote": "SkateSpots के मालिक को निजी संदेश खोलता है। इस पृष्ठ पर कुछ भी संग्रहीत नहीं होता।",
"backAngor": "Angor पर हमारा साथ दें",
"backers": "समर्थक",
"backersDesc": "वे स्केटर जिन्होंने SkateSpots का साथ दिया — Angor के ज़रिए on-chain फंडिंग, और प्रोजेक्ट को Lightning zaps।",
@ -963,12 +978,14 @@ const batch6 = {
"nip05NotVerified": "NIP-05 इस कुंजी से सत्यापित नहीं",
"message": "संदेश",
"eventsHosted": "आयोजित कार्यक्रम",
"openToSponsorships": "प्रायोजन के लिए उपलब्ध",
"forSponsors": "प्रायोजकों और सहयोगों के लिए",
"sponsorPitch": "प्रायोजन, सहयोग, फ़ोटो/वीडियो या कार्यक्रम? बातचीत शुरू करें।",
"startCollab": "सहयोग बातचीत शुरू करें",
"viewRiderCard": "स्केटर कार्ड देखें",
"collabMessage": "नमस्ते {{name}}, क्या हम प्रायोजन या सहयोग पर बात कर सकते हैं?",
"followers": "फ़ॉलोअर",
"followersHint": "रीले द्वारा रिपोर्ट की गई फ़ॉलो सूचियाँ — ये ऑडिट किया गया विश्लेषण नहीं हैं।",
"following": "फ़ॉलो कर रहे",
"follow": "फ़ॉलो करें",
"unfollow": "फ़ॉलो हटाएँ",

View file

@ -355,6 +355,10 @@ const idBatch3 = {
bannerImage: 'Gambar spanduk',
bannerDesc: 'Gambar lebar untuk bagian atas profil Anda.',
website: 'Situs web',
openToSponsorships: 'Terbuka untuk sponsor',
openToSponsorshipsHint: 'Menampilkan kartu sponsor/kolaborasi di profilmu. Tidak ada yang dibagikan sampai seseorang mengirim pesan.',
sponsorNote: 'Catatan sponsor (opsional)',
sponsorNotePlaceholder: 'mis. Terbuka untuk mitra deck, sepatu, perjalanan, dan acara.',
bitcoinTitle: 'Bitcoin & Pembayaran',
bitcoinDesc: 'Biarkan orang men-zap, memberi tip, dan membayar Anda langsung — tanpa perantara.',
lightningAddress: 'Alamat Lightning',

View file

@ -813,6 +813,21 @@ const idBatch4 = {
our: 'KOMUNITAS',
community: 'KAMI',
heroDesc: 'SkateSpots dibangun oleh dan untuk komunitas. Pendukung, kolaborator, mitra, dan teman yang menjaganya tetap gratis dan terdesentralisasi.',
grantsSection: 'Pemberi hibah Bitcoin',
grantsSectionDesc: 'Untuk organisasi yang memberikan hibah kepada proyek Bitcoin sumber terbuka.',
grantsTitle: 'Terbuka untuk sponsor · Pemberi hibah Bitcoin',
grantsDisclaimer: 'Ingin berdonasi ke proyek ini? Isi formulirnya. Bukan untuk KYC kami — tapi untuk KYC KAMU.',
grantsDisclaimerDesc: 'Jalur ini hanya untuk pemberi hibah yang melakukan KYC/KYB kepada penerima hibahnya. Jika kamu skater yang cuma ingin berdonasi, pakai jalur Lightning, Silent Payments, atau Angor di atas — tidak ada yang butuh paspormu.',
grantsOrg: 'Organisasi',
grantsContact: 'Kontak (npub, surel, atau nama pengguna)',
grantsWebsite: 'Situs web',
grantsProgram: 'Program / putaran hibah',
grantsSize: 'Besar hibah',
grantsKyc: 'Proses KYC / KYB',
grantsFund: 'Apa yang ingin kamu danai?',
grantsAck: 'Saya mengonfirmasi bahwa kami adalah pemberi hibah yang melakukan KYC/KYB kepada penerima hibah.',
grantsSend: 'Buka percakapan hibah',
grantsNote: 'Membuka pesan pribadi ke pemilik SkateSpots. Tidak ada yang disimpan di halaman ini.',
backAngor: 'Dukung kami di Angor',
backers: 'Pendukung',
backersDesc: 'Skater yang mendukung SkateSpots — pendanaan on-chain via Angor, dan zap Lightning ke proyek.',
@ -943,12 +958,14 @@ const idBatch4 = {
nip05NotVerified: 'NIP-05 tidak terverifikasi terhadap kunci ini',
message: 'Pesan',
eventsHosted: 'Acara yang diselenggarakan',
openToSponsorships: 'Terbuka untuk sponsor',
forSponsors: 'Untuk sponsor & kolaborasi',
sponsorPitch: 'Sponsorship, kolaborasi, foto/video, atau acara? Mulai percakapan.',
startCollab: 'Mulai chat kolaborasi',
viewRiderCard: 'Lihat kartu peseluncur',
collabMessage: 'Hai {{name}}, saya ingin membahas sponsorship atau kolaborasi.',
followers: 'Pengikut',
followersHint: 'Daftar pengikut yang dilaporkan relay — bukan analitik yang diaudit.',
following: 'Mengikuti',
follow: 'Ikuti',
unfollow: 'Berhenti Ikuti',

View file

@ -349,6 +349,10 @@ const itBatch3 = {
bannerImage: "Immagine banner",
bannerDesc: "Un'immagine larga per la parte superiore del tuo profilo.",
website: "Sito web",
openToSponsorships: "Aperto a sponsorizzazioni",
openToSponsorshipsHint: "Mostra una scheda sponsor/collaborazione sul tuo profilo. Nulla viene condiviso finché qualcuno non ti scrive.",
sponsorNote: "Nota di sponsorizzazione (facoltativo)",
sponsorNotePlaceholder: "ad es. aperto a partner per tavole, scarpe, viaggi ed eventi.",
bitcoinTitle: "Bitcoin e pagamenti",
bitcoinDesc: "Lascia che le persone ti zappino, ti diano mance e ti paghino direttamente — senza intermediari.",
lightningAddress: "Indirizzo Lightning",

View file

@ -807,6 +807,21 @@ const itBatch4 = {
our: "LA NOSTRA",
community: "COMMUNITY",
heroDesc: "SkateSpots è costruito dalla community e per la community. Sostenitori, collaboratori, partner e amici che lo mantengono libero e decentralizzato.",
grantsSection: "Enti finanziatori Bitcoin",
grantsSectionDesc: "Per organizzazioni che concedono sovvenzioni a progetti Bitcoin a codice aperto.",
grantsTitle: "Aperti a sponsorizzazioni · Enti finanziatori Bitcoin",
grantsDisclaimer: "Vuoi donare a questo progetto? Compila il modulo. Non per fare KYC a noi — ma per farlo a TE.",
grantsDisclaimerDesc: "Questa corsia è solo per enti finanziatori che fanno KYC/KYB ai propri beneficiari. Se sei uno skater che vuole solo donare, usa i canali Lightning, Silent Payments o Angor qui sopra — nessuno ha bisogno del tuo passaporto.",
grantsOrg: "Organizzazione",
grantsContact: "Contatto (npub, e-mail o nome utente)",
grantsWebsite: "Sito web",
grantsProgram: "Programma / ciclo di sovvenzioni",
grantsSize: "Importo della sovvenzione",
grantsKyc: "Processo KYC / KYB",
grantsFund: "Cosa vorresti finanziare?",
grantsAck: "Confermo che siamo un ente finanziatore che fa KYC/KYB ai propri beneficiari.",
grantsSend: "Apri la conversazione sulla sovvenzione",
grantsNote: "Apre un messaggio privato al proprietario di SkateSpots. Nulla viene salvato su questa pagina.",
backAngor: "Sostienici su Angor",
backers: "Sostenitori",
backersDesc: "Gli skater che hanno sostenuto SkateSpots — finanziamento on-chain tramite Angor e zap Lightning al progetto.",
@ -937,12 +952,14 @@ const itBatch4 = {
nip05NotVerified: "NIP-05 non verificato con questa chiave",
message: "Messaggio",
eventsHosted: "Eventi organizzati",
openToSponsorships: "Aperto a sponsorizzazioni",
forSponsors: "Per sponsor e collaborazioni",
sponsorPitch: "Sponsorizzazione, collaborazione, foto/video o evento? Inizia una conversazione.",
startCollab: "Avvia una chat di collaborazione",
viewRiderCard: "Vedi la scheda dello skater",
collabMessage: "Ciao {{name}}, vorrei parlare di una sponsorizzazione o di una collaborazione.",
followers: "Follower",
followersHint: "Elenchi di follower riportati dai relay — non statistiche verificate.",
following: "Seguiti",
follow: "Segui",
unfollow: "Smetti di seguire",

View file

@ -348,6 +348,10 @@ const jaBatch6 = {
bannerImage: 'バナー画像',
bannerDesc: 'プロフィール上部用の横長画像。',
website: 'ウェブサイト',
openToSponsorships: 'スポンサー募集中',
openToSponsorshipsHint: 'プロフィールにスポンサー/コラボのカードを表示します。誰かからメッセージが届くまで何も共有されません。',
sponsorNote: 'スポンサーに関するメモ(任意)',
sponsorNotePlaceholder: '例:デッキ、シューズ、遠征、イベントのパートナー募集中。',
bitcoinTitle: 'Bitcoinと支払い',
bitcoinDesc: 'Zap、チップ、支払いを直接受け取れます — 仲介者なし。',
lightningAddress: 'Lightningアドレス',

View file

@ -816,6 +816,21 @@ const jaBatch7 = {
our: '私たちの',
community: 'コミュニティ',
heroDesc: 'SkateSpotsはコミュニティによって、コミュニティのために作られています。サポーター、協力者、パートナー、友人がこれを無料で分散型に保っています。',
grantsSection: 'Bitcoin助成団体',
grantsSectionDesc: 'オープンソースのBitcoinプロジェクトに助成金を出す団体向けです。',
grantsTitle: 'スポンサー募集中 · Bitcoin助成団体',
grantsDisclaimer: 'このプロジェクトに寄付したいですか?フォームに記入してください。私たちをKYCするためではなく、あなたをKYCするためです。',
grantsDisclaimerDesc: 'この窓口は、助成先にKYC/KYBを行う助成団体専用です。ただ寄付したいだけのスケーターは、上のLightning、Silent Payments、Angorの経路を使ってください——パスポートなんて誰も必要としていません。',
grantsOrg: '団体名',
grantsContact: '連絡先(npub、メール、ユーザー名)',
grantsWebsite: 'ウェブサイト',
grantsProgram: '助成プログラム / ラウンド',
grantsSize: '助成金額',
grantsKyc: 'KYC / KYBの手続き',
grantsFund: '何に資金を提供したいですか?',
grantsAck: '私たちが助成先にKYC/KYBを行う助成団体であることを確認します。',
grantsSend: '助成の相談を始める',
grantsNote: 'SkateSpotsの所有者への非公開メッセージを開きます。このページには何も保存されません。',
backAngor: 'Angorで支援する',
backers: 'サポーター',
backersDesc: 'SkateSpotsを支援したスケーター — Angorによるオンチェーン資金提供、そしてプロジェクトへのLightning Zap。',
@ -946,12 +961,14 @@ const jaBatch7 = {
nip05NotVerified: 'NIP-05がこの鍵で認証されていません',
message: 'メッセージ',
eventsHosted: '主催イベント',
openToSponsorships: 'スポンサー募集中',
forSponsors: 'スポンサー・コラボ募集',
sponsorPitch: 'スポンサー、コラボ、写真/動画、イベントの依頼はありませんか?まずはご相談ください。',
startCollab: 'コラボチャットを始める',
viewRiderCard: 'ライダーカードを見る',
collabMessage: 'こんにちは{{name}}さん、スポンサーやコラボについてお話ししたいです。',
followers: 'フォロワー',
followersHint: 'リレーが報告するフォローリスト — 監査済みの分析データではありません。',
following: 'フォロー中',
follow: 'フォロー',
unfollow: 'フォロー解除',

View file

@ -355,6 +355,10 @@ const koBatch3 = {
bannerImage: '배너 이미지',
bannerDesc: '프로필 상단에 들어갈 가로로 넓은 이미지.',
website: '웹사이트',
openToSponsorships: '스폰서 모집 중',
openToSponsorshipsHint: '프로필에 스폰서/협업 카드를 표시합니다. 누군가 메시지를 보내기 전까지는 아무것도 공유되지 않습니다.',
sponsorNote: '스폰서 메모(선택 사항)',
sponsorNotePlaceholder: '예: 데크, 신발, 여행, 이벤트 파트너 모집 중.',
bitcoinTitle: 'Bitcoin & 결제',
bitcoinDesc: '사람들이 나에게 직접 Zap, 팁, 결제를 보낼 수 있습니다 — 중개자 없음.',
lightningAddress: 'Lightning 주소',

View file

@ -815,6 +815,21 @@ const koBatch4 = {
our: '우리의',
community: '커뮤니티',
heroDesc: 'SkateSpots는 커뮤니티가 커뮤니티를 위해 만듭니다. 이걸 무료이고 탈중앙화된 상태로 유지하는 후원자, 협력자, 파트너, 친구들.',
grantsSection: '비트코인 지원금 단체',
grantsSectionDesc: '오픈소스 비트코인 프로젝트에 지원금을 지급하는 단체를 위한 공간입니다.',
grantsTitle: '후원 후보 공개 · 비트코인 지원금 단체',
grantsDisclaimer: '이 프로젝트에 기부하고 싶나요? 양식을 작성하세요. 우리를 KYC하려는 게 아니라, 당신을 KYC하려는 겁니다.',
grantsDisclaimerDesc: '이 경로는 수혜자에게 KYC/KYB를 하는 지원금 단체 전용입니다. 그냥 기부하고 싶은 스케이터라면 위의 Lightning, Silent Payments, Angor 경로를 이용하세요. 당신의 여권은 아무도 필요로 하지 않습니다.',
grantsOrg: '단체',
grantsContact: '연락처 (npub, 이메일 또는 사용자명)',
grantsWebsite: '웹사이트',
grantsProgram: '지원금 프로그램 / 라운드',
grantsSize: '지원금 규모',
grantsKyc: 'KYC / KYB 절차',
grantsFund: '무엇에 자금을 지원하고 싶나요?',
grantsAck: '우리가 수혜자에게 KYC/KYB를 하는 지원금 단체임을 확인합니다.',
grantsSend: '지원금 대화 시작하기',
grantsNote: 'SkateSpots 소유자에게 비공개 메시지를 엽니다. 이 페이지에는 아무것도 저장되지 않습니다.',
backAngor: 'Angor에서 후원',
backers: '후원자',
backersDesc: 'SkateSpots를 후원한 스케이터 — Angor를 통한 온체인 펀딩과 프로젝트에 보낸 Lightning Zap.',
@ -945,12 +960,14 @@ const koBatch4 = {
nip05NotVerified: '이 키에 대해 NIP-05가 인증되지 않음',
message: '메시지',
eventsHosted: '주최한 이벤트',
openToSponsorships: '스폰서 모집 중',
forSponsors: '스폰서 및 협업 문의',
sponsorPitch: '스폰서십, 협업, 사진/영상 또는 이벤트? 대화를 시작해 보세요.',
startCollab: '협업 채팅 시작',
viewRiderCard: '라이더 카드 보기',
collabMessage: '안녕하세요 {{name}}님, 스폰서십이나 협업에 대해 이야기하고 싶어요.',
followers: '팔로워',
followersHint: '릴레이가 보고한 팔로우 목록 — 감사된 분석이 아닙니다.',
following: '팔로잉',
follow: '팔로우',
unfollow: '언팔로우',

View file

@ -354,6 +354,10 @@ const nlBatch3 = {
bannerImage: 'Bannerafbeelding',
bannerDesc: 'Een brede afbeelding voor de bovenkant van je profiel.',
website: 'Website',
openToSponsorships: 'Open voor sponsoring',
openToSponsorshipsHint: 'Toont een sponsor-/samenwerkingskaart op je profiel. Er wordt niets gedeeld tot iemand je een bericht stuurt.',
sponsorNote: 'Sponsornotitie (optioneel)',
sponsorNotePlaceholder: 'bijv. open voor partners voor decks, schoenen, reizen en evenementen.',
bitcoinTitle: 'Bitcoin & betalingen',
bitcoinDesc: 'Laat mensen je direct zappen, tippen en betalen — geen tussenpersoon.',
lightningAddress: 'Lightning-adres',

View file

@ -815,6 +815,21 @@ const nlBatch4 = {
our: 'ONZE',
community: 'COMMUNITY',
heroDesc: 'SkateSpots wordt gebouwd door en voor de community. Supporters, medewerkers, partners en vrienden die dit gratis en gedecentraliseerd houden.',
grantsSection: 'Bitcoin-financiers',
grantsSectionDesc: 'Voor organisaties die subsidies verstrekken aan open-source Bitcoin-projecten.',
grantsTitle: 'Open voor sponsoring · Bitcoin-financiers',
grantsDisclaimer: 'Wil je aan dit project doneren? Vul het formulier in. Niet om ons te KYC\'en — maar om JOU te KYC\'en.',
grantsDisclaimerDesc: 'Deze route is alleen voor financiers die hun begunstigden KYC/KYB\'en. Ben je een skater die gewoon wil doneren, gebruik dan de Lightning-, Silent Payments- of Angor-routes hierboven — niemand heeft je paspoort nodig.',
grantsOrg: 'Organisatie',
grantsContact: 'Contact (npub, e-mail of gebruikersnaam)',
grantsWebsite: 'Webpagina',
grantsProgram: 'Subsidieprogramma / ronde',
grantsSize: 'Subsidiebedrag',
grantsKyc: 'KYC-/KYB-proces',
grantsFund: 'Wat wil je financieren?',
grantsAck: 'Ik bevestig dat wij een financier zijn die onze begunstigden KYC/KYB\'t.',
grantsSend: 'Subsidiegesprek openen',
grantsNote: 'Opent een privébericht naar de eigenaar van SkateSpots. Er wordt niets op deze pagina opgeslagen.',
backAngor: 'Steun ons op Angor',
backers: 'Supporters',
backersDesc: 'Skaters die SkateSpots steunden — on-chain financiering via Angor, en Lightning-zaps naar het project.',
@ -945,12 +960,14 @@ const nlBatch4 = {
nip05NotVerified: 'NIP-05 niet geverifieerd tegen deze sleutel',
message: 'Bericht',
eventsHosted: 'Georganiseerde evenementen',
openToSponsorships: 'Open voor sponsoring',
forSponsors: 'Voor sponsors & samenwerkingen',
sponsorPitch: 'Sponsoring, samenwerking, foto/video of evenement? Start een gesprek.',
startCollab: 'Start een samenwerkingschat',
viewRiderCard: 'Bekijk de skaterkaart',
collabMessage: 'Hoi {{name}}, ik wil graag praten over een sponsoring of samenwerking.',
followers: 'Volgers',
followersHint: 'Door relays gerapporteerde volglijsten — geen gecontroleerde analyses.',
following: 'Volgend',
follow: 'Volgen',
unfollow: 'Ontvolgen',

View file

@ -349,6 +349,10 @@ const plBatch3 = {
bannerImage: "Obraz banera",
bannerDesc: "Szeroki obraz na górę Twojego profilu.",
website: "Strona internetowa",
openToSponsorships: "Otwarty na sponsoring",
openToSponsorshipsHint: "Pokazuje kartę sponsora/współpracy w Twoim profilu. Nic nie jest udostępniane, dopóki ktoś nie napisze.",
sponsorNote: "Notatka o sponsorowaniu (opcjonalnie)",
sponsorNotePlaceholder: "np. Otwarty na partnerów od desek, butów, podróży i wydarzeń.",
bitcoinTitle: "Bitcoin i płatności",
bitcoinDesc: "Pozwól ludziom wysyłać Ci zaps, napiwki i płatności bezpośrednio — bez pośredników.",
lightningAddress: "Adres Lightning",

View file

@ -807,6 +807,21 @@ const plBatch4 = {
our: "NASZA",
community: "SPOŁECZNOŚĆ",
heroDesc: "SkateSpots jest tworzone przez społeczność i dla niej. Wspierający, współpracownicy, partnerzy i przyjaciele, którzy utrzymują to darmowym i zdecentralizowanym.",
grantsSection: "Grantodawcy Bitcoin",
grantsSectionDesc: "Dla organizacji, które przyznają granty projektom Bitcoin o otwartym kodzie źródłowym.",
grantsTitle: "Otwarci na sponsoring · Grantodawcy Bitcoin",
grantsDisclaimer: "Chcesz wesprzeć ten projekt? Wypełnij formularz. Nie po to, żeby zrobić KYC nam — tylko żeby zrobić KYC TOBIE.",
grantsDisclaimerDesc: "Ta ścieżka jest tylko dla grantodawców, którzy robią KYC/KYB swoim beneficjentom. Jeśli jesteś skaterem i chcesz po prostu wesprzeć projekt, skorzystaj z powyższych ścieżek Lightning, Silent Payments lub Angor — nikomu nie jest potrzebny twój paszport.",
grantsOrg: "Organizacja",
grantsContact: "Kontakt (npub, e-mail lub nazwa użytkownika)",
grantsWebsite: "Strona internetowa",
grantsProgram: "Program / runda grantowa",
grantsSize: "Wielkość grantu",
grantsKyc: "Proces KYC / KYB",
grantsFund: "Co chciałbyś sfinansować?",
grantsAck: "Potwierdzam, że jesteśmy grantodawcą, który robi KYC/KYB swoim beneficjentom.",
grantsSend: "Rozpocznij rozmowę o grancie",
grantsNote: "Otwiera prywatną wiadomość do właściciela SkateSpots. Na tej stronie nic nie jest zapisywane.",
backAngor: "Wesprzyj nas na Angor",
backers: "Wspierający",
backersDesc: "Skaterzy, którzy wsparli SkateSpots — finansowanie on-chain przez Angor i zapy Lightning dla projektu.",
@ -937,12 +952,14 @@ const plBatch4 = {
nip05NotVerified: "NIP-05 niezweryfikowany względem tego klucza",
message: "Wiadomość",
eventsHosted: "Organizowane wydarzenia",
openToSponsorships: "Otwarty na sponsoring",
forSponsors: "Dla sponsorów i współprac",
sponsorPitch: "Sponsoring, współpraca, foto/wideo lub wydarzenie? Rozpocznij rozmowę.",
startCollab: "Rozpocznij czat o współpracy",
viewRiderCard: "Zobacz kartę deskorolkarza",
collabMessage: "Cześć {{name}}, chciałbym porozmawiać o sponsoringu lub współpracy.",
followers: "Obserwujący",
followersHint: "Listy obserwujących zgłaszane przez przekaźniki — to nie są audytowane analizy.",
following: "Obserwowani",
follow: "Obserwuj",
unfollow: "Przestań obserwować",

View file

@ -348,6 +348,10 @@ const ptBatch3 = {
bannerImage: 'Imagem de capa',
bannerDesc: 'Uma imagem larga para o topo do seu perfil.',
website: 'Site',
openToSponsorships: 'Aberto a patrocínios',
openToSponsorshipsHint: 'Mostra um cartão de patrocínio/colaboração no teu perfil. Nada é partilhado até alguém te enviar uma mensagem.',
sponsorNote: 'Nota de patrocínio (opcional)',
sponsorNotePlaceholder: 'p. ex. Aberto a parceiros de shapes, ténis, viagens e eventos.',
bitcoinTitle: 'Bitcoin e pagamentos',
bitcoinDesc: 'Deixe as pessoas mandarem Zaps, gorjetas e pagamentos direto para você — sem intermediário.',
lightningAddress: 'Endereço Lightning',

View file

@ -909,6 +909,21 @@ const ptBatch4 = {
community: 'COMUNIDADE',
heroDesc:
'O SkateSpots é feito pela e para a comunidade. Apoiadores, colaboradores, parceiros e amigos que mantêm tudo gratuito e descentralizado.',
grantsSection: 'Financiadores de Bitcoin',
grantsSectionDesc: 'Para organizações que concedem subsídios a projetos Bitcoin de código aberto.',
grantsTitle: 'Abertos a patrocínios · Financiadores de Bitcoin',
grantsDisclaimer: 'Quer doar para este projeto? Preencha o formulário. Não para fazer KYC em nós — mas para fazer KYC em VOCÊ.',
grantsDisclaimerDesc: 'Esta via é só para financiadores que fazem KYC/KYB dos seus beneficiários. Se você é um skatista que só quer doar, use as rotas Lightning, Silent Payments ou Angor acima — ninguém precisa do seu passaporte.',
grantsOrg: 'Organização',
grantsContact: 'Contato (npub, e-mail ou nome de usuário)',
grantsWebsite: 'Site',
grantsProgram: 'Programa / rodada de subsídios',
grantsSize: 'Valor do subsídio',
grantsKyc: 'Processo de KYC / KYB',
grantsFund: 'O que você gostaria de financiar?',
grantsAck: 'Confirmo que somos um financiador que faz KYC/KYB dos nossos beneficiários.',
grantsSend: 'Abrir conversa sobre subsídio',
grantsNote: 'Abre uma mensagem privada para o dono do SkateSpots. Nada é armazenado nesta página.',
backAngor: 'Apoie-nos no Angor',
backers: 'Apoiadores',
backersDesc:
@ -1072,12 +1087,14 @@ const ptBatch4 = {
nip05NotVerified: 'NIP-05 não verificado para esta chave',
message: 'Mensagem',
eventsHosted: 'Eventos organizados',
openToSponsorships: 'Aberto a patrocínios',
forSponsors: 'Para patrocinadores e colaborações',
sponsorPitch: 'Patrocínio, colaboração, foto/vídeo ou evento? Comece uma conversa.',
startCollab: 'Iniciar chat de colaboração',
viewRiderCard: 'Ver cartão do skatista',
collabMessage: 'Oi {{name}}, quero falar sobre um patrocínio ou uma colaboração.',
followers: 'Seguidores',
followersHint: 'Listas de seguidores reportadas pelos relays — não são análises auditadas.',
following: 'Seguindo',
follow: 'Seguir',
unfollow: 'Deixar de seguir',

View file

@ -349,6 +349,10 @@ const roBatch3 = {
bannerImage: "Imagine de banner",
bannerDesc: "O imagine lată pentru partea de sus a profilului tău.",
website: "Site web",
openToSponsorships: "Deschis la sponsorizări",
openToSponsorshipsHint: "Afișează un card de sponsorizare/colaborare pe profilul tău. Nimic nu este partajat până când cineva îți scrie.",
sponsorNote: "Notă despre sponsorizare (opțional)",
sponsorNotePlaceholder: "de ex. Deschis la parteneri pentru plăci, pantofi, călătorii și evenimente.",
bitcoinTitle: "Bitcoin & Plăți",
bitcoinDesc: "Lasă oamenii să te zapeze, să te ciuplească și să te plătească direct — fără intermediari.",
lightningAddress: "Adresă Lightning",

View file

@ -807,6 +807,21 @@ const roBatch4 = {
our: 'COMUNITATEA',
community: 'NOASTRĂ',
heroDesc: 'SkateSpots este construit de și pentru comunitate. Susținători, colaboratori, parteneri și prieteni care îl țin gratuit și descentralizat.',
grantsSection: 'Finanțatori Bitcoin',
grantsSectionDesc: 'Pentru organizațiile care acordă granturi unor proiecte Bitcoin cu sursă deschisă.',
grantsTitle: 'Deschiși la sponsorizări · Finanțatori Bitcoin',
grantsDisclaimer: 'Vrei să donezi acestui proiect? Completează formularul. Nu ca să ne facem KYC nouă — ci ca să ți-l facem ȚIE.',
grantsDisclaimerDesc: 'Această rută este doar pentru finanțatorii care fac KYC/KYB beneficiarilor lor. Dacă ești un skater care vrea doar să doneze, folosește rutele Lightning, Silent Payments sau Angor de mai sus — nimeni nu are nevoie de pașaportul tău.',
grantsOrg: 'Organizație',
grantsContact: 'Contact (npub, e-mail sau nume de utilizator)',
grantsWebsite: 'Site web',
grantsProgram: 'Program / rundă de granturi',
grantsSize: 'Valoarea grantului',
grantsKyc: 'Procesul KYC / KYB',
grantsFund: 'Ce ai vrea să finanțezi?',
grantsAck: 'Confirm că suntem un finanțator care face KYC/KYB beneficiarilor noștri.',
grantsSend: 'Deschide conversația despre grant',
grantsNote: 'Deschide un mesaj privat către proprietarul SkateSpots. Nimic nu este stocat pe această pagină.',
backAngor: 'Susține-ne pe Angor',
backers: 'Susținători',
backersDesc: 'Skateri care au susținut SkateSpots — finanțare on-chain prin Angor și zap-uri Lightning către proiect.',
@ -937,12 +952,14 @@ const roBatch4 = {
nip05NotVerified: 'NIP-05 neverificat pentru această cheie',
message: 'Mesaj',
eventsHosted: 'Evenimente organizate',
openToSponsorships: 'Deschis la sponsorizări',
forSponsors: 'Pentru sponsori și colaborări',
sponsorPitch: 'Sponsorizare, colaborare, foto/video sau eveniment? Începe o conversație.',
startCollab: 'Începe un chat de colaborare',
viewRiderCard: 'Vezi cardul riderului',
collabMessage: 'Salut {{name}}, aș vrea să vorbim despre o sponsorizare sau o colaborare.',
followers: 'Urmăritori',
followersHint: 'Liste de urmăritori raportate de relay — nu sunt analize auditate.',
following: 'Urmărești',
follow: 'Urmărește',
unfollow: 'Nu mai urmări',

View file

@ -349,6 +349,10 @@ const ruBatch3 = {
bannerImage: "Баннер",
bannerDesc: "Широкое изображение для верха вашего профиля.",
website: "Веб-сайт",
openToSponsorships: "Открыт для спонсорства",
openToSponsorshipsHint: "Показывает карточку спонсора/коллаборации в профиле. Ничего не публикуется, пока кто-то не напишет вам.",
sponsorNote: "Заметка о спонсорстве (необязательно)",
sponsorNotePlaceholder: "например: открыт для партнёров по декам, обуви, поездкам и мероприятиям.",
bitcoinTitle: "Bitcoin и платежи",
bitcoinDesc: "Позвольте людям делать вам Zap, чаевые и платить напрямую — без посредников.",
lightningAddress: "Lightning-адрес",

View file

@ -807,6 +807,21 @@ const ruBatch4 = {
our: 'НАШЕ',
community: 'СООБЩЕСТВО',
heroDesc: 'SkateSpots создаётся сообществом и для сообщества. Сторонники, соратники, партнёры и друзья, поддерживающие проект бесплатным и децентрализованным.',
grantsSection: 'Грантодатели биткоина',
grantsSectionDesc: 'Для организаций, которые выдают гранты проектам биткоина с открытым исходным кодом.',
grantsTitle: 'Открыты к спонсорству · Грантодатели биткоина',
grantsDisclaimer: 'Хотите поддержать этот проект? Заполните форму. Не для того, чтобы KYC прошли мы — а для того, чтобы его прошли ВЫ.',
grantsDisclaimerDesc: 'Этот канал только для грантодателей, которые проводят KYC/KYB своим получателям. Если вы скейтер и просто хотите поддержать проект, используйте пути Lightning, Silent Payments или Angor выше — ваш паспорт никому не нужен.',
grantsOrg: 'Организация',
grantsContact: 'Контакт (npub, эл. почта или никнейм)',
grantsWebsite: 'Сайт',
grantsProgram: 'Грантовая программа / раунд',
grantsSize: 'Размер гранта',
grantsKyc: 'Процедура KYC / KYB',
grantsFund: 'Что вы хотите профинансировать?',
grantsAck: 'Подтверждаю, что мы грантодатель, который проводит KYC/KYB своим получателям.',
grantsSend: 'Начать разговор о гранте',
grantsNote: 'Открывает личное сообщение владельцу SkateSpots. На этой странице ничего не сохраняется.',
backAngor: 'Поддержите нас на Angor',
backers: 'Сторонники',
backersDesc: 'Скейтеры, поддержавшие SkateSpots — финансирование on-chain через Angor и Lightning zaps проекту.',
@ -937,12 +952,14 @@ const ruBatch4 = {
nip05NotVerified: 'NIP-05 не подтверждён для этого ключа',
message: 'Сообщение',
eventsHosted: 'Проведённые мероприятия',
openToSponsorships: 'Открыт для спонсорства',
forSponsors: 'Для спонсоров и коллабораций',
sponsorPitch: 'Спонсорство, коллаборация, фото/видео или мероприятие? Начните разговор.',
startCollab: 'Начать чат о коллаборации',
viewRiderCard: 'Посмотреть карточку райдера',
collabMessage: 'Привет, {{name}}! Хочу обсудить спонсорство или коллаборацию.',
followers: 'Подписчики',
followersHint: 'Списки подписчиков по данным релеев — это не проверенная аналитика.',
following: 'Подписки',
follow: 'Подписаться',
unfollow: 'Отписаться',

View file

@ -349,6 +349,10 @@ const svBatch3 = {
bannerImage: "Bannerbild",
bannerDesc: "En bred bild för toppen av din profil.",
website: "Webbplats",
openToSponsorships: "Öppen för sponsring",
openToSponsorshipsHint: "Visar ett sponsor-/samarbetskort på din profil. Inget delas förrän någon skickar ett meddelande till dig.",
sponsorNote: "Sponsornotering (valfritt)",
sponsorNotePlaceholder: "t.ex. öppen för partners inom decks, skor, resor och evenemang.",
bitcoinTitle: "Bitcoin & betalningar",
bitcoinDesc: "Låt folk Zappa, tippa och betala dig direkt — ingen mellanhand.",
lightningAddress: "Lightning-adress",

View file

@ -807,6 +807,21 @@ const svBatch4 = {
our: "VÅR",
community: "COMMUNITY",
heroDesc: "SkateSpots byggs av och för communityn. Supportrar, samarbetspartners, partners och vänner som håller detta gratis och decentraliserat.",
grantsSection: "Bitcoin-bidragsgivare",
grantsSectionDesc: "För organisationer som delar ut bidrag till Bitcoin-projekt med öppen källkod.",
grantsTitle: "Öppna för sponsring · Bitcoin-bidragsgivare",
grantsDisclaimer: "Vill du donera till det här projektet? Fyll i formuläret. Inte för att KYC:a oss — utan för att KYC:a DIG.",
grantsDisclaimerDesc: "Den här kanalen är bara för bidragsgivare som KYC/KYB:ar sina mottagare. Är du en skatare som bara vill donera, använd Lightning-, Silent Payments- eller Angor-vägarna ovan — ingen behöver ditt pass.",
grantsOrg: "Organisation",
grantsContact: "Kontakt (npub, e-post eller användarnamn)",
grantsWebsite: "Webbplats",
grantsProgram: "Bidragsprogram / omgång",
grantsSize: "Bidragsbelopp",
grantsKyc: "KYC- / KYB-process",
grantsFund: "Vad vill du finansiera?",
grantsAck: "Jag bekräftar att vi är en bidragsgivare som KYC/KYB:ar våra mottagare.",
grantsSend: "Öppna bidragssamtal",
grantsNote: "Öppnar ett privat meddelande till SkateSpots ägare. Inget sparas på den här sidan.",
backAngor: "Stötta oss på Angor",
backers: "Supportrar",
backersDesc: "Skatare som stöttat SkateSpots – on-chain-finansiering via Angor och Lightning-zaps till projektet.",
@ -937,12 +952,14 @@ const svBatch4 = {
nip05NotVerified: "NIP-05 inte verifierad mot den här nyckeln",
message: "Meddelande",
eventsHosted: "Arrangerade evenemang",
openToSponsorships: "Öppen för sponsring",
forSponsors: "För sponsorer & samarbeten",
sponsorPitch: "Sponsring, samarbete, foto/video eller evenemang? Starta ett samtal.",
startCollab: "Starta en samarbetschatt",
viewRiderCard: "Visa skejtarkortet",
collabMessage: "Hej {{name}}, jag skulle vilja prata om sponsring eller samarbete.",
followers: "Följare",
followersHint: "Följarlistor rapporterade av reläer – inte granskad analys.",
following: "Följer",
follow: "Följ",
unfollow: "Sluta följa",

View file

@ -357,6 +357,10 @@ const thBatch8 = {
bannerImage: 'รูปแบนเนอร์',
bannerDesc: 'รูปแนวนอนสำหรับด้านบนของโปรไฟล์ของคุณ',
website: 'เว็บไซต์',
openToSponsorships: 'เปิดรับสปอนเซอร์',
openToSponsorshipsHint: 'แสดงการ์ดสปอนเซอร์/ความร่วมมือบนโปรไฟล์ของคุณ จะไม่มีการแชร์ข้อมูลใด ๆ จนกว่าจะมีคนส่งข้อความหาคุณ',
sponsorNote: 'บันทึกเกี่ยวกับสปอนเซอร์ (ไม่บังคับ)',
sponsorNotePlaceholder: 'เช่น เปิดรับพาร์ทเนอร์ด้านเด็ค รองเท้า การเดินทาง และอีเวนต์',
bitcoinTitle: 'Bitcoin และการชำระเงิน',
bitcoinDesc: 'ให้ผู้คน Zap ให้ทิป และจ่ายเงินคุณโดยตรง — ไม่มีคนกลาง',
lightningAddress: 'ที่อยู่ Lightning',

View file

@ -896,6 +896,21 @@ const thBatch9 = {
community: 'ชุมชน',
heroDesc:
'SkateSpots สร้างโดยและเพื่อชุมชน ผู้สนับสนุน ผู้ร่วมงาน พาร์ตเนอร์ และเพื่อน ๆ ที่ช่วยให้มันฟรีและกระจายศูนย์',
grantsSection: 'ผู้ให้ทุน Bitcoin',
grantsSectionDesc: 'สำหรับองค์กรที่ให้เงินทุนแก่โครงการ Bitcoin โอเพนซอร์ส',
grantsTitle: 'เปิดรับผู้สนับสนุน · ผู้ให้ทุน Bitcoin',
grantsDisclaimer: 'อยากบริจาคให้โปรเจกต์นี้ไหม? กรอกแบบฟอร์มสิ ไม่ใช่เพื่อ KYC เรา — แต่เพื่อ KYC คุณ',
grantsDisclaimerDesc: 'ช่องทางนี้มีไว้สำหรับผู้ให้ทุนที่ทำ KYC/KYB กับผู้รับทุนเท่านั้น ถ้าคุณเป็นนักสเก็ตที่แค่อยากบริจาค ให้ใช้ช่องทาง Lightning, Silent Payments หรือ Angor ด้านบน — ไม่มีใครต้องการหนังสือเดินทางของคุณ',
grantsOrg: 'องค์กร',
grantsContact: 'ติดต่อ (npub, อีเมล หรือชื่อผู้ใช้)',
grantsWebsite: 'เว็บไซต์',
grantsProgram: 'โครงการ / รอบทุน',
grantsSize: 'ขนาดทุน',
grantsKyc: 'กระบวนการ KYC / KYB',
grantsFund: 'คุณอยากสนับสนุนอะไร?',
grantsAck: 'ฉันยืนยันว่าเราเป็นผู้ให้ทุนที่ทำ KYC/KYB กับผู้รับทุนของเรา',
grantsSend: 'เปิดบทสนทนาเรื่องทุน',
grantsNote: 'เปิดข้อความส่วนตัวถึงเจ้าของ SkateSpots ไม่มีข้อมูลใดถูกเก็บในหน้านี้',
backAngor: 'สนับสนุนเราบน Angor',
backers: 'ผู้สนับสนุน',
backersDesc:
@ -1046,12 +1061,14 @@ const thBatch9 = {
nip05NotVerified: 'NIP-05 ยังไม่ได้รับการยืนยันกับกุญแจนี้',
message: 'ข้อความ',
eventsHosted: 'กิจกรรมที่จัดขึ้น',
openToSponsorships: 'เปิดรับสปอนเซอร์',
forSponsors: 'สำหรับสปอนเซอร์และความร่วมมือ',
sponsorPitch: 'การสนับสนุน ความร่วมมือ ภาพ/วิดีโอ หรืออีเวนต์? เริ่มคุยกันได้เลย',
startCollab: 'เริ่มแชตความร่วมมือ',
viewRiderCard: 'ดูการ์ดนักสเก็ต',
collabMessage: 'สวัสดี {{name}} ฉันอยากคุยเรื่องการสนับสนุนหรือความร่วมมือ',
followers: 'ผู้ติดตาม',
followersHint: 'รายชื่อผู้ติดตามที่รายงานโดยรีเลย์ — ไม่ใช่ข้อมูลวิเคราะห์ที่ตรวจสอบแล้ว',
following: 'กำลังติดตาม',
follow: 'ติดตาม',
unfollow: 'เลิกติดตาม',

View file

@ -349,6 +349,10 @@ const trBatch3 = {
bannerImage: "Afiş görseli",
bannerDesc: "Profilinizin üstü için geniş bir görsel.",
website: "Web sitesi",
openToSponsorships: "Sponsorluğa açık",
openToSponsorshipsHint: "Profilinde sponsor/iş birliği kartı gösterir. Biri sana mesaj atmadan hiçbir şey paylaşılmaz.",
sponsorNote: "Sponsorluk notu (isteğe bağlı)",
sponsorNotePlaceholder: "ör. deck, ayakkabı, seyahat ve etkinlik ortaklarına açık.",
bitcoinTitle: "Bitcoin & Ödemeler",
bitcoinDesc: "İnsanların size doğrudan zap, bahşiş ve ödeme yapmasına izin verin — aracı yok.",
lightningAddress: "Lightning adresi",

View file

@ -807,6 +807,21 @@ const trBatch4 = {
our: "BİZİM",
community: "TOPLULUK",
heroDesc: "SkateSpots topluluk tarafından ve topluluk için inşa edilir. Bunu ücretsiz ve merkeziyetsiz tutan destekçiler, işbirlikçiler, ortaklar ve dostlar.",
grantsSection: "Bitcoin hibe kuruluşları",
grantsSectionDesc: "Açık kaynak Bitcoin projelerine hibe veren kuruluşlar için.",
grantsTitle: "Sponsorluklara açık · Bitcoin hibe kuruluşları",
grantsDisclaimer: "Bu projeye bağış yapmak mı istiyorsunuz? Formu doldurun. Bize KYC yapmak için değil — SİZE KYC yapmak için.",
grantsDisclaimerDesc: "Bu kanal yalnızca hibe alanlarına KYC/KYB uygulayan hibe kuruluşları içindir. Sadece bağış yapmak isteyen bir kaykaycıysanız, yukarıdaki Lightning, Silent Payments veya Angor yollarını kullanın — kimsenin pasaportunuza ihtiyacı yok.",
grantsOrg: "Kuruluş",
grantsContact: "İletişim (npub, e-posta veya kullanıcı adı)",
grantsWebsite: "Web sitesi",
grantsProgram: "Hibe programı / turu",
grantsSize: "Hibe tutarı",
grantsKyc: "KYC / KYB süreci",
grantsFund: "Neyi finanse etmek istersiniz?",
grantsAck: "Hibe alanlarımıza KYC/KYB uygulayan bir hibe kuruluşu olduğumuzu onaylıyorum.",
grantsSend: "Hibe görüşmesi başlat",
grantsNote: "SkateSpots sahibine özel bir mesaj açar. Bu sayfada hiçbir şey saklanmaz.",
backAngor: "Bizi Angor'da destekle",
backers: "Destekçiler",
backersDesc: "SkateSpots'u destekleyen kaykaycılar — Angor aracılığıyla zincir üstü fonlama ve projeye Lightning zap'leri.",
@ -937,12 +952,14 @@ const trBatch4 = {
nip05NotVerified: "NIP-05 bu anahtara karşı doğrulanmadı",
message: "Mesaj",
eventsHosted: "Düzenlenen etkinlikler",
openToSponsorships: "Sponsorluğa açık",
forSponsors: "Sponsorlar ve iş birlikleri için",
sponsorPitch: "Sponsorluk, iş birliği, fotoğraf/video veya etkinlik mi? Hemen konuşmaya başla.",
startCollab: "İş birliği sohbeti başlat",
viewRiderCard: "Rider kartını görüntüle",
collabMessage: "Merhaba {{name}}, bir sponsorluk veya iş birliği hakkında konuşmak istiyorum.",
followers: "Takipçiler",
followersHint: "Rölelerin bildirdiği takipçi listeleri — denetlenmiş analizler değildir.",
following: "Takip Edilen",
follow: "Takip Et",
unfollow: "Takibi Bırak",

View file

@ -349,6 +349,10 @@ const ukBatch3 = {
bannerImage: "Банер",
bannerDesc: "Широке зображення для верхньої частини вашого профілю.",
website: "Вебсайт",
openToSponsorships: "Відкритий до спонсорства",
openToSponsorshipsHint: "Показує картку спонсора/колаборації у вашому профілі. Нічого не публікується, доки хтось не напише вам.",
sponsorNote: "Нотатка про спонсорство (необов’язково)",
sponsorNotePlaceholder: "наприклад: відкритий до партнерів із деками, взуттям, мандрівками та подіями.",
bitcoinTitle: "Bitcoin і платежі",
bitcoinDesc: "Дозвольте людям надсилати вам Zap, чайові та платити напряму — без посередників.",
lightningAddress: "Адреса Lightning",

View file

@ -807,6 +807,21 @@ const ukBatch4 = {
our: "НАША",
community: "СПІЛЬНОТА",
heroDesc: "SkateSpots створено спільнотою і для спільноти. Підтримувачі, співучасники, партнери й друзі, які тримають це вільним і децентралізованим.",
grantsSection: "Грантодавці біткоїна",
grantsSectionDesc: "Для організацій, які видають гранти проєктам біткоїна з відкритим кодом.",
grantsTitle: "Відкриті до спонсорства · Грантодавці біткоїна",
grantsDisclaimer: "Хочете підтримати цей проєкт? Заповніть форму. Не для того, щоб KYC пройшли ми — а для того, щоб його пройшли ВИ.",
grantsDisclaimerDesc: "Цей канал лише для грантодавців, які проводять KYC/KYB своїм отримувачам. Якщо ви скейтер і просто хочете підтримати проєкт, скористайтеся шляхами Lightning, Silent Payments або Angor вище — ваш паспорт нікому не потрібен.",
grantsOrg: "Організація",
grantsContact: "Контакт (npub, ел. пошта або нікнейм)",
grantsWebsite: "Сайт",
grantsProgram: "Грантова програма / раунд",
grantsSize: "Розмір гранту",
grantsKyc: "Процедура KYC / KYB",
grantsFund: "Що ви хочете профінансувати?",
grantsAck: "Підтверджую, що ми грантодавець, який проводить KYC/KYB своїм отримувачам.",
grantsSend: "Почати розмову про грант",
grantsNote: "Відкриває приватне повідомлення власнику SkateSpots. На цій сторінці нічого не зберігається.",
backAngor: "Підтримайте нас на Angor",
backers: "Підтримувачі",
backersDesc: "Скейтери, які підтримали SkateSpots — фінансування on-chain через Angor і Lightning zaps для проєкту.",
@ -937,12 +952,14 @@ const ukBatch4 = {
nip05NotVerified: "NIP-05 не підтверджено для цього ключа",
message: "Повідомлення",
eventsHosted: "Проведені події",
openToSponsorships: "Відкритий до спонсорства",
forSponsors: "Для спонсорів і колаборацій",
sponsorPitch: "Спонсорство, колаборація, фото/відео чи подія? Почніть розмову.",
startCollab: "Почати чат про колаборацію",
viewRiderCard: "Переглянути картку райдера",
collabMessage: "Привіт, {{name}}! Хочу обговорити спонсорство або колаборацію.",
followers: "Підписники",
followersHint: "Списки підписників за даними релеїв — це не перевірена аналітика.",
following: "Підписки",
follow: "Підписатися",
unfollow: "Відписатися",

View file

@ -349,6 +349,10 @@ const viBatch3 = {
bannerImage: "Ảnh bìa",
bannerDesc: "Một hình rộng cho phần trên hồ sơ của bạn.",
website: "Trang web",
openToSponsorships: "Sẵn sàng nhận tài trợ",
openToSponsorshipsHint: "Hiển thị thẻ tài trợ/hợp tác trên hồ sơ của bạn. Không có gì được chia sẻ cho đến khi ai đó nhắn tin cho bạn.",
sponsorNote: "Ghi chú về tài trợ (không bắt buộc)",
sponsorNotePlaceholder: "ví dụ: Sẵn sàng hợp tác về ván, giày, du lịch và sự kiện.",
bitcoinTitle: "Bitcoin & Thanh toán",
bitcoinDesc: "Để mọi người zap, tip và trả tiền trực tiếp cho bạn — không trung gian.",
lightningAddress: "Địa chỉ Lightning",

View file

@ -815,6 +815,21 @@ const viBatch4 = {
our: 'CỦA CHÚNG TÔI',
community: 'CỘNG ĐỒNG',
heroDesc: 'SkateSpots được xây bởi và vì cộng đồng. Những người ủng hộ, cộng tác viên, đối tác và bạn bè cùng giữ điều này miễn phí và phi tập trung.',
grantsSection: 'Tổ chức tài trợ Bitcoin',
grantsSectionDesc: 'Dành cho các tổ chức cấp tài trợ cho các dự án Bitcoin mã nguồn mở.',
grantsTitle: 'Mở cho tài trợ · Tổ chức tài trợ Bitcoin',
grantsDisclaimer: 'Muốn quyên góp cho dự án này? Hãy điền biểu mẫu. Không phải để KYC chúng tôi — mà để KYC BẠN.',
grantsDisclaimerDesc: 'Kênh này chỉ dành cho các tổ chức tài trợ thực hiện KYC/KYB với người nhận tài trợ. Nếu bạn là một skater chỉ muốn quyên góp, hãy dùng các kênh Lightning, Silent Payments hoặc Angor ở trên — không ai cần hộ chiếu của bạn.',
grantsOrg: 'Tổ chức',
grantsContact: 'Liên hệ (npub, thư điện tử hoặc tên người dùng)',
grantsWebsite: 'Trang web',
grantsProgram: 'Chương trình / vòng tài trợ',
grantsSize: 'Quy mô tài trợ',
grantsKyc: 'Quy trình KYC / KYB',
grantsFund: 'Bạn muốn tài trợ cho điều gì?',
grantsAck: 'Tôi xác nhận chúng tôi là tổ chức tài trợ thực hiện KYC/KYB với người nhận tài trợ.',
grantsSend: 'Mở cuộc trò chuyện về tài trợ',
grantsNote: 'Mở tin nhắn riêng tới chủ sở hữu SkateSpots. Không có gì được lưu trên trang này.',
backAngor: 'Ủng hộ trên Angor',
backers: 'Người ủng hộ',
backersDesc: 'Những skater đã ủng hộ SkateSpots — tài trợ on-chain qua Angor, và zap Lightning cho dự án.',
@ -945,12 +960,14 @@ const viBatch4 = {
nip05NotVerified: 'NIP-05 chưa được xác minh với khóa này',
message: 'Nhắn tin',
eventsHosted: 'Sự kiện đã tổ chức',
openToSponsorships: 'Sẵn sàng nhận tài trợ',
forSponsors: 'Dành cho nhà tài trợ & hợp tác',
sponsorPitch: 'Tài trợ, hợp tác, ảnh/video hay sự kiện? Bắt đầu trò chuyện nhé.',
startCollab: 'Bắt đầu trò chuyện hợp tác',
viewRiderCard: 'Xem thẻ người trượt ván',
collabMessage: 'Chào {{name}}, tôi muốn trao đổi về tài trợ hoặc hợp tác.',
followers: 'Người theo dõi',
followersHint: 'Danh sách người theo dõi do relay báo cáo — không phải số liệu phân tích đã kiểm toán.',
following: 'Đang theo dõi',
follow: 'Theo dõi',
unfollow: 'Bỏ theo dõi',

View file

@ -349,6 +349,10 @@ export const zhCNBatch3 = {
bannerImage: "横幅图片",
bannerDesc: "一张用于个人资料顶部的宽图。",
website: "网站",
openToSponsorships: "开放赞助合作",
openToSponsorshipsHint: "在你的个人资料中显示赞助/合作卡片。在有人联系你之前,不会分享任何内容。",
sponsorNote: "赞助备注(可选)",
sponsorNotePlaceholder: "例如:开放滑板板面、鞋子、旅行和活动合作。",
bitcoinTitle: "Bitcoin 与支付",
bitcoinDesc: "让人们直接向你 Zap、打赏和付款——无需中间人。",
lightningAddress: "Lightning 地址",

View file

@ -812,6 +812,21 @@ const zhCNBatch4 = {
our: "我们的",
community: "社区",
heroDesc: "SkateSpots 由社区构建,也服务于社区。支持者、协作者、合作伙伴和朋友让它保持免费和去中心化。",
grantsSection: "比特币资助机构",
grantsSectionDesc: "面向为开源比特币项目提供资助的组织。",
grantsTitle: "开放赞助 · 比特币资助机构",
grantsDisclaimer: "想给这个项目捐款?请填写表单。不是给我们做 KYC——是给你做 KYC。",
grantsDisclaimerDesc: "这个渠道只面向会对受助方进行 KYC/KYB 的资助机构。如果你只是想来捐款的滑手,请使用上方的 Lightning、Silent Payments 或 Angor 通道——没人需要你的护照。",
grantsOrg: "组织",
grantsContact: "联系方式(npub、电子邮件或用户名)",
grantsWebsite: "网站",
grantsProgram: "资助计划 / 轮次",
grantsSize: "资助金额",
grantsKyc: "KYC / KYB 流程",
grantsFund: "你想资助什么?",
grantsAck: "我确认我们是会对受助方进行 KYC/KYB 的资助机构。",
grantsSend: "开启资助洽谈",
grantsNote: "打开与 SkateSpots 所有者的私信。此页面不会存储任何内容。",
backAngor: "在 Angor 上支持我们",
backers: "支持者",
backersDesc: "支持 SkateSpots 的滑手 —— 通过 Angor 的链上资助,以及对项目的 Lightning zaps。",
@ -942,12 +957,14 @@ const zhCNBatch4 = {
nip05NotVerified: "NIP-05 与此密钥未通过验证",
message: "私信",
eventsHosted: "主办的活动",
openToSponsorships: "开放赞助合作",
forSponsors: "赞助与合作",
sponsorPitch: "赞助、合作、拍摄照片/视频还是办活动?来聊聊吧。",
startCollab: "发起合作聊天",
viewRiderCard: "查看滑手名片",
collabMessage: "你好 {{name}},我想聊聊赞助或合作的事。",
followers: "粉丝",
followersHint: "由中继报告的关注列表 — 并非经审计的分析数据。",
following: "关注中",
follow: "关注",
unfollow: "取消关注",

View file

@ -349,6 +349,10 @@ const zhTWBatch3 = {
bannerImage: "橫幅圖片",
bannerDesc: "一張用於個人檔案頂端的寬圖。",
website: "網站",
openToSponsorships: "開放贊助合作",
openToSponsorshipsHint: "在你的個人檔案中顯示贊助/合作卡片。在有人傳訊息給你之前,不會分享任何內容。",
sponsorNote: "贊助備註(選填)",
sponsorNotePlaceholder: "例如:開放滑板板面、鞋子、旅行和活動合作。",
bitcoinTitle: "Bitcoin 與付款",
bitcoinDesc: "讓人們直接向你 Zap、打賞和付款——無需中間人。",
lightningAddress: "Lightning 位址",

View file

@ -812,6 +812,21 @@ const zhTWBatch4 = {
our: "我們的",
community: "社群",
heroDesc: "SkateSpots 由社群構建,也服務於社群。支持者、協作者、合作伙伴和朋友讓它保持免費和去中心化。",
grantsSection: "比特幣資助機構",
grantsSectionDesc: "面向為開源比特幣專案提供資助的組織。",
grantsTitle: "開放贊助 · 比特幣資助機構",
grantsDisclaimer: "想贊助這個專案?請填寫表單。不是對我們做 KYC——是對你做 KYC。",
grantsDisclaimerDesc: "這個管道只開放給會對受助者進行 KYC/KYB 的資助機構。如果你只是單純想捐款的滑手,請使用上方的 Lightning、Silent Payments 或 Angor 管道——沒有人需要你的護照。",
grantsOrg: "組織",
grantsContact: "聯絡方式(npub、電子郵件或使用者名稱)",
grantsWebsite: "網站",
grantsProgram: "資助計畫 / 輪次",
grantsSize: "資助金額",
grantsKyc: "KYC / KYB 流程",
grantsFund: "你想資助什麼?",
grantsAck: "我確認我們是會對受助者進行 KYC/KYB 的資助機構。",
grantsSend: "開啟資助洽談",
grantsNote: "開啟與 SkateSpots 擁有者的私訊。此頁面不會儲存任何內容。",
backAngor: "在 Angor 上支援我們",
backers: "支持者",
backersDesc: "支援 SkateSpots 的滑手 —— 透過 Angor 的鏈上資助,以及對專案的 Lightning zaps。",
@ -942,12 +957,14 @@ const zhTWBatch4 = {
nip05NotVerified: "NIP-05 與此金鑰未透過驗證",
message: "私信",
eventsHosted: "主辦的活動",
openToSponsorships: "開放贊助合作",
forSponsors: "贊助與合作",
sponsorPitch: "贊助、合作、拍攝照片/影片還是辦活動?來聊聊吧。",
startCollab: "發起合作聊天",
viewRiderCard: "查看滑手名片",
collabMessage: "你好 {{name}},我想聊聊贊助或合作的事。",
followers: "粉絲",
followersHint: "由中繼回報的追蹤名單 — 並非經稽核的分析資料。",
following: "追蹤中",
follow: "關注",
unfollow: "取消關注",

View file

@ -36,7 +36,7 @@ import { cn } from '@/lib/utils';
import { SKATER_STANCES, SKATER_STYLES, SKATER_LEVELS, NEWSLETTER_KIND } from '@/lib/types';
import { NewsletterIssueView } from '@/components/NewsletterIssueView';
import NotFound from './NotFound';
import { MapPin, Store, MessageCircle, Globe, Zap, ExternalLink, Copy, Check, ShieldCheck, ShieldAlert, Loader2, Instagram, Share2, Users, Crown, Bot, Pencil, Package, Tag, ArrowRightLeft, Bitcoin, Award, MessageSquareLock, PersonStanding, Sparkles, Home, Clock, Server, Plus, UserPlus, UserCheck, Handshake } from 'lucide-react';
import { MapPin, Store, MessageCircle, Globe, Zap, ExternalLink, Copy, Check, ShieldCheck, ShieldAlert, Loader2, Info, Instagram, Share2, Users, Crown, Bot, Pencil, Package, Tag, ArrowRightLeft, Bitcoin, Award, MessageSquareLock, PersonStanding, Sparkles, Home, Clock, Server, Plus, UserPlus, UserCheck, Handshake } from 'lucide-react';
import { useState, type ReactNode } from 'react';
import { UserStatusIndicator } from '@/components/UserStatusIndicator';
import { ShareProfileDialog } from '@/components/ShareProfileDialog';
@ -62,6 +62,7 @@ function StatPill({
loading,
icon,
onClick,
hint,
}: {
value: number;
label: string;
@ -69,6 +70,7 @@ function StatPill({
loading?: boolean;
icon?: ReactNode;
onClick?: () => void;
hint?: string;
}) {
const interactive = !!onClick && value > 0;
const empty = !loading && value === 0;
@ -94,6 +96,9 @@ function StatPill({
)}
<p className={`text-[10px] uppercase tracking-wide font-bold mt-0.5 transition-colors ${empty ? 'text-gray-600' : 'text-gray-400 group-hover:text-gray-200'}`}>
{label}
{hint && (
<Info className="ml-1 inline h-2.5 w-2.5 align-[-1px] text-gray-600" aria-label={hint} />
)}
</p>
</div>
</>
@ -106,6 +111,7 @@ function StatPill({
<button
type="button"
onClick={onClick}
title={hint}
className={`${base} border-white/10 bg-white/[0.04] hover:bg-white/10 hover:border-white/25 hover:-translate-y-0.5 cursor-pointer`}
>
{inner}
@ -113,7 +119,7 @@ function StatPill({
);
}
return <div className={`${base} border-white/5 bg-white/[0.02]`}>{inner}</div>;
return <div className={`${base} border-white/5 bg-white/[0.02]`} title={hint}>{inner}</div>;
}
function ProfilePage({ pubkey }: { pubkey: string }) {
@ -154,6 +160,8 @@ function ProfilePage({ pubkey }: { pubkey: string }) {
const silentPayment = typeof raw?.bitcoin_silent_payment === 'string' ? raw.bitcoin_silent_payment : undefined;
const userBadges = parseBadges(metadata);
const cordnUrl = typeof raw?.cordn === 'string' ? raw.cordn : undefined;
const openToSponsorships = raw?.sponsorships_open === true;
const sponsorNote = typeof raw?.sponsorships_note === 'string' ? raw.sponsorships_note : '';
// When the profile's `cordn` value is a coordinator pointer, we can offer a
// one-tap "Add" instead of just a link.
const cordnPointer = cordnUrl ? parseCoordinatorInput(cordnUrl) : null;
@ -184,7 +192,7 @@ function ProfilePage({ pubkey }: { pubkey: string }) {
);
// Only invite sponsor/collab conversations on profiles that actually show
// skate activity — an empty kind-0 shouldn't read as a media kit.
const sponsorReady = hasSkateLayer || crews.length > 0 || (spots?.length ?? 0) > 0 || events.length > 0;
const sponsorReady = openToSponsorships || hasSkateLayer || crews.length > 0 || (spots?.length ?? 0) > 0 || events.length > 0;
const handleCopyNpub = () => {
navigator.clipboard.writeText(npub);
@ -261,6 +269,11 @@ function ProfilePage({ pubkey }: { pubkey: string }) {
<Bot className="h-3 w-3" /> Bot
</Badge>
)}
{openToSponsorships && (
<Badge className="gap-1 border-pink-500/40 bg-pink-500/15 text-pink-300">
<Handshake className="h-3 w-3" /> {t('walletUi.profile.openToSponsorships')}
</Badge>
)}
</div>
{nip05 && (
<p
@ -395,7 +408,7 @@ function ProfilePage({ pubkey }: { pubkey: string }) {
<StatPill value={crews.length} label={t('walletUi.profile.crews')} color="#2dd4bf" icon={<Users className="h-4 w-4" />} loading={crewsLoading} onClick={() => scrollToSection('section-crews')} />
<StatPill value={events.length} label={t('nav.events')} color="#ccff00" icon={<Clock className="h-4 w-4" />} loading={eventsLoading} onClick={() => scrollToSection('section-events')} />
<StatPill value={publicStash?.length ?? 0} label={t('walletUi.profile.gear')} color="#ff6600" icon={<Package className="h-4 w-4" />} loading={publicStashLoading} onClick={() => scrollToSection('section-stash')} />
<StatPill value={followers.length} label={t('walletUi.profile.followers')} color="#ec4899" icon={<Users className="h-4 w-4" />} loading={followersLoading} />
<StatPill value={followers.length} label={t('walletUi.profile.followers')} color="#ec4899" icon={<Users className="h-4 w-4" />} loading={followersLoading} hint={t('walletUi.profile.followersHint')} />
</div>
{/* Secondary meta line: zaps received + member since */}
@ -803,9 +816,11 @@ function ProfilePage({ pubkey }: { pubkey: string }) {
</div>
<div className="min-w-0">
<p className="text-[10px] font-black uppercase tracking-[0.15em] text-pink-300">
{t('walletUi.profile.forSponsors')}
{openToSponsorships ? t('walletUi.profile.openToSponsorships') : t('walletUi.profile.forSponsors')}
</p>
<p className="text-xs text-gray-400">
{openToSponsorships && sponsorNote ? sponsorNote : t('walletUi.profile.sponsorPitch')}
</p>
<p className="text-xs text-gray-400">{t('walletUi.profile.sponsorPitch')}</p>
</div>
</div>

View file

@ -1,8 +1,8 @@
import { useMemo, useState } from 'react';
import { useSeoMeta } from '@unhead/react';
import { Link } from 'react-router-dom';
import { Link, useNavigate } from 'react-router-dom';
import { nip19 } from 'nostr-tools';
import { ExternalLink, Zap, Heart, Users, Handshake, Building2, Star, ShieldCheck, Server, Globe, Bot, Code2, Briefcase, Megaphone, TrendingUp } from 'lucide-react';
import { ExternalLink, Zap, Heart, Users, Handshake, Building2, Star, ShieldCheck, Server, Globe, Bot, Code2, Briefcase, Megaphone, TrendingUp, Info } from 'lucide-react';
import { SupportSkateSpots } from '@/components/SupportSkateSpots';
import { SilentPaymentsCard } from '@/components/SilentPaymentsCard';
import { AngorProjectCard, ANGOR_PROJECT_URL } from '@/components/AngorProjectCard';
@ -16,6 +16,10 @@ import { PLATFORM_OWNER_PUBKEYS } from '@/hooks/useListingRestrictions';
import { useSatsToUsd } from '@/hooks/useExchangeRate';
import { useZapLeaderboard } from '@/hooks/useZapLeaderboard';
import { useTranslation } from '@/contexts/language';
import { Input } from '@/components/ui/input';
import { Textarea } from '@/components/ui/textarea';
import { Label } from '@/components/ui/label';
import { Button } from '@/components/ui/button';
// Only count support received from this point (the project's public launch era).
@ -123,8 +127,108 @@ const PAYS_FOR = [
// ─── Silent-payments donation card (BIP-353 name → BIP-321 URI) ──────────────
// ─── Bitcoin grantmaker inquiry ──────────────────────────────────────────────
function GrantmakerForm() {
const { t } = useTranslation();
const navigate = useNavigate();
const owner = PLATFORM_OWNER_PUBKEYS[0];
const [org, setOrg] = useState('');
const [contact, setContact] = useState('');
const [website, setWebsite] = useState('');
const [program, setProgram] = useState('');
const [grantSize, setGrantSize] = useState('');
const [kyc, setKyc] = useState('');
const [fund, setFund] = useState('');
const [ack, setAck] = useState(false);
const canSend = !!org.trim() && !!contact.trim() && ack && !!owner;
const message = [
'Bitcoin grantmaker inquiry — SkateSpots',
'',
`Organization: ${org.trim()}`,
`Contact: ${contact.trim()}`,
website.trim() ? `Website: ${website.trim()}` : '',
program.trim() ? `Program / round: ${program.trim()}` : '',
grantSize.trim() ? `Grant size: ${grantSize.trim()}` : '',
kyc.trim() ? `KYC / KYB process: ${kyc.trim()}` : '',
fund.trim() ? `What we would like to fund: ${fund.trim()}` : '',
'',
'I confirm this is a grantmaker inquiry and we KYC/KYB our grantees.',
].filter(Boolean).join('\n');
return (
<div className="rounded-2xl border-2 border-[#f7931a]/30 bg-gradient-to-br from-[#f7931a]/10 via-black to-transparent p-4 sm:p-6">
<div className="flex items-start gap-3">
<div className="flex h-10 w-10 shrink-0 items-center justify-center rounded-xl bg-[#f7931a]/15 text-[#f7931a]">
<Handshake className="h-5 w-5" />
</div>
<div className="min-w-0">
<h3 className="text-lg font-black uppercase text-white">{t('walletUi.supporters.grantsTitle')}</h3>
<p className="mt-1 text-sm font-bold text-[#f7931a]">{t('walletUi.supporters.grantsDisclaimer')}</p>
<p className="mt-1 text-xs leading-relaxed text-gray-500">{t('walletUi.supporters.grantsDisclaimerDesc')}</p>
</div>
</div>
<div className="mt-4 grid grid-cols-1 gap-3 sm:grid-cols-2">
<div className="space-y-1.5">
<Label htmlFor="grant-org">{t('walletUi.supporters.grantsOrg')} *</Label>
<Input id="grant-org" value={org} onChange={(e) => setOrg(e.target.value)} placeholder="e.g. OpenSats" />
</div>
<div className="space-y-1.5">
<Label htmlFor="grant-contact">{t('walletUi.supporters.grantsContact')} *</Label>
<Input id="grant-contact" value={contact} onChange={(e) => setContact(e.target.value)} placeholder="npub, email or @handle" />
</div>
<div className="space-y-1.5">
<Label htmlFor="grant-website">{t('walletUi.supporters.grantsWebsite')}</Label>
<Input id="grant-website" value={website} onChange={(e) => setWebsite(e.target.value)} placeholder="https://…" />
</div>
<div className="space-y-1.5">
<Label htmlFor="grant-program">{t('walletUi.supporters.grantsProgram')}</Label>
<Input id="grant-program" value={program} onChange={(e) => setProgram(e.target.value)} placeholder="e.g. Q1 2027 grants" />
</div>
<div className="space-y-1.5">
<Label htmlFor="grant-size">{t('walletUi.supporters.grantsSize')}</Label>
<Input id="grant-size" value={grantSize} onChange={(e) => setGrantSize(e.target.value)} placeholder="e.g. 5–25M sats" />
</div>
<div className="space-y-1.5">
<Label htmlFor="grant-kyc">{t('walletUi.supporters.grantsKyc')}</Label>
<Input id="grant-kyc" value={kyc} onChange={(e) => setKyc(e.target.value)} placeholder="e.g. KYB + grantee KYC" />
</div>
<div className="space-y-1.5 sm:col-span-2">
<Label htmlFor="grant-fund">{t('walletUi.supporters.grantsFund')}</Label>
<Textarea id="grant-fund" value={fund} onChange={(e) => setFund(e.target.value)} rows={3} placeholder="Relay, app development, translation, design, events…" />
</div>
</div>
<label className="mt-4 flex cursor-pointer items-start gap-2.5 rounded-xl border border-[#f7931a]/20 bg-black/30 p-3 text-xs text-gray-400">
<input type="checkbox" checked={ack} onChange={(e) => setAck(e.target.checked)} className="mt-0.5 h-4 w-4 accent-[#f7931a]" />
<span>{t('walletUi.supporters.grantsAck')}</span>
</label>
<div className="mt-4 flex flex-col gap-2 sm:flex-row sm:items-center">
<Button
disabled={!canSend}
onClick={() => {
if (!canSend || !owner) return;
navigate(`/messages/${nip19.npubEncode(owner)}?message=${encodeURIComponent(message)}`);
}}
className="w-full justify-center bg-[#f7931a] font-bold text-black hover:bg-[#ffb347] sm:w-auto"
>
<Handshake className="mr-2 h-4 w-4" /> {t('walletUi.supporters.grantsSend')}
</Button>
<p className="flex items-center gap-1.5 text-[11px] text-gray-600">
<Info className="h-3 w-3 shrink-0" />
{t('walletUi.supporters.grantsNote')}
</p>
</div>
</div>
);
}
// ─── Section header ───────────────────────────────────────────────────────────
function SectionHeader({
icon: Icon,
title,
@ -583,7 +687,18 @@ export default function SupportersPage() {
</div>
</section>
{/* ── 2. What your support pays for (words only) ── */}
{/* ── 2. Bitcoin grantmakers ── */}
<section>
<SectionHeader
icon={Handshake}
title={t('walletUi.supporters.grantsSection')}
subtitle={t('walletUi.supporters.grantsSectionDesc')}
color="#f7931a"
/>
<GrantmakerForm />
</section>
{/* ── 3. What your support pays for (words only) ── */}
<section>
<SectionHeader
icon={Heart}