{
  "app.title": "LED Grab",
  "bindable.none": "None (static value)",
  "bindable.toggle": "Toggle value source binding",
  "app.version": "Version:",
  "app.api_docs": "API Documentation",
  "app.connection_lost": "Server unreachable",
  "app.connection_retrying": "Attempting to reconnect…",
  "app.server_restarting": "Server restarting…",
  "app.server_restarting_sub": "Please wait, the server will be back shortly.",
  "demo.badge": "DEMO",
  "demo.banner": "You're in demo mode — all devices and data are virtual. No real hardware is used.",
  "theme.toggle": "Toggle theme",
  "bg.anim.toggle": "Toggle ambient background",
  "accent.title": "Accent color",
  "accent.custom": "Custom",
  "accent.reset": "Reset",
  "locale.change": "Change language",
  "auth.login": "Login",
  "auth.logout": "Logout",
  "auth.authenticated": "● Authenticated",
  "auth.title": "Login to LED Grab",
  "auth.message": "Please enter your API key to authenticate and access the LED Grab.",
  "auth.label": "API Key:",
  "auth.placeholder": "Enter your API key...",
  "auth.hint": "Your API key will be stored securely in your browser's local storage.",
  "auth.button.cancel": "Cancel",
  "auth.button.login": "Login",
  "auth.error.required": "Please enter an API key",
  "auth.error.invalid": "Invalid API key. Please try again.",
  "auth.success": "Logged in successfully!",
  "auth.logout.confirm": "Are you sure you want to logout?",
  "auth.logout.success": "Logged out successfully",
  "auth.please_login": "Please login to view",
  "auth.session_expired": "Your session has expired or the API key is invalid. Please login again.",
  "auth.prompt_update": "Current API key is set. Enter new key to update or leave blank to remove:",
  "auth.prompt_enter": "Enter your API key:",
  "auth.toggle_password": "Toggle password visibility",
  "api_key.login": "Login",
  "setup.title": "Server setup required",
  "setup.description": "This LedGrab server has no API keys configured, so access from other devices on the network is disabled for security. Configure a key on the machine running the server to enable LAN access.",
  "setup.step1_label": "1. On the server machine, edit <code>config/default_config.yaml</code>:",
  "setup.step2_label": "2. Restart the server, then reload this page and log in with that key.",
  "setup.step3_label": "Alternative: open LedGrab from the server machine itself (loopback), no key required:",
  "setup.hint_openssl": "Generate a strong key on Linux/macOS with <code>openssl rand -hex 32</code>, or on Windows PowerShell with <code>[guid]::NewGuid().ToString('N') + [guid]::NewGuid().ToString('N')</code>.",
  "setup.copy": "Copy snippet",
  "setup.copied": "Copied to clipboard",
  "setup.retry": "I've configured a key — retry",
  "setup.still_required": "Server still reports no API keys. Make sure you saved the config file and restarted the server.",
  "displays.title": "Available Displays",
  "displays.layout": "Displays",
  "displays.information": "Display Information",
  "displays.legend.primary": "Primary Display",
  "displays.legend.secondary": "Secondary Display",
  "displays.badge.primary": "Primary",
  "displays.badge.secondary": "Secondary",
  "displays.resolution": "Resolution:",
  "displays.refresh_rate": "Refresh Rate:",
  "displays.position": "Position:",
  "displays.index": "Display Index:",
  "displays.loading": "Loading displays...",
  "displays.none": "No displays available",
  "displays.failed": "Failed to load displays",
  "displays.picker.title": "Select a Display",
  "displays.picker.title.lead": "Select",
  "displays.picker.title.accent": "Display",
  "displays.picker.eyebrow.label": "Source",
  "displays.picker.eyebrow.channel": "Display · Map",
  "displays.picker.eyebrow.channel.device": "Device · List",
  "displays.picker.foot.dismiss": "dismiss",
  "displays.picker.foot.select": "select monitor",
  "displays.picker.foot.select.device": "select device",
  "displays.picker.select": "Select display...",
  "displays.picker.click_to_select": "Click to select this display",
  "displays.picker.adb_connect": "Connect ADB device",
  "displays.picker.adb_connect.placeholder": "IP address (e.g. 192.168.2.201)",
  "displays.picker.adb_connect.button": "Connect",
  "displays.picker.adb_connect.success": "Device connected",
  "displays.picker.adb_connect.error": "Failed to connect device",
  "displays.picker.adb_disconnect": "Disconnect",
  "displays.picker.no_android": "No Android devices found. Connect via USB or enter IP above.",
  "templates.title": "Engine Templates",
  "templates.description": "Capture templates define how the screen is captured. Each template uses a specific capture engine (MSS, DXcam, WGC) with custom settings. Assign templates to devices for optimal performance.",
  "templates.loading": "Loading templates...",
  "templates.empty": "No capture templates configured",
  "templates.add": "Add Engine Template",
  "templates.edit": "Edit Engine Template",
  "templates.name": "Template Name:",
  "templates.name.placeholder": "My Custom Template",
  "templates.description.label": "Description (optional):",
  "templates.description.placeholder": "Describe this template...",
  "templates.engine": "Capture Engine:",
  "templates.engine.hint": "Select the screen capture technology to use",
  "templates.engine.select": "Select an engine...",
  "templates.engine.unavailable": "Unavailable",
  "templates.engine.unavailable.hint": "This engine is not available on your system",
  "templates.engine.mss.desc": "Cross-platform, pure Python",
  "templates.engine.dxcam.desc": "DirectX, low latency",
  "templates.engine.bettercam.desc": "DirectX, high performance",
  "templates.engine.camera.desc": "USB/IP camera capture",
  "templates.engine.scrcpy.desc": "Android screen mirror (adb screencap)",
  "templates.engine.scrcpy_client.desc": "Android H.264 stream, high FPS",
  "templates.engine.wgc.desc": "Windows Graphics Capture",
  "templates.engine.demo.desc": "Animated test pattern (demo mode)",
  "templates.engine.mediaprojection.desc": "Native Android screen capture",
  "templates.config": "Configuration",
  "templates.config.show": "Show configuration",
  "templates.config.none": "No additional configuration",
  "templates.config.default": "Default",
  "templates.config.camera_backend.auto": "Auto-detect best backend",
  "templates.config.camera_backend.dshow": "Windows DirectShow",
  "templates.config.camera_backend.msmf": "Windows Media Foundation",
  "templates.config.camera_backend.v4l2": "Linux Video4Linux2",
  "templates.config.resolution.auto": "Open at the camera's max supported mode",
  "templates.config.resolution.480p": "VGA — lowest CPU and bandwidth",
  "templates.config.resolution.720p": "HD",
  "templates.config.resolution.1080p": "Full HD",
  "templates.config.resolution.1440p": "QHD / 2K",
  "templates.config.resolution.2160p": "4K UHD — highest CPU and bandwidth",
  "templates.created": "Template created successfully",
  "templates.updated": "Template updated successfully",
  "templates.deleted": "Template deleted successfully",
  "templates.delete.confirm": "Are you sure you want to delete this template?",
  "templates.error.load": "Failed to load templates",
  "templates.error.engines": "Failed to load engines",
  "templates.error.required": "Please fill in all required fields",
  "templates.error.delete": "Failed to delete template",
  "templates.test.title": "Test Capture",
  "templates.test.description": "Test this template before saving to see a capture preview and performance metrics.",
  "templates.test.display": "Display:",
  "templates.test.display.select": "Select display...",
  "templates.test.device": "Device:",
  "templates.test.device.select": "Select device...",
  "templates.test.duration": "Capture Duration (s):",
  "templates.test.border_width": "Border Width (px):",
  "templates.test.run": "Run",
  "templates.test.running": "Running test...",
  "templates.test.results.preview": "Full Capture Preview",
  "templates.test.results.borders": "Border Extraction",
  "templates.test.results.top": "Top",
  "templates.test.results.right": "Right",
  "templates.test.results.bottom": "Bottom",
  "templates.test.results.left": "Left",
  "templates.test.results.performance": "Performance",
  "templates.test.results.capture_time": "Capture",
  "templates.test.results.extraction_time": "Extraction",
  "templates.test.results.total_time": "Total",
  "templates.test.results.max_fps": "Max FPS",
  "templates.test.results.duration": "Duration",
  "templates.test.results.frame_count": "Frames",
  "templates.test.results.actual_fps": "Actual FPS",
  "templates.test.results.avg_capture_time": "Avg Capture",
  "templates.test.results.resolution": "Resolution:",
  "templates.test.error.no_engine": "Please select a capture engine",
  "templates.test.error.no_display": "Please select a display",
  "templates.test.error.no_device": "Please select a device",
  "templates.test.error.failed": "Test failed",
  "devices.title": "Devices",
  "device.select_type": "Select Device Type",
  "devices.add": "Add New Device",
  "devices.loading": "Loading devices...",
  "devices.none": "No devices configured",
  "devices.failed": "Failed to load devices",
  "devices.wled_config": "WLED Configuration:",
  "devices.wled_note": "Configure your WLED device (effects, segments, color order, power limits, etc.) using the",
  "devices.wled_link": "official WLED app",
  "devices.wled_note_or": "or the built-in",
  "devices.wled_webui_link": "WLED Web UI",
  "devices.wled_note_webui": "(open your device's IP in a browser).",
  "devices.wled_note2": "This controller sends pixel color data and controls brightness per device.",
  "device.scan": "Auto Discovery",
  "device.scan.empty": "No devices found",
  "device.scan.error": "Network scan failed",
  "device.scan.already_added": "Already added",
  "device.scan.selected": "Device selected",
  "device.type": "Device Type:",
  "device.type.hint": "Select the type of LED controller",
  "device.type.wled": "WLED",
  "device.type.wled.desc": "WiFi LED controller over HTTP/UDP",
  "device.type.adalight": "Adalight",
  "device.type.adalight.desc": "Serial LED protocol for Arduino",
  "device.type.ambiled": "AmbiLED",
  "device.type.ambiled.desc": "Serial protocol for AmbiLED devices",
  "device.type.mqtt": "MQTT",
  "device.type.mqtt.desc": "Publish LED data via MQTT broker",
  "device.type.ws": "WebSocket",
  "device.type.ws.desc": "Stream LED data to WebSocket clients",
  "device.type.openrgb": "OpenRGB",
  "device.type.openrgb.desc": "Control RGB peripherals via OpenRGB",
  "device.type.dmx": "DMX",
  "device.type.dmx.desc": "Art-Net / sACN (E1.31) stage lighting",
  "device.type.ddp": "DDP",
  "device.type.ddp.desc": "Direct UDP pixel push (Pixelblaze, ESPixelStick, Falcon)",
  "device.type.opc": "OPC",
  "device.type.opc.desc": "Open Pixel Control (Fadecandy, xLights, hobbyist drivers)",
  "device.type.mock": "Mock",
  "device.type.mock.desc": "Virtual device for testing",
  "device.type.espnow": "ESP-NOW",
  "device.type.espnow.desc": "Ultra-low-latency via ESP32 gateway",
  "device.type.hue": "Philips Hue",
  "device.type.hue.desc": "Hue Entertainment API streaming",
  "device.type.yeelight": "Yeelight",
  "device.type.yeelight.desc": "Xiaomi smart bulb / lightstrip via LAN (single color, averaged from the strip)",
  "device.yeelight.url": "IP Address:",
  "device.yeelight.url.hint": "LAN IP of the Yeelight bulb. TCP port 55443 is fixed in the protocol.",
  "device.yeelight.url.placeholder": "192.168.1.50",
  "device.yeelight_min_interval": "Min Update Interval:",
  "device.yeelight_min_interval.hint": "Client-side rate limit between commands in ms. Default 500 ms keeps bulbs under their ~1 cmd/sec cap; lower values risk throttling.",
  "device.type.wiz": "WiZ",
  "device.type.wiz.desc": "WiZ Connected (Philips) UDP LAN bulb",
  "device.wiz.url": "IP Address:",
  "device.wiz.url.hint": "LAN IP of the WiZ bulb. UDP port 38899 is the protocol default.",
  "device.wiz.url.placeholder": "192.168.1.50",
  "device.wiz_min_interval": "Min Update Interval:",
  "device.wiz_min_interval.hint": "Client-side rate limit between commands in ms. UDP fire-and-forget tolerates fast updates; default 50 ms ≈ 20 Hz.",
  "device.type.lifx": "LIFX",
  "device.type.lifx.desc": "LIFX smart bulb / lightstrip over LAN",
  "device.lifx.url": "IP Address:",
  "device.lifx.url.hint": "LAN IP of the LIFX bulb. UDP port 56700 is the protocol default.",
  "device.lifx.url.placeholder": "192.168.1.50",
  "device.lifx_min_interval": "Min Update Interval:",
  "device.lifx_min_interval.hint": "Client-side rate limit between commands in ms. LIFX recommends ≤20 cmd/sec; default 50 ms matches that ceiling.",
  "device.type.govee": "Govee",
  "device.type.govee.desc": "Govee Wi-Fi bulb / ambient kit via LAN API",
  "device.govee.url": "IP Address:",
  "device.govee.url.hint": "LAN IP of the Govee device. Enable LAN Control in the Govee Home app first (Device → ⚙ → LAN Control), or the bulb won’t respond.",
  "device.govee.url.placeholder": "192.168.1.50",
  "device.govee_min_interval": "Min Update Interval:",
  "device.govee_min_interval.hint": "Client-side rate limit between commands in ms. UDP fire-and-forget tolerates fast updates; default 50 ms ≈ 20 Hz.",
  "device.type.nanoleaf": "Nanoleaf",
  "device.type.nanoleaf.desc": "Nanoleaf Light Panels / Canvas / Shapes / Lines / Elements (HTTP REST, requires pairing)",
  "device.nanoleaf.url": "IP Address:",
  "device.nanoleaf.url.hint": "LAN IP of the Nanoleaf controller. HTTP port 16021 is fixed in the protocol.",
  "device.nanoleaf.url.placeholder": "192.168.1.50",
  "device.nanoleaf_min_interval": "Min Update Interval:",
  "device.nanoleaf_min_interval.hint": "Client-side rate limit between commands in ms. Default 100 ms ≈ 10 Hz; HTTP request overhead caps the practical max around 20 Hz.",
  "device.nanoleaf.pair.instructions": "Press and hold the power button on your Nanoleaf controller for 5 seconds until the LEDs flash, then click Start. The controller opens a 30-second pairing window.",
  "device.nanoleaf.pair_button": "Pair Device",
  "device.nanoleaf.token.label": "Auth token:",
  "device.nanoleaf.paired": "Paired",
  "device.type.ble": "BLE LED Controller",
  "device.type.ble.desc": "Bluetooth LE strips: SP110E, Triones, Zengge, Govee (whole-strip color)",
  "device.ble.url": "BLE Address:",
  "device.ble.url.hint": "MAC address (Windows/Linux) or UUID (macOS), prefixed with ble://",
  "device.ble.family": "Protocol Family:",
  "device.ble.family.hint": "Which BLE protocol your controller speaks. Match the phone app you normally use.",
  "device.ble.family.sp110e.desc": "Addressable controllers — LED Hue / SP110E app",
  "device.ble.family.triones.desc": "Single-color controllers — HappyLighting / LEDnet app",
  "device.ble.family.zengge.desc": "Single-color controllers — iLightsIn / Mohuan app",
  "device.ble.family.govee.desc": "Govee H6xxx strips — unencrypted firmware only",
  "device.ble.govee_key": "Govee AES Key (hex):",
  "device.ble.govee_key.hint": "Optional. Newer Govee firmware needs a per-model AES key — leave blank for older firmware.",
  "device.ble.govee_key.placeholder": "32 hex digits, e.g. 0102…1f20",
  "device.type.usbhid": "USB HID",
  "device.type.usbhid.desc": "USB RGB peripherals (keyboards, mice)",
  "device.type.spi": "SPI Direct",
  "device.type.spi.desc": "Raspberry Pi GPIO/SPI LED strips",
  "device.type.chroma": "Razer Chroma",
  "device.type.chroma.desc": "Razer peripherals via Chroma SDK",
  "device.type.gamesense": "SteelSeries",
  "device.type.gamesense.desc": "SteelSeries peripherals via GameSense",
  "device.type.group": "Group",
  "device.type.group.desc": "Combine multiple devices into one virtual device",
  "device.group.children": "Child Devices:",
  "device.group.children.hint": "Select devices to include in this group. Order matters for sequence mode.",
  "device.group.add_child": "+ Add Device",
  "device.group.select_device": "Select a device",
  "device.group.mode": "Group Mode:",
  "device.group.mode.hint": "Sequence concatenates LEDs end-to-end. Independent mirrors the full strip to each device.",
  "device.group.mode.sequence": "Sequence",
  "device.group.mode.sequence.desc": "Concatenate LEDs end-to-end into one long strip",
  "device.group.mode.independent": "Independent",
  "device.group.mode.independent.desc": "Mirror the full strip to each device independently",
  "device.group.move_up": "Move up",
  "device.group.move_down": "Move down",
  "device.group.error.no_children": "Add at least one child device to the group.",
  "device.chroma.device_type": "Peripheral Type:",
  "device.chroma.device_type.hint": "Which Razer peripheral to control via Chroma SDK",
  "device.gamesense.device_type": "Peripheral Type:",
  "device.gamesense.device_type.hint": "Which SteelSeries peripheral to control via GameSense",
  "device.espnow.peer_mac": "Peer MAC:",
  "device.espnow.peer_mac.hint": "MAC address of the remote ESP32 receiver (e.g. AA:BB:CC:DD:EE:FF)",
  "device.espnow.channel": "WiFi Channel:",
  "device.espnow.channel.hint": "WiFi channel (1-14). Must match the receiver's channel.",
  "device.hue.url": "Bridge IP:",
  "device.hue.url.hint": "IP address of your Hue bridge",
  "device.hue.username": "Bridge Username:",
  "device.hue.username.hint": "Hue bridge application key from pairing",
  "device.hue.client_key": "Client Key:",
  "device.hue.client_key.hint": "Entertainment API client key (hex string from pairing)",
  "device.hue.group_id": "Entertainment Group:",
  "device.hue.group_id.hint": "Entertainment configuration ID from your Hue bridge",
  "device.usbhid.url": "VID:PID:",
  "device.usbhid.url.hint": "USB Vendor:Product ID in hex (e.g. 1532:0084)",
  "device.spi.url": "GPIO/SPI Path:",
  "device.spi.url.hint": "GPIO pin or SPI device path (e.g. spi://gpio:18)",
  "device.spi.speed": "SPI Speed (Hz):",
  "device.spi.speed.hint": "SPI clock speed. 800000 Hz for WS2812, 2400000 Hz for APA102.",
  "device.spi.led_type": "LED Chipset:",
  "device.spi.led_type.hint": "Type of addressable LED strip connected to the GPIO/SPI pin",
  "device.spi.led_type.ws2812b.desc": "Most common, 800 KHz data, 3-wire RGB",
  "device.spi.led_type.ws2812.desc": "Original WS2812, 800 KHz, 3-wire RGB",
  "device.spi.led_type.ws2811.desc": "External driver IC, 400 KHz, 12V strips",
  "device.spi.led_type.sk6812.desc": "Samsung LED, 800 KHz, 3-wire RGB",
  "device.spi.led_type.sk6812_rgbw.desc": "SK6812 with dedicated white channel",
  "device.gamesense.peripheral.keyboard": "Keyboard",
  "device.gamesense.peripheral.keyboard.desc": "Per-key RGB illumination",
  "device.gamesense.peripheral.mouse": "Mouse",
  "device.gamesense.peripheral.mouse.desc": "Mouse RGB zones",
  "device.gamesense.peripheral.headset": "Headset",
  "device.gamesense.peripheral.headset.desc": "Headset earcup lighting",
  "device.gamesense.peripheral.mousepad": "Mousepad",
  "device.gamesense.peripheral.mousepad.desc": "Mousepad edge lighting zones",
  "device.gamesense.peripheral.indicator": "Indicator",
  "device.gamesense.peripheral.indicator.desc": "OLED/LED status indicator",
  "device.css_processing_template": "Strip Processing Template:",
  "device.css_processing_template.hint": "Default processing template applied to all color strip outputs on this device",
  "device.dmx_protocol": "DMX Protocol:",
  "device.dmx_protocol.hint": "Art-Net uses UDP port 6454, sACN (E1.31) uses UDP port 5568",
  "device.dmx_protocol.artnet.desc": "UDP unicast, port 6454",
  "device.dmx_protocol.sacn.desc": "Multicast/unicast, port 5568",
  "device.dmx_start_universe": "Start Universe:",
  "device.dmx_start_universe.hint": "First DMX universe (0-32767). Multiple universes are used automatically for >170 LEDs.",
  "device.dmx_start_channel": "Start Channel:",
  "device.dmx_start_channel.hint": "First DMX channel within the universe (1-512)",
  "device.dmx.url": "IP Address:",
  "device.dmx.url.hint": "IP address of the DMX node (e.g. 192.168.1.50)",
  "device.dmx.url.placeholder": "192.168.1.50",
  "device.ddp.url": "IP Address:",
  "device.ddp.url.hint": "DDP receiver address. Port defaults to 4048.",
  "device.ddp.url.placeholder": "192.168.1.50",
  "device.ddp_port": "DDP Port:",
  "device.ddp_port.hint": "UDP port (0 = protocol default 4048).",
  "device.ddp_destination_id": "Destination ID:",
  "device.ddp_destination_id.hint": "DDP destination identifier (1 = display).",
  "device.ddp_color_order": "Color Order:",
  "device.ddp_color_order.hint": "Channel byte order on the wire. Most DDP receivers expect RGB.",
  "device.ddp.color_order.rgb.desc": "Standard RGB byte order",
  "device.ddp.color_order.grb.desc": "WS2812/WS2812B native order",
  "device.ddp.color_order.brg.desc": "BRG byte order",
  "device.ddp.color_order.rbg.desc": "RBG byte order",
  "device.ddp.color_order.bgr.desc": "BGR byte order",
  "device.ddp.color_order.gbr.desc": "GBR byte order",
  "device.opc.url": "IP Address:",
  "device.opc.url.hint": "OPC receiver address. TCP port defaults to 7890.",
  "device.opc.url.placeholder": "192.168.1.50",
  "device.opc_channel": "Channel:",
  "device.opc_channel.hint": "OPC channel (0 = broadcast to every channel on the server, 1-255 = specific output).",
  "device.serial_port": "Serial Port:",
  "device.serial_port.hint": "Select the COM port of the Adalight device",
  "device.serial_port.none": "No serial ports found",
  "device.serial_port.select": "Select a port...",
  "device.led_count_manual.hint": "Number of LEDs on the strip (must match your Arduino sketch)",
  "device.baud_rate": "Baud Rate:",
  "device.baud_rate.hint": "Serial communication speed. Higher = more FPS but requires matching Arduino sketch.",
  "device.led_type": "LED Type:",
  "device.led_type.hint": "RGB (3 channels) or RGBW (4 channels with dedicated white)",
  "device.send_latency": "Send Latency (ms):",
  "device.send_latency.hint": "Simulated network/serial delay per frame in milliseconds",
  "device.mqtt_topic": "MQTT Topic:",
  "device.mqtt_topic.hint": "MQTT topic path for publishing pixel data (e.g. mqtt://ledgrab/device/name)",
  "device.mqtt_topic.placeholder": "mqtt://ledgrab/device/living-room",
  "device.ws_url": "Connection URL:",
  "device.ws_url.hint": "WebSocket URL for clients to connect and receive LED data",
  "device.openrgb.url": "OpenRGB URL:",
  "device.openrgb.url.hint": "OpenRGB server address (e.g. openrgb://localhost:6742/0)",
  "device.openrgb.zone": "Zones:",
  "device.openrgb.zone.hint": "Select which LED zones to control (leave all unchecked for all zones)",
  "device.openrgb.zone.loading": "Loading zones…",
  "device.openrgb.zone.error": "Failed to load zones",
  "device.openrgb.mode": "Zone mode:",
  "device.openrgb.mode.hint": "Combined treats all zones as one continuous LED strip. Separate renders each zone independently with the full effect.",
  "device.openrgb.mode.combined": "Combined strip",
  "device.openrgb.mode.separate": "Independent zones",
  "device.openrgb.added_multiple": "Added {count} devices",
  "device.url.hint": "IP address or hostname of the device (e.g. http://192.168.1.100)",
  "device.name": "Device Name:",
  "device.name.placeholder": "Living Room TV",
  "device.url": "URL:",
  "device.url.placeholder": "http://192.168.1.100",
  "device.led_count": "LED Count:",
  "dashboard.device.chip": "Chip:",
  "device.led_count.hint": "Number of LEDs configured in the device",
  "device.led_count.hint.auto": "Auto-detected from device",
  "device.button.add": "Add Device",
  "device.button.start": "Start",
  "device.button.stop": "Stop",
  "device.button.settings": "General Settings",
  "device.button.capture_settings": "Capture Settings",
  "device.button.calibrate": "Calibrate",
  "device.button.remove": "Remove",
  "device.button.webui": "Open Device Web UI",
  "device.button.power_off": "Turn Off",
  "device.button.ping": "Ping Device",
  "device.ping.online": "Online ({ms}ms)",
  "device.ping.offline": "Device offline",
  "device.ping.error": "Ping failed",
  "device.power.off_success": "Device turned off",
  "device.status.connected": "Connected",
  "device.status.disconnected": "Disconnected",
  "device.status.error": "Error",
  "device.status.processing": "Processing",
  "device.status.idle": "Idle",
  "device.fps": "FPS:",
  "device.display": "Display:",
  "device.remove.confirm": "Are you sure you want to remove this device?",
  "device.added": "Device added successfully",
  "device.removed": "Device removed",
  "device.started": "Processing started",
  "device.stopped": "Processing stopped",
  "device.metrics.actual_fps": "Actual FPS",
  "device.metrics.current_fps": "Current FPS",
  "device.metrics.target_fps": "Target FPS",
  "device.metrics.potential_fps": "Potential FPS",
  "device.metrics.frames": "Frames",
  "device.metrics.frames_skipped": "Skipped",
  "device.metrics.keepalive": "Keepalive",
  "device.metrics.errors": "Errors",
  "device.metrics.uptime": "Uptime",
  "device.metrics.timing": "Pipeline timing:",
  "device.metrics.device_fps": "Device refresh rate",
  "device.health.online": "Online",
  "device.health.offline": "Offline",
  "device.health.streaming_unreachable": "Unreachable during streaming",
  "device.health.checking": "Checking...",
  "patch.streaming": "STREAMING",
  "patch.standby": "STANDBY",
  "patch.online": "ONLINE",
  "patch.offline": "OFFLINE",
  "patch.disconnected": "DISCONNECTED",
  "patch.not_configured": "NOT CONFIGURED",
  "patch.unreachable": "UNREACHABLE",
  "patch.checking": "CHECKING",
  "patch.ticking": "TICKING",
  "patch.paused": "PAUSED",
  "patch.patched": "PATCHED",
  "patch.preset": "PRESET",
  "patch.source": "SOURCE",
  "patch.template": "TEMPLATE",
  "patch.pipeline": "PIPELINE",
  "patch.strip": "STRIP",
  "patch.value": "VALUE",
  "patch.ready": "READY",
  "patch.polling": "POLLING",
  "perf.idle": "idle",
  "perf.offline": "offline",
  "perf.online": "online",
  "perf.no_devices": "no devices",
  "perf.all_online": "all online",
  "perf.online_count": "{count} online",
  "perf.offline_count": "{count} offline",
  "perf.total_bytes": "{bytes} total",
  "perf.max_ms": "max {ms}ms",
  "perf.targets_count.one": "{count} target",
  "perf.targets_count.other": "{count} targets",
  "device.last_seen.label": "Last seen",
  "device.last_seen.just_now": "just now",
  "device.last_seen.seconds": "%ds ago",
  "device.last_seen.minutes": "%dm ago",
  "device.last_seen.hours": "%dh ago",
  "device.last_seen.days": "%dd ago",
  "device.tutorial.start": "Start tutorial",
  "device.tip.identity": "Device identity — name, type badge, and health indicator showing online/offline status.",
  "device.tip.metadata": "Device address and firmware version. Click the URL to open the device's built-in web UI.",
  "device.tip.brightness": "Drag to adjust device brightness. Changes are sent to the device immediately.",
  "device.brightness": "Bright",
  "device.tip.ping": "Ping the device to refresh online status and latency.",
  "device.tip.settings": "Open device settings — configure name, URL, capabilities, and health checks.",
  "device.tip.menu": "More actions — duplicate, hide, or delete this device.",
  "device.tip.add": "Click here to add a new LED device",
  "settings.title": "Settings",
  "settings.tab.general": "General",
  "settings.tab.backup": "Backup",
  "settings.tab.mqtt": "MQTT",
  "settings.tab.appearance": "Appearance",
  "settings.logs.open_viewer": "Open Log Viewer",
  "settings.external_url.label": "External URL",
  "settings.external_url.hint": "If set, this base URL is used in webhook URLs and other user-visible links instead of the auto-detected local IP. Example: https://myserver.example.com:8080",
  "settings.external_url.placeholder": "https://myserver.example.com:8080",
  "settings.external_url.save": "Save",
  "settings.external_url.saved": "External URL saved",
  "settings.external_url.save_error": "Failed to save external URL",
  "settings.general.title": "General Settings",
  "settings.section.identity": "Identity",
  "settings.section.connection": "Connection",
  "settings.section.hardware": "Hardware",
  "settings.section.behavior": "Behavior",
  "settings.section.provider": "Provider",
  "settings.section.refresh": "Refresh",
  "settings.section.filters": "Filters",
  "settings.section.routing": "Routing",
  "settings.section.output": "Output",
  "settings.section.filtering": "Filtering",
  "settings.section.broker": "Broker",
  "settings.section.protocol": "Protocol",
  "settings.section.adapter": "Adapter",
  "settings.section.mappings": "Mappings",
  "settings.section.diagnostics": "Diagnostics",
  "settings.section.source": "Source",
  "settings.section.engine": "Engine",
  "settings.section.timing": "Timing",
  "settings.section.gradient": "Gradient",
  "settings.section.layout": "Layout",
  "settings.section.strip": "Strip",
  "settings.section.type": "Type",
  "settings.section.notes": "Notes",
  "settings.section.file": "File",
  "settings.section.auth": "Auth",
  "settings.section.configure": "Configure",
  "settings.section.restart": "Restart",
  "settings.section.loopback": "Loopback",
  "settings.section.test_setup": "Test Setup",
  "settings.section.offsets": "Offsets",
  "settings.section.line_properties": "Line Properties",
  "settings.section.test": "Test",
  "settings.section.preview": "Preview",
  "settings.section.controls": "Controls",
  "settings.section.history": "History",
  "ha_source.use_ssl.hint": "Enable for HTTPS / wss connections to Home Assistant",
  "game_integration.enabled.hint": "Disabled integrations stop polling and emitting events",
  "settings.capture.title": "Capture Settings",
  "settings.capture.saved": "Capture settings updated",
  "settings.capture.failed": "Failed to save capture settings",
  "settings.brightness": "Brightness:",
  "settings.brightness.hint": "Global brightness for this device (0-100%)",
  "settings.url.hint": "IP address or hostname of the device",
  "settings.display_index": "Display:",
  "settings.display_index.hint": "Which screen to capture for this device",
  "settings.fps": "Target FPS:",
  "settings.fps.hint": "Target frames per second (10-90)",
  "settings.capture_template": "Engine Template:",
  "settings.capture_template.hint": "Screen capture engine and configuration for this device",
  "settings.button.cancel": "Cancel",
  "settings.health_interval": "Health Check Interval (s):",
  "settings.health_interval.hint": "How often to check the device status (5-600 seconds)",
  "settings.auto_shutdown": "Auto Restore:",
  "settings.auto_shutdown.hint": "Restore device to idle state when targets stop or server shuts down",
  "settings.button.save": "Save Changes",
  "settings.saved": "Settings saved successfully",
  "settings.failed": "Failed to save settings",
  "calibration.title": "LED Calibration",
  "calibration.tip.led_count": "Enter LED count per edge",
  "calibration.tip.start_corner": "Click a corner to set the start position",
  "calibration.tip.direction": "Toggle LED strip direction (clockwise / counterclockwise)",
  "calibration.tip.offset": "Set LED offset — distance from LED 0 to the start corner",
  "calibration.tip.span": "Drag green bars to adjust coverage span",
  "calibration.tip.test": "Click an edge to toggle test LEDs",
  "calibration.tip.overlay": "Toggle screen overlay to see LED positions and numbering on your monitor",
  "calibration.tip.toggle_inputs": "Click total LED count to toggle edge inputs",
  "calibration.tip.border_width": "How many pixels from the screen edge to sample for LED colors",
  "calibration.tip.skip_leds_start": "Skip LEDs at the start of the strip — skipped LEDs stay off",
  "calibration.tip.skip_leds_end": "Skip LEDs at the end of the strip — skipped LEDs stay off",
  "tour.welcome": "Welcome to LED Grab! This quick tour will show you around the interface. Use arrow keys or buttons to navigate.",
  "tour.dashboard": "Dashboard — live overview of running targets, automations, and device health at a glance.",
  "tour.targets": "Targets — add WLED devices, configure LED targets with capture settings and calibration.",
  "tour.sources": "Sources — manage capture templates, picture sources, audio sources, and color strips.",
  "tour.integrations": "Integrations — connect external services: Weather, Home Assistant, MQTT, and Game integrations.",
  "tour.graph": "Graph — visual overview of all entities and their connections. Drag ports to connect, right-click edges to disconnect.",
  "tour.automations": "Automations — automate scene switching with time, audio, or value rules.",
  "tour.settings": "Settings — backup and restore configuration, manage auto-backups.",
  "tour.api": "API Docs — interactive REST API documentation powered by Swagger.",
  "tour.search": "Search — quickly find and navigate to any entity with Ctrl+K.",
  "tour.theme": "Theme — switch between dark and light mode.",
  "tour.accent": "Accent color — customize the UI accent color to your preference.",
  "tour.language": "Language — choose your preferred interface language.",
  "tour.restart": "Restart tutorial",
  "tour.dash.perf": "Performance — real-time FPS charts, latency metrics, and poll interval control.",
  "tour.dash.targets": "Channels — all your targets in one place, grouped into running and stopped subsections.",
  "tour.dash.running": "Running targets — live streaming metrics and quick stop control.",
  "tour.dash.stopped": "Stopped targets — ready to start with one click.",
  "tour.dash.automations": "Automations — active automation status and quick enable/disable toggle.",
  "tour.dash.scenes": "Scene Presets — saved system snapshots you can apply with a single click.",
  "tour.dash.sync_clocks": "Sync Clocks — shared timers that synchronize animations across sources.",
  "tour.dash.integrations": "Integrations — connection status for Weather, Home Assistant, and MQTT sources.",
  "tour.dash.customize_btn": "Customize button — opens a side panel where you can reorder sections, toggle visibility, and tune the dashboard layout.",
  "tour.dash.customize_panel": "Dashboard Customize — your control center for layout. Changes apply live; close with Esc or the × button.",
  "tour.dash.customize_presets": "Presets — apply curated layouts (compact, focused, full) in one click. Switching to a preset overrides any manual tweaks.",
  "tour.dash.customize_global": "Global settings — content width, animation level, performance mode (system/app/both), and the sample window for charts.",
  "tour.dash.customize_sections": "Sections — drag to reorder; click the eye to hide; click the chevron to start collapsed by default. Each section can also be tagged dense/compact/comfortable.",
  "tour.dash.customize_perf_cells": "Performance cells — choose which metric tiles to show in the Performance section, configure their span, sample window, and Y-axis scale.",
  "tour.tgt.nav": "Use this dropdown to switch between target types: LED devices, LED targets, and Home Assistant lights.",
  "tour.tgt.devices": "Devices — your LED controllers discovered on the network.",
  "tour.tgt.css": "Color Strips — define how screen regions map to LED segments.",
  "tour.tgt.targets": "LED Targets — combine a device, color strip, and capture source for streaming.",
  "tour.tgt.ha_light_targets": "HA Light Targets — pick a Home Assistant light entity and a color/value source to drive it.",
  "tour.src.nav": "Use this dropdown to switch between source types — pictures, color strips, audio, value, sync, and assets.",
  "tour.src.raw": "Raw — live screen capture sources from your displays.",
  "tour.src.templates": "Capture Templates — reusable capture configurations (resolution, FPS, crop).",
  "tour.src.static": "Static Image — test your setup with image files instead of live capture.",
  "tour.src.processed": "Processed — apply post-processing effects like blur, brightness, or color correction.",
  "tour.src.color_strip": "Color Strips — define how screen regions map to LED segments.",
  "tour.src.audio": "Audio — capture microphone/system audio and process it through templates for reactive effects.",
  "tour.src.value": "Value Sources — dynamic numbers or colors driven by time of day, audio, system metrics, Home Assistant entities, gradients, or schedules. Used to animate effects, modulate color strips, and trigger automations.",
  "tour.src.sync": "Sync Clocks — shared timers that synchronize animations across multiple sources.",
  "tour.auto.list": "Automations — automate scene activation based on time, audio, or value rules.",
  "tour.auto.add": "Click + to create a new automation with rules and a scene to activate.",
  "tour.auto.card": "Each card shows automation status, rules, and quick controls to edit or toggle.",
  "tour.auto.scenes_list": "Scenes — saved system states that automations can activate or you can apply manually.",
  "tour.auto.scenes_add": "Click + to capture the current system state as a new scene preset.",
  "tour.auto.scenes_card": "Each scene card shows target/device counts. Click to edit, recapture, or activate.",
  "tour.int.nav": "Use this dropdown to switch between integration types: Weather, Home Assistant, MQTT, and Game integrations.",
  "tour.int.weather": "Weather — pull live weather data (temperature, conditions, forecast) into value sources for environmental effects.",
  "tour.int.home_assistant": "Home Assistant — connect to your HA instance. Lights, sensors, and entities become value sources and target endpoints.",
  "tour.int.mqtt": "MQTT — subscribe to broker topics to feed external sensor data, automations, or remote triggers into LedGrab.",
  "tour.int.game": "Game — react to in-game events (Minecraft, Hammer of God, etc.) by triggering scenes and color effects from game state.",
  "calibration.tutorial.start": "Start tutorial",
  "calibration.overlay_toggle": "Overlay",
  "calibration.start_position": "Starting Position:",
  "calibration.position.bottom_left": "Bottom Left",
  "calibration.position.bottom_right": "Bottom Right",
  "calibration.position.top_left": "Top Left",
  "calibration.position.top_right": "Top Right",
  "calibration.direction": "Direction:",
  "calibration.direction.clockwise": "Clockwise",
  "calibration.direction.counterclockwise": "Counterclockwise",
  "calibration.leds.top": "Top LEDs:",
  "calibration.leds.right": "Right LEDs:",
  "calibration.leds.bottom": "Bottom LEDs:",
  "calibration.leds.left": "Left LEDs:",
  "calibration.offset": "LED Offset:",
  "calibration.offset.hint": "Distance from physical LED 0 to the start corner (along strip direction)",
  "calibration.skip_start": "Skip LEDs (Start):",
  "calibration.skip_start.hint": "Number of LEDs to turn off at the beginning of the strip (0 = none)",
  "calibration.skip_end": "Skip LEDs (End):",
  "calibration.skip_end.hint": "Number of LEDs to turn off at the end of the strip (0 = none)",
  "calibration.border_width": "Border (px):",
  "calibration.border_width.hint": "How many pixels from the screen edge to sample for LED colors (1-100)",
  "calibration.button.cancel": "Cancel",
  "calibration.button.save": "Save",
  "calibration.saved": "Calibration saved",
  "calibration.failed": "Failed to save calibration",
  "server.healthy": "Server online",
  "server.offline": "Server offline",
  "error.unauthorized": "Unauthorized - please login",
  "error.network": "Network error",
  "error.unknown": "An error occurred",
  "modal.discard_changes": "You have unsaved changes. Discard them?",
  "confirm.title": "Confirm Action",
  "confirm.yes": "Yes",
  "confirm.no": "No",
  "confirm.stop_all": "Stop all running targets?",
  "confirm.turn_off_device": "Turn off this device?",
  "common.loading": "Loading...",
  "common.delete": "Delete",
  "common.remove": "Remove",
  "common.edit": "Edit",
  "common.clone": "Clone",
  "common.hide": "Hide card",
  "common.more_actions": "More actions",
  "common.card_color": "Card color",
  "common.none": "None",
  "common.none_no_cspt": "None (no processing template)",
  "common.none_no_input": "None (no input source)",
  "common.none_own_speed": "None (no sync)",
  "common.undo": "Undo",
  "common.cancel": "Cancel",
  "common.apply": "Apply",
  "common.start": "START",
  "common.stop": "STOP",
  "common.led_preview": "LED Preview",
  "device.icon.eyebrow": "Card icon",
  "device.icon.title": "Choose an icon",
  "device.icon.for": "for",
  "device.icon.choose": "Choose icon…",
  "device.icon.change": "Change icon…",
  "device.icon.remove": "Remove icon",
  "device.icon.search.placeholder": "Search icons…",
  "device.icon.color_toggle": "Color",
  "device.icon.recent": "Recent",
  "device.icon.empty": "No icons match.",
  "device.icon.hint": "↵ Apply  ·  Esc Cancel",
  "device.icon.saved": "Icon saved",
  "device.icon.error.save_failed": "Failed to save icon",
  "device.icon.cat.all": "All",
  "device.icon.cat.hardware": "Hardware",
  "device.icon.cat.lighting": "Lighting",
  "device.icon.cat.rooms": "Rooms",
  "device.icon.cat.media": "Media",
  "device.icon.cat.signal": "Signal",
  "device.icon.cat.ambience": "Ambience",
  "device.icon.cat.weather": "Weather",
  "device.icon.cat.nature": "Nature",
  "device.icon.cat.controls": "Controls",
  "device.icon.cat.status": "Status",
  "device.icon.cat.office": "Office",
  "device.icon.phone": "Phone",
  "device.icon.package": "Device unit",
  "device.icon.code": "Code",
  "device.icon.laptop": "Laptop",
  "device.icon.server": "Server",
  "device.icon.router": "Router",
  "device.icon.webcam": "Webcam",
  "device.icon.bot": "Bot",
  "device.icon.watch": "Smartwatch",
  "device.icon.mcu": "Microcontroller",
  "device.icon.dim": "Dim light",
  "device.icon.ring": "Ring light",
  "device.icon.point": "Point light",
  "device.icon.ceiling": "Ceiling light",
  "device.icon.desk_lamp": "Desk lamp",
  "device.icon.wall_light": "Wall light",
  "device.icon.flashlight": "Flashlight",
  "device.icon.bulb_off": "Bulb off",
  "device.icon.candle": "Candle",
  "device.icon.kitchen": "Kitchen",
  "device.icon.bath": "Bathroom",
  "device.icon.garage": "Garage",
  "device.icon.outdoor": "Outdoor",
  "device.icon.projector": "Projector",
  "device.icon.camcorder": "Camcorder",
  "device.icon.disc": "Disc",
  "device.icon.image": "Image",
  "device.icon.audio_file": "Audio file",
  "device.icon.send": "Send",
  "device.icon.rain": "Rain",
  "device.icon.snow": "Snow",
  "device.icon.thunder": "Thunder",
  "device.icon.fog": "Fog",
  "device.icon.wind": "Wind",
  "device.icon.snowflake": "Snowflake",
  "device.icon.umbrella": "Umbrella",
  "device.icon.sunrise": "Sunrise",
  "device.icon.sunset": "Sunset",
  "device.icon.tree": "Tree",
  "device.icon.flower": "Flower",
  "device.icon.mountain": "Mountain",
  "device.icon.waves": "Waves",
  "device.icon.sprout": "Sprout",
  "device.icon.water_drops": "Water drops",
  "device.icon.leaf": "Leaf",
  "device.icon.switch": "Switch",
  "device.icon.slider": "Slider",
  "device.icon.settings": "Settings",
  "device.icon.refresh": "Refresh",
  "device.icon.undo": "Undo",
  "device.icon.trash": "Trash",
  "device.icon.link": "Link",
  "device.icon.search": "Search",
  "device.icon.add": "Add",
  "device.icon.show": "Show",
  "device.icon.lock": "Lock",
  "device.icon.key": "Key",
  "device.icon.tool": "Tool",
  "device.icon.check": "Check",
  "device.icon.ok": "OK",
  "device.icon.warning": "Warning",
  "device.icon.help": "Help",
  "device.icon.off": "Disabled",
  "device.icon.shield": "Shield",
  "device.icon.target": "Target",
  "device.icon.pulse": "Pulse",
  "device.icon.trend": "Trending",
  "device.icon.battery": "Battery",
  "device.icon.calendar": "Calendar",
  "device.icon.mail": "Mail",
  "device.icon.coffee": "Coffee",
  "device.icon.briefcase": "Briefcase",
  "device.icon.doc": "Document",
  "device.icon.checklist": "Checklist",
  "device.icon.hashtag": "Hashtag",
  "device.icon.clock": "Clock",
  "device.icon.entity.device": "Device",
  "device.icon.entity.target": "LED target",
  "device.icon.entity.ha_light_target": "HA light target",
  "device.icon.entity.picture_source": "Picture source",
  "device.icon.entity.audio_source": "Audio source",
  "device.icon.entity.weather_source": "Weather source",
  "device.icon.entity.value_source": "Value source",
  "device.icon.entity.mqtt_source": "MQTT source",
  "device.icon.entity.ha_source": "Home Assistant source",
  "device.icon.entity.automation": "Automation",
  "device.icon.entity.scene_preset": "Scene preset",
  "device.icon.entity.sync_clock": "Sync clock",
  "device.icon.entity.game_integration": "Game integration",
  "device.icon.entity.audio_processing_template": "Audio processing template",
  "device.icon.entity.pattern_template": "Pattern template",
  "device.icon.entity.capture_template": "Capture template",
  "device.icon.entity.pp_template": "Post-processing template",
  "device.icon.entity.cspt": "Color-strip processing template",
  "device.icon.entity.audio_template": "Audio template",
  "device.icon.entity.gradient": "Gradient",
  "device.icon.entity.color_strip_source": "Color strip",
  "device.icon.entity.asset": "Asset",
  "device.icon.inherited_from": "Inherited from %s",
  "device.icon.override_inherited": "Override inherited icon…",
  "device.icon.use_inherited": "Use inherited",
  "validation.required": "This field is required",
  "bulk.processing": "Processing…",
  "api.error.timeout": "Request timed out — please try again",
  "api.error.network": "Network error — check your connection",
  "palette.search": "Search…",
  "section.filter.placeholder": "Filter...",
  "section.filter.reset": "Clear filter",
  "section.hide": "Hide",
  "section.show_hidden": "Show hidden cards",
  "tags.label": "Tags",
  "tags.hint": "Assign tags for grouping and filtering cards",
  "tags.placeholder": "Add tag...",
  "section.expand_all": "Expand all sections",
  "section.collapse_all": "Collapse all sections",
  "streams.title": "Inputs",
  "integrations.title": "Integrations",
  "streams.description": "Sources define the capture pipeline. A raw source captures from a display using a capture template. A processed source applies postprocessing to another source. Assign sources to devices.",
  "streams.group.raw": "Sources",
  "streams.group.raw_templates": "Engine Templates",
  "streams.group.processed": "Sources",
  "streams.group.proc_templates": "Filter Templates",
  "streams.group.css_processing": "Processing Templates",
  "streams.group.color_strip": "Color Strips",
  "streams.group.audio": "Audio",
  "streams.group.audio_templates": "Audio Templates",
  "streams.section.streams": "Sources",
  "streams.add": "Add Source",
  "streams.add.raw": "Add Screen Capture",
  "streams.add.processed": "Add Processed Source",
  "streams.edit": "Edit Source",
  "streams.edit.raw": "Edit Screen Capture",
  "streams.edit.processed": "Edit Processed Source",
  "streams.name": "Source Name:",
  "streams.name.placeholder": "My Source",
  "streams.type": "Type:",
  "streams.type.raw": "Screen Capture",
  "streams.type.processed": "Processed",
  "streams.display": "Display:",
  "streams.display.hint": "Which screen to capture",
  "streams.capture_template": "Engine Template:",
  "streams.capture_template.hint": "Engine template defining how the screen is captured",
  "streams.target_fps": "Target FPS:",
  "streams.target_fps.hint": "Target frames per second for capture (1-90)",
  "streams.source": "Source:",
  "streams.source.hint": "The source to apply processing filters to",
  "streams.pp_template": "Filter Template:",
  "streams.pp_template.hint": "Filter template to apply to the source",
  "streams.description_label": "Description (optional):",
  "streams.description_placeholder": "Describe this source...",
  "streams.created": "Source created successfully",
  "streams.updated": "Source updated successfully",
  "streams.deleted": "Source deleted successfully",
  "streams.delete.confirm": "Are you sure you want to delete this source?",
  "streams.modal.loading": "Loading...",
  "streams.error.load": "Failed to load sources",
  "streams.error.required": "Please fill in all required fields",
  "streams.error.delete": "Failed to delete source",
  "streams.test.title": "Test Source",
  "streams.test.run": "Run",
  "streams.test.running": "Testing source...",
  "streams.test.duration": "Capture Duration (s):",
  "streams.test.error.failed": "Source test failed",
  "postprocessing.title": "Filter Templates",
  "postprocessing.description": "Processing templates define image filters and color correction. Assign them to processed picture sources for consistent postprocessing across devices.",
  "postprocessing.add": "Add Filter Template",
  "postprocessing.edit": "Edit Filter Template",
  "postprocessing.name": "Template Name:",
  "postprocessing.name.placeholder": "My Filter Template",
  "filters.select_type": "Select filter type...",
  "filters.add": "Add Filter",
  "filters.remove": "Remove",
  "filters.drag_to_reorder": "Drag to reorder",
  "filters.empty": "No filters added. Use the selector below to add filters.",
  "filters.brightness": "Brightness",
  "filters.brightness.desc": "Adjust overall image brightness",
  "filters.saturation": "Saturation",
  "filters.saturation.desc": "Boost or reduce color intensity",
  "filters.gamma": "Gamma",
  "filters.gamma.desc": "Non-linear brightness curve correction",
  "filters.downscaler": "Downscaler",
  "filters.downscaler.desc": "Reduce resolution for faster processing",
  "filters.pixelate": "Pixelate",
  "filters.pixelate.desc": "Mosaic-style block averaging",
  "filters.auto_crop": "Auto Crop",
  "filters.auto_crop.desc": "Remove black bars from letterboxed content",
  "filters.flip": "Flip",
  "filters.flip.desc": "Mirror image horizontally or vertically",
  "filters.color_correction": "Color Correction",
  "filters.color_correction.desc": "White balance and color temperature",
  "filters.filter_template": "Filter Template",
  "filters.filter_template.desc": "Embed another processing template",
  "filters.css_filter_template": "Strip Filter Template",
  "filters.css_filter_template.desc": "Embed another strip processing template",
  "filters.frame_interpolation": "Frame Interpolation",
  "filters.frame_interpolation.desc": "Blend between frames for smoother output",
  "filters.noise_gate": "Noise Gate",
  "filters.noise_gate.desc": "Suppress small color changes below threshold",
  "filters.palette_quantization": "Palette Quantization",
  "filters.palette_quantization.desc": "Reduce colors to a limited palette",
  "filters.reverse": "Reverse",
  "filters.reverse.desc": "Reverse the LED order in the strip",
  "filters.hsl_shift": "HSL Shift",
  "filters.hsl_shift.desc": "Shift hue, saturation, and lightness values",
  "filters.contrast": "Contrast",
  "filters.contrast.desc": "Adjust image contrast around mid-gray",
  "filters.temporal_blur": "Temporal Blur",
  "filters.temporal_blur.desc": "Smooth color transitions over time",
  "filters.audio_filter_template.desc": "Embed another audio processing template",
  "filters.channel_extract.desc": "Select mono, left, or right channel",
  "filters.band_extract.desc": "Filter to bass, mid, treble, or custom frequency range",
  "filters.peak_hold.desc": "Retain peak values with configurable decay",
  "filters.gain.desc": "Amplify or attenuate signal levels",
  "filters.envelope_follower.desc": "Smooth amplitude with attack/release times",
  "filters.spectral_smoothing.desc": "Extra smoothing on spectrum data over time",
  "filters.compressor.desc": "Reduce dynamic range above threshold",
  "filters.inverter.desc": "Invert all levels (1 minus value)",
  "filters.beat_gate.desc": "Pass signal only around detected beats",
  "filters.delay.desc": "Time-shift the audio analysis by a delay",
  "filters.auto_gain.desc": "Auto-normalize audio levels to use full range",
  "postprocessing.description_label": "Description (optional):",
  "postprocessing.description_placeholder": "Describe this template...",
  "postprocessing.created": "Template created successfully",
  "postprocessing.updated": "Template updated successfully",
  "postprocessing.deleted": "Template deleted successfully",
  "postprocessing.delete.confirm": "Are you sure you want to delete this filter template?",
  "postprocessing.error.load": "Failed to load processing templates",
  "postprocessing.error.required": "Please fill in all required fields",
  "postprocessing.error.delete": "Failed to delete processing template",
  "postprocessing.config.show": "Show settings",
  "postprocessing.test.title": "Test Filter Template",
  "postprocessing.test.source_stream": "Source:",
  "postprocessing.test.running": "Testing processing template...",
  "postprocessing.test.error.no_stream": "Please select a source",
  "postprocessing.test.error.failed": "Processing template test failed",
  "css_processing.title": "Strip Processing Templates",
  "css_processing.add": "Add Strip Processing Template",
  "css_processing.edit": "Edit Strip Processing Template",
  "css_processing.name": "Template Name:",
  "css_processing.name_placeholder": "My Strip Processing Template",
  "css_processing.description_label": "Description (optional):",
  "css_processing.description_placeholder": "Describe this template...",
  "css_processing.created": "Strip processing template created",
  "css_processing.updated": "Strip processing template updated",
  "css_processing.deleted": "Strip processing template deleted",
  "css_processing.delete.confirm": "Are you sure you want to delete this strip processing template?",
  "css_processing.error.required": "Please fill in all required fields",
  "css_processing.error.load": "Error loading strip processing template",
  "css_processing.error.delete": "Error deleting strip processing template",
  "css_processing.error.clone_failed": "Failed to clone strip processing template",
  "device.button.stream_selector": "Source Settings",
  "device.stream_settings.title": "Source Settings",
  "device.stream_selector.label": "Source:",
  "device.stream_selector.hint": "Select a source that defines what this device captures and processes",
  "device.stream_selector.none": "-- No source assigned --",
  "device.stream_selector.saved": "Source settings updated",
  "device.stream_settings.border_width": "Border Width (px):",
  "device.stream_settings.border_width_hint": "How many pixels from the screen edge to sample for LED colors (1-100)",
  "device.stream_settings.interpolation": "Interpolation Mode:",
  "device.stream_settings.interpolation.average": "Average",
  "device.stream_settings.interpolation.median": "Median",
  "device.stream_settings.interpolation.dominant": "Dominant",
  "device.stream_settings.interpolation_hint": "How to calculate LED color from sampled pixels",
  "device.stream_settings.smoothing": "Smoothing:",
  "device.stream_settings.smoothing_hint": "Temporal blending between frames (0=none, 1=full). Reduces flicker.",
  "device.tip.stream_selector": "Configure picture source and LED projection settings for this device",
  "streams.group.static_image": "Static Image",
  "streams.add.static_image": "Add Static Image Source",
  "streams.edit.static_image": "Edit Static Image Source",
  "streams.type.static_image": "Static Image",
  "streams.group.video": "Video",
  "streams.add.video": "Add Video Source",
  "streams.edit.video": "Edit Video Source",
  "picture_source.type.video": "Video",
  "picture_source.type.video.desc": "Stream frames from an uploaded video asset",
  "picture_source.video.loop": "Loop:",
  "picture_source.video.speed": "Playback Speed:",
  "picture_source.video.start_time": "Start Time (s):",
  "picture_source.video.end_time": "End Time (s):",
  "picture_source.video.resolution_limit": "Max Width (px):",
  "picture_source.video.resolution_limit.hint": "Downscale video at decode time for performance",
  "streams.image_asset": "Image Asset:",
  "streams.image_asset.select": "Select image asset…",
  "streams.image_asset.search": "Search image assets…",
  "streams.video_asset": "Video Asset:",
  "streams.video_asset.select": "Select video asset…",
  "streams.video_asset.search": "Search video assets…",
  "targets.title": "Channels",
  "targets.description": "Targets bridge color strip sources to output devices. Each target references a device and a color strip source.",
  "targets.subtab.wled": "LED",
  "targets.subtab.led": "LED",
  "targets.section.devices": "Devices",
  "targets.section.color_strips": "Color Strip Sources",
  "targets.section.targets": "Targets",
  "targets.section.specific_settings": "Specific Settings",
  "targets.section.advanced": "Advanced",
  "targets.add": "Add Target",
  "targets.edit": "Edit Target",
  "targets.loading": "Loading targets...",
  "targets.none": "No targets configured",
  "targets.failed": "Failed to load targets",
  "targets.name": "Target Name:",
  "targets.name.placeholder": "My Target",
  "targets.device": "Device:",
  "targets.device.hint": "Select the LED device to send data to",
  "targets.device.none": "-- Select a device --",
  "targets.color_strip_source": "Color Strip Source:",
  "targets.color_strip_source.hint": "Select the color strip source that provides LED colors for this target",
  "targets.no_css": "No source",
  "targets.source": "Source:",
  "targets.source.hint": "Which picture source to capture and process",
  "targets.source.none": "-- No source assigned --",
  "targets.fps": "Target FPS:",
  "targets.fps.hint": "Target frames per second for capture and LED updates (1-90)",
  "targets.fps.rec": "Hardware max ≈ {fps} fps ({leds} LEDs)",
  "targets.border_width": "Border Width (px):",
  "targets.border_width.hint": "How many pixels from the screen edge to sample for LED colors (1-100)",
  "targets.interpolation": "Interpolation Mode:",
  "targets.interpolation.hint": "How to calculate LED color from sampled pixels",
  "targets.interpolation.average": "Average",
  "targets.interpolation.median": "Median",
  "targets.interpolation.dominant": "Dominant",
  "targets.smoothing": "Smoothing:",
  "targets.smoothing.hint": "Temporal blending between frames (0=none, 1=full). Reduces flicker.",
  "targets.keepalive_interval": "Keep Alive Interval:",
  "targets.keepalive_interval.hint": "How often to resend the last frame when the source is static, keeping the device in live mode (0.5-5.0s)",
  "targets.created": "Target created successfully",
  "targets.updated": "Target updated successfully",
  "targets.deleted": "Target deleted successfully",
  "targets.delete.confirm": "Are you sure you want to delete this target?",
  "targets.error.load": "Failed to load targets",
  "targets.error.required": "Please fill in all required fields",
  "targets.error.name_required": "Please enter a target name",
  "targets.error.delete": "Failed to delete target",
  "targets.button.start": "Start",
  "targets.button.stop": "Stop",
  "targets.status.processing": "Processing",
  "targets.status.idle": "Idle",
  "targets.status.error": "Error",
  "targets.metrics.actual_fps": "Actual FPS",
  "targets.metrics.target_fps": "Target FPS",
  "targets.metrics.frames": "Frames",
  "targets.metrics.errors": "Errors",
  "targets.section.pattern_templates": "Pattern Templates",
  "pattern.add": "Add Pattern Template",
  "pattern.edit": "Edit Pattern Template",
  "pattern.name": "Template Name:",
  "pattern.name.placeholder": "My Pattern Template",
  "pattern.description_label": "Description (optional):",
  "pattern.description_placeholder": "Describe this pattern...",
  "pattern.rectangles": "Rectangles",
  "pattern.rect.name": "Name",
  "pattern.rect.x": "X",
  "pattern.rect.y": "Y",
  "pattern.rect.width": "W",
  "pattern.rect.height": "H",
  "pattern.rect.add": "Add Rectangle",
  "pattern.rect.remove": "Remove",
  "pattern.rect.empty": "No rectangles defined. Add at least one rectangle.",
  "pattern.created": "Pattern template created successfully",
  "pattern.updated": "Pattern template updated successfully",
  "pattern.deleted": "Pattern template deleted successfully",
  "pattern.delete.confirm": "Are you sure you want to delete this pattern template?",
  "pattern.delete.referenced": "Cannot delete: this template is referenced by a target",
  "pattern.error.required": "Please fill in all required fields",
  "pattern.visual_editor": "Visual Editor",
  "pattern.capture_bg": "Capture Background",
  "pattern.source_for_bg": "Source for Background:",
  "pattern.source_for_bg.none": "-- Select source --",
  "pattern.delete_selected": "Delete Selected",
  "pattern.name.hint": "A descriptive name for this rectangle layout",
  "pattern.description.hint": "Optional notes about where or how this pattern is used",
  "pattern.visual_editor.hint": "Click + buttons to add rectangles. Drag edges to resize, drag inside to move.",
  "pattern.rectangles.hint": "Fine-tune rectangle positions and sizes with exact coordinates (0.0 to 1.0)",
  "overlay.toggle": "Toggle screen overlay",
  "overlay.button.show": "Show overlay visualization",
  "overlay.button.hide": "Hide overlay visualization",
  "overlay.started": "Overlay visualization started",
  "overlay.stopped": "Overlay visualization stopped",
  "overlay.error.start": "Failed to start overlay",
  "overlay.error.stop": "Failed to stop overlay",
  "sidebar.workspaces": "Workspaces",
  "sidebar.load": "Load",
  "sidebar.fps": "FPS",
  "transport.status.ready": "Ready",
  "transport.status.armed": "Armed · {n} live",
  "transport.meta.uptime": "Uptime",
  "transport.meta.cpu": "CPU",
  "transport.meta.mem": "Mem",
  "transport.meta.poll": "Poll",
  "transport.meta.poll_hint": "Poll interval (click to cycle: 1s → 2s → 5s → 10s)",
  "dashboard.title": "Dashboard",
  "dashboard.section.targets": "Channels",
  "dashboard.section.running": "Running",
  "dashboard.section.stopped": "Stopped",
  "dashboard.no_targets": "No targets configured",
  "dashboard.uptime": "Uptime",
  "dashboard.fps": "FPS",
  "dashboard.errors": "Errors",
  "dashboard.device": "Device",
  "dashboard.stop_all": "Stop All",
  "dashboard.failed": "Failed to load dashboard",
  "dashboard.section.automations": "Automations",
  "dashboard.section.scenes": "Scene Presets",
  "dashboard.section.sync_clocks": "Sync Clocks",
  "dashboard.targets": "Targets",
  "dashboard.section.performance": "System Performance",
  "dashboard.section.integrations": "Integrations",
  "dashboard.integrations.entities": "entities",
  "dashboard.integrations.no_sources": "No integration sources configured",
  "dashboard.perf.active_patches": "Active Patches",
  "dashboard.perf.patches.empty.idle": "Ready to launch",
  "dashboard.perf.patches.empty.none": "No patches yet",
  "dashboard.perf.total_fps": "Total FPS",
  "dashboard.perf.total_capture_fps": "Total Source FPS",
  "dashboard.perf.total_capture_fps_actual": "Total Capture FPS",
  "dashboard.perf.network": "Network",
  "dashboard.perf.device_latency": "Device Latency",
  "dashboard.perf.send_timing": "Send Timing",
  "dashboard.perf.errors": "Errors",
  "dashboard.perf.devices": "Devices",
  "dashboard.perf.cpu": "CPU",
  "dashboard.perf.ram": "RAM",
  "dashboard.perf.gpu": "GPU",
  "dashboard.perf.temp": "Temperature",
  "dashboard.perf.temp.install_lhm": "Windows has no built-in CPU temperature API. Install LibreHardwareMonitor and enable \"Publish to WMI\" to see live readings here.",
  "dashboard.perf.unavailable": "unavailable",
  "dashboard.perf.color": "Chart color",
  "dashboard.perf.mode.system": "System",
  "dashboard.perf.mode.app": "App",
  "dashboard.perf.mode.both": "Both",
  "dashboard.poll_interval": "Refresh interval",
  "dashboard.customize.title": "Customize Dashboard",
  "dashboard.customize.presets": "Presets",
  "dashboard.customize.preset.studio": "Studio",
  "dashboard.customize.preset.operator": "Operator",
  "dashboard.customize.preset.showrunner": "Showrunner",
  "dashboard.customize.preset.diagnostics": "Diagnostics",
  "dashboard.customize.preset.tv": "TV",
  "dashboard.customize.modified": "Modified",
  "dashboard.customize.global": "Global",
  "dashboard.customize.width": "Width",
  "dashboard.customize.width.full": "Full",
  "dashboard.customize.width.centered": "Centered",
  "dashboard.customize.width.narrow": "Narrow",
  "dashboard.customize.anim": "Animations",
  "dashboard.customize.anim.full": "Full",
  "dashboard.customize.anim.reduced": "Reduced",
  "dashboard.customize.anim.off": "Off",
  "dashboard.customize.perf_mode": "Perf mode",
  "dashboard.customize.sections": "Sections",
  "dashboard.customize.perf_cells": "Performance Strip",
  "dashboard.customize.fixed_top": "Pinned to top",
  "dashboard.customize.drag_help": "Drag rows to reorder, or use the ↑/↓ buttons.",
  "dashboard.customize.cell_drag_help": "Drag a row to change cell order in the Performance strip on the dashboard.",
  "dashboard.customize.window": "Sample window",
  "dashboard.customize.scale": "Y-axis scale",
  "dashboard.customize.mode_short": "MODE",
  "dashboard.customize.window_short": "WIN",
  "dashboard.customize.scale_short": "SCL",
  "dashboard.customize.density.comfortable": "Comfortable",
  "dashboard.customize.density.compact": "Compact",
  "dashboard.customize.density.dense": "Dense",
  "card_mode.tooltip": "Card size",
  "card_mode.comfortable": "Comfortable",
  "card_mode.compact": "Compact",
  "card_mode.dense": "Dense",
  "card_mode.row": "List",
  "dashboard.customize.collapse_default.on": "Start collapsed",
  "dashboard.customize.collapse_default.off": "Start expanded",
  "dashboard.customize.show": "Show",
  "dashboard.customize.hide": "Hide",
  "dashboard.customize.mode.inherit": "Inherit",
  "dashboard.customize.mode.system": "Sys",
  "dashboard.customize.mode.app": "App",
  "dashboard.customize.mode.both": "Both",
  "dashboard.customize.yscale.auto": "Auto",
  "dashboard.customize.yscale.fixed": "Fixed",
  "dashboard.customize.yscale.log": "Log",
  "dashboard.customize.export": "Export",
  "dashboard.customize.import": "Import",
  "dashboard.customize.reset": "Reset",
  "dashboard.customize.reset_confirm": "Reset dashboard layout to the Studio preset?",
  "dashboard.customize.exported": "Layout exported",
  "dashboard.customize.imported": "Layout imported",
  "dashboard.customize.import_failed": "Failed to import layout",
  "automations.title": "Automations",
  "automations.empty": "No automations configured. Create one to automate scene activation.",
  "automations.add": "Add Automation",
  "automations.edit": "Edit Automation",
  "automations.delete.confirm": "Delete automation \"{name}\"?",
  "automations.section.triggers": "Triggers",
  "automations.section.action": "Action",
  "automations.section.deactivation": "Deactivation",
  "automations.name": "Name:",
  "automations.name.hint": "A descriptive name for this automation",
  "automations.name.placeholder": "My Automation",
  "automations.enabled": "Enabled:",
  "automations.enabled.hint": "Disabled automations won't activate even when conditions are met",
  "automations.rule_logic": "Rule Logic:",
  "automations.rule_logic.hint": "How multiple rules are combined: ANY (OR) or ALL (AND)",
  "automations.rule_logic.or": "Any rule (OR)",
  "automations.rule_logic.and": "All rules (AND)",
  "automations.rule_logic.or.desc": "Triggers when any rule matches",
  "automations.rule_logic.and.desc": "Triggers only when all match",
  "automations.rules": "Rules:",
  "automations.rules.hint": "Rules that determine when this automation activates",
  "automations.rules.add": "Add Rule",
  "automations.rules.empty": "No rules — automation is always active when enabled",
  "automations.rule.startup": "Startup",
  "automations.rule.startup.desc": "On server start",
  "automations.rule.startup.hint": "Activates when the server starts and stays active while enabled.",
  "automations.rule.application": "Application",
  "automations.rule.application.desc": "App running/focused",
  "automations.rule.application.apps": "Applications:",
  "automations.rule.application.apps.hint": "Process names, one per line (e.g. firefox.exe)",
  "automations.rule.application.browse": "Browse",
  "automations.rule.application.search": "Filter processes...",
  "automations.rule.application.no_processes": "No processes found",
  "automations.rule.application.match_type": "Match Type:",
  "automations.rule.application.match_type.hint": "How to detect the application",
  "automations.rule.application.match_type.running": "Running",
  "automations.rule.application.match_type.running.desc": "Process is active",
  "automations.rule.application.match_type.topmost": "Topmost",
  "automations.rule.application.match_type.topmost.desc": "Foreground window",
  "automations.rule.application.match_type.topmost_fullscreen": "Topmost + FS",
  "automations.rule.application.match_type.topmost_fullscreen.desc": "Foreground + fullscreen",
  "automations.rule.application.match_type.fullscreen": "Fullscreen",
  "automations.rule.application.match_type.fullscreen.desc": "Any fullscreen app",
  "automations.rule.time_of_day": "Time of Day",
  "automations.rule.time_of_day.desc": "Time range",
  "automations.rule.time_of_day.start_time": "Start Time:",
  "automations.rule.time_of_day.end_time": "End Time:",
  "automations.rule.time_of_day.overnight_hint": "For overnight ranges (e.g. 22:00–06:00), set start time after end time.",
  "automations.rule.system_idle": "System Idle",
  "automations.rule.system_idle.desc": "User idle/active",
  "automations.rule.system_idle.idle_minutes": "Idle Timeout (minutes):",
  "automations.rule.system_idle.mode": "Trigger Mode:",
  "automations.rule.system_idle.when_idle": "When idle",
  "automations.rule.system_idle.when_idle.desc": "Fires once the user has been idle past the timeout",
  "automations.rule.system_idle.when_active": "When active",
  "automations.rule.system_idle.when_active.desc": "Fires while the user is actively using the system",
  "automations.rule.display_state": "Display State",
  "automations.rule.display_state.desc": "Monitor on/off",
  "automations.rule.display_state.state": "Monitor State:",
  "automations.rule.display_state.on": "On",
  "automations.rule.display_state.off": "Off (sleeping)",
  "automations.rule.mqtt": "MQTT",
  "automations.rule.mqtt.desc": "MQTT message",
  "automations.rule.mqtt.topic": "Topic:",
  "automations.rule.mqtt.payload": "Payload:",
  "automations.rule.mqtt.match_mode": "Match Mode:",
  "automations.rule.mqtt.match_mode.exact": "Exact",
  "automations.rule.mqtt.match_mode.contains": "Contains",
  "automations.rule.mqtt.match_mode.regex": "Regex",
  "automations.rule.mqtt.hint": "Activate when an MQTT topic receives a matching payload",
  "automations.rule.webhook": "Webhook",
  "automations.rule.webhook.desc": "HTTP callback",
  "automations.rule.webhook.hint": "Activate via an HTTP call from external services (Home Assistant, IFTTT, curl, etc.)",
  "automations.rule.webhook.url": "Webhook URL:",
  "automations.rule.webhook.copy": "Copy",
  "automations.rule.webhook.copied": "Copied!",
  "automations.rule.webhook.save_first": "Save the automation first to generate a webhook URL",
  "automations.scene": "Scene:",
  "automations.scene.hint": "Scene preset to activate when conditions are met",
  "automations.scene.search_placeholder": "Search scenes...",
  "automations.scene.none_selected": "None (no scene)",
  "automations.scene.none_available": "No scenes available",
  "automations.deactivation_mode": "Deactivation:",
  "automations.deactivation_mode.hint": "What happens when conditions stop matching",
  "automations.deactivation_mode.none": "None",
  "automations.deactivation_mode.none.desc": "Keep current state",
  "automations.deactivation_mode.revert": "Revert",
  "automations.deactivation_mode.revert.desc": "Restore previous state",
  "automations.deactivation_mode.fallback_scene": "Fallback",
  "automations.deactivation_mode.fallback_scene.desc": "Activate a fallback scene",
  "automations.deactivation_scene": "Fallback Scene:",
  "automations.deactivation_scene.hint": "Scene to activate when this automation deactivates",
  "automations.status.active": "Active",
  "automations.status.inactive": "Inactive",
  "automations.status.disabled": "Disabled",
  "automations.action.disable": "Disable",
  "automations.last_activated": "Last activated",
  "automations.logic.and": " AND ",
  "automations.logic.or": " OR ",
  "automations.logic.all": "ALL",
  "automations.logic.any": "ANY",
  "automations.updated": "Automation updated",
  "automations.created": "Automation created",
  "automations.deleted": "Automation deleted",
  "automations.error.name_required": "Name is required",
  "automations.error.clone_failed": "Failed to clone automation",
  "scenes.title": "Scenes",
  "scenes.add": "Capture Scene",
  "scenes.edit": "Edit Scene",
  "scenes.name": "Name:",
  "scenes.name.hint": "A descriptive name for this scene preset",
  "scenes.name.placeholder": "My Scene",
  "scenes.description": "Description:",
  "scenes.description.hint": "Optional description of what this scene does",
  "scenes.targets": "Targets:",
  "scenes.targets.hint": "Select which targets to include in this scene snapshot",
  "scenes.targets.add": "Add Target",
  "scenes.targets.search_placeholder": "Search targets...",
  "scenes.targets.empty": "No targets selected",
  "scenes.capture": "Capture",
  "scenes.activate": "Activate scene",
  "scenes.recapture": "Recapture current state",
  "scenes.action.activate": "Activate",
  "scenes.action.recapture": "Recapture",
  "scenes.status.preset": "Preset",
  "scenes.delete": "Delete scene",
  "scenes.targets_count": "targets",
  "scenes.captured": "Scene captured",
  "scenes.updated": "Scene updated",
  "scenes.activated": "Scene activated",
  "scenes.activated_partial": "Scene partially activated",
  "scenes.errors": "errors",
  "scenes.recaptured": "Scene recaptured",
  "scenes.deleted": "Scene deleted",
  "scenes.recapture_confirm": "Recapture current state into \"{name}\"?",
  "scenes.delete_confirm": "Delete scene \"{name}\"?",
  "scenes.error.name_required": "Name is required",
  "scenes.error.save_failed": "Failed to save scene",
  "scenes.error.activate_failed": "Failed to activate scene",
  "scenes.error.recapture_failed": "Failed to recapture scene",
  "scenes.error.delete_failed": "Failed to delete scene",
  "scenes.cloned": "Scene cloned",
  "scenes.error.clone_failed": "Failed to clone scene",
  "dashboard.type.led": "LED",
  "dashboard.type.kc": "Key Colors",
  "aria.close": "Close",
  "aria.save": "Save",
  "aria.cancel": "Cancel",
  "aria.previous": "Previous",
  "aria.next": "Next",
  "aria.hint": "Show hint",
  "color_strip.select_type": "Select Color Strip Type",
  "color_strip.add": "Add",
  "color_strip.edit": "Edit",
  "color_strip.name": "Name:",
  "color_strip.name.placeholder": "Wall Strip",
  "color_strip.picture_source": "Picture Source:",
  "color_strip.picture_source.hint": "Which screen capture source to use as input for LED color calculation",
  "color_strip.fps": "Target FPS:",
  "color_strip.fps.hint": "Target frames per second for LED color updates (10-90)",
  "color_strip.interpolation": "Color Mode:",
  "color_strip.interpolation.hint": "How to calculate LED color from sampled border pixels",
  "color_strip.interpolation.average": "Average",
  "color_strip.interpolation.median": "Median",
  "color_strip.interpolation.dominant": "Dominant",
  "color_strip.interpolation.average.desc": "Blend all sampled pixels into a smooth color",
  "color_strip.interpolation.median.desc": "Pick the middle color, reducing outliers",
  "color_strip.interpolation.dominant.desc": "Use the most frequent color in the sample",
  "color_strip.smoothing": "Smoothing:",
  "color_strip.smoothing.hint": "Temporal blending between frames (0=none, 1=full). Reduces flicker.",
  "color_strip.frame_interpolation": "Frame Interpolation:",
  "color_strip.frame_interpolation.hint": "Blends between consecutive captured frames to produce output at the full target FPS even when capture rate is lower. Reduces visible stepping on slow ambient transitions.",
  "color_strip.color_corrections": "Color Corrections",
  "color_strip.brightness": "Brightness:",
  "color_strip.brightness.hint": "Output brightness multiplier (0=off, 1=unchanged, 2=double). Applied after color extraction.",
  "color_strip.saturation": "Saturation:",
  "color_strip.saturation.hint": "Color saturation (0=grayscale, 1=unchanged, 2=double saturation)",
  "color_strip.gamma": "Gamma:",
  "color_strip.gamma.hint": "Gamma correction (1=none, <1=brighter midtones, >1=darker midtones)",
  "color_strip.test_device": "Test on Device:",
  "color_strip.test_device.hint": "Select a device to send test pixels to when clicking edge toggles",
  "color_strip.leds": "LED count",
  "color_strip.led_count": "LED Count:",
  "color_strip.led_count.hint": "Total number of LEDs on the physical strip. For screen sources: 0 = auto from calibration (extra LEDs not mapped to edges will be black). For static color: set to match your device LED count.",
  "color_strip.created": "Color strip source created",
  "color_strip.updated": "Color strip source updated",
  "color_strip.deleted": "Color strip source deleted",
  "color_strip.delete.confirm": "Are you sure you want to delete this color strip source?",
  "color_strip.delete.referenced": "Cannot delete: this source is in use by a target",
  "color_strip.error.name_required": "Please enter a name",
  "color_strip.type": "Type:",
  "color_strip.type.hint": "Picture Source derives LED colors from a screen capture. Static Color fills all LEDs with a single constant color. Gradient distributes a color gradient across all LEDs. Color Cycle smoothly cycles through a user-defined list of colors. Composite stacks multiple sources as blended layers. Audio Reactive drives LEDs from real-time audio input. API Input receives raw LED colors from external clients via REST or WebSocket.",
  "color_strip.type.picture": "Picture Source",
  "color_strip.type.picture.desc": "Colors from screen capture",
  "color_strip.type.picture_advanced": "Multi-Monitor",
  "color_strip.type.picture_advanced.desc": "Line-based calibration across monitors",
  "color_strip.type.static": "Static Color",
  "color_strip.type.static.desc": "Single solid color fill",
  "color_strip.type.gradient": "Gradient",
  "color_strip.type.gradient.desc": "Smooth color transition across LEDs",
  "color_strip.static_color": "Color:",
  "color_strip.static_color.hint": "The solid color that will be sent to all LEDs on the strip.",
  "color_strip.gradient.preview": "Gradient:",
  "color_strip.gradient.preview.hint": "Visual preview. Click the marker track below to add a stop. Drag markers to reposition.",
  "color_strip.gradient.easing": "Easing:",
  "color_strip.gradient.easing.hint": "Controls how colors blend between gradient stops.",
  "color_strip.gradient.easing.linear": "Linear",
  "color_strip.gradient.easing.linear.desc": "Constant-rate blending between stops",
  "color_strip.gradient.easing.ease_in_out": "Smooth",
  "color_strip.gradient.easing.ease_in_out.desc": "S-curve: slow start and end, fast middle",
  "color_strip.gradient.easing.step": "Step",
  "color_strip.gradient.easing.step.desc": "Hard jumps between colors with no blending",
  "color_strip.gradient.easing.cubic": "Cubic",
  "color_strip.gradient.easing.cubic.desc": "Cubic ease — accelerating blend curve",
  "color_strip.gradient.stops": "Color Stops:",
  "color_strip.gradient.stops.hint": "Each stop defines a color at a relative position (0.0 = start, 1.0 = end). The ↔ button adds a right-side color to create a hard edge at that stop.",
  "color_strip.gradient.stops_count": "stops",
  "color_strip.gradient.add_stop": "+ Add Stop",
  "color_strip.gradient.position": "Position (0.0–1.0)",
  "color_strip.gradient.bidir.hint": "Add a second color on the right side of this stop to create a hard edge in the gradient.",
  "color_strip.gradient.min_stops": "Gradient must have at least 2 stops",
  "color_strip.gradient.select": "Gradient:",
  "color_strip.gradient.select.hint": "Select a gradient from the library. Create and edit gradients in the Gradients tab.",
  "color_strip.gradient.error.no_gradient": "Please select a gradient",
  "color_strip.gradient.preset": "Preset:",
  "color_strip.gradient.preset.hint": "Load a predefined gradient palette. Selecting a preset replaces the current stops.",
  "color_strip.gradient.preset.custom": "— Custom —",
  "color_strip.gradient.preset.rainbow": "Rainbow",
  "color_strip.gradient.preset.sunset": "Sunset",
  "color_strip.gradient.preset.ocean": "Ocean",
  "color_strip.gradient.preset.forest": "Forest",
  "color_strip.gradient.preset.fire": "Fire",
  "color_strip.gradient.preset.lava": "Lava",
  "color_strip.gradient.preset.aurora": "Aurora",
  "color_strip.gradient.preset.ice": "Ice",
  "color_strip.gradient.preset.warm": "Warm",
  "color_strip.gradient.preset.cool": "Cool",
  "color_strip.gradient.preset.neon": "Neon",
  "color_strip.gradient.preset.pastel": "Pastel",
  "color_strip.gradient.preset.save_button": "Save as preset…",
  "color_strip.gradient.preset.save_prompt": "Enter a name for this preset:",
  "color_strip.gradient.preset.saved": "Preset saved",
  "color_strip.gradient.preset.deleted": "Preset deleted",
  "color_strip.gradient.preset.apply": "Apply",
  "color_strip.animation": "Animation",
  "color_strip.animation.type": "Effect:",
  "color_strip.animation.type.hint": "Animation effect to apply.",
  "color_strip.animation.type.none": "None (no animation effect)",
  "color_strip.animation.type.none.desc": "Static colors with no animation",
  "color_strip.animation.type.breathing": "Breathing",
  "color_strip.animation.type.breathing.desc": "Smooth brightness fade in and out",
  "color_strip.animation.type.gradient_shift": "Gradient Shift",
  "color_strip.animation.type.gradient_shift.desc": "Slides the gradient along the strip",
  "color_strip.animation.type.wave": "Wave",
  "color_strip.animation.type.wave.desc": "Sinusoidal brightness wave moving along the strip",
  "color_strip.animation.type.strobe": "Strobe",
  "color_strip.animation.type.strobe.desc": "Rapid on/off flashing",
  "color_strip.animation.type.sparkle": "Sparkle",
  "color_strip.animation.type.sparkle.desc": "Random LEDs flash briefly",
  "color_strip.animation.type.pulse": "Pulse",
  "color_strip.animation.type.pulse.desc": "Sharp brightness pulse with quick fade",
  "color_strip.animation.type.candle": "Candle",
  "color_strip.animation.type.candle.desc": "Warm flickering candle-like glow",
  "color_strip.animation.type.rainbow_fade": "Rainbow Fade",
  "color_strip.animation.type.rainbow_fade.desc": "Cycles through the entire hue spectrum",
  "color_strip.animation.type.noise_perturb": "Noise Perturb",
  "color_strip.animation.type.noise_perturb.desc": "Perturbs gradient stop positions with organic noise each frame",
  "color_strip.animation.type.hue_rotate": "Hue Rotate",
  "color_strip.animation.type.hue_rotate.desc": "Smoothly rotates all pixel hues while preserving saturation and brightness",
  "color_strip.animation.speed": "Speed:",
  "color_strip.animation.speed.hint": "Animation speed multiplier. 1.0 ≈ one cycle per second for Breathing; higher values cycle faster.",
  "color_strip.type.effect": "Effect",
  "color_strip.type.effect.desc": "Procedural effects like fire, plasma, aurora",
  "color_strip.type.effect.hint": "Procedural LED effects (fire, meteor, plasma, noise, aurora) generated in real time.",
  "color_strip.type.composite": "Composite",
  "color_strip.type.composite.desc": "Stack and blend multiple sources",
  "color_strip.type.composite.hint": "Stack multiple color strip sources as layers with blend modes and opacity.",
  "color_strip.type.mapped": "Mapped",
  "color_strip.type.mapped.desc": "Assign sources to LED zones",
  "color_strip.type.mapped.hint": "Assign different color strip sources to different LED ranges (zones). Unlike composite which blends layers, mapped places sources side-by-side.",
  "color_strip.type.audio": "Audio Reactive",
  "color_strip.type.audio.desc": "LEDs driven by audio input",
  "color_strip.type.audio.hint": "LED colors driven by real-time audio input — system audio or microphone.",
  "color_strip.type.api_input": "API Input",
  "color_strip.type.api_input.desc": "Receive colors from external apps",
  "color_strip.type.api_input.hint": "Receives raw LED color arrays from external clients via REST POST or WebSocket. Use this to integrate with custom software, home automation, or any system that can send HTTP requests.",
  "color_strip.api_input.fallback_color": "Fallback Color:",
  "color_strip.api_input.fallback_color.hint": "Color to display when no data has been received within the timeout period. LEDs will show this color on startup and after the connection is lost.",
  "color_strip.api_input.timeout": "Timeout (seconds):",
  "color_strip.api_input.timeout.hint": "How long to wait for new color data before reverting to the fallback color. Set to 0 to never time out.",
  "color_strip.api_input.endpoints": "Push Endpoints:",
  "color_strip.api_input.endpoints.hint": "Use these URLs to push LED color data from your external application. REST accepts JSON, WebSocket accepts both JSON and raw binary frames.",
  "color_strip.api_input.save_first": "Save the source first to see the push endpoint URLs.",
  "color_strip.api_input.interpolation": "LED Interpolation:",
  "color_strip.api_input.interpolation.hint": "How to resize incoming LED data when its count differs from the device's LED count. Linear gives smooth blending, Nearest preserves sharp edges, None truncates or zero-pads.",
  "color_strip.api_input.interpolation.linear": "Linear",
  "color_strip.api_input.interpolation.linear.desc": "Smooth blending between LEDs",
  "color_strip.api_input.interpolation.nearest": "Nearest",
  "color_strip.api_input.interpolation.nearest.desc": "Sharp edges, no blending",
  "color_strip.api_input.interpolation.none": "None",
  "color_strip.api_input.interpolation.none.desc": "Truncate or zero-pad",
  "color_strip.type.notification": "Notification",
  "color_strip.type.notification.desc": "One-shot effect on webhook trigger",
  "color_strip.type.notification.hint": "Fires a one-shot visual effect (flash, pulse, sweep) when triggered via a webhook. Designed for use as a composite layer over a persistent base source.",
  "color_strip.notification.os_listener": "Listen to OS Notifications:",
  "color_strip.notification.os_listener.hint": "When enabled, this source automatically fires when a desktop notification appears (Windows toast / Linux D-Bus). Requires the app to have notification access permission.",
  "color_strip.notification.effect": "Effect:",
  "color_strip.notification.effect.hint": "Visual effect when a notification fires. Flash fades linearly, Pulse uses a smooth bell curve, Sweep fills LEDs left-to-right then fades.",
  "color_strip.notification.effect.flash": "Flash",
  "color_strip.notification.effect.flash.desc": "Instant on, linear fade-out",
  "color_strip.notification.effect.pulse": "Pulse",
  "color_strip.notification.effect.pulse.desc": "Smooth bell-curve glow",
  "color_strip.notification.effect.sweep": "Sweep",
  "color_strip.notification.effect.sweep.desc": "Fills left-to-right then fades",
  "color_strip.notification.effect.chase": "Chase",
  "color_strip.notification.effect.chase.desc": "Light travels across strip and bounces back",
  "color_strip.notification.effect.gradient_flash": "Gradient Flash",
  "color_strip.notification.effect.gradient_flash.desc": "Bright center fades to edges, then all fades out",
  "color_strip.notification.duration": "Duration (ms):",
  "color_strip.notification.duration.hint": "How long the notification effect plays, in milliseconds.",
  "color_strip.notification.default_color": "Default Color:",
  "color_strip.notification.default_color.hint": "Color used when the notification has no app-specific color mapping.",
  "color_strip.notification.filter_mode": "App Filter:",
  "color_strip.notification.filter_mode.hint": "Filter notifications by app name. Off = accept all, Whitelist = only listed apps, Blacklist = all except listed apps.",
  "color_strip.notification.filter_mode.off": "Off",
  "color_strip.notification.filter_mode.whitelist": "Whitelist",
  "color_strip.notification.filter_mode.blacklist": "Blacklist",
  "color_strip.notification.filter_mode.off.desc": "Accept all notifications",
  "color_strip.notification.filter_mode.whitelist.desc": "Only listed apps",
  "color_strip.notification.filter_mode.blacklist.desc": "All except listed apps",
  "color_strip.notification.filter_list": "App List:",
  "color_strip.notification.filter_list.hint": "One app name per line. Use Browse to pick from running processes.",
  "color_strip.notification.filter_list.placeholder": "Discord\nSlack\nTelegram",
  "color_strip.notification.app_colors": "App Colors",
  "color_strip.notification.app_colors.label": "Color Mappings:",
  "color_strip.notification.app_colors.hint": "Per-app color overrides. Each row maps an app name to a specific notification color.",
  "color_strip.notification.app_colors.add": "+ Add Mapping",
  "color_strip.notification.app_overrides": "Per-App Overrides",
  "color_strip.notification.app_overrides.label": "App Overrides:",
  "color_strip.notification.app_overrides.hint": "Per-app overrides for color and sound. Each row can set a custom color, sound asset, and volume for a specific app.",
  "color_strip.notification.app_overrides.add": "+ Add Override",
  "color_strip.notification.app_overrides.app_placeholder": "App name",
  "color_strip.notification.sound": "Sound",
  "color_strip.notification.sound.asset": "Sound Asset:",
  "color_strip.notification.sound.asset.hint": "Pick a sound asset to play when a notification fires. Leave empty for silent.",
  "color_strip.notification.sound.none": "None (silent)",
  "color_strip.notification.sound.search": "Search sounds…",
  "color_strip.notification.sound.volume": "Volume:",
  "color_strip.notification.sound.volume.hint": "Global volume for notification sounds (0–100%).",
  "color_strip.notification.sound.app_sounds": "Per-App Sounds:",
  "color_strip.notification.sound.app_sounds.hint": "Override sound and volume for specific apps. Empty sound = mute that app.",
  "color_strip.notification.sound.app_sounds.add": "+ Add Override",
  "color_strip.notification.sound.app_name_placeholder": "App name",
  "color_strip.notification.endpoint": "Webhook Endpoint:",
  "color_strip.notification.endpoint.hint": "Use this URL to trigger notifications from external systems. POST with optional JSON body: {\"app\": \"AppName\", \"color\": \"#FF0000\"}.",
  "color_strip.notification.save_first": "Save the source first to see the webhook endpoint URL.",
  "color_strip.notification.app_count": "apps",
  "color_strip.notification.test": "Test notification",
  "color_strip.notification.test.ok": "Notification sent",
  "color_strip.notification.test.no_streams": "No running streams for this source",
  "color_strip.notification.test.error": "Failed to send notification",
  "color_strip.notification.history.title": "Notification History",
  "color_strip.notification.history.hint": "Recent OS notifications captured by the listener (newest first). Up to 50 entries.",
  "color_strip.notification.history.empty": "No notifications captured yet",
  "color_strip.notification.history.unavailable": "OS notification listener is not available on this platform",
  "color_strip.notification.history.error": "Failed to load notification history",
  "color_strip.notification.history.refresh": "Refresh",
  "color_strip.notification.history.unknown_app": "Unknown app",
  "color_strip.notification.history.fired": "Streams triggered",
  "color_strip.notification.history.filtered": "Streams filtered",
  "color_strip.test.title": "Test Preview",
  "color_strip.test.connecting": "Connecting...",
  "color_strip.test.error": "Failed to connect to preview stream",
  "color_strip.test.led_count": "LEDs:",
  "color_strip.test.fps": "FPS:",
  "color_strip.test.receive_fps": "Receive FPS",
  "color_strip.test.apply": "Apply",
  "color_strip.test.composite": "Composite",
  "color_strip.preview.title": "Live Preview",
  "color_strip.preview.not_connected": "Not connected",
  "color_strip.preview.connecting": "Connecting...",
  "color_strip.preview.connected": "Connected",
  "color_strip.preview.unsupported": "Preview not available for this source type",
  "color_strip.preview.save_first": "Save the source first — calibration is needed for preview",
  "color_strip.type.daylight": "Daylight Cycle",
  "color_strip.type.daylight.desc": "Simulates natural daylight over 24 hours",
  "color_strip.type.daylight.hint": "Simulates the sun's color temperature throughout a 24-hour day/night cycle — from warm sunrise to cool daylight to warm sunset and dim night.",
  "color_strip.daylight.speed": "Speed:",
  "color_strip.daylight.speed.hint": "Cycle speed multiplier. 1.0 = full day/night cycle in ~4 minutes. Higher values cycle faster.",
  "color_strip.daylight.use_real_time": "Use Real Time:",
  "color_strip.daylight.use_real_time.hint": "When enabled, LED color matches the actual time of day on this computer. Speed setting is ignored.",
  "color_strip.daylight.real_time": "Real Time",
  "color_strip.daylight.latitude": "Latitude:",
  "color_strip.daylight.latitude.hint": "Your geographic latitude (-90 to 90). Affects sunrise/sunset timing in real-time mode.",
  "color_strip.daylight.longitude": "Longitude:",
  "color_strip.daylight.longitude.hint": "Your geographic longitude (-180 to 180). Adjusts solar noon offset for accurate sunrise/sunset timing.",
  "color_strip.type.candlelight": "Candlelight",
  "color_strip.type.candlelight.desc": "Realistic flickering candle simulation",
  "color_strip.type.candlelight.hint": "Simulates realistic candle flickering across all LEDs with warm tones and organic flicker patterns.",
  "color_strip.type.key_colors": "Key Colors",
  "color_strip.type.key_colors.desc": "Extract colors from screen regions",
  "color_strip.key_colors.picture_source": "Picture Source:",
  "color_strip.key_colors.interpolation": "Color Mode:",
  "color_strip.key_colors.smoothing": "Smoothing:",
  "color_strip.key_colors.brightness": "Brightness:",
  "color_strip.key_colors.rectangles": "Screen Regions:",
  "color_strip.key_colors.no_rects": "No regions defined. Click Configure Regions to add.",
  "color_strip.key_colors.configure_regions": "Configure Regions",
  "color_strip.key_colors.mode.average": "Average",
  "color_strip.key_colors.mode.average.desc": "Mean color of all pixels in the region",
  "color_strip.key_colors.mode.median": "Median",
  "color_strip.key_colors.mode.median.desc": "Median color (less affected by outliers)",
  "color_strip.key_colors.mode.dominant": "Dominant",
  "color_strip.key_colors.mode.dominant.desc": "Most frequent color (K-means clustering)",
  "color_strip.key_colors.error.no_source": "Picture source is required",
  "color_strip.key_colors.error.no_rects": "At least one screen region is required",
  "color_strip.type.weather": "Weather",
  "color_strip.type.weather.desc": "Weather-reactive ambient colors",
  "color_strip.type.weather.hint": "Maps real-time weather conditions to ambient LED colors. Requires a Weather Source entity.",
  "color_strip.weather.source": "Weather Source:",
  "color_strip.weather.source.hint": "The weather data source to use for ambient colors. Create one in the Weather tab first.",
  "color_strip.weather.speed": "Animation Speed:",
  "color_strip.weather.speed.hint": "Speed of the ambient color drift animation. Higher = faster movement.",
  "color_strip.weather.temperature_influence": "Temperature Influence:",
  "color_strip.weather.temperature_influence.hint": "How much the current temperature shifts the palette warm/cool. 0 = pure condition colors, 1 = strong shift.",
  "color_strip.weather.error.no_source": "Please select a weather source",
  "color_strip.candlelight.color": "Base Color:",
  "color_strip.candlelight.color.hint": "The warm base color of the candle flame. Default is a natural warm amber.",
  "color_strip.candlelight.intensity": "Flicker Intensity:",
  "color_strip.candlelight.intensity.hint": "How much the candles flicker. Low values produce a gentle glow, high values simulate a windy candle.",
  "color_strip.candlelight.num_candles_label": "Number of Candles:",
  "color_strip.candlelight.num_candles": "candles",
  "color_strip.candlelight.num_candles.hint": "How many independent candle sources along the strip. Each flickers with its own pattern.",
  "color_strip.candlelight.speed": "Flicker Speed:",
  "color_strip.candlelight.speed.hint": "Speed of the flicker animation. Higher values produce faster, more restless flames.",
  "color_strip.candlelight.wind": "Wind:",
  "color_strip.candlelight.wind.hint": "Wind simulation strength. Higher values create correlated gusts that make all candles flicker together.",
  "color_strip.candlelight.type": "Candle Type:",
  "color_strip.candlelight.type.hint": "Preset that adjusts flicker behavior without changing other settings.",
  "color_strip.candlelight.type.default": "Default",
  "color_strip.candlelight.type.default.desc": "Standard candle flicker",
  "color_strip.candlelight.type.taper": "Taper",
  "color_strip.candlelight.type.taper.desc": "Tall, steady candle with reduced flicker",
  "color_strip.candlelight.type.votive": "Votive",
  "color_strip.candlelight.type.votive.desc": "Small, flickery candle with narrow glow",
  "color_strip.candlelight.type.bonfire": "Bonfire",
  "color_strip.candlelight.type.bonfire.desc": "Large, chaotic fire with extra warmth",
  "color_strip.type.processed": "Processed",
  "color_strip.type.processed.desc": "Apply a processing template to another source",
  "color_strip.type.processed.hint": "Wraps an existing color strip source and pipes its output through a filter chain.",
  "color_strip.processed.input": "Source:",
  "color_strip.processed.input.hint": "The color strip source whose output will be processed",
  "color_strip.processed.template": "Processing Template:",
  "color_strip.processed.template.hint": "Filter chain to apply to the input source output",
  "color_strip.processed.error.no_input": "Please select an input source",
  "color_strip.composite.layers": "Layers:",
  "color_strip.composite.layers.hint": "Stack multiple color strip sources. First layer is the bottom, last is the top. Each layer can have its own blend mode and opacity.",
  "color_strip.composite.add_layer": "Add Layer",
  "color_strip.composite.source": "Source",
  "color_strip.composite.blend_mode": "Blend",
  "color_strip.composite.blend_mode.normal": "Normal",
  "color_strip.composite.blend_mode.normal.desc": "Standard alpha blending",
  "color_strip.composite.blend_mode.add": "Add",
  "color_strip.composite.blend_mode.add.desc": "Brightens by adding colors",
  "color_strip.composite.blend_mode.multiply": "Multiply",
  "color_strip.composite.blend_mode.multiply.desc": "Darkens by multiplying colors",
  "color_strip.composite.blend_mode.screen": "Screen",
  "color_strip.composite.blend_mode.screen.desc": "Brightens, inverse of multiply",
  "color_strip.composite.blend_mode.override": "Override",
  "color_strip.composite.blend_mode.overlay": "Overlay",
  "color_strip.composite.blend_mode.overlay.desc": "Multiply darks, screen lights",
  "color_strip.composite.blend_mode.soft_light": "Soft Light",
  "color_strip.composite.blend_mode.soft_light.desc": "Gentle contrast adjustment",
  "color_strip.composite.blend_mode.hard_light": "Hard Light",
  "color_strip.composite.blend_mode.hard_light.desc": "Strong contrast, vivid colors",
  "color_strip.composite.blend_mode.difference": "Difference",
  "color_strip.composite.blend_mode.difference.desc": "Absolute color difference",
  "color_strip.composite.blend_mode.exclusion": "Exclusion",
  "color_strip.composite.blend_mode.exclusion.desc": "Like difference, lower contrast",
  "color_strip.composite.blend_mode.override.desc": "Black = transparent, bright = opaque",
  "color_strip.composite.opacity": "Opacity",
  "color_strip.composite.brightness": "Brightness",
  "color_strip.composite.brightness.none": "None (full brightness)",
  "color_strip.composite.processing": "Processing",
  "color_strip.composite.enabled": "Enabled",
  "color_strip.composite.error.min_layers": "At least 1 layer is required",
  "color_strip.composite.error.no_source": "Each layer must have a source selected",
  "color_strip.composite.layers_count": "layers",
  "color_strip.composite.range": "LED Range",
  "color_strip.composite.range_start": "Start",
  "color_strip.composite.range_end": "End",
  "color_strip.composite.reverse": "Reverse",
  "color_strip.mapped.zones": "Zones:",
  "color_strip.mapped.zones.hint": "Each zone maps a color strip source to a specific LED range. Zones are placed side-by-side — gaps between zones stay black.",
  "color_strip.mapped.add_zone": "+ Add Zone",
  "color_strip.mapped.zone_source": "Source",
  "color_strip.mapped.zone_start": "Start LED",
  "color_strip.mapped.zone_end": "End LED",
  "color_strip.mapped.zone_reverse": "Reverse",
  "color_strip.mapped.zones_count": "zones",
  "color_strip.mapped.select_source": "Search sources...",
  "color_strip.mapped.error.no_source": "Each zone must have a source selected",
  "color_strip.audio.visualization": "Visualization:",
  "color_strip.audio.visualization.hint": "How audio data is rendered to LEDs.",
  "color_strip.audio.viz.spectrum": "Spectrum Analyzer",
  "color_strip.audio.viz.spectrum.desc": "Frequency bars across the strip",
  "color_strip.audio.viz.beat_pulse": "Beat Pulse",
  "color_strip.audio.viz.beat_pulse.desc": "All LEDs pulse on the beat",
  "color_strip.audio.viz.vu_meter": "VU Meter",
  "color_strip.audio.viz.vu_meter.desc": "Volume level fills the strip",
  "color_strip.audio.viz.pulse_on_beat": "Pulse on Beat",
  "color_strip.audio.viz.pulse_on_beat.desc": "LEDs pulse with each detected beat",
  "color_strip.audio.viz.energy_gradient": "Energy Gradient",
  "color_strip.audio.viz.energy_gradient.desc": "Gradient intensity follows audio energy",
  "color_strip.audio.viz.spectrum_bands": "Spectrum Bands",
  "color_strip.audio.viz.spectrum_bands.desc": "Grouped frequency bands across the strip",
  "color_strip.audio.viz.strobe_on_drop": "Strobe on Drop",
  "color_strip.audio.viz.strobe_on_drop.desc": "Flash strobe effect on bass drops",
  "color_strip.audio.beat_decay": "Beat Decay:",
  "color_strip.audio.beat_decay.hint": "How quickly the beat pulse fades. Lower values = longer fade, higher = snappier response.",
  "color_strip.audio.source": "Audio Source:",
  "color_strip.audio.source.hint": "Audio source for this visualization. Can be a multichannel (device) or mono (single channel) source. Create and manage audio sources in the Sources tab.",
  "color_strip.audio.sensitivity": "Sensitivity:",
  "color_strip.audio.sensitivity.hint": "Gain multiplier for audio levels. Higher values make LEDs react to quieter sounds.",
  "color_strip.audio.smoothing": "Smoothing:",
  "color_strip.audio.smoothing.hint": "Temporal smoothing between frames. Higher values produce smoother but slower-reacting visuals.",
  "color_strip.audio.palette": "Palette:",
  "color_strip.audio.palette.hint": "Color palette used for spectrum bars or beat pulse coloring.",
  "color_strip.audio.color": "Base Color:",
  "color_strip.audio.color.hint": "Low-level color for VU meter bar.",
  "color_strip.audio.color_peak": "Peak Color:",
  "color_strip.audio.color_peak.hint": "High-level color at the top of the VU meter bar.",
  "color_strip.audio.mirror": "Mirror:",
  "color_strip.audio.mirror.hint": "Mirror spectrum from center outward: bass in the middle, treble at the edges.",
  "color_strip.effect.type": "Effect Type:",
  "color_strip.effect.type.hint": "Choose the procedural algorithm.",
  "color_strip.effect.fire": "Fire",
  "color_strip.effect.fire.desc": "Cellular automaton simulating rising flames with heat diffusion",
  "color_strip.effect.meteor": "Meteor",
  "color_strip.effect.meteor.desc": "Bright head travels along the strip with an exponential-decay tail",
  "color_strip.effect.plasma": "Plasma",
  "color_strip.effect.plasma.desc": "Overlapping sine waves mapped to a palette — classic demo-scene effect",
  "color_strip.effect.noise": "Noise",
  "color_strip.effect.noise.desc": "Scrolling fractal value noise mapped to a palette",
  "color_strip.effect.aurora": "Aurora",
  "color_strip.effect.aurora.desc": "Layered noise bands that drift and blend — northern lights style",
  "color_strip.effect.rain": "Rain",
  "color_strip.effect.rain.desc": "Raindrops fall down the strip with trailing tails",
  "color_strip.effect.comet": "Comet",
  "color_strip.effect.comet.desc": "Multiple comets with curved, pulsing tails",
  "color_strip.effect.bouncing_ball": "Bouncing Ball",
  "color_strip.effect.bouncing_ball.desc": "Physics-simulated balls bouncing with gravity",
  "color_strip.effect.fireworks": "Fireworks",
  "color_strip.effect.fireworks.desc": "Rockets launch and explode into colorful bursts",
  "color_strip.effect.sparkle_rain": "Sparkle Rain",
  "color_strip.effect.sparkle_rain.desc": "Twinkling star field with smooth fade-in/fade-out",
  "color_strip.effect.lava_lamp": "Lava Lamp",
  "color_strip.effect.lava_lamp.desc": "Slow-moving colored blobs that merge and separate",
  "color_strip.effect.wave_interference": "Wave Interference",
  "color_strip.effect.wave_interference.desc": "Two counter-propagating waves creating interference patterns",
  "color_strip.effect.custom_palette": "Custom Palette:",
  "color_strip.effect.custom_palette.hint": "JSON array of [position, R, G, B] stops, e.g. [[0,0,0,0],[0.5,255,0,0],[1,255,255,0]]",
  "color_strip.effect.speed": "Speed:",
  "color_strip.effect.speed.hint": "Speed multiplier for the effect animation (0.1 = very slow, 10.0 = very fast).",
  "color_strip.effect.palette": "Palette:",
  "color_strip.effect.palette.hint": "Color palette used to map effect values to RGB colors.",
  "color_strip.effect.color": "Meteor Color:",
  "color_strip.effect.color.hint": "Head color for the meteor effect.",
  "color_strip.effect.intensity": "Intensity:",
  "color_strip.effect.intensity.hint": "Effect intensity — controls spark rate (fire), tail decay (meteor), or brightness range (aurora).",
  "color_strip.effect.scale": "Scale:",
  "color_strip.effect.scale.hint": "Spatial scale — wave frequency (plasma), zoom level (noise), or band width (aurora).",
  "color_strip.effect.mirror": "Mirror:",
  "color_strip.effect.mirror.hint": "Bounce mode — the meteor reverses direction at strip ends instead of wrapping.",
  "color_strip.palette.fire": "Fire",
  "color_strip.palette.ocean": "Ocean",
  "color_strip.palette.lava": "Lava",
  "color_strip.palette.forest": "Forest",
  "color_strip.palette.rainbow": "Rainbow",
  "color_strip.palette.aurora": "Aurora",
  "color_strip.palette.sunset": "Sunset",
  "color_strip.palette.ice": "Ice",
  "color_strip.palette.custom": "Custom",
  "audio_source.title": "Audio Sources",
  "audio_source.add": "Add Audio Source",
  "audio_source.add.capture": "Add Capture Source",
  "audio_source.add.processed": "Add Processed Source",
  "audio_source.edit": "Edit Audio Source",
  "audio_source.edit.capture": "Edit Capture Source",
  "audio_source.edit.processed": "Edit Processed Source",
  "audio_source.name": "Name:",
  "audio_source.name.placeholder": "System Audio",
  "audio_source.name.hint": "A descriptive name for this audio source",
  "audio_source.type": "Type:",
  "audio_source.type.hint": "Capture wraps a physical audio device. Processed applies audio processing filters to another source.",
  "audio_source.type.capture": "Capture",
  "audio_source.type.processed": "Processed",
  "audio_source.device": "Audio Device:",
  "audio_source.device.hint": "Audio input source. Loopback devices capture system audio output; input devices capture microphone or line-in.",
  "audio_source.refresh_devices": "Refresh devices",
  "audio_source.parent": "Input Audio Source:",
  "audio_source.parent.hint": "Audio source to apply processing filters to",
  "audio_source.processing_template": "Processing Template:",
  "audio_source.processing_template.hint": "Audio processing template with filters to apply to the input source",
  "audio_source.description": "Description (optional):",
  "audio_source.description.placeholder": "Describe this audio source...",
  "audio_source.description.hint": "Optional notes about this audio source",
  "audio_source.created": "Audio source created",
  "audio_source.updated": "Audio source updated",
  "audio_source.deleted": "Audio source deleted",
  "audio_source.delete.confirm": "Are you sure you want to delete this audio source?",
  "audio_source.error.name_required": "Please enter a name",
  "audio_source.audio_template": "Audio Template:",
  "audio_source.audio_template.hint": "Audio capture template that defines which engine and settings to use for this device",
  "audio_source.test": "Test",
  "audio_source.test.title": "Test Audio Source",
  "audio_source.test.rms": "RMS",
  "audio_source.test.peak": "Peak",
  "audio_source.test.beat": "Beat",
  "audio_source.test.connecting": "Connecting...",
  "audio_source.test.error": "Audio test failed",
  "audio_template.test": "Test",
  "audio_template.test.title": "Test Audio Template",
  "audio_template.test.device": "Audio Device:",
  "audio_template.test.device.hint": "Select which audio device to capture from during the test",
  "audio_template.test.run": "Run",
  "audio_template.title": "Audio Templates",
  "audio_template.add": "Add Audio Template",
  "audio_template.edit": "Edit Audio Template",
  "audio_template.name": "Template Name:",
  "audio_template.name.placeholder": "My Audio Template",
  "audio_template.description.label": "Description (optional):",
  "audio_template.description.placeholder": "Describe this template...",
  "audio_template.engine": "Audio Engine:",
  "audio_template.engine.hint": "Select the audio capture backend to use. WASAPI is Windows-only with loopback support. Sounddevice is cross-platform.",
  "audio_template.engine.unavailable": "Unavailable",
  "audio_template.engine.unavailable.hint": "This engine is not available on your system",
  "audio_template.config": "Configuration",
  "audio_template.config.show": "Show configuration",
  "audio_template.created": "Audio template created",
  "audio_template.updated": "Audio template updated",
  "audio_template.deleted": "Audio template deleted",
  "audio_template.delete.confirm": "Are you sure you want to delete this audio template?",
  "audio_template.error.load": "Failed to load audio templates",
  "audio_template.error.engines": "Failed to load audio engines",
  "audio_template.error.required": "Please fill in all required fields",
  "audio_template.error.delete": "Failed to delete audio template",
  "streams.group.value": "Value Sources",
  "streams.group.sync": "Sync Clocks",
  "streams.group.gradients": "Gradients",
  "gradient.group.title": "Gradients",
  "gradient.add": "Add Gradient",
  "gradient.edit": "Edit Gradient",
  "gradient.builtin": "Built-in",
  "gradient.stops_label": "stops",
  "gradient.name": "Name:",
  "gradient.name.hint": "A descriptive name for this gradient.",
  "gradient.description": "Description:",
  "gradient.description.hint": "Optional description for this gradient.",
  "gradient.created": "Gradient created",
  "gradient.updated": "Gradient updated",
  "gradient.cloned": "Gradient cloned",
  "gradient.deleted": "Gradient deleted",
  "gradient.error.name_required": "Name is required",
  "gradient.error.min_stops": "At least 2 color stops are required",
  "gradient.error.delete_failed": "Failed to delete gradient",
  "gradient.create_name": "New gradient name:",
  "gradient.edit_name": "Rename gradient:",
  "gradient.confirm_delete": "Delete gradient \"{name}\"?",
  "section.empty.gradients": "No gradients yet",
  "tree.group.picture": "Picture Source",
  "tree.group.capture": "Screen Capture",
  "tree.group.static": "Static",
  "tree.group.processing": "Processed",
  "tree.group.strip": "Color Strip",
  "tree.group.audio": "Audio",
  "tree.group.audio_capture": "Capture",
  "tree.group.audio_processed": "Processed",
  "tree.group.integrations": "Integrations",
  "tree.group.utility": "Utility",
  "tree.leaf.sources": "Sources",
  "tree.leaf.engine_templates": "Engine Templates",
  "tree.leaf.images": "Images",
  "tree.leaf.video": "Video",
  "tree.leaf.filter_templates": "Filter Templates",
  "tree.leaf.processing_templates": "Processing Templates",
  "tree.leaf.templates": "Templates",
  "value_source.group.title": "Value Sources",
  "value_source.select_type": "Select Value Source Type",
  "value_source.add": "Add Value Source",
  "value_source.edit": "Edit Value Source",
  "value_source.name": "Name:",
  "value_source.name.placeholder": "Brightness Pulse",
  "value_source.name.hint": "A descriptive name for this value source",
  "value_source.type": "Type:",
  "value_source.type.hint": "Static outputs a constant value. Animated cycles through a waveform. Audio reacts to sound input. Adaptive types adjust brightness automatically based on time of day or scene content.",
  "value_source.type.static": "Static",
  "value_source.type.static.desc": "Constant output value",
  "value_source.type.animated": "Animated",
  "value_source.type.animated.desc": "Cycles through a waveform",
  "value_source.type.audio": "Audio",
  "value_source.type.audio.desc": "Reacts to sound input",
  "value_source.type.adaptive_time": "Adaptive (Time)",
  "value_source.type.adaptive_time.desc": "Adjusts by time of day",
  "value_source.type.adaptive_scene": "Adaptive (Scene)",
  "value_source.type.adaptive_scene.desc": "Adjusts by scene content",
  "value_source.type.daylight": "Daylight Cycle",
  "value_source.type.daylight.desc": "Value follows day/night cycle",
  "value_source.type.static_color": "Static Color",
  "value_source.type.static_color.desc": "Fixed RGB color",
  "value_source.type.animated_color": "Animated Color",
  "value_source.type.animated_color.desc": "Cycles through colors",
  "value_source.type.adaptive_time_color": "Time Color",
  "value_source.type.adaptive_time_color.desc": "24-hour color schedule",
  "value_source.type.ha_entity": "HA Entity",
  "value_source.type.ha_entity.desc": "Reads value from a Home Assistant sensor",
  "value_source.type.gradient_map": "Gradient Map",
  "value_source.type.gradient_map.desc": "Maps numeric value through a color gradient",
  "value_source.type.css_extract": "Strip Extract",
  "value_source.type.css_extract.desc": "Extracts color from a color strip source",
  "value_source.type.system_metrics": "System Metrics",
  "value_source.type.system_metrics.desc": "Monitor CPU, GPU, RAM, disk, network, battery, or fan speed",
  "value_source.metric": "Metric:",
  "value_source.metric.hint": "System metric to monitor. Some metrics may be unavailable depending on hardware.",
  "value_source.metric.cpu_load": "CPU Load",
  "value_source.metric.cpu_temp": "CPU Temperature",
  "value_source.metric.gpu_load": "GPU Load",
  "value_source.metric.gpu_temp": "GPU Temperature",
  "value_source.metric.ram_usage": "RAM Usage",
  "value_source.metric.disk_usage": "Disk Usage",
  "value_source.metric.network_rx": "Network RX",
  "value_source.metric.network_tx": "Network TX",
  "value_source.metric.battery_level": "Battery Level",
  "value_source.metric.fan_speed": "Fan Speed",
  "value_source.sysmetric.min": "Min Value:",
  "value_source.sysmetric.max": "Max Value:",
  "value_source.max_rate": "Max Rate (bytes/sec):",
  "value_source.max_rate.hint": "Maximum expected network rate in bytes/sec. 125000000 = 1 Gbps.",
  "value_source.disk_path": "Disk Path:",
  "value_source.disk_path.hint": "Disk mount point or drive letter (e.g. / or C:\\)",
  "value_source.sensor_label": "Sensor Label:",
  "value_source.sensor_label.hint": "Optional sensor name to pick a specific sensor (empty = first available)",
  "value_source.poll_interval": "Poll Interval:",
  "value_source.poll_interval.hint": "Seconds between metric reads",
  "value_source.gradient_map.input": "Input Value Source",
  "value_source.gradient_map.gradient": "Gradient",
  "value_source.css_extract.source": "Color Strip Source",
  "value_source.ha_source": "HA Connection:",
  "value_source.ha_source.hint": "Home Assistant connection to read entities from",
  "value_source.entity_id": "Entity:",
  "value_source.entity_id.hint": "HA entity ID (e.g. sensor.temperature)",
  "value_source.attribute": "Attribute (optional):",
  "value_source.attribute.hint": "Read a specific attribute instead of the entity state",
  "value_source.min_ha_value": "Min HA Value:",
  "value_source.min_ha_value.hint": "Raw HA value that maps to 0% output",
  "value_source.max_ha_value": "Max HA Value:",
  "value_source.max_ha_value.hint": "Raw HA value that maps to 100% output",
  "value_source.input_source": "Input Value Source:",
  "value_source.input_source.hint": "Float value source (0-1) to map through the gradient",
  "value_source.gradient_stops": "Gradient:",
  "value_source.gradient_stops.hint": "Color stops for the gradient. Position 0 = input value 0, position 1 = input value 1",
  "value_source.easing": "Interpolation:",
  "value_source.easing.hint": "How colors blend between stops",
  "value_source.css_source": "Color Strip Source:",
  "value_source.css_source.hint": "Color strip source to extract color from",
  "value_source.led_start": "LED Start:",
  "value_source.led_start.hint": "First LED in the range (0-based)",
  "value_source.led_end": "LED End:",
  "value_source.led_end.hint": "Last LED in the range (-1 = whole strip)",
  "value_source.filter.all": "All",
  "value_source.filter.float": "Numeric",
  "value_source.filter.color": "Color",
  "value_source.static_color.color": "Color:",
  "value_source.animated_color.colors": "Colors:",
  "value_source.animated_color.speed": "Speed (cpm):",
  "value_source.animated_color.easing": "Easing:",
  "value_source.animated_color.easing.linear": "Linear",
  "value_source.animated_color.easing.linear.desc": "Constant rate blend between colors",
  "value_source.animated_color.easing.step": "Step",
  "value_source.animated_color.easing.step.desc": "Instant jump between colors",
  "value_source.animated_color.easing.ease_in": "Ease In",
  "value_source.animated_color.easing.ease_in.desc": "Slow start, accelerating into the next color",
  "value_source.animated_color.easing.ease_out": "Ease Out",
  "value_source.animated_color.easing.ease_out.desc": "Quick start, settling into the next color",
  "value_source.animated_color.easing.ease_in_out": "Ease In Out",
  "value_source.animated_color.easing.ease_in_out.desc": "Smooth at both ends, faster in the middle",
  "value_source.animated_color.easing.sine": "Sine",
  "value_source.animated_color.easing.sine.desc": "Sinusoidal curve — natural ambient cycling",
  "value_source.animated_color.color_count": "colors",
  "value_source.animated_color.clock": "Animation Clock:",
  "value_source.animated_color.clock.hint": "Optional sync clock — when set, the clock controls timing (its speed multiplier scales the cpm above) and pause state. Leave empty to run on the value source's own speed.",
  "value_source.adaptive_time_color.schedule": "Color Schedule:",
  "value_source.daylight.speed": "Speed:",
  "value_source.daylight.speed.hint": "Cycle speed multiplier. 1.0 = full day/night cycle in ~4 minutes. Higher values cycle faster.",
  "value_source.daylight.use_real_time": "Use Real Time:",
  "value_source.daylight.use_real_time.hint": "When enabled, the value follows the actual time of day. Speed is ignored.",
  "value_source.daylight.enable_real_time": "Follow wall clock",
  "value_source.daylight.latitude": "Latitude:",
  "value_source.daylight.latitude.hint": "Your geographic latitude (-90 to 90). Steepens or flattens the sunrise/sunset edges of the cycle.",
  "value_source.daylight.longitude": "Longitude:",
  "value_source.daylight.longitude.hint": "Your geographic longitude (-180 to 180). Shifts solar noon for accurate sunrise/sunset alignment with your wall clock.",
  "value_source.daylight.real_time": "Real-time",
  "value_source.daylight.speed_label": "Speed",
  "value_source.value": "Value:",
  "value_source.value.hint": "Constant output value (0.0 = off, 1.0 = full brightness)",
  "value_source.waveform": "Waveform:",
  "value_source.waveform.hint": "Shape of the brightness animation cycle",
  "value_source.waveform.sine": "Sine",
  "value_source.waveform.triangle": "Triangle",
  "value_source.waveform.square": "Square",
  "value_source.waveform.sawtooth": "Sawtooth",
  "value_source.speed": "Speed (cpm):",
  "value_source.speed.hint": "Cycles per minute — how fast the waveform repeats (1 = very slow, 120 = very fast)",
  "value_source.min_value": "Min Value:",
  "value_source.min_value.hint": "Minimum output of the waveform cycle",
  "value_source.max_value": "Max Value:",
  "value_source.max_value.hint": "Maximum output of the waveform cycle",
  "value_source.audio_source": "Audio Source:",
  "value_source.audio_source.hint": "Audio source to read audio levels from",
  "value_source.mode": "Mode:",
  "value_source.mode.hint": "RMS measures average volume. Peak tracks loudest moments. Beat triggers on rhythm.",
  "value_source.mode.rms": "RMS (Volume)",
  "value_source.mode.peak": "Peak",
  "value_source.mode.beat": "Beat",
  "value_source.mode.rms.desc": "Average volume level",
  "value_source.mode.peak.desc": "Loudest moment tracking",
  "value_source.mode.beat.desc": "Rhythm pulse detection",
  "value_source.auto_gain": "Auto Gain:",
  "value_source.auto_gain.hint": "Automatically normalize audio levels so output uses the full range, regardless of input volume",
  "value_source.auto_gain.enable": "Enable auto-gain",
  "value_source.sensitivity": "Sensitivity:",
  "value_source.sensitivity.hint": "Gain multiplier for the audio signal (higher = more reactive)",
  "value_source.scene_sensitivity.hint": "Gain multiplier for the luminance signal (higher = more reactive to brightness changes)",
  "value_source.smoothing": "Smoothing:",
  "value_source.smoothing.hint": "Temporal smoothing (0 = instant response, 1 = very smooth/slow)",
  "value_source.audio_min_value": "Min Value:",
  "value_source.audio_min_value.hint": "Output when audio is silent (e.g. 0.3 = 30% brightness floor)",
  "value_source.audio_max_value": "Max Value:",
  "value_source.audio_max_value.hint": "Output at maximum audio level",
  "value_source.schedule": "Schedule:",
  "value_source.schedule.hint": "Define at least 2 time points. Brightness interpolates linearly between them, wrapping at midnight.",
  "value_source.schedule.add": "+ Add Point",
  "value_source.schedule.points": "points",
  "value_source.picture_source": "Picture Source:",
  "value_source.picture_source.hint": "The picture source whose frames will be analyzed for average brightness.",
  "value_source.scene_behavior": "Behavior:",
  "value_source.scene_behavior.hint": "Complement: dark scene = high brightness (ideal for ambient backlight). Match: bright scene = high brightness.",
  "value_source.scene_behavior.complement": "Complement (dark → bright)",
  "value_source.scene_behavior.match": "Match (bright → bright)",
  "value_source.adaptive_min_value": "Min Value:",
  "value_source.adaptive_min_value.hint": "Minimum output brightness",
  "value_source.adaptive_max_value": "Max Value:",
  "value_source.adaptive_max_value.hint": "Maximum output brightness",
  "value_source.error.schedule_min": "Schedule requires at least 2 time points",
  "value_source.description": "Description (optional):",
  "value_source.description.placeholder": "Describe this value source...",
  "value_source.description.hint": "Optional notes about this value source",
  "value_source.created": "Value source created",
  "value_source.updated": "Value source updated",
  "value_source.deleted": "Value source deleted",
  "value_source.delete.confirm": "Are you sure you want to delete this value source?",
  "value_source.error.name_required": "Please enter a name",
  "value_source.test": "Test",
  "value_source.test.title": "Test Value Source",
  "value_source.test.connecting": "Connecting...",
  "value_source.test.error": "Failed to connect",
  "value_source.test.current": "Current",
  "value_source.test.min": "Min",
  "value_source.test.max": "Max",
  "test.frames": "Frames",
  "test.fps": "FPS",
  "test.avg_capture": "Avg",
  "targets.brightness": "Brightness:",
  "targets.brightness.hint": "Output brightness multiplier (0–1). Can be bound to a value source for dynamic control.",
  "targets.brightness_vs": "Brightness Source:",
  "targets.brightness_vs.hint": "Optional value source that dynamically controls brightness each frame (overrides device brightness)",
  "targets.brightness_vs.none": "None (device brightness)",
  "targets.min_brightness_threshold": "Min Brightness Threshold:",
  "targets.min_brightness_threshold.hint": "Effective output brightness (pixel brightness × device/source brightness) below this value turns LEDs off completely (0 = disabled)",
  "targets.adaptive_fps": "Adaptive FPS:",
  "targets.adaptive_fps.hint": "Automatically reduce send rate when the device becomes unresponsive, and gradually recover when it stabilizes. Recommended for WiFi devices with weak signal.",
  "targets.protocol": "Protocol:",
  "targets.protocol.hint": "DDP sends pixels via fast UDP (recommended for most setups). HTTP uses the JSON API — slower but reliable, limited to ~500 LEDs.",
  "targets.protocol.ddp": "DDP (UDP)",
  "targets.protocol.ddp.desc": "Fast raw UDP packets — recommended",
  "targets.protocol.http": "HTTP",
  "targets.protocol.http.desc": "JSON API — slower, ≤500 LEDs",
  "targets.protocol.serial": "Serial",
  "search.open": "Search (Ctrl+K)",
  "search.placeholder": "Search entities... (Ctrl+K)",
  "search.loading": "Loading...",
  "search.no_results": "No results found",
  "search.group.devices": "Devices",
  "search.group.targets": "LED Targets",
  "search.group.kc_targets": "Key Colors Targets",
  "search.group.css": "Color Strip Sources",
  "search.group.automations": "Automations",
  "search.group.streams": "Picture Streams",
  "search.group.capture_templates": "Capture Templates",
  "search.group.pp_templates": "Post-Processing Templates",
  "search.group.pattern_templates": "Pattern Templates",
  "search.group.audio": "Audio Sources",
  "search.group.value": "Value Sources",
  "search.group.scenes": "Scene Presets",
  "search.group.cspt": "Strip Processing Templates",
  "search.group.sync_clocks": "Sync Clocks",
  "search.group.actions": "Actions",
  "search.action.start": "Start",
  "search.action.stop": "Stop",
  "search.action.activate": "Activate",
  "search.action.enable": "Enable",
  "search.action.disable": "Disable",
  "settings.backup.label": "Backup Configuration",
  "settings.backup.hint": "Download all configuration (devices, targets, streams, templates, automations) as a single JSON file.",
  "settings.backup.button": "Download",
  "settings.backup.success": "Backup downloaded successfully",
  "settings.backup.error": "Backup download failed",
  "settings.restore.label": "Restore Configuration",
  "settings.restore.hint": "Upload a previously downloaded backup file to replace all configuration. The server will restart automatically.",
  "settings.restore.button": "Restore",
  "settings.restore.confirm": "This will replace ALL configuration and restart the server. Are you sure?",
  "settings.restore.success": "Configuration restored",
  "settings.restore.error": "Restore failed",
  "settings.restore.restarting": "Server is restarting...",
  "settings.restore.restart_timeout": "Server did not respond. Please refresh the page manually.",
  "settings.restart_server": "Restart Server",
  "settings.restart_confirm": "Restart the server? Active targets will be stopped.",
  "settings.restarting": "Restarting server...",
  "settings.button.close": "Close",
  "settings.log_level.label": "Log Level",
  "settings.log_level.hint": "Change the server log verbosity at runtime. DEBUG shows the most detail; CRITICAL shows only fatal errors.",
  "settings.log_level.save": "Apply",
  "settings.log_level.saved": "Log level changed",
  "settings.log_level.save_error": "Failed to change log level",
  "settings.log_level.desc.debug": "Verbose developer output",
  "settings.log_level.desc.info": "Normal operation messages",
  "settings.log_level.desc.warning": "Potential problems",
  "settings.log_level.desc.error": "Failures only",
  "settings.log_level.desc.critical": "Fatal errors only",
  "settings.shutdown_action.label": "Shutdown action",
  "settings.shutdown_action.hint": "What happens to LED targets when the server shuts down. \"Stop targets\" runs the normal stop sequence so devices with auto-restore restore their prior state. \"Nothing\" leaves the lights showing the last frame.",
  "settings.shutdown_action.saved": "Shutdown action saved",
  "settings.shutdown_action.save_error": "Failed to save shutdown action",
  "settings.shutdown_action.opt.stop": "Stop targets",
  "settings.shutdown_action.opt.stop_desc": "Run the normal stop sequence (per-device auto-restore applies)",
  "settings.shutdown_action.opt.nothing": "Nothing",
  "settings.shutdown_action.opt.nothing_desc": "Leave lights showing the last frame",
  "settings.daylight_timezone.label": "Daylight timezone",
  "settings.daylight_timezone.hint": "IANA timezone every \"real-time\" daylight cycle reads its wall clock in. Empty (default) uses the server's system timezone.",
  "settings.daylight_timezone.saved": "Daylight timezone saved",
  "settings.daylight_timezone.save_error": "Failed to save daylight timezone",
  "common.daylight_tz.system": "System default",
  "common.daylight_tz.system_desc": "Server clock — no override",
  "common.daylight_tz.detected": "Browser-detected",
  "common.daylight_tz.detected_label": "Auto-detected",
  "common.daylight_tz.search": "Search timezones, cities, regions…",
  "common.daylight_tz.region.utc": "Universal",
  "common.daylight_tz.region.europe": "Europe",
  "common.daylight_tz.region.africa": "Africa",
  "common.daylight_tz.region.me": "Middle East",
  "common.daylight_tz.region.asia": "Asia",
  "common.daylight_tz.region.pacific": "Pacific",
  "common.daylight_tz.region.americas": "Americas",
  "settings.auto_backup.label": "Auto-Backup",
  "settings.auto_backup.hint": "Automatically create periodic backups of all configuration. Old backups are pruned when the maximum count is reached.",
  "settings.auto_backup.enable": "Enable auto-backup",
  "settings.auto_backup.interval_label": "Interval",
  "settings.auto_backup.max_label": "Max backups",
  "settings.auto_backup.save": "Save Settings",
  "settings.auto_backup.saved": "Auto-backup settings saved",
  "settings.auto_backup.save_error": "Failed to save auto-backup settings",
  "settings.auto_backup.backup_now": "Backup Now",
  "settings.auto_backup.backup_created": "Backup created",
  "settings.auto_backup.backup_error": "Backup failed",
  "settings.auto_backup.last_backup": "Last backup",
  "settings.auto_backup.never": "Never",
  "settings.saved_backups.label": "Saved Backups",
  "settings.saved_backups.hint": "Auto-backup files stored on the server. Download to save locally, or delete to free space.",
  "settings.saved_backups.empty": "No saved backups",
  "settings.saved_backups.restore": "Restore",
  "settings.saved_backups.download": "Download",
  "settings.saved_backups.delete": "Delete",
  "settings.saved_backups.delete_confirm": "Delete this backup file?",
  "settings.saved_backups.delete_error": "Failed to delete backup",
  "settings.saved_backups.type.auto": "auto",
  "settings.saved_backups.type.manual": "manual",
  "settings.mqtt.label": "MQTT",
  "settings.mqtt.hint": "Configure MQTT broker connection for automation conditions and triggers.",
  "settings.mqtt.enabled": "Enable MQTT",
  "settings.mqtt.host_label": "Broker Host",
  "settings.mqtt.port_label": "Port",
  "settings.mqtt.username_label": "Username",
  "settings.mqtt.password_label": "Password",
  "settings.mqtt.password_set_hint": "Password is set — leave blank to keep",
  "settings.mqtt.client_id_label": "Client ID",
  "settings.mqtt.base_topic_label": "Base Topic",
  "settings.mqtt.save": "Save MQTT Settings",
  "settings.mqtt.saved": "MQTT settings saved",
  "settings.mqtt.save_error": "Failed to save MQTT settings",
  "settings.mqtt.error_host_required": "Broker host is required",
  "settings.logs.label": "Server Logs",
  "settings.logs.hint": "Stream live server log output. Use the filter to show only relevant log levels.",
  "settings.logs.connect": "Connect",
  "settings.logs.disconnect": "Disconnect",
  "settings.logs.clear": "Clear",
  "settings.logs.error": "Log viewer connection failed",
  "settings.logs.filter.all": "All levels",
  "settings.logs.filter.info": "Info+",
  "settings.logs.filter.warning": "Warning+",
  "settings.logs.filter.error": "Error only",
  "settings.logs.filter.all_desc": "Show all log messages",
  "settings.logs.filter.info_desc": "Info, warning, and errors",
  "settings.logs.filter.warning_desc": "Warnings and errors only",
  "settings.logs.filter.error_desc": "Errors only",
  "settings.logs.stat.lines": "LINES",
  "settings.logs.stat.warn": "WARN",
  "settings.logs.stat.err": "ERR",
  "settings.logs.patch.idle": "STANDBY",
  "settings.logs.patch.connecting": "CONNECTING",
  "settings.logs.patch.live": "STREAMING",
  "settings.logs.patch.error": "OFFLINE",
  "settings.logs.empty.title": "Awaiting log frames",
  "settings.logs.empty.sub": "Connect the WebSocket stream to begin tailing.",
  "device.error.power_off_failed": "Failed to turn off device",
  "device.error.remove_failed": "Failed to remove device",
  "device.error.settings_load_failed": "Failed to load device settings",
  "device.error.brightness": "Failed to update brightness",
  "device.error.required": "Please fill in all fields correctly",
  "device.error.update": "Failed to update device",
  "device.error.save": "Failed to save settings",
  "device.error.clone_failed": "Failed to clone device",
  "device_discovery.error.fill_all_fields": "Please fill in all fields",
  "device_discovery.added": "Device added successfully",
  "device_discovery.error.add_failed": "Failed to add device",
  "calibration.error.load_failed": "Failed to load calibration",
  "calibration.error.css_load_failed": "Failed to load color strip source",
  "calibration.error.test_toggle_failed": "Failed to toggle test edge",
  "calibration.error.save_failed": "Failed to save calibration",
  "calibration.error.led_count_mismatch": "Total LEDs must equal the device LED count",
  "calibration.error.led_count_exceeded": "Calibrated LEDs exceed the total LED count",
  "calibration.mode.simple": "Simple",
  "calibration.mode.advanced": "Advanced",
  "calibration.switch_to_advanced": "Switch to Advanced",
  "calibration.advanced.title": "Advanced Calibration",
  "calibration.advanced.switch_to_simple": "Switch to Simple",
  "calibration.advanced.lines_title": "Lines",
  "calibration.advanced.canvas_hint": "Drag monitors to reposition. Click edges to select lines. Scroll to zoom, drag empty space to pan.",
  "calibration.advanced.reset_view": "Reset view",
  "calibration.advanced.line_properties": "Line Properties",
  "calibration.advanced.picture_source": "Source:",
  "calibration.advanced.picture_source.hint": "The picture source (monitor) this line samples from",
  "calibration.advanced.edge": "Edge:",
  "calibration.advanced.edge.hint": "Which screen edge to sample pixels from",
  "calibration.advanced.led_count": "LEDs:",
  "calibration.advanced.led_count.hint": "Number of LEDs mapped to this line",
  "calibration.advanced.span_start": "Span Start:",
  "calibration.advanced.span_start.hint": "Where sampling begins along the edge (0 = start, 1 = end). Use to cover only part of an edge.",
  "calibration.advanced.span_end": "Span End:",
  "calibration.advanced.span_end.hint": "Where sampling ends along the edge (0 = start, 1 = end). Together with Span Start, defines the active portion.",
  "calibration.advanced.border_width": "Depth (px):",
  "calibration.advanced.border_width.hint": "How many pixels deep from the edge to sample. Larger values capture more of the screen interior.",
  "calibration.advanced.reverse": "Reverse",
  "calibration.advanced.no_lines_warning": "Add at least one line",
  "dashboard.error.automation_toggle_failed": "Failed to toggle automation",
  "dashboard.error.start_failed": "Failed to start processing",
  "dashboard.error.stop_failed": "Failed to stop processing",
  "dashboard.error.stop_all": "Failed to stop all targets",
  "target.error.editor_open_failed": "Failed to open target editor",
  "target.error.start_failed": "Failed to start target",
  "target.error.stop_failed": "Failed to stop target",
  "target.error.clone_failed": "Failed to clone target",
  "target.error.delete_failed": "Failed to delete target",
  "targets.stop_all.button": "Stop All",
  "targets.stop_all.none_running": "No targets are currently running",
  "targets.stop_all.stopped": "Stopped {count} target(s)",
  "targets.stop_all.error": "Failed to stop targets",
  "audio_source.error.load": "Failed to load audio source",
  "audio_template.error.clone_failed": "Failed to clone audio template",
  "value_source.error.load": "Failed to load value source",
  "color_strip.error.editor_open_failed": "Failed to open color strip editor",
  "color_strip.error.clone_failed": "Failed to clone color strip source",
  "color_strip.error.delete_failed": "Failed to delete color strip source",
  "pattern.error.editor_open_failed": "Failed to open pattern template editor",
  "pattern.error.clone_failed": "Failed to clone pattern template",
  "pattern.error.delete_failed": "Failed to delete pattern template",
  "pattern.error.capture_bg_failed": "Failed to capture background",
  "stream.error.clone_picture_failed": "Failed to clone picture source",
  "stream.error.clone_capture_failed": "Failed to clone capture template",
  "stream.error.clone_pp_failed": "Failed to clone postprocessing template",
  "theme.switched.dark": "Switched to dark theme",
  "theme.switched.light": "Switched to light theme",
  "theme.switched.system": "Switched to system theme",
  "accent.color.updated": "Accent color updated",
  "search.footer": "↑↓ navigate · Enter select · Esc close",
  "sync_clock.group.title": "Sync Clocks",
  "sync_clock.add": "Add Sync Clock",
  "sync_clock.edit": "Edit Sync Clock",
  "sync_clock.name": "Name:",
  "sync_clock.name.placeholder": "Main Animation Clock",
  "sync_clock.name.hint": "A descriptive name for this synchronization clock",
  "sync_clock.speed": "Speed:",
  "sync_clock.speed.hint": "Animation speed multiplier for all linked sources. 1.0 = normal, 2.0 = double speed, 0.5 = half speed.",
  "sync_clock.description": "Description (optional):",
  "sync_clock.description.placeholder": "Optional description",
  "sync_clock.description.hint": "Optional notes about this clock's purpose",
  "sync_clock.status.running": "Running",
  "sync_clock.status.paused": "Paused",
  "sync_clock.action.pause": "Pause",
  "sync_clock.action.resume": "Resume",
  "sync_clock.action.reset": "Reset",
  "sync_clock.error.name_required": "Clock name is required",
  "sync_clock.error.load": "Failed to load sync clock",
  "sync_clock.created": "Sync clock created",
  "sync_clock.updated": "Sync clock updated",
  "sync_clock.deleted": "Sync clock deleted",
  "sync_clock.paused": "Clock paused",
  "sync_clock.resumed": "Clock resumed",
  "sync_clock.reset_done": "Clock reset to zero",
  "sync_clock.delete.confirm": "Delete this sync clock? Linked sources will lose synchronization and run at default speed.",
  "sync_clock.elapsed": "Elapsed time",
  "weather_source.group.title": "Weather Sources",
  "weather_source.add": "Add Weather Source",
  "weather_source.edit": "Edit Weather Source",
  "weather_source.name": "Name:",
  "weather_source.name.placeholder": "My Weather",
  "weather_source.name.hint": "A descriptive name for this weather data source",
  "weather_source.provider": "Provider:",
  "weather_source.provider.hint": "Weather data provider. Open-Meteo is free and requires no API key.",
  "weather_source.provider.open_meteo.desc": "Free, no API key required",
  "weather_source.location": "Location:",
  "weather_source.location.hint": "Your geographic coordinates. Use the auto-detect button or enter manually.",
  "weather_source.latitude": "Lat:",
  "weather_source.longitude": "Lon:",
  "weather_source.use_my_location": "Use my location",
  "weather_source.update_interval": "Update Interval:",
  "weather_source.update_interval.hint": "How often to fetch weather data. Lower values give more responsive changes.",
  "weather_source.description": "Description (optional):",
  "weather_source.description.placeholder": "Optional description",
  "weather_source.test": "Test",
  "weather_source.error.name_required": "Weather source name is required",
  "weather_source.error.load": "Failed to load weather source",
  "weather_source.created": "Weather source created",
  "weather_source.updated": "Weather source updated",
  "weather_source.deleted": "Weather source deleted",
  "weather_source.delete.confirm": "Delete this weather source? Linked color strip sources will lose weather data.",
  "weather_source.geo.success": "Location detected",
  "weather_source.geo.error": "Geolocation failed",
  "weather_source.geo.not_supported": "Geolocation is not supported by your browser",
  "streams.group.weather": "Weather",
  "streams.group.home_assistant": "Home Assistant",
  "ha_source.group.title": "Home Assistant Sources",
  "ha_source.add": "Add Home Assistant Source",
  "ha_source.edit": "Edit Home Assistant Source",
  "ha_source.name": "Name:",
  "ha_source.name.placeholder": "My Home Assistant",
  "ha_source.name.hint": "A descriptive name for this Home Assistant connection",
  "ha_source.host": "Host:",
  "ha_source.host.hint": "Home Assistant host and port, e.g. 192.168.1.100:8123",
  "ha_source.token": "Access Token:",
  "ha_source.token.hint": "Long-Lived Access Token from HA (Profile > Security > Long-Lived Access Tokens)",
  "ha_source.token.edit_hint": "Leave blank to keep the current token",
  "ha_source.use_ssl": "Use SSL (wss://)",
  "ha_source.entity_filters": "Entity Filters (optional):",
  "ha_source.entity_filters.hint": "Comma-separated glob patterns, e.g. sensor.*, binary_sensor.front_door. Leave empty for all.",
  "ha_source.description": "Description (optional):",
  "ha_source.test": "Test Connection",
  "ha_source.test.success": "Connected",
  "ha_source.test.failed": "Connection failed",
  "ha_source.connected": "Connected",
  "ha_source.disconnected": "Disconnected",
  "ha_source.error.name_required": "Name is required",
  "ha_source.error.host_required": "Host is required",
  "ha_source.error.token_required": "Access token is required",
  "ha_source.error.load": "Failed to load Home Assistant source",
  "ha_source.created": "Home Assistant source created",
  "ha_source.updated": "Home Assistant source updated",
  "ha_source.deleted": "Home Assistant source deleted",
  "ha_source.delete.confirm": "Delete this Home Assistant connection?",
  "section.empty.ha_sources": "No Home Assistant sources yet. Click + to add one.",
  "streams.group.mqtt": "MQTT",
  "mqtt_source.group.title": "MQTT Sources",
  "mqtt_source.add": "Add MQTT Source",
  "mqtt_source.edit": "Edit MQTT Source",
  "mqtt_source.name": "Name:",
  "mqtt_source.name.placeholder": "My MQTT Broker",
  "mqtt_source.name.hint": "A descriptive name for this MQTT broker connection",
  "mqtt_source.broker_host": "Broker Host:",
  "mqtt_source.broker_host.hint": "MQTT broker hostname or IP address, e.g. 192.168.1.100",
  "mqtt_source.broker_port": "Port:",
  "mqtt_source.username": "Username (optional):",
  "mqtt_source.password": "Password (optional):",
  "mqtt_source.password.edit_hint": "Leave blank to keep the current password",
  "mqtt_source.client_id": "Client ID:",
  "mqtt_source.client_id.hint": "Unique MQTT client identifier. Change if running multiple instances.",
  "mqtt_source.base_topic": "Base Topic:",
  "mqtt_source.base_topic.hint": "Prefix for status and state topics, e.g. ledgrab/status",
  "mqtt_source.description": "Description (optional):",
  "mqtt_source.test": "Test Connection",
  "mqtt_source.test.success": "Connected to broker",
  "mqtt_source.test.failed": "Connection failed",
  "mqtt_source.connected": "Connected",
  "mqtt_source.disconnected": "Disconnected",
  "mqtt_source.error.name_required": "Name is required",
  "mqtt_source.error.host_required": "Broker host is required",
  "mqtt_source.error.load": "Failed to load MQTT source",
  "mqtt_source.created": "MQTT source created",
  "mqtt_source.updated": "MQTT source updated",
  "mqtt_source.deleted": "MQTT source deleted",
  "mqtt_source.delete.confirm": "Delete this MQTT broker connection?",
  "section.empty.mqtt_sources": "No MQTT sources yet. Click + to add one.",
  "ha_light.section.title": "Home Assistant",
  "ha_light.section.targets": "Light Targets",
  "ha_light.add": "Add HA Light Target",
  "ha_light.edit": "Edit HA Light Target",
  "ha_light.name": "Name:",
  "ha_light.name.placeholder": "Living Room Lights",
  "ha_light.ha_source": "HA Connection:",
  "ha_light.css_source": "Color Strip Source:",
  "ha_light.color_source": "Color Source:",
  "ha_light.color_source.hint": "Pick a Color Strip Source (per-light LED ranges) or a Color Value Source (one colour broadcast to every light).",
  "ha_light.color_source.css": "Color strip",
  "ha_light.color_source.color_vs": "Color value source",
  "ha_light.mappings.color_vs_hint": "All listed lights will receive the same colour from the selected Color Value Source.",
  "ha_light.update_rate": "Update Rate:",
  "ha_light.update_rate.hint": "How often to send color updates to HA lights (0.5-5.0 Hz). Lower values are safer for HA performance.",
  "ha_light.transition": "Transition:",
  "ha_light.transition.hint": "Smooth fade duration between colors (HA transition parameter).",
  "ha_light.color_tolerance": "Color Tolerance:",
  "ha_light.color_tolerance.hint": "Skip sending color updates when the RGB delta is below this threshold. Reduces HA traffic for near-static scenes.",
  "ha_light.min_brightness_threshold": "Min Brightness Threshold:",
  "ha_light.min_brightness_threshold.hint": "Effective output brightness below this value turns lights off completely (0 = disabled).",
  "ha_light.mappings": "Light Mappings:",
  "ha_light.mappings.hint": "Map LED ranges to HA light entities. Each mapping averages the LED segment to a single color.",
  "ha_light.mappings.add": "Add Mapping",
  "ha_light.mapping.entity_id": "Entity ID:",
  "ha_light.mapping.led_start": "LED Start:",
  "ha_light.mapping.led_end": "LED End (-1=last):",
  "ha_light.mapping.brightness": "Brightness Scale:",
  "ha_light.description": "Description (optional):",
  "ha_light.error.name_required": "Name is required",
  "ha_light.error.ha_source_required": "HA connection is required",
  "ha_light.error.color_source_required": "Color value source is required when broadcasting a single colour",
  "ha_light.created": "HA light target created",
  "ha_light.updated": "HA light target updated",
  "ha_light.mapping.select_entity": "Select a light entity...",
  "ha_light.mapping.unassigned": "— No entity selected",
  "ha_light.mapping.search_entity": "Search light entities...",
  "ha_light.stop_action": "On Stop:",
  "ha_light.stop_action.hint": "What to do with the mapped lights when this target stops streaming.",
  "ha_light.stop_action.none": "None",
  "ha_light.stop_action.none.desc": "Leave lights as-is",
  "ha_light.stop_action.turn_off": "Turn Off",
  "ha_light.stop_action.turn_off.desc": "Switch all mapped lights off",
  "ha_light.stop_action.restore": "Restore",
  "ha_light.stop_action.restore.desc": "Revert to state captured at start",
  "ha_light.button.turn_off": "Turn Off Lights",
  "ha_light.turn_off.success": "Lights turned off",
  "ha_light.turn_off.failed": "Failed to turn off lights",
  "confirm.turn_off_ha_light": "Turn off all mapped lights?",
  "ha_light.connection_tooltip": "HA Connection",
  "ha_light.connection_metric": "Home Assistant connection",
  "ha_light.lights.one": "{count} light",
  "ha_light.lights.other": "{count} lights",
  "section.empty.ha_light_targets": "No HA light targets yet. Click + to add one.",
  "z2m_light.section.title": "Zigbee2MQTT",
  "z2m_light.section.targets": "Z2M Light Targets",
  "z2m_light.add": "Add Z2M Light Target",
  "z2m_light.edit": "Edit Z2M Light Target",
  "z2m_light.name": "Name:",
  "z2m_light.name.placeholder": "Living Room Bulbs",
  "z2m_light.description": "Description (optional):",
  "z2m_light.mqtt_source": "MQTT Broker:",
  "z2m_light.mqtt_source.hint": "Pick the MQTT source (broker) that Zigbee2MQTT is connected to. Manage brokers under MQTT Sources.",
  "z2m_light.mqtt_source.none": "— Pick an MQTT broker",
  "z2m_light.base_topic": "Z2M Base Topic:",
  "z2m_light.base_topic.hint": "Override only if your Zigbee2MQTT instance uses a non-default mqtt.base_topic.",
  "z2m_light.color_source": "Color Source:",
  "z2m_light.color_source.hint": "Pick a Color Strip Source (per-bulb LED ranges) or a Color Value Source (one colour broadcast to every bulb).",
  "z2m_light.color_source.css": "Color strip",
  "z2m_light.color_source.color_vs": "Color value source",
  "z2m_light.update_rate": "Update Rate:",
  "z2m_light.update_rate.hint": "How often to publish colour updates to Z2M (0.5–10 Hz). Zigbee mesh tolerates ~5–10 Hz per bulb; higher values risk drops.",
  "z2m_light.transition": "Transition:",
  "z2m_light.transition.hint": "Smooth fade duration between colours, in seconds (Z2M transition parameter).",
  "z2m_light.brightness": "Brightness:",
  "z2m_light.color_tolerance": "Color Tolerance:",
  "z2m_light.color_tolerance.hint": "Skip publishes when the RGB delta is below this threshold. Reduces Zigbee mesh traffic for near-static scenes.",
  "z2m_light.min_brightness_threshold": "Min Brightness Threshold:",
  "z2m_light.min_brightness_threshold.hint": "Effective output brightness below this value turns bulbs off completely (0 = disabled).",
  "z2m_light.mappings": "Bulb Mappings:",
  "z2m_light.mappings.hint": "Map LED ranges to Z2M friendly names. Each mapping averages the LED segment to a single colour.",
  "z2m_light.mappings.color_vs_hint": "All listed bulbs will receive the same colour from the selected Color Value Source.",
  "z2m_light.mappings.add": "Add Mapping",
  "z2m_light.mapping.friendly_name": "Friendly Name:",
  "z2m_light.mapping.led_start": "LED Start:",
  "z2m_light.mapping.led_end": "LED End (-1=last):",
  "z2m_light.mapping.brightness": "Brightness Scale:",
  "z2m_light.mapping.unassigned": "— No bulb selected",
  "z2m_light.stop_action": "On Stop:",
  "z2m_light.stop_action.hint": "What to do with the mapped bulbs when this target stops streaming.",
  "z2m_light.stop_action.none": "None",
  "z2m_light.stop_action.none.desc": "Leave bulbs as-is",
  "z2m_light.stop_action.turn_off": "Turn Off",
  "z2m_light.stop_action.turn_off.desc": "Switch all mapped bulbs off",
  "z2m_light.connection_metric": "Zigbee2MQTT broker connection",
  "z2m_light.error.name_required": "Name is required",
  "z2m_light.error.mqtt_source_required": "MQTT broker is required",
  "z2m_light.error.color_source_required": "Color value source is required when broadcasting a single colour",
  "z2m_light.error.mapping_required": "At least one bulb mapping is required",
  "z2m_light.created": "Z2M light target created",
  "z2m_light.updated": "Z2M light target updated",
  "z2m_light.button.turn_off": "Turn Off Bulbs",
  "z2m_light.turn_off.success": "Bulbs turned off",
  "z2m_light.turn_off.failed": "Failed to turn off bulbs",
  "confirm.turn_off_z2m_light": "Turn off all mapped bulbs?",
  "z2m_light.bulbs.one": "{count} bulb",
  "z2m_light.bulbs.other": "{count} bulbs",
  "section.empty.z2m_light_targets": "No Z2M light targets yet. Click + to add one.",
  "automations.rule.home_assistant": "Home Assistant",
  "automations.rule.home_assistant.desc": "HA entity state",
  "automations.rule.home_assistant.ha_source": "HA Source:",
  "automations.rule.home_assistant.entity_id": "Entity ID:",
  "automations.rule.home_assistant.state": "State:",
  "automations.rule.home_assistant.match_mode": "Match Mode:",
  "automations.rule.home_assistant.hint": "Activate when a Home Assistant entity matches the specified state",
    "automations.rule.ha.match_mode.exact.desc": "State must match exactly",
    "automations.rule.ha.match_mode.contains.desc": "State must contain the text",
    "automations.rule.ha.match_mode.regex.desc": "State must match the regex pattern",
  "color_strip.clock": "Sync Clock:",
  "color_strip.clock.hint": "Link to a sync clock to synchronize animation timing across sources. Speed is controlled on the clock.",
  "graph.title": "Graph",
  "graph.fit_all": "Fit all nodes",
  "graph.zoom_in": "Zoom in",
  "graph.zoom_out": "Zoom out",
  "graph.search": "Search nodes",
  "graph.search_placeholder": "Search entities...",
  "graph.legend": "Legend",
  "graph.minimap": "Minimap",
  "graph.relayout": "Re-layout",
  "graph.empty": "No entities yet",
  "graph.empty.hint": "Create devices, sources, and targets to see them here.",
  "graph.disconnect": "Disconnect",
  "graph.connection_updated": "Connection updated",
  "graph.connection_failed": "Failed to update connection",
  "graph.connection_removed": "Connection removed",
  "graph.disconnect_failed": "Failed to disconnect",
  "graph.relayout_confirm": "Reset all manual node positions and re-layout the graph?",
  "graph.fullscreen": "Toggle fullscreen",
  "graph.add_entity": "Add entity",
  "graph.color_picker": "Node color",
  "graph.filter": "Filter nodes",
  "graph.filter_placeholder": "Filter: name, type:x, tag:x",
  "graph.filter_clear": "Clear filter",
  "graph.filter_running": "Running",
  "graph.filter_stopped": "Stopped",
  "graph.filter_types": "Types",
  "graph.filter_group.capture": "Capture",
  "graph.filter_group.strip": "Color Strip",
  "graph.filter_group.audio": "Audio",
  "graph.filter_group.targets": "Targets",
  "graph.filter_group.other": "Other",
  "graph.bulk_delete_confirm": "Delete {count} selected entities?",
  "graph.nothing_to_undo": "Nothing to undo",
  "graph.nothing_to_redo": "Nothing to redo",
  "graph.help_title": "Keyboard Shortcuts",
  "graph.help.search": "Search",
  "graph.help.filter": "Filter",
  "graph.help.add": "Add entity",
  "graph.help.shortcuts": "Shortcuts",
  "graph.help.delete": "Delete / Detach",
  "graph.help.select_all": "Select all",
  "graph.help.undo": "Undo",
  "graph.help.redo": "Redo",
  "graph.help.fullscreen": "Fullscreen",
  "graph.help.deselect": "Deselect",
  "graph.help.navigate": "Navigate nodes",
  "graph.help.click": "Click",
  "graph.help.click_desc": "Select node",
  "graph.help.dblclick": "Double-click",
  "graph.help.dblclick_desc": "Zoom to node",
  "graph.help.shift_click": "Shift+Click",
  "graph.help.shift_click_desc": "Multi-select",
  "graph.help.shift_drag": "Shift+Drag",
  "graph.help.shift_drag_desc": "Rubber-band select",
  "graph.help.drag_node": "Drag node",
  "graph.help.drag_node_desc": "Reposition",
  "graph.help.drag_port": "Drag port",
  "graph.help.drag_port_desc": "Connect entities",
  "graph.help.right_click": "Right-click edge",
  "graph.help.right_click_desc": "Detach connection",
  "graph.tooltip.fps": "FPS",
  "graph.tooltip.errors": "Errors",
  "graph.tooltip.uptime": "Uptime",
  "automation.enabled": "Automation enabled",
  "automation.disabled": "Automation disabled",
  "scene_preset.activated": "Preset activated",
  "scene_preset.used_by": "Used by %d automation(s)",
  "settings.api_keys.label": "API Keys",
  "settings.api_keys.hint": "API keys are defined in the server config file (config.yaml). Edit the file and restart the server to apply changes.",
  "settings.api_keys.empty": "No API keys configured",
  "settings.api_keys.load_error": "Failed to load API keys",
  "settings.partial.label": "Partial Export / Import",
  "settings.partial.hint": "Export or import a single entity type. Import replaces or merges existing data and restarts the server.",
  "settings.partial.store.devices": "Devices",
  "settings.partial.store.output_targets": "LED Targets",
  "settings.partial.store.color_strip_sources": "Color Strips",
  "settings.partial.store.picture_sources": "Picture Sources",
  "settings.partial.store.audio_sources": "Audio Sources",
  "settings.partial.store.audio_templates": "Audio Templates",
  "settings.partial.store.capture_templates": "Capture Templates",
  "settings.partial.store.postprocessing_templates": "Post-processing Templates",
  "settings.partial.store.color_strip_processing_templates": "CSS Processing Templates",
  "settings.partial.store.pattern_templates": "Pattern Templates",
  "settings.partial.store.value_sources": "Value Sources",
  "settings.partial.store.sync_clocks": "Sync Clocks",
  "settings.partial.store.automations": "Automations",
  "settings.partial.store.scene_presets": "Scene Presets",
  "settings.partial.export_button": "Export",
  "settings.partial.import_button": "Import from File",
  "settings.partial.merge_label": "Merge (add/overwrite, keep existing)",
  "settings.partial.export_success": "Exported successfully",
  "settings.partial.export_error": "Export failed",
  "settings.partial.import_success": "Imported successfully",
  "settings.partial.import_error": "Import failed",
  "settings.partial.import_confirm_replace": "This will REPLACE all {store} data and restart the server. Continue?",
  "settings.partial.import_confirm_merge": "This will MERGE into existing {store} data and restart the server. Continue?",
  "section.empty.devices": "No devices yet. Click + to add one.",
  "section.empty.targets": "No LED targets yet. Click + to add one.",
  "section.empty.kc_targets": "No key color targets yet. Click + to add one.",
  "section.empty.pattern_templates": "No pattern templates yet. Click + to add one.",
  "section.empty.picture_sources": "No sources yet. Click + to add one.",
  "section.empty.capture_templates": "No capture templates yet. Click + to add one.",
  "section.empty.pp_templates": "No post-processing templates yet. Click + to add one.",
  "section.empty.audio_sources": "No audio sources yet. Click + to add one.",
  "section.empty.audio_templates": "No audio templates yet. Click + to add one.",
  "section.empty.color_strips": "No color strips yet. Click + to add one.",
  "section.empty.value_sources": "No value sources yet. Click + to add one.",
  "section.empty.sync_clocks": "No sync clocks yet. Click + to add one.",
  "section.empty.weather_sources": "No weather sources yet. Click + to add one.",
  "section.empty.cspt": "No CSS processing templates yet. Click + to add one.",
  "section.empty.automations": "No automations yet. Click + to add one.",
  "section.empty.scenes": "No scene presets yet. Click + to add one.",
  "bulk.select": "Select",
  "bulk.cancel": "Cancel",
  "bulk.selected_count.one": "{count} selected",
  "bulk.selected_count.other": "{count} selected",
  "bulk.select_all": "Select all",
  "bulk.deselect_all": "Deselect all",
  "bulk.delete": "Delete",
  "bulk.start": "Start",
  "bulk.stop": "Stop",
  "bulk.enable": "Enable",
  "bulk.disable": "Disable",
  "bulk.confirm_delete.one": "Delete {count} item?",
  "bulk.confirm_delete.other": "Delete {count} items?",
  "appearance.style.label": "Style Presets",
  "appearance.style.hint": "Choose a visual theme — font pairing and color palette applied together.",
  "appearance.preset.default": "Default",
  "appearance.preset.midnight": "Midnight",
  "appearance.preset.ember": "Ember",
  "appearance.preset.arctic": "Arctic",
  "appearance.preset.terminal": "Terminal",
  "appearance.preset.neon": "Neon",
  "appearance.preset.sakura": "Sakura",
  "appearance.preset.ocean": "Ocean",
  "appearance.preset.copper": "Copper",
  "appearance.preset.vapor": "Vapor",
  "appearance.preset.monolith": "Monolith",
  "appearance.preset.applied": "Style preset applied",
  "appearance.bg.label": "Background Effects",
  "appearance.bg.hint": "Add an ambient background layer behind the interface.",
  "appearance.bg.none": "None",
  "appearance.bg.noise": "Noise Field",
  "appearance.bg.aurora": "Aurora",
  "appearance.bg.plasma": "Plasma",
  "appearance.bg.rain": "Digital Rain",
  "appearance.bg.stars": "Starfield",
  "appearance.bg.warp": "Warp Tunnel",
  "appearance.bg.grid": "Dot Grid",
  "appearance.bg.mesh": "Gradient Mesh",
  "appearance.bg.scanlines": "Scanlines",
  "appearance.bg.applied": "Background effect applied",
  "settings.tab.notifications": "Notifications",
  "settings.tab.updates": "Updates",
  "settings.tab.about": "About",
  "settings.notifications.intro_label": "Device events",
  "settings.notifications.intro_hint": "Pick how each device event reaches you. \"Snack\" shows an in-app toast, \"OS\" shows a system notification (browser must be granted permission), \"Both\" shows both, \"None\" silences the event entirely.",
  "settings.notifications.row.online": "Device came online",
  "settings.notifications.row.offline": "Device went offline",
  "settings.notifications.row.discovered": "New device found",
  "settings.notifications.row.lost": "Discovered device lost",
  "settings.notifications.background.label": "Background discovery",
  "settings.notifications.background.hint": "Continuously scan the LAN (mDNS) and serial bus for new LED devices. Disable to silence \"device discovered/lost\" events at the source. Restart the server to apply.",
  "settings.notifications.background.toggle": "Enable background discovery",
  "settings.notifications.permission.label": "OS notification permission",
  "settings.notifications.permission.grant": "Grant permission",
  "settings.notifications.permission.granted": "OS notifications enabled",
  "settings.notifications.permission.denied": "OS notifications blocked — change in browser settings",
  "settings.notifications.permission.state.granted": "Granted — OS toasts will appear",
  "settings.notifications.permission.state.denied": "Denied — change in browser settings",
  "settings.notifications.permission.state.default": "Not yet requested",
  "settings.notifications.permission.hint": "The browser controls OS notification permission per site. Once denied, LedGrab can no longer ask again — you need to clear it in the browser. Click the site icon (lock) in the address bar → Site settings → Notifications → Allow, then reload.",
  "settings.notifications.test_button": "Send a test notification",
  "settings.notifications.saved": "Notification preferences saved",
  "settings.notifications.save_error": "Failed to save notification preferences",
  "settings.notifications.channel.none.label": "Off",
  "settings.notifications.channel.none.desc": "Silence this event",
  "settings.notifications.channel.snack.label": "Snack",
  "settings.notifications.channel.snack.desc": "In-app toast at the bottom of the page",
  "settings.notifications.channel.os.label": "OS",
  "settings.notifications.channel.os.desc": "System notification (works while the browser is in the background)",
  "settings.notifications.channel.both.label": "Both",
  "settings.notifications.channel.both.desc": "In-app toast and system notification",
  "settings.notifications.permission.pill.granted": "GRANTED",
  "settings.notifications.permission.pill.denied": "BLOCKED",
  "settings.rail.group.workspace": "Workspace",
  "settings.rail.group.system": "System",
  "settings.save_bar.unsaved": "Unsaved changes in",
  "settings.save_bar.revert": "Revert",
  "settings.save_bar.save": "Save",
  "settings.section.api_keys": "Identity & API",
  "settings.section.server": "Server",
  "settings.section.lifecycle": "Lifecycle",
  "settings.section.destructive": "DESTRUCTIVE",
  "settings.section.manual": "Manual",
  "settings.section.notif_channels": "Channels",
  "settings.section.notif_discovery": "Discovery",
  "settings.section.notif_permission": "OS Permission",
  "settings.api_keys.read_only": "Read-only",
  "settings.api_keys.meta.one": "key",
  "settings.api_keys.meta.many": "keys",
  "settings.logs.sub": "Live tail of server log output, filterable by level. Opens in a full-screen overlay.",
  "settings.restart.sub": "Bounce the LedGrab process. Active capture and connected devices will pause for ~3 seconds.",
  "settings.restart.button": "Restart",
  "settings.notif_matrix.col.event": "Event",
  "settings.notif_matrix.event_count": "4 EVENTS",
  "settings.auto_backup.pill.running": "RUNNING",
  "update.pill.available": "UPDATE AVAILABLE",
  "update.pill.error": "ERROR",
  "update.pill.updated": "UP TO DATE",
  "notifications.unknown_device": "Unknown device",
  "notifications.device_online.title": "Device online",
  "notifications.device_online.body": "{device} is back online",
  "notifications.device_offline.title": "Device offline",
  "notifications.device_offline.body": "{device} stopped responding",
  "notifications.device_discovered.title": "New device found",
  "notifications.device_discovered.body": "{device} appeared on your network",
  "notifications.device_lost.title": "Device lost",
  "notifications.device_lost.body": "{device} disappeared",
  "notifications.bulk.title": "Multiple devices changed",
  "notifications.bulk.body": "{count} device events fired at once",
  "notifications.test.title": "LedGrab test notification",
  "notifications.test.body": "Notifications are wired up correctly.",
  "update.status_label": "Update Status",
  "update.current_version": "Current version:",
  "update.badge_tooltip": "New version available — click for details",
  "update.available": "Version {version} is available",
  "update.up_to_date": "You are running the latest version",
  "update.prerelease": "pre-release",
  "update.view_release": "View Release",
  "update.dismiss": "Dismiss",
  "update.check_now": "Check for Updates",
  "update.check_error": "Update check failed",
  "update.last_check": "Last check",
  "update.never": "never",
  "update.release_notes": "Release Notes",
  "update.view_release_notes": "View Release Notes",
  "update.release_notes_hint": "What's new in the available version — read the changelog before applying.",
  "update.release_notes_open": "Open",
  "update.assets.title": "Downloads",
  "update.assets.desc.windows_installer": "Windows installer — Start Menu shortcut, optional autostart, uninstaller",
  "update.assets.desc.windows_portable": "Windows portable — unzip anywhere, run LedGrab.bat",
  "update.assets.desc.windows_msi": "Windows MSI installer",
  "update.assets.desc.windows_exe": "Windows executable",
  "update.assets.desc.linux_tarball": "Linux archive — extract, run ./run.sh",
  "update.assets.desc.linux_appimage": "Linux portable — single executable",
  "update.assets.desc.linux_deb": "Debian / Ubuntu package",
  "update.assets.desc.linux_rpm": "Fedora / RHEL package",
  "update.assets.desc.linux_sandbox": "Sandboxed Linux package",
  "update.assets.desc.macos_dmg": "macOS disk image — drag to Applications",
  "update.assets.desc.macos_installer": "macOS installer package",
  "update.assets.desc.android": "Android — sideload on Android 7.0+",
  "update.assets.desc.android_bundle": "Android App Bundle (Play Store)",
  "update.assets.desc.ios": "iOS application",
  "update.assets.desc.zip_archive": "ZIP archive",
  "update.assets.desc.tarball": "Tar archive",
  "update.assets.desc.archive": "Compressed archive",
  "update.auto_check_label": "Auto-Check Settings",
  "update.auto_check_hint": "Periodically check for new releases in the background.",
  "update.enable": "Enable auto-check",
  "update.interval_label": "Check interval",
  "update.channel_label": "Channel",
  "update.channel.stable": "Stable",
  "update.channel.stable_desc": "Stable releases only",
  "update.channel.prerelease": "Pre-release",
  "update.channel.prerelease_desc": "Include alpha, beta, and RC builds",
  "update.save_settings": "Save Settings",
  "update.settings_saved": "Update settings saved",
  "update.settings_save_error": "Failed to save update settings",
  "update.apply_now": "Update Now",
  "update.apply_confirm": "Download and install version {version}? The server will restart automatically.",
  "update.apply_error": "Update failed",
  "update.applying": "Applying update…",
  "update.downloading": "Downloading…",
  "update.install_type_label": "Install type:",
  "update.install_type.installer": "Windows installer",
  "update.install_type.portable": "Portable",
  "update.install_type.docker": "Docker",
  "update.install_type.dev": "Development",
  "color_strip.notification.search_apps": "Search notification apps…",
  "asset.group.title": "Assets",
  "asset.upload": "Upload Asset",
  "asset.edit": "Edit Asset",
  "asset.name": "Name:",
  "asset.name.hint": "Display name for this asset.",
  "asset.description": "Description:",
  "asset.description.hint": "Optional description for this asset.",
  "asset.file": "File:",
  "asset.file.hint": "Select a file to upload (sound, image, video, or other).",
  "asset.drop_or_browse": "Drop file here or click to browse",
  "asset.uploaded": "Asset uploaded",
  "asset.updated": "Asset updated",
  "asset.deleted": "Asset deleted",
  "asset.confirm_delete": "Delete this asset?",
  "asset.error.name_required": "Name is required",
  "asset.error.no_file": "Please select a file to upload",
  "asset.error.delete_failed": "Failed to delete asset",
  "asset.error.play_failed": "Failed to play sound",
  "asset.error.download_failed": "Failed to download asset",
  "asset.play": "Play",
  "asset.download": "Download",
  "asset.prebuilt": "Prebuilt",
  "asset.prebuilt_restored": "{count} prebuilt asset(s) restored",
  "asset.prebuilt_none_to_restore": "All prebuilt assets are already available",
  "asset.restore_prebuilt": "Restore Prebuilt Sounds",
  "asset.type.sound": "Sound",
  "asset.type.image": "Image",
  "asset.type.video": "Video",
  "asset.type.other": "Other",
  "streams.group.assets": "Assets",
  "section.empty.assets": "No assets yet. Click + to upload one.",
  "donation.message": "LedGrab is free & open-source. If it's useful to you, consider supporting development.",
  "donation.support": "Support the project",
  "donation.view_source": "View source code",
  "donation.about": "About",
  "donation.later": "Remind me later",
  "donation.dismiss": "Don't show again",
  "donation.about_title": "About LedGrab",
  "donation.about_opensource": "LedGrab is open-source software, free to use and modify.",
  "donation.about_donate": "Support development",
  "donation.about_license": "MIT License",
  "donation.about_author": "Created by",

  "streams.group.game": "Game Integration",
  "tree.group.game": "Game",
  "game_integration.section_title": "Game Integrations",
  "section.empty.game_integrations": "No game integrations yet. Click + to create one.",
  "game_integration.add": "Add Game Integration",
  "game_integration.edit": "Edit Game Integration",
  "game_integration.created": "Game integration created",
  "game_integration.updated": "Game integration updated",
  "game_integration.deleted": "Game integration deleted",
  "game_integration.confirm_delete": "Delete this game integration?",
  "game_integration.error.name_required": "Name is required",
  "game_integration.error.save_failed": "Failed to save game integration",
  "game_integration.error.delete_failed": "Failed to delete game integration",
  "game_integration.error.save_first": "Save the integration first to test the connection",
  "game_integration.name": "Name:",
  "game_integration.name.hint": "A descriptive name for this game integration",
  "game_integration.description": "Description:",
  "game_integration.description.hint": "Optional description of what this integration does",
  "game_integration.enabled": "Enabled",
  "game_integration.adapter_type": "Game / Adapter:",
  "game_integration.adapter_type.hint": "Select the game or adapter type for this integration",
  "game_integration.adapter_config": "Adapter Configuration",
  "game_integration.no_config": "No configuration required for this adapter.",
  "game_integration.setup_instructions": "Setup Instructions",
  "game_integration.setup_instructions.hint": "Follow these steps to configure your game to send data to this integration",
  "game_integration.event_mappings": "Event Mappings",
  "game_integration.event_mappings.hint": "Map game events to LED effects. Each event type can trigger a different visual effect.",
  "game_integration.mapping.add": "+ Add Mapping",
  "game_integration.mapping.event_type": "Event",
  "game_integration.mapping.effect_type": "Effect",
  "game_integration.mapping.color": "Color",
  "game_integration.mapping.duration": "Duration (ms)",
  "game_integration.mapping.intensity": "Intensity",
  "game_integration.mapping.priority": "Priority",
  "game_integration.mapping.select_preset": "Load preset...",
  "game_integration.preset.select": "Load preset...",
  "game_integration.preset.fps_combat": "FPS Combat",
  "game_integration.preset.moba_health": "MOBA Health",
  "game_integration.adapter": "Adapter",
  "game_integration.status": "Status",
  "game_integration.status.active": "Active",
  "game_integration.status.inactive": "Inactive",
  "game_integration.mappings": "Mappings",
  "game_integration.events.title": "Live Events",
  "game_integration.events.waiting": "Waiting for events...",
  "game_integration.events.monitor": "Event Monitor",
  "game_integration.test.button": "Test Connection",
  "game_integration.test.waiting": "Waiting for events from game...",
  "game_integration.test.success": "Connection successful! Received events.",
  "game_integration.test.error": "Connection error",
  "game_integration.test.timeout": "No events received within timeout period.",
  "game_integration.auto_setup": "Auto Setup",
  "game_integration.auto_setup.success": "Configuration file written successfully",
  "game_integration.auto_setup.failed": "Auto setup failed",
  "game_integration.auto_setup.not_supported": "This adapter does not support auto setup",
  "game_integration.auto_setup.game_not_found": "Game installation not found",
  "game_integration.auto_setup.token_generated": "Auth token was automatically generated",
  "game_integration.auto_setup.save_first": "Save the integration first before running auto setup",

  "color_strip.type.game_event": "Game Event",
  "color_strip.type.game_event.desc": "LED effects triggered by game events",
  "color_strip.game_event.integration": "Game Integration:",
  "color_strip.game_event.integration.hint": "Select the game integration that provides events for this source.",
  "color_strip.game_event.idle_color": "Idle Color:",
  "color_strip.game_event.idle_color.hint": "LED color when no game events are active.",
  "color_strip.game_event.event_mappings": "Event Mappings:",
  "color_strip.game_event.event_mappings.hint": "Override or add event-to-effect mappings for this source. These supplement the integration-level mappings.",
  "color_strip.game_event.error.no_integration": "Please select a game integration.",

  "color_strip.type.math_wave": "Math Wave",
  "color_strip.type.math_wave.desc": "Mathematical wave generator with gradient color mapping",
  "color_strip.math_wave.gradient": "Color Gradient:",
  "color_strip.math_wave.gradient.hint": "The gradient used to color the wave output. Wave values are mapped to positions along this gradient.",
  "color_strip.math_wave.speed": "Speed:",
  "color_strip.math_wave.speed.hint": "Animation speed multiplier. Higher values make the wave move faster.",
  "color_strip.math_wave.waves": "Wave Layers:",
  "color_strip.math_wave.waves.hint": "Add multiple wave layers that are combined together. Each wave has its own waveform, frequency, amplitude, phase and offset.",
  "color_strip.math_wave.add_wave": "+ Add Wave",
  "color_strip.math_wave.waveform": "Waveform",
  "color_strip.math_wave.waveform.sine": "Sine",
  "color_strip.math_wave.waveform.triangle": "Triangle",
  "color_strip.math_wave.waveform.sawtooth": "Sawtooth",
  "color_strip.math_wave.waveform.square": "Square",
  "color_strip.math_wave.frequency": "Frequency",
  "color_strip.math_wave.amplitude": "Amplitude",
  "color_strip.math_wave.phase": "Phase",
  "color_strip.math_wave.offset": "Offset",
  "color_strip.math_wave.error.no_waves": "Add at least one wave layer.",

  "value_source.type.game_event": "Game Event",
  "value_source.type.game_event.desc": "Game metrics (health, ammo, mana) as 0-1 values",
  "value_source.game_event.integration": "Game Integration:",
  "value_source.game_event.integration.hint": "Select the game integration that provides events for this value source.",
  "value_source.game_event.event_type": "Event Type:",
  "value_source.game_event.event_type.hint": "The continuous game event to track (health, mana, ammo, etc.).",
  "value_source.game_event.min_game_value": "Min Game Value:",
  "value_source.game_event.min_game_value.hint": "Raw game value that maps to output 0.0.",
  "value_source.game_event.max_game_value": "Max Game Value:",
  "value_source.game_event.max_game_value.hint": "Raw game value that maps to output 1.0.",
  "value_source.game_event.smoothing": "Smoothing:",
  "value_source.game_event.smoothing.hint": "EMA smoothing factor. 0 = instant, higher = smoother transitions.",
  "value_source.game_event.default_value": "Default Value:",
  "value_source.game_event.default_value.hint": "Output value when no events received within timeout.",
  "value_source.game_event.timeout": "Timeout (s):",
  "value_source.game_event.timeout.hint": "Seconds of silence before reverting to the default value.",

  "audio_processing.title": "Audio Processing Templates",
  "audio_processing.add": "Add Audio Processing Template",
  "audio_processing.edit": "Edit Audio Processing Template",
  "audio_processing.name": "Template Name:",
  "audio_processing.name.hint": "A descriptive name for this audio processing template",
  "audio_processing.name_placeholder": "My Audio Processing Template",
  "audio_processing.description_label": "Description (optional):",
  "audio_processing.description.hint": "Describe what this template does",
  "audio_processing.description_placeholder": "Describe this template...",
  "audio_processing.created": "Audio processing template created",
  "audio_processing.updated": "Audio processing template updated",
  "audio_processing.deleted": "Audio processing template deleted",
  "audio_processing.delete.confirm": "Are you sure you want to delete this audio processing template?",
  "audio_processing.error.required": "Please fill in all required fields",
  "audio_processing.error.load": "Error loading audio processing template",
  "audio_processing.error.delete": "Error deleting audio processing template",
  "audio_processing.error.clone_failed": "Failed to clone audio processing template",
  "audio_processing.filter_count": "Filter count",
  "audio_processing.filters_label": "filters",
  "streams.group.audio_processing": "Audio Processing",
  "section.empty.audio_processing_templates": "No audio processing templates yet. Click + to create one.",
  "audio_source.group.capture": "Capture Sources",
  "audio_source.group.processed": "Processed Sources",
  "pairing.title": "Pair Device",
  "pairing.instructions.default": "Press and hold the pairing button on your device, then click Start. Devices typically open a 30-second pairing window — be ready to act quickly.",
  "pairing.start": "Start pairing",
  "pairing.pairing": "Pairing…",
  "pairing.cancel": "Cancel",
  "pairing.retry": "Try again",
  "pairing.close": "Close",
  "pairing.success": "Paired successfully",
  "pairing.not_ready": "Device didn't respond. Press the pairing button on your device, then try again.",
  "pairing.failed": "Pairing failed: {detail}",
  "pairing.failed_prefix": "Pairing failed:"
}
