SkateSpots/src/i18n/batch3/sasquatchUi.ts
SkateSpots 52eff36bce i18n/a11y polish: translate StashPage, honest Pro-activation copy, contrast
- StashPage: Friends only / Add to Wishlist / Add Item / Edit Item / Public
  stash / Uploading… / Add Photos / placeholders / item count / list-grid aria
  labels now go through t() (t added to the sub-components).
- Manual Pro copy no longer claims the pass is already active: it says the pass
  activates once the provider confirms the payment.
- Bumped low-contrast gray-600 guidance text to gray-400 (DM empty state, E2EE
  note, stash item count).
2026-10-03 10:03:48 +07:00

275 lines
11 KiB
TypeScript

/**
* Batch 3 — Sasquatch AI panel translations (`sasquatchUi.*`).
*
* Filled by the Sasquatch translation pass; keys must exist in BOTH languages.
*
* NOT translated here (deliberately): the LLM system prompt / language
* directive, the static FAQ answer bodies and the locally-formatted chat
* responses — those are AI/conversational content, not UI chrome.
*/
const sasquatchUi = {
en: {
// ── Connection status ──
live: 'live',
offline: 'offline',
// ── Panel default content ──
genericTitle: 'SkateSpots Assistant 🦧',
genericGreeting:
"Yo! I'm The Sasquatch. Ask me anything about spots, events, coaches, gear, or how the app works. I've got live data from the SkateSpots relay!",
q1: 'Plan me 3 days in Lisbon',
q2: 'Find spots near me',
q3: 'Any upcoming events?',
q4: 'What are crews?',
q5: 'How do zaps work?',
q6: 'What is Nostr?',
q7: 'What is My Stash?',
q8: 'Is this free?',
// ── Bubble + header ──
bubbleTitle: 'Press and drag to move · Tap to open',
openGuideAria: 'Open Sasquatch guide',
activeUntil: 'Active until {{date}}',
platformOwner: 'Platform owner',
upgradeTitle: 'Upgrade to Sasquatch Pro',
goPro: 'Go Pro',
aiBalanceTitle: 'Sasquatch AI credit balance (owner-only) — top up at {{provider}}',
aiChip: '⚡ AI {{balance}}',
minimizeToBubbleAria: 'Minimize to bubble',
minimize: 'Minimize',
closePanelAria: 'Close panel',
close: 'Close',
// ── Chat chrome ──
askLab: 'Ask about Coaching & Filming',
askMap: 'Ask about Spots, Shops & Gear',
askAnything: 'Ask me anything 🛹',
quickQuestions: 'Quick questions:',
you: '🧑 You',
thinking: 'thinking...',
inputPlaceholder: 'Ask about spots, events, coaches...',
liveDataFrom: 'Live data from',
nostrRelays: 'Nostr relays',
clear: 'clear',
// ── Loading / streaming states ──
gettingLocation: '📍 Getting your location…',
findingClosest: '🔍 Finding the closest spots…',
checkingLive: '🔍 Checking live data…',
planningTrip: '🗺️ Planning your {{destination}} trip...',
searchingRelays: '🔍 Searching the relays for {{tool}}...',
// ── Sasquatch Pro dialog ──
perk1: 'Personal assistant — Sasquatch reads your own Stash, crews, spots & listings',
perk2: 'Action drafts: list gear, post a skate status, plan a trip — you confirm before anything publishes',
perk3: 'Answers use your personal context, not just public data',
perk4: '⚡ Directly support SkateSpots & keep it free and ad-free',
welcomeTitle: 'Thanks for supporting Sasquatch Pro! 🦧⚡',
welcomeDesc:
'Payment sent — your pass activates once the provider confirms it (usually within a minute). Thanks for keeping the streets free.',
invoiceCopied: 'Invoice copied',
dialogDesc: 'Supercharge your AI skate guide. 100% funds a free, no-ads community app.',
proSupporter: "You're a Pro supporter ⚡",
extendPrompt: 'Want to extend? Pick a tier below to add more time.',
scanToPayPre: 'Scan to pay',
scanToPayAmount: '{{sats}} sats',
scanToPayPost: 'for {{label}} of Pro',
invoiceQrAlt: 'Lightning invoice QR',
copyInvoice: 'Copy invoice',
ivePaid: "I've paid",
ivePaidHint:
'Tap "I\'ve paid" after your wallet confirms — this records your pass to your Nostr identity.',
freeStaysPre:
'Free Sasquatch stays free — public spot/event/coach search, trip planning + the full trick glossary. Pro adds the ',
freeStaysEmphasis: 'personal + action',
freeStaysPost: ' layer.',
loginFirst: 'Log in first to upgrade.',
paysTo: 'Pays to',
overLightning: 'over Lightning. Bound to your npub.',
popular: 'Popular',
sats: 'sats',
extend: 'Extend',
// ── Draft action card ──
done: 'Done!',
cancelledNothing: 'Cancelled — nothing was published.',
draftReview: 'Draft — review & confirm',
statusTextPlaceholder: 'Status text',
titlePlaceholder: 'Title',
priceSatsPlaceholder: 'Price (sats)',
conditionPlaceholder: 'Condition',
cancel: 'Cancel',
// ── Owner AI balance card ──
aiTitle: 'Sasquatch AI',
owner: 'Owner',
notConfigured: 'not configured',
unavailable: 'unavailable',
satsValue: '{{balance}} sats',
theNode: 'the node',
lowBalance: 'Running low — top up at {{provider}} or AI will fall back to the keyless provider.',
aiDesc: 'Pay-per-request AI, funded in sats via Routstr. Tops up when low.',
// ── Pro tier labels & badges (PRO_TIERS) ──
tier7d: '7 days',
tier1m: '1 month',
tier3m: '3 months',
tier1y: '1 year',
badgeTry: 'Try it',
badgeOff20: '20% off',
badgeBest: 'Best value · 40% off',
// ── Draft action summary ──
draftPostStatusTitle: 'Post a skating status',
draftAutoExpires: 'Auto-expires in {{count}} min',
draftPostStatusCta: 'Post status',
draftCategory: 'Category: {{value}}',
draftSize: 'Size: {{value}}',
draftCondition: 'Condition: {{value}}',
draftMaxPrice: 'Max price: {{price}} {{currency}}',
draftPriceOpen: 'Price: open',
draftLookingForTitle: 'Looking for "{{title}}"',
draftWantedCta: 'Post wanted ad',
draftPrice: 'Price: {{price}} {{currency}}',
draftPriceOffer: 'Price: make offer',
draftListTitle: 'List "{{title}}" for sale',
draftPublishCta: 'Publish listing',
statusPosted: 'Status posted 🛹',
wantedPublished: 'Wanted ad published 🔎',
listingPublished: 'Listing published 💸',
mustBeLoggedIn: 'You must be logged in.',
},
es: {
// ── Connection status ──
live: 'en vivo',
offline: 'sin conexión',
// ── Panel default content ──
genericTitle: 'Asistente de SkateSpots 🦧',
genericGreeting:
'¡Hola! Soy el Sasquatch. Pregúntame lo que quieras sobre spots, eventos, entrenadores, material o cómo funciona la app. ¡Tengo datos en vivo del relé de SkateSpots!',
q1: 'Planifícame 3 días en Lisboa',
q2: 'Encuentra spots cerca de mí',
q3: '¿Próximos eventos?',
q4: '¿Qué son los crews?',
q5: '¿Cómo funcionan los zaps?',
q6: '¿Qué es Nostr?',
q7: '¿Qué es Mi Stash?',
q8: '¿Es gratis?',
// ── Bubble + header ──
bubbleTitle: 'Pulsa y arrastra para mover · Toca para abrir',
openGuideAria: 'Abrir la guía del Sasquatch',
activeUntil: 'Activo hasta el {{date}}',
platformOwner: 'Propietario de la plataforma',
upgradeTitle: 'Mejora a Sasquatch Pro',
goPro: 'Hazte Pro',
aiBalanceTitle: 'Saldo de crédito de la IA del Sasquatch (solo propietario) — recarga en {{provider}}',
aiChip: '⚡ IA {{balance}}',
minimizeToBubbleAria: 'Minimizar a la burbuja',
minimize: 'Minimizar',
closePanelAria: 'Cerrar el panel',
close: 'Cerrar',
// ── Chat chrome ──
askLab: 'Pregunta sobre entrenamiento y grabación',
askMap: 'Pregunta sobre spots, tiendas y material',
askAnything: 'Pregúntame lo que quieras 🛹',
quickQuestions: 'Preguntas rápidas:',
you: '🧑 Tú',
thinking: 'pensando...',
inputPlaceholder: 'Pregunta sobre spots, eventos, entrenadores...',
liveDataFrom: 'Datos en vivo de',
nostrRelays: 'relés de Nostr',
clear: 'borrar',
// ── Loading / streaming states ──
gettingLocation: '📍 Obteniendo tu ubicación…',
findingClosest: '🔍 Buscando los spots más cercanos…',
checkingLive: '🔍 Comprobando datos en vivo…',
planningTrip: '🗺️ Planificando tu viaje a {{destination}}...',
searchingRelays: '🔍 Buscando en los relés: {{tool}}...',
// ── Sasquatch Pro dialog ──
perk1: 'Asistente personal — el Sasquatch lee tu propio Stash, crews, spots y anuncios',
perk2: 'Borradores de acciones: publica material, comparte tu estado de skate, planifica un viaje — tú confirmas antes de que se publique nada',
perk3: 'Las respuestas usan tu contexto personal, no solo datos públicos',
perk4: '⚡ Apoya directamente a SkateSpots y ayúdanos a mantenerla gratis y sin anuncios',
welcomeTitle: '¡Gracias por apoyar Sasquatch Pro! 🦧⚡',
welcomeDesc:
'Pago enviado: tu pase se activa cuando el proveedor lo confirme (normalmente en un minuto). Gracias por mantener las calles libres.',
invoiceCopied: 'Factura copiada',
dialogDesc: 'Potencia tu guía de skate con IA. El 100 % financia una app comunitaria gratis y sin anuncios.',
proSupporter: 'Eres un colaborador Pro ⚡',
extendPrompt: '¿Quieres ampliar? Elige una tarifa abajo para añadir más tiempo.',
scanToPayPre: 'Escanea para pagar',
scanToPayAmount: '{{sats}} sats',
scanToPayPost: 'por {{label}} de Pro',
invoiceQrAlt: 'QR de la factura Lightning',
copyInvoice: 'Copiar factura',
ivePaid: 'He pagado',
ivePaidHint:
'Toca "He pagado" cuando tu cartera lo confirme — esto registra tu pase en tu identidad de Nostr.',
freeStaysPre:
'El Sasquatch gratis sigue siendo gratis — búsqueda pública de spots, eventos y entrenadores, planificación de viajes + el glosario completo de trucos. Pro añade la ',
freeStaysEmphasis: 'capa personal y de acciones',
freeStaysPost: '.',
loginFirst: 'Inicia sesión primero para mejorar.',
paysTo: 'Paga a',
overLightning: 'por Lightning. Vinculado a tu npub.',
popular: 'Popular',
sats: 'sats',
extend: 'Ampliar',
// ── Draft action card ──
done: '¡Hecho!',
cancelledNothing: 'Cancelado — no se publicó nada.',
draftReview: 'Borrador — revisa y confirma',
statusTextPlaceholder: 'Texto del estado',
titlePlaceholder: 'Título',
priceSatsPlaceholder: 'Precio (sats)',
conditionPlaceholder: 'Estado',
cancel: 'Cancelar',
// ── Owner AI balance card ──
aiTitle: 'Sasquatch IA',
owner: 'Propietario',
notConfigured: 'sin configurar',
unavailable: 'no disponible',
satsValue: '{{balance}} sats',
theNode: 'el nodo',
lowBalance: 'Saldo bajo — recarga en {{provider}} o la IA recurrirá al proveedor sin clave.',
aiDesc: 'IA de pago por uso, financiada en sats vía Routstr. Se recarga cuando baja.',
// ── Pro tier labels & badges (PRO_TIERS) ──
tier7d: '7 días',
tier1m: '1 mes',
tier3m: '3 meses',
tier1y: '1 año',
badgeTry: 'Pruébalo',
badgeOff20: '20 % dto.',
badgeBest: 'Mejor precio · 40 % dto.',
// ── Draft action summary ──
draftPostStatusTitle: 'Publicar un estado de skate',
draftAutoExpires: 'Se borra automáticamente en {{count}} min',
draftPostStatusCta: 'Publicar estado',
draftCategory: 'Categoría: {{value}}',
draftSize: 'Talla: {{value}}',
draftCondition: 'Estado: {{value}}',
draftMaxPrice: 'Precio máx.: {{price}} {{currency}}',
draftPriceOpen: 'Precio: abierto',
draftLookingForTitle: 'Buscando "{{title}}"',
draftWantedCta: 'Publicar anuncio',
draftPrice: 'Precio: {{price}} {{currency}}',
draftPriceOffer: 'Precio: aceptar ofertas',
draftListTitle: 'Vender "{{title}}"',
draftPublishCta: 'Publicar anuncio',
statusPosted: 'Estado publicado 🛹',
wantedPublished: 'Anuncio de búsqueda publicado 🔎',
listingPublished: 'Anuncio publicado 💸',
mustBeLoggedIn: 'Tienes que iniciar sesión.',
},
};
export default sasquatchUi;