{
    "app.title": "LED Grab",
    "app.version": "Version:",
    "app.api_docs": "API Documentation",
    "app.connection_lost": "Server unreachable",
    "app.connection_retrying": "Attempting to reconnect…",
    "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.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",
    "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.device": "Select a 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",
    "templates.engine.wgc.desc": "Windows Graphics 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.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.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.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.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.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.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.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:",
    "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...",
    "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.metadata": "Device info (LED count, type, color channels) is auto-detected from the device",
    "device.tip.brightness": "Slide to adjust device brightness",
    "device.tip.start": "Start or stop screen capture processing",
    "device.tip.settings": "Configure general device settings (name, URL, health check)",
    "device.tip.capture_settings": "Configure capture settings (display, capture template)",
    "device.tip.calibrate": "Calibrate LED positions, direction, and coverage",
    "device.tip.webui": "Open the device's built-in web interface for advanced configuration",
    "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.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.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 conditions.",
    "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.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.tgt.led_tab": "LED tab — standard LED strip targets with device and color strip configuration.",
    "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.kc_tab": "Key Colors — alternative target type using color-matching instead of pixel mapping.",
    "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 — analyze microphone or system audio for reactive LED effects.",
    "tour.src.value": "Value — numeric data sources used as conditions in 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 conditions.",
    "tour.auto.add": "Click + to create a new automation with conditions and a scene to activate.",
    "tour.auto.card": "Each card shows automation status, conditions, 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.",
    "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.edit": "Edit",
    "common.clone": "Clone",
    "common.none": "None",
    "common.none_no_cspt": "None (no processing template)",
    "common.none_no_input": "None (no input source)",
    "common.none_own_speed": "None (use own speed)",
    "common.undo": "Undo",
    "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",
    "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": "Sources",
    "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",
    "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 video file, URL, or YouTube",
    "picture_source.video.url": "Video URL:",
    "picture_source.video.url.hint": "Local file path, HTTP URL, or YouTube URL",
    "picture_source.video.url.placeholder": "https://example.com/video.mp4",
    "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_source": "Image Source:",
    "streams.image_source.placeholder": "https://example.com/image.jpg or C:\\path\\to\\image.png",
    "streams.image_source.hint": "Enter a URL (http/https) or local file path to an image",
    "streams.validate_image.validating": "Validating...",
    "streams.validate_image.valid": "Image accessible",
    "streams.validate_image.invalid": "Image not accessible",
    "targets.title": "Targets",
    "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.metrics.pipeline": "Pipeline details",
    "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.subtab.key_colors": "Key Colors",
    "targets.section.key_colors": "Key Colors Targets",
    "kc.add": "Add Key Colors Target",
    "kc.edit": "Edit Key Colors Target",
    "kc.name": "Target Name:",
    "kc.name.placeholder": "My Key Colors Target",
    "kc.source": "Picture Source:",
    "kc.source.hint": "Which picture source to extract colors from",
    "kc.source.none": "-- No source assigned --",
    "kc.fps": "Extraction FPS:",
    "kc.fps.hint": "How many times per second to extract colors (1-60)",
    "kc.interpolation": "Color Mode:",
    "kc.interpolation.hint": "How to compute the key color from pixels in each rectangle",
    "kc.interpolation.average": "Average",
    "kc.interpolation.median": "Median",
    "kc.interpolation.dominant": "Dominant",
    "kc.interpolation.average.desc": "Mean of all pixel colors",
    "kc.interpolation.median.desc": "Middle color value per channel",
    "kc.interpolation.dominant.desc": "Most frequent color",
    "kc.smoothing": "Smoothing:",
    "kc.smoothing.hint": "Temporal blending between extractions (0=none, 1=full)",
    "kc.pattern_template": "Pattern Template:",
    "kc.pattern_template.hint": "Select the rectangle pattern to use for color extraction",
    "kc.pattern_template.none": "-- Select a pattern template --",
    "kc.brightness_vs": "Brightness Source:",
    "kc.brightness_vs.hint": "Optional value source that dynamically controls brightness each frame (multiplied with the manual brightness slider)",
    "kc.brightness_vs.none": "None (manual brightness only)",
    "kc.created": "Key colors target created successfully",
    "kc.updated": "Key colors target updated successfully",
    "kc.deleted": "Key colors target deleted successfully",
    "kc.delete.confirm": "Are you sure you want to delete this key colors target?",
    "kc.error.no_pattern": "Please select a pattern template",
    "kc.error.required": "Please fill in all required fields",
    "kc.colors.none": "No colors extracted yet",
    "kc.test": "Test",
    "kc.test.error": "Test failed",
    "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",
    "dashboard.title": "Dashboard",
    "dashboard.section.targets": "Targets",
    "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.perf.cpu": "CPU",
    "dashboard.perf.ram": "RAM",
    "dashboard.perf.gpu": "GPU",
    "dashboard.perf.unavailable": "unavailable",
    "dashboard.perf.color": "Chart color",
    "dashboard.poll_interval": "Refresh interval",
    "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.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.condition_logic": "Condition Logic:",
    "automations.condition_logic.hint": "How multiple conditions are combined: ANY (OR) or ALL (AND)",
    "automations.condition_logic.or": "Any condition (OR)",
    "automations.condition_logic.and": "All conditions (AND)",
    "automations.condition_logic.or.desc": "Triggers when any condition matches",
    "automations.condition_logic.and.desc": "Triggers only when all match",
    "automations.conditions": "Conditions:",
    "automations.conditions.hint": "Rules that determine when this automation activates",
    "automations.conditions.add": "Add Condition",
    "automations.conditions.empty": "No conditions — automation is always active when enabled",
    "automations.condition.always": "Always",
    "automations.condition.always.desc": "Always active",
    "automations.condition.always.hint": "Automation activates immediately when enabled and stays active.",
    "automations.condition.startup": "Startup",
    "automations.condition.startup.desc": "On server start",
    "automations.condition.startup.hint": "Activates when the server starts and stays active while enabled.",
    "automations.condition.application": "Application",
    "automations.condition.application.desc": "App running/focused",
    "automations.condition.application.apps": "Applications:",
    "automations.condition.application.apps.hint": "Process names, one per line (e.g. firefox.exe)",
    "automations.condition.application.browse": "Browse",
    "automations.condition.application.search": "Filter processes...",
    "automations.condition.application.no_processes": "No processes found",
    "automations.condition.application.match_type": "Match Type:",
    "automations.condition.application.match_type.hint": "How to detect the application",
    "automations.condition.application.match_type.running": "Running",
    "automations.condition.application.match_type.running.desc": "Process is active",
    "automations.condition.application.match_type.topmost": "Topmost",
    "automations.condition.application.match_type.topmost.desc": "Foreground window",
    "automations.condition.application.match_type.topmost_fullscreen": "Topmost + FS",
    "automations.condition.application.match_type.topmost_fullscreen.desc": "Foreground + fullscreen",
    "automations.condition.application.match_type.fullscreen": "Fullscreen",
    "automations.condition.application.match_type.fullscreen.desc": "Any fullscreen app",
    "automations.condition.time_of_day": "Time of Day",
    "automations.condition.time_of_day.desc": "Time range",
    "automations.condition.time_of_day.start_time": "Start Time:",
    "automations.condition.time_of_day.end_time": "End Time:",
    "automations.condition.time_of_day.overnight_hint": "For overnight ranges (e.g. 22:00–06:00), set start time after end time.",
    "automations.condition.system_idle": "System Idle",
    "automations.condition.system_idle.desc": "User idle/active",
    "automations.condition.system_idle.idle_minutes": "Idle Timeout (minutes):",
    "automations.condition.system_idle.mode": "Trigger Mode:",
    "automations.condition.system_idle.when_idle": "When idle",
    "automations.condition.system_idle.when_active": "When active",
    "automations.condition.display_state": "Display State",
    "automations.condition.display_state.desc": "Monitor on/off",
    "automations.condition.display_state.state": "Monitor State:",
    "automations.condition.display_state.on": "On",
    "automations.condition.display_state.off": "Off (sleeping)",
    "automations.condition.mqtt": "MQTT",
    "automations.condition.mqtt.desc": "MQTT message",
    "automations.condition.mqtt.topic": "Topic:",
    "automations.condition.mqtt.payload": "Payload:",
    "automations.condition.mqtt.match_mode": "Match Mode:",
    "automations.condition.mqtt.match_mode.exact": "Exact",
    "automations.condition.mqtt.match_mode.contains": "Contains",
    "automations.condition.mqtt.match_mode.regex": "Regex",
    "automations.condition.mqtt.hint": "Activate when an MQTT topic receives a matching payload",
    "automations.condition.webhook": "Webhook",
    "automations.condition.webhook.desc": "HTTP callback",
    "automations.condition.webhook.hint": "Activate via an HTTP call from external services (Home Assistant, IFTTT, curl, etc.)",
    "automations.condition.webhook.url": "Webhook URL:",
    "automations.condition.webhook.copy": "Copy",
    "automations.condition.webhook.copied": "Copied!",
    "automations.condition.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.capture": "Capture",
    "scenes.activate": "Activate scene",
    "scenes.recapture": "Recapture current state",
    "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",
    "time.hours_minutes": "{h}h {m}m",
    "time.minutes_seconds": "{m}m {s}s",
    "time.seconds": "{s}s",
    "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 Source",
    "color_strip.edit": "Edit Color Strip Source",
    "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.type.color_cycle": "Color Cycle",
    "color_strip.type.color_cycle.desc": "Cycle through a list of colors",
    "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.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.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.color_cycle": "Color Cycle",
    "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.speed": "Speed:",
    "color_strip.animation.speed.hint": "Animation speed multiplier. 1.0 ≈ one cycle per second for Breathing; higher values cycle faster.",
    "color_strip.color_cycle.colors": "Colors:",
    "color_strip.color_cycle.colors.hint": "List of colors to cycle through smoothly. At least 2 required. Default is a full rainbow spectrum.",
    "color_strip.color_cycle.add_color": "+ Add Color",
    "color_strip.color_cycle.speed": "Speed:",
    "color_strip.color_cycle.speed.hint": "Cycle speed multiplier. 1.0 ≈ one full cycle every 20 seconds; higher values cycle faster.",
    "color_strip.color_cycle.min_colors": "Color cycle must have at least 2 colors",
    "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.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.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.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.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.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.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.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.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.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.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.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.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",
    "audio_source.title": "Audio Sources",
    "audio_source.group.multichannel": "Multichannel",
    "audio_source.group.mono": "Mono",
    "audio_source.add": "Add Audio Source",
    "audio_source.add.multichannel": "Add Multichannel Source",
    "audio_source.add.mono": "Add Mono Source",
    "audio_source.edit": "Edit Audio Source",
    "audio_source.edit.multichannel": "Edit Multichannel Source",
    "audio_source.edit.mono": "Edit Mono 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": "Multichannel captures all channels from a physical audio device. Mono extracts a single channel from a multichannel source.",
    "audio_source.type.multichannel": "Multichannel",
    "audio_source.type.mono": "Mono",
    "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": "Parent Source:",
    "audio_source.parent.hint": "Multichannel source to extract a channel from",
    "audio_source.channel": "Channel:",
    "audio_source.channel.hint": "Which audio channel to extract from the multichannel source",
    "audio_source.channel.mono": "Mono (L+R mix)",
    "audio_source.channel.left": "Left",
    "audio_source.channel.right": "Right",
    "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",
    "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.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": "Brightness follows day/night cycle",
    "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, brightness 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). Affects sunrise/sunset timing in real-time mode.",
    "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 (multichannel or mono)",
    "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_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 Backup",
    "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 from Backup",
    "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.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.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",
    "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",
    "kc_target.error.editor_open_failed": "Failed to open key colors editor",
    "kc_target.error.clone_failed": "Failed to clone key colors target",
    "kc_target.error.delete_failed": "Failed to delete key colors target",
    "theme.switched.dark": "Switched to dark theme",
    "theme.switched.light": "Switched to light 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",
    "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.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",

    "color_strip": {
        "notification": {
            "search_apps": "Search notification apps…"
        }
    }
}