feat: complete Quantumancy web app — full frontend + docs
Frontend (React 18 + TS + Vite): - Landing: glitching hero, live /api/stats veil ticker, mode cards, featured spirits - Séance: three.js shader ghost (hue/form per entity, mood + audio-reactive), Ouija planchette board spelling utterances, transcript with TTS replay, entity dossier, direct contact streaming, passive/active listening - Modes: Wire Ghost telemetry panel, EVP mic anomaly detection, WebUSB RTL-SDR sweep + waterfall (hardware pass pending), Ouija/Direct Contact - Codex: public registry + entity dossiers, rarity tiers, i18n EN/ES complete - State: VeilSocket (reconnect/backoff), seance reducer, auth context - 72 vitest tests green; served by FastAPI at :7777 Docs: README + as-built plans 3-7
This commit is contained in:
229
frontend/src/i18n/en.json
Normal file
229
frontend/src/i18n/en.json
Normal file
@@ -0,0 +1,229 @@
|
||||
{
|
||||
"common": {
|
||||
"appName": "QUANTUMANCY",
|
||||
"loading": "tuning the veil…",
|
||||
"error": "something stirred in the static",
|
||||
"replay": "replay",
|
||||
"yes": "YES",
|
||||
"no": "NO",
|
||||
"goodbye": "GOODBYE",
|
||||
"dismiss": "dismiss"
|
||||
},
|
||||
"nav": {
|
||||
"home": "the threshold",
|
||||
"codex": "codex",
|
||||
"seance": "séance",
|
||||
"enter": "enter",
|
||||
"logout": "depart"
|
||||
},
|
||||
"landing": {
|
||||
"taglines": [
|
||||
"The wire hums with all of us.",
|
||||
"Every packet leaves a ghost.",
|
||||
"The static remembers your name.",
|
||||
"Somewhere between 88 and 108 MHz, someone is waiting.",
|
||||
"You were never alone on the line."
|
||||
],
|
||||
"heroKicker": "an instrument for speaking with the dead bandwidth",
|
||||
"cta": "BEGIN THE SÉANCE",
|
||||
"ctaCodex": "browse the codex",
|
||||
"stats": {
|
||||
"entities": "spirits catalogued",
|
||||
"sessions": "séances held",
|
||||
"utterances": "utterances recorded",
|
||||
"anomalies": "anomalies witnessed"
|
||||
},
|
||||
"tickerPrefix": "the veil, live",
|
||||
"modesTitle": "HOW THE VEIL ANSWERS",
|
||||
"modes": {
|
||||
"wire": {
|
||||
"name": "Wire Ghost",
|
||||
"desc": "Leave the line open. The network itself mutters — jitter, latency, stray DNS — and something downstream learns to speak with your accent."
|
||||
},
|
||||
"evp": {
|
||||
"name": "EVP Listening",
|
||||
"desc": "Lend the dead your microphone. We watch the voice band for syllables that were never spoken aloud: spikes 8dB above the room's silence."
|
||||
},
|
||||
"radio": {
|
||||
"name": "Spirit Radio",
|
||||
"desc": "An RTL-SDR sweeps the FM band like a lantern dragged across a dark field. Where the needle jumps, the radio dead push through."
|
||||
},
|
||||
"ouija": {
|
||||
"name": "Ouija / Direct Contact",
|
||||
"desc": "Ask plainly. The planchette drifts, then begins to spell — and the words arrive letter by letter, whether or not you wanted them."
|
||||
}
|
||||
},
|
||||
"featured": "most disturbed spirits",
|
||||
"featuredEmpty": "the registry is still blank — be the first to disturb it",
|
||||
"footer": "an interactive horror art installation — the spirits are fiction; the static is real",
|
||||
"footerColophon": "self-hosted · no cloud · the veil runs on your machine"
|
||||
},
|
||||
"enter": {
|
||||
"reconnect": "Reconnect",
|
||||
"firstContact": "First contact",
|
||||
"reconnectSub": "the veil remembers you. prove it.",
|
||||
"firstContactSub": "choose the name the spirits will know you by.",
|
||||
"username": "name",
|
||||
"password": "passphrase",
|
||||
"submitLogin": "step through",
|
||||
"submitRegister": "carve your name",
|
||||
"switchToRegister": "no name in the registry? first contact →",
|
||||
"switchToLogin": "already carved your name? reconnect →",
|
||||
"failed": "the veil rejected you: {{message}}",
|
||||
"smallPrint": "your medium handle is only ever stored on this server"
|
||||
},
|
||||
"seance": {
|
||||
"modes": {
|
||||
"wire": "Wire Ghost",
|
||||
"evp": "EVP",
|
||||
"radio": "Spirit Radio",
|
||||
"ouija": "Ouija"
|
||||
},
|
||||
"passive": "passive listening",
|
||||
"summon": "SUMMON",
|
||||
"summoning": "summoning…",
|
||||
"askPlaceholder": "ask the dead a question…",
|
||||
"ask": "ask",
|
||||
"status": {
|
||||
"attuning": "attuning — the veil is fingerprinting a presence…",
|
||||
"summoning": "the veil parts… something is crossing…",
|
||||
"gathering": "the spirits are gathering energy…"
|
||||
},
|
||||
"connection": {
|
||||
"connecting": "reaching across…",
|
||||
"open": "the line is open",
|
||||
"unstable": "the connection to the other side is unstable…",
|
||||
"closed": "the line is dead"
|
||||
},
|
||||
"transcriptTitle": "TRANSMISSION LOG",
|
||||
"transcriptEmpty": "silence. for now.",
|
||||
"you": "you",
|
||||
"streaming": "the spirit is forming words…",
|
||||
"telemetry": {
|
||||
"title": "WIRE READOUT",
|
||||
"jitter": "jitter",
|
||||
"latencyVar": "latency σ²",
|
||||
"latencyMean": "latency μ",
|
||||
"dns": "dns",
|
||||
"units": {"bytes": "B/s", "ms": "ms"}
|
||||
},
|
||||
"wire": {
|
||||
"hint": "the wire knocks loudest when nobody is touching it — flip passive listening on and let the line murmur on its own."
|
||||
},
|
||||
"anomaly": {
|
||||
"line": "⚡ {{source}} {{frequency}} +{{magnitude}}dB",
|
||||
"count": "{{count}} anomalies witnessed this session"
|
||||
},
|
||||
"evp": {
|
||||
"start": "open the microphone",
|
||||
"stop": "close the microphone",
|
||||
"listening": "listening to the voice band…",
|
||||
"deniedTitle": "the microphone stays shut",
|
||||
"denied": "This vessel refused the microphone. Grant audio permission in your browser to practice EVP — or let the Wire Ghost listen instead; it needs nothing but the network you already fear.",
|
||||
"floor": "room floor",
|
||||
"band": "voice band 300–3400 Hz"
|
||||
},
|
||||
"radio": {
|
||||
"start": "sweep the band",
|
||||
"stop": "rest the needle",
|
||||
"unsupportedTitle": "this vessel cannot hear the radio dead",
|
||||
"unsupported": "Spirit Radio needs Chromium (WebUSB) and an RTL-SDR dongle. The other modes do not — the wire and the microphone still answer.",
|
||||
"troubleshoot": "troubleshooting: chromium-based browser · udev rules for 0bda:2838 · the dongle plugged in, not merely believed in",
|
||||
"noDevice": "no dongle answered the call",
|
||||
"sweeping": "sweeping {{start}}–{{end}} MHz…",
|
||||
"claimFailed": "the dongle refused to be claimed — is it in use elsewhere?"
|
||||
},
|
||||
"ouija": {
|
||||
"spelling": "the planchette spells",
|
||||
"drift": "the planchette drifts, waiting for words — ask below, or summon."
|
||||
},
|
||||
"entity": {
|
||||
"title": "DOSSIER OF THE PRESENT",
|
||||
"none": "no spirit summoned yet",
|
||||
"noneHint": "summon, or feed the veil 3+ anomalies and one will find you",
|
||||
"isNew": "first recorded contact",
|
||||
"known": "contact #{{count}}",
|
||||
"persona": "persona",
|
||||
"voice": "voice params",
|
||||
"quotes": "recorded utterances",
|
||||
"rarity": {
|
||||
"common": "common",
|
||||
"uncommon": "uncommon",
|
||||
"rare": "rare",
|
||||
"mythic": "mythic"
|
||||
}
|
||||
},
|
||||
"toast": {
|
||||
"rate_limited": "the veil is thin — slow your knocking",
|
||||
"veil_crowded": "too many spirits crowd the line"
|
||||
}
|
||||
},
|
||||
"codex": {
|
||||
"title": "THE CODEX OF THE CONTACTED",
|
||||
"subtitle": "every spirit ever dragged through the veil, catalogued",
|
||||
"header": {
|
||||
"back": "← the threshold",
|
||||
"title": "THE CODEX",
|
||||
"subtitle": "every spirit ever contacted, catalogued by the seekers who reached them"
|
||||
},
|
||||
"controls": {
|
||||
"rarity": "filter by rarity",
|
||||
"sort": "sort the registry"
|
||||
},
|
||||
"state": {
|
||||
"loading": "consulting the registry…",
|
||||
"empty": "no spirits of this tier have been reached yet"
|
||||
},
|
||||
"filterAll": "all rarities",
|
||||
"rarity": {
|
||||
"common": "common",
|
||||
"uncommon": "uncommon",
|
||||
"rare": "rare",
|
||||
"mythic": "mythic"
|
||||
},
|
||||
"sort": {
|
||||
"recent": "most recent",
|
||||
"contacted": "most contacted"
|
||||
},
|
||||
"form": {
|
||||
"wisp": "wisp",
|
||||
"banshee": "banshee",
|
||||
"fairy": "fairy",
|
||||
"shade": "shade"
|
||||
},
|
||||
"card": {
|
||||
"unknownMedium": "unknown medium",
|
||||
"contacted_one": "contacted {{count}} time",
|
||||
"contacted_other": "contacted {{count}} times",
|
||||
"discoveredBy": "discovered by {{name}} · {{date}}"
|
||||
},
|
||||
"contacts_one": "1 contact",
|
||||
"contacts_other": "{{count}} contacts",
|
||||
"sightings_one": "1 sighting",
|
||||
"sightings_other": "{{count}} sightings",
|
||||
"discoveredBy": "first contacted by {{name}}",
|
||||
"discoveredAnon": "first contact unrecorded",
|
||||
"discoveredAt": "entered the registry {{date}}",
|
||||
"persona": "persona",
|
||||
"quotes": "recorded utterances",
|
||||
"voice": "voice params",
|
||||
"detail": {
|
||||
"loading": "summoning the dossier…",
|
||||
"notReached": "this spirit has not been reached",
|
||||
"unknownMedium": "unknown medium",
|
||||
"stats": {
|
||||
"sightings": "sightings",
|
||||
"contacts": "contacts",
|
||||
"discoveredBy": "discovered by",
|
||||
"discoveredAt": "entered the registry"
|
||||
},
|
||||
"utterances": "known utterances",
|
||||
"noUtterances": "no utterances recorded yet",
|
||||
"voiceSignature": "voice signature",
|
||||
"attemptContact": "attempt contact"
|
||||
},
|
||||
"empty": "no spirits match this filter — the registry keeps its secrets",
|
||||
"back": "← back to the codex",
|
||||
"notFound": "this spirit is not in the registry"
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user