Files
qtalker---/frontend/src/i18n/es.json
Indiana 0756e677b9 Add EMF field mode, Armory shop/waitlist, and ambient haunting layer
Three self-contained features, verified complete and cross-wired
end-to-end (audited: backend 54/54 tests, frontend 110/110 tests,
tsc --noEmit clean, i18n coverage script clean):

- EMF mode: DeviceMotion/DeviceOrientation-based field-meter sensing,
  a fifth séance channel alongside Wire/EVP/Radio/Ouija, with its own
  fragment prompt persona and full frontend gauge UI.
- Armory (shop/waitlist): pre-order capture page for the future
  Ultimate Quantum Box hardware line, rate-limited public endpoint,
  explicitly no payment collection.
- Haunting layer: ambient possession effects (dread-bed audio, title
  glitching, idle-paced whispers/manifests), respects
  prefers-reduced-motion, mounted once at the app root.

Plus WebUSB robustness fixes in lib/sdr.ts (Terratec vendor ID,
explicit selectConfiguration, isSecureContext gate).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013PphXq1s43DNRj1uWKGXof
2026-07-21 02:28:14 +00:00

356 lines
14 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"common": {
"appName": "QUANTUMANCY",
"loading": "afinando el velo…",
"error": "algo se agitó en la estática",
"replay": "repetir",
"yes": "SÍ",
"no": "NO",
"goodbye": "ADIÓS",
"dismiss": "cerrar"
},
"nav": {
"home": "el umbral",
"codex": "códice",
"shop": "arsenal",
"seance": "sesión",
"enter": "entrar",
"logout": "partir"
},
"landing": {
"taglines": [
"El cable zumba con todos nosotros.",
"Cada paquete deja un fantasma.",
"La estática recuerda tu nombre.",
"Entre 88 y 108 MHz, alguien espera.",
"Nunca estuviste solo en la línea."
],
"heroKicker": "un instrumento para hablar con el ancho de banda muerto",
"cta": "COMENZAR LA SESIÓN",
"ctaCodex": "hojear el códice",
"ctaShop": "visitar el arsenal",
"stats": {
"entities": "espíritus catalogados",
"sessions": "sesiones celebradas",
"utterances": "enunciados registrados",
"anomalies": "anomalías presenciadas"
},
"tickerPrefix": "el velo, en vivo",
"modesTitle": "CÓMO RESPONDE EL VELO",
"modes": {
"wire": {
"name": "Fantasma del Cable",
"desc": "Deja la línea abierta. La red misma murmura — jitter, latencia, DNS extraviado — y algo, aguas abajo, aprende a hablar con tu acento."
},
"evp": {
"name": "Escucha EVP",
"desc": "Préstales tu micrófono. Vigilamos la banda de voz en busca de sílabas que jamás se pronunciaron: picos 8dB sobre el silencio de la sala."
},
"radio": {
"name": "Radio Espíritu",
"desc": "Un RTL-SDR barre la banda FM como un farol arrastrado por un campo oscuro. Donde salta la aguja, los muertos de la radio se abren paso."
},
"ouija": {
"name": "Ouija / Contacto Directo",
"desc": "Pregunta claro. La planchette deriva, y luego empieza a deletrear — y las palabras llegan letra a letra, lo quisieras o no."
}
},
"featured": "los espíritus más perturbados",
"featuredEmpty": "el registro aún está en blanco — sé quien lo perturbe primero",
"armory": {
"title": "HARDWARE DEL ARSENAL",
"line": "la Ultimate Quantum Box se acerca — un instrumento de sesión de mano que hace que el velo golpee más fuerte.",
"link": "entrar al arsenal →"
},
"footer": "una instalación de arte de terror interactiva — los espíritus son ficción; la estática es real",
"footerColophon": "autoalojado · sin nube · el velo corre en tu máquina"
},
"enter": {
"reconnect": "Reconectar",
"firstContact": "Primer contacto",
"reconnectSub": "el velo te recuerda. demuéstralo.",
"firstContactSub": "elige el nombre por el que te conocerán los espíritus.",
"username": "nombre",
"password": "contraseña",
"submitLogin": "cruzar el umbral",
"submitRegister": "grabar tu nombre",
"switchToRegister": "¿sin nombre en el registro? primer contacto →",
"switchToLogin": "¿ya grabaste tu nombre? reconectar →",
"failed": "el velo te rechazó: {{message}}",
"smallPrint": "tu nombre de médium solo se guarda en este servidor"
},
"seance": {
"modes": {
"wire": "Fantasma del Cable",
"evp": "EVP",
"radio": "Radio Espíritu",
"ouija": "Ouija",
"emf": "CAMPO"
},
"passive": "escucha pasiva",
"summon": "INVOCAR",
"summoning": "invocando…",
"askPlaceholder": "pregúntale algo a los muertos…",
"ask": "preguntar",
"status": {
"attuning": "sintonizando — el velo toma la huella de una presencia…",
"summoning": "el velo se abre… algo está cruzando…",
"gathering": "los espíritus están reuniendo energía…"
},
"connection": {
"connecting": "tendiendo la línea…",
"open": "la línea está abierta",
"unstable": "la conexión con el otro lado es inestable…",
"closed": "la línea está muerta"
},
"transcriptTitle": "REGISTRO DE TRANSMISIÓN",
"transcriptEmpty": "silencio. por ahora.",
"you": "tú",
"streaming": "el espíritu está formando palabras…",
"telemetry": {
"title": "LECTURA DEL CABLE",
"jitter": "jitter",
"latencyVar": "latencia σ²",
"latencyMean": "latencia μ",
"dns": "dns",
"units": {
"bytes": "B/s",
"ms": "ms"
}
},
"wire": {
"hint": "el cable golpea más fuerte cuando nadie lo toca — activa la escucha pasiva y deja que la línea murmure sola."
},
"anomaly": {
"line": "⚡ {{source}} {{frequency}} +{{magnitude}}dB",
"count": "{{count}} anomalías presenciadas en esta sesión"
},
"evp": {
"start": "abrir el micrófono",
"stop": "cerrar el micrófono",
"listening": "escuchando la banda de voz…",
"deniedTitle": "el micrófono sigue cerrado",
"denied": "Este recipiente rechazó el micrófono. Concede el permiso de audio en tu navegador para practicar EVP — o deja que el Fantasma del Cable escuche en tu lugar; no necesita más que la red que ya temes.",
"floor": "suelo de la sala",
"band": "banda de voz 300–3400 Hz"
},
"radio": {
"start": "barrer la banda",
"stop": "detener la aguja",
"unsupportedTitle": "este recipiente no oye a los muertos de la radio",
"unsupported": "La Radio Espíritu necesita Chromium (WebUSB) y un dongle RTL-SDR. Los demás modos no — el cable y el micrófono aún responden.",
"troubleshoot": "solución de problemas: navegador basado en Chromium · reglas udev para 0bda:2838 · el dongle enchufado, no meramente invocado",
"insecure": "los muertos de la radio solo hablan desde suelo consagrado — abre este sitio por su dirección https.",
"insecureHint": "localhost cuenta como sagrado; una http://ip-local desnuda, no.",
"noDevice": "ningún dongle respondió al llamado",
"sweeping": "barriendo {{start}}–{{end}} MHz…",
"claimFailed": "el dongle se negó a ser reclamado — ¿está en uso en otro lugar?",
"claimFix": "linux: el driver del kernel dvb_usb_rtl28xxu retiene el dongle — `sudo modprobe -r dvb_usb_rtl28xxu` lo libera hasta el reinicio (una regla udev lo destierra para siempre). windows: cambia el driver a WinUSB con Zadig.",
"tryAgain": "intenta de nuevo",
"errorTitle": "la estática devolvió el golpe"
},
"ouija": {
"spelling": "la planchette deletrea",
"drift": "la planchette deriva, a la espera de palabras — pregunta abajo, o invoca."
},
"emf": {
"start": "alzar el medidor",
"stop": "descargar el medidor",
"calibrate": "calibrar",
"baseline": "campo en reposo",
"listening": "palpando perturbaciones en el campo…",
"unsupportedTitle": "este recipiente no porta sentidos de campo",
"unsupported": "un teléfono en tu mano se vuelve el medidor — este recipiente no tiene sentidos de movimiento que prestar. abre el velo en un teléfono, o deja que los otros modos respondan.",
"deniedTitle": "los sentidos de campo siguen cerrados",
"denied": "Este recipiente rechazó sus sentidos de movimiento. Concede el acceso al movimiento en los ajustes de tu navegador, y luego alza el medidor de nuevo."
},
"entity": {
"title": "DOSIER DEL PRESENTE",
"none": "ningún espíritu invocado todavía",
"noneHint": "invoca, o alimenta el velo con 3+ anomalías y uno te encontrará",
"isNew": "primer contacto registrado",
"known": "contacto n.º {{count}}",
"persona": "persona",
"voice": "parámetros de voz",
"quotes": "enunciados registrados",
"rarity": {
"common": "común",
"uncommon": "poco común",
"rare": "raro",
"mythic": "mítico"
}
},
"toast": {
"rate_limited": "el velo es delgado — golpea más despacio",
"veil_crowded": "demasiados espíritus se apiñan en la línea"
},
"views": {
"board": "TABLERO",
"matrix": "MATRIZ",
"graphs": "GRÁFICAS",
"tuning": "afinando el velo…",
"listening": "escuchando…",
"graph": {
"anomalies": "anomalías",
"entity": "entidad",
"jitter": "fluctuación"
}
}
},
"codex": {
"title": "EL CÓDICE DE LOS CONTACTADOS",
"subtitle": "cada espíritu arrastrado alguna vez a través del velo, catalogado",
"header": {
"back": "← el umbral",
"title": "EL CÓDICE",
"subtitle": "cada espíritu jamás contactado, catalogado por los médiums que lo alcanzaron"
},
"controls": {
"rarity": "filtrar por rareza",
"sort": "ordenar el registro"
},
"state": {
"loading": "consultando el registro…",
"empty": "aún no se ha alcanzado a ningún espíritu de esta rareza"
},
"filterAll": "todas las rarezas",
"rarity": {
"common": "común",
"uncommon": "poco común",
"rare": "raro",
"mythic": "mítico"
},
"sort": {
"recent": "más recientes",
"contacted": "más contactados"
},
"form": {
"wisp": "fuego fatuo",
"banshee": "banshee",
"fairy": "hada",
"shade": "sombra"
},
"card": {
"unknownMedium": "médium desconocido",
"contacted_one": "contactado {{count}} vez",
"contacted_other": "contactado {{count}} veces",
"discoveredBy": "descubierto por {{name}} · {{date}}"
},
"contacts_one": "1 contacto",
"contacts_other": "{{count}} contactos",
"sightings_one": "1 avistamiento",
"sightings_other": "{{count}} avistamientos",
"discoveredBy": "primer contacto por {{name}}",
"discoveredAnon": "primer contacto sin registrar",
"discoveredAt": "ingresó al registro el {{date}}",
"persona": "persona",
"quotes": "enunciados registrados",
"voice": "parámetros de voz",
"detail": {
"loading": "invocando el dosier…",
"notReached": "este espíritu no ha sido alcanzado",
"unknownMedium": "médium desconocido",
"stats": {
"sightings": "avistamientos",
"contacts": "contactos",
"discoveredBy": "descubierto por",
"discoveredAt": "ingresó al registro"
},
"utterances": "enunciados conocidos",
"noUtterances": "aún no hay enunciados registrados",
"voiceSignature": "firma de voz",
"attemptContact": "intentar contacto"
},
"empty": "ningún espíritu coincide con este filtro — el registro guarda sus secretos",
"back": "← volver al códice",
"notFound": "este espíritu no figura en el registro"
},
"shop": {
"back": "← el umbral",
"title": "EL ARSENAL",
"subtitle": "instrumentos para quienes quisieran golpear más fuerte",
"flagship": {
"tag": "instrumento insignia",
"name": "THE ULTIMATE QUANTUM BOX",
"desc": "Un instrumento de sesión de mano ESP32-P4/C6 — cámara térmica, matriz de antenas EMF, geófono, preamplificador de micrófono spirit-box y una pequeña cara OLED que te devuelve la mirada. Inicia sesión con la misma cuenta de Quantumancy que ya habitas y desbloquea los modos de este sitio impulsados por hardware: mapas térmicos de apariciones, feeds de anomalías de vibración, EMF calibrado.",
"specs": {
"thermal": "cámara térmica",
"emf": "matriz de antenas EMF",
"geophone": "geófono",
"mic": "preamplificador de micrófono spirit-box",
"oled": "pantalla OLED"
},
"price": "est. $249 — preventa"
},
"modulesTitle": "MÓDULOS QUE GOLPEAN",
"unlocksLabel": "desbloquea:",
"modules": {
"emfArray": {
"name": "Matriz de Antenas EMF",
"desc": "un ramo de sensores de campo multieje, olfateando el aire en busca de intenciones",
"unlocks": "un modo CAMPO más rico y calibrado",
"price": "est. $59 — preventa"
},
"geophone": {
"name": "Puck Geófono",
"desc": "oye pasos en habitaciones donde nadie está de pie",
"unlocks": "el feed de anomalías de vibración",
"price": "est. $49 — preventa"
},
"spiritMic": {
"name": "Preamplificador Spirit Mic",
"desc": "baja el suelo de ruido para que los susurros lleguen más limpios",
"unlocks": "capturas EVP más limpias",
"price": "est. $69 — preventa"
},
"uvIlluminator": {
"name": "Iluminador UV/IR",
"desc": "pinta la oscuridad en espectros que los vivos jamás debieron ver",
"unlocks": "sesiones nocturnas + trabajo de cámara",
"price": "est. $39 — preventa"
}
},
"interests": {
"quantumBox": "la Ultimate Quantum Box",
"emfArray": "Matriz de Antenas EMF",
"geophone": "Puck Geófono",
"spiritMic": "Preamplificador Spirit Mic",
"uvIlluminator": "Iluminador UV/IR"
},
"waitlist": {
"title": "EL MANIFIESTO",
"desc": "deja una dirección y una obsesión — cuando salgan las primeras cajas, nos abriremos paso primero hasta los nombres de esta lista",
"emailLabel": "dirección de email",
"emailPlaceholder": "tu@algun.lugar.en.la.estatica",
"interestLabel": "interés",
"submit": "unirse al manifiesto",
"pending": "grabando tu nombre…",
"listed": "estás en el manifiesto — nos abriremos paso cuando salgan las cajas",
"alreadyListed": "ya estás en el manifiesto",
"invalid": "esa dirección no nos alcanza",
"crowded": "el velo está abarrotado — inténtalo más tarde",
"error": "algo se agitó en la estática — tu nombre no quedó grabado"
},
"honesty": "la Ultimate Quantum Box está en desarrollo activo — esto es un manifiesto de reserva, no se cobra nada. el sitio funciona por completo sin ella; el hardware solo golpea más fuerte."
},
"haunting": {
"whisper": {
"behindYou": "detrás de ti",
"cold": "frío",
"stay": "quédate",
"seesYou": "te ve",
"closer": "más cerca",
"stillHere": "sigue aquí",
"lineListening": "la línea escucha",
"dontLook": "no mires",
"beneathStatic": "bajo la estática",
"knockTwice": "golpea dos veces"
},
"title": {
"seesYou": "QUANTUMANCY — te ve",
"behindYou": "QUANTUM▓NCY — detrás de ti",
"listening": "…escuchando…"
}
}
}