- Convert graph editor add-entity menu to showTypePicker icon grid with SVG icons - Add CSPT to graph add-entity picker and ALL_CACHES watcher - Add graphNavigateToNode() — command palette navigates to graph node when graph tab active - Add CSPT entities to global search palette results - Add overlay toggle button on picture-based CSS cards (toggleCSSOverlay) - Fix clipboard copy on non-HTTPS (LAN) with execCommand fallback for all copy functions - Fix notification bell button vertical centering in test preview strip canvas - Add overlay.toggle, search.group.cspt i18n keys (en/ru/zh) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1508 lines
91 KiB
JSON
1508 lines
91 KiB
JSON
{
|
||
"app.title": "LED Grab",
|
||
"app.version": "Version:",
|
||
"app.api_docs": "API Documentation",
|
||
"app.connection_lost": "Server unreachable",
|
||
"app.connection_retrying": "Attempting to reconnect…",
|
||
"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.toggle_password": "Toggle password visibility",
|
||
"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.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.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.type.openrgb": "OpenRGB",
|
||
"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 successfully",
|
||
"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.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.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 successfully",
|
||
"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",
|
||
"common.loading": "Loading...",
|
||
"common.delete": "Delete",
|
||
"common.edit": "Edit",
|
||
"common.clone": "Clone",
|
||
"common.none": "None",
|
||
"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": "Screen Capture",
|
||
"streams.group.processed": "Processed",
|
||
"streams.group.css_processing": "Processing Templates",
|
||
"streams.group.color_strip": "Color Strips",
|
||
"streams.group.audio": "Audio",
|
||
"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.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.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": "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.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.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.apply": "Apply",
|
||
"color_strip.test.composite": "Composite",
|
||
"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": "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.opacity": "Opacity",
|
||
"color_strip.composite.brightness": "Brightness",
|
||
"color_strip.composite.brightness.none": "— None —",
|
||
"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.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",
|
||
"tree.group.strip": "Color Strip",
|
||
"tree.group.utility": "Utility",
|
||
"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",
|
||
"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.button.close": "Close",
|
||
"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",
|
||
"device.error.power_off_failed": "Failed to turn off device",
|
||
"device.removed": "Device removed",
|
||
"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_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.saved": "Calibration saved",
|
||
"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.",
|
||
"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 by name...",
|
||
"graph.filter_clear": "Clear filter",
|
||
"graph.filter_running": "Running",
|
||
"graph.filter_stopped": "Stopped"
|
||
}
|