'use strict';
// Lichte meertaligheid (NL/EN/DE) zonder dependencies.
// Gebruik in HTML:  <span data-i18n="key"></span>  of  data-i18n-ph (placeholder), data-i18n-title.
// In JS:  window.t('key')  en  window.setLang('en').
(function () {
  const DICT = {
    nl: {
      lang_name: 'Nederlands',
      tab_drive: '🎚 Rijden', tab_track: '🗺 Baan', tab_schema: '✏️ Schema',
      rails: '⏻ Rails', estop: '⛔ NOODSTOP',
      connecting: 'verbinden…', offline: 'offline', sim_live: 'simulator · live',
      connected_live: 'verbonden · live', waiting_central: 'wacht op centrale',
      locos: 'Locomotieven', forward: 'Vooruit ▶', reverse: '◀ Achteruit', stop: 'STOP',
      turnouts: 'Wissels', occupancy: 'Bezetmelding (blokken)',
      block_free: 'vrij', block_busy: 'BEZET', straight: 'RECHTDOOR', diverging: 'AFBUIGEND',
      schema_view: '👁 Bekijken', schema_edit: '✏️ Bewerken', schema_save: '💾 Opslaan',
      saved: '✓ Opgeslagen', save_failed: '✗ Mislukt',
      hold: '(hou vast)', log: 'Logboek (DCC-verkeer)',
      lic_free: '🔓 Gratis', lic_pro: '🔑 Pro', lic_locked: '🔒 Vergrendeld',
      lic_title: 'Licentie', lic_intro: 'Heb je een licentiesleutel? Plak \'m hieronder. Activatie werkt volledig offline.',
      lic_ph: 'Plak je licentiesleutel…', lic_close: 'Sluiten', lic_activate: 'Activeren',
      lic_getkey: 'Nog geen sleutel? Maak gratis een account → 30 dagen proef',
      lic_locked_banner: '🔒 Besturen is vergrendeld — een geldige licentie is vereist.',
      lic_enter: 'Licentie invoeren',
      update_avail: '⬆️ Nieuwe versie {latest} beschikbaar (je hebt {current})', download: 'Downloaden',
      baan_hint: 'In simulator-modus loopt er een "trein" door de blokken zodra je rijdt. Op je echte baan komt dit van de s88/LDT-terugmelding.',
      no_blocks: 'Geen blokken gedefinieerd.', address: 'adres',
      tab_manage: '⚙️ Beheer', routes: 'Rijwegen', mng_locos: 'Locomotieven', mng_turnouts: 'Wissels', mng_blocks: 'Blokken', mng_routes: 'Rijwegen', mng_add: '+ Toevoegen', mng_save: '💾 Alles opslaan', mng_del: 'Verwijderen', mng_name: 'Naam', mng_addr: 'Adres', mng_color: 'Kleur', mng_id: 'Nr', mng_sensor: 'Sensor', mng_funcs: 'Functies (komma: nr:label)', mng_photo: 'Foto-URL', route_set: 'Instellen', route_busy: 'bezet', route_free: 'vrij', route_reserved: 'gereserveerd', mng_route_turnouts: 'Wissels (nr:stand, bv 1:r,2:a)', mng_route_blocks: 'Blokken (nrs, bv 1,2)', saved: '✓ Opgeslagen', qr_connect: 'Telefoon koppelen', qr_title: 'Telefoon koppelen', qr_intro: 'Scan deze QR-code met je telefoon — of typ het adres in je browser. Telefoon en dit apparaat moeten op hetzelfde wifi-netwerk zitten.', qr_ios: 'richt de Camera-app op de code en tik op de melding. Open in Safari. Tik daarna op het deel-icoon → "Zet op beginscherm" voor een echte app.', qr_android: 'scan met de Camera of Google Lens en open de link in Chrome. Menu → "Toevoegen aan startscherm".', auto_runs: 'Automatisch rijden', learn_title: '🧭 Leer-modus — baan automatisch ontdekken', learn_intro: 'Tik op Start en rijd een loc rond. ModelRailPro herkent welke bezetmelders afgaan en bouwt daar automatisch blokken + rijwegen uit. Daarna: Toepassen.', learn_start: '▶ Start leren', learn_stop: '⏹ Stop leren', learn_apply: '✓ Toepassen', learn_clear: 'Wissen', learn_recording: 'aan het leren', learn_detected: 'Gedetecteerd', learn_steps: 'stappen', track_plan: 'Spoorplan (live)', check_updates: 'Controleer op updates', up_to_date: 'Je hebt de nieuwste versie', update_to: 'Bijwerken naar', upd_offline: 'Kon niet controleren (offline?)', no_runs: 'Nog geen ritten — maak er een in Beheer.', auto_running: 'rijdt', auto_step: 'stap', auto_start_lbl: 'Start', mng_runs: 'Ritten (automatisch)', mng_run_loco: 'Loc-adres', mng_run_loop: 'Herhalen', mng_consists: 'Tractie (loc\'s koppelen)', mng_consist_members: 'Leden (adres, bv 3,7r — r=omgekeerd)', conn_title: 'Verbinding (centrale)', conn_central: 'Centrale', conn_host: 'IP-adres centrale', conn_serial: 'Seriële poort (COM3 / /dev/ttyUSB0)', conn_save: '💾 Verbinding opslaan', conn_saved_restart: 'Opgeslagen — herstart ModelRailPro om te verbinden', conn_active: 'Nu actief', relay_prompt: 'Koppelcode (zie het agentje thuis):', conn_relay: 'Cloud-code', conn_relay_ph: 'Koppelcode voor van-overal bedienen (leeg=uit)', conn_relay_on: '☁️ Cloud aan — bedien van overal op', conn_relay_off: 'Leeg = alleen op je eigen netwerk. Vul een geheime code in voor van-overal bedienen.', conn_relay_gen: 'genereer', conn_relay_short: 'Code moet minstens 6 tekens zijn', conn_relay_live: 'Cloud aan — webversie kan nu verbinden', conn_saved: 'Opgeslagen', mng_run_steps: 'Stappen (route:snelheid:wacht, bv 1:55:3,2:55:3)',
      help_connect: 'Hoe koppel ik de baan?', help_title: 'De baan koppelen', help_current: 'Huidige centrale', help_sim_on: 'simulator actief (geen baan nodig)', help_connected: 'verbonden ✓', help_notconn: 'nog niet verbonden',
      help_sim_1: 'Je draait nu de simulator — handig om alles te proberen zonder baan.', help_sim_2: 'Om je echte centrale te koppelen: open data/config.json en zet \'mode\' op je centrale (zie hieronder), sla op en herstart ModelRailPro.',
      help_net_1: 'Verbind je centrale met je netwerk (of wifi-router), zodat hij een IP-adres heeft.', help_net_2: 'Open data/config.json en zet \'mode\' op \'{mode}\'.', help_net_3: 'Vul bij \'host\' het IP-adres van je centrale in', help_net_4: 'Sla op en (her)start ModelRailPro.',
      help_ser_1: 'Sluit je centrale met de USB/seriële kabel aan op dit apparaat.', help_ser_2: 'Installeer eenmalig de seriële driver: open een terminal in de modelrailpro-map en typ: npm i serialport', help_ser_3: 'Open data/config.json, zet \'mode\' op \'{mode}\' en vul \'serialPort\' in (Windows: COM3 · Mac/Linux: /dev/ttyUSB0).', help_ser_4: 'Sla op en (her)start ModelRailPro.',
      help_check: 'Gelukt? Het bolletje rechtsboven wordt groen en gaat \'verbonden\' tonen. Zet de rails aan en kies een loc.', help_more: 'Volledige uitleg + per-centrale checklist:',
    },
    en: {
      lang_name: 'English',
      tab_drive: '🎚 Drive', tab_track: '🗺 Track', tab_schema: '✏️ Layout',
      rails: '⏻ Track', estop: '⛔ EMERGENCY STOP',
      connecting: 'connecting…', offline: 'offline', sim_live: 'simulator · live',
      connected_live: 'connected · live', waiting_central: 'waiting for command station',
      locos: 'Locomotives', forward: 'Forward ▶', reverse: '◀ Reverse', stop: 'STOP',
      turnouts: 'Turnouts', occupancy: 'Occupancy (blocks)',
      block_free: 'free', block_busy: 'OCCUPIED', straight: 'STRAIGHT', diverging: 'DIVERGING',
      schema_view: '👁 View', schema_edit: '✏️ Edit', schema_save: '💾 Save',
      saved: '✓ Saved', save_failed: '✗ Failed',
      hold: '(hold)', log: 'Log (DCC traffic)',
      lic_free: '🔓 Free', lic_pro: '🔑 Pro', lic_locked: '🔒 Locked',
      lic_title: 'License', lic_intro: 'Have a license key? Paste it below. Activation works fully offline.',
      lic_ph: 'Paste your license key…', lic_close: 'Close', lic_activate: 'Activate',
      lic_getkey: 'No key yet? Create a free account → 30-day trial',
      lic_locked_banner: '🔒 Control is locked — a valid license is required.',
      lic_enter: 'Enter license',
      update_avail: '⬆️ New version {latest} available (you have {current})', download: 'Download',
      baan_hint: 'In simulator mode a "train" runs through the blocks while you drive. On your real layout this comes from s88/LDT feedback.',
      no_blocks: 'No blocks defined.', address: 'address',
      tab_manage: '⚙️ Manage', routes: 'Routes', mng_locos: 'Locomotives', mng_turnouts: 'Turnouts', mng_blocks: 'Blocks', mng_routes: 'Routes', mng_add: '+ Add', mng_save: '💾 Save all', mng_del: 'Delete', mng_name: 'Name', mng_addr: 'Address', mng_color: 'Colour', mng_id: 'No.', mng_sensor: 'Sensor', mng_funcs: 'Functions (comma: no:label)', mng_photo: 'Photo URL', route_set: 'Set', route_busy: 'busy', route_free: 'free', route_reserved: 'reserved', mng_route_turnouts: 'Turnouts (no:state, e.g. 1:s,2:d)', mng_route_blocks: 'Blocks (nos, e.g. 1,2)', saved: '✓ Saved', qr_connect: 'Connect phone', qr_title: 'Connect phone', qr_intro: 'Scan this QR code with your phone — or type the address in your browser. Phone and this device must be on the same Wi-Fi network.', qr_ios: 'point the Camera app at the code and tap the banner. Open in Safari. Then tap the share icon → "Add to Home Screen" for a real app.', qr_android: 'scan with the Camera or Google Lens and open the link in Chrome. Menu → "Add to Home screen".', auto_runs: 'Automatic running', learn_title: '🧭 Learn mode — auto-discover the layout', learn_intro: 'Tap Start and drive a loco around. ModelRailPro detects which occupancy sensors fire and builds blocks + routes automatically. Then: Apply.', learn_start: '▶ Start learning', learn_stop: '⏹ Stop learning', learn_apply: '✓ Apply', learn_clear: 'Clear', learn_recording: 'learning', learn_detected: 'Detected', learn_steps: 'steps', track_plan: 'Track plan (live)', check_updates: 'Check for updates', up_to_date: 'You have the latest version', update_to: 'Update to', upd_offline: 'Could not check (offline?)', no_runs: 'No runs yet — create one in Manage.', auto_running: 'running', auto_step: 'step', auto_start_lbl: 'Start', mng_runs: 'Runs (automatic)', mng_run_loco: 'Loco address', mng_run_loop: 'Loop', mng_consists: 'Consist (multi-unit)', mng_consist_members: 'Members (address, e.g. 3,7r — r=reversed)', conn_title: 'Connection (command station)', conn_central: 'Station', conn_host: 'Station IP address', conn_serial: 'Serial port (COM3 / /dev/ttyUSB0)', conn_save: '💾 Save connection', conn_saved_restart: 'Saved — restart ModelRailPro to connect', conn_active: 'Currently active', relay_prompt: 'Pairing code (from the agent at home):', conn_relay: 'Cloud code', conn_relay_ph: 'Pairing code for remote control (empty=off)', conn_relay_on: '☁️ Cloud on — control from anywhere at', conn_relay_off: 'Empty = local network only. Enter a secret code for remote control.', conn_relay_gen: 'generate', conn_relay_short: 'Code must be at least 6 characters', conn_relay_live: 'Cloud on — web version can now connect', conn_saved: 'Saved', mng_run_steps: 'Steps (route:speed:wait, e.g. 1:55:3,2:55:3)',
      help_connect: 'How do I connect the layout?', help_title: 'Connecting the layout', help_current: 'Current command station', help_sim_on: 'simulator active (no layout needed)', help_connected: 'connected ✓', help_notconn: 'not connected yet',
      help_sim_1: 'You are running the simulator — handy to try everything without a layout.', help_sim_2: 'To connect your real command station: open data/config.json, set \'mode\' to your station (see below), save and restart ModelRailPro.',
      help_net_1: 'Connect your command station to your network (or Wi-Fi router) so it has an IP address.', help_net_2: 'Open data/config.json and set \'mode\' to \'{mode}\'.', help_net_3: 'Set \'host\' to the IP address of your command station', help_net_4: 'Save and (re)start ModelRailPro.',
      help_ser_1: 'Connect your command station to this device with the USB/serial cable.', help_ser_2: 'Install the serial driver once: open a terminal in the modelrailpro folder and type: npm i serialport', help_ser_3: 'Open data/config.json, set \'mode\' to \'{mode}\' and fill in \'serialPort\' (Windows: COM3 · Mac/Linux: /dev/ttyUSB0).', help_ser_4: 'Save and (re)start ModelRailPro.',
      help_check: 'Done? The dot top-right turns green and shows \'connected\'. Turn on track power and pick a loco.', help_more: 'Full guide + per-station checklist:',
    },
    de: {
      lang_name: 'Deutsch',
      tab_drive: '🎚 Fahren', tab_track: '🗺 Anlage', tab_schema: '✏️ Gleisplan',
      rails: '⏻ Gleis', estop: '⛔ NOTHALT',
      connecting: 'verbinde…', offline: 'offline', sim_live: 'Simulator · live',
      connected_live: 'verbunden · live', waiting_central: 'warte auf Zentrale',
      locos: 'Lokomotiven', forward: 'Vorwärts ▶', reverse: '◀ Rückwärts', stop: 'STOPP',
      turnouts: 'Weichen', occupancy: 'Belegtmeldung (Blöcke)',
      block_free: 'frei', block_busy: 'BELEGT', straight: 'GERADE', diverging: 'ABZWEIG',
      schema_view: '👁 Ansehen', schema_edit: '✏️ Bearbeiten', schema_save: '💾 Speichern',
      saved: '✓ Gespeichert', save_failed: '✗ Fehlgeschlagen',
      hold: '(halten)', log: 'Protokoll (DCC-Verkehr)',
      lic_free: '🔓 Gratis', lic_pro: '🔑 Pro', lic_locked: '🔒 Gesperrt',
      lic_title: 'Lizenz', lic_intro: 'Haben Sie einen Lizenzschlüssel? Hier einfügen. Aktivierung funktioniert komplett offline.',
      lic_ph: 'Lizenzschlüssel einfügen…', lic_close: 'Schließen', lic_activate: 'Aktivieren',
      lic_getkey: 'Noch kein Schlüssel? Kostenloses Konto → 30 Tage Test',
      lic_locked_banner: '🔒 Steuerung gesperrt — eine gültige Lizenz ist erforderlich.',
      lic_enter: 'Lizenz eingeben',
      update_avail: '⬆️ Neue Version {latest} verfügbar (Sie haben {current})', download: 'Herunterladen',
      baan_hint: 'Im Simulator-Modus fährt ein "Zug" durch die Blöcke, sobald Sie fahren. Auf Ihrer echten Anlage kommt das von der s88/LDT-Rückmeldung.',
      no_blocks: 'Keine Blöcke definiert.', address: 'Adresse',
      tab_manage: '⚙️ Verwalten', routes: 'Fahrstraßen', mng_locos: 'Lokomotiven', mng_turnouts: 'Weichen', mng_blocks: 'Blöcke', mng_routes: 'Fahrstraßen', mng_add: '+ Hinzufügen', mng_save: '💾 Alles speichern', mng_del: 'Löschen', mng_name: 'Name', mng_addr: 'Adresse', mng_color: 'Farbe', mng_id: 'Nr', mng_sensor: 'Sensor', mng_funcs: 'Funktionen (Komma: nr:Label)', mng_photo: 'Foto-URL', route_set: 'Stellen', route_busy: 'belegt', route_free: 'frei', route_reserved: 'reserviert', mng_route_turnouts: 'Weichen (nr:Stellung, z.B. 1:g,2:a)', mng_route_blocks: 'Blöcke (nrn, z.B. 1,2)', saved: '✓ Gespeichert', qr_connect: 'Telefon verbinden', qr_title: 'Telefon verbinden', qr_intro: 'Scannen Sie diesen QR-Code mit Ihrem Telefon — oder geben Sie die Adresse im Browser ein. Telefon und dieses Gerät müssen im selben WLAN sein.', qr_ios: 'richten Sie die Kamera-App auf den Code und tippen Sie auf die Einblendung. In Safari öffnen. Dann Teilen-Symbol → "Zum Home-Bildschirm" für eine echte App.', qr_android: 'mit der Kamera oder Google Lens scannen und in Chrome öffnen. Menü → "Zum Startbildschirm hinzufügen".', auto_runs: 'Automatikbetrieb', learn_title: '🧭 Lernmodus — Anlage automatisch erkennen', learn_intro: 'Auf Start tippen und eine Lok fahren. ModelRailPro erkennt, welche Belegtmelder auslösen, und baut daraus automatisch Blöcke + Fahrstraßen. Dann: Übernehmen.', learn_start: '▶ Lernen starten', learn_stop: '⏹ Lernen stoppen', learn_apply: '✓ Übernehmen', learn_clear: 'Löschen', learn_recording: 'lernt', learn_detected: 'Erkannt', learn_steps: 'Schritte', track_plan: 'Gleisplan (live)', check_updates: 'Nach Updates suchen', up_to_date: 'Sie haben die neueste Version', update_to: 'Aktualisieren auf', upd_offline: 'Prüfung fehlgeschlagen (offline?)', no_runs: 'Noch keine Fahrten — in Verwalten anlegen.', auto_running: 'fährt', auto_step: 'Schritt', auto_start_lbl: 'Start', mng_runs: 'Fahrten (automatisch)', mng_run_loco: 'Lok-Adresse', mng_run_loop: 'Wiederholen', mng_consists: 'Mehrfachtraktion', mng_consist_members: 'Mitglieder (Adresse, z.B. 3,7r — r=umgekehrt)', conn_title: 'Verbindung (Zentrale)', conn_central: 'Zentrale', conn_host: 'IP-Adresse Zentrale', conn_serial: 'Serieller Port (COM3 / /dev/ttyUSB0)', conn_save: '💾 Verbindung speichern', conn_saved_restart: 'Gespeichert — ModelRailPro neu starten zum Verbinden', conn_active: 'Aktuell aktiv', relay_prompt: 'Kopplungscode (vom Agent zu Hause):', conn_relay: 'Cloud-Code', conn_relay_ph: 'Kopplungscode für Fernsteuerung (leer=aus)', conn_relay_on: '☁️ Cloud an — von überall steuern auf', conn_relay_off: 'Leer = nur lokales Netzwerk. Code eingeben für Fernsteuerung.', conn_relay_gen: 'erzeugen', conn_relay_short: 'Code muss mindestens 6 Zeichen haben', conn_relay_live: 'Cloud an — Webversion kann jetzt verbinden', conn_saved: 'Gespeichert', mng_run_steps: 'Schritte (Route:Tempo:Warten, z.B. 1:55:3,2:55:3)',
      help_connect: 'Wie verbinde ich die Anlage?', help_title: 'Anlage verbinden', help_current: 'Aktuelle Zentrale', help_sim_on: 'Simulator aktiv (keine Anlage nötig)', help_connected: 'verbunden ✓', help_notconn: 'noch nicht verbunden',
      help_sim_1: 'Sie nutzen den Simulator — ideal zum Ausprobieren ohne Anlage.', help_sim_2: 'Echte Zentrale verbinden: data/config.json öffnen, \'mode\' auf Ihre Zentrale setzen (siehe unten), speichern und ModelRailPro neu starten.',
      help_net_1: 'Verbinden Sie Ihre Zentrale mit dem Netzwerk (oder WLAN-Router), damit sie eine IP-Adresse hat.', help_net_2: 'data/config.json öffnen und \'mode\' auf \'{mode}\' setzen.', help_net_3: 'Bei \'host\' die IP-Adresse Ihrer Zentrale eintragen', help_net_4: 'Speichern und ModelRailPro (neu) starten.',
      help_ser_1: 'Verbinden Sie Ihre Zentrale per USB/seriellem Kabel mit diesem Gerät.', help_ser_2: 'Seriellen Treiber einmalig installieren: Terminal im modelrailpro-Ordner öffnen und eingeben: npm i serialport', help_ser_3: 'data/config.json öffnen, \'mode\' auf \'{mode}\' setzen und \'serialPort\' eintragen (Windows: COM3 · Mac/Linux: /dev/ttyUSB0).', help_ser_4: 'Speichern und ModelRailPro (neu) starten.',
      help_check: 'Geschafft? Der Punkt oben rechts wird grün und zeigt \'verbunden\'. Gleisspannung einschalten und Lok wählen.', help_more: 'Vollständige Anleitung + Checkliste je Zentrale:',
    },
  };

  function detect() {
    try {
      const saved = localStorage.getItem('bb-lang');
      if (saved && DICT[saved]) return saved;
    } catch (e) {}
    const n = (navigator.language || 'nl').slice(0, 2).toLowerCase();
    return DICT[n] ? n : 'nl';
  }

  let lang = detect();
  window.t = function (key, vars) {
    let s = (DICT[lang] && DICT[lang][key]) || (DICT.nl[key]) || key;
    if (vars) for (const k in vars) s = s.replace('{' + k + '}', vars[k]);
    return s;
  };
  window.getLang = () => lang;
  window.i18nLangs = () => Object.keys(DICT).map((k) => ({ code: k, name: DICT[k].lang_name }));

  window.applyI18n = function (root) {
    (root || document).querySelectorAll('[data-i18n]').forEach((el) => { el.textContent = window.t(el.getAttribute('data-i18n')); });
    (root || document).querySelectorAll('[data-i18n-ph]').forEach((el) => { el.placeholder = window.t(el.getAttribute('data-i18n-ph')); });
    (root || document).querySelectorAll('[data-i18n-title]').forEach((el) => { el.title = window.t(el.getAttribute('data-i18n-title')); });
    document.documentElement.lang = lang;
  };

  window.setLang = function (l) {
    if (!DICT[l]) return;
    lang = l;
    try { localStorage.setItem('bb-lang', l); } catch (e) {}
    window.applyI18n();
    document.dispatchEvent(new CustomEvent('langchange'));
  };
})();
