{
  "brand": {
    "logoWordmark": "GT Gati",
    "shortName": "GT Gati"
  },
  "mapAnalysis": {
    "replayToolbar": {
      "refStart": "▶ Ref",
      "refStop": "■ Ref",
      "refTitle": "Replay reference lap (R)",
      "myStart": "▶ My",
      "myStop": "■ My",
      "myTitle": "Replay my lap (M)",
      "bothStart": "▶ Both",
      "bothStop": "■ Both",
      "bothTitle": "Replay both laps (B)",
      "resume": "▶ Resume",
      "pause": "⏸ Pause",
      "pauseTitle": "Pause / Resume (Space)",
      "voiceOn": "🔊 Voice",
      "voiceOff": "🔇 Voice",
      "voiceTitle": "Voice coach during replay"
    },
    "narrator": {
      "needMyLap": "Select a My Lap from the dropdown to use voice narration.",
      "gear": "Turn {n}. You were in the wrong gear at the apex. {loss}Try gear {gear} {reason} next lap.",
      "gearReasonHigher": "for a stronger exit",
      "gearReasonLower": "to settle the car",
      "apexSpeed": "Turn {n}. Bad apex. You were slow by {kph} kilometres per hour. {loss}",
      "entrySlow": "Turn {n}. Bad entry. You were slow by {kph} kilometres per hour. {loss}",
      "exitSlow": "Turn {n}. Bad exit. You were slow by {kph} kilometres per hour. {loss}",
      "brakeEarly": "Turn {n}. You braked too early by {m} metres. {loss}Brake a touch later next lap.",
      "brakeLate": "Turn {n}. You braked too late by {m} metres. {loss}Brake a touch earlier next lap.",
      "throttleLate": "Turn {n}. You picked up the throttle {m} metres late. {loss}Get back to power sooner next lap.",
      "clean": "Turn {n}. Clean line. Good corner.",
      "lossClause": "You lost {sec} seconds here. ",
      "noPlan": "Replay narrator: no corner data for this lap vs reference — cues unavailable for this combo.",
      "noTts": "Replay narrator: this browser has no speech engine (Web Speech unavailable)."
    },
    "replay": {
      "pickCatalogueFirst": "Pick track and car class from the Reference catalogue first.",
      "pickMyLap": "Load your lap from My saved… — it must match this track and class.",
      "waitingForReference": "Waiting for the catalogue reference lap to load…",
      "myLapMismatch": "This lap is {lapTrack} · {lapClass} — catalogue is {sessionTrack} · {sessionClass}. Pick a matching saved lap.",
      "myLapMismatchShort": "My lap must match the catalogue track and class before replay.",
      "myLapClearedMismatch": "My lap cleared — choose a saved lap that matches this track and class."
    },
    "emptyState": {
      "title": "No lap loaded",
      "hintMyLap": "Use the catalogue dropdown for <b>track + car class</b>. Only combinations backed by an approved reference in the database appear there; your selection loads that lap automatically.",
      "hintReplay": "<b>Replay:</b> pick the same catalogue entry for the reference, then optional my lap via <b>My saved…</b> (device storage plus faster laps synced to the server).",
      "stepMy1": "1) Connect PS5 — choose track &amp; class from the catalogue",
      "stepMy2": "2) Drive in <b>My Lap</b> (turn T# compare)",
      "stepMy3": "3) Switch to <b>Replay</b> for sectors <b>S#</b>, heatmap &amp; export",
      "stepReplay1": "1) Pick <b>track + car class</b> from the catalogue — no console connection needed",
      "stepReplay2": "2) Load <b>My saved…</b> for your lap when you want an offline comparison",
      "stepReplay3": "3) Use sectors <b>S#</b>, heatmap &amp; export from the replay toolbar"
    },
    "saveDialog": {
      "label": "Save as",
      "placeholder": "Lap name…",
      "save": "Save"
    },
    "reportModal": {
      "title": "Lap Analysis Report",
      "copy": "📋 Copy",
      "copyTitle": "Copy to clipboard",
      "download": "⬇ Download .md",
      "downloadTitle": "Download .md file"
    },
    "hoverPanel": {
      "title": "At this point",
      "ref": "Ref",
      "my": "My"
    },
    "lapBadge": {
      "vs": "vs",
      "lapDelta": "LAP Δ",
      "lapDeltaTitle": "Full-lap delta vs reference (the side panel’s Δ is live, at the car’s current position)",
      "focus": "Focus"
    },
    "glossary": {
      "header": "How To Read This",
      "hotspotLabel": "● Hotspot",
      "positionArrowTitle": "Position Arrow",
      "cyanArrow": "<b>Cyan arrow</b> — your live / replay position. Tick the boxes above to attach speed, gear, deltas, etc.",
      "greyArrow": "<b>Grey arrow</b> — reference lap's position when replaying both",
      "lapLineTitle": "My lap line (top row)",
      "vsRefLine": "<b>Vs ref</b> — my lap line colour vs reference at the same track position: red = slower, green = faster.",
      "pedalsLine": "<b>Pedals</b> — green = throttle, red = braking, grey = coasting.",
      "overlaysTitle": "Map overlays (Overlays row)",
      "compareOverlay": "<b>Compare</b> — sectors, turn pills, loss heatmap, and delta-style callouts.",
      "brakeMapOverlay": "<b>Brake map</b> — brake zones, gear shifts, and throttle/brake callouts.",
      "analysisOverlay": "<b>Analysis</b> — turns on the full overlay set for deep review.",
      "cornerLabelsTitle": "Corner labels",
      "cornerLabelsText": "<b>One line:</b> <b>T#</b> (turn number), time lost (+) or gained (−) in that corner, then optional <b>Entry</b> / <b>Apex</b> / <b>Exit</b> speed difference (km/h). Green = faster than reference, red = slower.",
      "cornerUnitsText": "Units: the time Δ is seconds lost (+) or gained (−) in that corner alone; Entry/Apex/Exit are km/h vs the reference at the same point (green = you were faster). Only the costliest corners get full labels — toggle \"All turns\" in Layers to label every corner.",
      "lossHeatmapTitle": "Loss Heatmap",
      "lossHeatmapText": "Orange/red glow shows where most time is lost. Brighter and larger hotspots indicate bigger losses.",
      "deltaStripTitle": "Delta strip (bottom)",
      "deltaStripText": "Your running gap to the reference across the lap — a cliff means one big mistake, a steady slope means time bleeding everywhere. In replay, the amber line is the car; click anywhere on the strip to jump the replay there.",
      "resetLayout": "Reset UI Layout",
      "resetLayoutTitle": "Reset map layout preferences"
    },
    "toolbar": {
      "modeReference": "REFERENCE",
      "modeReplay": "REPLAY",
      "modeMyLap": "MY LAP",
      "title": "REFERENCE VS MY LAP",
      "fileInputTitle": "Load my lap from file",
      "myFile": "My File",
      "myFileTitle": "Load my lap from a .json file",
      "mySaved": "My saved…",
      "noSavedLaps": "No saved laps",
      "deleteLap": "Delete this lap",
      "zoomOut": "−",
      "zoomOutTitle": "Zoom out (−)",
      "zoomIn": "+",
      "zoomInTitle": "Zoom in (+)",
      "fit": "Fit",
      "fitTitle": "Reset zoom (F)",
      "single": "Single",
      "split": "Split",
      "splitTitle": "Toggle split / single layout",
      "myLap": "My lap",
      "myLapTitle": "Colours / encoding for your lap trace (reference is separate)",
      "lineEncodingAria": "My-lap line encoding",
      "lineStyleAria": "How your lap line is drawn on the map",
      "vsRef": "Vs ref",
      "vsRefTitle": "Each point on your line is coloured by how much time you gain or lose versus the reference lap at the same distance along the track.",
      "pedals": "Pedals",
      "pedalsTitle": "Each point is coloured by your own throttle (green), braking (red), and coasting (grey).",
      "both": "Both",
      "bothTitle": "Vs-ref colours on the line, plus line width encodes how much your throttle differs from the reference at each point.",
      "line": "Line",
      "lineTitle": "Racing line vs reference — green on-line, red off-line",
      "guide": "Guide",
      "guideTitle": "How to read the map",
      "export": "📋 Export",
      "exportTitle": "Export lap comparison report as Markdown",
      "overlays": "Overlays",
      "preset.compare": "Compare",
      "preset.compareTitle": "Sectors, turn labels, loss heatmap, delta-style callouts",
      "preset.brakeMap": "Brake map",
      "preset.brakeMapTitle": "Brake zones, gear shifts, throttle/brake callouts",
      "preset.analysis": "Analysis",
      "preset.analysisTitle": "All overlays on",
      "preset.custom": "Custom",
      "more": "⚙ More",
      "moreTitle": "Fine-tune individual layers",
      "moreAria": "Map options",
      "moreAriaCustom": "Map options — custom layers on",
      "sheetAria": "Map options",
      "sheetView": "View",
      "sheetLegend": "Legend",
      "resetPreset": "Reset",
      "resetPresetTitle": "Back to the Compare preset",
      "layers": "Layers",
      "annotationsAria": "Map annotations",
      "layer.brake": "Brake",
      "layer.sectors": "Sectors",
      "layer.turns": "Turns",
      "layer.allTurns": "All turns",
      "layer.heatmap": "Heatmap",
      "arrows": "Arrows",
      "arrow.spd": "Spd",
      "arrow.spdDelta": "SpdΔ",
      "arrow.gear": "Gear",
      "arrow.thr": "Thr",
      "arrow.brk": "Brk",
      "arrow.lapDelta": "LapΔ",
      "legend.throttle": "Throttle",
      "legend.brake": "Brake",
      "legend.coast": "Coast",
      "legend.myLap": "My lap — colour vs reference speed",
      "legend.reference": "Reference — green throttle · grey coast · red brake",
      "legend.heavyBrake": "Amber — heavy braking",
      "legend.line": "My line vs reference — green on-line · red off-line"
    },
    "hints": {
      "pickFromCatalogue": "Pick track & class from the catalogue dropdown — list matches DB references only.",
      "loading": "Loading approved reference…",
      "loaded": "Approved reference · {track} · {class}",
      "none": "No approved reference for this track and car yet.",
      "missingTrackOrClass": "Choose track & class from the catalogue above.",
      "locked": "Reference is locked — unlock in admin flow if needed.",
      "loadError": "Could not load catalogue reference (offline or server error)."
    },
    "mismatch": {
      "trackAndClass": "Different track and class — delta hidden",
      "track": "Different tracks — delta hidden",
      "carClass": "Different car class — delta hidden"
    },
    "topOpportunities": {
      "title": "Top opportunities",
      "none": "No corner lost more than 0.1s to the reference.",
      "zoomTitle": "Zoom the map to this corner"
    }
  },
  "home": {
    "language": {
      "label": "Language"
    },
    "languages": {
      "en": "English",
      "fr": "Français",
      "it": "Italiano",
      "es": "Español",
      "de": "Deutsch"
    },
    "staging": {
      "title": "Staging & catalogue notice",
      "body1Before": "We do not process lap telemetry, summaries, and related metadata on our servers for the beta programme unless you explicitly ",
      "body1Strong": "submit for catalogue entry",
      "body1After": " (for example \"Send for catalogue review\" in the lap-complete flow, then an admin imports it). Review packages stay on your device until then.",
      "body2Before": "Manual \"save my lap\" from the lap-complete dialog is stored on ",
      "body2Strong": "this device only",
      "body2After": " for replay and is not uploaded automatically.",
      "accept": "I understand"
    },
    "brand": {
      "line": "GT Gati",
      "pill": "Beta"
    },
    "download": {
      "title": "Windows desktop app",
      "text": "Install GT Gati on your PC. The app runs a local server for PS5 telemetry, coaching, and optional phone HUD on the same Wi‑Fi.",
      "button": "Download",
      "hint": "Requires Windows 10/11.",
      "missingFile": "Installer not uploaded yet — build with npm run electron:build:win and copy the .exe to public/releases/GTGati-Setup.exe"
    },
    "localTest": {
      "title": "Test on this machine",
      "text": "With npm start or Electron running, open these routes on port 4200 (full API + telemetry).",
      "lapcraft": "GT Gati (coaching)",
      "hud": "Phone HUD",
      "admin": "Admin",
      "note": "Start the server: npm start or npm run electron:dev"
    },
    "hero": {
      "openLapcraft": "Open GT Gati",
      "openHud": "Open HUD",
      "watchYoutube": "Watch our tutorials on YouTube",
      "titleBefore": "Race smarter with ",
      "titleEm": "live telemetry",
      "titleAfter": " coaching.",
      "subtitle": "Analyze every lap, compare against references, and review race context with live telemetry insights. Built for practical coaching sessions and weekend race prep."
    },
    "gt7": {
      "badge": "Works with GT7 on PS4 & PS5",
      "summary": "Open GT Gati in your browser, enter your PlayStation’s IP (shown under the console’s network settings), and tap Connect. When telemetry is live, pick a track and car class—or start your lap and save or compare against your personal best.",
      "stepsTitle": "Get started",
      "step1": "Open GT Gati, enter your PS5’s IP in the connection settings (⚙ in the GT Gati header), then tap Connect.",
      "step2": "Select a track and car class, or start driving.",
      "step3": "Save laps or compare against your personal best when you’re ready.",
      "guideCta": "Step-by-step guide"
    },
    "video": {
      "placeholder": "Add assets/home/intro.mp4",
      "shotAlt": "GT Gati feature screenshot"
    },
    "spotlight": {
      "placeholder": "Spotlight image",
      "placeholderAlt": "Placeholder for a product or workflow screenshot"
    },
    "heroStats": [
      {
        "value": "60Hz",
        "label": "Telemetry"
      },
      {
        "value": "Δ",
        "label": "Frame-perfect deltas"
      },
      {
        "value": "∞",
        "label": "Local-first replays"
      }
    ],
    "features": [
      {
        "title": "Live Driving Coach",
        "text": "Real-time telemetry with corner-by-corner deltas, input cues, and map insights.",
        "tag": "Real-time · Desktop",
        "guideLabel": "My Lap Workflow",
        "imageAlt": "Live map with pace delta heatmap and coaching overlays"
      },
      {
        "title": "Replay & Comparison",
        "text": "Reference vs my-lap analysis with speed, line, and gear differences in one workflow.",
        "tag": "Analysis · Desktop",
        "guideLabel": "Replay Workflow",
        "imageAlt": "Reference and my-lap replay comparison on the track map"
      },
      {
        "title": "HUD Mode (Mobile)",
        "text": "Mobile-friendly HUD for trackside use with install support and focused telemetry UX.",
        "tag": "Mobile · Trackside",
        "guideLabel": "HUD Workflow",
        "imageAlt": "Phone HUD showing live speed, gear, and lap delta",
        "galleryAlts": [
          "Phone HUD dashboard",
          "HUD layout before",
          "HUD layout"
        ]
      }
    ],
    "cta": {
      "title": "Ready for the beta flow?",
      "text": "Start in GT Gati, then switch to HUD for on-device driving sessions.",
      "toLapcraft": "Go to GT Gati",
      "toHud": "Go to HUD"
    }
  },
  "siteHeader": {
    "logoTitle": "GT Gati — home",
    "langLabel": "Language",
    "navAria": "Site",
    "linkHome": "Home",
    "linkLapcraft": "GT Gati",
    "linkMyLapGuide": "My Lap",
    "linkReplayGuide": "Replay",
    "linkHudGuide": "HUD guide",
    "linkHud": "HUD",
    "linkLegal": "Legal",
    "linkDownload": "Download"
  },
  "guides": {
    "back": "← Back to Home",
    "tipMark": "TIP",
    "storyKicker": "Read top to bottom — each panel is one beat in the story.",
    "openLapcraft": "Open GT Gati",
    "openHud": "Open HUD",
    "myLap": {
      "title": "My Lap Workflow",
      "intro": "Picture a GT7 session at your desk: GT Gati compares every moment to the fastest approved reference and talks you through the lap. This guide reads top to bottom — each panel is the next step: layout, connect, drive, save.",
      "sections": [
        {
          "title": "The desktop layout",
          "body": "GT Gati uses a three-zone layout. The left column holds live readouts and session controls. The centre map fills with your live lap line and comparison overlays. The inputs trace at the bottom shows throttle, brake, speed, and gear over time. All three zones can be resized or hidden using the ⊡ panel toggle in the top-right header.",
          "image": "assets/home/lap-coach-layout.png",
          "imageCaption": "Full GT Gati desktop layout — left panel with controls, centre track map, inputs trace at bottom",
          "tip": "Use the ⊡ button in the header to show or hide the left panel, telemetry bar, and inputs trace independently. The layout is saved between sessions."
        },
        {
          "title": "Connect (PS4 & PS5)",
          "body": "Until you connect, the main coaching view stays idle. Open the ⚙ menu in the header, enter your console’s IP address, and tap the Connect button right inside the panel — or press Enter in the IP field. The header shows a green dot when telemetry is flowing and the left panel comes alive.",
          "bullets": [
            "Use the IP shown on your PlayStation under Settings → Network → Connection Status (or your console’s network screen).",
            "Connect button sits inside the ⚙ panel next to the IP field — no need to close the panel first.",
            "After connecting, use the session inputs to pick track and class — or start your lap first.",
            "Keep the console on the same network as the device running your browser when you use GT Gati."
          ],
          "image": "assets/home/ps5-ip.png",
          "imageCaption": "⚙ settings flyout — IP field with Connect button inside the panel; green dot and IP label appear in the header once connected"
        },
        {
          "title": "Pick a track and car class",
          "body": "Once connected, the session inputs appear at the top of the left panel. Select your track (organised by region) and then your car class. GT Gati automatically loads the fastest approved reference for that combination — no manual file loading needed. You can also compare against your local personal best (PB) for the same track and class when that option is available.",
          "bullets": [
            "Track dropdown is grouped by region — Japan, Europe, Americas, Australia, Original.",
            "Car class filters to Gr.1, Gr.2, Gr.3, and Gr.4 only for the current beta.",
            "The approved reference banner in the map header confirms the reference is active.",
            "If no approved reference exists for that track and class combination, the banner says so.",
            "Compare selector — choose catalogue reference or your saved PB; the map and deltas use whichever baseline you pick."
          ],
          "image": "assets/home/track-car-category-select.png",
          "imageCaption": "Session inputs — track grouped by region, car class dropdown, reference loaded automatically"
        },
        {
          "title": "Live map — three colour modes",
          "body": "The map shows your lap line in real time. The Layers row at the top of the map controls lets you switch presets instantly. The Speed/Inputs/Both buttons in the same row control line colouring.",
          "bullets": [
            "Speed — line colour encodes pace delta vs the reference: green where faster, amber and red where slower. Perpendicular tick marks on the line show where you braked and applied throttle.",
            "Inputs — colour shows throttle (green), braking (red), and coasting (grey) per segment. Identical to the reference line style so you can spot timing differences.",
            "Both — pace colour on your lap line, with line width encoding how much your throttle differs from the reference — two signals at once.",
            "Scroll the mouse wheel to zoom into any corner. Drag to pan at any zoom level."
          ],
          "screenshots": [
            {
              "src": "assets/home/heat-map.png",
              "caption": "Speed mode — pace delta heat-mapped onto your line; tick marks show brake and throttle points"
            },
            {
              "src": "assets/home/brake-map.png",
              "caption": "Inputs mode — brake zones (red), throttle (green), and coast (grey) colour-coded per segment"
            }
          ],
          "tip": "Corner labels appear progressively as you pass each corner — they are not shown ahead of you, only behind, so you are never distracted by upcoming callouts."
        },
        {
          "title": "Delta panel — reading your live gap",
          "body": "The delta panel is at the top of the left column. The large number shows your running gap to the reference in seconds — green if ahead, red if behind. Below it, Current, Best, and Last lap times update automatically.",
          "bullets": [
            "Sync mode badge shows how your position is matched to the reference — 'position' is the most accurate when GPS data is present.",
            "The sparkline bar below the lap times traces your delta across the current lap, with a marker at each sector boundary.",
            "The sparkline resets at the start of each new lap."
          ],
          "image": "assets/home/live-map.png",
          "imageCaption": "Live map during a recording session — lap line builds in real time as you drive each corner"
        },
        {
          "title": "Voice coach — four modes",
          "body": "The coach panel below the delta panel gives real-time audio cues. Toggle voice on or off and choose from four modes. The panel also shows the last few coach messages as a scrollable log.",
          "bullets": [
            "Gear — calls out the reference gear at each corner entry. Best for learning a new circuit. Requires a car to be selected so the reference gearing matches your gearbox: after picking your track and class, choose the car you are driving (or accept the catalogue car when prompted). Until a car is set, Gear mode is disabled and the panel shows a hint.",
            "Turn mode — after each sector boundary (turn anchor), announces your split versus the reference and updates the map banner versus your session best for that segment (best-per-sector buffer, not one stitched full lap).",
            "Inputs — brake and throttle guidance with audio cues, plus a visual intensity bar below the buttons.",
            "Coach+ — advanced corner-by-corner coaching: post-corner diagnosis, pre-corner reminders, and improvement praise."
          ],
          "image": "assets/home/voice-coach.png",
          "imageCaption": "Coach panel — voice on/off toggle, four mode buttons (Gear / Turn mode / Inputs / Coach+), and recent cue log",
          "tip": "Inputs mode's visual bar works without audio — useful if you are not wearing headphones or are in a loud pit lane environment."
        },
        {
          "title": "Turn mode voice and the map (My Lap)",
          "body": "With the coach set to Turn mode while you are in My Lap, a banner appears above the map. GT Gati keeps a per-segment buffer of your best times between sector boundaries for the current track, car class, and layout. Each crossing compares your segment to that buffer while voice still describes performance versus the loaded reference.",
          "bullets": [
            "The buffer is kept for this tab/session and resets when you change track, class, or the number of sector lines drawn on the map.",
            "The banner highlights your last sector versus your session best; it is a coaching aid, not a replacement for a full reference lap.",
            "Turn off Turn mode to hide the banner; Gear, Inputs, and Coach+ behave as before."
          ],
          "tip": "Pair Turn mode audio with Speed line colouring on the map to hear splits while you see where you are faster or slower on track."
        },
        {
          "title": "Saving your lap",
          "body": "When you cross the finish line, a lap-complete dialog appears with your lap time and frame count. Tap SAVE to keep the lap or SKIP to discard. A metadata form appears for both save types — fill it in to help match laps to references later.",
          "bullets": [
            "Laps are only saved when you have accepted browser storage on the consent banner shown on first launch. If you chose “Continue without accepting”, your laps are not retained between sessions — change your choice from the Privacy page to enable saving.",
            "Track and car class fields are pre-filled from your current session inputs.",
            "My Lap — stored locally on this device for replay. If your lap qualifies for the public catalogue, use Send for catalogue review from the lap-complete flow; packaging stays on your device until an admin imports it.",
            "Reference Lap — requires track, class, and car name. Staged for admin review before appearing in the public catalogue.",
            "A 'partial capture' warning means you started recording mid-lap — the data is valid but begins after the start line.",
            "If preparing a review package fails (storage, private mode, or blocked download), your lap is still saved on this device."
          ],
          "tip": "Fields are pre-filled from your session inputs — confirm or adjust the car name before saving. The metadata is stored with the lap file and used for matching in Replay."
        },
        {
          "title": "Inputs trace",
          "body": "The inputs trace at the bottom of the screen shows the last 12 seconds of your throttle, brake, and speed data as a rolling window. A dashed reference overlay shows what the reference driver was doing at the same lap position.",
          "bullets": [
            "Speed — solid blue line, thicker for clarity.",
            "Throttle — green filled area. Reference throttle is a dashed green line.",
            "Brake — red filled area. Reference brake is a dashed red line.",
            "Gear strip — neutral dark background with gear number labels at each gear change point.",
            "Replay cursor — vertical dashed line shows the exact point being scrubbed in Replay mode.",
            "The ? icon in the trace header opens a legend tooltip explaining all the lines."
          ],
          "image": "assets/home/pedal-ref.png",
          "imageCaption": "Inputs trace — throttle (green), brake (red), speed (blue) with dashed reference overlay and gear strip"
        }
      ]
    },
    "replays": {
      "title": "Replay Workflow",
      "intro": "When the car is back on stands, Replay is the quiet chapter: open the lap you saved, lay it over the reference, zoom corners, scrub the trace, export a report. No console needed — just your files and the map. Scroll the panels in order.",
      "sections": [
        {
          "title": "What Replay mode is for",
          "body": "Replay does not record new data. It places a lap you already saved next to the reference so you can study the full comparison in detail. You do not need a PS5 connection — everything runs from the saved .json files on your device.",
          "image": "assets/home/replay-compare.png",
          "imageCaption": "Replay mode — reference lap and your saved lap loaded side by side, map and trace fully active",
          "tip": "Always save your lap in My Lap mode first. Switch to Replay after your session to run the full analysis."
        },
        {
          "title": "Switching to Replay mode",
          "body": "The mode selector at the top of the left panel has two buttons: My Lap and Replay. Tapping Replay is instant — your track and class settings are preserved and the map header gains the full replay controls. The capture panel shows a replay indicator and the map unlocks the My File / My saved controls.",
          "image": "assets/home/compare-mode.png",
          "imageCaption": "Mode selector — My Lap (live recording) and Replay (post-session analysis) buttons in the left panel"
        },
        {
          "title": "Loading your lap",
          "body": "Once in Replay mode, load your saved lap from the second file row in the map header. The reference lap is already loaded from the session inputs — you only need to select your lap.",
          "bullets": [
            "My saved… — lists all previously saved My Laps on this device. Labels show file name and track.",
            "My File — import a .json lap file from another device or exported session.",
            "The map overlay and delta badge update immediately when a lap is selected.",
            "If you beat the reference, the delta badge shows a green improvement value."
          ],
          "image": "assets/home/open-my-file.png",
          "imageCaption": "Map header in Replay mode — My saved dropdown lists all laps saved on this device"
        },
        {
          "title": "Layers and the map controls",
          "body": "The Layers row sits at the top of the map controls — it is always the first thing you see. Three presets configure the map for common use cases. The file loading, zoom, and Speed/Inputs/Both mode buttons are in the row below.",
          "bullets": [
            "Speed preset — pace delta heatmap with corner time labels and sector markers. Best for finding which corners cost the most time.",
            "Inputs preset — brake zones, gear change markers, and throttle overlay. Best for input timing comparison.",
            "Analysis preset — all layers enabled. Full corner callouts with speed deltas and loss insights.",
            "Key Corners / All Corners toggle — Key Corners shows only the top time-loss corners. All Corners shows every detected apex.",
            "⚙ More (Replay only) — individual layer checkboxes for fine-tuning what is visible on the map."
          ],
          "screenshots": [
            {
              "src": "assets/home/heat-map.png",
              "caption": "Speed preset — pace delta heatmap with corner time labels and perpendicular brake/throttle marks"
            },
            {
              "src": "assets/home/analysis.png",
              "caption": "Analysis preset — all corner callouts active with speed delta values and time-loss insight tags"
            }
          ],
          "tip": "Start with Speed preset to find your worst corners, then switch to Inputs preset in Split view to compare braking point and throttle pick-up at each problem area."
        },
        {
          "title": "Split view — side-by-side comparison",
          "body": "The Split button in the map header divides the canvas: reference on the left (always shown in Inputs colour mode so brake and throttle zones are immediately visible), your lap on the right coloured by your chosen mode. Scroll to zoom and drag to pan — both halves move together.",
          "screenshots": [
            {
              "src": "assets/home/replay-single.png",
              "caption": "Single view — reference and your lap overlaid on one canvas, speed-delta colouring"
            },
            {
              "src": "assets/home/replay-split.png",
              "caption": "Split view — reference with inputs colouring (left) vs your lap with speed delta (right)"
            }
          ],
          "tip": "Zoom into a corner first with the scroll wheel, then enable Split — this keeps both halves centred on the same section for a direct comparison."
        },
        {
          "title": "Replay playback and scrubbing",
          "body": "Use the REF, MY, and BOTH buttons in the floating replay toolbar at the bottom-left of the map to play back one or both laps. An animated arrow tracks each car's position in real time. Pause at any point and hover over the canvas to scrub position — the inputs trace cursor moves in sync. The map layout reserves extra space at the bottom in Replay so turn labels and the lap line stay above this toolbar.",
          "bullets": [
            "▶ Ref — plays the reference lap.",
            "▶ My — plays your lap.",
            "▶ Both — plays both laps simultaneously, showing relative positions.",
            "⏸ Pause — stops playback. Hover over the canvas to scrub to any position.",
            "The inputs trace shows a vertical cursor line at the current replay position.",
            "If labels still feel crowded, zoom out once (Fit) or pan slightly — the reserved band scales with the canvas."
          ],
          "image": "assets/home/replay-toolbar.png",
          "imageCaption": "Floating replay toolbar — REF, MY, BOTH playback buttons and Pause; animated arrows track each car on the map"
        },
        {
          "title": "Exporting a coaching report",
          "body": "When both laps are loaded, a 📋 Export button appears in the map header. Clicking it generates a structured Markdown report and opens a preview modal with Copy and Download options.",
          "bullets": [
            "Report includes: session info, lap times, sector breakdown, full corner table with reference absolute speeds, and key findings.",
            "Each corner row includes reference speed at entry, apex, and exit — so an LLM knows whether it is a slow hairpin or a fast sweeper.",
            "The last section is a pre-written coaching prompt — paste the whole file into Claude or ChatGPT for a structured debrief.",
            "Download saves a .md file to your device for sharing with a coach or keeping in a session log."
          ],
          "image": "assets/home/guide-export-md.png",
          "imageCaption": "Report export modal — structured Markdown preview with Copy to clipboard and Download .md buttons",
          "tip": "Zoom into your worst corner before exporting — the report captures the full data regardless of zoom, but you can then attach a screenshot of that specific corner to your notes."
        }
      ]
    },
    "hud": {
      "title": "HUD Workflow",
      "intro": "The HUD is a glanceable companion view for your phone — large speed, gears, pace delta, and the voice coach. Nothing to install. Your desktop hands the session to your phone over the QR code; the phone mirrors live data the moment it scans.",
      "sections": [
        {
          "title": "What HUD mode is",
          "body": "HUD is a web view your phone opens directly — no app store, no installer. It mirrors the session running on GT Gati desktop, presenting just the readouts you can scan while driving. Track and class come straight from desktop, so there is nothing to pick on the phone itself.",
          "image": "assets/home/hud-mobile.png",
          "imageCaption": "HUD on mobile — speed, current gear vs reference gear, pace delta, and voice coach messages in large format",
          "tip": "Keep the phone on the same Wi-Fi as the PC running GT Gati desktop and your PlayStation — everything routes through your local network."
        },
        {
          "title": "Pairing your phone — scan the QR code",
          "body": "Open GT Gati on your desktop and click the ⚙ icon in the header. A QR code appears inside the connection panel along with the HUD link. Point your phone camera at the code — your phone’s default camera app will offer to open the link in the browser. Tap it and the HUD loads on your phone instantly.",
          "bullets": [
            "The QR code encodes a LAN URL such as http://192.168.x.x:4200/hud — it only resolves from the same Wi-Fi network as your PC.",
            "If the camera app does not recognise the code, type the URL printed under the QR into your phone browser.",
            "Once you scan, the phone immediately starts receiving the same live telemetry the desktop is rendering — no extra setup on the phone.",
            "If you change track or class on desktop, the HUD updates straight away; the phone never needs its own track picker."
          ],
          "image": "assets/home/sync-phone.png",
          "imageCaption": "Connection panel with QR code — scan from your phone camera to open the HUD on the same Wi‑Fi network"
        },
        {
          "title": "Key readouts",
          "body": "The HUD is designed for a quick glance while driving. From top to bottom: status bar, timing strip, large gear display, input guide, and coach message log.",
          "bullets": [
            "Speed and lap time — compact timing strip below the status bar shows speed in km/h and current lap time.",
            "Gear — your current gear large and centre. The reference gear appears next to it with an arrow.",
            "Gear mismatch — the entire HUD flashes red when your gear differs from the reference at the same track position.",
            "Input guide — a coloured bar pulses when the coach detects you should brake or apply throttle.",
            "Coach messages — the last three cues appear below the gear display, colour-coded by category."
          ],
          "image": "assets/home/hud-mobile.png",
          "imageCaption": "HUD readouts — timing strip, large gear vs reference gear, colour-coded coach messages"
        },
        {
          "title": "Voice coach — four modes",
          "body": "The voice coach at the bottom of the HUD gives real-time audio cues. Toggle voice on or off with the 🔊 button, pause with ⏸, and tap one of the four mode buttons to change what the coach announces.",
          "bullets": [
            "Gear — calls out the reference gear at each corner entry. Good for learning a new circuit.",
            "Turn mode — announces splits aloud after each sector boundary.",
            "Inputs — brake and throttle guidance with audio cues, plus a visual intensity bar that pulses the background.",
            "Coach+ — advanced coaching: post-corner diagnosis, pre-corner reminders, and improvement praise when you nail a corner."
          ],
          "image": "assets/home/voice-coach.png",
          "imageCaption": "Coach controls — voice toggle, pause, and four mode buttons (Gear / Turn mode / Inputs / Coach+)",
          "tip": "The visual input guide bar works without audio — useful in a loud environment or when you are not wearing headphones."
        },
        {
          "title": "Optional — add to home screen for full-screen",
          "body": "If you would like to hide the browser bar during a session, every modern mobile browser can save the HUD as a home-screen shortcut. This is purely cosmetic — there is no app to install, no permissions to grant, and the URL keeps working from the regular browser tab.",
          "bullets": [
            "iOS (Safari): tap the Share button → Add to Home Screen.",
            "Android (Chrome): tap the ⋮ menu → Add to Home Screen.",
            "The shortcut launches the same URL the QR opened — if your LAN IP changes, just re-scan the QR.",
            "Some browsers will keep the screen awake automatically when launched from the home-screen tile."
          ],
          "tip": "Skip this step for your first session — the regular browser tab is the simplest path and works identically."
        }
      ]
    },
    "stream": {
      "title": "Streaming & coaching audio",
      "intro": "Two ways to hear the coach: Mode 1 sends it to your PS5 headset through Discord (no capture card needed). Mode 2 puts a live overlay and the coach voice into OBS for streaming. Pick the one that matches your setup.",
      "sections": [
        {
          "title": "Which mode is yours?",
          "body": "If your PS5 plugs straight into a TV, use Mode 1 and listen on your headset. If it runs through a capture card into a PC, use Mode 2 and let OBS carry the picture and the sound.",
          "bullets": [
            "Mode 1 — no capture card: coach → Discord → your PS5 headset.",
            "Mode 2 — capture card + OBS: live delta-map overlay + coach voice on your stream."
          ],
          "tip": "You can set up both — they don't conflict."
        },
        {
          "title": "Mode 1 · How it works",
          "body": "GT Gati runs a small Discord bot on your PC. When the coach speaks, the bot plays the clip into a Discord voice channel. Join that channel on your PS5 and the coaching plays in your headset alongside the game.",
          "bullets": [
            "Your own bot and server — the token never leaves your machine.",
            "Only recorded clips play on Discord; long spoken lines can't be relayed.",
            "Turning it on mutes the laptop so you never hear coaching twice."
          ],
          "tip": "First-time bot setup takes about five minutes — then it just works."
        },
        {
          "title": "Mode 1 · Create your bot",
          "body": "Make a bot in the Discord Developer Portal and copy its token. The token is the bot's password — keep it private.",
          "bullets": [
            "discord.com/developers/applications → New Application → name it.",
            "Bot tab → Reset Token → copy the token.",
            "OAuth2 → URL Generator → tick 'bot', then 'Connect' and 'Speak'.",
            "Open the generated URL, pick your server, Authorize."
          ]
        },
        {
          "title": "Mode 1 · Copy your server and channel IDs",
          "body": "GT Gati needs the server ID and the voice-channel ID. Discord shows them once Developer Mode is on.",
          "bullets": [
            "Discord → User Settings → Advanced → enable Developer Mode.",
            "Right-click your server icon → Copy Server ID.",
            "Right-click the voice channel → Copy Channel ID."
          ],
          "tip": "Use a dedicated voice channel so coaching isn't mixed with party chat."
        },
        {
          "title": "Mode 1 · Configure GT Gati",
          "body": "Open the ⚙ connection settings, expand 'Discord coaching', paste the token and both IDs, then Save & connect. The status line should read Connected.",
          "bullets": [
            "Your token is saved locally on this machine only — never uploaded."
          ]
        },
        {
          "title": "Mode 1 · Join on your PS5 and turn it on",
          "body": "Link Discord on your PlayStation and join the same voice channel, then enable the toggle in GT Gati.",
          "bullets": [
            "On PS5: link Discord and join your voice channel.",
            "In GT Gati connection settings, enable 'Play coaching in Discord'.",
            "Drive — the coach plays in your headset with the game."
          ],
          "tip": "Hear nothing? You have to be in the voice channel yourself — the bot plays into it."
        },
        {
          "title": "Mode 2 · Stream with a capture card",
          "body": "OBS already shows your PS5 gameplay. GT Gati adds two things on top: a live delta-map overlay (browser source) and the coach voice (Desktop Audio). Set it up once and forget it.",
          "bullets": [
            "PS5 → capture card → PC. Add the card in OBS as a Video Capture Device.",
            "Keep GT Gati open on the same PC — it doesn't need to be visible on stream."
          ]
        },
        {
          "title": "Mode 2 · Add the live overlay to OBS",
          "body": "The overlay draws the reference line, your live line, the rolling delta and sector splits. It follows whatever you pick in GT Gati automatically — you never touch it in OBS.",
          "bullets": [
            "OBS → Sources → + → Browser.",
            "URL: http://localhost:4200/overlay/delta-map (if GT Gati opens on a different address for you, use that address + /overlay/delta-map).",
            "Width 480, Height 480. Position it anywhere on the layout.",
            "Pick a track, class and reference in GT Gati — the overlay follows on its own."
          ],
          "tip": "Blank overlay? Select a reference lap in GT Gati first."
        },
        {
          "title": "Mode 2 · Capture the coach voice",
          "body": "The overlay page is silent — the voice plays from the main GT Gati window. Capture it in OBS as Desktop Audio.",
          "bullets": [
            "OBS → Settings → Audio → set Desktop Audio to your default playback device.",
            "Leave GT Gati's coach output on 'System default'.",
            "Turn on 'Robotic voice' so cues without a recorded clip still speak on stream.",
            "Do a short test recording and confirm you hear the coach before going live."
          ],
          "tip": "Routing coach audio to a virtual cable? The robotic voice won't follow — it always plays on the system default device."
        },
        {
          "title": "Save your laps",
          "body": "Hit Save after a clean lap and GT Gati downloads it as a .json file. Load it any time in Replay mode ('Open my file') to study it against a reference.",
          "bullets": [
            "No account needed — the file is yours, on your machine.",
            "Want to race your own lap live? Arm 'Record new track' (Pro): your next full lap becomes the reference."
          ],
          "tip": "Seeing 'Could not save lap locally'? Allow site data for this page and avoid private windows."
        },
        {
          "title": "About the voice clips",
          "body": "Some cues play as recorded coach clips; the rest use the robotic voice until their clip exists. Discord plays only the recorded clips; an OBS stream captures both.",
          "bullets": [
            "Braking, throttle, gear and sector calls are clip-backed.",
            "Keep 'Robotic voice' on for streams so no cue goes silent."
          ],
          "tip": "If a mode seems quiet, it's usually waiting on clips — not a connection problem."
        }
      ]
    }
  },
  "shell": {
    "skipToMain": "Skip to main content",
    "betaBadge": "Beta",
    "mobileGateTitle": "GT Gati is desktop-only",
    "mobileGateBody": "Use the HUD on your phone for trackside coaching. GT Gati’s full map and replay tools need a desktop browser or the Windows app.",
    "mobileGateOpenHud": "Open HUD",
    "mobileGateBackHome": "Back to home",
    "getStartedTitle": "Connect your PS5 to start",
    "getStartedBody": "GT Gati needs a live telemetry feed from Gran Turismo 7. Open connection settings, enter your PS5 IP, and hit Connect.",
    "getStartedTitleWeb": "Download the GT Gati desktop app to connect",
    "getStartedBodyWeb": "Live telemetry from your PS5 needs a local connection that browsers can’t open. Install GT Gati on your Windows PC — the desktop app talks to your console and drives this same UI. You can still use Replay mode here without the download.",
    "getStartedConnect": "Open connection settings",
    "getStartedDownload": "Download for Windows",
    "getStartedGuide": "Step-by-step guide",
    "getStartedDismiss": "Dismiss",
    "windowChrome": {
      "navAria": "App navigation",
      "back": "← Home",
      "fullscreen": "Full screen",
      "exitFullscreen": "Exit full screen",
      "drag": "Move",
      "dragTitle": "Drag to move the window (desktop app)",
      "close": "Close app"
    },
    "resizeLeftTitle": "Drag to resize driver panels. Double-click to hide or show.",
    "resizeTelemetryTitle": "Drag to resize telemetry. Double-click to hide or show.",
    "resizeTraceTitle": "Drag to resize trace. Double-click to hide or show.",
    "cookieConsentAria": "Cookie and data consent",
    "cookieConsentTitle": "Cookies and storage",
    "cookieConsentBody": "GT Gati uses browser storage (localStorage and sessionStorage) for settings, saved laps, replay buffers, and session UI. We do not process lap telemetry, summaries, and related metadata on our servers for the beta programme unless you explicitly submit for catalogue entry. If you allow analytics, Google Analytics cookies may be loaded to understand product usage.",
    "cookieConsentChoose": "Choose whether to allow optional Google Analytics cookies. You can use GT Gati either way.",
    "cookieConsentAnalytics": "Accept",
    "cookieConsentEssential": "Continue without accepting",
    "privacyPolicyLink": "Full Privacy policy"
  },
  "footer": {
    "navAria": "Legal and community",
    "brand": "GT Gati",
    "rightsNote": "All rights reserved.",
    "disclaimer": "{{brand}} is not affiliated with or endorsed by Sony Interactive Entertainment or Polyphony Digital.",
    "linkLegal": "Legal",
    "linkPrivacy": "Privacy",
    "linkDiscord": "Discord"
  },
  "legalHub": {
    "back": "← Back to Home",
    "title": "Legal",
    "lead": "GT Gati is an independent companion app. This page links to our full Privacy policy.",
    "linkPrivacy": "Open full Privacy policy",
    "linkHome": "Home"
  },
  "privacyPage": {
    "back": "← Back to Home",
    "title": "Privacy policy",
    "lastUpdatedLabel": "Last updated",
    "notLegalAdvice": "This page describes how GT Gati handles information in plain language. It is not personal legal advice; consult a qualified professional for your situation.",
    "lastUpdated": "2026-05-24",
    "sections": [
      {
        "id": "summary",
        "title": "Summary",
        "paragraphs": [
          "GT Gati is a companion web app for Gran Turismo 7. This Privacy policy explains what information the app can touch, where it stays, and what choices you have.",
          "For the beta programme we do not process lap telemetry, lap summaries, or related metadata on GT Gati-operated servers unless you explicitly submit a lap for catalogue entry (for example via \"Send for catalogue review\" and an administrator import path). Optional Google Analytics runs only if you accept analytics cookies in the in-app banner."
        ]
      },
      {
        "id": "data-we-process",
        "title": "Information we process",
        "paragraphs": [
          "Browser storage (localStorage and sessionStorage): UI layout, language choice, privacy choice, saved laps and replay buffers on your device, and similar session preferences.",
          "Live telemetry from GT7: when you connect the game through GT Gati in your browser, telemetry is used for coaching and display in your session. In the default beta posture described in the consent banner, that telemetry is not uploaded to GT Gati-operated servers for processing unless you explicitly submit for catalogue entry.",
          "Saving a lap: when you save a lap, we check on your device that the lap matches a supported track. Your lap data stays on your computer.",
          "Submitting a lap for the catalogue: if you choose to submit a lap for catalogue review, we package the lap on your device. You can download a copy. The lap stays on your computer until we import it.",
          "Optional analytics: if you choose \"Accept analytics cookies\", Google Analytics may set cookies and send usage events according to Google's policies."
        ]
      },
      {
        "id": "beta-licensing",
        "title": "Beta licensing (invite-only builds)",
        "paragraphs": [
          "If you are running an invite-only build of GT Gati (Phase 1b), the app contacts our Cloudflare Worker on startup and on a periodic heartbeat (roughly every 20 minutes) to verify your access. We process the following information for this purpose:",
          "License key you entered, a randomly generated installation identifier stored on your device (so the same key on the same machine counts as one seat), the app version, the timestamps of activation and last heartbeat, the email address associated with the key (if your invite included one), and the source IP address of the heartbeat request (logged transiently by Cloudflare).",
          "We use this information to validate your invite, count seats per key, enforce expiry, and to operate a remote kill-switch or pause for the beta programme as a whole. We retain license records until you ask us to delete them or until the beta ends. Session tokens expire automatically after three days of inactivity.",
          "You can request deletion of your license record and associated activation history by contacting us via the support channel referenced in the Contact section. Removing your license key terminates active sessions; the local app and your saved laps remain on your device.",
          "Open builds without invite-only entitlement do not perform activation or heartbeats and do not transmit any of the data described in this section."
        ]
      },
      {
        "id": "cookies",
        "title": "Cookies and similar technologies",
        "paragraphs": [
          "GT Gati shows a first-party banner so you can choose essential-only mode or accept optional Google Analytics cookies.",
          "You can change your mind later by clearing site data for this origin and revisiting the app; the banner will appear again if no choice is stored."
        ]
      },
      {
        "id": "sharing",
        "title": "Sharing and subprocessors",
        "paragraphs": [
          "If you enable Google Analytics, Google operates analytics processing according to your account relationship with Google and their policies.",
          "For invite-only beta builds, license verification calls are served by Cloudflare Workers and KV storage on infrastructure operated by Cloudflare, Inc. Cloudflare acts as a data processor for the license records, session tokens, and request logs described in the \"Beta licensing\" section.",
          "GT Gati does not sell your personal information. Catalogue submissions you explicitly initiate may be visible to administrators you choose to share files with."
        ]
      },
      {
        "id": "retention",
        "title": "Retention",
        "paragraphs": [
          "Saved laps and replay data remain on your device until you delete them from the app or clear browser storage.",
          "Privacy and language choices persist in localStorage until cleared.",
          "Beta licensing records (invite-only builds): license metadata is retained until you request deletion or the beta concludes. Session tokens auto-expire after three days of inactivity. Cloudflare request logs follow Cloudflare's standard retention policy."
        ]
      },
      {
        "id": "changes",
        "title": "Changes to this policy",
        "paragraphs": [
          "We may update this policy when features or hosting practices change. The \"Last updated\" date at the top will change when material edits are published."
        ]
      },
      {
        "id": "contact",
        "title": "Contact",
        "paragraphs": [
          "For privacy questions about GT Gati, use the community or support contact options linked from the site when they are available."
        ]
      }
    ]
  },
  "header": {
    "logoTitle": "Go to home page",
    "togglePanels": "Show / hide panels",
    "connectionSettings": "Connection settings",
    "ps5SettingsTitle": "PS5 connection settings",
    "ps5IpLabel": "PS5 IP",
    "disconnect": "Disconnect",
    "connecting": "Connecting…",
    "saving": "Saving…",
    "connect": "Connect",
    "panelsTitle": "Panels",
    "leftPanel": "Left panel",
    "telemetryBar": "Telemetry bar",
    "inputsTrace": "Inputs trace",
    "hidden": "Hidden",
    "visible": "Visible",
    "ipRequired": "IP required",
    "invalidIp": "Invalid IP",
    "phoneHudLabel": "Phone HUD",
    "phoneHudStep1": "PC, PS5, and phone on the same Wi‑Fi",
    "phoneHudStep2": "Connect PS5 on this PC",
    "phoneHudStep3": "Scan QR with your phone camera",
    "phoneHudTroubleshoot": "Phone can’t open the link? On Windows: set your Wi‑Fi to Private (Settings → Wi‑Fi → your network → Private) and allow GT Gati through the firewall when prompted.",
    "copyHudUrl": "Copy link",
    "copiedHudUrl": "Copied",
    "speedUnit": "km/h",
    "rpmUnit": "rpm",
    "lapUnit": "lap",
    "pktUnit": "pkt/s",
    "voiceGroupAria": "Voice coaching",
    "voiceModesAria": "Coaching voice mode",
    "trainingModeLabel": "Training mode",
    "voiceModeHint": "Choose your training mode — hover an option to see what it coaches.",
    "fullscreen": "Full screen",
    "exitFullscreen": "Exit full screen",
    "close": "Close",
    "ps5Short": "PS5",
    "ipPlaceholder": "192.168.1.x",
    "connConnected": "PS5 live",
    "connOffline": "PS5 offline",
    "connError": "Connection error"
  },
  "sessionInputs": {
    "loading": "Loading reference catalogue…",
    "catalogError": "Could not load the reference catalogue (offline or server error). Reconnect to retry.",
    "emptyCatalog": "No approved references are available yet for public tracks and classes. Check back after admins publish laps.",
    "hint": "Pick a track, then a class. In Gear mode, select your car for appropriate gear coaching.",
    "refCatalogCar": "Catalogue reference was set with",
    "pbLapLine": "My PB lap time",
    "trackTitle": "Track layout",
    "trackPlaceholder": "— Track —",
    "classTitle": "Car category for this track",
    "classPlaceholder": "— Class —",
    "tyreTitle": "Reference tyre compound",
    "tyrePlaceholder": "— Tyre —",
    "compareTitle": "What to compare your lap against on the map",
    "compareCatalogue": "Reference (catalogue)",
    "comparePb": "My PB (local)",
    "comparePbWithTime": "My PB ({time})",
    "comparePbNone": "My PB (none saved)",
    "pbManage": "Manage My PB laps",
    "pbManageHide": "Hide My PB laps",
    "pbRunnerTag": "runner-up",
    "pbDeleteConfirm": "Delete this saved lap? {lap}\nThis only removes it from this device and cannot be undone.",
    "pbUnsavedTag": "(unsaved)",
    "pbSaveNow": "Save PB",
    "comparePbSaved": "My PB (saved laps)",
    "comparePbComingSoon": "My PB (coming soon)",
    "carTitle": "Car you are driving",
    "carPlaceholder": "— Car —",
    "carOther": "Other…",
    "carFreePlaceholder": "Exact GT7 Sport car name",
    "gearPickCarFirst": "Gear coaching: pick your car below (after track and class). It must match telemetry so reference gears line up."
  },
  "hud": {
    "desktopTitle": "HUD is mobile-only",
    "desktopBody": "Use this page on your phone at the track. Set your console IP, connect, then choose track and car class — the same catalogue as GT Gati loads your reference for deltas.",
    "desktopSub": "On a phone: open /hud on the same Wi‑Fi, then add to home screen. On this PC: use Full screen above, or run the HUD here.",
    "backHome": "← Home",
    "fullscreen": "Full screen",
    "exitFullscreen": "Exit full screen",
    "useOnThisDevice": "Use HUD on this screen",
    "installCopy": "Install for full-screen HUD (no browser bar).",
    "tapInstall": "Tap Install",
    "addToHomeHint": "Browser menu → Add to Home screen",
    "ps5": "PS5",
    "set": "Set",
    "savingShort": "…",
    "live": "LIVE",
    "connecting": "CONNECTING",
    "offline": "OFFLINE",
    "connect": "Connect",
    "lap": "LAP",
    "kmh": "KM/H",
    "cuesSuffix": "CUES",
    "you": "YOU",
    "ref": "REF",
    "refWarnDisconnected": "⚠ Connect above, then pick track & class.",
    "refWarnConnected": "⚠ Pick track & class above for reference deltas.",
    "voiceOnTitle": "Voice on",
    "voiceOffTitle": "Voice off",
    "waitingTitle": "Waiting for telemetry from laptop…",
    "waitingSub": "Connect to your PS5 on the laptop. This page updates automatically.",
    "ipPlaceholder": "192.168.1.x"
  },
  "common": {
    "on": "On",
    "off": "Off",
    "close": "Close",
    "dismiss": "Dismiss",
    "delete": "Delete",
    "disconnect": "Disconnect"
  },
  "coachPanel": {
    "title": "Coach Feedback",
    "status": {
      "speaking": "Speaking",
      "paused": "Paused",
      "ready": "Ready"
    },
    "actions": {
      "resume": "▶ Resume",
      "pause": "⏸ Pause"
    },
    "refBanner": "Load an approved reference lap for this track and car class to unlock delta coaching (Turn mode / inputs / Strategy).",
    "voiceSettings": "Voice Settings",
    "roboticVoice": "Robotic voice",
    "roboticVoiceHint": "Speak cues that have no recorded clip using the built-in robotic voice. Plays through your PC audio, so OBS can capture it as desktop audio. Off = recorded clips only.",
    "voicePickLabel": "Voice",
    "voiceDefault": "System default",
    "voicePreview": "Test voice",
    "voicePreviewText": "Brake at one hundred, downshift to third, apex left.",
    "verbosity": "Coach talk",
    "verbosityQuiet": "Quiet",
    "verbosityStandard": "Standard",
    "verbosityChatty": "Chatty",
    "verbosityQuietDesc": "Urgent calls only.",
    "verbosityChattyDesc": "More feedback per lap.",
    "transcript": "Voice transcript",
    "transcriptSave": "Save",
    "transcriptClear": "Clear",
    "transcriptHint": "Captures every voice cue — voiced and suppressed — plus mode switches and laps to a JSON file for tuning.",
    "gearNeedsCar": "Choose your car in the row under Track and Class — same list as when saving a lap — to enable Gear coaching.",
    "modesHeading": "What do you want to work on?",
    "modes": {
      "gear": "Gear",
      "sector": "Turn mode",
      "inputs": "Inputs",
      "strategy": "Strategy",
      "coachPlus": "Strategy",
      "inputsGoal": "Braking & throttle",
      "inputsDesc": "Live calls in the moment — brake points, trail braking, and getting back to power.",
      "gearGoal": "Shift points",
      "gearDesc": "Calls the right gear whenever you're off the reference.",
      "sectorGoal": "Lap pace",
      "sectorDesc": "After each corner, hear the time you gained or lost vs the reference.",
      "strategyGoal": "Race runs",
      "strategyDesc": "Fuel and tyre management plus per-corner fixes over a stint."
    },
    "categories": {
      "GEAR": "GEAR",
      "ALERT": "ALERT",
      "SECTOR": "TURN",
      "BRAKE": "BRAKE",
      "THROTTLE": "THROTTLE",
      "COACH": "COACH",
      "SYSTEM": "SYSTEM"
    }
  },
  "coach": {
    "runtime": {
      "initialMessage": "Use My Lap with an approved reference lap for this track and car class to unlock delta coaching.",
      "referenceLoaded": "Reference lap loaded.",
      "pbBaselineLoaded": "Local PB loaded for Strategy baseline.",
      "aiLoaded": "AI coaching loaded: {count} cues ready",
      "lastSessionFocus": "Last session: most time lost in Turn {turn} — that's today's focus.",
      "cueParked": "Parking {what} calls for now — check the lap debrief."
    },
    "cues": {
      "sequenceComingUp": "Sequence coming up. Key corner is {corner}.",
      "fuelStatus": "Fuel for about {n} more laps.",
      "fuelLow": "Fuel low — about {n} laps left.",
      "pitWindow": "You'll need fuel — box within {n} laps.",
      "pitBoxNow": "Box this lap for fuel.",
      "pitFuelTight": "Fuel is tight but should reach the flag — save where you can.",
      "pitTakeTyres": "Take fresh tyres too.",
      "ghostTaken": "You're past your ghost — keep it clean.",
      "ghostLostLead": "Your ghost is back ahead — chase it down.",
      "ghostGained": "Gained {secs} on your ghost in Turn {turn}.",
      "ghostDropped": "Lost {secs} to your ghost in Turn {turn}.",
      "masteryUp": "Turn {turn} mastered — {tier}!",
      "masteryBronze": "Bronze",
      "masterySilver": "Silver",
      "masteryGold": "Gold",
      "tyreHolding": "Tyres holding up well.",
      "tyreWorking": "Tyres working harder than early stint.",
      "tyresOverheating": "Tyres overheating",
      "oilTempCritical": "Oil temperature critical",
      "waterTempCritical": "Water temperature critical",
      "gear": "Gear {gear}",
      "gearUpTo": "Up to {gear}",
      "gearDownTo": "Down to {gear}",
      "brakeNow": "Brake now",
      "trailBrakeHere": "Trail brake here",
      "releaseBrakes": "Release brakes",
      "releaseSooner": "Braking too long — release sooner",
      "carrySpeed": "Turn {turn}: carry more speed",
      "throttleNow": "Throttle now",
      "moreThrottle": "More throttle",
      "muchMoreThrottle": "Much more throttle",
      "moreBrake": "More brake",
      "muchMoreBrake": "Much more brake",
      "fuelBurnHeavy": "Fuel burn up — {delta} L per lap heavy vs stint avg.",
      "tyreBurnLate": "Tyres running hot late — ease this lap.",
      "stayOnIt": "Stay on it",
      "trailBrake": "Trail the brake",
      "commitStayOnIt": "Commit, stay on it",
      "brakeHard": "Brake hard",
      "brakeLight": "Light brake",
      "easeOnPower": "Ease on power",
      "gearQuicker": "Turn {turn}: gear {gear} was quicker",
      "cornerFixed": "Turn {turn} is fixed — two clean laps.",
      "straightSlower": "Down {kmh} on reference here — exit speed is costing you",
      "straightFaster": "{kmh} up on reference. Keep it clean.",
      "straightOnPace": "Matching reference speed. Stay smooth."
    },
    "debrief": {
      "onRefPace": "Right on reference pace.",
      "faster": "{secs} under the reference.",
      "slower": "{secs} off the reference.",
      "worstCorner": "Most time lost in Turn {turn}.",
      "focus": "Keep an eye on your {what}."
    },
    "sector": {
      "onPace": "Turn {turn}: on pace",
      "up": "Turn {turn}: {secs} up",
      "down": "Turn {turn}: {secs} down",
      "trendBuilding": "Building. ",
      "trendLosing": "Losing. ",
      "vsPbUp": "{secs} on PB",
      "vsPbDown": "{secs} off PB",
      "vsLastLapQuicker": "quicker than last lap",
      "vsLastLapSlower": "slower than last lap"
    },
    "inputGuide": {
      "brakeHarder": "Brake harder",
      "brake": "Brake",
      "releaseBrake": "Release brake",
      "easeOffBrake": "Ease off brake",
      "throttleMore": "Throttle more",
      "throttle": "Throttle"
    },
    "race": {
      "limiter": "On the limiter. Change up earlier.",
      "liftShift": "Stay flat through the upshift. No need to lift.",
      "shortShift": "Short-shifting. Hold gear {gear} to {rpm} rpm.",
      "saveFuel": "Fuel won't last. Save in slow corners, push exits.",
      "saveTyres": "Tyres overheating. Save in slow corners, push exits.",
      "remindLockup": "Turn {n}: easy on the brake as you turn in.",
      "remindSpin": "Turn {n}: squeeze the throttle on exit.",
      "saveHere": "Turn {n}: save here. Lift early, short-shift.",
      "pushIntro": "Turn {n} opens a long straight. Exit speed counts.",
      "pushRemind": "Turn {n}: nail the exit, the straight follows.",
      "lockup": "Locked the fronts in turn {n}. Ease off as you turn.",
      "wheelspin": "Wheelspin out of turn {n}. Squeeze the throttle."
    }
  },
  "capturePanel": {
    "modeMyLap": "My Lap",
    "modeReplay": "Replay",
    "myLapDesktopOnly": "My Lap requires the desktop app",
    "myLapNeedsDesktop": "My Lap needs the desktop app — it talks to your PS5 directly. Replay is available right here in the browser.",
    "lapRejectedPaused": "Lap not saved: the game was paused for more than {s}s during this lap.",
    "downloadCta": "Download",
    "notConnected": "Not connected",
    "connectHint": "Connect to your PS5 in the header to start recording laps and receive live coaching.",
    "openConnection": "Open connection settings",
    "recording": "RECORDING",
    "standby": "STANDBY",
    "newTrackRec": "Record new track",
    "newTrackRecArmed": "Armed — finish a full lap",
    "newTrackRecTitle": "Your next full lap becomes My PB and the coach’s reference straight away. No name or track needed — save it later if you want to keep it.",
    "newTrackRecNeedsPro": "Coaching against your own recorded lap is a Pro feature.",
    "recordedLapAdopted": "Lap recorded ({time}) — now your My PB reference. Save it any time.",
    "lapComplete": "LAP COMPLETE",
    "frames": "frames",
    "partialCapture": "⚠ partial capture",
    "unsavedBest": "New best lap",
    "unsaved": "unsaved",
    "saveAs": "Save as",
    "referenceLap": "Reference Lap",
    "myLap": "My Lap",
    "save": "SAVE",
    "skip": "SKIP",
    "refDetailsTitle": "Reference Lap Details",
    "myDetailsTitle": "My Lap Details",
    "trackLabel": "Track",
    "classLabel": "Car Class",
    "carModelLabel": "Car model",
    "tyreLabel": "Tyres",
    "tyreUnspecified": "— Unspecified",
    "selectTrack": "Select track…",
    "selectClass": "Select class…",
    "selectCar": "Select car…",
    "otherCar": "Other…",
    "carNamePlaceholder": "Car name",
    "exactCarPlaceholder": "Exact car name",
    "selectTrackTitle": "Select track",
    "selectClassTitle": "Select car class",
    "selectCarTitle": "Car used for this lap — stored with class for catalogue / admin review",
    "myMetaHint": "Track, car class, and car model are stored in the downloaded <strong>.json</strong> for Admin → Upload / catalogue review. Your fastest lap remains the local PB; the runner-up appears under <strong>My saved…</strong> on the map.",
    "submitForReview": "Submit for community review",
    "saveReference": "SAVE REFERENCE",
    "saveMyLap": "SAVE MY LAP",
    "cancel": "Cancel",
    "saving": "Saving...",
    "savedAs": "✓ Saved as",
    "catalogueReviewSent": "✓ Review package downloaded {label}. Import that JSON via /admin to stage it — nothing was uploaded.",
    "sendForReview": "Download catalogue review package",
    "catalogueReviewHint": "Operator tool. Writes a staging JSON for this PB to your downloads; import it yourself via /admin. Nothing is uploaded from the browser.",
    "queued": "⚠ Server unreachable — lap queued locally, will retry on reconnect",
    "saveFailed": "Save failed — please try again",
    "diagCapture": "Capture telemetry for a bug report",
    "diagCaptureStop": "Stop & download",
    "diagCaptureTitle": "Records raw GT7 telemetry to a JSON file for bug reports. Stops automatically after 5 minutes.",
    "diagSaved": "Telemetry capture saved — attach the JSON to the bug."
  },
  "sidebar": {
    "expandPanel": "Expand panel",
    "collapsePanel": "Collapse panel",
    "referenceLap": "Reference Lap",
    "loadReference": "📂 Load Reference Lap",
    "dropHint": "Drop a .json or click to browse",
    "unlockReference": "Unlock reference",
    "lockReference": "Lock reference",
    "clear": "Clear",
    "frames": "frames",
    "gpsYes": "GPS ✓",
    "gpsNo": "No GPS",
    "coachSettings": "Coach Settings",
    "voiceCoaching": "Voice Coaching",
    "voiceMode": "Voice Mode",
    "resetSession": "↺ Reset Session"
  },
  "telemetryGrid": {
    "overlayConnect": "Connect to PS5 to see live telemetry",
    "overlayConnectHint": "Open connection settings (⚙ in the header), enter your PS5 IP, then Connect.",
    "brake": "Brake",
    "throttle": "Throttle",
    "speed": "Speed",
    "rpm": "RPM",
    "fuel": "Fuel",
    "oilTemp": "Oil Temp",
    "percentUnit": "%",
    "speedUnit": "km/h",
    "fuelUnit": "L",
    "tempUnit": "°C"
  },
  "trace": {
    "title": "INPUTS TRACE",
    "legendThrottleDeltaTitle": "Green = more throttle than reference · Red = less · Centre = reference",
    "legendBrakeDeltaTitle": "Green = less brake than reference · Red = more · Centre = reference",
    "legendThrottleLevelTitle": "Envelope = max throttle held in each part of the lap (0–100%)",
    "legendBrakeLevelTitle": "Envelope = max brake in each part of the lap (0–100%)",
    "legendSpeedTitle": "Green = faster than reference · Red = slower",
    "pedalStyleAria": "Pedal chart style",
    "styleCompare": "Δ vs ref",
    "styleLevel": "0–100%",
    "deltaPositive": "Green = better vs reference",
    "deltaNegative": "Red = worse vs reference",
    "refZeroLine": "Centre line = reference",
    "levelEnvelope": "Envelope (max per column)",
    "reference": "Reference",
    "myLive": "My lap",
    "throttle": "Throttle",
    "brake": "Brake",
    "faster": "Faster than reference",
    "slower": "Slower than reference",
    "turnGuides": "T# turn guides",
    "modeAria": "Trace mode",
    "modeThrottle": "Throttle",
    "modeBrake": "Brake",
    "modeSpeed": "Speed",
    "lapDeltaOverlay": "Amber dashes = running lap Δ vs reference (cliff = big loss at that turn)"
  },
  "deltaPanel": {
    "vsReference": "Δ vs Reference (live)",
    "vsReferenceTitle": "Live gap at the car’s current track position. The map’s LAP Δ badge compares full lap times.",
    "syncPrefix": "sync:",
    "current": "Current",
    "predicted": "Predicted",
    "predictedTitle": "Projected final: reference lap plus your current gap, smoothed.",
    "best": "Best",
    "last": "Last"
  },
  "gearIndicator": {
    "gear": "Gear",
    "ref": "ref"
  },
  "tyreWear": {
    "title": "TYRE STATUS",
    "overlayConnect": "Connect to PS5 to see tyre data",
    "cold": "Cold",
    "optimal": "Optimal",
    "hot": "Hot",
    "over": "Over",
    "samples": "samples",
    "balanceOs": "OS",
    "balanceUs": "US",
    "balanceNeutral": "Balanced",
    "balanceOversteer": "Oversteer",
    "balanceUndersteer": "Understeer"
  },
  "admin": {
    "logo": "ADMIN",
    "passwordPlaceholder": "Admin password",
    "login": "Login",
    "title": "GT Gati — ADMIN",
    "logout": "Logout",
    "tabLibrary": "Library",
    "tabSubmissions": "Submissions",
    "tabCatalog": "Catalogue visibility",
    "libraryTitle": "Reference Lap Library",
    "refresh": "Refresh",
    "libraryEmpty": "No reference laps in the database yet. Approve a lap from Submissions (drivers staging faster catalogue laps), or copy JSON into the server reference folder using catalogue filenames (for example tsukuba_gr3.json) and resync.",
    "colTrack": "Track",
    "colClass": "Class",
    "colCar": "Car",
    "colTyre": "Tyre",
    "colManufacturer": "Manufacturer",
    "colDriver": "Driver",
    "colBestTime": "Best time",
    "colFrames": "Frames",
    "colFile": "File",
    "download": "Download",
    "submissionsTitle": "Community Submissions",
    "importJson": "Import JSON",
    "stagingLocalhostOnly": "Cloudflare push is restricted to localhost (LAPCOACH_STAGING_PUSH_LOCALHOST_ONLY=1).",
    "submissionsEmpty": "No pending community submissions.",
    "framesSuffix": "frames",
    "rejectedPrefix": "Rejected:",
    "pushToCloudflare": "Push to Cloudflare",
    "approve": "✓ Approve",
    "reject": "✕ Reject",
    "catalogTitle": "Driver session catalogue",
    "catalogHint": "Turn layouts and categories on for the main app: after Connect, players only see entries marked Public here.",
    "tracksSub": "Tracks",
    "tracksEmpty": "No tracks in the local database.",
    "colRegion": "Region",
    "colLayout": "Layout",
    "colSlug": "Slug",
    "public": "Public",
    "classesSub": "Car categories",
    "classesEmpty": "No car classes.",
    "colId": "Id",
    "colName": "Name",
    "tabLicense": "License",
    "licenseTitle": "Beta license",
    "licenseHint": "Clears the key saved on this device (entitlement-state.json). Use this to test re-activation or switch beta keys. Keys set in LAPCRAFT_LICENSE_KEY (.env) are re-applied on server restart.",
    "licenseLoading": "Loading entitlement…",
    "licenseStatus": "Status",
    "licenseInstallId": "Install ID",
    "licenseKeyHint": "Key (masked)",
    "licenseSource": "Key source",
    "licenseEnv": ".env LAPCRAFT_LICENSE_KEY",
    "licenseSession": "Cloud session",
    "licenseTier": "Tier",
    "licenseExpires": "Expires",
    "licenseClear": "Clear saved license",
    "licenseClearing": "Clearing…",
    "yes": "Yes",
    "no": "No",
    "featuresTitle": "Per-feature overrides",
    "featuresShow": "Features",
    "featuresHide": "Hide features",
    "featuresHint": "Override per-feature gates. \"Inherit\" uses the tier default. Click a toggle to cycle inherit → on → off.",
    "featureOn": "On (override)",
    "featureOff": "Off (override)",
    "featureInheritOn": "Inherit (on)",
    "featureInheritOff": "Inherit (off)",
    "alreadyApproved": "Already approved — reject to remove the leftover file"
  },
  "wsPanel": {
    "connection": "Connection",
    "statusConnecting": "connecting",
    "statusConnected": "connected",
    "statusError": "error",
    "statusDisconnected": "disconnected",
    "pktPerSec": "Pkt/s",
    "gear": "Gear",
    "rpm": "RPM",
    "shareTelemetry": "Share Telemetry",
    "hint": "Forward your live data to a host machine running GT Gati.",
    "hostUrl": "Host URL",
    "hostPlaceholder": "http://192.168.1.x:4200",
    "carSlot": "My car slot (0 = host)",
    "slot": "Slot {n}",
    "stopSharing": "■ Stop Sharing",
    "startSharing": "▶ Start Sharing"
  },
  "log": {
    "title": "Feedback Log",
    "clear": "Clear",
    "tagInfo": "INFO",
    "sessionReady": "Session ready. Awaiting connection."
  },
  "lapLibrary": {
    "title": "Lap Library",
    "refresh": "Refresh",
    "myLaps": "▶ My Laps",
    "clearOverlay": "✕ clear overlay",
    "onMap": "ON MAP",
    "submit": "Submit",
    "tyreLabel": "Tyres",
    "myLapsEmpty": "No saved laps on this device.",
    "referenceLaps": "◉ Reference Laps",
    "refEmpty": "No reference laps loaded.",
    "active": "ACTIVE",
    "qualityFull": "FULL",
    "qualityPartial": "PARTIAL",
    "qualityLow": "LOW CONF"
  },
  "guidesPage": {
    "screenshotAlt": "GT Gati screenshot",
    "screenshotSoon": "Screenshot coming soon",
    "stepAria": "Step {n}"
  }
}
