${escapeHtml(t('activity_log.empty_no_filters'))}
+config/default_config.yaml:",
- "setup.step2_label": "2. Restart the server, then reload this page and log in with that key.",
- "setup.step3_label": "Alternative: open LedGrab from the server machine itself (loopback), no key required:",
- "setup.hint_openssl": "Generate a strong key on Linux/macOS with openssl rand -hex 32, or on Windows PowerShell with [guid]::NewGuid().ToString('N') + [guid]::NewGuid().ToString('N').",
- "setup.copy": "Copy snippet",
- "setup.copied": "Copied to clipboard",
- "setup.retry": "I've configured a key — retry",
- "setup.still_required": "Server still reports no API keys. Make sure you saved the config file and restarted the server.",
- "displays.title": "Available Displays",
- "displays.layout": "Displays",
- "displays.information": "Display Information",
- "displays.legend.primary": "Primary Display",
- "displays.legend.secondary": "Secondary Display",
- "displays.badge.primary": "Primary",
- "displays.badge.secondary": "Secondary",
- "displays.resolution": "Resolution:",
- "displays.refresh_rate": "Refresh Rate:",
- "displays.position": "Position:",
- "displays.index": "Display Index:",
- "displays.loading": "Loading displays...",
- "displays.none": "No displays available",
- "displays.failed": "Failed to load displays",
- "displays.picker.title": "Select a Display",
- "displays.picker.title.lead": "Select",
- "displays.picker.title.accent": "Display",
- "displays.picker.eyebrow.label": "Source",
- "displays.picker.eyebrow.channel": "Display · Map",
- "displays.picker.eyebrow.channel.device": "Device · List",
- "displays.picker.foot.dismiss": "dismiss",
- "displays.picker.foot.select": "select monitor",
- "displays.picker.foot.select.device": "select device",
- "displays.picker.select": "Select display...",
- "displays.picker.click_to_select": "Click to select this display",
- "displays.picker.adb_connect": "Connect ADB device",
- "displays.picker.adb_connect.placeholder": "IP address (e.g. 192.168.2.201)",
- "displays.picker.adb_connect.button": "Connect",
- "displays.picker.adb_connect.success": "Device connected",
- "displays.picker.adb_connect.error": "Failed to connect device",
- "displays.picker.adb_disconnect": "Disconnect",
- "displays.picker.no_android": "No Android devices found. Connect via USB or enter IP above.",
- "templates.title": "Engine Templates",
- "templates.description": "Capture templates define how the screen is captured. Each template uses a specific capture engine (MSS, DXcam, WGC) with custom settings. Assign templates to devices for optimal performance.",
- "templates.loading": "Loading templates...",
- "templates.empty": "No capture templates configured",
- "templates.add": "Add Engine Template",
- "templates.edit": "Edit Engine Template",
- "templates.name": "Template Name:",
- "templates.name.placeholder": "My Custom Template",
- "templates.description.label": "Description (optional):",
- "templates.description.placeholder": "Describe this template...",
- "templates.engine": "Capture Engine:",
- "templates.engine.hint": "Select the screen capture technology to use",
- "templates.engine.select": "Select an engine...",
- "templates.engine.unavailable": "Unavailable",
- "templates.engine.unavailable.hint": "This engine is not available on your system",
- "templates.engine.mss.desc": "Cross-platform, pure Python",
- "templates.engine.dxcam.desc": "DirectX, low latency",
- "templates.engine.bettercam.desc": "DirectX, high performance",
- "templates.engine.camera.desc": "USB/IP camera capture",
- "templates.engine.scrcpy.desc": "Android screen mirror (adb screencap)",
- "templates.engine.scrcpy_client.desc": "Android H.264 stream, high FPS",
- "templates.engine.wgc.desc": "Windows Graphics Capture",
- "templates.engine.demo.desc": "Animated test pattern (demo mode)",
- "templates.engine.mediaprojection.desc": "Native Android screen capture",
- "templates.engine.android_camera.desc": "On-device camera capture (Camera2)",
- "templates.config": "Configuration",
- "templates.config.show": "Show configuration",
- "templates.config.none": "No additional configuration",
- "templates.config.default": "Default",
- "templates.config.camera_backend.auto": "Auto-detect best backend",
- "templates.config.camera_backend.dshow": "Windows DirectShow",
- "templates.config.camera_backend.msmf": "Windows Media Foundation",
- "templates.config.camera_backend.v4l2": "Linux Video4Linux2",
- "templates.config.resolution.auto": "Open at the camera's max supported mode",
- "templates.config.resolution.480p": "VGA — lowest CPU and bandwidth",
- "templates.config.resolution.720p": "HD",
- "templates.config.resolution.1080p": "Full HD",
- "templates.config.resolution.1440p": "QHD / 2K",
- "templates.config.resolution.2160p": "4K UHD — highest CPU and bandwidth",
- "templates.created": "Template created successfully",
- "templates.updated": "Template updated successfully",
- "templates.deleted": "Template deleted successfully",
- "templates.delete.confirm": "Are you sure you want to delete this template?",
- "templates.error.load": "Failed to load templates",
- "templates.error.engines": "Failed to load engines",
- "templates.error.required": "Please fill in all required fields",
- "templates.error.delete": "Failed to delete template",
- "templates.error.save_failed": "Failed to save template",
- "templates.error.load_failed": "Failed to load template",
- "templates.test.title": "Test Capture",
- "templates.test.description": "Test this template before saving to see a capture preview and performance metrics.",
- "templates.test.display": "Display:",
- "templates.test.display.select": "Select display...",
- "templates.test.device": "Device:",
- "templates.test.device.select": "Select device...",
- "templates.test.duration": "Capture Duration (s):",
- "templates.test.border_width": "Border Width (px):",
- "templates.test.run": "Run",
- "templates.test.running": "Running test...",
- "templates.test.results.preview": "Full Capture Preview",
- "templates.test.results.borders": "Border Extraction",
- "templates.test.results.top": "Top",
- "templates.test.results.right": "Right",
- "templates.test.results.bottom": "Bottom",
- "templates.test.results.left": "Left",
- "templates.test.results.performance": "Performance",
- "templates.test.results.capture_time": "Capture",
- "templates.test.results.extraction_time": "Extraction",
- "templates.test.results.total_time": "Total",
- "templates.test.results.max_fps": "Max FPS",
- "templates.test.results.duration": "Duration",
- "templates.test.results.frame_count": "Frames",
- "templates.test.results.actual_fps": "Actual FPS",
- "templates.test.results.avg_capture_time": "Avg Capture",
- "templates.test.results.resolution": "Resolution:",
- "templates.test.error.no_engine": "Please select a capture engine",
- "templates.test.error.no_display": "Please select a display",
- "templates.test.error.no_device": "Please select a device",
- "templates.test.error.failed": "Test failed",
- "devices.title": "Devices",
- "device.select_type": "Select Device Type",
- "devices.add": "Add New Device",
- "devices.loading": "Loading devices...",
- "devices.none": "No devices configured",
- "devices.failed": "Failed to load devices",
- "devices.wled_config": "WLED Configuration:",
- "devices.wled_note": "Configure your WLED device (effects, segments, color order, power limits, etc.) using the",
- "devices.wled_link": "official WLED app",
- "devices.wled_note_or": "or the built-in",
- "devices.wled_webui_link": "WLED Web UI",
- "devices.wled_note_webui": "(open your device's IP in a browser).",
- "devices.wled_note2": "This controller sends pixel color data and controls brightness per device.",
- "device.scan": "Auto Discovery",
- "device.scan.empty": "No devices found",
- "device.scan.error": "Network scan failed",
- "device.scan.already_added": "Already added",
- "device.scan.selected": "Device selected",
- "device.type": "Device Type:",
- "device.type.hint": "Select the type of LED controller",
- "device.type.wled": "WLED",
- "device.type.wled.desc": "WiFi LED controller over HTTP/UDP",
- "device.type.adalight": "Adalight",
- "device.type.adalight.desc": "Serial LED protocol for Arduino",
- "device.type.ambiled": "AmbiLED",
- "device.type.ambiled.desc": "Serial protocol for AmbiLED devices",
- "device.type.mqtt": "MQTT",
- "device.type.mqtt.desc": "Publish LED data via MQTT broker",
- "device.type.ws": "WebSocket",
- "device.type.ws.desc": "Stream LED data to WebSocket clients",
- "device.type.openrgb": "OpenRGB",
- "device.type.openrgb.desc": "Control RGB peripherals via OpenRGB",
- "device.type.dmx": "DMX",
- "device.type.dmx.desc": "Art-Net / sACN (E1.31) stage lighting",
- "device.type.ddp": "DDP",
- "device.type.ddp.desc": "Direct UDP pixel push (Pixelblaze, ESPixelStick, Falcon)",
- "device.type.opc": "OPC",
- "device.type.opc.desc": "Open Pixel Control (Fadecandy, xLights, hobbyist drivers)",
- "device.type.mock": "Mock",
- "device.type.mock.desc": "Virtual device for testing",
- "device.type.espnow": "ESP-NOW",
- "device.type.espnow.desc": "Ultra-low-latency via ESP32 gateway",
- "device.type.hue": "Philips Hue",
- "device.type.hue.desc": "Hue Entertainment API streaming",
- "device.type.yeelight": "Yeelight",
- "device.type.yeelight.desc": "Xiaomi smart bulb / lightstrip via LAN (single color, averaged from the strip)",
- "device.yeelight.url": "IP Address:",
- "device.yeelight.url.hint": "LAN IP of the Yeelight bulb. TCP port 55443 is fixed in the protocol.",
- "device.yeelight.url.placeholder": "192.168.1.50",
- "device.yeelight_min_interval": "Min Update Interval:",
- "device.yeelight_min_interval.hint": "Client-side rate limit between commands in ms. Default 500 ms keeps bulbs under their ~1 cmd/sec cap; lower values risk throttling.",
- "device.type.wiz": "WiZ",
- "device.type.wiz.desc": "WiZ Connected (Philips) UDP LAN bulb",
- "device.wiz.url": "IP Address:",
- "device.wiz.url.hint": "LAN IP of the WiZ bulb. UDP port 38899 is the protocol default.",
- "device.wiz.url.placeholder": "192.168.1.50",
- "device.wiz_min_interval": "Min Update Interval:",
- "device.wiz_min_interval.hint": "Client-side rate limit between commands in ms. UDP fire-and-forget tolerates fast updates; default 50 ms ≈ 20 Hz.",
- "device.type.lifx": "LIFX",
- "device.type.lifx.desc": "LIFX smart bulb / lightstrip over LAN",
- "device.lifx.url": "IP Address:",
- "device.lifx.url.hint": "LAN IP of the LIFX bulb. UDP port 56700 is the protocol default.",
- "device.lifx.url.placeholder": "192.168.1.50",
- "device.lifx_min_interval": "Min Update Interval:",
- "device.lifx_min_interval.hint": "Client-side rate limit between commands in ms. LIFX recommends ≤20 cmd/sec; default 50 ms matches that ceiling.",
- "device.type.govee": "Govee",
- "device.type.govee.desc": "Govee Wi-Fi bulb / ambient kit via LAN API",
- "device.govee.url": "IP Address:",
- "device.govee.url.hint": "LAN IP of the Govee device. Enable LAN Control in the Govee Home app first (Device → ⚙ → LAN Control), or the bulb won’t respond.",
- "device.govee.url.placeholder": "192.168.1.50",
- "device.govee_min_interval": "Min Update Interval:",
- "device.govee_min_interval.hint": "Client-side rate limit between commands in ms. UDP fire-and-forget tolerates fast updates; default 50 ms ≈ 20 Hz.",
- "device.type.nanoleaf": "Nanoleaf",
- "device.type.nanoleaf.desc": "Nanoleaf Light Panels / Canvas / Shapes / Lines / Elements (HTTP REST, requires pairing)",
- "device.nanoleaf.url": "IP Address:",
- "device.nanoleaf.url.hint": "LAN IP of the Nanoleaf controller. HTTP port 16021 is fixed in the protocol.",
- "device.nanoleaf.url.placeholder": "192.168.1.50",
- "device.nanoleaf_min_interval": "Min Update Interval:",
- "device.nanoleaf_min_interval.hint": "Client-side rate limit between commands in ms. Default 100 ms ≈ 10 Hz; HTTP request overhead caps the practical max around 20 Hz.",
- "device.nanoleaf.pair.instructions": "Press and hold the power button on your Nanoleaf controller for 5 seconds until the LEDs flash, then click Start. The controller opens a 30-second pairing window.",
- "device.nanoleaf.pair_button": "Pair Device",
- "device.nanoleaf.token.label": "Auth token:",
- "device.nanoleaf.paired": "Paired",
- "device.type.ble": "BLE LED Controller",
- "device.type.ble.desc": "Bluetooth LE strips: SP110E, Triones, Zengge, Govee (whole-strip color)",
- "device.ble.url": "BLE Address:",
- "device.ble.url.hint": "MAC address (Windows/Linux) or UUID (macOS), prefixed with ble://",
- "device.ble.family": "Protocol Family:",
- "device.ble.family.hint": "Which BLE protocol your controller speaks. Match the phone app you normally use.",
- "device.ble.family.sp110e.desc": "Addressable controllers — LED Hue / SP110E app",
- "device.ble.family.triones.desc": "Single-color controllers — HappyLighting / LEDnet app",
- "device.ble.family.zengge.desc": "Single-color controllers — iLightsIn / Mohuan app",
- "device.ble.family.govee.desc": "Govee H6xxx strips — unencrypted firmware only",
- "device.ble.govee_key": "Govee AES Key (hex):",
- "device.ble.govee_key.hint": "Optional. Newer Govee firmware needs a per-model AES key — leave blank for older firmware.",
- "device.ble.govee_key.placeholder": "32 hex digits, e.g. 0102…1f20",
- "device.type.usbhid": "USB HID",
- "device.type.usbhid.desc": "USB RGB peripherals (keyboards, mice)",
- "device.type.spi": "SPI Direct",
- "device.type.spi.desc": "Raspberry Pi GPIO/SPI LED strips",
- "device.type.chroma": "Razer Chroma",
- "device.type.chroma.desc": "Razer peripherals via Chroma SDK",
- "device.type.gamesense": "SteelSeries",
- "device.type.gamesense.desc": "SteelSeries peripherals via GameSense",
- "device.type.group": "Group",
- "device.type.group.desc": "Combine multiple devices into one virtual device",
- "device.group.children": "Child Devices:",
- "device.group.children.hint": "Select devices to include in this group. Order matters for sequence mode.",
- "device.group.add_child": "+ Add Device",
- "device.group.select_device": "Select a device",
- "device.group.mode": "Group Mode:",
- "device.group.mode.hint": "Sequence concatenates LEDs end-to-end. Independent mirrors the full strip to each device.",
- "device.group.mode.sequence": "Sequence",
- "device.group.mode.sequence.desc": "Concatenate LEDs end-to-end into one long strip",
- "device.group.mode.independent": "Independent",
- "device.group.mode.independent.desc": "Mirror the full strip to each device independently",
- "device.group.move_up": "Move up",
- "device.group.move_down": "Move down",
- "device.group.error.no_children": "Add at least one child device to the group.",
- "device.chroma.device_type": "Peripheral Type:",
- "device.chroma.device_type.hint": "Which Razer peripheral to control via Chroma SDK",
- "device.gamesense.device_type": "Peripheral Type:",
- "device.gamesense.device_type.hint": "Which SteelSeries peripheral to control via GameSense",
- "device.espnow.peer_mac": "Peer MAC:",
- "device.espnow.peer_mac.hint": "MAC address of the remote ESP32 receiver (e.g. AA:BB:CC:DD:EE:FF)",
- "device.espnow.channel": "WiFi Channel:",
- "device.espnow.channel.hint": "WiFi channel (1-14). Must match the receiver's channel.",
- "device.hue.url": "Bridge IP:",
- "device.hue.url.hint": "IP address of your Hue bridge",
- "device.hue.username": "Bridge Username:",
- "device.hue.username.hint": "Hue bridge application key from pairing",
- "device.hue.client_key": "Client Key:",
- "device.hue.client_key.hint": "Entertainment API client key (hex string from pairing)",
- "device.hue.group_id": "Entertainment Group:",
- "device.hue.group_id.hint": "Entertainment configuration ID from your Hue bridge",
- "device.usbhid.url": "VID:PID:",
- "device.usbhid.url.hint": "USB Vendor:Product ID in hex (e.g. 1532:0084)",
- "device.spi.url": "GPIO/SPI Path:",
- "device.spi.url.hint": "GPIO pin or SPI device path (e.g. spi://gpio:18)",
- "device.spi.speed": "SPI Speed (Hz):",
- "device.spi.speed.hint": "SPI clock speed. 800000 Hz for WS2812, 2400000 Hz for APA102.",
- "device.spi.led_type": "LED Chipset:",
- "device.spi.led_type.hint": "Type of addressable LED strip connected to the GPIO/SPI pin",
- "device.spi.led_type.ws2812b.desc": "Most common, 800 KHz data, 3-wire RGB",
- "device.spi.led_type.ws2812.desc": "Original WS2812, 800 KHz, 3-wire RGB",
- "device.spi.led_type.ws2811.desc": "External driver IC, 400 KHz, 12V strips",
- "device.spi.led_type.sk6812.desc": "Samsung LED, 800 KHz, 3-wire RGB",
- "device.spi.led_type.sk6812_rgbw.desc": "SK6812 with dedicated white channel",
- "device.gamesense.peripheral.keyboard": "Keyboard",
- "device.gamesense.peripheral.keyboard.desc": "Per-key RGB illumination",
- "device.gamesense.peripheral.mouse": "Mouse",
- "device.gamesense.peripheral.mouse.desc": "Mouse RGB zones",
- "device.gamesense.peripheral.headset": "Headset",
- "device.gamesense.peripheral.headset.desc": "Headset earcup lighting",
- "device.gamesense.peripheral.mousepad": "Mousepad",
- "device.gamesense.peripheral.mousepad.desc": "Mousepad edge lighting zones",
- "device.gamesense.peripheral.indicator": "Indicator",
- "device.gamesense.peripheral.indicator.desc": "OLED/LED status indicator",
- "device.css_processing_template": "Strip Processing Template:",
- "device.css_processing_template.hint": "Default processing template applied to all color strip outputs on this device",
- "device.dmx_protocol": "DMX Protocol:",
- "device.dmx_protocol.hint": "Art-Net uses UDP port 6454, sACN (E1.31) uses UDP port 5568",
- "device.dmx_protocol.artnet.desc": "UDP unicast, port 6454",
- "device.dmx_protocol.sacn.desc": "Multicast/unicast, port 5568",
- "device.dmx_start_universe": "Start Universe:",
- "device.dmx_start_universe.hint": "First DMX universe (0-32767). Multiple universes are used automatically for >170 LEDs.",
- "device.dmx_start_channel": "Start Channel:",
- "device.dmx_start_channel.hint": "First DMX channel within the universe (1-512)",
- "device.dmx.url": "IP Address:",
- "device.dmx.url.hint": "IP address of the DMX node (e.g. 192.168.1.50)",
- "device.dmx.url.placeholder": "192.168.1.50",
- "device.ddp.url": "IP Address:",
- "device.ddp.url.hint": "DDP receiver address. Port defaults to 4048.",
- "device.ddp.url.placeholder": "192.168.1.50",
- "device.ddp_port": "DDP Port:",
- "device.ddp_port.hint": "UDP port (0 = protocol default 4048).",
- "device.ddp_destination_id": "Destination ID:",
- "device.ddp_destination_id.hint": "DDP destination identifier (1 = display).",
- "device.ddp_color_order": "Color Order:",
- "device.ddp_color_order.hint": "Channel byte order on the wire. Most DDP receivers expect RGB.",
- "device.ddp.color_order.rgb.desc": "Standard RGB byte order",
- "device.ddp.color_order.grb.desc": "WS2812/WS2812B native order",
- "device.ddp.color_order.brg.desc": "BRG byte order",
- "device.ddp.color_order.rbg.desc": "RBG byte order",
- "device.ddp.color_order.bgr.desc": "BGR byte order",
- "device.ddp.color_order.gbr.desc": "GBR byte order",
- "device.opc.url": "IP Address:",
- "device.opc.url.hint": "OPC receiver address. TCP port defaults to 7890.",
- "device.opc.url.placeholder": "192.168.1.50",
- "device.opc_channel": "Channel:",
- "device.opc_channel.hint": "OPC channel (0 = broadcast to every channel on the server, 1-255 = specific output).",
- "device.serial_port": "Serial Port:",
- "device.serial_port.hint": "Select the COM port of the Adalight device",
- "device.serial_port.none": "No serial ports found",
- "device.serial_port.select": "Select a port...",
- "device.led_count_manual.hint": "Number of LEDs on the strip (must match your Arduino sketch)",
- "device.baud_rate": "Baud Rate:",
- "device.baud_rate.hint": "Serial communication speed. Higher = more FPS but requires matching Arduino sketch.",
- "device.led_type": "LED Type:",
- "device.led_type.hint": "RGB (3 channels) or RGBW (4 channels with dedicated white)",
- "device.send_latency": "Send Latency (ms):",
- "device.send_latency.hint": "Simulated network/serial delay per frame in milliseconds",
- "device.mqtt_topic": "MQTT Topic:",
- "device.mqtt_topic.hint": "MQTT topic path for publishing pixel data (e.g. mqtt://ledgrab/device/name)",
- "device.mqtt_topic.placeholder": "mqtt://ledgrab/device/living-room",
- "device.mqtt_source": "MQTT Broker:",
- "device.mqtt_source.hint": "Which MQTT broker this device publishes to. Manage brokers under Integrations → MQTT Sources. Leave unset to use the first available broker.",
- "device.mqtt_source.none": "— First available broker",
- "device.ws_url": "Connection URL:",
- "device.ws_url.hint": "WebSocket URL for clients to connect and receive LED data",
- "device.openrgb.url": "OpenRGB URL:",
- "device.openrgb.url.hint": "OpenRGB server address (e.g. openrgb://localhost:6742/0)",
- "device.openrgb.zone": "Zones:",
- "device.openrgb.zone.hint": "Select which LED zones to control (leave all unchecked for all zones)",
- "device.openrgb.zone.loading": "Loading zones…",
- "device.openrgb.zone.error": "Failed to load zones",
- "device.openrgb.mode": "Zone mode:",
- "device.openrgb.mode.hint": "Combined treats all zones as one continuous LED strip. Separate renders each zone independently with the full effect.",
- "device.openrgb.mode.combined": "Combined strip",
- "device.openrgb.mode.separate": "Independent zones",
- "device.openrgb.added_multiple": "Added {count} devices",
- "device.url.hint": "IP address or hostname of the device (e.g. http://192.168.1.100)",
- "device.name": "Device Name:",
- "device.name.placeholder": "Living Room TV",
- "device.url": "URL:",
- "device.url.placeholder": "http://192.168.1.100",
- "device.led_count": "LED Count:",
- "dashboard.device.chip": "Chip:",
- "device.led_count.hint": "Number of LEDs configured in the device",
- "device.led_count.hint.auto": "Auto-detected from device",
- "device.button.add": "Add Device",
- "device.button.start": "Start",
- "device.button.stop": "Stop",
- "device.button.settings": "General Settings",
- "device.button.capture_settings": "Capture Settings",
- "device.button.calibrate": "Calibrate",
- "device.button.remove": "Remove",
- "device.button.webui": "Open Device Web UI",
- "device.button.power_off": "Turn Off",
- "device.button.ping": "Ping Device",
- "device.ping.online": "Online ({ms}ms)",
- "device.ping.offline": "Device offline",
- "device.ping.error": "Ping failed",
- "device.power.off_success": "Device turned off",
- "device.status.connected": "Connected",
- "device.status.disconnected": "Disconnected",
- "device.status.error": "Error",
- "device.status.processing": "Processing",
- "device.status.idle": "Idle",
- "device.fps": "FPS:",
- "device.display": "Display:",
- "device.remove.confirm": "Are you sure you want to remove this device?",
- "device.added": "Device added successfully",
- "device.removed": "Device removed",
- "device.started": "Processing started",
- "device.stopped": "Processing stopped",
- "device.metrics.actual_fps": "Actual FPS",
- "device.metrics.current_fps": "Current FPS",
- "device.metrics.target_fps": "Target FPS",
- "device.metrics.potential_fps": "Potential FPS",
- "device.metrics.frames": "Frames",
- "device.metrics.frames_skipped": "Skipped",
- "device.metrics.keepalive": "Keepalive",
- "device.metrics.errors": "Errors",
- "device.metrics.uptime": "Uptime",
- "device.metrics.timing": "Pipeline timing:",
- "device.metrics.device_fps": "Device refresh rate",
- "device.health.online": "Online",
- "device.health.offline": "Offline",
- "device.health.streaming_unreachable": "Unreachable during streaming",
- "device.health.checking": "Checking...",
- "patch.streaming": "STREAMING",
- "patch.standby": "STANDBY",
- "patch.online": "ONLINE",
- "patch.offline": "OFFLINE",
- "patch.disconnected": "DISCONNECTED",
- "patch.not_configured": "NOT CONFIGURED",
- "patch.unreachable": "UNREACHABLE",
- "patch.checking": "CHECKING",
- "patch.ticking": "TICKING",
- "patch.paused": "PAUSED",
- "patch.patched": "PATCHED",
- "patch.preset": "PRESET",
- "patch.source": "SOURCE",
- "patch.template": "TEMPLATE",
- "patch.pipeline": "PIPELINE",
- "patch.strip": "STRIP",
- "patch.value": "VALUE",
- "patch.ready": "READY",
- "patch.polling": "POLLING",
- "perf.idle": "idle",
- "perf.offline": "offline",
- "perf.online": "online",
- "perf.no_devices": "no devices",
- "perf.all_online": "all online",
- "perf.online_count": "{count} online",
- "perf.offline_count": "{count} offline",
- "perf.total_bytes": "{bytes} total",
- "perf.max_ms": "max {ms}ms",
- "perf.targets_count.one": "{count} target",
- "perf.targets_count.other": "{count} targets",
- "perf.no_captures": "no captures",
- "perf.captures_count.one": "{count} capture",
- "perf.captures_count.other": "{count} captures",
- "perf.ratio_of_requested": "{percent}% of requested · {captures}",
- "perf.total_count": "{count} total",
- "perf.skipped_per_sec": "{rate} skipped/s",
- "perf.tip.now": "now",
- "perf.tip.ago": "−{seconds}s",
- "device.last_seen.label": "Last seen",
- "device.last_seen.just_now": "just now",
- "device.last_seen.seconds": "%ds ago",
- "device.last_seen.minutes": "%dm ago",
- "device.last_seen.hours": "%dh ago",
- "device.last_seen.days": "%dd ago",
- "device.tutorial.start": "Start tutorial",
- "device.tip.identity": "Device identity — name, type badge, and health indicator showing online/offline status.",
- "device.tip.metadata": "Device address and firmware version. Click the URL to open the device's built-in web UI.",
- "device.tip.brightness": "Drag to adjust device brightness. Changes are sent to the device immediately.",
- "device.brightness": "Bright",
- "device.tip.ping": "Ping the device to refresh online status and latency.",
- "device.tip.settings": "Open device settings — configure name, URL, capabilities, and health checks.",
- "device.tip.menu": "More actions — duplicate, hide, or delete this device.",
- "device.tip.add": "Click here to add a new LED device",
- "settings.title": "Settings",
- "settings.tab.general": "General",
- "settings.tab.backup": "Backup",
- "settings.tab.mqtt": "MQTT",
- "settings.tab.appearance": "Appearance",
- "settings.logs.open_viewer": "Open Log Viewer",
- "settings.external_url.label": "External URL",
- "settings.external_url.hint": "If set, this base URL is used in webhook URLs and other user-visible links instead of the auto-detected local IP. Example: https://myserver.example.com:8080",
- "settings.external_url.placeholder": "https://myserver.example.com:8080",
- "settings.external_url.save": "Save",
- "settings.external_url.saved": "External URL saved",
- "settings.external_url.save_error": "Failed to save external URL",
- "settings.general.title": "General Settings",
- "settings.section.identity": "Identity",
- "settings.section.connection": "Connection",
- "settings.section.hardware": "Hardware",
- "settings.section.behavior": "Behavior",
- "settings.section.provider": "Provider",
- "settings.section.refresh": "Refresh",
- "settings.section.filters": "Filters",
- "settings.section.routing": "Routing",
- "settings.section.output": "Output",
- "settings.section.filtering": "Filtering",
- "settings.section.broker": "Broker",
- "settings.section.protocol": "Protocol",
- "settings.section.adapter": "Adapter",
- "settings.section.mappings": "Mappings",
- "settings.section.diagnostics": "Diagnostics",
- "settings.section.source": "Source",
- "settings.section.engine": "Engine",
- "settings.section.timing": "Timing",
- "settings.section.gradient": "Gradient",
- "settings.section.layout": "Layout",
- "settings.section.strip": "Strip",
- "settings.section.type": "Type",
- "settings.section.notes": "Notes",
- "settings.section.file": "File",
- "settings.section.auth": "Auth",
- "settings.section.configure": "Configure",
- "settings.section.restart": "Restart",
- "settings.section.loopback": "Loopback",
- "settings.section.test_setup": "Test Setup",
- "settings.section.offsets": "Offsets",
- "settings.section.line_properties": "Line Properties",
- "settings.section.test": "Test",
- "settings.section.preview": "Preview",
- "settings.section.controls": "Controls",
- "settings.section.history": "History",
- "ha_source.use_ssl.hint": "Enable for HTTPS / wss connections to Home Assistant",
- "game_integration.enabled.hint": "Disabled integrations stop polling and emitting events",
- "settings.capture.title": "Capture Settings",
- "settings.capture.saved": "Capture settings updated",
- "settings.capture.failed": "Failed to save capture settings",
- "settings.brightness": "Brightness:",
- "settings.brightness.hint": "Global brightness for this device (0-100%)",
- "settings.url.hint": "IP address or hostname of the device",
- "settings.display_index": "Display:",
- "settings.display_index.hint": "Which screen to capture for this device",
- "settings.fps": "Target FPS:",
- "settings.fps.hint": "Target frames per second (10-90)",
- "settings.capture_template": "Engine Template:",
- "settings.capture_template.hint": "Screen capture engine and configuration for this device",
- "settings.button.cancel": "Cancel",
- "settings.health_interval": "Health Check Interval (s):",
- "settings.health_interval.hint": "How often to check the device status (5-600 seconds)",
- "settings.auto_shutdown": "Auto Restore:",
- "settings.auto_shutdown.hint": "Restore device to idle state when targets stop or server shuts down",
- "settings.button.save": "Save Changes",
- "settings.saved": "Settings saved successfully",
- "settings.failed": "Failed to save settings",
- "calibration.title": "LED Calibration",
- "calibration.tip.led_count": "Enter LED count per edge",
- "calibration.tip.start_corner": "Click a corner to set the start position",
- "calibration.tip.direction": "Toggle LED strip direction (clockwise / counterclockwise)",
- "calibration.tip.offset": "Set LED offset — distance from LED 0 to the start corner",
- "calibration.tip.span": "Drag green bars to adjust coverage span",
- "calibration.tip.test": "Click an edge to toggle test LEDs",
- "calibration.tip.overlay": "Toggle screen overlay to see LED positions and numbering on your monitor",
- "calibration.tip.toggle_inputs": "Click total LED count to toggle edge inputs",
- "calibration.tip.border_width": "How many pixels from the screen edge to sample for LED colors",
- "calibration.tip.skip_leds_start": "Skip LEDs at the start of the strip — skipped LEDs stay off",
- "calibration.tip.skip_leds_end": "Skip LEDs at the end of the strip — skipped LEDs stay off",
- "tour.welcome": "Welcome to LED Grab! This quick tour will show you around the interface. Use arrow keys or buttons to navigate.",
- "tour.dashboard": "Dashboard — live overview of running targets, automations, and device health at a glance.",
- "tour.targets": "Targets — add WLED devices, configure LED targets with capture settings and calibration.",
- "tour.sources": "Sources — manage capture templates, picture sources, audio sources, and color strips.",
- "tour.integrations": "Integrations — connect external services: Weather, Home Assistant, MQTT, and Game integrations.",
- "tour.graph": "Graph — visual overview of all entities and their connections. Drag ports to connect, right-click edges to disconnect.",
- "tour.automations": "Automations — automate scene switching with time, audio, or value rules.",
- "tour.settings": "Settings — backup and restore configuration, manage auto-backups.",
- "tour.api": "API Docs — interactive REST API documentation powered by Swagger.",
- "tour.search": "Search — quickly find and navigate to any entity with Ctrl+K.",
- "tour.theme": "Theme — switch between dark and light mode.",
- "tour.accent": "Accent color — customize the UI accent color to your preference.",
- "tour.language": "Language — choose your preferred interface language.",
- "tour.restart": "Restart tutorial",
- "tour.dash.perf": "Performance — real-time FPS charts, latency metrics, and poll interval control.",
- "tour.dash.targets": "Channels — all your targets in one place, grouped into running and stopped subsections.",
- "tour.dash.running": "Running targets — live streaming metrics and quick stop control.",
- "tour.dash.stopped": "Stopped targets — ready to start with one click.",
- "tour.dash.automations": "Automations — active automation status and quick enable/disable toggle.",
- "tour.dash.scenes": "Scene Presets — saved system snapshots you can apply with a single click.",
- "tour.dash.sync_clocks": "Sync Clocks — shared timers that synchronize animations across sources.",
- "tour.dash.integrations": "Integrations — connection status for Weather, Home Assistant, and MQTT sources.",
- "tour.dash.customize_btn": "Customize button — opens a side panel where you can reorder sections, toggle visibility, and tune the dashboard layout.",
- "tour.dash.customize_panel": "Dashboard Customize — your control center for layout. Changes apply live; close with Esc or the × button.",
- "tour.dash.customize_presets": "Presets — apply curated layouts (compact, focused, full) in one click. Switching to a preset overrides any manual tweaks.",
- "tour.dash.customize_global": "Global settings — content width, animation level, performance mode (system/app/both), and the sample window for charts.",
- "tour.dash.customize_sections": "Sections — drag to reorder; click the eye to hide; click the chevron to start collapsed by default. Each section can also be tagged dense/compact/comfortable.",
- "tour.dash.customize_perf_cells": "Performance cells — choose which metric tiles to show in the Performance section, configure their span, sample window, and Y-axis scale.",
- "tour.tgt.nav": "Use this dropdown to switch between target types: LED devices, LED targets, and Home Assistant lights.",
- "tour.tgt.devices": "Devices — your LED controllers discovered on the network.",
- "tour.tgt.css": "Color Strips — define how screen regions map to LED segments.",
- "tour.tgt.targets": "LED Targets — combine a device, color strip, and capture source for streaming.",
- "tour.tgt.ha_light_targets": "HA Light Targets — pick a Home Assistant light entity and a color/value source to drive it.",
- "tour.src.nav": "Use this dropdown to switch between source types — pictures, color strips, audio, value, sync, and assets.",
- "tour.src.raw": "Raw — live screen capture sources from your displays.",
- "tour.src.templates": "Capture Templates — reusable capture configurations (resolution, FPS, crop).",
- "tour.src.static": "Static Image — test your setup with image files instead of live capture.",
- "tour.src.processed": "Processed — apply post-processing effects like blur, brightness, or color correction.",
- "tour.src.color_strip": "Color Strips — define how screen regions map to LED segments.",
- "tour.src.audio": "Audio — capture microphone/system audio and process it through templates for reactive effects.",
- "tour.src.value": "Value Sources — dynamic numbers or colors driven by time of day, audio, system metrics, Home Assistant entities, gradients, or schedules. Used to animate effects, modulate color strips, and trigger automations.",
- "tour.src.sync": "Sync Clocks — shared timers that synchronize animations across multiple sources.",
- "tour.auto.list": "Automations — automate scene activation based on time, audio, or value rules.",
- "tour.auto.add": "Click + to create a new automation with rules and a scene to activate.",
- "tour.auto.card": "Each card shows automation status, rules, and quick controls to edit or toggle.",
- "tour.auto.scenes_list": "Scenes — saved system states that automations can activate or you can apply manually.",
- "tour.auto.scenes_add": "Click + to capture the current system state as a new scene preset.",
- "tour.auto.scenes_card": "Each scene card shows target/device counts. Click to edit, recapture, or activate.",
- "tour.int.nav": "Use this dropdown to switch between integration types: Weather, Home Assistant, MQTT, and Game integrations.",
- "tour.int.weather": "Weather — pull live weather data (temperature, conditions, forecast) into value sources for environmental effects.",
- "tour.int.home_assistant": "Home Assistant — connect to your HA instance. Lights, sensors, and entities become value sources and target endpoints.",
- "tour.int.mqtt": "MQTT — subscribe to broker topics to feed external sensor data, automations, or remote triggers into LedGrab.",
- "tour.int.game": "Game — react to in-game events (Minecraft, Hammer of God, etc.) by triggering scenes and color effects from game state.",
- "calibration.tutorial.start": "Start tutorial",
- "calibration.overlay_toggle": "Overlay",
- "calibration.start_position": "Starting Position:",
- "calibration.position.bottom_left": "Bottom Left",
- "calibration.position.bottom_right": "Bottom Right",
- "calibration.position.top_left": "Top Left",
- "calibration.position.top_right": "Top Right",
- "calibration.direction": "Direction:",
- "calibration.direction.clockwise": "Clockwise",
- "calibration.direction.counterclockwise": "Counterclockwise",
- "calibration.leds.top": "Top LEDs:",
- "calibration.leds.right": "Right LEDs:",
- "calibration.leds.bottom": "Bottom LEDs:",
- "calibration.leds.left": "Left LEDs:",
- "calibration.offset": "LED Offset:",
- "calibration.offset.hint": "Distance from physical LED 0 to the start corner (along strip direction)",
- "calibration.skip_start": "Skip LEDs (Start):",
- "calibration.skip_start.hint": "Number of LEDs to turn off at the beginning of the strip (0 = none)",
- "calibration.skip_end": "Skip LEDs (End):",
- "calibration.skip_end.hint": "Number of LEDs to turn off at the end of the strip (0 = none)",
- "calibration.border_width": "Border (px):",
- "calibration.roi": "Capture region (%):",
- "calibration.roi.hint": "Sample only this sub-rectangle of the screen so a taskbar, HUD, or black bars don't pollute the border colours. Full frame = X/Y 0, Width/Height 100.",
- "calibration.roi.x": "X (%)",
- "calibration.roi.y": "Y (%)",
- "calibration.roi.width": "Width (%)",
- "calibration.roi.height": "Height (%)",
- "calibration.border_width.hint": "How many pixels from the screen edge to sample for LED colors (1-100)",
- "calibration.button.cancel": "Cancel",
- "calibration.button.save": "Save",
- "calibration.saved": "Calibration saved",
- "calibration.failed": "Failed to save calibration",
- "server.healthy": "Server online",
- "server.offline": "Server offline",
- "error.unauthorized": "Unauthorized - please login",
- "error.network": "Network error",
- "error.unknown": "An error occurred",
- "modal.discard_changes": "You have unsaved changes. Discard them?",
- "confirm.title": "Confirm Action",
- "confirm.yes": "Yes",
- "confirm.no": "No",
- "confirm.stop_all": "Stop all running targets?",
- "confirm.turn_off_device": "Turn off this device?",
- "common.loading": "Loading...",
- "common.delete": "Delete",
- "common.remove": "Remove",
- "common.edit": "Edit",
- "common.clone": "Clone",
- "common.hide": "Hide card",
- "common.more_actions": "More actions",
- "common.card_color": "Card color",
- "common.none": "None",
- "common.none_no_cspt": "None (no processing template)",
- "common.none_no_input": "None (no input source)",
- "common.none_own_speed": "None (no sync)",
- "common.undo": "Undo",
- "common.cancel": "Cancel",
- "common.back": "Back",
- "common.apply": "Apply",
- "common.start": "START",
- "common.stop": "STOP",
- "common.led_preview": "LED Preview",
- "device.icon.eyebrow": "Card icon",
- "device.icon.title": "Choose an icon",
- "device.icon.for": "for",
- "device.icon.choose": "Choose icon…",
- "device.icon.change": "Change icon…",
- "device.icon.remove": "Remove icon",
- "device.icon.search.placeholder": "Search icons…",
- "device.icon.color_toggle": "Color",
- "device.icon.recent": "Recent",
- "device.icon.empty": "No icons match.",
- "device.icon.hint": "↵ Apply · Esc Cancel",
- "device.icon.saved": "Icon saved",
- "device.icon.error.save_failed": "Failed to save icon",
- "device.icon.cat.all": "All",
- "device.icon.cat.hardware": "Hardware",
- "device.icon.cat.lighting": "Lighting",
- "device.icon.cat.rooms": "Rooms",
- "device.icon.cat.media": "Media",
- "device.icon.cat.signal": "Signal",
- "device.icon.cat.ambience": "Ambience",
- "device.icon.cat.weather": "Weather",
- "device.icon.cat.nature": "Nature",
- "device.icon.cat.controls": "Controls",
- "device.icon.cat.status": "Status",
- "device.icon.cat.office": "Office",
- "device.icon.phone": "Phone",
- "device.icon.package": "Device unit",
- "device.icon.code": "Code",
- "device.icon.laptop": "Laptop",
- "device.icon.server": "Server",
- "device.icon.router": "Router",
- "device.icon.webcam": "Webcam",
- "device.icon.bot": "Bot",
- "device.icon.watch": "Smartwatch",
- "device.icon.mcu": "Microcontroller",
- "device.icon.dim": "Dim light",
- "device.icon.ring": "Ring light",
- "device.icon.point": "Point light",
- "device.icon.ceiling": "Ceiling light",
- "device.icon.desk_lamp": "Desk lamp",
- "device.icon.wall_light": "Wall light",
- "device.icon.flashlight": "Flashlight",
- "device.icon.bulb_off": "Bulb off",
- "device.icon.candle": "Candle",
- "device.icon.kitchen": "Kitchen",
- "device.icon.bath": "Bathroom",
- "device.icon.garage": "Garage",
- "device.icon.outdoor": "Outdoor",
- "device.icon.projector": "Projector",
- "device.icon.camcorder": "Camcorder",
- "device.icon.disc": "Disc",
- "device.icon.image": "Image",
- "device.icon.audio_file": "Audio file",
- "device.icon.send": "Send",
- "device.icon.rain": "Rain",
- "device.icon.snow": "Snow",
- "device.icon.thunder": "Thunder",
- "device.icon.fog": "Fog",
- "device.icon.wind": "Wind",
- "device.icon.snowflake": "Snowflake",
- "device.icon.umbrella": "Umbrella",
- "device.icon.sunrise": "Sunrise",
- "device.icon.sunset": "Sunset",
- "device.icon.tree": "Tree",
- "device.icon.flower": "Flower",
- "device.icon.mountain": "Mountain",
- "device.icon.waves": "Waves",
- "device.icon.sprout": "Sprout",
- "device.icon.water_drops": "Water drops",
- "device.icon.leaf": "Leaf",
- "device.icon.switch": "Switch",
- "device.icon.slider": "Slider",
- "device.icon.settings": "Settings",
- "device.icon.refresh": "Refresh",
- "device.icon.undo": "Undo",
- "device.icon.trash": "Trash",
- "device.icon.link": "Link",
- "device.icon.search": "Search",
- "device.icon.add": "Add",
- "device.icon.show": "Show",
- "device.icon.lock": "Lock",
- "device.icon.key": "Key",
- "device.icon.tool": "Tool",
- "device.icon.check": "Check",
- "device.icon.ok": "OK",
- "device.icon.warning": "Warning",
- "device.icon.help": "Help",
- "device.icon.off": "Disabled",
- "device.icon.shield": "Shield",
- "device.icon.target": "Target",
- "device.icon.pulse": "Pulse",
- "device.icon.trend": "Trending",
- "device.icon.battery": "Battery",
- "device.icon.calendar": "Calendar",
- "device.icon.mail": "Mail",
- "device.icon.coffee": "Coffee",
- "device.icon.briefcase": "Briefcase",
- "device.icon.doc": "Document",
- "device.icon.checklist": "Checklist",
- "device.icon.hashtag": "Hashtag",
- "device.icon.clock": "Clock",
- "device.icon.entity.device": "Device",
- "device.icon.entity.target": "LED target",
- "device.icon.entity.ha_light_target": "HA light target",
- "device.icon.entity.picture_source": "Picture source",
- "device.icon.entity.audio_source": "Audio source",
- "device.icon.entity.weather_source": "Weather source",
- "device.icon.entity.value_source": "Value source",
- "device.icon.entity.mqtt_source": "MQTT source",
- "device.icon.entity.ha_source": "Home Assistant source",
- "device.icon.entity.automation": "Automation",
- "device.icon.entity.scene_preset": "Scene preset",
- "device.icon.entity.scene_playlist": "Playlist",
- "device.icon.entity.sync_clock": "Sync clock",
- "device.icon.entity.game_integration": "Game integration",
- "device.icon.entity.audio_processing_template": "Audio processing template",
- "device.icon.entity.pattern_template": "Pattern template",
- "device.icon.entity.capture_template": "Capture template",
- "device.icon.entity.pp_template": "Post-processing template",
- "device.icon.entity.cspt": "Color-strip processing template",
- "device.icon.entity.audio_template": "Audio template",
- "device.icon.entity.gradient": "Gradient",
- "device.icon.entity.color_strip_source": "Color strip",
- "device.icon.entity.asset": "Asset",
- "device.icon.inherited_from": "Inherited from %s",
- "device.icon.override_inherited": "Override inherited icon…",
- "device.icon.use_inherited": "Use inherited",
- "validation.required": "This field is required",
- "bulk.processing": "Processing…",
- "api.error.timeout": "Request timed out — please try again",
- "api.error.network": "Network error — check your connection",
- "palette.search": "Search…",
- "section.filter.placeholder": "Filter...",
- "section.filter.reset": "Clear filter",
- "section.hide": "Hide",
- "section.show_hidden": "Show hidden cards",
- "tags.label": "Tags",
- "tags.hint": "Assign tags for grouping and filtering cards",
- "tags.placeholder": "Add tag...",
- "section.expand_all": "Expand all sections",
- "section.collapse_all": "Collapse all sections",
- "streams.title": "Inputs",
- "integrations.title": "Integrations",
- "streams.description": "Sources define the capture pipeline. A raw source captures from a display using a capture template. A processed source applies postprocessing to another source. Assign sources to devices.",
- "streams.group.raw": "Sources",
- "streams.group.raw_templates": "Engine Templates",
- "streams.group.processed": "Sources",
- "streams.group.proc_templates": "Filter Templates",
- "streams.group.css_processing": "Processing Templates",
- "streams.group.color_strip": "Color Strips",
- "streams.group.audio": "Audio",
- "streams.group.audio_templates": "Audio Templates",
- "streams.section.streams": "Sources",
- "streams.add": "Add Source",
- "streams.add.raw": "Add Screen Capture",
- "streams.add.processed": "Add Processed Source",
- "streams.edit": "Edit Source",
- "streams.edit.raw": "Edit Screen Capture",
- "streams.edit.processed": "Edit Processed Source",
- "streams.name": "Source Name:",
- "streams.name.placeholder": "My Source",
- "streams.type": "Type:",
- "streams.type.raw": "Screen Capture",
- "streams.type.processed": "Processed",
- "streams.display": "Display:",
- "streams.display.hint": "Which screen to capture",
- "streams.capture_template": "Engine Template:",
- "streams.capture_template.hint": "Engine template defining how the screen is captured",
- "streams.target_fps": "Target FPS:",
- "streams.target_fps.hint": "Target frames per second for capture (1-90)",
- "streams.source": "Source:",
- "streams.source.hint": "The source to apply processing filters to",
- "streams.pp_template": "Filter Template:",
- "streams.pp_template.hint": "Filter template to apply to the source",
- "streams.description_label": "Description (optional):",
- "streams.description_placeholder": "Describe this source...",
- "streams.created": "Source created successfully",
- "streams.updated": "Source updated successfully",
- "streams.deleted": "Source deleted successfully",
- "streams.delete.confirm": "Are you sure you want to delete this source?",
- "streams.modal.loading": "Loading...",
- "streams.error.load": "Failed to load sources",
- "streams.error.required": "Please fill in all required fields",
- "streams.error.delete": "Failed to delete source",
- "streams.test.title": "Test Source",
- "streams.test.run": "Run",
- "streams.test.running": "Testing source...",
- "streams.test.duration": "Capture Duration (s):",
- "streams.test.error.failed": "Source test failed",
- "postprocessing.title": "Filter Templates",
- "postprocessing.description": "Processing templates define image filters and color correction. Assign them to processed picture sources for consistent postprocessing across devices.",
- "postprocessing.add": "Add Filter Template",
- "postprocessing.edit": "Edit Filter Template",
- "postprocessing.name": "Template Name:",
- "postprocessing.name.placeholder": "My Filter Template",
- "filters.select_type": "Select filter type...",
- "filters.add": "Add Filter",
- "filters.remove": "Remove",
- "filters.drag_to_reorder": "Drag to reorder",
- "filters.empty": "No filters added. Use the selector below to add filters.",
- "filters.brightness": "Brightness",
- "filters.brightness.desc": "Adjust overall image brightness",
- "filters.saturation": "Saturation",
- "filters.saturation.desc": "Boost or reduce color intensity",
- "filters.gamma": "Gamma",
- "filters.gamma.desc": "Non-linear brightness curve correction",
- "filters.downscaler": "Downscaler",
- "filters.downscaler.desc": "Reduce resolution for faster processing",
- "filters.pixelate": "Pixelate",
- "filters.pixelate.desc": "Mosaic-style block averaging",
- "filters.auto_crop": "Auto Crop",
- "filters.auto_crop.desc": "Remove black bars from letterboxed content",
- "filters.flip": "Flip",
- "filters.flip.desc": "Mirror image horizontally or vertically",
- "filters.color_correction": "Color Correction",
- "filters.color_correction.desc": "White balance and color temperature",
- "filters.filter_template": "Filter Template",
- "filters.filter_template.desc": "Embed another processing template",
- "filters.css_filter_template": "Strip Filter Template",
- "filters.css_filter_template.desc": "Embed another strip processing template",
- "filters.frame_interpolation": "Frame Interpolation",
- "filters.frame_interpolation.desc": "Blend between frames for smoother output",
- "filters.noise_gate": "Noise Gate",
- "filters.noise_gate.desc": "Suppress small color changes below threshold",
- "filters.palette_quantization": "Palette Quantization",
- "filters.palette_quantization.desc": "Reduce colors to a limited palette",
- "filters.reverse": "Reverse",
- "filters.reverse.desc": "Reverse the LED order in the strip",
- "filters.hsl_shift": "HSL Shift",
- "filters.hsl_shift.desc": "Shift hue, saturation, and lightness values",
- "filters.contrast": "Contrast",
- "filters.contrast.desc": "Adjust image contrast around mid-gray",
- "filters.temporal_blur": "Temporal Blur",
- "filters.temporal_blur.desc": "Smooth color transitions over time",
- "filters.audio_filter_template.desc": "Embed another audio processing template",
- "filters.channel_extract.desc": "Select mono, left, or right channel",
- "filters.band_extract.desc": "Filter to bass, mid, treble, or custom frequency range",
- "filters.peak_hold.desc": "Retain peak values with configurable decay",
- "filters.gain.desc": "Amplify or attenuate signal levels",
- "filters.envelope_follower.desc": "Smooth amplitude with attack/release times",
- "filters.spectral_smoothing.desc": "Extra smoothing on spectrum data over time",
- "filters.compressor.desc": "Reduce dynamic range above threshold",
- "filters.inverter.desc": "Invert all levels (1 minus value)",
- "filters.beat_gate.desc": "Pass signal only around detected beats",
- "filters.delay.desc": "Time-shift the audio analysis by a delay",
- "filters.auto_gain.desc": "Auto-normalize audio levels to use full range",
- "postprocessing.description_label": "Description (optional):",
- "postprocessing.description_placeholder": "Describe this template...",
- "postprocessing.created": "Template created successfully",
- "postprocessing.updated": "Template updated successfully",
- "postprocessing.deleted": "Template deleted successfully",
- "postprocessing.delete.confirm": "Are you sure you want to delete this filter template?",
- "postprocessing.error.load": "Failed to load processing templates",
- "postprocessing.error.required": "Please fill in all required fields",
- "postprocessing.error.delete": "Failed to delete processing template",
- "postprocessing.config.show": "Show settings",
- "postprocessing.test.title": "Test Filter Template",
- "postprocessing.test.source_stream": "Source:",
- "postprocessing.test.running": "Testing processing template...",
- "postprocessing.test.error.no_stream": "Please select a source",
- "postprocessing.test.error.failed": "Processing template test failed",
- "css_processing.title": "Strip Processing Templates",
- "css_processing.add": "Add Strip Processing Template",
- "css_processing.edit": "Edit Strip Processing Template",
- "css_processing.name": "Template Name:",
- "css_processing.name_placeholder": "My Strip Processing Template",
- "css_processing.description_label": "Description (optional):",
- "css_processing.description_placeholder": "Describe this template...",
- "css_processing.created": "Strip processing template created",
- "css_processing.updated": "Strip processing template updated",
- "css_processing.deleted": "Strip processing template deleted",
- "css_processing.delete.confirm": "Are you sure you want to delete this strip processing template?",
- "css_processing.error.required": "Please fill in all required fields",
- "css_processing.error.load": "Error loading strip processing template",
- "css_processing.error.delete": "Error deleting strip processing template",
- "css_processing.error.clone_failed": "Failed to clone strip processing template",
- "device.button.stream_selector": "Source Settings",
- "device.stream_settings.title": "Source Settings",
- "device.stream_selector.label": "Source:",
- "device.stream_selector.hint": "Select a source that defines what this device captures and processes",
- "device.stream_selector.none": "-- No source assigned --",
- "device.stream_selector.saved": "Source settings updated",
- "device.stream_settings.border_width": "Border Width (px):",
- "device.stream_settings.border_width_hint": "How many pixels from the screen edge to sample for LED colors (1-100)",
- "device.stream_settings.interpolation": "Interpolation Mode:",
- "device.stream_settings.interpolation.average": "Average",
- "device.stream_settings.interpolation.median": "Median",
- "device.stream_settings.interpolation.dominant": "Dominant",
- "device.stream_settings.interpolation_hint": "How to calculate LED color from sampled pixels",
- "device.stream_settings.smoothing": "Smoothing:",
- "device.stream_settings.smoothing_hint": "Temporal blending between frames (0=none, 1=full). Reduces flicker.",
- "device.tip.stream_selector": "Configure picture source and LED projection settings for this device",
- "streams.group.static_image": "Static Image",
- "streams.add.static_image": "Add Static Image Source",
- "streams.edit.static_image": "Edit Static Image Source",
- "streams.type.static_image": "Static Image",
- "streams.group.video": "Video",
- "streams.add.video": "Add Video Source",
- "streams.edit.video": "Edit Video Source",
- "picture_source.type.video": "Video",
- "picture_source.type.video.desc": "Stream frames from an uploaded video asset",
- "picture_source.video.loop": "Loop:",
- "picture_source.video.speed": "Playback Speed:",
- "picture_source.video.start_time": "Start Time (s):",
- "picture_source.video.end_time": "End Time (s):",
- "picture_source.video.resolution_limit": "Max Width (px):",
- "picture_source.video.resolution_limit.hint": "Downscale video at decode time for performance",
- "streams.image_asset": "Image Asset:",
- "streams.image_asset.select": "Select image asset…",
- "streams.image_asset.search": "Search image assets…",
- "streams.video_asset": "Video Asset:",
- "streams.video_asset.select": "Select video asset…",
- "streams.video_asset.search": "Search video assets…",
- "targets.title": "Channels",
- "targets.description": "Targets bridge color strip sources to output devices. Each target references a device and a color strip source.",
- "targets.subtab.wled": "LED",
- "targets.subtab.led": "LED",
- "targets.section.devices": "Devices",
- "targets.section.color_strips": "Color Strip Sources",
- "targets.section.targets": "Targets",
- "targets.section.specific_settings": "Specific Settings",
- "targets.section.advanced": "Advanced",
- "targets.add": "Add Target",
- "targets.edit": "Edit Target",
- "targets.loading": "Loading targets...",
- "targets.none": "No targets configured",
- "targets.failed": "Failed to load targets",
- "targets.name": "Target Name:",
- "targets.name.placeholder": "My Target",
- "targets.device": "Device:",
- "targets.device.hint": "Select the LED device to send data to",
- "targets.device.none": "-- Select a device --",
- "targets.color_strip_source": "Color Strip Source:",
- "targets.color_strip_source.hint": "Select the color strip source that provides LED colors for this target",
- "targets.no_css": "No source",
- "targets.source": "Source:",
- "targets.source.hint": "Which picture source to capture and process",
- "targets.source.none": "-- No source assigned --",
- "targets.fps": "Target FPS:",
- "targets.fps.hint": "Target frames per second for capture and LED updates (1-90)",
- "targets.fps.rec": "Hardware max ≈ {fps} fps ({leds} LEDs)",
- "targets.border_width": "Border Width (px):",
- "targets.border_width.hint": "How many pixels from the screen edge to sample for LED colors (1-100)",
- "targets.interpolation": "Interpolation Mode:",
- "targets.interpolation.hint": "How to calculate LED color from sampled pixels",
- "targets.interpolation.average": "Average",
- "targets.interpolation.median": "Median",
- "targets.interpolation.dominant": "Dominant",
- "targets.smoothing": "Smoothing:",
- "targets.smoothing.hint": "Temporal blending between frames (0=none, 1=full). Reduces flicker.",
- "targets.keepalive_interval": "Keep Alive Interval:",
- "targets.keepalive_interval.hint": "How often to resend the last frame when the source is static, keeping the device in live mode (0.5-5.0s)",
- "targets.created": "Target created successfully",
- "targets.updated": "Target updated successfully",
- "targets.deleted": "Target deleted successfully",
- "targets.delete.confirm": "Are you sure you want to delete this target?",
- "targets.error.load": "Failed to load targets",
- "targets.error.required": "Please fill in all required fields",
- "targets.error.name_required": "Please enter a target name",
- "targets.error.delete": "Failed to delete target",
- "targets.button.start": "Start",
- "targets.button.stop": "Stop",
- "targets.status.processing": "Processing",
- "targets.status.idle": "Idle",
- "targets.status.error": "Error",
- "targets.metrics.actual_fps": "Actual FPS",
- "targets.metrics.target_fps": "Target FPS",
- "targets.metrics.frames": "Frames",
- "targets.metrics.errors": "Errors",
- "targets.section.pattern_templates": "Pattern Templates",
- "pattern.add": "Add Pattern Template",
- "pattern.edit": "Edit Pattern Template",
- "pattern.name": "Template Name:",
- "pattern.name.placeholder": "My Pattern Template",
- "pattern.description_label": "Description (optional):",
- "pattern.description_placeholder": "Describe this pattern...",
- "pattern.rectangles": "Rectangles",
- "pattern.rect.name": "Name",
- "pattern.rect.x": "X",
- "pattern.rect.y": "Y",
- "pattern.rect.width": "W",
- "pattern.rect.height": "H",
- "pattern.rect.add": "Add Rectangle",
- "pattern.rect.remove": "Remove",
- "pattern.rect.empty": "No rectangles defined. Add at least one rectangle.",
- "pattern.created": "Pattern template created successfully",
- "pattern.updated": "Pattern template updated successfully",
- "pattern.deleted": "Pattern template deleted successfully",
- "pattern.delete.confirm": "Are you sure you want to delete this pattern template?",
- "pattern.delete.referenced": "Cannot delete: this template is referenced by a target",
- "pattern.error.required": "Please fill in all required fields",
- "pattern.visual_editor": "Visual Editor",
- "pattern.capture_bg": "Capture Background",
- "pattern.source_for_bg": "Source for Background:",
- "pattern.source_for_bg.none": "-- Select source --",
- "pattern.delete_selected": "Delete Selected",
- "pattern.name.hint": "A descriptive name for this rectangle layout",
- "pattern.description.hint": "Optional notes about where or how this pattern is used",
- "pattern.visual_editor.hint": "Click + buttons to add rectangles. Drag edges to resize, drag inside to move.",
- "pattern.rectangles.hint": "Fine-tune rectangle positions and sizes with exact coordinates (0.0 to 1.0)",
- "overlay.toggle": "Toggle screen overlay",
- "overlay.button.show": "Show overlay visualization",
- "overlay.button.hide": "Hide overlay visualization",
- "overlay.started": "Overlay visualization started",
- "overlay.stopped": "Overlay visualization stopped",
- "overlay.error.start": "Failed to start overlay",
- "overlay.error.stop": "Failed to stop overlay",
- "sidebar.workspaces": "Workspaces",
- "sidebar.load": "Load",
- "sidebar.fps": "FPS",
- "transport.status.ready": "Ready",
- "transport.status.armed": "Armed · {n} live",
- "transport.meta.uptime": "Uptime",
- "transport.meta.cpu": "CPU",
- "transport.meta.mem": "Mem",
- "transport.meta.poll": "Poll",
- "transport.meta.poll_hint": "Poll interval (click to cycle: 1s → 2s → 5s → 10s)",
- "dashboard.title": "Dashboard",
- "dashboard.section.targets": "Channels",
- "dashboard.section.running": "Running",
- "dashboard.section.stopped": "Stopped",
- "dashboard.no_targets": "No targets configured",
- "dashboard.uptime": "Uptime",
- "dashboard.fps": "FPS",
- "dashboard.errors": "Errors",
- "dashboard.device": "Device",
- "dashboard.stop_all": "Stop All",
- "dashboard.failed": "Failed to load dashboard",
- "dashboard.section.automations": "Automations",
- "dashboard.section.scenes": "Scene Presets",
- "dashboard.section.playlists": "Playlists",
- "dashboard.section.sync_clocks": "Sync Clocks",
- "dashboard.targets": "Targets",
- "dashboard.section.performance": "System Performance",
- "dashboard.section.integrations": "Integrations",
- "dashboard.integrations.entities": "entities",
- "dashboard.integrations.no_sources": "No integration sources configured",
- "dashboard.perf.active_patches": "Active Patches",
- "dashboard.perf.patches.empty.idle": "Ready to launch",
- "dashboard.perf.patches.empty.none": "No patches yet",
- "dashboard.perf.total_fps": "Total FPS",
- "dashboard.perf.total_capture_fps": "Total Source FPS",
- "dashboard.perf.total_capture_fps_actual": "Total Capture FPS",
- "dashboard.perf.network": "Network",
- "dashboard.perf.device_latency": "Device Latency",
- "dashboard.perf.send_timing": "Send Timing",
- "dashboard.perf.errors": "Errors",
- "dashboard.perf.devices": "Devices",
- "dashboard.perf.cpu": "CPU",
- "dashboard.perf.ram": "RAM",
- "dashboard.perf.gpu": "GPU",
- "dashboard.perf.temp": "Temperature",
- "dashboard.perf.temp.install_lhm": "Windows has no built-in CPU temperature API. Install LibreHardwareMonitor and enable \"Publish to WMI\" to see live readings here.",
- "dashboard.perf.unavailable": "unavailable",
- "dashboard.perf.color": "Chart color",
- "dashboard.perf.mode.system": "System",
- "dashboard.perf.mode.app": "App",
- "dashboard.perf.mode.both": "Both",
- "dashboard.poll_interval": "Refresh interval",
- "dashboard.customize.title": "Customize Dashboard",
- "dashboard.customize.presets": "Presets",
- "dashboard.customize.preset.studio": "Studio",
- "dashboard.customize.preset.operator": "Operator",
- "dashboard.customize.preset.showrunner": "Showrunner",
- "dashboard.customize.preset.diagnostics": "Diagnostics",
- "dashboard.customize.preset.tv": "TV",
- "dashboard.customize.modified": "Modified",
- "dashboard.customize.global": "Global",
- "dashboard.customize.width": "Width",
- "dashboard.customize.width.full": "Full",
- "dashboard.customize.width.centered": "Centered",
- "dashboard.customize.width.narrow": "Narrow",
- "dashboard.customize.anim": "Animations",
- "dashboard.customize.anim.full": "Full",
- "dashboard.customize.anim.reduced": "Reduced",
- "dashboard.customize.anim.off": "Off",
- "dashboard.customize.perf_mode": "Perf mode",
- "dashboard.customize.sections": "Sections",
- "dashboard.customize.perf_cells": "Performance Strip",
- "dashboard.customize.fixed_top": "Pinned to top",
- "dashboard.customize.drag_help": "Drag rows to reorder, or use the ↑/↓ buttons.",
- "dashboard.customize.cell_drag_help": "Drag a row to change cell order in the Performance strip on the dashboard.",
- "dashboard.customize.window": "Sample window",
- "dashboard.customize.scale": "Y-axis scale",
- "dashboard.customize.mode_short": "MODE",
- "dashboard.customize.window_short": "WIN",
- "dashboard.customize.scale_short": "SCL",
- "dashboard.customize.density.comfortable": "Comfortable",
- "dashboard.customize.density.compact": "Compact",
- "dashboard.customize.density.dense": "Dense",
- "card_mode.tooltip": "Card size",
- "card_mode.comfortable": "Comfortable",
- "card_mode.compact": "Compact",
- "card_mode.dense": "Dense",
- "card_mode.row": "List",
- "dashboard.customize.collapse_default.on": "Start collapsed",
- "dashboard.customize.collapse_default.off": "Start expanded",
- "dashboard.customize.show": "Show",
- "dashboard.customize.hide": "Hide",
- "dashboard.customize.mode.inherit": "Inherit",
- "dashboard.customize.mode.system": "Sys",
- "dashboard.customize.mode.app": "App",
- "dashboard.customize.mode.both": "Both",
- "dashboard.customize.yscale.auto": "Auto",
- "dashboard.customize.yscale.fixed": "Fixed",
- "dashboard.customize.yscale.log": "Log",
- "dashboard.customize.export": "Export",
- "dashboard.customize.import": "Import",
- "dashboard.customize.reset": "Reset",
- "dashboard.customize.reset_confirm": "Reset dashboard layout to the Studio preset?",
- "dashboard.customize.exported": "Layout exported",
- "dashboard.customize.imported": "Layout imported",
- "dashboard.customize.import_failed": "Failed to import layout",
- "automations.title": "Automations",
- "automations.empty": "No automations configured. Create one to automate scene activation.",
- "automations.add": "Add Automation",
- "automations.edit": "Edit Automation",
- "automations.delete.confirm": "Delete automation \"{name}\"?",
- "automations.section.triggers": "Triggers",
- "automations.section.action": "Action",
- "automations.section.deactivation": "Deactivation",
- "automations.name": "Name:",
- "automations.name.hint": "A descriptive name for this automation",
- "automations.name.placeholder": "My Automation",
- "automations.enabled": "Enabled:",
- "automations.enabled.hint": "Disabled automations won't activate even when conditions are met",
- "automations.rule_logic": "Rule Logic:",
- "automations.rule_logic.hint": "How multiple rules are combined: ANY (OR) or ALL (AND)",
- "automations.rule_logic.or": "Any rule (OR)",
- "automations.rule_logic.and": "All rules (AND)",
- "automations.rule_logic.or.desc": "Triggers when any rule matches",
- "automations.rule_logic.and.desc": "Triggers only when all match",
- "automations.rules": "Rules:",
- "automations.rules.hint": "Rules that determine when this automation activates",
- "automations.rules.add": "Add Rule",
- "automations.rules.empty": "No rules — automation is always active when enabled",
- "automations.rule.startup": "Startup",
- "automations.rule.startup.desc": "On server start",
- "automations.rule.startup.hint": "Activates when the server starts and stays active while enabled.",
- "automations.rule.application": "Application",
- "automations.rule.application.desc": "App running/focused",
- "automations.rule.application.apps": "Applications:",
- "automations.rule.application.apps.hint": "Process names, one per line (e.g. firefox.exe)",
- "automations.rule.application.browse": "Browse",
- "automations.rule.application.search": "Filter processes...",
- "automations.rule.application.no_processes": "No processes found",
- "automations.rule.application.match_type": "Match Type:",
- "automations.rule.application.match_type.hint": "How to detect the application",
- "automations.rule.application.match_type.running": "Running",
- "automations.rule.application.match_type.running.desc": "Process is active",
- "automations.rule.application.match_type.topmost": "Topmost",
- "automations.rule.application.match_type.topmost.desc": "Foreground window",
- "automations.rule.application.match_type.topmost_fullscreen": "Topmost + FS",
- "automations.rule.application.match_type.topmost_fullscreen.desc": "Foreground + fullscreen",
- "automations.rule.application.match_type.fullscreen": "Fullscreen",
- "automations.rule.application.match_type.fullscreen.desc": "Any fullscreen app",
- "automations.rule.application.apps.hint_android": "Package names, one per line (e.g. com.netflix.mediaclient)",
- "automations.rule.application.search_apps": "Filter apps...",
- "automations.rule.application.no_apps": "No apps found",
- "automations.rule.application.usage_access_required": "Needs Usage Access. On your LedGrab TV, open the app and tap 'Grant usage access'.",
- "automations.rule.time_of_day": "Time of Day",
- "automations.rule.time_of_day.desc": "Time range",
- "automations.rule.time_of_day.start_time": "Start Time:",
- "automations.rule.time_of_day.end_time": "End Time:",
- "automations.rule.time_of_day.overnight_hint": "For overnight ranges (e.g. 22:00–06:00), set start time after end time.",
- "automations.rule.time_of_day.days": "Active days",
- "automations.rule.time_of_day.days_hint": "Leave all unselected for every day. Overnight windows count toward the day they start on.",
- "automations.rule.time_of_day.timezone": "Timezone",
- "automations.rule.time_of_day.timezone.placeholder": "Server local (e.g. Europe/Berlin)",
- "weekday.short.0": "Mon",
- "weekday.short.1": "Tue",
- "weekday.short.2": "Wed",
- "weekday.short.3": "Thu",
- "weekday.short.4": "Fri",
- "weekday.short.5": "Sat",
- "weekday.short.6": "Sun",
- "automations.rule.system_idle": "System Idle",
- "automations.rule.system_idle.desc": "User idle/active",
- "automations.rule.system_idle.idle_minutes": "Idle Timeout (minutes):",
- "automations.rule.system_idle.mode": "Trigger Mode:",
- "automations.rule.system_idle.when_idle": "When idle",
- "automations.rule.system_idle.when_idle.desc": "Fires once the user has been idle past the timeout",
- "automations.rule.system_idle.when_active": "When active",
- "automations.rule.system_idle.when_active.desc": "Fires while the user is actively using the system",
- "automations.rule.display_state": "Display State",
- "automations.rule.display_state.desc": "Monitor on/off",
- "automations.rule.display_state.state": "Monitor State:",
- "automations.rule.display_state.on": "On",
- "automations.rule.display_state.off": "Off (sleeping)",
- "automations.rule.mqtt": "MQTT",
- "automations.rule.mqtt.desc": "MQTT message",
- "automations.rule.mqtt.topic": "Topic:",
- "automations.rule.mqtt.payload": "Payload:",
- "automations.rule.mqtt.match_mode": "Match Mode:",
- "automations.rule.mqtt.match_mode.exact": "Exact",
- "automations.rule.mqtt.match_mode.contains": "Contains",
- "automations.rule.mqtt.match_mode.regex": "Regex",
- "automations.rule.mqtt.hint": "Activate when an MQTT topic receives a matching payload",
- "automations.rule.webhook": "Webhook",
- "automations.rule.webhook.desc": "HTTP callback",
- "automations.rule.webhook.hint": "Activate via an HTTP call from external services (Home Assistant, IFTTT, curl, etc.)",
- "automations.rule.webhook.url": "Webhook URL:",
- "automations.rule.webhook.copy": "Copy",
- "automations.rule.webhook.copied": "Copied!",
- "automations.rule.webhook.save_first": "Save the automation first to generate a webhook URL",
- "automations.scene": "Scene:",
- "automations.scene.hint": "Scene preset to activate when conditions are met",
- "automations.scene.search_placeholder": "Search scenes...",
- "automations.scene.none_selected": "None (no scene)",
- "automations.scene.none_available": "No scenes available",
- "automations.deactivation_mode": "Deactivation:",
- "automations.deactivation_mode.hint": "What happens when conditions stop matching",
- "automations.deactivation_mode.none": "None",
- "automations.deactivation_mode.none.desc": "Keep current state",
- "automations.deactivation_mode.revert": "Revert",
- "automations.deactivation_mode.revert.desc": "Restore previous state",
- "automations.deactivation_mode.fallback_scene": "Fallback",
- "automations.deactivation_mode.fallback_scene.desc": "Activate a fallback scene",
- "automations.deactivation_scene": "Fallback Scene:",
- "automations.deactivation_scene.hint": "Scene to activate when this automation deactivates",
- "automations.status.active": "Active",
- "automations.status.inactive": "Inactive",
- "automations.status.disabled": "Disabled",
- "automations.action.disable": "Disable",
- "automations.last_activated": "Last activated",
- "automations.logic.and": " AND ",
- "automations.logic.or": " OR ",
- "automations.logic.all": "ALL",
- "automations.logic.any": "ANY",
- "automations.updated": "Automation updated",
- "automations.created": "Automation created",
- "automations.deleted": "Automation deleted",
- "automations.error.name_required": "Name is required",
- "automations.error.clone_failed": "Failed to clone automation",
- "automations.error.load_failed": "Failed to load automation",
- "automations.error.save_failed": "Failed to save automation",
- "automations.error.delete_failed": "Failed to delete automation",
- "automations.error.toggle_failed": "Failed to toggle automation",
- "scenes.title": "Scenes",
- "scenes.add": "Capture Scene",
- "scenes.edit": "Edit Scene",
- "scenes.name": "Name:",
- "scenes.name.hint": "A descriptive name for this scene preset",
- "scenes.name.placeholder": "My Scene",
- "scenes.description": "Description:",
- "scenes.description.hint": "Optional description of what this scene does",
- "scenes.targets": "Targets:",
- "scenes.targets.hint": "Select which targets to include in this scene snapshot",
- "scenes.targets.add": "Add Target",
- "scenes.targets.search_placeholder": "Search targets...",
- "scenes.targets.empty": "No targets selected",
- "scenes.capture": "Capture",
- "scenes.activate": "Activate scene",
- "scenes.recapture": "Recapture current state",
- "scenes.action.activate": "Activate",
- "scenes.action.recapture": "Recapture",
- "scenes.status.preset": "Preset",
- "scenes.delete": "Delete scene",
- "scenes.targets_count": "targets",
- "scenes.captured": "Scene captured",
- "scenes.updated": "Scene updated",
- "scenes.activated": "Scene activated",
- "scenes.activated_partial": "Scene partially activated",
- "scenes.errors": "errors",
- "scenes.recaptured": "Scene recaptured",
- "scenes.deleted": "Scene deleted",
- "scenes.recapture_confirm": "Recapture current state into \"{name}\"?",
- "scenes.delete_confirm": "Delete scene \"{name}\"?",
- "scenes.error.name_required": "Name is required",
- "scenes.error.save_failed": "Failed to save scene",
- "scenes.error.activate_failed": "Failed to activate scene",
- "scenes.error.recapture_failed": "Failed to recapture scene",
- "scenes.error.delete_failed": "Failed to delete scene",
- "scenes.cloned": "Scene cloned",
- "scenes.error.clone_failed": "Failed to clone scene",
- "playlists.title": "Playlists",
- "playlists.add": "New Playlist",
- "playlists.edit": "Edit Playlist",
- "playlists.name": "Name:",
- "playlists.name.placeholder": "My Playlist",
- "playlists.description": "Description:",
- "playlists.description.hint": "Optional description of what this playlist does",
- "playlists.section.playback": "Playback",
- "playlists.loop": "Loop:",
- "playlists.loop.hint": "Restart from the first scene after the last one; off plays through once and stops",
- "playlists.shuffle": "Shuffle:",
- "playlists.shuffle.hint": "Randomise the scene order at the start of every cycle",
- "playlists.scenes": "Scenes:",
- "playlists.scenes.hint": "The scene presets this playlist cycles through, each held for its own duration",
- "playlists.scenes.add": "Add Scene",
- "playlists.scenes_count": "scenes",
- "playlists.scene_one": "scene",
- "playlists.scene_many": "scenes",
- "playlists.items.empty": "No scenes yet — add some below",
- "playlists.items.search_placeholder": "Search scenes...",
- "playlists.item.duration": "Seconds",
- "playlists.item.move_up": "Move up",
- "playlists.item.move_down": "Move down",
- "playlists.item.missing": "Missing",
- "playlists.chip.loop": "Loop",
- "playlists.chip.shuffle": "Shuffle",
- "playlists.action.start": "Start",
- "playlists.action.stop": "Stop",
- "playlists.start": "Start playlist",
- "playlists.stop": "Stop playlist",
- "playlists.status.playing": "Playing",
- "playlists.status.stopped": "Stopped",
- "playlists.started": "Playlist started",
- "playlists.stopped": "Playlist stopped",
- "playlists.created": "Playlist created",
- "playlists.updated": "Playlist updated",
- "playlists.deleted": "Playlist deleted",
- "playlists.delete_confirm": "Delete playlist \"{name}\"?",
- "playlists.error.name_required": "Name is required",
- "playlists.error.save_failed": "Failed to save playlist",
- "playlists.error.start_failed": "Failed to start playlist",
- "playlists.error.stop_failed": "Failed to stop playlist",
- "playlists.error.delete_failed": "Failed to delete playlist",
- "playlists.error.no_presets": "Create a scene preset first",
- "dashboard.type.led": "LED",
- "dashboard.type.kc": "Key Colors",
- "aria.close": "Close",
- "aria.save": "Save",
- "aria.cancel": "Cancel",
- "aria.previous": "Previous",
- "aria.next": "Next",
- "aria.hint": "Show hint",
- "color_strip.select_type": "Select Color Strip Type",
- "color_strip.add": "Add",
- "color_strip.edit": "Edit",
- "color_strip.name": "Name:",
- "color_strip.name.placeholder": "Wall Strip",
- "color_strip.picture_source": "Picture Source:",
- "color_strip.picture_source.hint": "Which screen capture source to use as input for LED color calculation",
- "color_strip.fps": "Target FPS:",
- "color_strip.fps.hint": "Target frames per second for LED color updates (10-90)",
- "color_strip.interpolation": "Color Mode:",
- "color_strip.interpolation.hint": "How to calculate LED color from sampled border pixels",
- "color_strip.interpolation.average": "Average",
- "color_strip.interpolation.median": "Median",
- "color_strip.interpolation.dominant": "Dominant",
- "color_strip.interpolation.average.desc": "Blend all sampled pixels into a smooth color",
- "color_strip.interpolation.median.desc": "Pick the middle color, reducing outliers",
- "color_strip.interpolation.dominant.desc": "Use the most frequent color in the sample",
- "color_strip.smoothing": "Smoothing:",
- "color_strip.smoothing.hint": "Temporal blending between frames (0=none, 1=full). Reduces flicker.",
- "color_strip.frame_interpolation": "Frame Interpolation:",
- "color_strip.frame_interpolation.hint": "Blends between consecutive captured frames to produce output at the full target FPS even when capture rate is lower. Reduces visible stepping on slow ambient transitions.",
- "color_strip.color_corrections": "Color Corrections",
- "color_strip.brightness": "Brightness:",
- "color_strip.brightness.hint": "Output brightness multiplier (0=off, 1=unchanged, 2=double). Applied after color extraction.",
- "color_strip.saturation": "Saturation:",
- "color_strip.saturation.hint": "Color saturation (0=grayscale, 1=unchanged, 2=double saturation)",
- "color_strip.gamma": "Gamma:",
- "color_strip.gamma.hint": "Gamma correction (1=none, <1=brighter midtones, >1=darker midtones)",
- "color_strip.test_device": "Test on Device:",
- "color_strip.test_device.hint": "Select a device to send test pixels to when clicking edge toggles",
- "color_strip.leds": "LED count",
- "color_strip.led_count": "LED Count:",
- "color_strip.led_count.hint": "Total number of LEDs on the physical strip. For screen sources: 0 = auto from calibration (extra LEDs not mapped to edges will be black). For single 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. Single 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.single_color": "Single Color",
- "color_strip.type.single_color.desc": "Single solid color fill",
- "color_strip.type.gradient": "Gradient",
- "color_strip.type.gradient.desc": "Smooth color transition across LEDs",
- "color_strip.single_color": "Color:",
- "color_strip.single_color.hint": "The solid color that will be sent to all LEDs on the strip.",
- "color_strip.gradient.preview": "Gradient:",
- "color_strip.gradient.preview.hint": "Visual preview. Click the marker track below to add a stop. Drag markers to reposition.",
- "color_strip.gradient.easing": "Easing:",
- "color_strip.gradient.easing.hint": "Controls how colors blend between gradient stops.",
- "color_strip.gradient.easing.linear": "Linear",
- "color_strip.gradient.easing.linear.desc": "Constant-rate blending between stops",
- "color_strip.gradient.easing.ease_in_out": "Smooth",
- "color_strip.gradient.easing.ease_in_out.desc": "S-curve: slow start and end, fast middle",
- "color_strip.gradient.easing.step": "Step",
- "color_strip.gradient.easing.step.desc": "Hard jumps between colors with no blending",
- "color_strip.gradient.easing.cubic": "Cubic",
- "color_strip.gradient.easing.cubic.desc": "Cubic ease — accelerating blend curve",
- "color_strip.gradient.stops": "Color Stops:",
- "color_strip.gradient.stops.hint": "Each stop defines a color at a relative position (0.0 = start, 1.0 = end). The ↔ button adds a right-side color to create a hard edge at that stop.",
- "color_strip.gradient.stops_count": "stops",
- "color_strip.gradient.add_stop": "+ Add Stop",
- "color_strip.gradient.position": "Position (0.0–1.0)",
- "color_strip.gradient.bidir.hint": "Add a second color on the right side of this stop to create a hard edge in the gradient.",
- "color_strip.gradient.min_stops": "Gradient must have at least 2 stops",
- "color_strip.gradient.select": "Gradient:",
- "color_strip.gradient.select.hint": "Select a gradient from the library. Create and edit gradients in the Gradients tab.",
- "color_strip.gradient.error.no_gradient": "Please select a gradient",
- "color_strip.gradient.preset": "Preset:",
- "color_strip.gradient.preset.hint": "Load a predefined gradient palette. Selecting a preset replaces the current stops.",
- "color_strip.gradient.preset.custom": "— Custom —",
- "color_strip.gradient.preset.rainbow": "Rainbow",
- "color_strip.gradient.preset.sunset": "Sunset",
- "color_strip.gradient.preset.ocean": "Ocean",
- "color_strip.gradient.preset.forest": "Forest",
- "color_strip.gradient.preset.fire": "Fire",
- "color_strip.gradient.preset.lava": "Lava",
- "color_strip.gradient.preset.aurora": "Aurora",
- "color_strip.gradient.preset.ice": "Ice",
- "color_strip.gradient.preset.warm": "Warm",
- "color_strip.gradient.preset.cool": "Cool",
- "color_strip.gradient.preset.neon": "Neon",
- "color_strip.gradient.preset.pastel": "Pastel",
- "color_strip.gradient.preset.save_button": "Save as preset…",
- "color_strip.gradient.preset.save_prompt": "Enter a name for this preset:",
- "color_strip.gradient.preset.saved": "Preset saved",
- "color_strip.gradient.preset.deleted": "Preset deleted",
- "color_strip.gradient.preset.apply": "Apply",
- "color_strip.animation": "Animation",
- "color_strip.animation.type": "Effect:",
- "color_strip.animation.type.hint": "Animation effect to apply.",
- "color_strip.animation.type.none": "None (no animation effect)",
- "color_strip.animation.type.none.desc": "Static colors with no animation",
- "color_strip.animation.type.breathing": "Breathing",
- "color_strip.animation.type.breathing.desc": "Smooth brightness fade in and out",
- "color_strip.animation.type.gradient_shift": "Gradient Shift",
- "color_strip.animation.type.gradient_shift.desc": "Slides the gradient along the strip",
- "color_strip.animation.type.wave": "Wave",
- "color_strip.animation.type.wave.desc": "Sinusoidal brightness wave moving along the strip",
- "color_strip.animation.type.strobe": "Strobe",
- "color_strip.animation.type.strobe.desc": "Rapid on/off flashing",
- "color_strip.animation.type.sparkle": "Sparkle",
- "color_strip.animation.type.sparkle.desc": "Random LEDs flash briefly",
- "color_strip.animation.type.pulse": "Pulse",
- "color_strip.animation.type.pulse.desc": "Sharp brightness pulse with quick fade",
- "color_strip.animation.type.candle": "Candle",
- "color_strip.animation.type.candle.desc": "Warm flickering candle-like glow",
- "color_strip.animation.type.rainbow_fade": "Rainbow Fade",
- "color_strip.animation.type.rainbow_fade.desc": "Cycles through the entire hue spectrum",
- "color_strip.animation.type.noise_perturb": "Noise Perturb",
- "color_strip.animation.type.noise_perturb.desc": "Perturbs gradient stop positions with organic noise each frame",
- "color_strip.animation.type.hue_rotate": "Hue Rotate",
- "color_strip.animation.type.hue_rotate.desc": "Smoothly rotates all pixel hues while preserving saturation and brightness",
- "color_strip.animation.speed": "Speed:",
- "color_strip.animation.speed.hint": "Animation speed multiplier. 1.0 ≈ one cycle per second for Breathing; higher values cycle faster.",
- "color_strip.type.effect": "Effect",
- "color_strip.type.effect.desc": "Procedural effects like fire, plasma, aurora",
- "color_strip.type.effect.hint": "Procedural LED effects (fire, meteor, plasma, noise, aurora) generated in real time.",
- "color_strip.type.composite": "Composite",
- "color_strip.type.composite.desc": "Stack and blend multiple sources",
- "color_strip.type.composite.hint": "Stack multiple color strip sources as layers with blend modes and opacity.",
- "color_strip.type.mapped": "Mapped",
- "color_strip.type.mapped.desc": "Assign sources to LED zones",
- "color_strip.type.mapped.hint": "Assign different color strip sources to different LED ranges (zones). Unlike composite which blends layers, mapped places sources side-by-side.",
- "color_strip.type.audio": "Audio Reactive",
- "color_strip.type.audio.desc": "LEDs driven by audio input",
- "color_strip.type.audio.hint": "LED colors driven by real-time audio input — system audio or microphone.",
- "color_strip.type.api_input": "API Input",
- "color_strip.type.api_input.desc": "Receive colors from external apps",
- "color_strip.type.api_input.hint": "Receives raw LED color arrays from external clients via REST POST or WebSocket. Use this to integrate with custom software, home automation, or any system that can send HTTP requests.",
- "color_strip.api_input.fallback_color": "Fallback Color:",
- "color_strip.api_input.fallback_color.hint": "Color to display when no data has been received within the timeout period. LEDs will show this color on startup and after the connection is lost.",
- "color_strip.api_input.timeout": "Timeout (seconds):",
- "color_strip.api_input.timeout.hint": "How long to wait for new color data before reverting to the fallback color. Set to 0 to never time out.",
- "color_strip.api_input.endpoints": "Push Endpoints:",
- "color_strip.api_input.endpoints.hint": "Use these URLs to push LED color data from your external application. REST accepts JSON, WebSocket accepts both JSON and raw binary frames.",
- "color_strip.api_input.save_first": "Save the source first to see the push endpoint URLs.",
- "color_strip.api_input.interpolation": "LED Interpolation:",
- "color_strip.api_input.interpolation.hint": "How to resize incoming LED data when its count differs from the device's LED count. Linear gives smooth blending, Nearest preserves sharp edges, None truncates or zero-pads.",
- "color_strip.api_input.interpolation.linear": "Linear",
- "color_strip.api_input.interpolation.linear.desc": "Smooth blending between LEDs",
- "color_strip.api_input.interpolation.nearest": "Nearest",
- "color_strip.api_input.interpolation.nearest.desc": "Sharp edges, no blending",
- "color_strip.api_input.interpolation.none": "None",
- "color_strip.api_input.interpolation.none.desc": "Truncate or zero-pad",
- "color_strip.type.notification": "Notification",
- "color_strip.type.notification.desc": "One-shot effect on webhook trigger",
- "color_strip.type.notification.hint": "Fires a one-shot visual effect (flash, pulse, sweep) when triggered via a webhook. Designed for use as a composite layer over a persistent base source.",
- "color_strip.notification.os_listener": "Listen to OS Notifications:",
- "color_strip.notification.os_listener.hint": "When enabled, this source automatically fires when a desktop notification appears (Windows toast / Linux D-Bus). Requires the app to have notification access permission.",
- "color_strip.notification.effect": "Effect:",
- "color_strip.notification.effect.hint": "Visual effect when a notification fires. Flash fades linearly, Pulse uses a smooth bell curve, Sweep fills LEDs left-to-right then fades.",
- "color_strip.notification.effect.flash": "Flash",
- "color_strip.notification.effect.flash.desc": "Instant on, linear fade-out",
- "color_strip.notification.effect.pulse": "Pulse",
- "color_strip.notification.effect.pulse.desc": "Smooth bell-curve glow",
- "color_strip.notification.effect.sweep": "Sweep",
- "color_strip.notification.effect.sweep.desc": "Fills left-to-right then fades",
- "color_strip.notification.effect.chase": "Chase",
- "color_strip.notification.effect.chase.desc": "Light travels across strip and bounces back",
- "color_strip.notification.effect.gradient_flash": "Gradient Flash",
- "color_strip.notification.effect.gradient_flash.desc": "Bright center fades to edges, then all fades out",
- "color_strip.notification.duration": "Duration (ms):",
- "color_strip.notification.duration.hint": "How long the notification effect plays, in milliseconds.",
- "color_strip.notification.default_color": "Default Color:",
- "color_strip.notification.default_color.hint": "Color used when the notification has no app-specific color mapping.",
- "color_strip.notification.filter_mode": "App Filter:",
- "color_strip.notification.filter_mode.hint": "Filter notifications by app name. Off = accept all, Whitelist = only listed apps, Blacklist = all except listed apps.",
- "color_strip.notification.filter_mode.off": "Off",
- "color_strip.notification.filter_mode.whitelist": "Whitelist",
- "color_strip.notification.filter_mode.blacklist": "Blacklist",
- "color_strip.notification.filter_mode.off.desc": "Accept all notifications",
- "color_strip.notification.filter_mode.whitelist.desc": "Only listed apps",
- "color_strip.notification.filter_mode.blacklist.desc": "All except listed apps",
- "color_strip.notification.filter_list": "App List:",
- "color_strip.notification.filter_list.hint": "One app name per line. Use Browse to pick from running processes.",
- "color_strip.notification.filter_list.placeholder": "Discord\nSlack\nTelegram",
- "color_strip.notification.app_colors": "App Colors",
- "color_strip.notification.app_colors.label": "Color Mappings:",
- "color_strip.notification.app_colors.hint": "Per-app color overrides. Each row maps an app name to a specific notification color.",
- "color_strip.notification.app_colors.add": "+ Add Mapping",
- "color_strip.notification.app_overrides": "Per-App Overrides",
- "color_strip.notification.app_overrides.label": "App Overrides:",
- "color_strip.notification.app_overrides.hint": "Per-app overrides for color and sound. Each row can set a custom color, sound asset, and volume for a specific app.",
- "color_strip.notification.app_overrides.add": "+ Add Override",
- "color_strip.notification.app_overrides.app_placeholder": "App name",
- "color_strip.notification.sound": "Sound",
- "color_strip.notification.sound.asset": "Sound Asset:",
- "color_strip.notification.sound.asset.hint": "Pick a sound asset to play when a notification fires. Leave empty for silent.",
- "color_strip.notification.sound.none": "None (silent)",
- "color_strip.notification.sound.search": "Search sounds…",
- "color_strip.notification.sound.volume": "Volume:",
- "color_strip.notification.sound.volume.hint": "Global volume for notification sounds (0–100%).",
- "color_strip.notification.sound.app_sounds": "Per-App Sounds:",
- "color_strip.notification.sound.app_sounds.hint": "Override sound and volume for specific apps. Empty sound = mute that app.",
- "color_strip.notification.sound.app_sounds.add": "+ Add Override",
- "color_strip.notification.sound.app_name_placeholder": "App name",
- "color_strip.notification.endpoint": "Webhook Endpoint:",
- "color_strip.notification.endpoint.hint": "Use this URL to trigger notifications from external systems. POST with optional JSON body: {\"app\": \"AppName\", \"color\": \"#FF0000\"}.",
- "color_strip.notification.save_first": "Save the source first to see the webhook endpoint URL.",
- "color_strip.notification.app_count": "apps",
- "color_strip.notification.test": "Test notification",
- "color_strip.notification.test.ok": "Notification sent",
- "color_strip.notification.test.no_streams": "No running streams for this source",
- "color_strip.notification.test.error": "Failed to send notification",
- "color_strip.notification.history.title": "Notification History",
- "color_strip.notification.history.hint": "Recent OS notifications captured by the listener (newest first). Up to 50 entries.",
- "color_strip.notification.history.empty": "No notifications captured yet",
- "color_strip.notification.history.unavailable": "OS notification listener is not available on this platform",
- "color_strip.notification.history.error": "Failed to load notification history",
- "color_strip.notification.history.refresh": "Refresh",
- "color_strip.notification.history.unknown_app": "Unknown app",
- "color_strip.notification.history.fired": "Streams triggered",
- "color_strip.notification.history.filtered": "Streams filtered",
- "color_strip.test.title": "Test Preview",
- "color_strip.test.connecting": "Connecting...",
- "color_strip.test.error": "Failed to connect to preview stream",
- "color_strip.test.led_count": "LEDs:",
- "color_strip.test.fps": "FPS:",
- "color_strip.test.receive_fps": "Receive FPS",
- "color_strip.test.apply": "Apply",
- "color_strip.test.composite": "Composite",
- "color_strip.preview.title": "Live Preview",
- "color_strip.preview.not_connected": "Not connected",
- "color_strip.preview.connecting": "Connecting...",
- "color_strip.preview.connected": "Connected",
- "color_strip.preview.unsupported": "Preview not available for this source type",
- "color_strip.preview.save_first": "Save the source first — calibration is needed for preview",
- "color_strip.type.daylight": "Daylight Cycle",
- "color_strip.type.daylight.desc": "Simulates natural daylight over 24 hours",
- "color_strip.type.daylight.hint": "Simulates the sun's color temperature throughout a 24-hour day/night cycle — from warm sunrise to cool daylight to warm sunset and dim night.",
- "color_strip.daylight.speed": "Speed:",
- "color_strip.daylight.speed.hint": "Cycle speed multiplier. 1.0 = full day/night cycle in ~4 minutes. Higher values cycle faster.",
- "color_strip.daylight.use_real_time": "Use Real Time:",
- "color_strip.daylight.use_real_time.hint": "When enabled, LED color matches the actual time of day on this computer. Speed setting is ignored.",
- "color_strip.daylight.real_time": "Real Time",
- "color_strip.daylight.latitude": "Latitude:",
- "color_strip.daylight.latitude.hint": "Your geographic latitude (-90 to 90). Affects sunrise/sunset timing in real-time mode.",
- "color_strip.daylight.longitude": "Longitude:",
- "color_strip.daylight.longitude.hint": "Your geographic longitude (-180 to 180). Adjusts solar noon offset for accurate sunrise/sunset timing.",
- "color_strip.type.candlelight": "Candlelight",
- "color_strip.type.candlelight.desc": "Realistic flickering candle simulation",
- "color_strip.type.candlelight.hint": "Simulates realistic candle flickering across all LEDs with warm tones and organic flicker patterns.",
- "color_strip.type.key_colors": "Key Colors",
- "color_strip.type.key_colors.desc": "Extract colors from screen regions",
- "color_strip.key_colors.picture_source": "Picture Source:",
- "color_strip.key_colors.interpolation": "Color Mode:",
- "color_strip.key_colors.smoothing": "Smoothing:",
- "color_strip.key_colors.brightness": "Brightness:",
- "color_strip.key_colors.rectangles": "Screen Regions:",
- "color_strip.key_colors.no_rects": "No regions defined. Click Configure Regions to add.",
- "color_strip.key_colors.configure_regions": "Configure Regions",
- "color_strip.key_colors.mode.average": "Average",
- "color_strip.key_colors.mode.average.desc": "Mean color of all pixels in the region",
- "color_strip.key_colors.mode.median": "Median",
- "color_strip.key_colors.mode.median.desc": "Median color (less affected by outliers)",
- "color_strip.key_colors.mode.dominant": "Dominant",
- "color_strip.key_colors.mode.dominant.desc": "Most frequent color (K-means clustering)",
- "color_strip.key_colors.error.no_source": "Picture source is required",
- "color_strip.key_colors.error.no_rects": "At least one screen region is required",
- "color_strip.type.weather": "Weather",
- "color_strip.type.weather.desc": "Weather-reactive ambient colors",
- "color_strip.type.weather.hint": "Maps real-time weather conditions to ambient LED colors. Requires a Weather Source entity.",
- "color_strip.weather.source": "Weather Source:",
- "color_strip.weather.source.hint": "The weather data source to use for ambient colors. Create one in the Weather tab first.",
- "color_strip.weather.speed": "Animation Speed:",
- "color_strip.weather.speed.hint": "Speed of the ambient color drift animation. Higher = faster movement.",
- "color_strip.weather.temperature_influence": "Temperature Influence:",
- "color_strip.weather.temperature_influence.hint": "How much the current temperature shifts the palette warm/cool. 0 = pure condition colors, 1 = strong shift.",
- "color_strip.weather.error.no_source": "Please select a weather source",
- "color_strip.candlelight.color": "Base Color:",
- "color_strip.candlelight.color.hint": "The warm base color of the candle flame. Default is a natural warm amber.",
- "color_strip.candlelight.intensity": "Flicker Intensity:",
- "color_strip.candlelight.intensity.hint": "How much the candles flicker. Low values produce a gentle glow, high values simulate a windy candle.",
- "color_strip.candlelight.num_candles_label": "Number of Candles:",
- "color_strip.candlelight.num_candles": "candles",
- "color_strip.candlelight.num_candles.hint": "How many independent candle sources along the strip. Each flickers with its own pattern.",
- "color_strip.candlelight.speed": "Flicker Speed:",
- "color_strip.candlelight.speed.hint": "Speed of the flicker animation. Higher values produce faster, more restless flames.",
- "color_strip.candlelight.wind": "Wind:",
- "color_strip.candlelight.wind.hint": "Wind simulation strength. Higher values create correlated gusts that make all candles flicker together.",
- "color_strip.candlelight.type": "Candle Type:",
- "color_strip.candlelight.type.hint": "Preset that adjusts flicker behavior without changing other settings.",
- "color_strip.candlelight.type.default": "Default",
- "color_strip.candlelight.type.default.desc": "Standard candle flicker",
- "color_strip.candlelight.type.taper": "Taper",
- "color_strip.candlelight.type.taper.desc": "Tall, steady candle with reduced flicker",
- "color_strip.candlelight.type.votive": "Votive",
- "color_strip.candlelight.type.votive.desc": "Small, flickery candle with narrow glow",
- "color_strip.candlelight.type.bonfire": "Bonfire",
- "color_strip.candlelight.type.bonfire.desc": "Large, chaotic fire with extra warmth",
- "color_strip.type.processed": "Processed",
- "color_strip.type.processed.desc": "Apply a processing template to another source",
- "color_strip.type.processed.hint": "Wraps an existing color strip source and pipes its output through a filter chain.",
- "color_strip.processed.input": "Source:",
- "color_strip.processed.input.hint": "The color strip source whose output will be processed",
- "color_strip.processed.template": "Processing Template:",
- "color_strip.processed.template.hint": "Filter chain to apply to the input source output",
- "color_strip.processed.error.no_input": "Please select an input source",
- "color_strip.composite.layers": "Layers:",
- "color_strip.composite.layers.hint": "Stack multiple color strip sources. First layer is the bottom, last is the top. Each layer can have its own blend mode and opacity.",
- "color_strip.composite.add_layer": "Add Layer",
- "color_strip.composite.source": "Source",
- "color_strip.composite.blend_mode": "Blend",
- "color_strip.composite.blend_mode.normal": "Normal",
- "color_strip.composite.blend_mode.normal.desc": "Standard alpha blending",
- "color_strip.composite.blend_mode.add": "Add",
- "color_strip.composite.blend_mode.add.desc": "Brightens by adding colors",
- "color_strip.composite.blend_mode.multiply": "Multiply",
- "color_strip.composite.blend_mode.multiply.desc": "Darkens by multiplying colors",
- "color_strip.composite.blend_mode.screen": "Screen",
- "color_strip.composite.blend_mode.screen.desc": "Brightens, inverse of multiply",
- "color_strip.composite.blend_mode.override": "Override",
- "color_strip.composite.blend_mode.overlay": "Overlay",
- "color_strip.composite.blend_mode.overlay.desc": "Multiply darks, screen lights",
- "color_strip.composite.blend_mode.soft_light": "Soft Light",
- "color_strip.composite.blend_mode.soft_light.desc": "Gentle contrast adjustment",
- "color_strip.composite.blend_mode.hard_light": "Hard Light",
- "color_strip.composite.blend_mode.hard_light.desc": "Strong contrast, vivid colors",
- "color_strip.composite.blend_mode.difference": "Difference",
- "color_strip.composite.blend_mode.difference.desc": "Absolute color difference",
- "color_strip.composite.blend_mode.exclusion": "Exclusion",
- "color_strip.composite.blend_mode.exclusion.desc": "Like difference, lower contrast",
- "color_strip.composite.blend_mode.override.desc": "Black = transparent, bright = opaque",
- "color_strip.composite.opacity": "Opacity",
- "color_strip.composite.brightness": "Brightness",
- "color_strip.composite.brightness.none": "None (full brightness)",
- "color_strip.composite.processing": "Processing",
- "color_strip.composite.enabled": "Enabled",
- "color_strip.composite.error.min_layers": "At least 1 layer is required",
- "color_strip.composite.error.no_source": "Each layer must have a source selected",
- "color_strip.composite.layers_count": "layers",
- "color_strip.composite.range": "LED Range",
- "color_strip.composite.range_start": "Start",
- "color_strip.composite.range_end": "End",
- "color_strip.composite.reverse": "Reverse",
- "color_strip.mapped.zones": "Zones:",
- "color_strip.mapped.zones.hint": "Each zone maps a color strip source to a specific LED range. Zones are placed side-by-side — gaps between zones stay black.",
- "color_strip.mapped.add_zone": "+ Add Zone",
- "color_strip.mapped.zone_source": "Source",
- "color_strip.mapped.zone_start": "Start LED",
- "color_strip.mapped.zone_end": "End LED",
- "color_strip.mapped.zone_reverse": "Reverse",
- "color_strip.mapped.zones_count": "zones",
- "color_strip.mapped.select_source": "Search sources...",
- "color_strip.mapped.error.no_source": "Each zone must have a source selected",
- "color_strip.audio.visualization": "Visualization:",
- "color_strip.audio.visualization.hint": "How audio data is rendered to LEDs.",
- "color_strip.audio.viz.spectrum": "Spectrum Analyzer",
- "color_strip.audio.viz.spectrum.desc": "Frequency bars across the strip",
- "color_strip.audio.viz.beat_pulse": "Beat Pulse",
- "color_strip.audio.viz.beat_pulse.desc": "All LEDs pulse on the beat",
- "color_strip.audio.viz.vu_meter": "VU Meter",
- "color_strip.audio.viz.vu_meter.desc": "Volume level fills the strip",
- "color_strip.audio.viz.pulse_on_beat": "Pulse on Beat",
- "color_strip.audio.viz.pulse_on_beat.desc": "LEDs pulse with each detected beat",
- "color_strip.audio.viz.energy_gradient": "Energy Gradient",
- "color_strip.audio.viz.energy_gradient.desc": "Gradient intensity follows audio energy",
- "color_strip.audio.viz.spectrum_bands": "Spectrum Bands",
- "color_strip.audio.viz.spectrum_bands.desc": "Grouped frequency bands across the strip",
- "color_strip.audio.viz.strobe_on_drop": "Strobe on Drop",
- "color_strip.audio.viz.strobe_on_drop.desc": "Flash strobe effect on bass drops",
- "color_strip.audio.beat_decay": "Beat Decay:",
- "color_strip.audio.beat_decay.hint": "How quickly the beat pulse fades. Lower values = longer fade, higher = snappier response.",
- "color_strip.audio.source": "Audio Source:",
- "color_strip.audio.source.hint": "Audio source for this visualization. Can be a multichannel (device) or mono (single channel) source. Create and manage audio sources in the Sources tab.",
- "color_strip.audio.sensitivity": "Sensitivity:",
- "color_strip.audio.sensitivity.hint": "Gain multiplier for audio levels. Higher values make LEDs react to quieter sounds.",
- "color_strip.audio.smoothing": "Smoothing:",
- "color_strip.audio.smoothing.hint": "Temporal smoothing between frames. Higher values produce smoother but slower-reacting visuals.",
- "color_strip.audio.palette": "Palette:",
- "color_strip.audio.palette.hint": "Color palette used for spectrum bars or beat pulse coloring.",
- "color_strip.audio.color": "Base Color:",
- "color_strip.audio.color.hint": "Low-level color for VU meter bar.",
- "color_strip.audio.color_peak": "Peak Color:",
- "color_strip.audio.color_peak.hint": "High-level color at the top of the VU meter bar.",
- "color_strip.audio.mirror": "Mirror:",
- "color_strip.audio.mirror.hint": "Mirror spectrum from center outward: bass in the middle, treble at the edges.",
- "color_strip.effect.type": "Effect Type:",
- "color_strip.effect.type.hint": "Choose the procedural algorithm.",
- "color_strip.effect.fire": "Fire",
- "color_strip.effect.fire.desc": "Cellular automaton simulating rising flames with heat diffusion",
- "color_strip.effect.meteor": "Meteor",
- "color_strip.effect.meteor.desc": "Bright head travels along the strip with an exponential-decay tail",
- "color_strip.effect.plasma": "Plasma",
- "color_strip.effect.plasma.desc": "Overlapping sine waves mapped to a palette — classic demo-scene effect",
- "color_strip.effect.noise": "Noise",
- "color_strip.effect.noise.desc": "Scrolling fractal value noise mapped to a palette",
- "color_strip.effect.aurora": "Aurora",
- "color_strip.effect.aurora.desc": "Layered noise bands that drift and blend — northern lights style",
- "color_strip.effect.rain": "Rain",
- "color_strip.effect.rain.desc": "Raindrops fall down the strip with trailing tails",
- "color_strip.effect.comet": "Comet",
- "color_strip.effect.comet.desc": "Multiple comets with curved, pulsing tails",
- "color_strip.effect.bouncing_ball": "Bouncing Ball",
- "color_strip.effect.bouncing_ball.desc": "Physics-simulated balls bouncing with gravity",
- "color_strip.effect.fireworks": "Fireworks",
- "color_strip.effect.fireworks.desc": "Rockets launch and explode into colorful bursts",
- "color_strip.effect.sparkle_rain": "Sparkle Rain",
- "color_strip.effect.sparkle_rain.desc": "Twinkling star field with smooth fade-in/fade-out",
- "color_strip.effect.lava_lamp": "Lava Lamp",
- "color_strip.effect.lava_lamp.desc": "Slow-moving colored blobs that merge and separate",
- "color_strip.effect.wave_interference": "Wave Interference",
- "color_strip.effect.wave_interference.desc": "Two counter-propagating waves creating interference patterns",
- "color_strip.effect.custom_palette": "Custom Palette:",
- "color_strip.effect.custom_palette.hint": "JSON array of [position, R, G, B] stops, e.g. [[0,0,0,0],[0.5,255,0,0],[1,255,255,0]]",
- "color_strip.effect.speed": "Speed:",
- "color_strip.effect.speed.hint": "Speed multiplier for the effect animation (0.1 = very slow, 10.0 = very fast).",
- "color_strip.effect.palette": "Palette:",
- "color_strip.effect.palette.hint": "Color palette used to map effect values to RGB colors.",
- "color_strip.effect.color": "Meteor Color:",
- "color_strip.effect.color.hint": "Head color for the meteor effect.",
- "color_strip.effect.intensity": "Intensity:",
- "color_strip.effect.intensity.hint": "Effect intensity — controls spark rate (fire), tail decay (meteor), or brightness range (aurora).",
- "color_strip.effect.scale": "Scale:",
- "color_strip.effect.scale.hint": "Spatial scale — wave frequency (plasma), zoom level (noise), or band width (aurora).",
- "color_strip.effect.mirror": "Mirror:",
- "color_strip.effect.mirror.hint": "Bounce mode — the meteor reverses direction at strip ends instead of wrapping.",
- "color_strip.palette.fire": "Fire",
- "color_strip.palette.ocean": "Ocean",
- "color_strip.palette.lava": "Lava",
- "color_strip.palette.forest": "Forest",
- "color_strip.palette.rainbow": "Rainbow",
- "color_strip.palette.aurora": "Aurora",
- "color_strip.palette.sunset": "Sunset",
- "color_strip.palette.ice": "Ice",
- "color_strip.palette.custom": "Custom",
- "audio_source.title": "Audio Sources",
- "audio_source.add": "Add Audio Source",
- "audio_source.add.capture": "Add Capture Source",
- "audio_source.add.processed": "Add Processed Source",
- "audio_source.edit": "Edit Audio Source",
- "audio_source.edit.capture": "Edit Capture Source",
- "audio_source.edit.processed": "Edit Processed Source",
- "audio_source.name": "Name:",
- "audio_source.name.placeholder": "System Audio",
- "audio_source.name.hint": "A descriptive name for this audio source",
- "audio_source.type": "Type:",
- "audio_source.type.hint": "Capture wraps a physical audio device. Processed applies audio processing filters to another source.",
- "audio_source.type.capture": "Capture",
- "audio_source.type.processed": "Processed",
- "audio_source.device": "Audio Device:",
- "audio_source.device.hint": "Audio input source. Loopback devices capture system audio output; input devices capture microphone or line-in.",
- "audio_source.refresh_devices": "Refresh devices",
- "audio_source.parent": "Input Audio Source:",
- "audio_source.parent.hint": "Audio source to apply processing filters to",
- "audio_source.processing_template": "Processing Template:",
- "audio_source.processing_template.hint": "Audio processing template with filters to apply to the input source",
- "audio_source.description": "Description (optional):",
- "audio_source.description.placeholder": "Describe this audio source...",
- "audio_source.description.hint": "Optional notes about this audio source",
- "audio_source.created": "Audio source created",
- "audio_source.updated": "Audio source updated",
- "audio_source.deleted": "Audio source deleted",
- "audio_source.delete.confirm": "Are you sure you want to delete this audio source?",
- "audio_source.error.name_required": "Please enter a name",
- "audio_source.audio_template": "Audio Template:",
- "audio_source.audio_template.hint": "Audio capture template that defines which engine and settings to use for this device",
- "audio_source.test": "Test",
- "audio_source.test.title": "Test Audio Source",
- "audio_source.test.rms": "RMS",
- "audio_source.test.peak": "Peak",
- "audio_source.test.beat": "Beat",
- "audio_source.test.connecting": "Connecting...",
- "audio_source.test.error": "Audio test failed",
- "audio_template.test": "Test",
- "audio_template.test.title": "Test Audio Template",
- "audio_template.test.device": "Audio Device:",
- "audio_template.test.device.hint": "Select which audio device to capture from during the test",
- "audio_template.test.run": "Run",
- "audio_template.title": "Audio Templates",
- "audio_template.add": "Add Audio Template",
- "audio_template.edit": "Edit Audio Template",
- "audio_template.name": "Template Name:",
- "audio_template.name.placeholder": "My Audio Template",
- "audio_template.description.label": "Description (optional):",
- "audio_template.description.placeholder": "Describe this template...",
- "audio_template.engine": "Audio Engine:",
- "audio_template.engine.hint": "Select the audio capture backend to use. WASAPI is Windows-only with loopback support. Sounddevice is cross-platform.",
- "audio_template.engine.unavailable": "Unavailable",
- "audio_template.engine.unavailable.hint": "This engine is not available on your system",
- "audio_template.config": "Configuration",
- "audio_template.config.show": "Show configuration",
- "audio_template.created": "Audio template created",
- "audio_template.updated": "Audio template updated",
- "audio_template.deleted": "Audio template deleted",
- "audio_template.delete.confirm": "Are you sure you want to delete this audio template?",
- "audio_template.error.load": "Failed to load audio templates",
- "audio_template.error.engines": "Failed to load audio engines",
- "audio_template.error.required": "Please fill in all required fields",
- "audio_template.error.delete": "Failed to delete audio template",
- "audio_template.error.save_failed": "Failed to save audio template",
- "audio_template.error.load_failed": "Failed to load audio template",
- "streams.group.value": "Value Sources",
- "streams.group.sync": "Sync Clocks",
- "streams.group.gradients": "Gradients",
- "gradient.group.title": "Gradients",
- "gradient.add": "Add Gradient",
- "gradient.edit": "Edit Gradient",
- "gradient.builtin": "Built-in",
- "gradient.stops_label": "stops",
- "gradient.name": "Name:",
- "gradient.name.hint": "A descriptive name for this gradient.",
- "gradient.description": "Description:",
- "gradient.description.hint": "Optional description for this gradient.",
- "gradient.created": "Gradient created",
- "gradient.updated": "Gradient updated",
- "gradient.cloned": "Gradient cloned",
- "gradient.deleted": "Gradient deleted",
- "gradient.error.name_required": "Name is required",
- "gradient.error.min_stops": "At least 2 color stops are required",
- "gradient.error.delete_failed": "Failed to delete gradient",
- "gradient.error.save_failed": "Failed to save gradient",
- "gradient.create_name": "New gradient name:",
- "gradient.edit_name": "Rename gradient:",
- "gradient.confirm_delete": "Delete gradient \"{name}\"?",
- "section.empty.gradients": "No gradients yet",
- "tree.group.picture": "Picture Source",
- "tree.group.capture": "Screen Capture",
- "tree.group.static": "Static",
- "tree.group.processing": "Processed",
- "tree.group.strip": "Color Strip",
- "tree.group.audio": "Audio",
- "tree.group.audio_capture": "Capture",
- "tree.group.audio_processed": "Processed",
- "tree.group.integrations": "Integrations",
- "tree.group.utility": "Utility",
- "tree.leaf.sources": "Sources",
- "tree.leaf.engine_templates": "Engine Templates",
- "tree.leaf.images": "Images",
- "tree.leaf.video": "Video",
- "tree.leaf.filter_templates": "Filter Templates",
- "tree.leaf.processing_templates": "Processing Templates",
- "tree.leaf.templates": "Templates",
- "value_source.group.title": "Value Sources",
- "value_source.select_type": "Select Value Source Type",
- "value_source.add": "Add Value Source",
- "value_source.edit": "Edit Value Source",
- "value_source.name": "Name:",
- "value_source.name.placeholder": "Brightness Pulse",
- "value_source.name.hint": "A descriptive name for this value source",
- "value_source.type": "Type:",
- "value_source.type.hint": "Static outputs a constant value. Animated cycles through a waveform. Audio reacts to sound input. Adaptive types adjust brightness automatically based on time of day or scene content.",
- "value_source.type.static": "Static",
- "value_source.type.static.desc": "Constant output value",
- "value_source.type.animated": "Animated",
- "value_source.type.animated.desc": "Cycles through a waveform",
- "value_source.type.audio": "Audio",
- "value_source.type.audio.desc": "Reacts to sound input",
- "value_source.type.adaptive_time": "Adaptive (Time)",
- "value_source.type.adaptive_time.desc": "Adjusts by time of day",
- "value_source.type.adaptive_scene": "Adaptive (Scene)",
- "value_source.type.adaptive_scene.desc": "Adjusts by scene content",
- "value_source.type.daylight": "Daylight Cycle",
- "value_source.type.daylight.desc": "Value follows day/night cycle",
- "value_source.type.static_color": "Static Color",
- "value_source.type.static_color.desc": "Fixed RGB color",
- "value_source.type.animated_color": "Animated Color",
- "value_source.type.animated_color.desc": "Cycles through colors",
- "value_source.type.adaptive_time_color": "Time Color",
- "value_source.type.adaptive_time_color.desc": "24-hour color schedule",
- "value_source.type.ha_entity": "HA Entity",
- "value_source.type.ha_entity.desc": "Reads value from a Home Assistant sensor",
- "value_source.type.gradient_map": "Gradient Map",
- "value_source.type.gradient_map.desc": "Maps numeric value through a color gradient",
- "value_source.type.css_extract": "Strip Extract",
- "value_source.type.css_extract.desc": "Extracts color from a color strip source",
- "value_source.type.system_metrics": "System Metrics",
- "value_source.type.system_metrics.desc": "Monitor CPU, GPU, RAM, disk, network, battery, or fan speed",
- "value_source.metric": "Metric:",
- "value_source.metric.hint": "System metric to monitor. Some metrics may be unavailable depending on hardware.",
- "value_source.metric.cpu_load": "CPU Load",
- "value_source.metric.cpu_temp": "CPU Temperature",
- "value_source.metric.gpu_load": "GPU Load",
- "value_source.metric.gpu_temp": "GPU Temperature",
- "value_source.metric.ram_usage": "RAM Usage",
- "value_source.metric.disk_usage": "Disk Usage",
- "value_source.metric.network_rx": "Network RX",
- "value_source.metric.network_tx": "Network TX",
- "value_source.metric.battery_level": "Battery Level",
- "value_source.metric.fan_speed": "Fan Speed",
- "value_source.sysmetric.min": "Min Value:",
- "value_source.sysmetric.max": "Max Value:",
- "value_source.max_rate": "Max Rate (bytes/sec):",
- "value_source.max_rate.hint": "Maximum expected network rate in bytes/sec. 125000000 = 1 Gbps.",
- "value_source.disk_path": "Disk Path:",
- "value_source.disk_path.hint": "Disk mount point or drive letter (e.g. / or C:\\)",
- "value_source.sensor_label": "Sensor Label:",
- "value_source.sensor_label.hint": "Optional sensor name to pick a specific sensor (empty = first available)",
- "value_source.poll_interval": "Poll Interval:",
- "value_source.poll_interval.hint": "Seconds between metric reads",
- "value_source.gradient_map.input": "Input Value Source",
- "value_source.gradient_map.gradient": "Gradient",
- "value_source.css_extract.source": "Color Strip Source",
- "value_source.ha_source": "HA Connection:",
- "value_source.ha_source.hint": "Home Assistant connection to read entities from",
- "value_source.entity_id": "Entity:",
- "value_source.entity_id.hint": "HA entity ID (e.g. sensor.temperature)",
- "value_source.attribute": "Attribute (optional):",
- "value_source.attribute.hint": "Read a specific attribute instead of the entity state",
- "value_source.min_ha_value": "Min HA Value:",
- "value_source.min_ha_value.hint": "Raw HA value that maps to 0% output",
- "value_source.max_ha_value": "Max HA Value:",
- "value_source.max_ha_value.hint": "Raw HA value that maps to 100% output",
- "value_source.input_source": "Input Value Source:",
- "value_source.input_source.hint": "Float value source (0-1) to map through the gradient",
- "value_source.gradient_stops": "Gradient:",
- "value_source.gradient_stops.hint": "Color stops for the gradient. Position 0 = input value 0, position 1 = input value 1",
- "value_source.easing": "Interpolation:",
- "value_source.easing.hint": "How colors blend between stops",
- "value_source.css_source": "Color Strip Source:",
- "value_source.css_source.hint": "Color strip source to extract color from",
- "value_source.led_start": "LED Start:",
- "value_source.led_start.hint": "First LED in the range (0-based)",
- "value_source.led_end": "LED End:",
- "value_source.led_end.hint": "Last LED in the range (-1 = whole strip)",
- "value_source.filter.all": "All",
- "value_source.filter.float": "Numeric",
- "value_source.filter.color": "Color",
- "value_source.static_color.color": "Color:",
- "value_source.animated_color.colors": "Colors:",
- "value_source.animated_color.speed": "Speed (cpm):",
- "value_source.animated_color.easing": "Easing:",
- "value_source.animated_color.easing.linear": "Linear",
- "value_source.animated_color.easing.linear.desc": "Constant rate blend between colors",
- "value_source.animated_color.easing.step": "Step",
- "value_source.animated_color.easing.step.desc": "Instant jump between colors",
- "value_source.animated_color.easing.ease_in": "Ease In",
- "value_source.animated_color.easing.ease_in.desc": "Slow start, accelerating into the next color",
- "value_source.animated_color.easing.ease_out": "Ease Out",
- "value_source.animated_color.easing.ease_out.desc": "Quick start, settling into the next color",
- "value_source.animated_color.easing.ease_in_out": "Ease In Out",
- "value_source.animated_color.easing.ease_in_out.desc": "Smooth at both ends, faster in the middle",
- "value_source.animated_color.easing.sine": "Sine",
- "value_source.animated_color.easing.sine.desc": "Sinusoidal curve — natural ambient cycling",
- "value_source.animated_color.color_count": "colors",
- "value_source.animated_color.clock": "Animation Clock:",
- "value_source.animated_color.clock.hint": "Optional sync clock — when set, the clock controls timing (its speed multiplier scales the cpm above) and pause state. Leave empty to run on the value source's own speed.",
- "value_source.adaptive_time_color.schedule": "Color Schedule:",
- "value_source.daylight.speed": "Speed:",
- "value_source.daylight.speed.hint": "Cycle speed multiplier. 1.0 = full day/night cycle in ~4 minutes. Higher values cycle faster.",
- "value_source.daylight.use_real_time": "Use Real Time:",
- "value_source.daylight.use_real_time.hint": "When enabled, the value follows the actual time of day. Speed is ignored.",
- "value_source.normalize": "Normalize to 0–1:",
- "value_source.normalize.hint": "On: rescale the raw value to 0–1 using Min/Max. Off: the value is clamped to 0–1 as-is (for sources that already report a 0–1 fraction). The raw value stays available to templates (raw[name]) and automations.",
- "value_source.daylight.enable_real_time": "Follow wall clock",
- "value_source.daylight.latitude": "Latitude:",
- "value_source.daylight.latitude.hint": "Your geographic latitude (-90 to 90). Steepens or flattens the sunrise/sunset edges of the cycle.",
- "value_source.daylight.longitude": "Longitude:",
- "value_source.daylight.longitude.hint": "Your geographic longitude (-180 to 180). Shifts solar noon for accurate sunrise/sunset alignment with your wall clock.",
- "value_source.daylight.real_time": "Real-time",
- "value_source.daylight.speed_label": "Speed",
- "value_source.value": "Value:",
- "value_source.value.hint": "Constant output value (0.0 = off, 1.0 = full brightness)",
- "value_source.waveform": "Waveform:",
- "value_source.waveform.hint": "Shape of the brightness animation cycle",
- "value_source.waveform.sine": "Sine",
- "value_source.waveform.triangle": "Triangle",
- "value_source.waveform.square": "Square",
- "value_source.waveform.sawtooth": "Sawtooth",
- "value_source.speed": "Speed (cpm):",
- "value_source.speed.hint": "Cycles per minute — how fast the waveform repeats (1 = very slow, 120 = very fast)",
- "value_source.min_value": "Min Value:",
- "value_source.min_value.hint": "Minimum output of the waveform cycle",
- "value_source.max_value": "Max Value:",
- "value_source.max_value.hint": "Maximum output of the waveform cycle",
- "value_source.audio_source": "Audio Source:",
- "value_source.audio_source.hint": "Audio source to read audio levels from",
- "value_source.mode": "Mode:",
- "value_source.mode.hint": "RMS measures average volume. Peak tracks loudest moments. Beat triggers on rhythm.",
- "value_source.mode.rms": "RMS (Volume)",
- "value_source.mode.peak": "Peak",
- "value_source.mode.beat": "Beat",
- "value_source.mode.rms.desc": "Average volume level",
- "value_source.mode.peak.desc": "Loudest moment tracking",
- "value_source.mode.beat.desc": "Rhythm pulse detection",
- "value_source.auto_gain": "Auto Gain:",
- "value_source.auto_gain.hint": "Automatically normalize audio levels so output uses the full range, regardless of input volume",
- "value_source.auto_gain.enable": "Enable auto-gain",
- "value_source.sensitivity": "Sensitivity:",
- "value_source.sensitivity.hint": "Gain multiplier for the audio signal (higher = more reactive)",
- "value_source.scene_sensitivity.hint": "Gain multiplier for the luminance signal (higher = more reactive to brightness changes)",
- "value_source.smoothing": "Smoothing:",
- "value_source.smoothing.hint": "Temporal smoothing (0 = instant response, 1 = very smooth/slow)",
- "value_source.audio_min_value": "Min Value:",
- "value_source.audio_min_value.hint": "Output when audio is silent (e.g. 0.3 = 30% brightness floor)",
- "value_source.audio_max_value": "Max Value:",
- "value_source.audio_max_value.hint": "Output at maximum audio level",
- "value_source.schedule": "Schedule:",
- "value_source.schedule.hint": "Define at least 2 time points. Brightness interpolates linearly between them, wrapping at midnight.",
- "value_source.schedule.add": "+ Add Point",
- "value_source.schedule.points": "points",
- "value_source.picture_source": "Picture Source:",
- "value_source.picture_source.hint": "The picture source whose frames will be analyzed for average brightness.",
- "value_source.scene_behavior": "Behavior:",
- "value_source.scene_behavior.hint": "Complement: dark scene = high brightness (ideal for ambient backlight). Match: bright scene = high brightness.",
- "value_source.scene_behavior.complement": "Complement (dark → bright)",
- "value_source.scene_behavior.match": "Match (bright → bright)",
- "value_source.adaptive_min_value": "Min Value:",
- "value_source.adaptive_min_value.hint": "Minimum output brightness",
- "value_source.adaptive_max_value": "Max Value:",
- "value_source.adaptive_max_value.hint": "Maximum output brightness",
- "value_source.error.schedule_min": "Schedule requires at least 2 time points",
- "value_source.description": "Description (optional):",
- "value_source.description.placeholder": "Describe this value source...",
- "value_source.description.hint": "Optional notes about this value source",
- "value_source.created": "Value source created",
- "value_source.updated": "Value source updated",
- "value_source.deleted": "Value source deleted",
- "value_source.delete.confirm": "Are you sure you want to delete this value source?",
- "value_source.error.name_required": "Please enter a name",
- "value_source.test": "Test",
- "value_source.test.title": "Test Value Source",
- "value_source.test.connecting": "Connecting...",
- "value_source.test.error": "Failed to connect",
- "value_source.test.current": "Current",
- "value_source.test.min": "Min",
- "value_source.test.max": "Max",
- "test.frames": "Frames",
- "test.fps": "FPS",
- "test.avg_capture": "Avg",
- "targets.brightness": "Brightness:",
- "targets.brightness.hint": "Output brightness multiplier (0–1). Can be bound to a value source for dynamic control.",
- "targets.brightness_vs": "Brightness Source:",
- "targets.brightness_vs.hint": "Optional value source that dynamically controls brightness each frame (overrides device brightness)",
- "targets.brightness_vs.none": "None (device brightness)",
- "targets.min_brightness_threshold": "Min Brightness Threshold:",
- "targets.min_brightness_threshold.hint": "Effective output brightness (pixel brightness × device/source brightness) below this value turns LEDs off completely (0 = disabled)",
- "targets.adaptive_fps": "Adaptive FPS:",
- "targets.adaptive_fps.hint": "Automatically reduce send rate when the device becomes unresponsive, and gradually recover when it stabilizes. Recommended for WiFi devices with weak signal.",
- "targets.protocol": "Protocol:",
- "targets.protocol.hint": "DDP sends pixels via fast UDP (recommended for most setups). HTTP uses the JSON API — slower but reliable, limited to ~500 LEDs.",
- "targets.power_limit": "Max current (ABL):",
- "targets.power_limit.hint": "Caps the strip's estimated current draw to your power-supply budget to prevent brownouts (voltage sag, color shift, flicker) on bright/white scenes. Set it to your PSU's rated current, leaving some headroom. 0 = unlimited.",
- "targets.power_limit.ma_suffix": "mA (0 = unlimited)",
- "targets.power_limit.per_led": "mA per LED (full white):",
- "targets.protocol.ddp": "DDP (UDP)",
- "targets.protocol.ddp.desc": "Fast raw UDP packets — recommended",
- "targets.protocol.udp": "WLED UDP (realtime)",
- "targets.protocol.udp.desc": "WLED native realtime — RGBW whites + auto-revert if the stream drops",
- "targets.protocol.http": "HTTP",
- "targets.protocol.http.desc": "JSON API — slower, ≤500 LEDs",
- "targets.protocol.serial": "Serial",
- "search.open": "Search (Ctrl+K)",
- "search.placeholder": "Search entities... (Ctrl+K)",
- "search.loading": "Loading...",
- "search.no_results": "No results found",
- "search.group.devices": "Devices",
- "search.group.targets": "LED Targets",
- "search.group.kc_targets": "Key Colors Targets",
- "search.group.css": "Color Strip Sources",
- "search.group.automations": "Automations",
- "search.group.streams": "Picture Streams",
- "search.group.capture_templates": "Capture Templates",
- "search.group.pp_templates": "Post-Processing Templates",
- "search.group.pattern_templates": "Pattern Templates",
- "search.group.audio": "Audio Sources",
- "search.group.value": "Value Sources",
- "search.group.scenes": "Scene Presets",
- "search.group.cspt": "Strip Processing Templates",
- "search.group.sync_clocks": "Sync Clocks",
- "search.group.actions": "Actions",
- "search.action.start": "Start",
- "search.action.stop": "Stop",
- "search.action.activate": "Activate",
- "search.action.enable": "Enable",
- "search.action.disable": "Disable",
- "settings.backup.label": "Backup Configuration",
- "settings.backup.hint": "Download all configuration (devices, targets, streams, templates, automations) as a single JSON file.",
- "settings.backup.button": "Download",
- "settings.backup.success": "Backup downloaded successfully",
- "settings.backup.error": "Backup download failed",
- "settings.restore.label": "Restore Configuration",
- "settings.restore.hint": "Upload a previously downloaded backup file to replace all configuration. The server will restart automatically.",
- "settings.restore.button": "Restore",
- "settings.restore.confirm": "This will replace ALL configuration and restart the server. Are you sure?",
- "settings.restore.success": "Configuration restored",
- "settings.restore.error": "Restore failed",
- "settings.restore.restarting": "Server is restarting...",
- "settings.restore.restart_timeout": "Server did not respond. Please refresh the page manually.",
- "settings.restart_server": "Restart Server",
- "settings.restart_confirm": "Restart the server? Active targets will be stopped.",
- "settings.restarting": "Restarting server...",
- "settings.button.close": "Close",
- "settings.log_level.label": "Log Level",
- "settings.log_level.hint": "Change the server log verbosity at runtime. DEBUG shows the most detail; CRITICAL shows only fatal errors.",
- "settings.log_level.save": "Apply",
- "settings.log_level.saved": "Log level changed",
- "settings.log_level.save_error": "Failed to change log level",
- "settings.log_level.desc.debug": "Verbose developer output",
- "settings.log_level.desc.info": "Normal operation messages",
- "settings.log_level.desc.warning": "Potential problems",
- "settings.log_level.desc.error": "Failures only",
- "settings.log_level.desc.critical": "Fatal errors only",
- "settings.shutdown_action.label": "Shutdown action",
- "settings.shutdown_action.hint": "What happens to LED targets when the server shuts down. \"Stop targets\" runs the normal stop sequence so devices with auto-restore restore their prior state. \"Nothing\" leaves the lights showing the last frame.",
- "settings.shutdown_action.saved": "Shutdown action saved",
- "settings.shutdown_action.save_error": "Failed to save shutdown action",
- "settings.shutdown_action.opt.stop": "Stop targets",
- "settings.shutdown_action.opt.stop_desc": "Run the normal stop sequence (per-device auto-restore applies)",
- "settings.shutdown_action.opt.nothing": "Nothing",
- "settings.shutdown_action.opt.nothing_desc": "Leave lights showing the last frame",
- "settings.daylight_timezone.label": "Daylight timezone",
- "settings.daylight_timezone.hint": "IANA timezone every \"real-time\" daylight cycle reads its wall clock in. Empty (default) uses the server's system timezone.",
- "settings.daylight_timezone.saved": "Daylight timezone saved",
- "settings.daylight_timezone.save_error": "Failed to save daylight timezone",
- "common.daylight_tz.system": "System default",
- "common.daylight_tz.system_desc": "Server clock — no override",
- "common.daylight_tz.detected": "Browser-detected",
- "common.daylight_tz.detected_label": "Auto-detected",
- "common.daylight_tz.search": "Search timezones, cities, regions…",
- "common.daylight_tz.region.utc": "Universal",
- "common.daylight_tz.region.europe": "Europe",
- "common.daylight_tz.region.africa": "Africa",
- "common.daylight_tz.region.me": "Middle East",
- "common.daylight_tz.region.asia": "Asia",
- "common.daylight_tz.region.pacific": "Pacific",
- "common.daylight_tz.region.americas": "Americas",
- "settings.auto_backup.label": "Auto-Backup",
- "settings.auto_backup.hint": "Automatically create periodic backups of all configuration. Old backups are pruned when the maximum count is reached.",
- "settings.auto_backup.enable": "Enable auto-backup",
- "settings.auto_backup.interval_label": "Interval",
- "settings.auto_backup.max_label": "Max backups",
- "settings.auto_backup.save": "Save Settings",
- "settings.auto_backup.saved": "Auto-backup settings saved",
- "settings.auto_backup.save_error": "Failed to save auto-backup settings",
- "settings.auto_backup.backup_now": "Backup Now",
- "settings.auto_backup.backup_created": "Backup created",
- "settings.auto_backup.backup_error": "Backup failed",
- "settings.auto_backup.last_backup": "Last backup",
- "settings.auto_backup.never": "Never",
- "settings.saved_backups.label": "Saved Backups",
- "settings.saved_backups.hint": "Auto-backup files stored on the server. Download to save locally, or delete to free space.",
- "settings.saved_backups.empty": "No saved backups",
- "settings.saved_backups.restore": "Restore",
- "settings.saved_backups.download": "Download",
- "settings.saved_backups.delete": "Delete",
- "settings.saved_backups.delete_confirm": "Delete this backup file?",
- "settings.saved_backups.delete_error": "Failed to delete backup",
- "settings.saved_backups.type.auto": "auto",
- "settings.saved_backups.type.manual": "manual",
- "settings.mqtt.label": "MQTT",
- "settings.mqtt.hint": "Configure MQTT broker connection for automation conditions and triggers.",
- "settings.mqtt.enabled": "Enable MQTT",
- "settings.mqtt.host_label": "Broker Host",
- "settings.mqtt.port_label": "Port",
- "settings.mqtt.username_label": "Username",
- "settings.mqtt.password_label": "Password",
- "settings.mqtt.password_set_hint": "Password is set — leave blank to keep",
- "settings.mqtt.client_id_label": "Client ID",
- "settings.mqtt.base_topic_label": "Base Topic",
- "settings.mqtt.save": "Save MQTT Settings",
- "settings.mqtt.saved": "MQTT settings saved",
- "settings.mqtt.save_error": "Failed to save MQTT settings",
- "settings.mqtt.error_host_required": "Broker host is required",
- "settings.logs.label": "Server Logs",
- "settings.logs.hint": "Stream live server log output. Use the filter to show only relevant log levels.",
- "settings.logs.connect": "Connect",
- "settings.logs.disconnect": "Disconnect",
- "settings.logs.clear": "Clear",
- "settings.logs.error": "Log viewer connection failed",
- "settings.logs.filter.all": "All levels",
- "settings.logs.filter.info": "Info+",
- "settings.logs.filter.warning": "Warning+",
- "settings.logs.filter.error": "Error only",
- "settings.logs.filter.all_desc": "Show all log messages",
- "settings.logs.filter.info_desc": "Info, warning, and errors",
- "settings.logs.filter.warning_desc": "Warnings and errors only",
- "settings.logs.filter.error_desc": "Errors only",
- "settings.logs.stat.lines": "LINES",
- "settings.logs.stat.warn": "WARN",
- "settings.logs.stat.err": "ERR",
- "settings.logs.patch.idle": "STANDBY",
- "settings.logs.patch.connecting": "CONNECTING",
- "settings.logs.patch.live": "STREAMING",
- "settings.logs.patch.error": "OFFLINE",
- "settings.logs.empty.title": "Awaiting log frames",
- "settings.logs.empty.sub": "Connect the WebSocket stream to begin tailing.",
- "device.error.power_off_failed": "Failed to turn off device",
- "device.error.remove_failed": "Failed to remove device",
- "device.error.settings_load_failed": "Failed to load device settings",
- "device.error.brightness": "Failed to update brightness",
- "device.error.required": "Please fill in all fields correctly",
- "device.error.update": "Failed to update device",
- "device.error.save": "Failed to save settings",
- "device.error.clone_failed": "Failed to clone device",
- "device.error.load_failed": "Failed to load device",
- "device_discovery.error.fill_all_fields": "Please fill in all fields",
- "device_discovery.added": "Device added successfully",
- "device_discovery.error.add_failed": "Failed to add device",
- "calibration.error.load_failed": "Failed to load calibration",
- "calibration.error.css_load_failed": "Failed to load color strip source",
- "calibration.error.test_toggle_failed": "Failed to toggle test edge",
- "calibration.error.save_failed": "Failed to save calibration",
- "calibration.error.led_count_mismatch": "Total LEDs must equal the device LED count",
- "calibration.error.led_count_exceeded": "Calibrated LEDs exceed the total LED count",
- "calibration.mode.simple": "Simple",
- "calibration.mode.advanced": "Advanced",
- "calibration.switch_to_advanced": "Switch to Advanced",
- "calibration.advanced.title": "Advanced Calibration",
- "calibration.advanced.switch_to_simple": "Switch to Simple",
- "calibration.advanced.lines_title": "Lines",
- "calibration.advanced.canvas_hint": "Drag monitors to reposition. Click edges to select lines. Scroll to zoom, drag empty space to pan.",
- "calibration.advanced.reset_view": "Reset view",
- "calibration.advanced.line_properties": "Line Properties",
- "calibration.advanced.picture_source": "Source:",
- "calibration.advanced.picture_source.hint": "The picture source (monitor) this line samples from",
- "calibration.advanced.edge": "Edge:",
- "calibration.advanced.edge.hint": "Which screen edge to sample pixels from",
- "calibration.advanced.led_count": "LEDs:",
- "calibration.advanced.led_count.hint": "Number of LEDs mapped to this line",
- "calibration.advanced.span_start": "Span Start:",
- "calibration.advanced.span_start.hint": "Where sampling begins along the edge (0 = start, 1 = end). Use to cover only part of an edge.",
- "calibration.advanced.span_end": "Span End:",
- "calibration.advanced.span_end.hint": "Where sampling ends along the edge (0 = start, 1 = end). Together with Span Start, defines the active portion.",
- "calibration.advanced.border_width": "Depth (px):",
- "calibration.advanced.border_width.hint": "How many pixels deep from the edge to sample. Larger values capture more of the screen interior.",
- "calibration.advanced.reverse": "Reverse",
- "calibration.advanced.no_lines_warning": "Add at least one line",
- "dashboard.error.automation_toggle_failed": "Failed to toggle automation",
- "dashboard.error.start_failed": "Failed to start processing",
- "dashboard.error.stop_failed": "Failed to stop processing",
- "dashboard.error.stop_all": "Failed to stop all targets",
- "target.error.editor_open_failed": "Failed to open target editor",
- "target.error.start_failed": "Failed to start target",
- "target.error.stop_failed": "Failed to stop target",
- "target.error.clone_failed": "Failed to clone target",
- "target.error.delete_failed": "Failed to delete target",
- "target.error.load_failed": "Failed to load 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",
- "pattern.error.save_failed": "Failed to save pattern template",
- "stream.error.clone_picture_failed": "Failed to clone picture source",
- "stream.error.clone_capture_failed": "Failed to clone capture template",
- "stream.error.clone_pp_failed": "Failed to clone postprocessing template",
- "theme.switched.dark": "Switched to dark theme",
- "theme.switched.light": "Switched to light theme",
- "theme.switched.system": "Switched to system theme",
- "accent.color.updated": "Accent color updated",
- "search.footer": "↑↓ navigate · Enter select · Esc close",
- "sync_clock.group.title": "Sync Clocks",
- "sync_clock.add": "Add Sync Clock",
- "sync_clock.edit": "Edit Sync Clock",
- "sync_clock.name": "Name:",
- "sync_clock.name.placeholder": "Main Animation Clock",
- "sync_clock.name.hint": "A descriptive name for this synchronization clock",
- "sync_clock.speed": "Speed:",
- "sync_clock.speed.hint": "Animation speed multiplier for all linked sources. 1.0 = normal, 2.0 = double speed, 0.5 = half speed.",
- "sync_clock.description": "Description (optional):",
- "sync_clock.description.placeholder": "Optional description",
- "sync_clock.description.hint": "Optional notes about this clock's purpose",
- "sync_clock.status.running": "Running",
- "sync_clock.status.paused": "Paused",
- "sync_clock.action.pause": "Pause",
- "sync_clock.action.resume": "Resume",
- "sync_clock.action.reset": "Reset",
- "sync_clock.error.name_required": "Clock name is required",
- "sync_clock.error.load": "Failed to load sync clock",
- "sync_clock.created": "Sync clock created",
- "sync_clock.updated": "Sync clock updated",
- "sync_clock.deleted": "Sync clock deleted",
- "sync_clock.paused": "Clock paused",
- "sync_clock.resumed": "Clock resumed",
- "sync_clock.reset_done": "Clock reset to zero",
- "sync_clock.delete.confirm": "Delete this sync clock? Linked sources will lose synchronization and run at default speed.",
- "sync_clock.elapsed": "Elapsed time",
- "weather_source.group.title": "Weather Sources",
- "weather_source.add": "Add Weather Source",
- "weather_source.edit": "Edit Weather Source",
- "weather_source.name": "Name:",
- "weather_source.name.placeholder": "My Weather",
- "weather_source.name.hint": "A descriptive name for this weather data source",
- "weather_source.provider": "Provider:",
- "weather_source.provider.hint": "Weather data provider. Open-Meteo is free and requires no API key.",
- "weather_source.provider.open_meteo.desc": "Free, no API key required",
- "weather_source.location": "Location:",
- "weather_source.location.hint": "Your geographic coordinates. Use the auto-detect button or enter manually.",
- "weather_source.latitude": "Lat:",
- "weather_source.longitude": "Lon:",
- "weather_source.use_my_location": "Use my location",
- "weather_source.update_interval": "Update Interval:",
- "weather_source.update_interval.hint": "How often to fetch weather data. Lower values give more responsive changes.",
- "weather_source.description": "Description (optional):",
- "weather_source.description.placeholder": "Optional description",
- "weather_source.test": "Test",
- "weather_source.error.name_required": "Weather source name is required",
- "weather_source.error.load": "Failed to load weather source",
- "weather_source.created": "Weather source created",
- "weather_source.updated": "Weather source updated",
- "weather_source.deleted": "Weather source deleted",
- "weather_source.delete.confirm": "Delete this weather source? Linked color strip sources will lose weather data.",
- "weather_source.geo.success": "Location detected",
- "weather_source.geo.error": "Geolocation failed",
- "weather_source.geo.not_supported": "Geolocation is not supported by your browser",
- "streams.group.weather": "Weather",
- "streams.group.home_assistant": "Home Assistant",
- "ha_source.group.title": "Home Assistant Sources",
- "ha_source.add": "Add Home Assistant Source",
- "ha_source.edit": "Edit Home Assistant Source",
- "ha_source.name": "Name:",
- "ha_source.name.placeholder": "My Home Assistant",
- "ha_source.name.hint": "A descriptive name for this Home Assistant connection",
- "ha_source.host": "Host:",
- "ha_source.host.hint": "Home Assistant host and port, e.g. 192.168.1.100:8123",
- "ha_source.token": "Access Token:",
- "ha_source.token.hint": "Long-Lived Access Token from HA (Profile > Security > Long-Lived Access Tokens)",
- "ha_source.token.edit_hint": "Leave blank to keep the current token",
- "ha_source.use_ssl": "Use SSL (wss://)",
- "ha_source.entity_filters": "Entity Filters (optional):",
- "ha_source.entity_filters.hint": "Comma-separated glob patterns, e.g. sensor.*, binary_sensor.front_door. Leave empty for all.",
- "ha_source.description": "Description (optional):",
- "ha_source.test": "Test Connection",
- "ha_source.test.success": "Connected",
- "ha_source.test.failed": "Connection failed",
- "ha_source.connected": "Connected",
- "ha_source.disconnected": "Disconnected",
- "ha_source.error.name_required": "Name is required",
- "ha_source.error.host_required": "Host is required",
- "ha_source.error.token_required": "Access token is required",
- "ha_source.error.load": "Failed to load Home Assistant source",
- "ha_source.created": "Home Assistant source created",
- "ha_source.updated": "Home Assistant source updated",
- "ha_source.deleted": "Home Assistant source deleted",
- "ha_source.delete.confirm": "Delete this Home Assistant connection?",
- "section.empty.ha_sources": "No Home Assistant sources yet. Click + to add one.",
- "streams.group.mqtt": "MQTT",
- "mqtt_source.group.title": "MQTT Sources",
- "mqtt_source.add": "Add MQTT Source",
- "mqtt_source.edit": "Edit MQTT Source",
- "mqtt_source.name": "Name:",
- "mqtt_source.name.placeholder": "My MQTT Broker",
- "mqtt_source.name.hint": "A descriptive name for this MQTT broker connection",
- "mqtt_source.broker_host": "Broker Host:",
- "mqtt_source.broker_host.hint": "MQTT broker hostname or IP address, e.g. 192.168.1.100",
- "mqtt_source.broker_port": "Port:",
- "mqtt_source.username": "Username (optional):",
- "mqtt_source.password": "Password (optional):",
- "mqtt_source.password.edit_hint": "Leave blank to keep the current password",
- "mqtt_source.client_id": "Client ID:",
- "mqtt_source.client_id.hint": "Unique MQTT client identifier. Change if running multiple instances.",
- "mqtt_source.base_topic": "Base Topic:",
- "mqtt_source.base_topic.hint": "Prefix for status and state topics, e.g. ledgrab/status",
- "mqtt_source.description": "Description (optional):",
- "mqtt_source.test": "Test Connection",
- "mqtt_source.test.success": "Connected to broker",
- "mqtt_source.test.failed": "Connection failed",
- "mqtt_source.connected": "Connected",
- "mqtt_source.disconnected": "Disconnected",
- "mqtt_source.error.name_required": "Name is required",
- "mqtt_source.error.host_required": "Broker host is required",
- "mqtt_source.error.load": "Failed to load MQTT source",
- "mqtt_source.created": "MQTT source created",
- "mqtt_source.updated": "MQTT source updated",
- "mqtt_source.deleted": "MQTT source deleted",
- "mqtt_source.delete.confirm": "Delete this MQTT broker connection?",
- "section.empty.mqtt_sources": "No MQTT sources yet. Click + to add one.",
- "ha_light.section.title": "Home Assistant",
- "ha_light.section.targets": "Light Targets",
- "ha_light.add": "Add HA Light Target",
- "ha_light.edit": "Edit HA Light Target",
- "ha_light.name": "Name:",
- "ha_light.name.placeholder": "Living Room Lights",
- "ha_light.ha_source": "HA Connection:",
- "ha_light.css_source": "Color Strip Source:",
- "ha_light.color_source": "Color Source:",
- "ha_light.color_source.hint": "Pick a Color Strip Source (per-light LED ranges) or a Color Value Source (one colour broadcast to every light).",
- "ha_light.color_source.css": "Color strip",
- "ha_light.color_source.color_vs": "Color value source",
- "ha_light.mappings.color_vs_hint": "All listed lights will receive the same colour from the selected Color Value Source.",
- "ha_light.update_rate": "Update Rate:",
- "ha_light.update_rate.hint": "How often to send color updates to HA lights (0.5-5.0 Hz). Lower values are safer for HA performance.",
- "ha_light.transition": "Transition:",
- "ha_light.transition.hint": "Smooth fade duration between colors (HA transition parameter).",
- "ha_light.color_tolerance": "Color Tolerance:",
- "ha_light.color_tolerance.hint": "Skip sending color updates when the RGB delta is below this threshold. Reduces HA traffic for near-static scenes.",
- "ha_light.min_brightness_threshold": "Min Brightness Threshold:",
- "ha_light.min_brightness_threshold.hint": "Effective output brightness below this value turns lights off completely (0 = disabled).",
- "ha_light.mappings": "Light Mappings:",
- "ha_light.mappings.hint": "Map LED ranges to HA light entities. Each mapping averages the LED segment to a single color.",
- "ha_light.mappings.add": "Add Mapping",
- "ha_light.mapping.entity_id": "Entity ID:",
- "ha_light.mapping.led_start": "LED Start:",
- "ha_light.mapping.led_end": "LED End (-1=last):",
- "ha_light.mapping.brightness": "Brightness Scale:",
- "ha_light.description": "Description (optional):",
- "ha_light.error.name_required": "Name is required",
- "ha_light.error.ha_source_required": "HA connection is required",
- "ha_light.error.color_source_required": "Color value source is required when broadcasting a single colour",
- "ha_light.created": "HA light target created",
- "ha_light.updated": "HA light target updated",
- "ha_light.mapping.select_entity": "Select a light entity...",
- "ha_light.mapping.unassigned": "— No entity selected",
- "ha_light.mapping.search_entity": "Search light entities...",
- "ha_light.stop_action": "On Stop:",
- "ha_light.stop_action.hint": "What to do with the mapped lights when this target stops streaming.",
- "ha_light.stop_action.none": "None",
- "ha_light.stop_action.none.desc": "Leave lights as-is",
- "ha_light.stop_action.turn_off": "Turn Off",
- "ha_light.stop_action.turn_off.desc": "Switch all mapped lights off",
- "ha_light.stop_action.restore": "Restore",
- "ha_light.stop_action.restore.desc": "Revert to state captured at start",
- "ha_light.button.turn_off": "Turn Off Lights",
- "ha_light.turn_off.success": "Lights turned off",
- "ha_light.turn_off.failed": "Failed to turn off lights",
- "confirm.turn_off_ha_light": "Turn off all mapped lights?",
- "ha_light.connection_tooltip": "HA Connection",
- "ha_light.connection_metric": "Home Assistant connection",
- "ha_light.lights.one": "{count} light",
- "ha_light.lights.other": "{count} lights",
- "section.empty.ha_light_targets": "No HA light targets yet. Click + to add one.",
- "z2m_light.section.title": "Zigbee2MQTT",
- "z2m_light.section.targets": "Z2M Light Targets",
- "z2m_light.add": "Add Z2M Light Target",
- "z2m_light.edit": "Edit Z2M Light Target",
- "z2m_light.name": "Name:",
- "z2m_light.name.placeholder": "Living Room Bulbs",
- "z2m_light.description": "Description (optional):",
- "z2m_light.mqtt_source": "MQTT Broker:",
- "z2m_light.mqtt_source.hint": "Pick the MQTT source (broker) that Zigbee2MQTT is connected to. Manage brokers under MQTT Sources.",
- "z2m_light.mqtt_source.none": "— Pick an MQTT broker",
- "z2m_light.base_topic": "Z2M Base Topic:",
- "z2m_light.base_topic.hint": "Override only if your Zigbee2MQTT instance uses a non-default mqtt.base_topic.",
- "z2m_light.color_source": "Color Source:",
- "z2m_light.color_source.hint": "Pick a Color Strip Source (per-bulb LED ranges) or a Color Value Source (one colour broadcast to every bulb).",
- "z2m_light.color_source.css": "Color strip",
- "z2m_light.color_source.color_vs": "Color value source",
- "z2m_light.update_rate": "Update Rate:",
- "z2m_light.update_rate.hint": "How often to publish colour updates to Z2M (0.5–10 Hz). Zigbee mesh tolerates ~5–10 Hz per bulb; higher values risk drops.",
- "z2m_light.transition": "Transition:",
- "z2m_light.transition.hint": "Smooth fade duration between colours, in seconds (Z2M transition parameter).",
- "z2m_light.brightness": "Brightness:",
- "z2m_light.color_tolerance": "Color Tolerance:",
- "z2m_light.color_tolerance.hint": "Skip publishes when the RGB delta is below this threshold. Reduces Zigbee mesh traffic for near-static scenes.",
- "z2m_light.min_brightness_threshold": "Min Brightness Threshold:",
- "z2m_light.min_brightness_threshold.hint": "Effective output brightness below this value turns bulbs off completely (0 = disabled).",
- "z2m_light.mappings": "Bulb Mappings:",
- "z2m_light.mappings.hint": "Map LED ranges to Z2M friendly names. Each mapping averages the LED segment to a single colour.",
- "z2m_light.mappings.color_vs_hint": "All listed bulbs will receive the same colour from the selected Color Value Source.",
- "z2m_light.mappings.add": "Add Mapping",
- "z2m_light.mapping.friendly_name": "Friendly Name:",
- "z2m_light.mapping.led_start": "LED Start:",
- "z2m_light.mapping.led_end": "LED End (-1=last):",
- "z2m_light.mapping.brightness": "Brightness Scale:",
- "z2m_light.mapping.unassigned": "— No bulb selected",
- "z2m_light.stop_action": "On Stop:",
- "z2m_light.stop_action.hint": "What to do with the mapped bulbs when this target stops streaming.",
- "z2m_light.stop_action.none": "None",
- "z2m_light.stop_action.none.desc": "Leave bulbs as-is",
- "z2m_light.stop_action.turn_off": "Turn Off",
- "z2m_light.stop_action.turn_off.desc": "Switch all mapped bulbs off",
- "z2m_light.connection_metric": "Zigbee2MQTT broker connection",
- "z2m_light.error.name_required": "Name is required",
- "z2m_light.error.mqtt_source_required": "MQTT broker is required",
- "z2m_light.error.color_source_required": "Color value source is required when broadcasting a single colour",
- "z2m_light.error.mapping_required": "At least one bulb mapping is required",
- "z2m_light.created": "Z2M light target created",
- "z2m_light.updated": "Z2M light target updated",
- "z2m_light.button.turn_off": "Turn Off Bulbs",
- "z2m_light.turn_off.success": "Bulbs turned off",
- "z2m_light.turn_off.failed": "Failed to turn off bulbs",
- "confirm.turn_off_z2m_light": "Turn off all mapped bulbs?",
- "z2m_light.bulbs.one": "{count} bulb",
- "z2m_light.bulbs.other": "{count} bulbs",
- "section.empty.z2m_light_targets": "No Z2M light targets yet. Click + to add one.",
- "automations.rule.home_assistant": "Home Assistant",
- "automations.rule.home_assistant.desc": "HA entity state",
- "automations.rule.home_assistant.ha_source": "HA Source:",
- "automations.rule.home_assistant.entity_id": "Entity ID:",
- "automations.rule.home_assistant.state": "State:",
- "automations.rule.home_assistant.match_mode": "Match Mode:",
- "automations.rule.home_assistant.hint": "Activate when a Home Assistant entity matches the specified state",
- "automations.rule.ha.match_mode.exact.desc": "State must match exactly",
- "automations.rule.ha.match_mode.contains.desc": "State must contain the text",
- "automations.rule.ha.match_mode.regex.desc": "State must match the regex pattern",
- "color_strip.clock": "Sync Clock:",
- "color_strip.clock.hint": "Link to a sync clock to synchronize animation timing across sources. Speed is controlled on the clock.",
- "graph.title": "Graph",
- "graph.fit_all": "Fit all nodes",
- "graph.zoom_in": "Zoom in",
- "graph.zoom_out": "Zoom out",
- "graph.search": "Search nodes",
- "graph.search_placeholder": "Search entities...",
- "graph.legend": "Legend",
- "graph.minimap": "Minimap",
- "graph.relayout": "Re-layout",
- "graph.empty": "No entities yet",
- "graph.empty.hint": "Create devices, sources, and targets to see them here.",
- "graph.disconnect": "Disconnect",
- "graph.connection_updated": "Connection updated",
- "graph.connection_failed": "Failed to update connection",
- "graph.connection_removed": "Connection removed",
- "graph.disconnect_failed": "Failed to disconnect",
- "graph.relayout_confirm": "Reset all manual node positions and re-layout the graph?",
- "graph.fullscreen": "Toggle fullscreen",
- "graph.add_entity": "Add entity",
- "graph.color_picker": "Node color",
- "graph.filter": "Filter nodes",
- "graph.filter_placeholder": "Filter: name, type:x, tag:x",
- "graph.filter_clear": "Clear filter",
- "graph.filter_running": "Running",
- "graph.filter_stopped": "Stopped",
- "graph.filter_types": "Types",
- "graph.filter_group.capture": "Capture",
- "graph.filter_group.strip": "Color Strip",
- "graph.filter_group.audio": "Audio",
- "graph.filter_group.targets": "Targets",
- "graph.filter_group.other": "Other",
- "graph.bulk_delete_confirm": "Delete {count} selected entities?",
- "graph.nothing_to_undo": "Nothing to undo",
- "graph.nothing_to_redo": "Nothing to redo",
- "graph.help_title": "Keyboard Shortcuts",
- "graph.help.search": "Search",
- "graph.help.filter": "Filter",
- "graph.help.add": "Add entity",
- "graph.help.shortcuts": "Shortcuts",
- "graph.help.delete": "Delete / Detach",
- "graph.help.select_all": "Select all",
- "graph.help.undo": "Undo",
- "graph.help.redo": "Redo",
- "graph.help.fullscreen": "Fullscreen",
- "graph.help.deselect": "Deselect",
- "graph.help.navigate": "Navigate nodes",
- "graph.help.click": "Click",
- "graph.help.click_desc": "Select node",
- "graph.help.dblclick": "Double-click",
- "graph.help.dblclick_desc": "Zoom to node",
- "graph.help.shift_click": "Shift+Click",
- "graph.help.shift_click_desc": "Multi-select",
- "graph.help.shift_drag": "Shift+Drag",
- "graph.help.shift_drag_desc": "Rubber-band select",
- "graph.help.drag_node": "Drag node",
- "graph.help.drag_node_desc": "Reposition",
- "graph.help.drag_port": "Drag port",
- "graph.help.drag_port_desc": "Connect entities",
- "graph.help.right_click": "Right-click edge",
- "graph.help.right_click_desc": "Detach connection",
- "graph.tooltip.fps": "FPS",
- "graph.tooltip.errors": "Errors",
- "graph.tooltip.uptime": "Uptime",
- "graph.undone": "Undone",
- "graph.redone": "Redone",
- "graph.action.connect": "Connect",
- "graph.action.disconnect": "Disconnect",
- "graph.action.move": "Move node",
- "graph.action.rewire": "Re-wire slot",
- "graph.choose_connection": "Choose connection",
- "graph.rewire": "Re-wire…",
- "graph.rewire_choose_source": "Choose a new source",
- "graph.issues": "Issues",
- "graph.issues_none": "No issues found",
- "graph.issue.broken_ref": "Broken reference: {field}",
- "graph.issue.cycle": "Part of a dependency cycle",
- "graph.replace_connection_confirm": "Replace the existing connection?",
- "graph.no_compatible_connection": "No compatible connection between these entities",
- "graph.create_and_connect": "Create & connect…",
- "graph.export": "Export graph (JSON)",
- "graph.export_done": "Graph exported",
- "graph.export_failed": "Failed to export graph",
- "graph.duplicate": "Duplicate selection",
- "graph.duplicate_none": "Select one or more nodes to duplicate",
- "graph.duplicate_none_eligible": "Nothing duplicable in the selection (only value & colour-strip sources)",
- "graph.duplicate_done": "Duplicated {count} source(s)",
- "graph.duplicate_done_warn": "Duplicated {count} source(s) — some references could not be remapped",
- "graph.duplicate_failed": "Failed to duplicate selection",
- "graph.delete_with_dependents_confirm": "This entity is used by {count} other(s): {names}. Delete it and break those connections?",
- "automation.enabled": "Automation enabled",
- "automation.disabled": "Automation disabled",
- "scene_preset.activated": "Preset activated",
- "scene_preset.used_by": "Used by %d automation(s)",
- "settings.api_keys.label": "API Keys",
- "settings.api_keys.hint": "API keys are defined in the server config file (config.yaml). Edit the file and restart the server to apply changes.",
- "settings.api_keys.empty": "No API keys configured",
- "settings.api_keys.load_error": "Failed to load API keys",
- "settings.partial.label": "Partial Export / Import",
- "settings.partial.hint": "Export or import a single entity type. Import replaces or merges existing data and restarts the server.",
- "settings.partial.store.devices": "Devices",
- "settings.partial.store.output_targets": "LED Targets",
- "settings.partial.store.color_strip_sources": "Color Strips",
- "settings.partial.store.picture_sources": "Picture Sources",
- "settings.partial.store.audio_sources": "Audio Sources",
- "settings.partial.store.audio_templates": "Audio Templates",
- "settings.partial.store.capture_templates": "Capture Templates",
- "settings.partial.store.postprocessing_templates": "Post-processing Templates",
- "settings.partial.store.color_strip_processing_templates": "CSS Processing Templates",
- "settings.partial.store.pattern_templates": "Pattern Templates",
- "settings.partial.store.value_sources": "Value Sources",
- "settings.partial.store.sync_clocks": "Sync Clocks",
- "settings.partial.store.automations": "Automations",
- "settings.partial.store.scene_presets": "Scene Presets",
- "settings.partial.export_button": "Export",
- "settings.partial.import_button": "Import from File",
- "settings.partial.merge_label": "Merge (add/overwrite, keep existing)",
- "settings.partial.export_success": "Exported successfully",
- "settings.partial.export_error": "Export failed",
- "settings.partial.import_success": "Imported successfully",
- "settings.partial.import_error": "Import failed",
- "settings.partial.import_confirm_replace": "This will REPLACE all {store} data and restart the server. Continue?",
- "settings.partial.import_confirm_merge": "This will MERGE into existing {store} data and restart the server. Continue?",
- "section.empty.devices": "No devices yet. Click + to add one.",
- "section.empty.targets": "No LED targets yet. Click + to add one.",
- "section.empty.kc_targets": "No key color targets yet. Click + to add one.",
- "section.empty.pattern_templates": "No pattern templates yet. Click + to add one.",
- "section.empty.picture_sources": "No sources yet. Click + to add one.",
- "section.empty.capture_templates": "No capture templates yet. Click + to add one.",
- "section.empty.pp_templates": "No post-processing templates yet. Click + to add one.",
- "section.empty.audio_sources": "No audio sources yet. Click + to add one.",
- "section.empty.audio_templates": "No audio templates yet. Click + to add one.",
- "section.empty.color_strips": "No color strips yet. Click + to add one.",
- "section.empty.value_sources": "No value sources yet. Click + to add one.",
- "section.empty.sync_clocks": "No sync clocks yet. Click + to add one.",
- "section.empty.weather_sources": "No weather sources yet. Click + to add one.",
- "section.empty.cspt": "No CSS processing templates yet. Click + to add one.",
- "section.empty.automations": "No automations yet. Click + to add one.",
- "section.empty.scenes": "No scene presets yet. Click + to add one.",
- "section.empty.playlists": "No playlists yet. Click + to add one.",
- "bulk.select": "Select",
- "bulk.cancel": "Cancel",
- "bulk.selected_count.one": "{count} selected",
- "bulk.selected_count.other": "{count} selected",
- "bulk.select_all": "Select all",
- "bulk.deselect_all": "Deselect all",
- "bulk.delete": "Delete",
- "bulk.start": "Start",
- "bulk.stop": "Stop",
- "bulk.enable": "Enable",
- "bulk.disable": "Disable",
- "bulk.confirm_delete.one": "Delete {count} item?",
- "bulk.confirm_delete.other": "Delete {count} items?",
- "appearance.style.label": "Style Presets",
- "appearance.style.hint": "Choose a visual theme — font pairing and color palette applied together.",
- "appearance.preset.default": "Default",
- "appearance.preset.midnight": "Midnight",
- "appearance.preset.ember": "Ember",
- "appearance.preset.arctic": "Arctic",
- "appearance.preset.terminal": "Terminal",
- "appearance.preset.neon": "Neon",
- "appearance.preset.sakura": "Sakura",
- "appearance.preset.ocean": "Ocean",
- "appearance.preset.copper": "Copper",
- "appearance.preset.vapor": "Vapor",
- "appearance.preset.monolith": "Monolith",
- "appearance.preset.applied": "Style preset applied",
- "appearance.bg.label": "Background Effects",
- "appearance.bg.hint": "Add an ambient background layer behind the interface.",
- "appearance.bg.none": "None",
- "appearance.bg.noise": "Noise Field",
- "appearance.bg.aurora": "Aurora",
- "appearance.bg.plasma": "Plasma",
- "appearance.bg.rain": "Digital Rain",
- "appearance.bg.stars": "Starfield",
- "appearance.bg.warp": "Warp Tunnel",
- "appearance.bg.grid": "Dot Grid",
- "appearance.bg.mesh": "Gradient Mesh",
- "appearance.bg.scanlines": "Scanlines",
- "appearance.bg.applied": "Background effect applied",
- "settings.tab.notifications": "Notifications",
- "settings.tab.updates": "Updates",
- "settings.tab.about": "About",
- "settings.notifications.intro_label": "Device events",
- "settings.notifications.intro_hint": "Pick how each device event reaches you. \"Snack\" shows an in-app toast, \"OS\" shows a system notification (browser must be granted permission), \"Both\" shows both, \"None\" silences the event entirely.",
- "settings.notifications.row.online": "Device came online",
- "settings.notifications.row.offline": "Device went offline",
- "settings.notifications.row.discovered": "New device found",
- "settings.notifications.row.lost": "Discovered device lost",
- "settings.notifications.background.label": "Background discovery",
- "settings.notifications.background.hint": "Continuously scan the LAN (mDNS) and serial bus for new LED devices. Disable to silence \"device discovered/lost\" events at the source. Restart the server to apply.",
- "settings.notifications.background.toggle": "Enable background discovery",
- "settings.notifications.permission.label": "OS notification permission",
- "settings.notifications.permission.grant": "Grant permission",
- "settings.notifications.permission.granted": "OS notifications enabled",
- "settings.notifications.permission.denied": "OS notifications blocked — change in browser settings",
- "settings.notifications.permission.state.granted": "Granted — OS toasts will appear",
- "settings.notifications.permission.state.denied": "Denied — change in browser settings",
- "settings.notifications.permission.state.default": "Not yet requested",
- "settings.notifications.permission.hint": "The browser controls OS notification permission per site. Once denied, LedGrab can no longer ask again — you need to clear it in the browser. Click the site icon (lock) in the address bar → Site settings → Notifications → Allow, then reload.",
- "settings.notifications.test_button": "Send a test notification",
- "settings.notifications.saved": "Notification preferences saved",
- "settings.notifications.save_error": "Failed to save notification preferences",
- "settings.notifications.channel.none.label": "Off",
- "settings.notifications.channel.none.desc": "Silence this event",
- "settings.notifications.channel.snack.label": "Snack",
- "settings.notifications.channel.snack.desc": "In-app toast at the bottom of the page",
- "settings.notifications.channel.os.label": "OS",
- "settings.notifications.channel.os.desc": "System notification (works while the browser is in the background)",
- "settings.notifications.channel.both.label": "Both",
- "settings.notifications.channel.both.desc": "In-app toast and system notification",
- "settings.notifications.permission.pill.granted": "GRANTED",
- "settings.notifications.permission.pill.denied": "BLOCKED",
- "settings.rail.group.workspace": "Workspace",
- "settings.rail.group.system": "System",
- "settings.save_bar.unsaved": "Unsaved changes in",
- "settings.save_bar.revert": "Revert",
- "settings.save_bar.save": "Save",
- "settings.section.api_keys": "Identity & API",
- "settings.section.server": "Server",
- "settings.section.lifecycle": "Lifecycle",
- "settings.section.destructive": "DESTRUCTIVE",
- "settings.section.manual": "Manual",
- "settings.section.notif_channels": "Channels",
- "settings.section.notif_discovery": "Discovery",
- "settings.section.notif_permission": "OS Permission",
- "settings.api_keys.read_only": "Read-only",
- "settings.api_keys.meta.one": "key",
- "settings.api_keys.meta.many": "keys",
- "settings.logs.sub": "Live tail of server log output, filterable by level. Opens in a full-screen overlay.",
- "settings.restart.sub": "Bounce the LedGrab process. Active capture and connected devices will pause for ~3 seconds.",
- "settings.restart.button": "Restart",
- "settings.notif_matrix.col.event": "Event",
- "settings.notif_matrix.event_count": "4 EVENTS",
- "settings.auto_backup.pill.running": "RUNNING",
- "update.pill.available": "UPDATE AVAILABLE",
- "update.pill.error": "ERROR",
- "update.pill.updated": "UP TO DATE",
- "notifications.unknown_device": "Unknown device",
- "notifications.device_online.title": "Device online",
- "notifications.device_online.body": "{device} is back online",
- "notifications.device_offline.title": "Device offline",
- "notifications.device_offline.body": "{device} stopped responding",
- "notifications.device_discovered.title": "New device found",
- "notifications.device_discovered.body": "{device} appeared on your network",
- "notifications.device_lost.title": "Device lost",
- "notifications.device_lost.body": "{device} disappeared",
- "notifications.bulk.title": "Multiple devices changed",
- "notifications.bulk.body": "{count} device events fired at once",
- "notifications.test.title": "LedGrab test notification",
- "notifications.test.body": "Notifications are wired up correctly.",
- "update.status_label": "Update Status",
- "update.current_version": "Current version:",
- "update.badge_tooltip": "New version available — click for details",
- "update.available": "Version {version} is available",
- "update.up_to_date": "You are running the latest version",
- "update.prerelease": "pre-release",
- "update.view_release": "View Release",
- "update.dismiss": "Dismiss",
- "update.check_now": "Check for Updates",
- "update.check_error": "Update check failed",
- "update.last_check": "Last check",
- "update.never": "never",
- "update.release_notes": "Release Notes",
- "update.view_release_notes": "View Release Notes",
- "update.release_notes_hint": "What's new in the available version — read the changelog before applying.",
- "update.release_notes_open": "Open",
- "update.assets.title": "Downloads",
- "update.assets.desc.windows_installer": "Windows installer — Start Menu shortcut, optional autostart, uninstaller",
- "update.assets.desc.windows_portable": "Windows portable — unzip anywhere, run LedGrab.bat",
- "update.assets.desc.windows_msi": "Windows MSI installer",
- "update.assets.desc.windows_exe": "Windows executable",
- "update.assets.desc.linux_tarball": "Linux archive — extract, run ./run.sh",
- "update.assets.desc.linux_appimage": "Linux portable — single executable",
- "update.assets.desc.linux_deb": "Debian / Ubuntu package",
- "update.assets.desc.linux_rpm": "Fedora / RHEL package",
- "update.assets.desc.linux_sandbox": "Sandboxed Linux package",
- "update.assets.desc.macos_dmg": "macOS disk image — drag to Applications",
- "update.assets.desc.macos_installer": "macOS installer package",
- "update.assets.desc.android": "Android — sideload on Android 7.0+",
- "update.assets.desc.android_bundle": "Android App Bundle (Play Store)",
- "update.assets.desc.ios": "iOS application",
- "update.assets.desc.zip_archive": "ZIP archive",
- "update.assets.desc.tarball": "Tar archive",
- "update.assets.desc.archive": "Compressed archive",
- "update.auto_check_label": "Auto-Check Settings",
- "update.auto_check_hint": "Periodically check for new releases in the background.",
- "update.enable": "Enable auto-check",
- "update.interval_label": "Check interval",
- "update.channel_label": "Channel",
- "update.channel.stable": "Stable",
- "update.channel.stable_desc": "Stable releases only",
- "update.channel.prerelease": "Pre-release",
- "update.channel.prerelease_desc": "Include alpha, beta, and RC builds",
- "update.save_settings": "Save Settings",
- "update.settings_saved": "Update settings saved",
- "update.settings_save_error": "Failed to save update settings",
- "update.apply_now": "Update Now",
- "update.apply_confirm": "Download and install version {version}? The server will restart automatically.",
- "update.apply_error": "Update failed",
- "update.applying": "Applying update…",
- "update.downloading": "Downloading…",
- "update.install_type_label": "Install type:",
- "update.install_type.installer": "Windows installer",
- "update.install_type.portable": "Portable",
- "update.install_type.docker": "Docker",
- "update.install_type.dev": "Development",
- "color_strip.notification.search_apps": "Search notification apps…",
- "asset.group.title": "Assets",
- "asset.upload": "Upload Asset",
- "asset.edit": "Edit Asset",
- "asset.name": "Name:",
- "asset.name.hint": "Display name for this asset.",
- "asset.description": "Description:",
- "asset.description.hint": "Optional description for this asset.",
- "asset.file": "File:",
- "asset.file.hint": "Select a file to upload (sound, image, video, or other).",
- "asset.drop_or_browse": "Drop file here or click to browse",
- "asset.uploaded": "Asset uploaded",
- "asset.updated": "Asset updated",
- "asset.deleted": "Asset deleted",
- "asset.confirm_delete": "Delete this asset?",
- "asset.error.name_required": "Name is required",
- "asset.error.no_file": "Please select a file to upload",
- "asset.error.delete_failed": "Failed to delete asset",
- "asset.error.play_failed": "Failed to play sound",
- "asset.error.download_failed": "Failed to download asset",
- "asset.play": "Play",
- "asset.download": "Download",
- "asset.prebuilt": "Prebuilt",
- "asset.prebuilt_restored": "{count} prebuilt asset(s) restored",
- "asset.prebuilt_none_to_restore": "All prebuilt assets are already available",
- "asset.restore_prebuilt": "Restore Prebuilt Sounds",
- "asset.type.sound": "Sound",
- "asset.type.image": "Image",
- "asset.type.video": "Video",
- "asset.type.other": "Other",
- "streams.group.assets": "Assets",
- "section.empty.assets": "No assets yet. Click + to upload one.",
- "donation.message": "LedGrab is free & open-source. If it's useful to you, consider supporting development.",
- "donation.support": "Support the project",
- "donation.view_source": "View source code",
- "donation.about": "About",
- "donation.later": "Remind me later",
- "donation.dismiss": "Don't show again",
- "donation.about_title": "About LedGrab",
- "donation.about_opensource": "LedGrab is open-source software, free to use and modify.",
- "donation.about_donate": "Support development",
- "donation.about_license": "MIT License",
- "donation.about_author": "Created by",
- "streams.group.game": "Game Integration",
- "tree.group.game": "Game",
- "game_integration.section_title": "Game Integrations",
- "section.empty.game_integrations": "No game integrations yet. Click + to create one.",
- "game_integration.add": "Add Game Integration",
- "game_integration.edit": "Edit Game Integration",
- "game_integration.created": "Game integration created",
- "game_integration.updated": "Game integration updated",
- "game_integration.deleted": "Game integration deleted",
- "game_integration.confirm_delete": "Delete this game integration?",
- "game_integration.error.name_required": "Name is required",
- "game_integration.error.save_failed": "Failed to save game integration",
- "game_integration.error.delete_failed": "Failed to delete game integration",
- "game_integration.error.save_first": "Save the integration first to test the connection",
- "game_integration.name": "Name:",
- "game_integration.name.hint": "A descriptive name for this game integration",
- "game_integration.description": "Description:",
- "game_integration.description.hint": "Optional description of what this integration does",
- "game_integration.enabled": "Enabled",
- "game_integration.adapter_type": "Game / Adapter:",
- "game_integration.adapter_type.hint": "Select the game or adapter type for this integration",
- "game_integration.adapter_config": "Adapter Configuration",
- "game_integration.no_config": "No configuration required for this adapter.",
- "game_integration.setup_instructions": "Setup Instructions",
- "game_integration.setup_instructions.hint": "Follow these steps to configure your game to send data to this integration",
- "game_integration.event_mappings": "Event Mappings",
- "game_integration.event_mappings.hint": "Map game events to LED effects. Each event type can trigger a different visual effect.",
- "game_integration.mapping.add": "+ Add Mapping",
- "game_integration.mapping.event_type": "Event",
- "game_integration.mapping.effect_type": "Effect",
- "game_integration.mapping.color": "Color",
- "game_integration.mapping.duration": "Duration (ms)",
- "game_integration.mapping.intensity": "Intensity",
- "game_integration.mapping.priority": "Priority",
- "game_integration.mapping.select_preset": "Load preset...",
- "game_integration.preset.select": "Load preset...",
- "game_integration.preset.fps_combat": "FPS Combat",
- "game_integration.preset.moba_health": "MOBA Health",
- "game_integration.adapter": "Adapter",
- "game_integration.status": "Status",
- "game_integration.status.active": "Active",
- "game_integration.status.inactive": "Inactive",
- "game_integration.mappings": "Mappings",
- "game_integration.events.title": "Live Events",
- "game_integration.events.waiting": "Waiting for events...",
- "game_integration.events.monitor": "Event Monitor",
- "game_integration.test.button": "Test Connection",
- "game_integration.test.waiting": "Waiting for events from game...",
- "game_integration.test.success": "Connection successful! Received events.",
- "game_integration.test.error": "Connection error",
- "game_integration.test.timeout": "No events received within timeout period.",
- "game_integration.auto_setup": "Auto Setup",
- "game_integration.auto_setup.success": "Configuration file written successfully",
- "game_integration.auto_setup.failed": "Auto setup failed",
- "game_integration.auto_setup.not_supported": "This adapter does not support auto setup",
- "game_integration.auto_setup.game_not_found": "Game installation not found",
- "game_integration.auto_setup.token_generated": "Auth token was automatically generated",
- "game_integration.auto_setup.save_first": "Save the integration first before running auto setup",
- "color_strip.type.game_event": "Game Event",
- "color_strip.type.game_event.desc": "LED effects triggered by game events",
- "color_strip.game_event.integration": "Game Integration:",
- "color_strip.game_event.integration.hint": "Select the game integration that provides events for this source.",
- "color_strip.game_event.idle_color": "Idle Color:",
- "color_strip.game_event.idle_color.hint": "LED color when no game events are active.",
- "color_strip.game_event.event_mappings": "Event Mappings:",
- "color_strip.game_event.event_mappings.hint": "Override or add event-to-effect mappings for this source. These supplement the integration-level mappings.",
- "color_strip.game_event.error.no_integration": "Please select a game integration.",
- "color_strip.type.math_wave": "Math Wave",
- "color_strip.type.math_wave.desc": "Mathematical wave generator with gradient color mapping",
- "color_strip.math_wave.gradient": "Color Gradient:",
- "color_strip.math_wave.gradient.hint": "The gradient used to color the wave output. Wave values are mapped to positions along this gradient.",
- "color_strip.math_wave.speed": "Speed:",
- "color_strip.math_wave.speed.hint": "Animation speed multiplier. Higher values make the wave move faster.",
- "color_strip.math_wave.waves": "Wave Layers:",
- "color_strip.math_wave.waves.hint": "Add multiple wave layers that are combined together. Each wave has its own waveform, frequency, amplitude, phase and offset.",
- "color_strip.math_wave.add_wave": "+ Add Wave",
- "color_strip.math_wave.waveform": "Waveform",
- "color_strip.math_wave.waveform.sine": "Sine",
- "color_strip.math_wave.waveform.triangle": "Triangle",
- "color_strip.math_wave.waveform.sawtooth": "Sawtooth",
- "color_strip.math_wave.waveform.square": "Square",
- "color_strip.math_wave.frequency": "Frequency",
- "color_strip.math_wave.amplitude": "Amplitude",
- "color_strip.math_wave.phase": "Phase",
- "color_strip.math_wave.offset": "Offset",
- "color_strip.math_wave.error.no_waves": "Add at least one wave layer.",
- "value_source.type.game_event": "Game Event",
- "value_source.type.game_event.desc": "Game metrics (health, ammo, mana) as 0-1 values",
- "value_source.game_event.integration": "Game Integration:",
- "value_source.game_event.integration.hint": "Select the game integration that provides events for this value source.",
- "value_source.game_event.event_type": "Event Type:",
- "value_source.game_event.event_type.hint": "The continuous game event to track (health, mana, ammo, etc.).",
- "value_source.game_event.min_game_value": "Min Game Value:",
- "value_source.game_event.min_game_value.hint": "Raw game value that maps to output 0.0.",
- "value_source.game_event.max_game_value": "Max Game Value:",
- "value_source.game_event.max_game_value.hint": "Raw game value that maps to output 1.0.",
- "value_source.game_event.smoothing": "Smoothing:",
- "value_source.game_event.smoothing.hint": "EMA smoothing factor. 0 = instant, higher = smoother transitions.",
- "value_source.game_event.default_value": "Default Value:",
- "value_source.game_event.default_value.hint": "Output value when no events received within timeout.",
- "value_source.game_event.timeout": "Timeout (s):",
- "value_source.game_event.timeout.hint": "Seconds of silence before reverting to the default value.",
- "audio_processing.title": "Audio Processing Templates",
- "audio_processing.add": "Add Audio Processing Template",
- "audio_processing.edit": "Edit Audio Processing Template",
- "audio_processing.name": "Template Name:",
- "audio_processing.name.hint": "A descriptive name for this audio processing template",
- "audio_processing.name_placeholder": "My Audio Processing Template",
- "audio_processing.description_label": "Description (optional):",
- "audio_processing.description.hint": "Describe what this template does",
- "audio_processing.description_placeholder": "Describe this template...",
- "audio_processing.created": "Audio processing template created",
- "audio_processing.updated": "Audio processing template updated",
- "audio_processing.deleted": "Audio processing template deleted",
- "audio_processing.delete.confirm": "Are you sure you want to delete this audio processing template?",
- "audio_processing.error.required": "Please fill in all required fields",
- "audio_processing.error.load": "Error loading audio processing template",
- "audio_processing.error.delete": "Error deleting audio processing template",
- "audio_processing.error.clone_failed": "Failed to clone audio processing template",
- "audio_processing.error.save_failed": "Failed to save audio processing template",
- "audio_processing.filter_count": "Filter count",
- "audio_processing.filters_label": "filters",
- "streams.group.audio_processing": "Audio Processing",
- "section.empty.audio_processing_templates": "No audio processing templates yet. Click + to create one.",
- "audio_source.group.capture": "Capture Sources",
- "audio_source.group.processed": "Processed Sources",
- "pairing.title": "Pair Device",
- "pairing.instructions.default": "Press and hold the pairing button on your device, then click Start. Devices typically open a 30-second pairing window — be ready to act quickly.",
- "pairing.start": "Start pairing",
- "pairing.pairing": "Pairing…",
- "pairing.cancel": "Cancel",
- "pairing.retry": "Try again",
- "pairing.close": "Close",
- "pairing.success": "Paired successfully",
- "pairing.not_ready": "Device didn't respond. Press the pairing button on your device, then try again.",
- "pairing.failed": "Pairing failed: {detail}",
- "pairing.failed_prefix": "Pairing failed:",
- "streams.group.http": "HTTP",
- "http_endpoint.group.title": "HTTP Endpoints",
- "http_endpoint.add": "Add HTTP Endpoint",
- "http_endpoint.edit": "Edit HTTP Endpoint",
- "http_endpoint.section.request": "Request",
- "http_endpoint.section.headers": "Headers",
- "http_endpoint.name": "Name:",
- "http_endpoint.name.placeholder": "Plex now-playing",
- "http_endpoint.name.hint": "A descriptive name for this endpoint",
- "http_endpoint.url": "URL:",
- "http_endpoint.url.hint": "Full http(s) URL to poll. Local addresses are allowed.",
- "http_endpoint.method": "Method:",
- "http_endpoint.method.get.desc": "Fetch the response body.",
- "http_endpoint.method.head.desc": "Status code only — no body. Great for liveness probes.",
- "http_endpoint.auth_token": "Auth Token (optional):",
- "http_endpoint.auth_token.hint": "Sent as 'Authorization: Bearer config/default_config.yaml:",
- "setup.step2_label": "2. Перезапустите сервер, затем перезагрузите эту страницу и войдите с этим ключом.",
- "setup.step3_label": "Либо откройте LedGrab прямо на машине с сервером (через loopback), ключ не нужен:",
- "setup.hint_openssl": "Сгенерировать надёжный ключ: Linux/macOS — openssl rand -hex 32; Windows PowerShell — [guid]::NewGuid().ToString('N') + [guid]::NewGuid().ToString('N').",
- "setup.copy": "Скопировать фрагмент",
- "setup.copied": "Скопировано в буфер обмена",
- "setup.retry": "Я настроил ключ — проверить снова",
- "setup.still_required": "Сервер всё ещё сообщает об отсутствии API-ключей. Проверьте, что файл сохранён и сервер перезапущен.",
- "displays.title": "Доступные Дисплеи",
- "displays.layout": "Дисплеи",
- "displays.information": "Информация о Дисплеях",
- "displays.legend.primary": "Основной Дисплей",
- "displays.legend.secondary": "Вторичный Дисплей",
- "displays.badge.primary": "Основной",
- "displays.badge.secondary": "Вторичный",
- "displays.resolution": "Разрешение:",
- "displays.refresh_rate": "Частота Обновления:",
- "displays.position": "Позиция:",
- "displays.index": "Индекс Дисплея:",
- "displays.loading": "Загрузка дисплеев...",
- "displays.none": "Нет доступных дисплеев",
- "displays.failed": "Не удалось загрузить дисплеи",
- "displays.picker.title": "Выберите Дисплей",
- "displays.picker.title.lead": "Выбрать",
- "displays.picker.title.accent": "Дисплей",
- "displays.picker.eyebrow.label": "Источник",
- "displays.picker.eyebrow.channel": "Дисплей · Карта",
- "displays.picker.eyebrow.channel.device": "Устройство · Список",
- "displays.picker.foot.dismiss": "закрыть",
- "displays.picker.foot.select": "выбрать монитор",
- "displays.picker.foot.select.device": "выбрать устройство",
- "displays.picker.select": "Выберите дисплей...",
- "displays.picker.click_to_select": "Нажмите, чтобы выбрать этот дисплей",
- "displays.picker.adb_connect": "Подключить ADB устройство",
- "displays.picker.adb_connect.placeholder": "IP адрес (напр. 192.168.2.201)",
- "displays.picker.adb_connect.button": "Подключить",
- "displays.picker.adb_connect.success": "Устройство подключено",
- "displays.picker.adb_connect.error": "Не удалось подключить устройство",
- "displays.picker.adb_disconnect": "Отключить",
- "displays.picker.no_android": "Android устройства не найдены. Подключите по USB или введите IP выше.",
- "templates.title": "Шаблоны Движков",
- "templates.description": "Шаблоны захвата определяют, как захватывается экран. Каждый шаблон использует определённый движок захвата (MSS, DXcam, WGC) с настраиваемыми параметрами. Назначайте шаблоны устройствам для оптимальной производительности.",
- "templates.loading": "Загрузка шаблонов...",
- "templates.empty": "Шаблоны захвата не настроены",
- "templates.add": "Добавить Шаблон Движка",
- "templates.edit": "Редактировать Шаблон Движка",
- "templates.name": "Имя Шаблона:",
- "templates.name.placeholder": "Мой Пользовательский Шаблон",
- "templates.description.label": "Описание (необязательно):",
- "templates.description.placeholder": "Опишите этот шаблон...",
- "templates.engine": "Движок Захвата:",
- "templates.engine.hint": "Выберите технологию захвата экрана",
- "templates.engine.select": "Выберите движок...",
- "templates.engine.unavailable": "Недоступен",
- "templates.engine.unavailable.hint": "Этот движок недоступен в вашей системе",
- "templates.engine.mss.desc": "Кроссплатформенный, чистый Python",
- "templates.engine.dxcam.desc": "DirectX, низкая задержка",
- "templates.engine.bettercam.desc": "DirectX, высокая производительность",
- "templates.engine.camera.desc": "Захват USB/IP камеры",
- "templates.engine.scrcpy.desc": "Зеркалирование экрана Android (adb screencap)",
- "templates.engine.scrcpy_client.desc": "Android H.264 поток, высокая частота",
- "templates.engine.wgc.desc": "Windows Graphics Capture",
- "templates.engine.demo.desc": "Тестовый анимированный шаблон (демо)",
- "templates.engine.mediaprojection.desc": "Нативный захват экрана Android",
- "templates.engine.android_camera.desc": "Захват камеры устройства (Camera2)",
- "templates.config": "Конфигурация",
- "templates.config.show": "Показать конфигурацию",
- "templates.config.none": "Нет дополнительных настроек",
- "templates.config.default": "По умолчанию",
- "templates.config.camera_backend.auto": "Автовыбор лучшего бэкенда",
- "templates.config.camera_backend.dshow": "Windows DirectShow",
- "templates.config.camera_backend.msmf": "Windows Media Foundation",
- "templates.config.camera_backend.v4l2": "Linux Video4Linux2",
- "templates.config.resolution.auto": "Открыть в максимальном поддерживаемом разрешении камеры",
- "templates.config.resolution.480p": "VGA — минимум CPU и трафика",
- "templates.config.resolution.720p": "HD",
- "templates.config.resolution.1080p": "Full HD",
- "templates.config.resolution.1440p": "QHD / 2K",
- "templates.config.resolution.2160p": "4K UHD — максимум CPU и трафика",
- "templates.created": "Шаблон успешно создан",
- "templates.updated": "Шаблон успешно обновлён",
- "templates.deleted": "Шаблон успешно удалён",
- "templates.delete.confirm": "Вы уверены, что хотите удалить этот шаблон?",
- "templates.error.load": "Не удалось загрузить шаблоны",
- "templates.error.engines": "Не удалось загрузить движки",
- "templates.error.required": "Пожалуйста, заполните все обязательные поля",
- "templates.error.delete": "Не удалось удалить шаблон",
- "templates.error.save_failed": "Не удалось сохранить шаблон",
- "templates.error.load_failed": "Не удалось загрузить шаблон",
- "templates.test.title": "Тест Захвата",
- "templates.test.description": "Протестируйте этот шаблон перед сохранением, чтобы увидеть предпросмотр захвата и метрики производительности.",
- "templates.test.display": "Дисплей:",
- "templates.test.display.select": "Выберите дисплей...",
- "templates.test.device": "Устройство:",
- "templates.test.device.select": "Выберите устройство...",
- "templates.test.duration": "Длительность Захвата (с):",
- "templates.test.border_width": "Ширина Границы (px):",
- "templates.test.run": "Запустить",
- "templates.test.running": "Выполняется тест...",
- "templates.test.results.preview": "Полный Предпросмотр Захвата",
- "templates.test.results.borders": "Извлечение Границ",
- "templates.test.results.top": "Сверху",
- "templates.test.results.right": "Справа",
- "templates.test.results.bottom": "Снизу",
- "templates.test.results.left": "Слева",
- "templates.test.results.performance": "Производительность",
- "templates.test.results.capture_time": "Захват",
- "templates.test.results.extraction_time": "Извлечение",
- "templates.test.results.total_time": "Всего",
- "templates.test.results.max_fps": "Макс. FPS",
- "templates.test.results.duration": "Длительность",
- "templates.test.results.frame_count": "Кадры",
- "templates.test.results.actual_fps": "Факт. FPS",
- "templates.test.results.avg_capture_time": "Средн. Захват",
- "templates.test.results.resolution": "Разрешение:",
- "templates.test.error.no_engine": "Пожалуйста, выберите движок захвата",
- "templates.test.error.no_display": "Пожалуйста, выберите дисплей",
- "templates.test.error.no_device": "Пожалуйста, выберите устройство",
- "templates.test.error.failed": "Тест не удался",
- "devices.title": "Устройства",
- "device.select_type": "Выберите тип устройства",
- "devices.add": "Добавить Новое Устройство",
- "devices.loading": "Загрузка устройств...",
- "devices.none": "Устройства не настроены",
- "devices.failed": "Не удалось загрузить устройства",
- "devices.wled_config": "Конфигурация WLED:",
- "devices.wled_note": "Настройте ваше WLED устройство (эффекты, сегменты, порядок цветов, ограничения питания и т.д.) используя",
- "devices.wled_link": "официальное приложение WLED",
- "devices.wled_note_or": "или встроенный",
- "devices.wled_webui_link": "веб-интерфейс WLED",
- "devices.wled_note_webui": "(откройте IP устройства в браузере).",
- "devices.wled_note2": "Этот контроллер отправляет данные о цвете пикселей и управляет яркостью для каждого устройства.",
- "device.scan": "Автопоиск",
- "device.scan.empty": "Устройства не найдены",
- "device.scan.error": "Ошибка сканирования сети",
- "device.scan.already_added": "Уже добавлено",
- "device.scan.selected": "Устройство выбрано",
- "device.type": "Тип устройства:",
- "device.type.hint": "Выберите тип LED контроллера",
- "device.type.wled": "WLED",
- "device.type.wled.desc": "WiFi LED контроллер по HTTP/UDP",
- "device.type.adalight": "Adalight",
- "device.type.adalight.desc": "Серийный протокол для Arduino",
- "device.type.ambiled": "AmbiLED",
- "device.type.ambiled.desc": "Серийный протокол AmbiLED",
- "device.type.mqtt": "MQTT",
- "device.type.mqtt.desc": "Отправка LED данных через MQTT брокер",
- "device.type.ws": "WebSocket",
- "device.type.ws.desc": "Стриминг LED данных через WebSocket",
- "device.type.openrgb": "OpenRGB",
- "device.type.openrgb.desc": "Управление RGB через OpenRGB",
- "device.type.dmx": "DMX",
- "device.type.dmx.desc": "Art-Net / sACN (E1.31) сценическое освещение",
- "device.type.ddp": "DDP",
- "device.type.ddp.desc": "Прямая отправка пикселей по UDP (Pixelblaze, ESPixelStick, Falcon)",
- "device.type.opc": "OPC",
- "device.type.opc.desc": "Open Pixel Control (Fadecandy, xLights, любительские драйверы)",
- "device.type.mock": "Mock",
- "device.type.mock.desc": "Виртуальное устройство для тестов",
- "device.type.espnow": "ESP-NOW",
- "device.type.espnow.desc": "Ultra-low-latency via ESP32 gateway",
- "device.type.hue": "Philips Hue",
- "device.type.hue.desc": "Hue Entertainment API streaming",
- "device.type.yeelight": "Yeelight",
- "device.type.yeelight.desc": "Умная лампа / лента Xiaomi по LAN (один цвет, усреднённый по ленте)",
- "device.yeelight.url": "IP-адрес:",
- "device.yeelight.url.hint": "IP-адрес лампы Yeelight в локальной сети. TCP-порт 55443 фиксирован протоколом.",
- "device.yeelight.url.placeholder": "192.168.1.50",
- "device.yeelight_min_interval": "Мин. интервал обновления:",
- "device.yeelight_min_interval.hint": "Локальный лимит частоты команд (мс). По умолчанию 500 мс держит лампу под ограничением ~1 команда/сек; меньшие значения могут вызвать троттлинг.",
- "device.type.wiz": "WiZ",
- "device.type.wiz.desc": "Лампа WiZ Connected (Philips) по UDP",
- "device.wiz.url": "IP-адрес:",
- "device.wiz.url.hint": "IP-адрес лампы WiZ в локальной сети. UDP-порт 38899 — по умолчанию.",
- "device.wiz.url.placeholder": "192.168.1.50",
- "device.wiz_min_interval": "Мин. интервал обновления:",
- "device.wiz_min_interval.hint": "Локальный лимит частоты команд (мс). UDP fire-and-forget справляется с быстрыми обновлениями; по умолчанию 50 мс ≈ 20 Гц.",
- "device.type.lifx": "LIFX",
- "device.type.lifx.desc": "Умная лампа / лента LIFX по LAN",
- "device.lifx.url": "IP-адрес:",
- "device.lifx.url.hint": "IP-адрес лампы LIFX в локальной сети. UDP-порт 56700 — по умолчанию.",
- "device.lifx.url.placeholder": "192.168.1.50",
- "device.lifx_min_interval": "Мин. интервал обновления:",
- "device.lifx_min_interval.hint": "Локальный лимит частоты команд (мс). LIFX рекомендует ≤20 команд/сек; по умолчанию 50 мс соответствует этому потолку.",
- "device.type.govee": "Govee",
- "device.type.govee.desc": "Лампа / комплект Govee Wi-Fi через LAN API",
- "device.govee.url": "IP-адрес:",
- "device.govee.url.hint": "IP-адрес устройства Govee в локальной сети. Сначала включите LAN Control в приложении Govee Home (Устройство → ⚙ → LAN Control), иначе лампа не ответит.",
- "device.govee.url.placeholder": "192.168.1.50",
- "device.govee_min_interval": "Мин. интервал обновления:",
- "device.govee_min_interval.hint": "Локальный лимит частоты команд (мс). UDP fire-and-forget справляется с быстрыми обновлениями; по умолчанию 50 мс ≈ 20 Гц.",
- "device.type.nanoleaf": "Nanoleaf",
- "device.type.nanoleaf.desc": "Nanoleaf Light Panels / Canvas / Shapes / Lines / Elements (HTTP REST, требует сопряжения)",
- "device.nanoleaf.url": "IP-адрес:",
- "device.nanoleaf.url.hint": "IP-адрес контроллера Nanoleaf в локальной сети. HTTP-порт 16021 зафиксирован в протоколе.",
- "device.nanoleaf.url.placeholder": "192.168.1.50",
- "device.nanoleaf_min_interval": "Мин. интервал обновления:",
- "device.nanoleaf_min_interval.hint": "Локальный лимит частоты команд (мс). По умолчанию 100 мс ≈ 10 Гц; накладные расходы HTTP ограничивают практический максимум ~20 Гц.",
- "device.nanoleaf.pair.instructions": "Нажмите и удерживайте кнопку питания на контроллере Nanoleaf в течение 5 секунд, пока светодиоды не мигнут, затем нажмите «Начать». Контроллер откроет окно сопряжения на 30 секунд.",
- "device.nanoleaf.pair_button": "Сопряжение",
- "device.nanoleaf.token.label": "Токен авторизации:",
- "device.nanoleaf.paired": "Сопряжено",
- "device.type.ble": "BLE LED контроллер",
- "device.type.ble.desc": "Bluetooth LE ленты: SP110E, Triones, Zengge, Govee (один цвет на всю ленту)",
- "device.ble.url": "BLE адрес:",
- "device.ble.url.hint": "MAC-адрес (Windows/Linux) или UUID (macOS) с префиксом ble://",
- "device.ble.family": "Протокол:",
- "device.ble.family.hint": "Какой BLE-протокол использует контроллер. Выбирайте по названию приложения, которым обычно управляете.",
- "device.ble.family.sp110e.desc": "Адресуемые контроллеры — приложение LED Hue / SP110E",
- "device.ble.family.triones.desc": "Одноцветные контроллеры — HappyLighting / LEDnet",
- "device.ble.family.zengge.desc": "Одноцветные контроллеры — iLightsIn / Mohuan",
- "device.ble.family.govee.desc": "Ленты Govee H6xxx — только без AES-шифрования",
- "device.ble.govee_key": "Ключ AES Govee (hex):",
- "device.ble.govee_key.hint": "Необязательно. Новая прошивка Govee требует AES-ключ под конкретную модель — оставьте пустым для старой прошивки.",
- "device.ble.govee_key.placeholder": "32 символа hex, напр. 0102…1f20",
- "device.type.usbhid": "USB HID",
- "device.type.usbhid.desc": "USB RGB peripherals (keyboards, mice)",
- "device.type.spi": "SPI Direct",
- "device.type.spi.desc": "Raspberry Pi GPIO/SPI LED strips",
- "device.type.chroma": "Razer Chroma",
- "device.type.chroma.desc": "Razer peripherals via Chroma SDK",
- "device.type.gamesense": "SteelSeries",
- "device.type.gamesense.desc": "SteelSeries peripherals via GameSense",
- "device.type.group": "Группа",
- "device.type.group.desc": "Объединение нескольких устройств в одно виртуальное",
- "device.group.children": "Дочерние устройства:",
- "device.group.children.hint": "Выберите устройства для группы. Порядок важен в режиме последовательности.",
- "device.group.add_child": "+ Добавить устройство",
- "device.group.select_device": "Выберите устройство",
- "device.group.mode": "Режим группы:",
- "device.group.mode.hint": "Последовательный — LEDs соединяются друг за другом. Независимый — полная лента отражается на каждое устройство.",
- "device.group.mode.sequence": "Последовательный",
- "device.group.mode.sequence.desc": "Объединить светодиоды в одну длинную полосу",
- "device.group.mode.independent": "Независимый",
- "device.group.mode.independent.desc": "Дублировать полосу на каждое устройство отдельно",
- "device.group.move_up": "Вверх",
- "device.group.move_down": "Вниз",
- "device.group.error.no_children": "Добавьте хотя бы одно устройство в группу.",
- "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.dmx_protocol": "Протокол DMX:",
- "device.dmx_protocol.hint": "Art-Net использует UDP порт 6454, sACN (E1.31) — UDP порт 5568",
- "device.dmx_protocol.artnet.desc": "UDP unicast, порт 6454",
- "device.dmx_protocol.sacn.desc": "Multicast/unicast, порт 5568",
- "device.dmx_start_universe": "Начальный Universe:",
- "device.dmx_start_universe.hint": "Первый DMX-юниверс (0-32767). Дополнительные юниверсы используются автоматически при >170 светодиодах.",
- "device.dmx_start_channel": "Начальный канал:",
- "device.dmx_start_channel.hint": "Первый DMX-канал в юниверсе (1-512)",
- "device.dmx.url": "IP адрес:",
- "device.dmx.url.hint": "IP адрес DMX-узла (напр. 192.168.1.50)",
- "device.dmx.url.placeholder": "192.168.1.50",
- "device.ddp.url": "IP-адрес:",
- "device.ddp.url.hint": "Адрес DDP-приёмника. Порт по умолчанию — 4048.",
- "device.ddp.url.placeholder": "192.168.1.50",
- "device.ddp_port": "Порт DDP:",
- "device.ddp_port.hint": "UDP-порт (0 = протокольный по умолчанию 4048).",
- "device.ddp_destination_id": "ID назначения:",
- "device.ddp_destination_id.hint": "Идентификатор назначения DDP (1 = дисплей).",
- "device.ddp_color_order": "Порядок цветов:",
- "device.ddp_color_order.hint": "Порядок байт каналов на линии. Большинство DDP-приёмников ожидают RGB.",
- "device.ddp.color_order.rgb.desc": "Standard RGB byte order",
- "device.ddp.color_order.grb.desc": "WS2812/WS2812B native order",
- "device.ddp.color_order.brg.desc": "BRG byte order",
- "device.ddp.color_order.rbg.desc": "RBG byte order",
- "device.ddp.color_order.bgr.desc": "BGR byte order",
- "device.ddp.color_order.gbr.desc": "GBR byte order",
- "device.opc.url": "IP-адрес:",
- "device.opc.url.hint": "Адрес приёмника OPC. TCP-порт по умолчанию 7890.",
- "device.opc.url.placeholder": "192.168.1.50",
- "device.opc_channel": "Канал:",
- "device.opc_channel.hint": "Канал OPC (0 — широковещательная отправка на все каналы сервера, 1-255 — конкретный выход).",
- "device.serial_port": "Серийный порт:",
- "device.serial_port.hint": "Выберите COM порт устройства Adalight",
- "device.serial_port.none": "Серийные порты не найдены",
- "device.serial_port.select": "Выберите порт...",
- "device.led_count_manual.hint": "Количество светодиодов на ленте (должно совпадать с вашим скетчем Arduino)",
- "device.baud_rate": "Скорость порта:",
- "device.baud_rate.hint": "Скорость серийного соединения. Выше = больше FPS, но требует соответствия скетчу Arduino.",
- "device.led_type": "Тип LED:",
- "device.led_type.hint": "RGB (3 канала) или RGBW (4 канала с выделенным белым)",
- "device.send_latency": "Задержка отправки (мс):",
- "device.send_latency.hint": "Имитация сетевой/серийной задержки на кадр в миллисекундах",
- "device.css_processing_template": "Шаблон Обработки Полос:",
- "device.css_processing_template.hint": "Шаблон обработки по умолчанию, применяемый ко всем цветовым полосам на этом устройстве",
- "device.mqtt_topic": "MQTT Топик:",
- "device.mqtt_topic.hint": "MQTT топик для публикации пиксельных данных (напр. mqtt://ledgrab/device/name)",
- "device.mqtt_topic.placeholder": "mqtt://ledgrab/device/гостиная",
- "device.mqtt_source": "MQTT Брокер:",
- "device.mqtt_source.hint": "К какому MQTT-брокеру публикует это устройство. Брокеры настраиваются в разделе Интеграции → Источники MQTT. Оставьте пустым, чтобы использовать первый доступный брокер.",
- "device.mqtt_source.none": "— Первый доступный брокер",
- "device.ws_url": "URL подключения:",
- "device.ws_url.hint": "WebSocket URL для подключения клиентов и получения LED данных",
- "device.openrgb.url": "OpenRGB URL:",
- "device.openrgb.url.hint": "Адрес сервера OpenRGB (напр. openrgb://localhost:6742/0)",
- "device.openrgb.zone": "Зоны:",
- "device.openrgb.zone.hint": "Выберите зоны LED для управления (оставьте все неотмеченными для всех зон)",
- "device.openrgb.zone.loading": "Загрузка зон…",
- "device.openrgb.zone.error": "Не удалось загрузить зоны",
- "device.openrgb.mode": "Режим зон:",
- "device.openrgb.mode.hint": "Объединённый — все зоны как одна непрерывная LED-лента. Раздельный — каждая зона независимо отображает полный эффект.",
- "device.openrgb.mode.combined": "Объединённая лента",
- "device.openrgb.mode.separate": "Независимые зоны",
- "device.openrgb.added_multiple": "Добавлено {count} устройств",
- "device.url.hint": "IP адрес или имя хоста устройства (напр. http://192.168.1.100)",
- "device.name": "Имя Устройства:",
- "device.name.placeholder": "ТВ в Гостиной",
- "device.url": "URL:",
- "device.url.placeholder": "http://192.168.1.100",
- "device.led_count": "Количество Светодиодов:",
- "dashboard.device.chip": "Чип:",
- "device.led_count.hint": "Количество светодиодов, настроенных в устройстве",
- "device.led_count.hint.auto": "Автоматически определяется из устройства",
- "device.button.add": "Добавить Устройство",
- "device.button.start": "Запустить",
- "device.button.stop": "Остановить",
- "device.button.settings": "Основные настройки",
- "device.button.capture_settings": "Настройки захвата",
- "device.button.calibrate": "Калибровка",
- "device.button.remove": "Удалить",
- "device.button.webui": "Открыть веб-интерфейс устройства",
- "device.button.power_off": "Выключить",
- "device.button.ping": "Пинг устройства",
- "device.ping.online": "Онлайн ({ms}мс)",
- "device.ping.offline": "Устройство недоступно",
- "device.ping.error": "Ошибка пинга",
- "device.power.off_success": "Устройство выключено",
- "device.status.connected": "Подключено",
- "device.status.disconnected": "Отключено",
- "device.status.error": "Ошибка",
- "device.status.processing": "Обработка",
- "device.status.idle": "Ожидание",
- "device.fps": "FPS:",
- "device.display": "Дисплей:",
- "device.remove.confirm": "Вы уверены, что хотите удалить это устройство?",
- "device.added": "Устройство успешно добавлено",
- "device.removed": "Устройство удалено",
- "device.started": "Обработка запущена",
- "device.stopped": "Обработка остановлена",
- "device.metrics.actual_fps": "Факт. FPS",
- "device.metrics.current_fps": "Текущ. FPS",
- "device.metrics.target_fps": "Целев. FPS",
- "device.metrics.potential_fps": "Потенц. FPS",
- "device.metrics.frames": "Кадры",
- "device.metrics.frames_skipped": "Пропущено",
- "device.metrics.keepalive": "Keepalive",
- "device.metrics.errors": "Ошибки",
- "device.metrics.uptime": "Время работы",
- "device.metrics.timing": "Тайминг пайплайна:",
- "device.metrics.device_fps": "Частота обновления устройства",
- "device.health.online": "Онлайн",
- "device.health.offline": "Недоступен",
- "device.health.streaming_unreachable": "Недоступен во время стриминга",
- "device.health.checking": "Проверка...",
- "patch.streaming": "ТРАНСЛЯЦИЯ",
- "patch.standby": "ОЖИДАНИЕ",
- "patch.online": "ОНЛАЙН",
- "patch.offline": "ОФЛАЙН",
- "patch.disconnected": "ОТКЛЮЧЕНО",
- "patch.not_configured": "НЕ НАСТРОЕНО",
- "patch.unreachable": "НЕДОСТУПЕН",
- "patch.checking": "ПРОВЕРКА",
- "patch.ticking": "ИДЁТ",
- "patch.paused": "ПАУЗА",
- "patch.patched": "ПОДКЛЮЧЕНО",
- "patch.preset": "ПРЕСЕТ",
- "patch.source": "ИСТОЧНИК",
- "patch.template": "ШАБЛОН",
- "patch.pipeline": "КОНВЕЙЕР",
- "patch.strip": "ПОЛОСА",
- "patch.value": "ЗНАЧЕНИЕ",
- "patch.ready": "ГОТОВ",
- "patch.polling": "ОПРОС",
- "perf.idle": "простой",
- "perf.offline": "офлайн",
- "perf.online": "онлайн",
- "perf.no_devices": "нет устройств",
- "perf.all_online": "все онлайн",
- "perf.online_count": "{count} онлайн",
- "perf.offline_count": "{count} офлайн",
- "perf.total_bytes": "всего {bytes}",
- "perf.max_ms": "макс {ms}мс",
- "perf.targets_count.one": "{count} цель",
- "perf.targets_count.few": "{count} цели",
- "perf.targets_count.many": "{count} целей",
- "perf.no_captures": "нет источников",
- "perf.captures_count.one": "{count} источник",
- "perf.captures_count.few": "{count} источника",
- "perf.captures_count.many": "{count} источников",
- "perf.ratio_of_requested": "{percent}% от запрошенного · {captures}",
- "perf.total_count": "{count} всего",
- "perf.skipped_per_sec": "{rate} пропущ/с",
- "perf.tip.now": "сейчас",
- "perf.tip.ago": "−{seconds}с",
- "device.last_seen.label": "Последний раз",
- "device.last_seen.just_now": "только что",
- "device.last_seen.seconds": "%d с назад",
- "device.last_seen.minutes": "%d мин назад",
- "device.last_seen.hours": "%d ч назад",
- "device.last_seen.days": "%d д назад",
- "device.tutorial.start": "Начать обучение",
- "device.tip.identity": "Идентификация устройства — имя, тип и индикатор онлайн/офлайн.",
- "device.tip.metadata": "Адрес устройства и версия прошивки. Кликните по URL, чтобы открыть веб-интерфейс устройства.",
- "device.tip.brightness": "Перетащите для регулировки яркости. Изменения применяются мгновенно.",
- "device.brightness": "Яркость",
- "device.tip.ping": "Пинг устройства — обновляет статус и измеряет задержку.",
- "device.tip.settings": "Открыть настройки устройства — имя, URL, возможности и проверки соединения.",
- "device.tip.menu": "Дополнительные действия — дублировать, скрыть или удалить устройство.",
- "device.tip.add": "Нажмите, чтобы добавить новое LED устройство",
- "settings.title": "Настройки",
- "settings.tab.general": "Основные",
- "settings.tab.backup": "Бэкап",
- "settings.tab.mqtt": "MQTT",
- "settings.tab.appearance": "Оформление",
- "settings.logs.open_viewer": "Открыть логи",
- "settings.external_url.label": "Внешний URL",
- "settings.external_url.hint": "Если указан, этот базовый URL используется в URL-ах вебхуков и других пользовательских ссылках вместо автоопределённого локального IP. Пример: https://myserver.example.com:8080",
- "settings.external_url.placeholder": "https://myserver.example.com:8080",
- "settings.external_url.save": "Сохранить",
- "settings.external_url.saved": "Внешний URL сохранён",
- "settings.external_url.save_error": "Не удалось сохранить внешний URL",
- "settings.general.title": "Основные Настройки",
- "settings.section.identity": "Идентификация",
- "settings.section.connection": "Подключение",
- "settings.section.hardware": "Оборудование",
- "settings.section.behavior": "Поведение",
- "settings.section.provider": "Провайдер",
- "settings.section.refresh": "Обновление",
- "settings.section.filters": "Фильтры",
- "settings.section.routing": "Маршрутизация",
- "settings.section.output": "Вывод",
- "settings.section.filtering": "Фильтрация",
- "settings.section.broker": "Брокер",
- "settings.section.protocol": "Протокол",
- "settings.section.adapter": "Адаптер",
- "settings.section.mappings": "Сопоставления",
- "settings.section.diagnostics": "Диагностика",
- "settings.section.source": "Источник",
- "settings.section.engine": "Движок",
- "settings.section.timing": "Тайминг",
- "settings.section.gradient": "Градиент",
- "settings.section.layout": "Раскладка",
- "settings.section.strip": "Лента",
- "settings.section.type": "Тип",
- "settings.section.notes": "Заметки",
- "settings.section.file": "Файл",
- "settings.section.auth": "Авторизация",
- "settings.section.configure": "Настройка",
- "settings.section.restart": "Перезапуск",
- "settings.section.loopback": "Локальный доступ",
- "settings.section.test_setup": "Параметры теста",
- "settings.section.offsets": "Смещения",
- "settings.section.line_properties": "Параметры линии",
- "settings.section.test": "Тест",
- "settings.section.preview": "Превью",
- "settings.section.controls": "Управление",
- "settings.section.history": "История",
- "ha_source.use_ssl.hint": "Включите для HTTPS / wss соединений с Home Assistant",
- "game_integration.enabled.hint": "Отключённые интеграции перестают опрашивать и генерировать события",
- "settings.capture.title": "Настройки Захвата",
- "settings.capture.saved": "Настройки захвата обновлены",
- "settings.capture.failed": "Не удалось сохранить настройки захвата",
- "settings.brightness": "Яркость:",
- "settings.brightness.hint": "Общая яркость для этого устройства (0-100%)",
- "settings.url.hint": "IP адрес или имя хоста устройства",
- "settings.display_index": "Дисплей:",
- "settings.display_index.hint": "Какой экран захватывать для этого устройства",
- "settings.fps": "Целевой FPS:",
- "settings.fps.hint": "Целевая частота кадров (10-90)",
- "settings.capture_template": "Шаблон Движка:",
- "settings.capture_template.hint": "Движок захвата экрана и конфигурация для этого устройства",
- "settings.button.cancel": "Отмена",
- "settings.health_interval": "Интервал Проверки (с):",
- "settings.health_interval.hint": "Как часто проверять статус устройства (5-600 секунд)",
- "settings.auto_shutdown": "Авто-восстановление:",
- "settings.auto_shutdown.hint": "Восстанавливать устройство в режим ожидания при остановке целей или сервера",
- "settings.button.save": "Сохранить Изменения",
- "settings.saved": "Настройки успешно сохранены",
- "settings.failed": "Не удалось сохранить настройки",
- "calibration.title": "Калибровка Светодиодов",
- "calibration.tip.led_count": "Укажите количество LED на каждой стороне",
- "calibration.tip.start_corner": "Нажмите на угол для выбора стартовой позиции",
- "calibration.tip.direction": "Переключение направления ленты (по часовой / против часовой)",
- "calibration.tip.offset": "Смещение LED — расстояние от LED 0 до стартового угла",
- "calibration.tip.span": "Перетащите зелёные полосы для настройки зоны покрытия",
- "calibration.tip.test": "Нажмите на край для теста LED",
- "calibration.tip.overlay": "Включите оверлей для отображения позиций и нумерации LED на мониторе",
- "calibration.tip.toggle_inputs": "Нажмите на общее количество LED для скрытия боковых полей",
- "calibration.tip.border_width": "Сколько пикселей от края экрана использовать для цветов LED",
- "calibration.tip.skip_leds_start": "Пропуск LED в начале ленты — пропущенные LED остаются выключенными",
- "calibration.tip.skip_leds_end": "Пропуск LED в конце ленты — пропущенные LED остаются выключенными",
- "tour.welcome": "Добро пожаловать в LED Grab! Этот краткий тур познакомит вас с интерфейсом. Используйте стрелки или кнопки для навигации.",
- "tour.dashboard": "Дашборд — обзор запущенных целей, автоматизаций и состояния устройств.",
- "tour.targets": "Цели — добавляйте WLED-устройства, настраивайте LED-цели с захватом и калибровкой.",
- "tour.sources": "Источники — управление шаблонами захвата, источниками изображений, звука и цветовых полос.",
- "tour.integrations": "Интеграции — подключайте внешние сервисы: погоду, Home Assistant, MQTT и игровые интеграции.",
- "tour.graph": "Граф — визуальный обзор всех сущностей и их связей. Перетаскивайте порты для соединения, правый клик по связям для отключения.",
- "tour.automations": "Автоматизации — автоматизируйте переключение сцен по расписанию, звуку или значениям.",
- "tour.settings": "Настройки — резервное копирование и восстановление конфигурации.",
- "tour.api": "API Документация — интерактивная документация REST API на базе Swagger.",
- "tour.search": "Поиск — быстрый поиск и переход к любому объекту по Ctrl+K.",
- "tour.theme": "Тема — переключение между тёмной и светлой темой.",
- "tour.accent": "Цвет акцента — настройте цвет интерфейса по своему вкусу.",
- "tour.language": "Язык — выберите предпочитаемый язык интерфейса.",
- "tour.restart": "Запустить тур заново",
- "tour.dash.perf": "Производительность — графики FPS в реальном времени, метрики задержки и интервал опроса.",
- "tour.dash.targets": "Каналы — все ваши цели в одном месте, разделённые на запущенные и остановленные.",
- "tour.dash.running": "Запущенные цели — метрики стриминга и быстрая остановка.",
- "tour.dash.stopped": "Остановленные цели — готовы к запуску одним нажатием.",
- "tour.dash.automations": "Автоматизации — статус активных автоматизаций и быстрое включение/выключение.",
- "tour.dash.scenes": "Пресеты сцен — сохранённые состояния системы, применяются одним кликом.",
- "tour.dash.sync_clocks": "Синхро-часы — общие таймеры для синхронизации анимаций между источниками.",
- "tour.dash.integrations": "Интеграции — статус подключения для Weather, Home Assistant и MQTT.",
- "tour.dash.customize_btn": "Кнопка «Настроить» — открывает боковую панель, где можно изменить порядок секций, скрыть их или подстроить раскладку дашборда.",
- "tour.dash.customize_panel": "Настройка дашборда — центр управления раскладкой. Изменения применяются мгновенно; закрытие — Esc или кнопка ×.",
- "tour.dash.customize_presets": "Пресеты — применяйте готовые раскладки (компактная, фокус, полная) одним кликом. Выбор пресета сбрасывает ручные настройки.",
- "tour.dash.customize_global": "Глобальные настройки — ширина контента, уровень анимаций, режим производительности (system/app/both) и окно выборки графиков.",
- "tour.dash.customize_sections": "Секции — перетаскивайте для смены порядка; «глаз» скрывает; «шеврон» делает секцию свёрнутой по умолчанию. Также для каждой секции можно выбрать плотность.",
- "tour.dash.customize_perf_cells": "Ячейки производительности — выбирайте, какие метрики отображать в секции Performance, настраивайте ширину, окно выборки и шкалу Y.",
- "tour.tgt.nav": "Используйте этот выпадающий список для переключения между типами целей: LED-устройства, LED-цели и лампы Home Assistant.",
- "tour.tgt.devices": "Устройства — ваши LED-контроллеры, найденные в сети.",
- "tour.tgt.css": "Цветовые полосы — определите, как области экрана соответствуют сегментам LED.",
- "tour.tgt.targets": "LED-цели — объедините устройство, цветовую полосу и источник захвата для стриминга.",
- "tour.tgt.ha_light_targets": "Цели HA-ламп — выберите лампу Home Assistant и источник цвета/значения для управления.",
- "tour.src.nav": "Используйте этот выпадающий список для переключения между типами источников — изображения, цветовые полосы, аудио, значения, синхронизация, ассеты.",
- "tour.src.raw": "Raw — источники захвата экрана с ваших дисплеев.",
- "tour.src.templates": "Шаблоны захвата — переиспользуемые конфигурации (разрешение, FPS, обрезка).",
- "tour.src.static": "Статичные изображения — тестируйте настройку с файлами изображений.",
- "tour.src.processed": "Обработка — применяйте эффекты: размытие, яркость, цветокоррекция.",
- "tour.src.color_strip": "Цветовые полосы — определяют, как области экрана сопоставляются с LED-сегментами.",
- "tour.src.audio": "Аудио — захват микрофона или системного звука и обработка через шаблоны для реактивных эффектов.",
- "tour.src.value": "Источники значений — динамические числа или цвета, управляемые временем суток, аудио, системными метриками, сущностями Home Assistant, градиентами или расписаниями. Используются для анимации эффектов, модуляции цветовых полос и триггеров автоматизаций.",
- "tour.src.sync": "Синхро-часы — общие таймеры для синхронизации анимаций между несколькими источниками.",
- "tour.auto.list": "Автоматизации — автоматизируйте активацию сцен по времени, звуку или значениям.",
- "tour.auto.add": "Нажмите + для создания новой автоматизации с условиями и сценой для активации.",
- "tour.auto.card": "Каждая карточка показывает статус автоматизации, условия и кнопки управления.",
- "tour.auto.scenes_list": "Сцены — сохранённые состояния системы, которые автоматизации могут активировать или вы можете применить вручную.",
- "tour.auto.scenes_add": "Нажмите + для захвата текущего состояния системы как нового пресета сцены.",
- "tour.auto.scenes_card": "Каждая карточка сцены показывает количество целей/устройств. Нажмите для редактирования, перезахвата или активации.",
- "tour.int.nav": "Используйте этот выпадающий список для переключения между типами интеграций: погода, Home Assistant, MQTT и игровые интеграции.",
- "tour.int.weather": "Погода — получайте данные о погоде (температура, условия, прогноз) в виде источников значений для эффектов от окружающей среды.",
- "tour.int.home_assistant": "Home Assistant — подключение к экземпляру HA. Лампы, датчики и сущности становятся источниками значений и целями вывода.",
- "tour.int.mqtt": "MQTT — подписывайтесь на топики брокера для передачи данных внешних датчиков, автоматизаций или удалённых триггеров в LedGrab.",
- "tour.int.game": "Игры — реакция на игровые события (Minecraft, Hammer of God и др.) с активацией сцен и цветовых эффектов на основе состояния игры.",
- "calibration.tutorial.start": "Начать обучение",
- "calibration.overlay_toggle": "Оверлей",
- "calibration.start_position": "Начальная Позиция:",
- "calibration.position.bottom_left": "Нижний Левый",
- "calibration.position.bottom_right": "Нижний Правый",
- "calibration.position.top_left": "Верхний Левый",
- "calibration.position.top_right": "Верхний Правый",
- "calibration.direction": "Направление:",
- "calibration.direction.clockwise": "По Часовой Стрелке",
- "calibration.direction.counterclockwise": "Против Часовой Стрелки",
- "calibration.leds.top": "Светодиодов Сверху:",
- "calibration.leds.right": "Светодиодов Справа:",
- "calibration.leds.bottom": "Светодиодов Снизу:",
- "calibration.leds.left": "Светодиодов Слева:",
- "calibration.offset": "Смещение LED:",
- "calibration.offset.hint": "Расстояние от физического LED 0 до стартового угла (по направлению ленты)",
- "calibration.skip_start": "Пропуск LED (начало):",
- "calibration.skip_start.hint": "Количество LED, которые будут выключены в начале ленты (0 = нет)",
- "calibration.skip_end": "Пропуск LED (конец):",
- "calibration.skip_end.hint": "Количество LED, которые будут выключены в конце ленты (0 = нет)",
- "calibration.border_width": "Граница (px):",
- "calibration.roi": "Область захвата (%):",
- "calibration.roi.hint": "Брать пиксели только из этого прямоугольника экрана, чтобы панель задач, интерфейс игры или чёрные полосы не искажали цвета краёв. Весь экран = X/Y 0, Ширина/Высота 100.",
- "calibration.roi.x": "X (%)",
- "calibration.roi.y": "Y (%)",
- "calibration.roi.width": "Ширина (%)",
- "calibration.roi.height": "Высота (%)",
- "calibration.border_width.hint": "Сколько пикселей от края экрана выбирать для цвета LED (1-100)",
- "calibration.button.cancel": "Отмена",
- "calibration.button.save": "Сохранить",
- "calibration.saved": "Калибровка сохранена",
- "calibration.failed": "Не удалось сохранить калибровку",
- "server.healthy": "Сервер онлайн",
- "server.offline": "Сервер офлайн",
- "error.unauthorized": "Не авторизован - пожалуйста, войдите",
- "error.network": "Сетевая ошибка",
- "error.unknown": "Произошла ошибка",
- "modal.discard_changes": "У вас есть несохранённые изменения. Отменить их?",
- "confirm.title": "Подтверждение",
- "confirm.yes": "Да",
- "confirm.no": "Нет",
- "confirm.stop_all": "Остановить все запущенные цели?",
- "confirm.turn_off_device": "Выключить это устройство?",
- "common.loading": "Загрузка...",
- "common.delete": "Удалить",
- "common.remove": "Убрать",
- "common.edit": "Редактировать",
- "common.clone": "Клонировать",
- "common.hide": "Скрыть карточку",
- "common.more_actions": "Ещё действия",
- "common.card_color": "Цвет карточки",
- "common.none": "Нет",
- "common.none_no_cspt": "Нет (без шаблона обработки)",
- "common.none_no_input": "Нет (без источника)",
- "common.none_own_speed": "Нет (своя скорость)",
- "common.undo": "Отменить",
- "common.cancel": "Отмена",
- "common.back": "Назад",
- "common.apply": "Применить",
- "common.start": "ПУСК",
- "common.stop": "СТОП",
- "common.led_preview": "Превью LED",
- "device.icon.eyebrow": "Иконка карточки",
- "device.icon.title": "Выберите иконку",
- "device.icon.for": "для",
- "device.icon.choose": "Выбрать иконку…",
- "device.icon.change": "Изменить иконку…",
- "device.icon.remove": "Удалить иконку",
- "device.icon.search.placeholder": "Поиск иконок…",
- "device.icon.color_toggle": "Цвет",
- "device.icon.recent": "Недавние",
- "device.icon.empty": "Иконки не найдены.",
- "device.icon.hint": "↵ Применить · Esc Отмена",
- "device.icon.saved": "Иконка сохранена",
- "device.icon.error.save_failed": "Не удалось сохранить иконку",
- "device.icon.cat.all": "Все",
- "device.icon.cat.hardware": "Оборудование",
- "device.icon.cat.lighting": "Освещение",
- "device.icon.cat.rooms": "Комнаты",
- "device.icon.cat.media": "Медиа",
- "device.icon.cat.signal": "Сигнал",
- "device.icon.cat.ambience": "Атмосфера",
- "device.icon.cat.weather": "Погода",
- "device.icon.cat.nature": "Природа",
- "device.icon.cat.controls": "Управление",
- "device.icon.cat.status": "Состояние",
- "device.icon.cat.office": "Офис",
- "device.icon.phone": "Телефон",
- "device.icon.package": "Устройство",
- "device.icon.code": "Код",
- "device.icon.laptop": "Ноутбук",
- "device.icon.server": "Сервер",
- "device.icon.router": "Маршрутизатор",
- "device.icon.webcam": "Веб-камера",
- "device.icon.bot": "Бот",
- "device.icon.watch": "Умные часы",
- "device.icon.mcu": "Микроконтроллер",
- "device.icon.dim": "Приглушённый свет",
- "device.icon.ring": "Кольцевая лампа",
- "device.icon.point": "Точечный свет",
- "device.icon.ceiling": "Потолочный светильник",
- "device.icon.desk_lamp": "Настольная лампа",
- "device.icon.wall_light": "Настенный светильник",
- "device.icon.flashlight": "Фонарик",
- "device.icon.bulb_off": "Лампа выключена",
- "device.icon.candle": "Свеча",
- "device.icon.kitchen": "Кухня",
- "device.icon.bath": "Ванная",
- "device.icon.garage": "Гараж",
- "device.icon.outdoor": "Улица",
- "device.icon.projector": "Проектор",
- "device.icon.camcorder": "Видеокамера",
- "device.icon.disc": "Диск",
- "device.icon.image": "Изображение",
- "device.icon.audio_file": "Аудиофайл",
- "device.icon.send": "Отправить",
- "device.icon.rain": "Дождь",
- "device.icon.snow": "Снег",
- "device.icon.thunder": "Гроза",
- "device.icon.fog": "Туман",
- "device.icon.wind": "Ветер",
- "device.icon.snowflake": "Снежинка",
- "device.icon.umbrella": "Зонт",
- "device.icon.sunrise": "Восход",
- "device.icon.sunset": "Закат",
- "device.icon.tree": "Дерево",
- "device.icon.flower": "Цветок",
- "device.icon.mountain": "Гора",
- "device.icon.waves": "Волны",
- "device.icon.sprout": "Росток",
- "device.icon.water_drops": "Капли воды",
- "device.icon.leaf": "Лист",
- "device.icon.switch": "Переключатель",
- "device.icon.slider": "Слайдер",
- "device.icon.settings": "Настройки",
- "device.icon.refresh": "Обновить",
- "device.icon.undo": "Отменить",
- "device.icon.trash": "Корзина",
- "device.icon.link": "Ссылка",
- "device.icon.search": "Поиск",
- "device.icon.add": "Добавить",
- "device.icon.show": "Показать",
- "device.icon.lock": "Замок",
- "device.icon.key": "Ключ",
- "device.icon.tool": "Инструмент",
- "device.icon.check": "Галочка",
- "device.icon.ok": "ОК",
- "device.icon.warning": "Внимание",
- "device.icon.help": "Справка",
- "device.icon.off": "Отключено",
- "device.icon.shield": "Щит",
- "device.icon.target": "Цель",
- "device.icon.pulse": "Пульс",
- "device.icon.trend": "Тренд",
- "device.icon.battery": "Батарея",
- "device.icon.calendar": "Календарь",
- "device.icon.mail": "Почта",
- "device.icon.coffee": "Кофе",
- "device.icon.briefcase": "Портфель",
- "device.icon.doc": "Документ",
- "device.icon.checklist": "Список",
- "device.icon.hashtag": "Хэштег",
- "device.icon.clock": "Часы",
- "device.icon.entity.device": "Устройство",
- "device.icon.entity.target": "LED-цель",
- "device.icon.entity.ha_light_target": "HA-светильник",
- "device.icon.entity.picture_source": "Источник изображения",
- "device.icon.entity.audio_source": "Источник аудио",
- "device.icon.entity.weather_source": "Источник погоды",
- "device.icon.entity.value_source": "Источник значения",
- "device.icon.entity.mqtt_source": "Источник MQTT",
- "device.icon.entity.ha_source": "Источник Home Assistant",
- "device.icon.entity.automation": "Автоматизация",
- "device.icon.entity.scene_preset": "Сцена",
- "device.icon.entity.scene_playlist": "Плейлист",
- "device.icon.entity.sync_clock": "Часы синхронизации",
- "device.icon.entity.game_integration": "Игровая интеграция",
- "device.icon.entity.audio_processing_template": "Шаблон обработки аудио",
- "device.icon.entity.pattern_template": "Шаблон паттерна",
- "device.icon.entity.capture_template": "Шаблон захвата",
- "device.icon.entity.pp_template": "Шаблон постобработки",
- "device.icon.entity.cspt": "Шаблон обработки полоски",
- "device.icon.entity.audio_template": "Аудиошаблон",
- "device.icon.entity.gradient": "Градиент",
- "device.icon.entity.color_strip_source": "Цветная полоска",
- "device.icon.entity.asset": "Ассет",
- "device.icon.inherited_from": "Унаследовано от %s",
- "device.icon.override_inherited": "Заменить унаследованную иконку…",
- "device.icon.use_inherited": "Использовать унаследованную",
- "validation.required": "Обязательное поле",
- "bulk.processing": "Обработка…",
- "api.error.timeout": "Превышено время ожидания — попробуйте снова",
- "api.error.network": "Ошибка сети — проверьте подключение",
- "palette.search": "Поиск…",
- "section.filter.placeholder": "Фильтр...",
- "section.filter.reset": "Очистить фильтр",
- "tags.label": "Теги",
- "tags.hint": "Назначьте теги для группировки и фильтрации карточек",
- "tags.placeholder": "Добавить тег...",
- "section.expand_all": "Развернуть все секции",
- "section.collapse_all": "Свернуть все секции",
- "streams.title": "Входы",
- "integrations.title": "Интеграции",
- "streams.description": "Источники определяют конвейер захвата. Сырой источник захватывает экран с помощью шаблона захвата. Обработанный источник применяет постобработку к другому источнику. Назначайте источники устройствам.",
- "streams.group.raw": "Источники",
- "streams.group.raw_templates": "Шаблоны движка",
- "streams.group.processed": "Источники",
- "streams.group.proc_templates": "Шаблоны фильтров",
- "streams.group.css_processing": "Шаблоны Обработки",
- "streams.group.color_strip": "Цветовые Полосы",
- "streams.group.audio": "Аудио",
- "streams.group.audio_templates": "Аудио шаблоны",
- "streams.section.streams": "Источники",
- "streams.add": "Добавить Источник",
- "streams.add.raw": "Добавить Захват Экрана",
- "streams.add.processed": "Добавить Обработанный",
- "streams.edit": "Редактировать Источник",
- "streams.edit.raw": "Редактировать Захват Экрана",
- "streams.edit.processed": "Редактировать Обработанный Источник",
- "streams.name": "Имя Источника:",
- "streams.name.placeholder": "Мой Источник",
- "streams.type": "Тип:",
- "streams.type.raw": "Захват экрана",
- "streams.type.processed": "Обработанный",
- "streams.display": "Дисплей:",
- "streams.display.hint": "Какой экран захватывать",
- "streams.capture_template": "Шаблон Движка:",
- "streams.capture_template.hint": "Шаблон движка, определяющий способ захвата экрана",
- "streams.target_fps": "Целевой FPS:",
- "streams.target_fps.hint": "Целевое количество кадров в секунду (1-90)",
- "streams.source": "Источник:",
- "streams.source.hint": "Источник, к которому применяются фильтры обработки",
- "streams.pp_template": "Шаблон Фильтра:",
- "streams.pp_template.hint": "Шаблон фильтра для применения к источнику",
- "streams.description_label": "Описание (необязательно):",
- "streams.description_placeholder": "Опишите этот источник...",
- "streams.created": "Источник успешно создан",
- "streams.updated": "Источник успешно обновлён",
- "streams.deleted": "Источник успешно удалён",
- "streams.delete.confirm": "Вы уверены, что хотите удалить этот источник?",
- "streams.modal.loading": "Загрузка...",
- "streams.error.load": "Не удалось загрузить источники",
- "streams.error.required": "Пожалуйста, заполните все обязательные поля",
- "streams.error.delete": "Не удалось удалить источник",
- "streams.test.title": "Тест Источника",
- "streams.test.run": "Запустить",
- "streams.test.running": "Тестирование источника...",
- "streams.test.duration": "Длительность Захвата (с):",
- "streams.test.error.failed": "Тест источника не удался",
- "postprocessing.title": "Шаблоны Фильтров",
- "postprocessing.description": "Шаблоны обработки определяют фильтры изображений и цветокоррекцию. Назначайте их обработанным источникам для единообразной постобработки на всех устройствах.",
- "postprocessing.add": "Добавить Шаблон Фильтра",
- "postprocessing.edit": "Редактировать Шаблон Фильтра",
- "postprocessing.name": "Имя Шаблона:",
- "postprocessing.name.placeholder": "Мой Шаблон Фильтра",
- "filters.select_type": "Выберите тип фильтра...",
- "filters.add": "Добавить фильтр",
- "filters.remove": "Удалить",
- "filters.drag_to_reorder": "Перетащите для изменения порядка",
- "filters.empty": "Фильтры не добавлены. Используйте селектор ниже для добавления.",
- "filters.brightness": "Яркость",
- "filters.brightness.desc": "Регулировка общей яркости изображения",
- "filters.saturation": "Насыщенность",
- "filters.saturation.desc": "Усиление или снижение интенсивности цвета",
- "filters.gamma": "Гамма",
- "filters.gamma.desc": "Нелинейная коррекция кривой яркости",
- "filters.downscaler": "Уменьшение",
- "filters.downscaler.desc": "Снижение разрешения для быстрой обработки",
- "filters.pixelate": "Пикселизация",
- "filters.pixelate.desc": "Мозаичное усреднение блоков",
- "filters.auto_crop": "Авто Обрезка",
- "filters.auto_crop.desc": "Удаление чёрных полос из леттербокса",
- "filters.flip": "Отражение",
- "filters.flip.desc": "Зеркальное отражение по горизонтали или вертикали",
- "filters.color_correction": "Цветокоррекция",
- "filters.color_correction.desc": "Баланс белого и цветовая температура",
- "filters.filter_template": "Шаблон фильтров",
- "filters.filter_template.desc": "Встроить другой шаблон обработки",
- "filters.css_filter_template": "Шаблон Фильтра Полос",
- "filters.css_filter_template.desc": "Встроить другой шаблон обработки полос",
- "filters.frame_interpolation": "Интерполяция кадров",
- "filters.frame_interpolation.desc": "Сглаживание между кадрами",
- "filters.noise_gate": "Шумоподавление",
- "filters.noise_gate.desc": "Подавление малых изменений цвета ниже порога",
- "filters.palette_quantization": "Квантизация палитры",
- "filters.palette_quantization.desc": "Сокращение цветов до ограниченной палитры",
- "filters.reverse": "Реверс",
- "filters.reverse.desc": "Изменить порядок светодиодов на обратный",
- "postprocessing.description_label": "Описание (необязательно):",
- "postprocessing.description_placeholder": "Опишите этот шаблон...",
- "postprocessing.created": "Шаблон успешно создан",
- "postprocessing.updated": "Шаблон успешно обновлён",
- "postprocessing.deleted": "Шаблон успешно удалён",
- "postprocessing.delete.confirm": "Вы уверены, что хотите удалить этот шаблон фильтра?",
- "postprocessing.error.load": "Не удалось загрузить шаблоны фильтров",
- "postprocessing.error.required": "Пожалуйста, заполните все обязательные поля",
- "postprocessing.error.delete": "Не удалось удалить шаблон фильтра",
- "postprocessing.config.show": "Показать настройки",
- "postprocessing.test.title": "Тест шаблона фильтра",
- "postprocessing.test.source_stream": "Источник:",
- "postprocessing.test.running": "Тестирование шаблона фильтра...",
- "postprocessing.test.error.no_stream": "Пожалуйста, выберите источник",
- "postprocessing.test.error.failed": "Тест шаблона фильтра не удался",
- "css_processing.title": "Шаблоны Обработки Полос",
- "css_processing.add": "Добавить Шаблон Обработки Полос",
- "css_processing.edit": "Редактировать Шаблон Обработки Полос",
- "css_processing.name": "Имя Шаблона:",
- "css_processing.name_placeholder": "Мой Шаблон Обработки Полос",
- "css_processing.description_label": "Описание (необязательно):",
- "css_processing.description_placeholder": "Опишите этот шаблон...",
- "css_processing.created": "Шаблон обработки полос создан",
- "css_processing.updated": "Шаблон обработки полос обновлён",
- "css_processing.deleted": "Шаблон обработки полос удалён",
- "css_processing.delete.confirm": "Вы уверены, что хотите удалить этот шаблон обработки полос?",
- "css_processing.error.required": "Заполните все обязательные поля",
- "css_processing.error.load": "Ошибка загрузки шаблона обработки полос",
- "css_processing.error.delete": "Ошибка удаления шаблона обработки полос",
- "css_processing.error.clone_failed": "Не удалось клонировать шаблон обработки полос",
- "device.button.stream_selector": "Настройки источника",
- "device.stream_settings.title": "Настройки источника",
- "device.stream_selector.label": "Источник:",
- "device.stream_selector.hint": "Выберите источник, определяющий что это устройство захватывает и обрабатывает",
- "device.stream_selector.none": "-- Источник не назначен --",
- "device.stream_selector.saved": "Настройки источника обновлены",
- "device.stream_settings.border_width": "Ширина границы (px):",
- "device.stream_settings.border_width_hint": "Сколько пикселей от края экрана выбирать для цвета LED (1-100)",
- "device.stream_settings.interpolation": "Режим интерполяции:",
- "device.stream_settings.interpolation.average": "Среднее",
- "device.stream_settings.interpolation.median": "Медиана",
- "device.stream_settings.interpolation.dominant": "Доминантный",
- "device.stream_settings.interpolation_hint": "Как вычислять цвет LED из выбранных пикселей",
- "device.stream_settings.smoothing": "Сглаживание:",
- "device.stream_settings.smoothing_hint": "Временное смешивание между кадрами (0=нет, 1=полное). Уменьшает мерцание.",
- "device.tip.stream_selector": "Настройки источника и проекции LED для этого устройства",
- "streams.group.static_image": "Статические",
- "streams.add.static_image": "Добавить статическое изображение (источник)",
- "streams.edit.static_image": "Редактировать статическое изображение (источник)",
- "streams.type.static_image": "Статическое изображение",
- "streams.group.video": "Видео",
- "streams.add.video": "Добавить видеоисточник",
- "streams.edit.video": "Редактировать видеоисточник",
- "picture_source.type.video": "Видео",
- "picture_source.type.video.desc": "Потоковые кадры из загруженного видео",
- "picture_source.video.loop": "Зацикливание:",
- "picture_source.video.speed": "Скорость воспроизведения:",
- "picture_source.video.start_time": "Время начала (с):",
- "picture_source.video.end_time": "Время окончания (с):",
- "picture_source.video.resolution_limit": "Макс. ширина (px):",
- "picture_source.video.resolution_limit.hint": "Уменьшение видео при декодировании для производительности",
- "streams.image_asset": "Изображение:",
- "streams.image_asset.select": "Выберите изображение…",
- "streams.image_asset.search": "Поиск изображений…",
- "streams.video_asset": "Видео:",
- "streams.video_asset.select": "Выберите видео…",
- "streams.video_asset.search": "Поиск видео…",
- "targets.title": "Каналы",
- "targets.description": "Цели связывают источники цветовых полос с устройствами вывода. Каждая цель ссылается на устройство и источник цветовой полосы.",
- "targets.subtab.wled": "LED",
- "targets.subtab.led": "LED",
- "targets.section.devices": "Устройства",
- "targets.section.color_strips": "Источники цветовых полос",
- "targets.section.targets": "Цели",
- "targets.section.specific_settings": "Специальные настройки",
- "targets.section.advanced": "Расширенные",
- "targets.add": "Добавить Цель",
- "targets.edit": "Редактировать Цель",
- "targets.loading": "Загрузка целей...",
- "targets.none": "Цели не настроены",
- "targets.failed": "Не удалось загрузить цели",
- "targets.name": "Имя Цели:",
- "targets.name.placeholder": "Моя Цель",
- "targets.device": "Устройство:",
- "targets.device.hint": "Выберите LED устройство для передачи данных",
- "targets.device.none": "-- Выберите устройство --",
- "targets.color_strip_source": "Источник цветовой полосы:",
- "targets.color_strip_source.hint": "Выберите источник цветовой полосы, который предоставляет цвета LED для этой цели",
- "targets.no_css": "Нет источника",
- "targets.source": "Источник:",
- "targets.source.hint": "Какой источник изображения захватывать и обрабатывать",
- "targets.source.none": "-- Источник не назначен --",
- "targets.fps": "Целевой FPS:",
- "targets.fps.hint": "Целевая частота кадров для захвата и обновления LED (1-90)",
- "targets.fps.rec": "Макс. аппаратный ≈ {fps} fps ({leds} LED)",
- "targets.border_width": "Ширина границы (px):",
- "targets.border_width.hint": "Сколько пикселей от края экрана выбирать для цвета LED (1-100)",
- "targets.interpolation": "Режим интерполяции:",
- "targets.interpolation.hint": "Как вычислять цвет LED из выбранных пикселей",
- "targets.interpolation.average": "Среднее",
- "targets.interpolation.median": "Медиана",
- "targets.interpolation.dominant": "Доминантный",
- "targets.smoothing": "Сглаживание:",
- "targets.smoothing.hint": "Временное смешивание между кадрами (0=нет, 1=полное). Уменьшает мерцание.",
- "targets.keepalive_interval": "Интервал поддержания связи:",
- "targets.keepalive_interval.hint": "Как часто повторно отправлять последний кадр при статичном источнике для удержания устройства в режиме live (0.5-5.0с)",
- "targets.created": "Цель успешно создана",
- "targets.updated": "Цель успешно обновлена",
- "targets.deleted": "Цель успешно удалена",
- "targets.delete.confirm": "Вы уверены, что хотите удалить эту цель?",
- "targets.error.load": "Не удалось загрузить цели",
- "targets.error.required": "Пожалуйста, заполните все обязательные поля",
- "targets.error.name_required": "Введите название цели",
- "targets.error.delete": "Не удалось удалить цель",
- "targets.button.start": "Запустить",
- "targets.button.stop": "Остановить",
- "targets.status.processing": "Обработка",
- "targets.status.idle": "Ожидание",
- "targets.status.error": "Ошибка",
- "targets.metrics.actual_fps": "Факт. FPS",
- "targets.metrics.target_fps": "Целев. FPS",
- "targets.metrics.frames": "Кадры",
- "targets.metrics.errors": "Ошибки",
- "targets.section.pattern_templates": "Шаблоны Паттернов",
- "pattern.add": "Добавить Шаблон Паттерна",
- "pattern.edit": "Редактировать Шаблон Паттерна",
- "pattern.name": "Имя Шаблона:",
- "pattern.name.placeholder": "Мой Шаблон Паттерна",
- "pattern.description_label": "Описание (необязательно):",
- "pattern.description_placeholder": "Опишите этот паттерн...",
- "pattern.rectangles": "Прямоугольники",
- "pattern.rect.name": "Имя",
- "pattern.rect.x": "X",
- "pattern.rect.y": "Y",
- "pattern.rect.width": "Ш",
- "pattern.rect.height": "В",
- "pattern.rect.add": "Добавить Прямоугольник",
- "pattern.rect.remove": "Удалить",
- "pattern.rect.empty": "Прямоугольники не определены. Добавьте хотя бы один.",
- "pattern.created": "Шаблон паттерна успешно создан",
- "pattern.updated": "Шаблон паттерна успешно обновлён",
- "pattern.deleted": "Шаблон паттерна успешно удалён",
- "pattern.delete.confirm": "Вы уверены, что хотите удалить этот шаблон паттерна?",
- "pattern.delete.referenced": "Невозможно удалить: шаблон используется целью",
- "pattern.error.required": "Пожалуйста, заполните все обязательные поля",
- "pattern.visual_editor": "Визуальный Редактор",
- "pattern.capture_bg": "Захватить Фон",
- "pattern.source_for_bg": "Источник для Фона:",
- "pattern.source_for_bg.none": "-- Выберите источник --",
- "pattern.delete_selected": "Удалить Выбранный",
- "pattern.name.hint": "Описательное имя для этой раскладки прямоугольников",
- "pattern.description.hint": "Необязательные заметки о назначении этого паттерна",
- "pattern.visual_editor.hint": "Нажмите кнопки + чтобы добавить прямоугольники. Тяните края для изменения размера, тяните внутри для перемещения.",
- "pattern.rectangles.hint": "Точная настройка позиций и размеров прямоугольников в координатах (0.0 до 1.0)",
- "overlay.toggle": "Переключить наложение на экран",
- "overlay.button.show": "Показать визуализацию наложения",
- "overlay.button.hide": "Скрыть визуализацию наложения",
- "overlay.started": "Визуализация наложения запущена",
- "overlay.stopped": "Визуализация наложения остановлена",
- "overlay.error.start": "Не удалось запустить наложение",
- "overlay.error.stop": "Не удалось остановить наложение",
- "sidebar.workspaces": "Разделы",
- "sidebar.load": "Нагр.",
- "sidebar.fps": "FPS",
- "transport.status.ready": "Готов",
- "transport.status.armed": "Активно · {n}",
- "transport.meta.uptime": "Время",
- "transport.meta.cpu": "CPU",
- "transport.meta.mem": "Память",
- "transport.meta.poll": "Опрос",
- "transport.meta.poll_hint": "Интервал опроса (клик: 1с → 2с → 5с → 10с)",
- "dashboard.title": "Обзор",
- "dashboard.section.targets": "Каналы",
- "dashboard.section.running": "Запущенные",
- "dashboard.section.stopped": "Остановленные",
- "dashboard.no_targets": "Нет настроенных целей",
- "dashboard.uptime": "Время работы",
- "dashboard.fps": "FPS",
- "dashboard.errors": "Ошибки",
- "dashboard.device": "Устройство",
- "dashboard.stop_all": "Остановить все",
- "dashboard.failed": "Не удалось загрузить обзор",
- "dashboard.section.automations": "Автоматизации",
- "dashboard.section.scenes": "Пресеты сцен",
- "dashboard.section.playlists": "Плейлисты",
- "dashboard.section.sync_clocks": "Синхронные часы",
- "dashboard.targets": "Цели",
- "dashboard.section.performance": "Производительность системы",
- "dashboard.perf.active_patches": "Активные каналы",
- "dashboard.perf.patches.empty.idle": "Готов к запуску",
- "dashboard.perf.patches.empty.none": "Каналов пока нет",
- "dashboard.perf.total_fps": "Общий FPS",
- "dashboard.perf.total_capture_fps": "Общий FPS источников",
- "dashboard.perf.total_capture_fps_actual": "Общий FPS захвата",
- "dashboard.perf.network": "Сеть",
- "dashboard.perf.device_latency": "Задержка устройств",
- "dashboard.perf.send_timing": "Время отправки",
- "dashboard.perf.errors": "Ошибки",
- "dashboard.perf.devices": "Устройства",
- "dashboard.perf.cpu": "ЦП",
- "dashboard.perf.ram": "ОЗУ",
- "dashboard.perf.gpu": "ГП",
- "dashboard.perf.temp": "Температура",
- "dashboard.perf.temp.install_lhm": "В Windows нет встроенного API для температуры CPU. Установите LibreHardwareMonitor и включите «Publish to WMI», чтобы видеть живые показания.",
- "dashboard.perf.unavailable": "недоступно",
- "dashboard.perf.color": "Цвет графика",
- "dashboard.perf.mode.system": "Система",
- "dashboard.perf.mode.app": "Приложение",
- "dashboard.perf.mode.both": "Оба",
- "dashboard.poll_interval": "Интервал обновления",
- "dashboard.customize.title": "Настройка панели",
- "dashboard.customize.presets": "Пресеты",
- "dashboard.customize.preset.studio": "Студия",
- "dashboard.customize.preset.operator": "Оператор",
- "dashboard.customize.preset.showrunner": "Шоу",
- "dashboard.customize.preset.diagnostics": "Диагностика",
- "dashboard.customize.preset.tv": "ТВ",
- "dashboard.customize.modified": "Изменено",
- "dashboard.customize.global": "Общие",
- "dashboard.customize.width": "Ширина",
- "dashboard.customize.width.full": "Полная",
- "dashboard.customize.width.centered": "По центру",
- "dashboard.customize.width.narrow": "Узкая",
- "dashboard.customize.anim": "Анимации",
- "dashboard.customize.anim.full": "Полные",
- "dashboard.customize.anim.reduced": "Снижены",
- "dashboard.customize.anim.off": "Выкл",
- "dashboard.customize.perf_mode": "Режим перф.",
- "dashboard.customize.sections": "Секции",
- "dashboard.customize.perf_cells": "Системный мониторинг",
- "dashboard.customize.fixed_top": "Закреплено сверху",
- "dashboard.customize.drag_help": "Перетащите строки или используйте ↑/↓.",
- "dashboard.customize.cell_drag_help": "Перетащите строку, чтобы изменить порядок ячеек в полосе производительности.",
- "dashboard.customize.window": "Окно выборки",
- "dashboard.customize.scale": "Шкала Y",
- "dashboard.customize.mode_short": "РЕЖ",
- "dashboard.customize.window_short": "ОКН",
- "dashboard.customize.scale_short": "ШКЛ",
- "dashboard.customize.density.comfortable": "Просторно",
- "dashboard.customize.density.compact": "Компактно",
- "dashboard.customize.density.dense": "Плотно",
- "card_mode.tooltip": "Размер карточек",
- "card_mode.comfortable": "Просторно",
- "card_mode.compact": "Компактно",
- "card_mode.dense": "Плотно",
- "card_mode.row": "Список",
- "dashboard.customize.collapse_default.on": "Свёрнуто по умолчанию",
- "dashboard.customize.collapse_default.off": "Развёрнуто по умолчанию",
- "dashboard.customize.show": "Показать",
- "dashboard.customize.hide": "Скрыть",
- "dashboard.customize.mode.inherit": "Наслед.",
- "dashboard.customize.mode.system": "Сис",
- "dashboard.customize.mode.app": "Прил",
- "dashboard.customize.mode.both": "Оба",
- "dashboard.customize.yscale.auto": "Авто",
- "dashboard.customize.yscale.fixed": "Фикс.",
- "dashboard.customize.yscale.log": "Лог.",
- "dashboard.customize.export": "Экспорт",
- "dashboard.customize.import": "Импорт",
- "dashboard.customize.reset": "Сбросить",
- "dashboard.customize.reset_confirm": "Сбросить настройки панели к пресету «Студия»?",
- "dashboard.customize.exported": "Настройки экспортированы",
- "dashboard.customize.imported": "Настройки импортированы",
- "dashboard.customize.import_failed": "Не удалось импортировать настройки",
- "automations.title": "Автоматизации",
- "automations.empty": "Автоматизации не настроены. Создайте автоматизацию для автоматической активации сцен.",
- "automations.add": "Добавить автоматизацию",
- "automations.edit": "Редактировать автоматизацию",
- "automations.delete.confirm": "Удалить автоматизацию \"{name}\"?",
- "automations.section.triggers": "Триггеры",
- "automations.section.action": "Действие",
- "automations.section.deactivation": "Деактивация",
- "automations.name": "Название:",
- "automations.name.hint": "Описательное имя для автоматизации",
- "automations.name.placeholder": "Моя автоматизация",
- "automations.enabled": "Включена:",
- "automations.enabled.hint": "Отключённые автоматизации не активируются даже при выполнении условий",
- "automations.rule_logic": "Логика условий:",
- "automations.rule_logic.hint": "Как объединяются несколько условий: ЛЮБОЕ (ИЛИ) или ВСЕ (И)",
- "automations.rule_logic.or": "Любое условие (ИЛИ)",
- "automations.rule_logic.and": "Все условия (И)",
- "automations.rule_logic.or.desc": "Срабатывает при любом совпадении",
- "automations.rule_logic.and.desc": "Срабатывает только при всех",
- "automations.rules": "Условия:",
- "automations.rules.hint": "Правила, определяющие когда автоматизация активируется",
- "automations.rules.add": "Добавить условие",
- "automations.rules.empty": "Нет условий — автоматизация всегда активна когда включена",
- "automations.rule.startup": "Автозапуск",
- "automations.rule.startup.desc": "При запуске сервера",
- "automations.rule.startup.hint": "Активируется при запуске сервера и остаётся активной пока включена.",
- "automations.rule.application": "Приложение",
- "automations.rule.application.desc": "Приложение запущено",
- "automations.rule.application.apps": "Приложения:",
- "automations.rule.application.apps.hint": "Имена процессов, по одному на строку (например firefox.exe)",
- "automations.rule.application.browse": "Обзор",
- "automations.rule.application.search": "Фильтр процессов...",
- "automations.rule.application.no_processes": "Процессы не найдены",
- "automations.rule.application.match_type": "Тип соответствия:",
- "automations.rule.application.match_type.hint": "Как определять наличие приложения",
- "automations.rule.application.match_type.running": "Запущено",
- "automations.rule.application.match_type.running.desc": "Процесс активен",
- "automations.rule.application.match_type.topmost": "На переднем плане",
- "automations.rule.application.match_type.topmost.desc": "Окно в фокусе",
- "automations.rule.application.match_type.topmost_fullscreen": "Передний план + ПЭ",
- "automations.rule.application.match_type.topmost_fullscreen.desc": "В фокусе + полный экран",
- "automations.rule.application.match_type.fullscreen": "Полный экран",
- "automations.rule.application.match_type.fullscreen.desc": "Любое полноэкранное",
- "automations.rule.application.apps.hint_android": "Имена пакетов, по одному в строке (напр. com.netflix.mediaclient)",
- "automations.rule.application.search_apps": "Поиск приложений...",
- "automations.rule.application.no_apps": "Приложения не найдены",
- "automations.rule.application.usage_access_required": "Требуется доступ к статистике использования. Откройте LedGrab на телевизоре и нажмите «Разрешить доступ к статистике использования».",
- "automations.rule.time_of_day": "Время суток",
- "automations.rule.time_of_day.desc": "Диапазон времени",
- "automations.rule.time_of_day.start_time": "Время начала:",
- "automations.rule.time_of_day.end_time": "Время окончания:",
- "automations.rule.time_of_day.overnight_hint": "Для ночных диапазонов (например 22:00–06:00) укажите время начала позже времени окончания.",
- "automations.rule.time_of_day.days": "Активные дни",
- "automations.rule.time_of_day.days_hint": "Оставьте всё невыбранным для всех дней. Ночные окна относятся ко дню, когда они начинаются.",
- "automations.rule.time_of_day.timezone": "Часовой пояс",
- "automations.rule.time_of_day.timezone.placeholder": "Локальное время сервера (напр. Europe/Berlin)",
- "weekday.short.0": "Пн",
- "weekday.short.1": "Вт",
- "weekday.short.2": "Ср",
- "weekday.short.3": "Чт",
- "weekday.short.4": "Пт",
- "weekday.short.5": "Сб",
- "weekday.short.6": "Вс",
- "automations.rule.system_idle": "Бездействие системы",
- "automations.rule.system_idle.desc": "Бездействие/активность",
- "automations.rule.system_idle.idle_minutes": "Тайм-аут бездействия (минуты):",
- "automations.rule.system_idle.mode": "Режим срабатывания:",
- "automations.rule.system_idle.when_idle": "При бездействии",
- "automations.rule.system_idle.when_idle.desc": "Срабатывает, когда пользователь не активен дольше тайм-аута",
- "automations.rule.system_idle.when_active": "При активности",
- "automations.rule.system_idle.when_active.desc": "Срабатывает, пока пользователь активно работает с системой",
- "automations.rule.display_state": "Состояние дисплея",
- "automations.rule.display_state.desc": "Монитор вкл/выкл",
- "automations.rule.display_state.state": "Состояние монитора:",
- "automations.rule.display_state.on": "Включён",
- "automations.rule.display_state.off": "Выключен (спящий режим)",
- "automations.rule.mqtt": "MQTT",
- "automations.rule.mqtt.desc": "MQTT сообщение",
- "automations.rule.mqtt.topic": "Топик:",
- "automations.rule.mqtt.payload": "Значение:",
- "automations.rule.mqtt.match_mode": "Режим сравнения:",
- "automations.rule.mqtt.match_mode.exact": "Точное совпадение",
- "automations.rule.mqtt.match_mode.contains": "Содержит",
- "automations.rule.mqtt.match_mode.regex": "Регулярное выражение",
- "automations.rule.mqtt.hint": "Активировать при получении совпадающего значения по MQTT топику",
- "automations.rule.webhook": "Вебхук",
- "automations.rule.webhook.desc": "HTTP вызов",
- "automations.rule.webhook.hint": "Активировать через HTTP-запрос от внешних сервисов (Home Assistant, IFTTT, curl и т.д.)",
- "automations.rule.webhook.url": "URL вебхука:",
- "automations.rule.webhook.copy": "Скопировать",
- "automations.rule.webhook.copied": "Скопировано!",
- "automations.rule.webhook.save_first": "Сначала сохраните автоматизацию для генерации URL вебхука",
- "automations.scene": "Сцена:",
- "automations.scene.hint": "Пресет сцены для активации при выполнении условий",
- "automations.scene.search_placeholder": "Поиск сцен...",
- "automations.scene.none_selected": "Нет (без сцены)",
- "automations.scene.none_available": "Нет доступных сцен",
- "automations.deactivation_mode": "Деактивация:",
- "automations.deactivation_mode.hint": "Что происходит, когда условия перестают выполняться",
- "automations.deactivation_mode.none": "Ничего",
- "automations.deactivation_mode.none.desc": "Оставить текущее состояние",
- "automations.deactivation_mode.revert": "Откатить",
- "automations.deactivation_mode.revert.desc": "Вернуть предыдущее состояние",
- "automations.deactivation_mode.fallback_scene": "Резервная",
- "automations.deactivation_mode.fallback_scene.desc": "Активировать резервную сцену",
- "automations.deactivation_scene": "Резервная сцена:",
- "automations.deactivation_scene.hint": "Сцена для активации при деактивации автоматизации",
- "automations.status.active": "Активна",
- "automations.status.inactive": "Неактивна",
- "automations.status.disabled": "Отключена",
- "automations.action.disable": "Отключить",
- "automations.last_activated": "Последняя активация",
- "automations.logic.and": " И ",
- "automations.logic.or": " ИЛИ ",
- "automations.logic.all": "ВСЕ",
- "automations.logic.any": "ЛЮБОЕ",
- "automations.updated": "Автоматизация обновлена",
- "automations.created": "Автоматизация создана",
- "automations.deleted": "Автоматизация удалена",
- "automations.error.name_required": "Введите название",
- "automations.error.clone_failed": "Не удалось клонировать автоматизацию",
- "automations.error.load_failed": "Не удалось загрузить автоматизацию",
- "automations.error.save_failed": "Не удалось сохранить автоматизацию",
- "automations.error.delete_failed": "Не удалось удалить автоматизацию",
- "automations.error.toggle_failed": "Не удалось переключить автоматизацию",
- "scenes.title": "Сцены",
- "scenes.add": "Захватить сцену",
- "scenes.edit": "Редактировать сцену",
- "scenes.name": "Название:",
- "scenes.name.hint": "Описательное имя для этого пресета сцены",
- "scenes.name.placeholder": "Моя сцена",
- "scenes.description": "Описание:",
- "scenes.description.hint": "Необязательное описание назначения этой сцены",
- "scenes.targets": "Цели:",
- "scenes.targets.hint": "Выберите какие цели включить в снимок сцены",
- "scenes.targets.add": "Добавить цель",
- "scenes.targets.search_placeholder": "Поиск целей...",
- "scenes.targets.empty": "Цели не выбраны",
- "scenes.capture": "Захват",
- "scenes.activate": "Активировать сцену",
- "scenes.recapture": "Перезахватить текущее состояние",
- "scenes.action.activate": "Активировать",
- "scenes.action.recapture": "Перезахват",
- "scenes.status.preset": "Пресет",
- "scenes.delete": "Удалить сцену",
- "scenes.targets_count": "целей",
- "scenes.captured": "Сцена захвачена",
- "scenes.updated": "Сцена обновлена",
- "scenes.activated": "Сцена активирована",
- "scenes.activated_partial": "Сцена активирована частично",
- "scenes.errors": "ошибок",
- "scenes.recaptured": "Сцена перезахвачена",
- "scenes.deleted": "Сцена удалена",
- "scenes.recapture_confirm": "Перезахватить текущее состояние в \"{name}\"?",
- "scenes.delete_confirm": "Удалить сцену \"{name}\"?",
- "scenes.error.name_required": "Необходимо указать название",
- "scenes.error.save_failed": "Не удалось сохранить сцену",
- "scenes.error.activate_failed": "Не удалось активировать сцену",
- "scenes.error.recapture_failed": "Не удалось перезахватить сцену",
- "scenes.error.delete_failed": "Не удалось удалить сцену",
- "scenes.cloned": "Сцена клонирована",
- "scenes.error.clone_failed": "Не удалось клонировать сцену",
- "playlists.title": "Плейлисты",
- "playlists.add": "Новый плейлист",
- "playlists.edit": "Изменить плейлист",
- "playlists.name": "Название:",
- "playlists.name.placeholder": "Мой плейлист",
- "playlists.description": "Описание:",
- "playlists.description.hint": "Необязательное описание плейлиста",
- "playlists.section.playback": "Воспроизведение",
- "playlists.loop": "Зацикливание:",
- "playlists.loop.hint": "Начинать заново с первой сцены после последней; если выключено — проиграть один раз и остановиться",
- "playlists.shuffle": "Перемешивание:",
- "playlists.shuffle.hint": "Случайный порядок сцен в начале каждого цикла",
- "playlists.scenes": "Сцены:",
- "playlists.scenes.hint": "Пресеты сцен, которые перебирает плейлист, каждая удерживается своё время",
- "playlists.scenes.add": "Добавить сцену",
- "playlists.scenes_count": "сцен",
- "playlists.scene_one": "сцена",
- "playlists.scene_many": "сцен",
- "playlists.items.empty": "Сцен пока нет — добавьте ниже",
- "playlists.items.search_placeholder": "Поиск сцен...",
- "playlists.item.duration": "Секунды",
- "playlists.item.move_up": "Вверх",
- "playlists.item.move_down": "Вниз",
- "playlists.item.missing": "Отсутствует",
- "playlists.chip.loop": "Цикл",
- "playlists.chip.shuffle": "Перемешать",
- "playlists.action.start": "Запустить",
- "playlists.action.stop": "Остановить",
- "playlists.start": "Запустить плейлист",
- "playlists.stop": "Остановить плейлист",
- "playlists.status.playing": "Воспроизводится",
- "playlists.status.stopped": "Остановлен",
- "playlists.started": "Плейлист запущен",
- "playlists.stopped": "Плейлист остановлен",
- "playlists.created": "Плейлист создан",
- "playlists.updated": "Плейлист обновлён",
- "playlists.deleted": "Плейлист удалён",
- "playlists.delete_confirm": "Удалить плейлист «{name}»?",
- "playlists.error.name_required": "Требуется название",
- "playlists.error.save_failed": "Не удалось сохранить плейлист",
- "playlists.error.start_failed": "Не удалось запустить плейлист",
- "playlists.error.stop_failed": "Не удалось остановить плейлист",
- "playlists.error.delete_failed": "Не удалось удалить плейлист",
- "playlists.error.no_presets": "Сначала создайте пресет сцены",
- "dashboard.type.led": "LED",
- "dashboard.type.kc": "Цвета клавиш",
- "aria.close": "Закрыть",
- "aria.save": "Сохранить",
- "aria.cancel": "Отмена",
- "aria.previous": "Назад",
- "aria.next": "Вперёд",
- "aria.hint": "Показать подсказку",
- "color_strip.select_type": "Выберите тип цветовой полосы",
- "color_strip.add": "Добавить",
- "color_strip.edit": "Редактировать",
- "color_strip.name": "Название:",
- "color_strip.name.placeholder": "Настенная полоса",
- "color_strip.picture_source": "Источник изображения:",
- "color_strip.picture_source.hint": "Источник захвата экрана для расчёта цветов светодиодов",
- "color_strip.fps": "Целевой FPS:",
- "color_strip.fps.hint": "Целевая частота кадров для обновления цветов светодиодов (10-90)",
- "color_strip.interpolation": "Режим цвета:",
- "color_strip.interpolation.hint": "Как вычислять цвет светодиода по пикселям рамки",
- "color_strip.interpolation.average": "Среднее",
- "color_strip.interpolation.median": "Медиана",
- "color_strip.interpolation.dominant": "Доминирующий",
- "color_strip.interpolation.average.desc": "Смешивает все пиксели в усреднённый цвет",
- "color_strip.interpolation.median.desc": "Берёт средний цвет, игнорируя выбросы",
- "color_strip.interpolation.dominant.desc": "Использует самый частый цвет в выборке",
- "color_strip.smoothing": "Сглаживание:",
- "color_strip.smoothing.hint": "Временное смешивание кадров (0=без смешивания, 1=полное). Уменьшает мерцание.",
- "color_strip.frame_interpolation": "Интерполяция кадров:",
- "color_strip.frame_interpolation.hint": "Смешивает последовательные захваченные кадры для вывода на полной целевой частоте кадров, даже если скорость захвата ниже. Уменьшает заметные ступеньки при плавных переходах.",
- "color_strip.color_corrections": "Цветокоррекция",
- "color_strip.brightness": "Яркость:",
- "color_strip.brightness.hint": "Множитель яркости (0=выкл, 1=без изменений, 2=двойная). Применяется после извлечения цвета.",
- "color_strip.saturation": "Насыщенность:",
- "color_strip.saturation.hint": "Насыщенность цвета (0=оттенки серого, 1=без изменений, 2=двойная насыщенность)",
- "color_strip.gamma": "Гамма:",
- "color_strip.gamma.hint": "Гамма-коррекция (1=без коррекции, <1=ярче средние тона, >1=темнее средние тона)",
- "color_strip.test_device": "Тестировать на устройстве:",
- "color_strip.test_device.hint": "Выберите устройство для отправки тестовых пикселей при нажатии на рамку",
- "color_strip.leds": "Количество светодиодов",
- "color_strip.led_count": "Количество LED:",
- "color_strip.led_count.hint": "Общее число светодиодов на физической полосе. Для источников экрана: 0 = автоматически из калибровки (светодиоды за ТВ будут чёрными). Для статического цвета: укажите точное количество светодиодов устройства.",
- "color_strip.created": "Источник цветовой полосы создан",
- "color_strip.updated": "Источник цветовой полосы обновлён",
- "color_strip.deleted": "Источник цветовой полосы удалён",
- "color_strip.delete.confirm": "Удалить этот источник цветовой полосы?",
- "color_strip.delete.referenced": "Невозможно удалить: источник используется в цели",
- "color_strip.error.name_required": "Введите название",
- "color_strip.type": "Тип:",
- "color_strip.type.hint": "Источник изображения получает цвета светодиодов из захвата экрана. Один цвет заполняет все светодиоды одним постоянным цветом. Градиент распределяет цветовой градиент по всем светодиодам. Смена цвета плавно циклически переключается между заданными цветами. Композит накладывает несколько источников как смешанные слои. Аудиореактив управляет LED от аудиосигнала в реальном времени. API-ввод принимает массивы цветов LED от внешних клиентов через REST или WebSocket.",
- "color_strip.type.picture": "Источник изображения",
- "color_strip.type.picture.desc": "Цвета из захвата экрана",
- "color_strip.type.picture_advanced": "Мультимонитор",
- "color_strip.type.picture_advanced.desc": "Калибровка линиями по нескольким мониторам",
- "color_strip.type.single_color": "Один цвет",
- "color_strip.type.single_color.desc": "Заливка одним цветом",
- "color_strip.type.gradient": "Градиент",
- "color_strip.type.gradient.desc": "Плавный переход цветов по ленте",
- "color_strip.single_color": "Цвет:",
- "color_strip.single_color.hint": "Один сплошной цвет, который будет отправлен на все светодиоды полосы.",
- "color_strip.gradient.preview": "Градиент:",
- "color_strip.gradient.preview.hint": "Предпросмотр градиента. Нажмите на дорожку маркеров чтобы добавить остановку. Перетащите маркеры для изменения позиции.",
- "color_strip.gradient.stops": "Цветовые остановки:",
- "color_strip.gradient.stops.hint": "Каждая остановка задаёт цвет в относительной позиции (0.0 = начало, 1.0 = конец). Кнопка ↔ добавляет цвет справа для создания резкого перехода.",
- "color_strip.gradient.stops_count": "остановок",
- "color_strip.gradient.add_stop": "+ Добавить",
- "color_strip.gradient.position": "Позиция (0.0–1.0)",
- "color_strip.gradient.bidir.hint": "Добавить второй цвет справа от этой остановки для создания резкого перехода в градиенте.",
- "color_strip.gradient.min_stops": "Градиент должен содержать не менее 2 остановок",
- "color_strip.gradient.preset": "Пресет:",
- "color_strip.gradient.preset.hint": "Загрузить готовую палитру градиента. Выбор пресета заменяет текущие остановки.",
- "color_strip.gradient.preset.custom": "— Свой —",
- "color_strip.gradient.preset.rainbow": "Радуга",
- "color_strip.gradient.preset.sunset": "Закат",
- "color_strip.gradient.preset.ocean": "Океан",
- "color_strip.gradient.preset.forest": "Лес",
- "color_strip.gradient.preset.fire": "Огонь",
- "color_strip.gradient.preset.lava": "Лава",
- "color_strip.gradient.preset.aurora": "Аврора",
- "color_strip.gradient.preset.ice": "Лёд",
- "color_strip.gradient.preset.warm": "Тёплый",
- "color_strip.gradient.preset.cool": "Холодный",
- "color_strip.gradient.preset.neon": "Неон",
- "color_strip.gradient.preset.pastel": "Пастельный",
- "color_strip.gradient.preset.save_button": "Сохранить как пресет…",
- "color_strip.gradient.preset.save_prompt": "Введите название пресета:",
- "color_strip.gradient.preset.saved": "Пресет сохранён",
- "color_strip.gradient.preset.deleted": "Пресет удалён",
- "color_strip.gradient.preset.apply": "Применить",
- "color_strip.animation": "Анимация",
- "color_strip.animation.type": "Эффект:",
- "color_strip.animation.type.hint": "Эффект анимации.",
- "color_strip.animation.type.none": "Нет (без эффекта анимации)",
- "color_strip.animation.type.none.desc": "Статичные цвета без анимации",
- "color_strip.animation.type.breathing": "Дыхание",
- "color_strip.animation.type.breathing.desc": "Плавное угасание и нарастание яркости",
- "color_strip.animation.type.gradient_shift": "Сдвиг градиента",
- "color_strip.animation.type.gradient_shift.desc": "Сдвигает градиент вдоль ленты",
- "color_strip.animation.type.wave": "Волна",
- "color_strip.animation.type.wave.desc": "Синусоидальная волна яркости вдоль ленты",
- "color_strip.animation.type.strobe": "Стробоскоп",
- "color_strip.animation.type.strobe.desc": "Быстрое мигание вкл/выкл",
- "color_strip.animation.type.sparkle": "Искры",
- "color_strip.animation.type.sparkle.desc": "Случайные светодиоды кратковременно вспыхивают",
- "color_strip.animation.type.pulse": "Пульс",
- "color_strip.animation.type.pulse.desc": "Резкая вспышка яркости с быстрым затуханием",
- "color_strip.animation.type.candle": "Свеча",
- "color_strip.animation.type.candle.desc": "Тёплое мерцание, как у свечи",
- "color_strip.animation.type.rainbow_fade": "Радужный перелив",
- "color_strip.animation.type.rainbow_fade.desc": "Циклический переход по всему спектру оттенков",
- "color_strip.animation.speed": "Скорость:",
- "color_strip.animation.speed.hint": "Множитель скорости анимации. 1.0 ≈ один цикл в секунду для дыхания; большие значения ускоряют анимацию.",
- "color_strip.type.effect": "Эффект",
- "color_strip.type.effect.desc": "Процедурные эффекты: огонь, плазма, аврора",
- "color_strip.type.effect.hint": "Процедурные LED-эффекты (огонь, метеор, плазма, шум, аврора), генерируемые в реальном времени.",
- "color_strip.type.composite": "Композит",
- "color_strip.type.composite.desc": "Наложение и смешивание источников",
- "color_strip.type.composite.hint": "Наложение нескольких источников цветовой ленты как слоёв с режимами смешивания и прозрачностью.",
- "color_strip.type.mapped": "Маппинг",
- "color_strip.type.mapped.desc": "Назначение источников на зоны LED",
- "color_strip.type.mapped.hint": "Назначает разные источники цветовой полосы на разные диапазоны LED (зоны). В отличие от композита, маппинг размещает источники рядом друг с другом.",
- "color_strip.type.audio": "Аудиореактив",
- "color_strip.type.audio.desc": "LED от аудиосигнала",
- "color_strip.type.audio.hint": "Цвета LED управляются аудиосигналом в реальном времени — системный звук или микрофон.",
- "color_strip.type.api_input": "API-ввод",
- "color_strip.type.api_input.desc": "Приём цветов от внешних приложений",
- "color_strip.type.api_input.hint": "Принимает массивы цветов LED от внешних клиентов через REST POST или WebSocket. Используйте для интеграции с собственным ПО, домашней автоматизацией или любой системой, способной отправлять HTTP-запросы.",
- "color_strip.api_input.fallback_color": "Цвет по умолчанию:",
- "color_strip.api_input.fallback_color.hint": "Цвет для отображения, когда данные не получены в течение периода ожидания. LED покажут этот цвет при запуске и после потери соединения.",
- "color_strip.api_input.timeout": "Тайм-аут (секунды):",
- "color_strip.api_input.timeout.hint": "Время ожидания новых данных о цветах перед возвратом к цвету по умолчанию. Установите 0, чтобы не использовать тайм-аут.",
- "color_strip.api_input.endpoints": "Эндпоинты для отправки:",
- "color_strip.api_input.endpoints.hint": "Используйте эти URL для отправки данных о цветах LED из вашего внешнего приложения. REST принимает JSON, WebSocket принимает как JSON, так и бинарные кадры.",
- "color_strip.api_input.save_first": "Сначала сохраните источник, чтобы увидеть URL эндпоинтов.",
- "color_strip.api_input.interpolation": "Интерполяция LED:",
- "color_strip.api_input.interpolation.hint": "Как масштабировать входящие данные LED, когда их количество отличается от количества LED на устройстве. Линейная — плавное смешивание, Ближайший — чёткие границы, Нет — обрезка или дополнение нулями.",
- "color_strip.api_input.interpolation.linear": "Линейная",
- "color_strip.api_input.interpolation.linear.desc": "Плавное смешивание между LED",
- "color_strip.api_input.interpolation.nearest": "Ближайший",
- "color_strip.api_input.interpolation.nearest.desc": "Чёткие границы, без смешивания",
- "color_strip.api_input.interpolation.none": "Нет",
- "color_strip.api_input.interpolation.none.desc": "Обрезка или дополнение нулями",
- "color_strip.type.notification": "Уведомления",
- "color_strip.type.notification.desc": "Разовый эффект по вебхуку",
- "color_strip.type.notification.hint": "Вспышка, пульс или волна при срабатывании через вебхук. Предназначен для использования как слой в композитном источнике.",
- "color_strip.notification.os_listener": "Слушать системные уведомления:",
- "color_strip.notification.os_listener.hint": "Когда включено, источник автоматически срабатывает при появлении уведомления рабочего стола (Windows toast / Linux D-Bus). Требует разрешения на доступ к уведомлениям.",
- "color_strip.notification.effect": "Эффект:",
- "color_strip.notification.effect.hint": "Визуальный эффект при уведомлении. Вспышка — линейное затухание, Пульс — плавная волна, Волна — заполнение и затухание.",
- "color_strip.notification.effect.flash": "Вспышка",
- "color_strip.notification.effect.flash.desc": "Мгновенное включение, линейное затухание",
- "color_strip.notification.effect.pulse": "Пульс",
- "color_strip.notification.effect.pulse.desc": "Плавное свечение колоколом",
- "color_strip.notification.effect.sweep": "Волна",
- "color_strip.notification.effect.sweep.desc": "Заполняет слева направо, затем гаснет",
- "color_strip.notification.duration": "Длительность (мс):",
- "color_strip.notification.duration.hint": "Как долго длится эффект уведомления в миллисекундах.",
- "color_strip.notification.default_color": "Цвет по умолчанию:",
- "color_strip.notification.default_color.hint": "Цвет, когда для приложения нет специфического назначения цвета.",
- "color_strip.notification.filter_mode": "Фильтр приложений:",
- "color_strip.notification.filter_mode.hint": "Фильтр уведомлений по имени приложения. Выкл = все, Белый список = только указанные, Чёрный список = все кроме указанных.",
- "color_strip.notification.filter_mode.off": "Выкл",
- "color_strip.notification.filter_mode.whitelist": "Белый список",
- "color_strip.notification.filter_mode.blacklist": "Чёрный список",
- "color_strip.notification.filter_mode.off.desc": "Принимать все уведомления",
- "color_strip.notification.filter_mode.whitelist.desc": "Только указанные приложения",
- "color_strip.notification.filter_mode.blacklist.desc": "Все кроме указанных приложений",
- "color_strip.notification.filter_list": "Список приложений:",
- "color_strip.notification.filter_list.hint": "Одно имя приложения на строку. Используйте «Обзор» для выбора из запущенных процессов.",
- "color_strip.notification.filter_list.placeholder": "Discord\nSlack\nTelegram",
- "color_strip.notification.app_colors": "Цвета приложений",
- "color_strip.notification.app_colors.label": "Назначения цветов:",
- "color_strip.notification.app_colors.hint": "Индивидуальные цвета для приложений. Каждая строка связывает имя приложения с цветом уведомления.",
- "color_strip.notification.app_colors.add": "+ Добавить",
- "color_strip.notification.app_overrides": "Настройки приложений",
- "color_strip.notification.app_overrides.label": "Переопределения:",
- "color_strip.notification.app_overrides.hint": "Индивидуальные настройки цвета и звука для каждого приложения.",
- "color_strip.notification.app_overrides.add": "+ Добавить",
- "color_strip.notification.app_overrides.app_placeholder": "Имя приложения",
- "color_strip.notification.sound": "Звук",
- "color_strip.notification.sound.asset": "Звуковой ассет:",
- "color_strip.notification.sound.asset.hint": "Выберите звуковой ассет для воспроизведения при уведомлении. Оставьте пустым для тишины.",
- "color_strip.notification.sound.none": "Нет (без звука)",
- "color_strip.notification.sound.search": "Поиск звуков…",
- "color_strip.notification.sound.volume": "Громкость:",
- "color_strip.notification.sound.volume.hint": "Общая громкость звуков уведомлений (0–100%).",
- "color_strip.notification.sound.app_sounds": "Звуки приложений:",
- "color_strip.notification.sound.app_sounds.hint": "Переопределение звука и громкости для конкретных приложений. Пустой звук = отключить для этого приложения.",
- "color_strip.notification.sound.app_sounds.add": "+ Добавить",
- "color_strip.notification.sound.app_name_placeholder": "Имя приложения",
- "color_strip.notification.endpoint": "Вебхук:",
- "color_strip.notification.endpoint.hint": "URL для запуска уведомлений из внешних систем. POST с JSON телом: {\"app\": \"AppName\", \"color\": \"#FF0000\"}.",
- "color_strip.notification.save_first": "Сначала сохраните источник, чтобы увидеть URL вебхука.",
- "color_strip.notification.app_count": "прилож.",
- "color_strip.notification.test": "Тестовое уведомление",
- "color_strip.notification.test.ok": "Уведомление отправлено",
- "color_strip.notification.test.no_streams": "Нет запущенных потоков для этого источника",
- "color_strip.notification.test.error": "Не удалось отправить уведомление",
- "color_strip.notification.history.title": "История уведомлений",
- "color_strip.notification.history.hint": "Последние ОС-уведомления, захваченные слушателем (новейшие сверху). До 50 записей.",
- "color_strip.notification.history.empty": "Уведомления ещё не захвачены",
- "color_strip.notification.history.unavailable": "Слушатель уведомлений ОС недоступен на этой платформе",
- "color_strip.notification.history.error": "Не удалось загрузить историю уведомлений",
- "color_strip.notification.history.refresh": "Обновить",
- "color_strip.notification.history.unknown_app": "Неизвестное приложение",
- "color_strip.notification.history.fired": "Потоков запущено",
- "color_strip.notification.history.filtered": "Потоков отфильтровано",
- "color_strip.test.title": "Предпросмотр",
- "color_strip.test.connecting": "Подключение...",
- "color_strip.test.error": "Не удалось подключиться к потоку предпросмотра",
- "color_strip.test.led_count": "Кол-во LED:",
- "color_strip.test.fps": "FPS:",
- "color_strip.test.receive_fps": "Частота приёма",
- "color_strip.test.apply": "Применить",
- "color_strip.test.composite": "Композит",
- "color_strip.preview.title": "Предпросмотр",
- "color_strip.preview.not_connected": "Не подключено",
- "color_strip.preview.connecting": "Подключение...",
- "color_strip.preview.connected": "Подключено",
- "color_strip.preview.unsupported": "Предпросмотр недоступен для этого типа источника",
- "color_strip.preview.save_first": "Сначала сохраните источник — для предпросмотра нужна калибровка",
- "color_strip.type.daylight": "Дневной цикл",
- "color_strip.type.daylight.desc": "Имитация естественного дневного света за 24 часа",
- "color_strip.type.daylight.hint": "Имитирует цветовую температуру солнца в течение суток — от тёплого рассвета до прохладного дневного света, заката и ночи.",
- "color_strip.daylight.speed": "Скорость:",
- "color_strip.daylight.speed.hint": "Множитель скорости цикла. 1.0 = полный цикл день/ночь за ~4 минуты.",
- "color_strip.daylight.use_real_time": "Реальное время:",
- "color_strip.daylight.use_real_time.hint": "Если включено, цвет LED соответствует реальному времени суток. Настройка скорости игнорируется.",
- "color_strip.daylight.real_time": "Реальное время",
- "color_strip.daylight.latitude": "Широта:",
- "color_strip.daylight.latitude.hint": "Географическая широта (-90 до 90). Влияет на время восхода/заката в режиме реального времени.",
- "color_strip.type.candlelight": "Свечи",
- "color_strip.type.candlelight.desc": "Реалистичная имитация мерцания свечей",
- "color_strip.type.candlelight.hint": "Реалистичное мерцание свечей с тёплыми тонами и органическими паттернами.",
- "color_strip.type.weather": "Погода",
- "color_strip.type.weather.desc": "Погодно-реактивные амбиентные цвета",
- "color_strip.type.weather.hint": "Отображает текущие погодные условия в амбиентные цвета LED. Требуется сущность Источник погоды.",
- "color_strip.weather.source": "Источник погоды:",
- "color_strip.weather.source.hint": "Источник метеоданных. Сначала создайте его во вкладке Погода.",
- "color_strip.weather.speed": "Скорость анимации:",
- "color_strip.weather.speed.hint": "Скорость дрейфа цветов. Выше = быстрее.",
- "color_strip.weather.temperature_influence": "Влияние температуры:",
- "color_strip.weather.temperature_influence.hint": "Насколько температура смещает палитру в тёплую/холодную сторону. 0 = чистые цвета условий, 1 = сильное смещение.",
- "color_strip.weather.error.no_source": "Выберите источник погоды",
- "color_strip.candlelight.color": "Базовый цвет:",
- "color_strip.candlelight.color.hint": "Тёплый базовый цвет пламени свечи. По умолчанию — натуральный тёплый янтарь.",
- "color_strip.candlelight.intensity": "Интенсивность мерцания:",
- "color_strip.candlelight.intensity.hint": "Сила мерцания свечей. Низкие значения — мягкое свечение, высокие — свеча на ветру.",
- "color_strip.candlelight.num_candles_label": "Количество свечей:",
- "color_strip.candlelight.num_candles": "свечей",
- "color_strip.candlelight.num_candles.hint": "Сколько независимых источников свечей вдоль ленты. Каждый мерцает по-своему.",
- "color_strip.candlelight.speed": "Скорость мерцания:",
- "color_strip.candlelight.speed.hint": "Скорость анимации мерцания. Большие значения — более быстрое, беспокойное пламя.",
- "color_strip.type.processed": "Обработанный",
- "color_strip.type.processed.desc": "Применить шаблон обработки к другому источнику",
- "color_strip.type.processed.hint": "Оборачивает существующий источник цветовой полосы и пропускает его вывод через цепочку фильтров.",
- "color_strip.processed.input": "Источник:",
- "color_strip.processed.input.hint": "Источник цветовой полосы, вывод которого будет обработан",
- "color_strip.processed.template": "Шаблон обработки:",
- "color_strip.processed.template.hint": "Цепочка фильтров для применения к выводу входного источника",
- "color_strip.processed.error.no_input": "Выберите входной источник",
- "color_strip.composite.layers": "Слои:",
- "color_strip.composite.layers.hint": "Наложение нескольких источников. Первый слой — нижний, последний — верхний. Каждый слой может иметь свой режим смешивания и прозрачность.",
- "color_strip.composite.add_layer": "Добавить слой",
- "color_strip.composite.source": "Источник",
- "color_strip.composite.blend_mode": "Смешивание",
- "color_strip.composite.blend_mode.normal": "Обычное",
- "color_strip.composite.blend_mode.normal.desc": "Стандартное альфа-смешивание",
- "color_strip.composite.blend_mode.add": "Сложение",
- "color_strip.composite.blend_mode.add.desc": "Осветляет, складывая цвета",
- "color_strip.composite.blend_mode.multiply": "Умножение",
- "color_strip.composite.blend_mode.multiply.desc": "Затемняет, умножая цвета",
- "color_strip.composite.blend_mode.screen": "Экран",
- "color_strip.composite.blend_mode.screen.desc": "Осветляет, обратное умножение",
- "color_strip.composite.blend_mode.override": "Замена",
- "color_strip.composite.blend_mode.overlay": "Наложение",
- "color_strip.composite.blend_mode.overlay.desc": "Умножение тёмных, осветление светлых",
- "color_strip.composite.blend_mode.soft_light": "Мягкий свет",
- "color_strip.composite.blend_mode.soft_light.desc": "Мягкая коррекция контраста",
- "color_strip.composite.blend_mode.hard_light": "Жёсткий свет",
- "color_strip.composite.blend_mode.hard_light.desc": "Сильный контраст, яркие цвета",
- "color_strip.composite.blend_mode.difference": "Разница",
- "color_strip.composite.blend_mode.difference.desc": "Абсолютная разница цветов",
- "color_strip.composite.blend_mode.exclusion": "Исключение",
- "color_strip.composite.blend_mode.exclusion.desc": "Как разница, но мягче",
- "color_strip.composite.blend_mode.override.desc": "Чёрный = прозрачный, яркий = непрозрачный",
- "color_strip.composite.opacity": "Непрозрачность",
- "color_strip.composite.brightness": "Яркость",
- "color_strip.composite.brightness.none": "Нет (полная яркость)",
- "color_strip.composite.processing": "Обработка",
- "color_strip.composite.enabled": "Включён",
- "color_strip.composite.error.min_layers": "Необходим хотя бы 1 слой",
- "color_strip.composite.error.no_source": "Для каждого слоя должен быть выбран источник",
- "color_strip.composite.layers_count": "слоёв",
- "color_strip.composite.range": "Диапазон LED",
- "color_strip.composite.range_start": "Начало",
- "color_strip.composite.range_end": "Конец",
- "color_strip.composite.reverse": "Реверс",
- "color_strip.mapped.zones": "Зоны:",
- "color_strip.mapped.zones.hint": "Каждая зона привязывает источник цветовой полосы к определённому диапазону LED. Зоны размещаются рядом — промежутки остаются чёрными.",
- "color_strip.mapped.add_zone": "+ Добавить зону",
- "color_strip.mapped.zone_source": "Источник",
- "color_strip.mapped.zone_start": "Начало LED",
- "color_strip.mapped.zone_end": "Конец LED",
- "color_strip.mapped.zone_reverse": "Реверс",
- "color_strip.mapped.zones_count": "зон",
- "color_strip.mapped.select_source": "Поиск источников...",
- "color_strip.mapped.error.no_source": "Для каждой зоны должен быть выбран источник",
- "color_strip.audio.visualization": "Визуализация:",
- "color_strip.audio.visualization.hint": "Способ отображения аудиоданных на LED.",
- "color_strip.audio.viz.spectrum": "Анализатор спектра",
- "color_strip.audio.viz.spectrum.desc": "Частотные полосы по ленте",
- "color_strip.audio.viz.beat_pulse": "Пульс бита",
- "color_strip.audio.viz.beat_pulse.desc": "Все LED пульсируют в такт",
- "color_strip.audio.viz.vu_meter": "VU-метр",
- "color_strip.audio.viz.vu_meter.desc": "Уровень громкости заполняет ленту",
- "color_strip.audio.viz.pulse_on_beat": "Пульс на бит",
- "color_strip.audio.viz.pulse_on_beat.desc": "LED пульсируют при каждом ударе",
- "color_strip.audio.viz.energy_gradient": "Энергетический градиент",
- "color_strip.audio.viz.energy_gradient.desc": "Интенсивность градиента следует за энергией звука",
- "color_strip.audio.viz.spectrum_bands": "Полосы спектра",
- "color_strip.audio.viz.spectrum_bands.desc": "Группы частот по ленте",
- "color_strip.audio.viz.strobe_on_drop": "Стробоскоп на дропе",
- "color_strip.audio.viz.strobe_on_drop.desc": "Вспышка стробоскопа на басовых дропах",
- "color_strip.audio.beat_decay": "Затухание бита:",
- "color_strip.audio.beat_decay.hint": "Скорость затухания пульса. Меньшие значения = более долгое затухание, большие = более резкая реакция.",
- "color_strip.audio.source": "Аудиоисточник:",
- "color_strip.audio.source.hint": "Аудиоисточник для визуализации. Может быть многоканальным (устройство) или моно (один канал). Создавайте и управляйте аудиоисточниками на вкладке Источники.",
- "color_strip.audio.sensitivity": "Чувствительность:",
- "color_strip.audio.sensitivity.hint": "Множитель усиления аудиосигнала. Более высокие значения делают LED чувствительнее к тихим звукам.",
- "color_strip.audio.smoothing": "Сглаживание:",
- "color_strip.audio.smoothing.hint": "Временное сглаживание между кадрами. Более высокие значения дают плавную, но медленнее реагирующую визуализацию.",
- "color_strip.audio.palette": "Палитра:",
- "color_strip.audio.palette.hint": "Цветовая палитра для полос спектра или пульсации бита.",
- "color_strip.audio.color": "Базовый цвет:",
- "color_strip.audio.color.hint": "Цвет низкого уровня для полосы VU-метра.",
- "color_strip.audio.color_peak": "Пиковый цвет:",
- "color_strip.audio.color_peak.hint": "Цвет высокого уровня в верхней части полосы VU-метра.",
- "color_strip.audio.mirror": "Зеркало:",
- "color_strip.audio.mirror.hint": "Зеркалирование спектра от центра к краям: басы в середине, высокие частоты по краям.",
- "color_strip.effect.type": "Тип эффекта:",
- "color_strip.effect.type.hint": "Выберите процедурный алгоритм.",
- "color_strip.effect.fire": "Огонь",
- "color_strip.effect.fire.desc": "Клеточный автомат, имитирующий поднимающееся пламя с диффузией тепла",
- "color_strip.effect.meteor": "Метеор",
- "color_strip.effect.meteor.desc": "Яркая точка движется по ленте с экспоненциально затухающим хвостом",
- "color_strip.effect.plasma": "Плазма",
- "color_strip.effect.plasma.desc": "Наложение синусоидальных волн с палитрой — классический демо-эффект",
- "color_strip.effect.noise": "Шум",
- "color_strip.effect.noise.desc": "Прокручиваемый фрактальный шум, отображённый на палитру",
- "color_strip.effect.aurora": "Аврора",
- "color_strip.effect.aurora.desc": "Наложенные шумовые полосы, дрейфующие и смешивающиеся — в стиле северного сияния",
- "color_strip.effect.speed": "Скорость:",
- "color_strip.effect.speed.hint": "Множитель скорости анимации эффекта (0.1 = очень медленно, 10.0 = очень быстро).",
- "color_strip.effect.palette": "Палитра:",
- "color_strip.effect.palette.hint": "Цветовая палитра для отображения значений эффекта в RGB-цвета.",
- "color_strip.effect.color": "Цвет метеора:",
- "color_strip.effect.color.hint": "Цвет головной точки метеора.",
- "color_strip.effect.intensity": "Интенсивность:",
- "color_strip.effect.intensity.hint": "Интенсивность эффекта — частота искр (огонь), затухание хвоста (метеор) или диапазон яркости (аврора).",
- "color_strip.effect.scale": "Масштаб:",
- "color_strip.effect.scale.hint": "Пространственный масштаб — частота волн (плазма), уровень масштабирования (шум) или ширина полос (аврора).",
- "color_strip.effect.mirror": "Отражение:",
- "color_strip.effect.mirror.hint": "Режим отскока — метеор меняет направление у краёв ленты вместо переноса.",
- "color_strip.palette.fire": "Огонь",
- "color_strip.palette.ocean": "Океан",
- "color_strip.palette.lava": "Лава",
- "color_strip.palette.forest": "Лес",
- "color_strip.palette.rainbow": "Радуга",
- "color_strip.palette.aurora": "Аврора",
- "color_strip.palette.sunset": "Закат",
- "color_strip.palette.ice": "Лёд",
- "audio_source.title": "Аудиоисточники",
- "audio_source.add": "Добавить аудиоисточник",
- "audio_source.add.capture": "Добавить источник захвата",
- "audio_source.add.processed": "Добавить обработанный источник",
- "audio_source.edit": "Редактировать аудиоисточник",
- "audio_source.edit.capture": "Редактировать источник захвата",
- "audio_source.edit.processed": "Редактировать обработанный источник",
- "audio_source.name": "Название:",
- "audio_source.name.placeholder": "Системный звук",
- "audio_source.name.hint": "Описательное имя для этого аудиоисточника",
- "audio_source.type": "Тип:",
- "audio_source.type.hint": "Захват оборачивает физическое аудиоустройство. Обработанный применяет фильтры обработки к другому источнику.",
- "audio_source.type.capture": "Захват",
- "audio_source.type.processed": "Обработанный",
- "audio_source.device": "Аудиоустройство:",
- "audio_source.device.hint": "Источник аудиосигнала. Устройства обратной петли захватывают системный звук; устройства ввода — микрофон или линейный вход.",
- "audio_source.refresh_devices": "Обновить устройства",
- "audio_source.parent": "Входной аудиоисточник:",
- "audio_source.parent.hint": "Аудиоисточник для применения фильтров обработки",
- "audio_source.processing_template": "Шаблон обработки:",
- "audio_source.processing_template.hint": "Шаблон обработки аудио с фильтрами для применения к входному источнику",
- "audio_source.description": "Описание (необязательно):",
- "audio_source.description.placeholder": "Опишите этот аудиоисточник...",
- "audio_source.description.hint": "Необязательные заметки об этом аудиоисточнике",
- "audio_source.created": "Аудиоисточник создан",
- "audio_source.updated": "Аудиоисточник обновлён",
- "audio_source.deleted": "Аудиоисточник удалён",
- "audio_source.delete.confirm": "Удалить этот аудиоисточник?",
- "audio_source.error.name_required": "Введите название",
- "audio_source.audio_template": "Аудиошаблон:",
- "audio_source.audio_template.hint": "Шаблон аудиозахвата определяет, какой движок и настройки использовать для этого устройства",
- "audio_source.test": "Тест",
- "audio_source.test.title": "Тест аудиоисточника",
- "audio_source.test.rms": "RMS",
- "audio_source.test.peak": "Пик",
- "audio_source.test.beat": "Бит",
- "audio_source.test.connecting": "Подключение...",
- "audio_source.test.error": "Ошибка теста аудио",
- "audio_template.test": "Тест",
- "audio_template.test.title": "Тест аудиошаблона",
- "audio_template.test.device": "Аудиоустройство:",
- "audio_template.test.device.hint": "Выберите устройство для захвата звука во время теста",
- "audio_template.test.run": "Запуск",
- "audio_template.title": "Аудиошаблоны",
- "audio_template.add": "Добавить аудиошаблон",
- "audio_template.edit": "Редактировать аудиошаблон",
- "audio_template.name": "Название шаблона:",
- "audio_template.name.placeholder": "Мой аудиошаблон",
- "audio_template.description.label": "Описание (необязательно):",
- "audio_template.description.placeholder": "Опишите этот шаблон...",
- "audio_template.engine": "Аудиодвижок:",
- "audio_template.engine.hint": "Выберите движок аудиозахвата. WASAPI — только Windows с поддержкой loopback. Sounddevice — кроссплатформенный.",
- "audio_template.engine.unavailable": "Недоступен",
- "audio_template.engine.unavailable.hint": "Этот движок недоступен в вашей системе",
- "audio_template.config": "Конфигурация",
- "audio_template.config.show": "Показать конфигурацию",
- "audio_template.created": "Аудиошаблон создан",
- "audio_template.updated": "Аудиошаблон обновлён",
- "audio_template.deleted": "Аудиошаблон удалён",
- "audio_template.delete.confirm": "Удалить этот аудиошаблон?",
- "audio_template.error.load": "Не удалось загрузить аудиошаблоны",
- "audio_template.error.engines": "Не удалось загрузить аудиодвижки",
- "audio_template.error.required": "Пожалуйста, заполните все обязательные поля",
- "audio_template.error.delete": "Не удалось удалить аудиошаблон",
- "audio_template.error.save_failed": "Не удалось сохранить аудиошаблон",
- "audio_template.error.load_failed": "Не удалось загрузить аудиошаблон",
- "gradient.error.save_failed": "Не удалось сохранить градиент",
- "gradient.error.delete_failed": "Не удалось удалить градиент",
- "streams.group.value": "Источники значений",
- "streams.group.sync": "Часы синхронизации",
- "tree.group.picture": "Источники изображений",
- "tree.group.capture": "Захват экрана",
- "tree.group.static": "Статичные",
- "tree.group.processing": "Обработанные",
- "tree.group.strip": "Цветовые полосы",
- "tree.group.audio": "Аудио",
- "tree.group.audio_capture": "Захват",
- "tree.group.audio_processed": "Обработка",
- "tree.group.utility": "Утилиты",
- "tree.leaf.sources": "Источники",
- "tree.leaf.engine_templates": "Шаблоны движка",
- "tree.leaf.images": "Изображения",
- "tree.leaf.video": "Видео",
- "tree.leaf.filter_templates": "Шаблоны фильтров",
- "tree.leaf.processing_templates": "Шаблоны обработки",
- "tree.leaf.templates": "Шаблоны",
- "value_source.group.title": "Источники значений",
- "value_source.select_type": "Выберите тип источника значений",
- "value_source.add": "Добавить источник значений",
- "value_source.edit": "Редактировать источник значений",
- "value_source.name": "Название:",
- "value_source.name.placeholder": "Пульс яркости",
- "value_source.name.hint": "Описательное имя для этого источника значений",
- "value_source.type": "Тип:",
- "value_source.type.hint": "Статический выдаёт постоянное значение. Анимированный циклически меняет форму волны. Аудио реагирует на звук. Адаптивные типы автоматически подстраивают яркость по времени суток или содержимому сцены.",
- "value_source.type.static": "Статический",
- "value_source.type.static.desc": "Постоянное выходное значение",
- "value_source.type.animated": "Анимированный",
- "value_source.type.animated.desc": "Циклическая смена по форме волны",
- "value_source.type.audio": "Аудио",
- "value_source.type.audio.desc": "Реагирует на звуковой сигнал",
- "value_source.type.adaptive_time": "Адаптивный (Время)",
- "value_source.type.adaptive_time.desc": "Подстройка по времени суток",
- "value_source.type.adaptive_scene": "Адаптивный (Сцена)",
- "value_source.type.adaptive_scene.desc": "Подстройка по содержимому сцены",
- "value_source.type.daylight": "Дневной цикл",
- "value_source.type.daylight.desc": "Значение следует циклу дня/ночи",
- "value_source.daylight.speed": "Скорость:",
- "value_source.daylight.speed.hint": "Множитель скорости цикла. 1.0 = полный цикл день/ночь за ~4 минуты.",
- "value_source.daylight.use_real_time": "Реальное время:",
- "value_source.daylight.use_real_time.hint": "Значение следует за реальным временем суток. Скорость игнорируется.",
- "value_source.normalize": "Нормализовать в 0–1:",
- "value_source.normalize.hint": "Вкл.: масштабировать сырое значение в 0–1 по Min/Max. Выкл.: значение ограничивается диапазоном 0–1 как есть (для источников, уже выдающих долю 0–1). Сырое значение остаётся доступным в шаблонах (raw[name]) и автоматизациях.",
- "value_source.daylight.enable_real_time": "Следовать за часами",
- "value_source.daylight.latitude": "Широта:",
- "value_source.daylight.latitude.hint": "Географическая широта (-90 до 90). Делает переходы рассвета и заката круче или плавнее.",
- "value_source.daylight.longitude": "Долгота:",
- "value_source.daylight.longitude.hint": "Географическая долгота (-180 до 180). Сдвигает солнечный полдень для точного совпадения восхода и заката с настенными часами.",
- "value_source.daylight.real_time": "Реальное время",
- "value_source.daylight.speed_label": "Скорость",
- "value_source.value": "Значение:",
- "value_source.value.hint": "Постоянное выходное значение (0.0 = выкл, 1.0 = полная яркость)",
- "value_source.waveform": "Форма волны:",
- "value_source.waveform.hint": "Форма цикла анимации яркости",
- "value_source.waveform.sine": "Синус",
- "value_source.waveform.triangle": "Треугольник",
- "value_source.waveform.square": "Прямоугольник",
- "value_source.waveform.sawtooth": "Пила",
- "value_source.speed": "Скорость (цикл/мин):",
- "value_source.speed.hint": "Циклов в минуту — как быстро повторяется волна (1 = очень медленно, 120 = очень быстро)",
- "value_source.min_value": "Мин. значение:",
- "value_source.min_value.hint": "Минимальный выход цикла волны",
- "value_source.max_value": "Макс. значение:",
- "value_source.max_value.hint": "Максимальный выход цикла волны",
- "value_source.audio_source": "Аудиоисточник:",
- "value_source.audio_source.hint": "Аудиоисточник для считывания уровня звука",
- "value_source.mode": "Режим:",
- "value_source.mode.hint": "RMS измеряет среднюю громкость. Пик отслеживает самые громкие моменты. Бит реагирует на ритм.",
- "value_source.mode.rms": "RMS (Громкость)",
- "value_source.mode.peak": "Пик",
- "value_source.mode.beat": "Бит",
- "value_source.mode.rms.desc": "Средний уровень громкости",
- "value_source.mode.peak.desc": "Отслеживание пиковых моментов",
- "value_source.mode.beat.desc": "Детекция ритмических ударов",
- "value_source.auto_gain": "Авто-усиление:",
- "value_source.auto_gain.hint": "Автоматически нормализует уровни звука, чтобы выходное значение использовало полный диапазон независимо от громкости входного сигнала",
- "value_source.auto_gain.enable": "Включить авто-усиление",
- "value_source.sensitivity": "Чувствительность:",
- "value_source.sensitivity.hint": "Множитель усиления аудиосигнала (выше = более реактивный)",
- "value_source.scene_sensitivity.hint": "Множитель усиления сигнала яркости (выше = более чувствительный к изменениям яркости)",
- "value_source.smoothing": "Сглаживание:",
- "value_source.smoothing.hint": "Временное сглаживание (0 = мгновенный отклик, 1 = очень плавный/медленный)",
- "value_source.audio_min_value": "Мин. значение:",
- "value_source.audio_min_value.hint": "Выход при тишине (напр. 0.3 = минимум 30% яркости)",
- "value_source.audio_max_value": "Макс. значение:",
- "value_source.audio_max_value.hint": "Выход при максимальном уровне звука",
- "value_source.schedule": "Расписание:",
- "value_source.schedule.hint": "Определите минимум 2 временные точки. Яркость линейно интерполируется между ними, с переходом через полночь.",
- "value_source.schedule.add": "+ Добавить точку",
- "value_source.schedule.points": "точек",
- "value_source.picture_source": "Источник изображения:",
- "value_source.picture_source.hint": "Источник изображения, кадры которого будут анализироваться на среднюю яркость.",
- "value_source.scene_behavior": "Поведение:",
- "value_source.scene_behavior.hint": "Дополнение: тёмная сцена = высокая яркость (для фоновой подсветки). Совпадение: яркая сцена = высокая яркость.",
- "value_source.scene_behavior.complement": "Дополнение (тёмный → ярко)",
- "value_source.scene_behavior.match": "Совпадение (яркий → ярко)",
- "value_source.adaptive_min_value": "Мин. значение:",
- "value_source.adaptive_min_value.hint": "Минимальная выходная яркость",
- "value_source.adaptive_max_value": "Макс. значение:",
- "value_source.adaptive_max_value.hint": "Максимальная выходная яркость",
- "value_source.error.schedule_min": "Расписание требует минимум 2 временные точки",
- "value_source.description": "Описание (необязательно):",
- "value_source.description.placeholder": "Опишите этот источник значений...",
- "value_source.description.hint": "Необязательные заметки об этом источнике значений",
- "value_source.created": "Источник значений создан",
- "value_source.updated": "Источник значений обновлён",
- "value_source.deleted": "Источник значений удалён",
- "value_source.delete.confirm": "Удалить этот источник значений?",
- "value_source.error.name_required": "Введите название",
- "value_source.test": "Тест",
- "value_source.test.title": "Тест источника значений",
- "value_source.test.connecting": "Подключение...",
- "value_source.test.error": "Не удалось подключиться",
- "value_source.test.current": "Текущее",
- "value_source.test.min": "Мин",
- "value_source.test.max": "Макс",
- "test.frames": "Кадры",
- "test.fps": "Кадр/с",
- "test.avg_capture": "Сред",
- "targets.brightness": "Яркость:",
- "targets.brightness.hint": "Множитель яркости (0–1). Можно привязать к источнику значений для динамического управления.",
- "targets.brightness_vs": "Источник яркости:",
- "targets.brightness_vs.hint": "Необязательный источник значений для динамического управления яркостью каждый кадр (переопределяет яркость устройства)",
- "targets.brightness_vs.none": "Нет (яркость устройства)",
- "targets.min_brightness_threshold": "Мин. порог яркости:",
- "targets.min_brightness_threshold.hint": "Если итоговая яркость (яркость пикселей × яркость устройства/источника) ниже этого значения, светодиоды полностью выключаются (0 = отключено)",
- "targets.adaptive_fps": "Адаптивный FPS:",
- "targets.adaptive_fps.hint": "Автоматически снижает частоту отправки, когда устройство перестаёт отвечать, и постепенно восстанавливает её при стабилизации. Рекомендуется для WiFi-устройств со слабым сигналом.",
- "targets.protocol": "Протокол:",
- "targets.protocol.hint": "DDP отправляет пиксели по быстрому UDP (рекомендуется). HTTP использует JSON API — медленнее, но надёжнее, ограничение ~500 LED.",
- "targets.power_limit": "Макс. ток (ABL):",
- "targets.power_limit.hint": "Ограничивает расчётный ток ленты бюджетом блока питания, чтобы избежать просадок напряжения (сдвиг цвета, мерцание, перезагрузки) на ярких/белых сценах. Укажите номинальный ток вашего БП с запасом. 0 = без ограничения.",
- "targets.power_limit.ma_suffix": "мА (0 = без ограничения)",
- "targets.power_limit.per_led": "мА на светодиод (полный белый):",
- "targets.protocol.ddp": "DDP (UDP)",
- "targets.protocol.ddp.desc": "Быстрые UDP-пакеты — рекомендуется",
- "targets.protocol.udp": "WLED UDP (realtime)",
- "targets.protocol.udp.desc": "Нативный realtime WLED — корректный RGBW и авто-возврат при обрыве потока",
- "targets.protocol.http": "HTTP",
- "targets.protocol.http.desc": "JSON API — медленнее, ≤500 LED",
- "targets.protocol.serial": "Serial",
- "search.open": "Поиск (Ctrl+K)",
- "search.placeholder": "Поиск... (Ctrl+K)",
- "search.loading": "Загрузка...",
- "search.no_results": "Ничего не найдено",
- "search.group.devices": "Устройства",
- "search.group.targets": "LED-цели",
- "search.group.kc_targets": "Цели Key Colors",
- "search.group.css": "Источники цветных лент",
- "search.group.automations": "Автоматизации",
- "search.group.streams": "Потоки изображений",
- "search.group.capture_templates": "Шаблоны захвата",
- "search.group.pp_templates": "Шаблоны постобработки",
- "search.group.pattern_templates": "Шаблоны паттернов",
- "search.group.audio": "Аудиоисточники",
- "search.group.value": "Источники значений",
- "search.group.scenes": "Пресеты сцен",
- "search.group.cspt": "Шаблоны обработки полос",
- "search.group.sync_clocks": "Синхронные часы",
- "search.group.actions": "Действия",
- "search.action.start": "Запустить",
- "search.action.stop": "Остановить",
- "search.action.activate": "Активировать",
- "search.action.enable": "Включить",
- "search.action.disable": "Отключить",
- "settings.backup.label": "Резервное копирование",
- "settings.backup.hint": "Скачать всю конфигурацию (устройства, цели, потоки, шаблоны, автоматизации) в виде одного JSON-файла.",
- "settings.backup.button": "Скачать",
- "settings.backup.success": "Резервная копия скачана",
- "settings.backup.error": "Ошибка скачивания резервной копии",
- "settings.restore.label": "Восстановление конфигурации",
- "settings.restore.hint": "Загрузите ранее сохранённый файл резервной копии для замены всей конфигурации. Сервер перезапустится автоматически.",
- "settings.restore.button": "Восстановить",
- "settings.restore.confirm": "Это заменит ВСЮ конфигурацию и перезапустит сервер. Вы уверены?",
- "settings.restore.success": "Конфигурация восстановлена",
- "settings.restore.error": "Ошибка восстановления",
- "settings.restore.restarting": "Сервер перезапускается...",
- "settings.restore.restart_timeout": "Сервер не отвечает. Обновите страницу вручную.",
- "settings.restart_server": "Перезапустить сервер",
- "settings.restart_confirm": "Перезапустить сервер? Активные цели будут остановлены.",
- "settings.restarting": "Перезапуск сервера...",
- "settings.button.close": "Закрыть",
- "settings.log_level.label": "Уровень логирования",
- "settings.log_level.hint": "Изменить подробность логов сервера в реальном времени. DEBUG — максимум деталей, CRITICAL — только критические ошибки.",
- "settings.log_level.save": "Применить",
- "settings.log_level.saved": "Уровень логирования изменён",
- "settings.log_level.save_error": "Не удалось изменить уровень логирования",
- "settings.log_level.desc.debug": "Подробный вывод для разработки",
- "settings.log_level.desc.info": "Обычные сообщения",
- "settings.log_level.desc.warning": "Возможные проблемы",
- "settings.log_level.desc.error": "Только ошибки",
- "settings.log_level.desc.critical": "Только критические ошибки",
- "settings.shutdown_action.label": "Действие при выключении",
- "settings.shutdown_action.hint": "Что происходит с LED-целями при остановке сервера. «Остановить цели» — обычная последовательность остановки, устройства с авто-восстановлением восстановят прежнее состояние. «Ничего» — оставить свет таким, каким он был на последнем кадре.",
- "settings.shutdown_action.saved": "Действие при выключении сохранено",
- "settings.shutdown_action.save_error": "Не удалось сохранить действие при выключении",
- "settings.shutdown_action.opt.stop": "Остановить цели",
- "settings.shutdown_action.opt.stop_desc": "Обычная остановка (учитывается авто-восстановление устройств)",
- "settings.shutdown_action.opt.nothing": "Ничего",
- "settings.shutdown_action.opt.nothing_desc": "Оставить свет на последнем кадре",
- "settings.daylight_timezone.label": "Часовой пояс дневного цикла",
- "settings.daylight_timezone.hint": "IANA часовой пояс, в котором каждый дневной цикл «реального времени» читает настенные часы. Пусто (по умолчанию) — использовать системный часовой пояс сервера.",
- "settings.daylight_timezone.saved": "Часовой пояс дневного цикла сохранён",
- "settings.daylight_timezone.save_error": "Не удалось сохранить часовой пояс",
- "common.daylight_tz.system": "Системный по умолчанию",
- "common.daylight_tz.system_desc": "Часы сервера — без переопределения",
- "common.daylight_tz.detected": "Определён браузером",
- "common.daylight_tz.detected_label": "Авто-определение",
- "common.daylight_tz.search": "Поиск по поясам, городам, регионам…",
- "common.daylight_tz.region.utc": "Универсальное",
- "common.daylight_tz.region.europe": "Европа",
- "common.daylight_tz.region.africa": "Африка",
- "common.daylight_tz.region.me": "Ближний Восток",
- "common.daylight_tz.region.asia": "Азия",
- "common.daylight_tz.region.pacific": "Тихий океан",
- "common.daylight_tz.region.americas": "Америка",
- "settings.auto_backup.label": "Авто-бэкап",
- "settings.auto_backup.hint": "Автоматическое создание периодических резервных копий конфигурации. Старые копии удаляются при превышении максимального количества.",
- "settings.auto_backup.enable": "Включить авто-бэкап",
- "settings.auto_backup.interval_label": "Интервал",
- "settings.auto_backup.max_label": "Макс. копий",
- "settings.auto_backup.save": "Сохранить настройки",
- "settings.auto_backup.saved": "Настройки авто-бэкапа сохранены",
- "settings.auto_backup.save_error": "Не удалось сохранить настройки авто-бэкапа",
- "settings.auto_backup.backup_now": "Создать бэкап",
- "settings.auto_backup.backup_created": "Бэкап создан",
- "settings.auto_backup.backup_error": "Ошибка создания бэкапа",
- "settings.auto_backup.last_backup": "Последний бэкап",
- "settings.auto_backup.never": "Никогда",
- "settings.saved_backups.label": "Сохранённые копии",
- "settings.saved_backups.hint": "Файлы авто-бэкапа на сервере. Скачайте для локального хранения или удалите для освобождения места.",
- "settings.saved_backups.empty": "Нет сохранённых копий",
- "settings.saved_backups.restore": "Восстановить",
- "settings.saved_backups.download": "Скачать",
- "settings.saved_backups.delete": "Удалить",
- "settings.saved_backups.delete_confirm": "Удалить эту резервную копию?",
- "settings.saved_backups.delete_error": "Не удалось удалить копию",
- "settings.saved_backups.type.auto": "авто",
- "settings.saved_backups.type.manual": "ручной",
- "settings.mqtt.label": "MQTT",
- "settings.mqtt.hint": "Настройте подключение к MQTT-брокеру для условий и триггеров автоматизации.",
- "settings.mqtt.enabled": "Включить MQTT",
- "settings.mqtt.host_label": "Хост брокера",
- "settings.mqtt.port_label": "Порт",
- "settings.mqtt.username_label": "Имя пользователя",
- "settings.mqtt.password_label": "Пароль",
- "settings.mqtt.password_set_hint": "Пароль задан — оставьте пустым, чтобы сохранить",
- "settings.mqtt.client_id_label": "Идентификатор клиента",
- "settings.mqtt.base_topic_label": "Базовый топик",
- "settings.mqtt.save": "Сохранить настройки MQTT",
- "settings.mqtt.saved": "Настройки MQTT сохранены",
- "settings.mqtt.save_error": "Не удалось сохранить настройки MQTT",
- "settings.mqtt.error_host_required": "Требуется указать хост брокера",
- "settings.logs.label": "Журнал сервера",
- "settings.logs.hint": "Просмотр журнала сервера в реальном времени. Используйте фильтр для отображения нужных уровней.",
- "settings.logs.connect": "Подключить",
- "settings.logs.disconnect": "Отключить",
- "settings.logs.clear": "Очистить",
- "settings.logs.error": "Ошибка подключения к журналу",
- "settings.logs.filter.all": "Все уровни",
- "settings.logs.filter.info": "Info+",
- "settings.logs.filter.warning": "Warning+",
- "settings.logs.filter.error": "Только ошибки",
- "settings.logs.filter.all_desc": "Все сообщения лога",
- "settings.logs.filter.info_desc": "Info, предупреждения и ошибки",
- "settings.logs.filter.warning_desc": "Только предупреждения и ошибки",
- "settings.logs.filter.error_desc": "Только ошибки",
- "settings.logs.stat.lines": "СТРОК",
- "settings.logs.stat.warn": "ВНИМ",
- "settings.logs.stat.err": "ОШИБ",
- "settings.logs.patch.idle": "ОЖИДАНИЕ",
- "settings.logs.patch.connecting": "ПОДКЛЮЧЕНИЕ",
- "settings.logs.patch.live": "ПОТОК",
- "settings.logs.patch.error": "ОФЛАЙН",
- "settings.logs.empty.title": "Ожидание журналов",
- "settings.logs.empty.sub": "Подключите WebSocket-поток, чтобы начать трансляцию.",
- "device.error.power_off_failed": "Не удалось выключить устройство",
- "device.error.remove_failed": "Не удалось удалить устройство",
- "device.error.settings_load_failed": "Не удалось загрузить настройки устройства",
- "device.error.brightness": "Не удалось обновить яркость",
- "device.error.required": "Пожалуйста, заполните все поля",
- "device.error.update": "Не удалось обновить устройство",
- "device.error.save": "Не удалось сохранить настройки",
- "device.error.clone_failed": "Не удалось клонировать устройство",
- "device.error.load_failed": "Не удалось загрузить устройство",
- "device_discovery.error.fill_all_fields": "Пожалуйста, заполните все поля",
- "device_discovery.added": "Устройство успешно добавлено",
- "device_discovery.error.add_failed": "Не удалось добавить устройство",
- "calibration.error.load_failed": "Не удалось загрузить калибровку",
- "calibration.error.css_load_failed": "Не удалось загрузить источник цветовой полосы",
- "calibration.error.test_toggle_failed": "Не удалось переключить тестовый край",
- "calibration.error.save_failed": "Не удалось сохранить калибровку",
- "calibration.error.led_count_mismatch": "Общее количество LED должно совпадать с количеством LED устройства",
- "calibration.error.led_count_exceeded": "Калиброванных LED больше, чем общее количество LED",
- "calibration.mode.simple": "Простой",
- "calibration.mode.advanced": "Расширенный",
- "calibration.switch_to_advanced": "Расширенный режим",
- "calibration.advanced.title": "Расширенная калибровка",
- "calibration.advanced.switch_to_simple": "Простой режим",
- "calibration.advanced.lines_title": "Линии",
- "calibration.advanced.canvas_hint": "Перетаскивайте мониторы. Нажимайте на грани для выбора линий. Прокрутка — масштаб, перетаскивание пустого места — сдвиг.",
- "calibration.advanced.reset_view": "Сбросить вид",
- "calibration.advanced.line_properties": "Свойства линии",
- "calibration.advanced.picture_source": "Источник:",
- "calibration.advanced.picture_source.hint": "Источник изображения (монитор), с которого эта линия снимает данные",
- "calibration.advanced.edge": "Грань:",
- "calibration.advanced.edge.hint": "С какой грани экрана снимать пиксели",
- "calibration.advanced.led_count": "Светодиоды:",
- "calibration.advanced.led_count.hint": "Количество светодиодов на этой линии",
- "calibration.advanced.span_start": "Начало:",
- "calibration.advanced.span_start.hint": "Откуда начинается захват вдоль грани (0 = начало, 1 = конец). Позволяет покрыть только часть грани.",
- "calibration.advanced.span_end": "Конец:",
- "calibration.advanced.span_end.hint": "Где заканчивается захват вдоль грани (0 = начало, 1 = конец). Вместе с «Начало» определяет активный участок.",
- "calibration.advanced.border_width": "Глубина (пкс):",
- "calibration.advanced.border_width.hint": "Сколько пикселей вглубь от края захватывать. Большие значения берут больше внутренней части экрана.",
- "calibration.advanced.reverse": "Реверс",
- "calibration.advanced.no_lines_warning": "Добавьте хотя бы одну линию",
- "dashboard.error.automation_toggle_failed": "Не удалось переключить автоматизацию",
- "dashboard.error.start_failed": "Не удалось запустить обработку",
- "dashboard.error.stop_failed": "Не удалось остановить обработку",
- "dashboard.error.stop_all": "Не удалось остановить все цели",
- "target.error.editor_open_failed": "Не удалось открыть редактор цели",
- "target.error.start_failed": "Не удалось запустить цель",
- "target.error.stop_failed": "Не удалось остановить цель",
- "target.error.clone_failed": "Не удалось клонировать цель",
- "target.error.delete_failed": "Не удалось удалить цель",
- "target.error.load_failed": "Не удалось загрузить цель",
- "targets.stop_all.button": "Остановить все",
- "targets.stop_all.none_running": "Нет запущенных целей",
- "targets.stop_all.stopped": "Остановлено целей: {count}",
- "targets.stop_all.error": "Не удалось остановить цели",
- "audio_source.error.load": "Не удалось загрузить аудиоисточник",
- "audio_template.error.clone_failed": "Не удалось клонировать аудиошаблон",
- "value_source.error.load": "Не удалось загрузить источник значений",
- "color_strip.error.editor_open_failed": "Не удалось открыть редактор цветовой полосы",
- "color_strip.error.clone_failed": "Не удалось клонировать источник цветовой полосы",
- "color_strip.error.delete_failed": "Не удалось удалить источник цветовой полосы",
- "pattern.error.editor_open_failed": "Не удалось открыть редактор шаблона узоров",
- "pattern.error.clone_failed": "Не удалось клонировать шаблон узоров",
- "pattern.error.delete_failed": "Не удалось удалить шаблон узоров",
- "pattern.error.capture_bg_failed": "Не удалось захватить фон",
- "pattern.error.save_failed": "Не удалось сохранить шаблон узоров",
- "stream.error.clone_picture_failed": "Не удалось клонировать источник изображения",
- "stream.error.clone_capture_failed": "Не удалось клонировать шаблон захвата",
- "stream.error.clone_pp_failed": "Не удалось клонировать шаблон постобработки",
- "theme.switched.dark": "Переключено на тёмную тему",
- "theme.switched.light": "Переключено на светлую тему",
- "theme.switched.system": "Переключено на системную тему",
- "accent.color.updated": "Цвет акцента обновлён",
- "search.footer": "↑↓ навигация · Enter выбор · Esc закрыть",
- "sync_clock.group.title": "Часы синхронизации",
- "sync_clock.add": "Добавить часы",
- "sync_clock.edit": "Редактировать часы",
- "sync_clock.name": "Название:",
- "sync_clock.name.placeholder": "Основные часы анимации",
- "sync_clock.name.hint": "Описательное название для этих часов синхронизации",
- "sync_clock.speed": "Скорость:",
- "sync_clock.speed.hint": "Множитель скорости анимации для всех привязанных источников. 1.0 = обычная, 2.0 = двойная, 0.5 = половинная.",
- "sync_clock.description": "Описание (необязательно):",
- "sync_clock.description.placeholder": "Необязательное описание",
- "sync_clock.description.hint": "Необязательные заметки о назначении этих часов",
- "sync_clock.status.running": "Работает",
- "sync_clock.status.paused": "Приостановлено",
- "sync_clock.action.pause": "Приостановить",
- "sync_clock.action.resume": "Возобновить",
- "sync_clock.action.reset": "Сбросить",
- "sync_clock.error.name_required": "Название часов обязательно",
- "sync_clock.error.load": "Не удалось загрузить часы синхронизации",
- "sync_clock.created": "Часы синхронизации созданы",
- "sync_clock.updated": "Часы синхронизации обновлены",
- "sync_clock.deleted": "Часы синхронизации удалены",
- "sync_clock.paused": "Часы приостановлены",
- "sync_clock.resumed": "Часы возобновлены",
- "sync_clock.reset_done": "Часы сброшены на ноль",
- "sync_clock.delete.confirm": "Удалить эти часы синхронизации? Привязанные источники потеряют синхронизацию и будут работать на скорости по умолчанию.",
- "sync_clock.elapsed": "Прошло времени",
- "weather_source.group.title": "Источники погоды",
- "weather_source.add": "Добавить источник погоды",
- "weather_source.edit": "Редактировать источник погоды",
- "weather_source.name": "Название:",
- "weather_source.name.placeholder": "Моя погода",
- "weather_source.name.hint": "Описательное название источника погоды",
- "weather_source.provider": "Провайдер:",
- "weather_source.provider.hint": "Провайдер метеоданных. Open-Meteo бесплатный и не требует API ключа.",
- "weather_source.provider.open_meteo.desc": "Бесплатно, без API ключа",
- "weather_source.location": "Местоположение:",
- "weather_source.location.hint": "Географические координаты. Используйте автоопределение или введите вручную.",
- "weather_source.latitude": "Шир:",
- "weather_source.longitude": "Долг:",
- "weather_source.use_my_location": "Определить",
- "weather_source.update_interval": "Интервал обновления:",
- "weather_source.update_interval.hint": "Частота запроса метеоданных. Меньше = более оперативные обновления.",
- "weather_source.description": "Описание (необязательно):",
- "weather_source.description.placeholder": "Необязательное описание",
- "weather_source.test": "Тест",
- "weather_source.error.name_required": "Название источника погоды обязательно",
- "weather_source.error.load": "Не удалось загрузить источник погоды",
- "weather_source.created": "Источник погоды создан",
- "weather_source.updated": "Источник погоды обновлён",
- "weather_source.deleted": "Источник погоды удалён",
- "weather_source.delete.confirm": "Удалить этот источник погоды? Связанные источники цветовых лент потеряют данные о погоде.",
- "weather_source.geo.success": "Местоположение определено",
- "weather_source.geo.error": "Ошибка геолокации",
- "weather_source.geo.not_supported": "Геолокация не поддерживается вашим браузером",
- "streams.group.weather": "Погода",
- "section.empty.weather_sources": "Нет источников погоды. Нажмите + для добавления.",
- "color_strip.clock": "Часы синхронизации:",
- "color_strip.clock.hint": "Привязка к часам для синхронизации анимации между источниками. Скорость управляется на часах.",
- "graph.title": "Граф",
- "graph.fit_all": "Показать все узлы",
- "graph.zoom_in": "Приблизить",
- "graph.zoom_out": "Отдалить",
- "graph.search": "Поиск узлов",
- "graph.search_placeholder": "Поиск сущностей...",
- "graph.legend": "Легенда",
- "graph.minimap": "Миникарта",
- "graph.relayout": "Перестроить",
- "graph.empty": "Ещё нет сущностей",
- "graph.empty.hint": "Создайте устройства, источники и цели, чтобы увидеть их здесь.",
- "graph.disconnect": "Отключить",
- "graph.connection_updated": "Соединение обновлено",
- "graph.connection_failed": "Не удалось обновить соединение",
- "graph.connection_removed": "Соединение удалено",
- "graph.disconnect_failed": "Не удалось отключить",
- "graph.relayout_confirm": "Сбросить все ручные позиции узлов и перестроить граф?",
- "graph.fullscreen": "Полноэкранный режим",
- "graph.add_entity": "Добавить сущность",
- "graph.color_picker": "Цвет узла",
- "graph.filter": "Фильтр узлов",
- "graph.filter_placeholder": "Фильтр по имени...",
- "graph.filter_clear": "Очистить фильтр",
- "graph.filter_running": "Запущен",
- "graph.filter_stopped": "Остановлен",
- "graph.filter_types": "Типы",
- "graph.filter_group.capture": "Захват",
- "graph.filter_group.strip": "Цвет. полосы",
- "graph.filter_group.audio": "Аудио",
- "graph.filter_group.targets": "Цели",
- "graph.filter_group.other": "Другое",
- "graph.bulk_delete_confirm": "Удалить {count} выбранных сущностей?",
- "graph.nothing_to_undo": "Нечего отменять",
- "graph.nothing_to_redo": "Нечего повторять",
- "graph.help_title": "Горячие клавиши",
- "graph.help.search": "Поиск",
- "graph.help.filter": "Фильтр",
- "graph.help.add": "Добавить сущность",
- "graph.help.shortcuts": "Горячие клавиши",
- "graph.help.delete": "Удалить / Отсоединить",
- "graph.help.select_all": "Выбрать все",
- "graph.help.undo": "Отменить",
- "graph.help.redo": "Повторить",
- "graph.help.fullscreen": "Полный экран",
- "graph.help.deselect": "Снять выбор",
- "graph.help.navigate": "Навигация по узлам",
- "graph.help.click": "Клик",
- "graph.help.click_desc": "Выбрать узел",
- "graph.help.dblclick": "Двойной клик",
- "graph.help.dblclick_desc": "Приблизить к узлу",
- "graph.help.shift_click": "Shift+Клик",
- "graph.help.shift_click_desc": "Множественный выбор",
- "graph.help.shift_drag": "Shift+Перетащить",
- "graph.help.shift_drag_desc": "Выбор рамкой",
- "graph.help.drag_node": "Перетащить узел",
- "graph.help.drag_node_desc": "Переместить",
- "graph.help.drag_port": "Перетащить порт",
- "graph.help.drag_port_desc": "Соединить сущности",
- "graph.help.right_click": "ПКМ по связи",
- "graph.help.right_click_desc": "Отсоединить связь",
- "graph.tooltip.fps": "FPS",
- "graph.tooltip.errors": "Ошибки",
- "graph.tooltip.uptime": "Время работы",
- "graph.undone": "Отменено",
- "graph.redone": "Повторено",
- "graph.action.connect": "Соединить",
- "graph.action.disconnect": "Отсоединить",
- "graph.action.move": "Переместить узел",
- "graph.action.rewire": "Переподключить слот",
- "graph.choose_connection": "Выберите соединение",
- "graph.rewire": "Переподключить…",
- "graph.rewire_choose_source": "Выберите новый источник",
- "graph.issues": "Проблемы",
- "graph.issues_none": "Проблем не найдено",
- "graph.issue.broken_ref": "Битая ссылка: {field}",
- "graph.issue.cycle": "Входит в цикл зависимостей",
- "graph.replace_connection_confirm": "Заменить существующее соединение?",
- "graph.no_compatible_connection": "Нет совместимого соединения между этими объектами",
- "graph.create_and_connect": "Создать и соединить…",
- "graph.export": "Экспорт графа (JSON)",
- "graph.export_done": "Граф экспортирован",
- "graph.export_failed": "Не удалось экспортировать граф",
- "graph.duplicate": "Дублировать выбранное",
- "graph.duplicate_none": "Выберите один или несколько узлов для дублирования",
- "graph.duplicate_none_eligible": "В выборе нечего дублировать (только источники значений и цветовых лент)",
- "graph.duplicate_done": "Продублировано источников: {count}",
- "graph.duplicate_done_warn": "Продублировано источников: {count} — часть ссылок не удалось перепривязать",
- "graph.duplicate_failed": "Не удалось дублировать выбранное",
- "graph.delete_with_dependents_confirm": "Этот объект используется {count} другими: {names}. Удалить и разорвать эти связи?",
- "automation.enabled": "Автоматизация включена",
- "automation.disabled": "Автоматизация выключена",
- "scene_preset.activated": "Пресет активирован",
- "scene_preset.used_by": "Используется в %d автоматизации(ях)",
- "settings.api_keys.label": "API-ключи",
- "settings.api_keys.hint": "API-ключи определяются в конфигурационном файле сервера (config.yaml). Отредактируйте файл и перезапустите сервер для применения изменений.",
- "settings.api_keys.empty": "API-ключи не настроены",
- "settings.api_keys.load_error": "Не удалось загрузить API-ключи",
- "settings.partial.label": "Частичный экспорт / импорт",
- "settings.partial.hint": "Экспортировать или импортировать один тип объектов. Импорт заменяет или объединяет данные и перезапускает сервер.",
- "settings.partial.store.devices": "Устройства",
- "settings.partial.store.output_targets": "LED-цели",
- "settings.partial.store.color_strip_sources": "Цветные полосы",
- "settings.partial.store.picture_sources": "Источники изображений",
- "settings.partial.store.audio_sources": "Аудио-источники",
- "settings.partial.store.audio_templates": "Аудио-шаблоны",
- "settings.partial.store.capture_templates": "Шаблоны захвата",
- "settings.partial.store.postprocessing_templates": "Шаблоны постобработки",
- "settings.partial.store.color_strip_processing_templates": "Шаблоны обработки полос",
- "settings.partial.store.pattern_templates": "Шаблоны паттернов",
- "settings.partial.store.value_sources": "Источники значений",
- "settings.partial.store.sync_clocks": "Синхронные часы",
- "settings.partial.store.automations": "Автоматизации",
- "settings.partial.store.scene_presets": "Пресеты сцен",
- "settings.partial.export_button": "Экспорт",
- "settings.partial.import_button": "Импорт из файла",
- "settings.partial.merge_label": "Объединить (добавить/перезаписать, сохранить существующие)",
- "settings.partial.export_success": "Экспорт выполнен",
- "settings.partial.export_error": "Ошибка экспорта",
- "settings.partial.import_success": "Импорт выполнен",
- "settings.partial.import_error": "Ошибка импорта",
- "settings.partial.import_confirm_replace": "Это ЗАМЕНИТ все данные {store} и перезапустит сервер. Продолжить?",
- "settings.partial.import_confirm_merge": "Это ОБЪЕДИНИТ данные {store} и перезапустит сервер. Продолжить?",
- "section.empty.devices": "Устройств пока нет. Нажмите + для добавления.",
- "section.empty.targets": "LED-целей пока нет. Нажмите + для добавления.",
- "section.empty.kc_targets": "Целей ключевых цветов пока нет. Нажмите + для добавления.",
- "section.empty.pattern_templates": "Шаблонов паттернов пока нет. Нажмите + для добавления.",
- "section.empty.picture_sources": "Источников пока нет. Нажмите + для добавления.",
- "section.empty.capture_templates": "Шаблонов захвата пока нет. Нажмите + для добавления.",
- "section.empty.pp_templates": "Шаблонов постобработки пока нет. Нажмите + для добавления.",
- "section.empty.audio_sources": "Аудио-источников пока нет. Нажмите + для добавления.",
- "section.empty.audio_templates": "Аудио-шаблонов пока нет. Нажмите + для добавления.",
- "section.empty.color_strips": "Цветных полос пока нет. Нажмите + для добавления.",
- "section.empty.value_sources": "Источников значений пока нет. Нажмите + для добавления.",
- "section.empty.sync_clocks": "Синхронных часов пока нет. Нажмите + для добавления.",
- "section.empty.cspt": "Шаблонов обработки полос пока нет. Нажмите + для добавления.",
- "section.empty.automations": "Автоматизаций пока нет. Нажмите + для добавления.",
- "section.empty.scenes": "Пресетов сцен пока нет. Нажмите + для добавления.",
- "section.empty.playlists": "Плейлистов пока нет. Нажмите + для добавления.",
- "bulk.select": "Выбрать",
- "bulk.cancel": "Отмена",
- "bulk.selected_count.one": "{count} выбран",
- "bulk.selected_count.few": "{count} выбрано",
- "bulk.selected_count.many": "{count} выбрано",
- "bulk.select_all": "Выбрать все",
- "bulk.deselect_all": "Снять выбор",
- "bulk.delete": "Удалить",
- "bulk.start": "Запустить",
- "bulk.stop": "Остановить",
- "bulk.enable": "Включить",
- "bulk.disable": "Выключить",
- "bulk.confirm_delete.one": "Удалить {count} элемент?",
- "bulk.confirm_delete.few": "Удалить {count} элемента?",
- "bulk.confirm_delete.many": "Удалить {count} элементов?",
- "appearance.style.label": "Стили оформления",
- "appearance.style.hint": "Выберите визуальную тему — шрифт и цветовая палитра применяются вместе.",
- "appearance.preset.default": "Стандарт",
- "appearance.preset.midnight": "Полночь",
- "appearance.preset.ember": "Угли",
- "appearance.preset.arctic": "Арктика",
- "appearance.preset.terminal": "Терминал",
- "appearance.preset.neon": "Неон",
- "appearance.preset.sakura": "Сакура",
- "appearance.preset.ocean": "Океан",
- "appearance.preset.copper": "Медь",
- "appearance.preset.vapor": "Вейпорвейв",
- "appearance.preset.monolith": "Монолит",
- "appearance.preset.applied": "Стиль применён",
- "appearance.bg.label": "Фоновые эффекты",
- "appearance.bg.hint": "Добавьте фоновый слой за интерфейсом.",
- "appearance.bg.none": "Нет",
- "appearance.bg.noise": "Шумовое поле",
- "appearance.bg.aurora": "Северное сияние",
- "appearance.bg.plasma": "Плазма",
- "appearance.bg.rain": "Цифровой дождь",
- "appearance.bg.stars": "Звёздное поле",
- "appearance.bg.warp": "Тоннель",
- "appearance.bg.grid": "Точечная сетка",
- "appearance.bg.mesh": "Градиент",
- "appearance.bg.scanlines": "Развёртка",
- "appearance.bg.applied": "Фоновый эффект применён",
- "settings.tab.notifications": "Уведомления",
- "settings.tab.updates": "Обновления",
- "settings.tab.about": "О программе",
- "settings.notifications.intro_label": "События устройств",
- "settings.notifications.intro_hint": "Выберите способ оповещения для каждого события. «Снэк» — всплывающее сообщение внутри приложения, «ОС» — системное уведомление (требуется разрешение в браузере), «Оба» — оба варианта, «Выкл» — событие игнорируется.",
- "settings.notifications.row.online": "Устройство вернулось в сеть",
- "settings.notifications.row.offline": "Устройство пропало",
- "settings.notifications.row.discovered": "Новое устройство найдено",
- "settings.notifications.row.lost": "Найденное устройство исчезло",
- "settings.notifications.background.label": "Фоновое обнаружение",
- "settings.notifications.background.hint": "Постоянно сканировать локальную сеть (mDNS) и последовательные порты на новые LED-устройства. Отключите, чтобы убрать события «найдено/потеряно» в источнике. Перезапустите сервер, чтобы применить.",
- "settings.notifications.background.toggle": "Включить фоновое обнаружение",
- "settings.notifications.permission.label": "Разрешение на уведомления ОС",
- "settings.notifications.permission.grant": "Разрешить",
- "settings.notifications.permission.granted": "Системные уведомления включены",
- "settings.notifications.permission.denied": "Системные уведомления заблокированы — измените в настройках браузера",
- "settings.notifications.permission.state.granted": "Разрешено — будут показываться уведомления ОС",
- "settings.notifications.permission.state.denied": "Запрещено — измените в настройках браузера",
- "settings.notifications.permission.state.default": "Разрешение ещё не запрошено",
- "settings.notifications.permission.hint": "Браузер управляет разрешением на системные уведомления для каждого сайта отдельно. После отказа LedGrab уже не может запросить разрешение снова — его нужно сбросить в браузере. Нажмите на значок сайта (замок) в адресной строке → Настройки сайта → Уведомления → Разрешить, затем перезагрузите страницу.",
- "settings.notifications.test_button": "Отправить тестовое уведомление",
- "settings.notifications.saved": "Настройки уведомлений сохранены",
- "settings.notifications.save_error": "Не удалось сохранить настройки уведомлений",
- "settings.notifications.channel.none.label": "Выкл",
- "settings.notifications.channel.none.desc": "Не уведомлять об этом событии",
- "settings.notifications.channel.snack.label": "Снэк",
- "settings.notifications.channel.snack.desc": "Всплывающее сообщение внизу страницы",
- "settings.notifications.channel.os.label": "ОС",
- "settings.notifications.channel.os.desc": "Системное уведомление (работает в фоне браузера)",
- "settings.notifications.channel.both.label": "Оба",
- "settings.notifications.channel.both.desc": "Снэк и системное уведомление",
- "settings.notifications.permission.pill.granted": "РАЗРЕШЕНО",
- "settings.notifications.permission.pill.denied": "ЗАБЛОКИРОВАНО",
- "settings.rail.group.workspace": "Рабочая зона",
- "settings.rail.group.system": "Система",
- "settings.save_bar.unsaved": "Несохранённые изменения в поле",
- "settings.save_bar.revert": "Отменить",
- "settings.save_bar.save": "Сохранить",
- "settings.section.api_keys": "Идентификация и API",
- "settings.section.server": "Сервер",
- "settings.section.lifecycle": "Жизненный цикл",
- "settings.section.destructive": "ОПАСНО",
- "settings.section.manual": "Вручную",
- "settings.section.notif_channels": "Каналы",
- "settings.section.notif_discovery": "Обнаружение",
- "settings.section.notif_permission": "Разрешение ОС",
- "settings.api_keys.read_only": "Только чтение",
- "settings.api_keys.meta.one": "ключ",
- "settings.api_keys.meta.many": "ключей",
- "settings.logs.sub": "Живой поток лога сервера с фильтром по уровню. Открывается в полноэкранном слое.",
- "settings.restart.sub": "Перезапустить процесс LedGrab. Захват и подключенные устройства приостановятся примерно на 3 секунды.",
- "settings.restart.button": "Перезапустить",
- "settings.notif_matrix.col.event": "Событие",
- "settings.notif_matrix.event_count": "4 СОБЫТИЯ",
- "settings.auto_backup.pill.running": "АКТИВНО",
- "update.pill.available": "ДОСТУПНО ОБНОВЛЕНИЕ",
- "update.pill.error": "ОШИБКА",
- "update.pill.updated": "АКТУАЛЬНО",
- "notifications.unknown_device": "Неизвестное устройство",
- "notifications.device_online.title": "Устройство в сети",
- "notifications.device_online.body": "{device} снова в сети",
- "notifications.device_offline.title": "Устройство недоступно",
- "notifications.device_offline.body": "{device} перестало отвечать",
- "notifications.device_discovered.title": "Новое устройство",
- "notifications.device_discovered.body": "{device} появилось в сети",
- "notifications.device_lost.title": "Устройство пропало",
- "notifications.device_lost.body": "{device} исчезло",
- "notifications.bulk.title": "Изменилось несколько устройств",
- "notifications.bulk.body": "Одновременно произошло {count} событий устройств",
- "notifications.test.title": "Тестовое уведомление LedGrab",
- "notifications.test.body": "Уведомления работают корректно.",
- "update.status_label": "Статус обновления",
- "update.current_version": "Текущая версия:",
- "update.badge_tooltip": "Доступна новая версия — нажмите для подробностей",
- "update.available": "Доступна версия {version}",
- "update.up_to_date": "Установлена последняя версия",
- "update.prerelease": "пре-релиз",
- "update.view_release": "Подробнее",
- "update.dismiss": "Скрыть",
- "update.check_now": "Проверить обновления",
- "update.check_error": "Ошибка проверки обновлений",
- "update.last_check": "Последняя проверка",
- "update.never": "никогда",
- "update.release_notes": "Примечания к релизу",
- "update.view_release_notes": "Открыть примечания к релизу",
- "update.release_notes_hint": "Что нового в доступной версии — прочитайте список изменений перед применением.",
- "update.release_notes_open": "Открыть",
- "update.assets.title": "Загрузки",
- "update.assets.desc.windows_installer": "Установщик Windows — ярлык в меню «Пуск», опциональный автозапуск, деинсталлятор",
- "update.assets.desc.windows_portable": "Windows portable — распакуйте в любую папку и запустите LedGrab.bat",
- "update.assets.desc.windows_msi": "MSI-установщик Windows",
- "update.assets.desc.windows_exe": "Исполняемый файл Windows",
- "update.assets.desc.linux_tarball": "Архив Linux — распакуйте и запустите ./run.sh",
- "update.assets.desc.linux_appimage": "Linux portable — один исполняемый файл",
- "update.assets.desc.linux_deb": "Пакет Debian / Ubuntu",
- "update.assets.desc.linux_rpm": "Пакет Fedora / RHEL",
- "update.assets.desc.linux_sandbox": "Sandbox-пакет Linux",
- "update.assets.desc.macos_dmg": "Образ диска macOS — перетащите в «Программы»",
- "update.assets.desc.macos_installer": "Установщик macOS",
- "update.assets.desc.android": "Android — sideload на Android 7.0+",
- "update.assets.desc.android_bundle": "Android App Bundle (Play Store)",
- "update.assets.desc.ios": "Приложение iOS",
- "update.assets.desc.zip_archive": "Архив ZIP",
- "update.assets.desc.tarball": "Tar-архив",
- "update.assets.desc.archive": "Сжатый архив",
- "update.auto_check_label": "Автоматическая проверка",
- "update.auto_check_hint": "Периодически проверять наличие новых версий в фоновом режиме.",
- "update.enable": "Включить автопроверку",
- "update.interval_label": "Интервал проверки",
- "update.channel_label": "Канал",
- "update.channel.stable": "Стабильный",
- "update.channel.stable_desc": "Только стабильные релизы",
- "update.channel.prerelease": "Пре-релиз",
- "update.channel.prerelease_desc": "Включая альфа, бета и RC сборки",
- "update.save_settings": "Сохранить настройки",
- "update.settings_saved": "Настройки обновлений сохранены",
- "update.settings_save_error": "Не удалось сохранить настройки обновлений",
- "update.apply_now": "Обновить сейчас",
- "update.apply_confirm": "Скачать и установить версию {version}? Сервер будет перезапущен автоматически.",
- "update.apply_error": "Ошибка обновления",
- "update.applying": "Применяется обновление…",
- "update.downloading": "Загрузка…",
- "update.install_type_label": "Тип установки:",
- "update.install_type.installer": "Установщик Windows",
- "update.install_type.portable": "Портативная",
- "update.install_type.docker": "Docker",
- "update.install_type.dev": "Разработка",
- "color_strip.notification.search_apps": "Поиск приложений…",
- "asset.group.title": "Ресурсы",
- "asset.upload": "Загрузить ресурс",
- "asset.edit": "Редактировать ресурс",
- "asset.name": "Название:",
- "asset.name.hint": "Отображаемое название ресурса.",
- "asset.description": "Описание:",
- "asset.description.hint": "Необязательное описание ресурса.",
- "asset.file": "Файл:",
- "asset.file.hint": "Выберите файл для загрузки (звук, изображение, видео или другое).",
- "asset.drop_or_browse": "Перетащите файл сюда или нажмите для выбора",
- "asset.uploaded": "Ресурс загружен",
- "asset.updated": "Ресурс обновлён",
- "asset.deleted": "Ресурс удалён",
- "asset.confirm_delete": "Удалить этот ресурс?",
- "asset.error.name_required": "Название обязательно",
- "asset.error.no_file": "Выберите файл для загрузки",
- "asset.error.delete_failed": "Не удалось удалить ресурс",
- "asset.error.play_failed": "Не удалось воспроизвести звук",
- "asset.error.download_failed": "Не удалось скачать ресурс",
- "asset.play": "Воспроизвести",
- "asset.download": "Скачать",
- "asset.prebuilt": "Встроенный",
- "asset.prebuilt_restored": "Восстановлено встроенных ресурсов: {count}",
- "asset.prebuilt_none_to_restore": "Все встроенные ресурсы уже доступны",
- "asset.restore_prebuilt": "Восстановить встроенные звуки",
- "asset.type.sound": "Звук",
- "asset.type.image": "Изображение",
- "asset.type.video": "Видео",
- "asset.type.other": "Другое",
- "streams.group.assets": "Ресурсы",
- "section.empty.assets": "Ресурсов пока нет. Нажмите +, чтобы загрузить.",
- "donation.message": "LedGrab — бесплатный проект с открытым кодом. Если он вам полезен, поддержите разработку.",
- "donation.support": "Поддержать проект",
- "donation.view_source": "Исходный код",
- "donation.later": "Напомнить позже",
- "donation.dismiss": "Больше не показывать",
- "donation.about_title": "О LedGrab",
- "donation.about_opensource": "LedGrab — программа с открытым исходным кодом, бесплатная для использования и модификации.",
- "donation.about_donate": "Поддержать разработку",
- "donation.about_license": "Лицензия MIT",
- "donation.about_author": "Создатель —",
- "streams.group.game": "Игровая интеграция",
- "tree.group.game": "Игры",
- "game_integration.section_title": "Игровые интеграции",
- "section.empty.game_integrations": "Нет игровых интеграций. Нажмите +, чтобы создать.",
- "game_integration.add": "Добавить игровую интеграцию",
- "game_integration.edit": "Редактировать игровую интеграцию",
- "game_integration.created": "Игровая интеграция создана",
- "game_integration.updated": "Игровая интеграция обновлена",
- "game_integration.deleted": "Игровая интеграция удалена",
- "game_integration.confirm_delete": "Удалить эту игровую интеграцию?",
- "game_integration.error.name_required": "Требуется имя",
- "game_integration.error.save_failed": "Не удалось сохранить игровую интеграцию",
- "game_integration.error.delete_failed": "Не удалось удалить игровую интеграцию",
- "game_integration.error.save_first": "Сначала сохраните интеграцию для проверки соединения",
- "game_integration.name": "Имя:",
- "game_integration.name.hint": "Описательное имя для этой игровой интеграции",
- "game_integration.description": "Описание:",
- "game_integration.description.hint": "Необязательное описание назначения интеграции",
- "game_integration.enabled": "Включено",
- "game_integration.adapter_type": "Игра / Адаптер:",
- "game_integration.adapter_type.hint": "Выберите тип игры или адаптера",
- "game_integration.adapter_config": "Конфигурация адаптера",
- "game_integration.no_config": "Конфигурация для этого адаптера не требуется.",
- "game_integration.setup_instructions": "Инструкции по настройке",
- "game_integration.setup_instructions.hint": "Следуйте этим шагам для настройки отправки данных из игры",
- "game_integration.event_mappings": "Привязка событий",
- "game_integration.event_mappings.hint": "Привяжите игровые события к LED-эффектам. Каждый тип события может вызывать свой визуальный эффект.",
- "game_integration.mapping.add": "+ Добавить привязку",
- "game_integration.mapping.event_type": "Событие",
- "game_integration.mapping.effect_type": "Эффект",
- "game_integration.mapping.color": "Цвет",
- "game_integration.mapping.duration": "Длительность (мс)",
- "game_integration.mapping.intensity": "Интенсивность",
- "game_integration.mapping.priority": "Приоритет",
- "game_integration.mapping.select_preset": "Загрузить пресет...",
- "game_integration.preset.select": "Загрузить пресет...",
- "game_integration.preset.fps_combat": "FPS Бой",
- "game_integration.preset.moba_health": "MOBA Здоровье",
- "game_integration.adapter": "Адаптер",
- "game_integration.status": "Статус",
- "game_integration.status.active": "Активна",
- "game_integration.status.inactive": "Неактивна",
- "game_integration.mappings": "Привязки",
- "game_integration.events.title": "События в реальном времени",
- "game_integration.events.waiting": "Ожидание событий...",
- "game_integration.events.monitor": "Монитор событий",
- "game_integration.test.button": "Тестировать соединение",
- "game_integration.test.waiting": "Ожидание событий от игры...",
- "game_integration.test.success": "Соединение успешно! Получены события.",
- "game_integration.test.error": "Ошибка соединения",
- "game_integration.test.timeout": "События не получены за отведённое время.",
- "game_integration.auto_setup": "Автонастройка",
- "game_integration.auto_setup.success": "Файл конфигурации успешно записан",
- "game_integration.auto_setup.failed": "Автонастройка не удалась",
- "game_integration.auto_setup.not_supported": "Этот адаптер не поддерживает автонастройку",
- "game_integration.auto_setup.game_not_found": "Установка игры не найдена",
- "game_integration.auto_setup.token_generated": "Токен авторизации был сгенерирован автоматически",
- "game_integration.auto_setup.save_first": "Сначала сохраните интеграцию перед запуском автонастройки",
- "color_strip.type.game_event": "Игровое событие",
- "color_strip.type.game_event.desc": "LED-эффекты по игровым событиям",
- "color_strip.game_event.integration": "Игровая интеграция:",
- "color_strip.game_event.integration.hint": "Выберите игровую интеграцию, от которой поступают события.",
- "color_strip.game_event.idle_color": "Цвет простоя:",
- "color_strip.game_event.idle_color.hint": "Цвет LED, когда нет активных игровых событий.",
- "color_strip.game_event.event_mappings": "Привязка событий:",
- "color_strip.game_event.event_mappings.hint": "Переопределите или добавьте привязки событий к эффектам для этого источника.",
- "color_strip.game_event.error.no_integration": "Выберите игровую интеграцию.",
- "color_strip.type.math_wave": "Математическая волна",
- "color_strip.type.math_wave.desc": "Генератор математических волн с цветовым градиентом",
- "color_strip.math_wave.gradient": "Цветовой градиент:",
- "color_strip.math_wave.gradient.hint": "Градиент для окраски волнового выхода. Значения волны отображаются на позиции вдоль этого градиента.",
- "color_strip.math_wave.speed": "Скорость:",
- "color_strip.math_wave.speed.hint": "Множитель скорости анимации. Более высокие значения ускоряют движение волны.",
- "color_strip.math_wave.waves": "Слои волн:",
- "color_strip.math_wave.waves.hint": "Добавьте несколько слоёв волн, которые комбинируются вместе. Каждая волна имеет собственную форму, частоту, амплитуду, фазу и смещение.",
- "color_strip.math_wave.add_wave": "+ Добавить волну",
- "color_strip.math_wave.waveform": "Форма волны",
- "color_strip.math_wave.waveform.sine": "Синусоида",
- "color_strip.math_wave.waveform.triangle": "Треугольная",
- "color_strip.math_wave.waveform.sawtooth": "Пилообразная",
- "color_strip.math_wave.waveform.square": "Прямоугольная",
- "color_strip.math_wave.frequency": "Частота",
- "color_strip.math_wave.amplitude": "Амплитуда",
- "color_strip.math_wave.phase": "Фаза",
- "color_strip.math_wave.offset": "Смещение",
- "color_strip.math_wave.error.no_waves": "Добавьте хотя бы один слой волны.",
- "value_source.type.game_event": "Игровое событие",
- "value_source.type.game_event.desc": "Игровые метрики (здоровье, патроны, мана) как значения 0-1",
- "value_source.game_event.integration": "Игровая интеграция:",
- "value_source.game_event.integration.hint": "Выберите игровую интеграцию для этого источника значений.",
- "value_source.game_event.event_type": "Тип события:",
- "value_source.game_event.event_type.hint": "Непрерывное игровое событие (здоровье, мана, патроны и т.д.).",
- "value_source.game_event.min_game_value": "Мин. игровое значение:",
- "value_source.game_event.min_game_value.hint": "Исходное игровое значение, соответствующее 0.0.",
- "value_source.game_event.max_game_value": "Макс. игровое значение:",
- "value_source.game_event.max_game_value.hint": "Исходное игровое значение, соответствующее 1.0.",
- "value_source.game_event.smoothing": "Сглаживание:",
- "value_source.game_event.smoothing.hint": "Коэффициент EMA-сглаживания. 0 = мгновенно, выше = плавнее.",
- "value_source.game_event.default_value": "Значение по умолчанию:",
- "value_source.game_event.default_value.hint": "Выходное значение, когда события не поступают в пределах таймаута.",
- "value_source.game_event.timeout": "Таймаут (с):",
- "value_source.game_event.timeout.hint": "Секунды тишины до возврата к значению по умолчанию.",
- "audio_processing.title": "Шаблоны обработки звука",
- "audio_processing.add": "Добавить шаблон обработки звука",
- "audio_processing.edit": "Редактировать шаблон обработки звука",
- "audio_processing.name": "Название шаблона:",
- "audio_processing.name.hint": "Описательное название для этого шаблона обработки звука",
- "audio_processing.name_placeholder": "Мой шаблон обработки звука",
- "audio_processing.description_label": "Описание (необязательно):",
- "audio_processing.description.hint": "Опишите назначение этого шаблона",
- "audio_processing.description_placeholder": "Опишите этот шаблон...",
- "audio_processing.created": "Шаблон обработки звука создан",
- "audio_processing.updated": "Шаблон обработки звука обновлён",
- "audio_processing.deleted": "Шаблон обработки звука удалён",
- "audio_processing.delete.confirm": "Вы уверены, что хотите удалить этот шаблон обработки звука?",
- "audio_processing.error.required": "Пожалуйста, заполните все обязательные поля",
- "audio_processing.error.load": "Ошибка загрузки шаблона обработки звука",
- "audio_processing.error.delete": "Ошибка удаления шаблона обработки звука",
- "audio_processing.error.clone_failed": "Не удалось клонировать шаблон обработки звука",
- "audio_processing.error.save_failed": "Не удалось сохранить шаблон обработки звука",
- "audio_processing.filter_count": "Количество фильтров",
- "audio_processing.filters_label": "фильтров",
- "streams.group.audio_processing": "Обработка звука",
- "section.empty.audio_processing_templates": "Пока нет шаблонов обработки звука. Нажмите +, чтобы создать.",
- "audio_source.group.capture": "Захват звука",
- "audio_source.group.processed": "Обработанные источники",
- "pairing.title": "Сопряжение устройства",
- "pairing.instructions.default": "Нажмите и удерживайте кнопку сопряжения на устройстве, затем нажмите «Начать». Устройства обычно открывают окно сопряжения на 30 секунд — действуйте быстро.",
- "pairing.start": "Начать сопряжение",
- "pairing.pairing": "Сопряжение…",
- "pairing.cancel": "Отмена",
- "pairing.retry": "Повторить",
- "pairing.close": "Закрыть",
- "pairing.success": "Успешно сопряжено",
- "pairing.not_ready": "Устройство не ответило. Нажмите кнопку сопряжения на устройстве и попробуйте снова.",
- "pairing.failed": "Сопряжение не удалось: {detail}",
- "pairing.failed_prefix": "Сопряжение не удалось:",
- "streams.group.http": "HTTP",
- "http_endpoint.group.title": "HTTP-эндпоинты",
- "http_endpoint.add": "Добавить HTTP-эндпоинт",
- "http_endpoint.edit": "Изменить HTTP-эндпоинт",
- "http_endpoint.section.request": "Запрос",
- "http_endpoint.section.headers": "Заголовки",
- "http_endpoint.name": "Имя:",
- "http_endpoint.name.placeholder": "Plex now-playing",
- "http_endpoint.name.hint": "Описательное имя для этого эндпоинта",
- "http_endpoint.url": "URL:",
- "http_endpoint.url.hint": "Полный http(s)-URL для опроса. Локальные адреса разрешены.",
- "http_endpoint.method": "Метод:",
- "http_endpoint.method.get.desc": "Получить тело ответа.",
- "http_endpoint.method.head.desc": "Только код статуса — без тела. Подходит для проверки доступности.",
- "http_endpoint.auth_token": "Токен авторизации (необязательно):",
- "http_endpoint.auth_token.hint": "Отправляется как 'Authorization: Bearer config/default_config.yaml:",
- "setup.step2_label": "2. 重启服务器,然后刷新此页面并使用该密钥登录。",
- "setup.step3_label": "或者:直接在服务器本机打开 LedGrab(回环地址),无需密钥:",
- "setup.hint_openssl": "生成强密钥:Linux/macOS 使用 openssl rand -hex 32;Windows PowerShell 使用 [guid]::NewGuid().ToString('N') + [guid]::NewGuid().ToString('N')。",
- "setup.copy": "复制代码片段",
- "setup.copied": "已复制到剪贴板",
- "setup.retry": "我已配置密钥 — 重试",
- "setup.still_required": "服务器仍报告未配置 API 密钥。请确认已保存配置文件并重启服务器。",
- "displays.title": "可用显示器",
- "displays.layout": "显示器",
- "displays.information": "显示器信息",
- "displays.legend.primary": "主显示器",
- "displays.legend.secondary": "副显示器",
- "displays.badge.primary": "主",
- "displays.badge.secondary": "副",
- "displays.resolution": "分辨率:",
- "displays.refresh_rate": "刷新率:",
- "displays.position": "位置:",
- "displays.index": "显示器序号:",
- "displays.loading": "正在加载显示器...",
- "displays.none": "没有可用的显示器",
- "displays.failed": "加载显示器失败",
- "displays.picker.title": "选择显示器",
- "displays.picker.title.lead": "选择",
- "displays.picker.title.accent": "显示器",
- "displays.picker.eyebrow.label": "来源",
- "displays.picker.eyebrow.channel": "显示器 · 布局",
- "displays.picker.eyebrow.channel.device": "设备 · 列表",
- "displays.picker.foot.dismiss": "关闭",
- "displays.picker.foot.select": "选择显示器",
- "displays.picker.foot.select.device": "选择设备",
- "displays.picker.select": "选择显示器...",
- "displays.picker.click_to_select": "点击选择此显示器",
- "displays.picker.adb_connect": "连接 ADB 设备",
- "displays.picker.adb_connect.placeholder": "IP 地址(例如 192.168.2.201)",
- "displays.picker.adb_connect.button": "连接",
- "displays.picker.adb_connect.success": "设备已连接",
- "displays.picker.adb_connect.error": "连接设备失败",
- "displays.picker.adb_disconnect": "断开连接",
- "displays.picker.no_android": "未找到 Android 设备。请通过 USB 连接或在上方输入 IP 地址。",
- "templates.title": "引擎模板",
- "templates.description": "采集模板定义屏幕的采集方式。每个模板使用特定的采集引擎(MSS、DXcam、WGC)及自定义设置。将模板分配给设备以获得最佳性能。",
- "templates.loading": "正在加载模板...",
- "templates.empty": "尚未配置采集模板",
- "templates.add": "添加引擎模板",
- "templates.edit": "编辑引擎模板",
- "templates.name": "模板名称:",
- "templates.name.placeholder": "我的自定义模板",
- "templates.description.label": "描述(可选):",
- "templates.description.placeholder": "描述此模板...",
- "templates.engine": "采集引擎:",
- "templates.engine.hint": "选择要使用的屏幕采集技术",
- "templates.engine.select": "选择引擎...",
- "templates.engine.unavailable": "不可用",
- "templates.engine.unavailable.hint": "此引擎在您的系统上不可用",
- "templates.engine.mss.desc": "跨平台,纯Python",
- "templates.engine.dxcam.desc": "DirectX,低延迟",
- "templates.engine.bettercam.desc": "DirectX,高性能",
- "templates.engine.camera.desc": "USB/IP摄像头捕获",
- "templates.engine.scrcpy.desc": "Android屏幕镜像 (adb screencap)",
- "templates.engine.scrcpy_client.desc": "Android H.264流,高帧率",
- "templates.engine.wgc.desc": "Windows图形捕获",
- "templates.engine.demo.desc": "动画测试图案(演示模式)",
- "templates.engine.mediaprojection.desc": "原生Android屏幕捕获",
- "templates.engine.android_camera.desc": "设备摄像头捕获 (Camera2)",
- "templates.config": "配置",
- "templates.config.show": "显示配置",
- "templates.config.none": "无额外配置",
- "templates.config.default": "默认",
- "templates.config.camera_backend.auto": "自动检测最佳后端",
- "templates.config.camera_backend.dshow": "Windows DirectShow",
- "templates.config.camera_backend.msmf": "Windows Media Foundation",
- "templates.config.camera_backend.v4l2": "Linux Video4Linux2",
- "templates.config.resolution.auto": "以摄像头支持的最高模式打开",
- "templates.config.resolution.480p": "VGA — CPU 与带宽最低",
- "templates.config.resolution.720p": "HD",
- "templates.config.resolution.1080p": "Full HD",
- "templates.config.resolution.1440p": "QHD / 2K",
- "templates.config.resolution.2160p": "4K UHD — CPU 与带宽最高",
- "templates.created": "模板创建成功",
- "templates.updated": "模板更新成功",
- "templates.deleted": "模板删除成功",
- "templates.delete.confirm": "确定要删除此模板吗?",
- "templates.error.load": "加载模板失败",
- "templates.error.engines": "加载引擎失败",
- "templates.error.required": "请填写所有必填项",
- "templates.error.delete": "删除模板失败",
- "templates.error.save_failed": "保存模板失败",
- "templates.error.load_failed": "加载模板失败",
- "templates.test.title": "测试采集",
- "templates.test.description": "保存前测试此模板,查看采集预览和性能指标。",
- "templates.test.display": "显示器:",
- "templates.test.display.select": "选择显示器...",
- "templates.test.device": "设备:",
- "templates.test.device.select": "选择设备...",
- "templates.test.duration": "采集时长(秒):",
- "templates.test.border_width": "边框宽度(像素):",
- "templates.test.run": "运行",
- "templates.test.running": "正在运行测试...",
- "templates.test.results.preview": "全幅采集预览",
- "templates.test.results.borders": "边框提取",
- "templates.test.results.top": "上",
- "templates.test.results.right": "右",
- "templates.test.results.bottom": "下",
- "templates.test.results.left": "左",
- "templates.test.results.performance": "性能",
- "templates.test.results.capture_time": "采集",
- "templates.test.results.extraction_time": "提取",
- "templates.test.results.total_time": "总计",
- "templates.test.results.max_fps": "最大 FPS",
- "templates.test.results.duration": "时长",
- "templates.test.results.frame_count": "帧数",
- "templates.test.results.actual_fps": "实际 FPS",
- "templates.test.results.avg_capture_time": "平均采集",
- "templates.test.results.resolution": "分辨率:",
- "templates.test.error.no_engine": "请选择采集引擎",
- "templates.test.error.no_display": "请选择显示器",
- "templates.test.error.no_device": "请选择设备",
- "templates.test.error.failed": "测试失败",
- "devices.title": "设备",
- "device.select_type": "选择设备类型",
- "devices.add": "添加新设备",
- "devices.loading": "正在加载设备...",
- "devices.none": "尚未配置设备",
- "devices.failed": "加载设备失败",
- "devices.wled_config": "WLED 配置:",
- "devices.wled_note": "使用以下方式配置您的 WLED 设备(效果、分段、颜色顺序、功率限制等):",
- "devices.wled_link": "官方 WLED 应用",
- "devices.wled_note_or": "或内置的",
- "devices.wled_webui_link": "WLED Web UI",
- "devices.wled_note_webui": "(在浏览器中打开设备 IP 地址)。",
- "devices.wled_note2": "此控制器发送像素颜色数据并控制每个设备的亮度。",
- "device.scan": "自动发现",
- "device.scan.empty": "未找到设备",
- "device.scan.error": "网络扫描失败",
- "device.scan.already_added": "已添加",
- "device.scan.selected": "设备已选择",
- "device.type": "设备类型:",
- "device.type.hint": "选择 LED 控制器的类型",
- "device.type.wled": "WLED",
- "device.type.wled.desc": "通过HTTP/UDP控制的WiFi LED",
- "device.type.adalight": "Adalight",
- "device.type.adalight.desc": "Arduino串口LED协议",
- "device.type.ambiled": "AmbiLED",
- "device.type.ambiled.desc": "AmbiLED串口协议",
- "device.type.mqtt": "MQTT",
- "device.type.mqtt.desc": "通过MQTT代理发布LED数据",
- "device.type.ws": "WebSocket",
- "device.type.ws.desc": "通过WebSocket流式传输LED数据",
- "device.type.openrgb": "OpenRGB",
- "device.type.openrgb.desc": "通过OpenRGB控制RGB外设",
- "device.type.dmx": "DMX",
- "device.type.dmx.desc": "Art-Net / sACN (E1.31) 舞台灯光",
- "device.type.ddp": "DDP",
- "device.type.ddp.desc": "直接UDP像素推送 (Pixelblaze、ESPixelStick、Falcon)",
- "device.type.opc": "OPC",
- "device.type.opc.desc": "Open Pixel Control (Fadecandy、xLights、爱好者驱动)",
- "device.type.mock": "Mock",
- "device.type.mock.desc": "用于测试的虚拟设备",
- "device.type.espnow": "ESP-NOW",
- "device.type.espnow.desc": "Ultra-low-latency via ESP32 gateway",
- "device.type.hue": "Philips Hue",
- "device.type.hue.desc": "Hue Entertainment API streaming",
- "device.type.yeelight": "Yeelight",
- "device.type.yeelight.desc": "通过局域网连接小米智能灯泡/灯带(单色,由灯带颜色平均得出)",
- "device.yeelight.url": "IP 地址:",
- "device.yeelight.url.hint": "Yeelight 灯泡的局域网 IP。协议固定使用 TCP 端口 55443。",
- "device.yeelight.url.placeholder": "192.168.1.50",
- "device.yeelight_min_interval": "最小更新间隔:",
- "device.yeelight_min_interval.hint": "客户端命令速率限制(毫秒)。默认 500 毫秒可使灯泡保持在约 1 cmd/sec 限制下;较低的值可能导致节流。",
- "device.type.wiz": "WiZ",
- "device.type.wiz.desc": "WiZ Connected (飞利浦) UDP 局域网灯泡",
- "device.wiz.url": "IP 地址:",
- "device.wiz.url.hint": "WiZ 灯泡的局域网 IP。UDP 端口 38899 为协议默认值。",
- "device.wiz.url.placeholder": "192.168.1.50",
- "device.wiz_min_interval": "最小更新间隔:",
- "device.wiz_min_interval.hint": "客户端命令速率限制(毫秒)。UDP 即发即忘可处理快速更新;默认 50 毫秒 ≈ 20 Hz。",
- "device.type.lifx": "LIFX",
- "device.type.lifx.desc": "通过局域网连接 LIFX 智能灯泡/灯带",
- "device.lifx.url": "IP 地址:",
- "device.lifx.url.hint": "LIFX 灯泡的局域网 IP。UDP 端口 56700 为协议默认值。",
- "device.lifx.url.placeholder": "192.168.1.50",
- "device.lifx_min_interval": "最小更新间隔:",
- "device.lifx_min_interval.hint": "客户端命令速率限制(毫秒)。LIFX 建议 ≤20 cmd/sec;默认 50 毫秒符合该上限。",
- "device.type.govee": "Govee",
- "device.type.govee.desc": "通过 LAN API 连接 Govee Wi-Fi 灯泡/氛围套件",
- "device.govee.url": "IP 地址:",
- "device.govee.url.hint": "Govee 设备的局域网 IP。请先在 Govee Home 应用中启用 LAN Control(设备 → ⚙ → LAN Control),否则灯泡不会响应。",
- "device.govee.url.placeholder": "192.168.1.50",
- "device.govee_min_interval": "最小更新间隔:",
- "device.govee_min_interval.hint": "客户端命令速率限制(毫秒)。UDP 即发即忘可处理快速更新;默认 50 毫秒 ≈ 20 Hz。",
- "device.type.nanoleaf": "Nanoleaf",
- "device.type.nanoleaf.desc": "Nanoleaf Light Panels / Canvas / Shapes / Lines / Elements(HTTP REST,需要配对)",
- "device.nanoleaf.url": "IP 地址:",
- "device.nanoleaf.url.hint": "Nanoleaf 控制器的局域网 IP。HTTP 端口 16021 由协议固定。",
- "device.nanoleaf.url.placeholder": "192.168.1.50",
- "device.nanoleaf_min_interval": "最小更新间隔:",
- "device.nanoleaf_min_interval.hint": "客户端命令速率限制(毫秒)。默认 100 毫秒 ≈ 10 Hz;HTTP 请求开销将实际上限限制在约 20 Hz。",
- "device.nanoleaf.pair.instructions": "请按住 Nanoleaf 控制器上的电源按钮 5 秒,直到 LED 闪烁,然后点击「开始」。控制器将打开 30 秒的配对窗口。",
- "device.nanoleaf.pair_button": "配对设备",
- "device.nanoleaf.token.label": "认证令牌:",
- "device.nanoleaf.paired": "已配对",
- "device.type.ble": "BLE LED 控制器",
- "device.type.ble.desc": "Bluetooth LE 灯带:SP110E、Triones、Zengge、Govee(整条灯带同色)",
- "device.ble.url": "BLE 地址:",
- "device.ble.url.hint": "MAC 地址(Windows/Linux)或 UUID(macOS),加前缀 ble://",
- "device.ble.family": "协议:",
- "device.ble.family.hint": "控制器使用哪种 BLE 协议。按你平时使用的手机应用选择。",
- "device.ble.family.sp110e.desc": "可编址控制器 — LED Hue / SP110E 应用",
- "device.ble.family.triones.desc": "单色控制器 — HappyLighting / LEDnet",
- "device.ble.family.zengge.desc": "单色控制器 — iLightsIn / Mohuan",
- "device.ble.family.govee.desc": "Govee H6xxx 灯带 — 仅支持未加密固件",
- "device.ble.govee_key": "Govee AES 密钥(hex):",
- "device.ble.govee_key.hint": "可选。新版 Govee 固件需要按型号的 AES 密钥 — 老固件留空即可。",
- "device.ble.govee_key.placeholder": "32位十六进制,如 0102…1f20",
- "device.type.usbhid": "USB HID",
- "device.type.usbhid.desc": "USB RGB peripherals (keyboards, mice)",
- "device.type.spi": "SPI Direct",
- "device.type.spi.desc": "Raspberry Pi GPIO/SPI LED strips",
- "device.type.chroma": "Razer Chroma",
- "device.type.chroma.desc": "Razer peripherals via Chroma SDK",
- "device.type.gamesense": "SteelSeries",
- "device.type.gamesense.desc": "SteelSeries peripherals via GameSense",
- "device.type.group": "设备组",
- "device.type.group.desc": "将多个设备组合为一个虚拟设备",
- "device.group.children": "子设备:",
- "device.group.children.hint": "选择要包含在组中的设备。顺序在序列模式下很重要。",
- "device.group.add_child": "+ 添加设备",
- "device.group.select_device": "选择设备",
- "device.group.mode": "组模式:",
- "device.group.mode.hint": "序列模式将LED首尾相连。独立模式将完整灯带镜像到每个设备。",
- "device.group.mode.sequence": "序列",
- "device.group.mode.sequence.desc": "将LED首尾相连合并为一条长灯带",
- "device.group.mode.independent": "独立",
- "device.group.mode.independent.desc": "将完整灯带独立镜像到每个设备",
- "device.group.move_up": "上移",
- "device.group.move_down": "下移",
- "device.group.error.no_children": "请至少添加一个子设备到组中。",
- "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.dmx_protocol": "DMX 协议:",
- "device.dmx_protocol.hint": "Art-Net 使用 UDP 端口 6454,sACN (E1.31) 使用 UDP 端口 5568",
- "device.dmx_protocol.artnet.desc": "UDP 单播,端口 6454",
- "device.dmx_protocol.sacn.desc": "组播/单播,端口 5568",
- "device.dmx_start_universe": "起始 Universe:",
- "device.dmx_start_universe.hint": "第一个 DMX universe (0-32767)。超过 170 个 LED 时自动使用多个 universe。",
- "device.dmx_start_channel": "起始通道:",
- "device.dmx_start_channel.hint": "universe 中的第一个 DMX 通道 (1-512)",
- "device.dmx.url": "IP 地址:",
- "device.dmx.url.hint": "DMX 节点的 IP 地址(例如 192.168.1.50)",
- "device.dmx.url.placeholder": "192.168.1.50",
- "device.ddp.url": "IP 地址:",
- "device.ddp.url.hint": "DDP 接收器地址。端口默认为 4048。",
- "device.ddp.url.placeholder": "192.168.1.50",
- "device.ddp_port": "DDP 端口:",
- "device.ddp_port.hint": "UDP 端口(0 = 协议默认值 4048)。",
- "device.ddp_destination_id": "目标 ID:",
- "device.ddp_destination_id.hint": "DDP 目标标识符(1 = 显示)。",
- "device.ddp_color_order": "颜色顺序:",
- "device.ddp_color_order.hint": "线路上的通道字节顺序。大多数 DDP 接收器期望 RGB。",
- "device.ddp.color_order.rgb.desc": "Standard RGB byte order",
- "device.ddp.color_order.grb.desc": "WS2812/WS2812B native order",
- "device.ddp.color_order.brg.desc": "BRG byte order",
- "device.ddp.color_order.rbg.desc": "RBG byte order",
- "device.ddp.color_order.bgr.desc": "BGR byte order",
- "device.ddp.color_order.gbr.desc": "GBR byte order",
- "device.opc.url": "IP 地址:",
- "device.opc.url.hint": "OPC 接收器地址。TCP 端口默认为 7890。",
- "device.opc.url.placeholder": "192.168.1.50",
- "device.opc_channel": "通道:",
- "device.opc_channel.hint": "OPC 通道(0 = 广播到服务器所有通道,1-255 = 特定输出)。",
- "device.serial_port": "串口:",
- "device.serial_port.hint": "选择 Adalight 设备的 COM 端口",
- "device.serial_port.none": "未找到串口",
- "device.serial_port.select": "选择端口...",
- "device.led_count_manual.hint": "灯带上的 LED 数量(必须与 Arduino 程序匹配)",
- "device.baud_rate": "波特率:",
- "device.baud_rate.hint": "串口通信速率。越高 FPS 越高,但需要与 Arduino 程序匹配。",
- "device.led_type": "LED 类型:",
- "device.led_type.hint": "RGB(3通道)或 RGBW(4通道,带独立白色)",
- "device.send_latency": "发送延迟(毫秒):",
- "device.send_latency.hint": "每帧模拟网络/串口延迟(毫秒)",
- "device.css_processing_template": "色带处理模板:",
- "device.css_processing_template.hint": "应用于此设备所有色带输出的默认处理模板",
- "device.mqtt_topic": "MQTT 主题:",
- "device.mqtt_topic.hint": "用于发布像素数据的 MQTT 主题路径(例如 mqtt://ledgrab/device/name)",
- "device.mqtt_topic.placeholder": "mqtt://ledgrab/device/客厅",
- "device.mqtt_source": "MQTT 代理:",
- "device.mqtt_source.hint": "此设备发布到哪个 MQTT 代理。在集成 → MQTT 源中管理代理。留空则使用第一个可用代理。",
- "device.mqtt_source.none": "— 第一个可用代理",
- "device.ws_url": "连接 URL:",
- "device.ws_url.hint": "客户端连接并接收 LED 数据的 WebSocket URL",
- "device.openrgb.url": "OpenRGB URL:",
- "device.openrgb.url.hint": "OpenRGB 服务器地址(例如 openrgb://localhost:6742/0)",
- "device.openrgb.zone": "区域:",
- "device.openrgb.zone.hint": "选择要控制的 LED 区域(全部不选则控制所有区域)",
- "device.openrgb.zone.loading": "加载区域中…",
- "device.openrgb.zone.error": "加载区域失败",
- "device.openrgb.mode": "区域模式:",
- "device.openrgb.mode.hint": "合并模式将所有区域作为一条连续 LED 灯带。独立模式让每个区域独立渲染完整效果。",
- "device.openrgb.mode.combined": "合并灯带",
- "device.openrgb.mode.separate": "独立区域",
- "device.openrgb.added_multiple": "已添加 {count} 个设备",
- "device.url.hint": "设备的 IP 地址或主机名(例如 http://192.168.1.100)",
- "device.name": "设备名称:",
- "device.name.placeholder": "客厅电视",
- "device.url": "地址:",
- "device.url.placeholder": "http://192.168.1.100",
- "device.led_count": "LED 数量:",
- "dashboard.device.chip": "芯片:",
- "device.led_count.hint": "设备中配置的 LED 数量",
- "device.led_count.hint.auto": "从设备自动检测",
- "device.button.add": "添加设备",
- "device.button.start": "启动",
- "device.button.stop": "停止",
- "device.button.settings": "常规设置",
- "device.button.capture_settings": "采集设置",
- "device.button.calibrate": "校准",
- "device.button.remove": "移除",
- "device.button.webui": "打开设备 Web UI",
- "device.button.power_off": "关闭",
- "device.button.ping": "Ping 设备",
- "device.ping.online": "在线 ({ms}ms)",
- "device.ping.offline": "设备离线",
- "device.ping.error": "Ping 失败",
- "device.power.off_success": "设备已关闭",
- "device.status.connected": "已连接",
- "device.status.disconnected": "已断开",
- "device.status.error": "错误",
- "device.status.processing": "处理中",
- "device.status.idle": "空闲",
- "device.fps": "FPS:",
- "device.display": "显示器:",
- "device.remove.confirm": "确定要移除此设备吗?",
- "device.added": "设备添加成功",
- "device.removed": "设备已移除",
- "device.started": "处理已启动",
- "device.stopped": "处理已停止",
- "device.metrics.actual_fps": "实际 FPS",
- "device.metrics.current_fps": "当前 FPS",
- "device.metrics.target_fps": "目标 FPS",
- "device.metrics.potential_fps": "潜在 FPS",
- "device.metrics.frames": "帧数",
- "device.metrics.frames_skipped": "已跳过",
- "device.metrics.keepalive": "心跳",
- "device.metrics.errors": "错误",
- "device.metrics.uptime": "运行时长",
- "device.metrics.timing": "管线时序:",
- "device.metrics.device_fps": "设备刷新率",
- "device.health.online": "在线",
- "device.health.offline": "离线",
- "device.health.streaming_unreachable": "流传输期间不可达",
- "device.health.checking": "检测中...",
- "patch.streaming": "传输中",
- "patch.standby": "待机",
- "patch.online": "在线",
- "patch.offline": "离线",
- "patch.disconnected": "已断开",
- "patch.not_configured": "未配置",
- "patch.unreachable": "无法访问",
- "patch.checking": "检测中",
- "patch.ticking": "运行中",
- "patch.paused": "已暂停",
- "patch.patched": "已连接",
- "patch.preset": "预设",
- "patch.source": "源",
- "patch.template": "模板",
- "patch.pipeline": "管线",
- "patch.strip": "色带",
- "patch.value": "值",
- "patch.ready": "就绪",
- "patch.polling": "轮询中",
- "perf.idle": "空闲",
- "perf.offline": "离线",
- "perf.online": "在线",
- "perf.no_devices": "无设备",
- "perf.all_online": "全部在线",
- "perf.online_count": "{count} 在线",
- "perf.offline_count": "{count} 离线",
- "perf.total_bytes": "共 {bytes}",
- "perf.max_ms": "最大 {ms}毫秒",
- "perf.targets_count.one": "{count} 个目标",
- "perf.targets_count.other": "{count} 个目标",
- "perf.no_captures": "无源",
- "perf.captures_count.one": "{count} 个源",
- "perf.captures_count.other": "{count} 个源",
- "perf.ratio_of_requested": "请求的 {percent}% · {captures}",
- "perf.total_count": "共 {count}",
- "perf.skipped_per_sec": "跳过 {rate}/秒",
- "perf.tip.now": "现在",
- "perf.tip.ago": "−{seconds} 秒",
- "device.last_seen.label": "最近检测",
- "device.last_seen.just_now": "刚刚",
- "device.last_seen.seconds": "%d秒前",
- "device.last_seen.minutes": "%d分钟前",
- "device.last_seen.hours": "%d小时前",
- "device.last_seen.days": "%d天前",
- "device.tutorial.start": "开始教程",
- "device.tip.identity": "设备标识 — 名称、类型徽章和在线/离线状态指示。",
- "device.tip.metadata": "设备地址和固件版本。点击 URL 可打开设备的内置 Web 界面。",
- "device.tip.brightness": "拖动调节设备亮度。更改将立即发送到设备。",
- "device.brightness": "亮度",
- "device.tip.ping": "Ping 设备 — 刷新在线状态并测量延迟。",
- "device.tip.settings": "打开设备设置 — 配置名称、地址、能力和健康检查。",
- "device.tip.menu": "更多操作 — 复制、隐藏或删除此设备。",
- "device.tip.add": "点击此处添加新的 LED 设备",
- "settings.title": "设置",
- "settings.tab.general": "常规",
- "settings.tab.backup": "备份",
- "settings.tab.mqtt": "MQTT",
- "settings.tab.appearance": "外观",
- "settings.logs.open_viewer": "打开日志查看器",
- "settings.external_url.label": "外部 URL",
- "settings.external_url.hint": "设置后,此基础 URL 将用于 webhook 链接和其他用户可见的链接,代替自动检测的本地 IP。示例:https://myserver.example.com:8080",
- "settings.external_url.placeholder": "https://myserver.example.com:8080",
- "settings.external_url.save": "保存",
- "settings.external_url.saved": "外部 URL 已保存",
- "settings.external_url.save_error": "保存外部 URL 失败",
- "settings.general.title": "常规设置",
- "settings.section.identity": "标识",
- "settings.section.connection": "连接",
- "settings.section.hardware": "硬件",
- "settings.section.behavior": "行为",
- "settings.section.provider": "提供商",
- "settings.section.refresh": "刷新",
- "settings.section.filters": "过滤器",
- "settings.section.routing": "路由",
- "settings.section.output": "输出",
- "settings.section.filtering": "过滤",
- "settings.section.broker": "代理服务器",
- "settings.section.protocol": "协议",
- "settings.section.adapter": "适配器",
- "settings.section.mappings": "映射",
- "settings.section.diagnostics": "诊断",
- "settings.section.source": "源",
- "settings.section.engine": "引擎",
- "settings.section.timing": "时序",
- "settings.section.gradient": "渐变",
- "settings.section.layout": "布局",
- "settings.section.strip": "灯带",
- "settings.section.type": "类型",
- "settings.section.notes": "备注",
- "settings.section.file": "文件",
- "settings.section.auth": "认证",
- "settings.section.configure": "配置",
- "settings.section.restart": "重启",
- "settings.section.loopback": "本地访问",
- "settings.section.test_setup": "测试设置",
- "settings.section.offsets": "偏移",
- "settings.section.line_properties": "线属性",
- "settings.section.test": "测试",
- "settings.section.preview": "预览",
- "settings.section.controls": "控制",
- "settings.section.history": "历史",
- "ha_source.use_ssl.hint": "为 Home Assistant 启用 HTTPS / wss 连接",
- "game_integration.enabled.hint": "已禁用的集成将停止轮询和发出事件",
- "settings.capture.title": "采集设置",
- "settings.capture.saved": "采集设置已更新",
- "settings.capture.failed": "保存采集设置失败",
- "settings.brightness": "亮度:",
- "settings.brightness.hint": "此设备的全局亮度(0-100%)",
- "settings.url.hint": "设备的 IP 地址或主机名",
- "settings.display_index": "显示器:",
- "settings.display_index.hint": "为此设备采集哪个屏幕",
- "settings.fps": "目标 FPS:",
- "settings.fps.hint": "目标帧率(10-90)",
- "settings.capture_template": "引擎模板:",
- "settings.capture_template.hint": "此设备的屏幕采集引擎和配置",
- "settings.button.cancel": "取消",
- "settings.health_interval": "健康检查间隔(秒):",
- "settings.health_interval.hint": "检查设备状态的频率(5-600秒)",
- "settings.auto_shutdown": "自动恢复:",
- "settings.auto_shutdown.hint": "当目标停止或服务器关闭时恢复设备到空闲状态",
- "settings.button.save": "保存更改",
- "settings.saved": "设置保存成功",
- "settings.failed": "保存设置失败",
- "calibration.title": "LED 校准",
- "calibration.tip.led_count": "输入每条边的 LED 数量",
- "calibration.tip.start_corner": "点击角落设置起始位置",
- "calibration.tip.direction": "切换灯带方向(顺时针/逆时针)",
- "calibration.tip.offset": "设置 LED 偏移 — 从 LED 0 到起始角落的距离",
- "calibration.tip.span": "拖动绿色条调整覆盖范围",
- "calibration.tip.test": "点击边缘切换测试 LED",
- "calibration.tip.overlay": "切换屏幕叠加层以查看显示器上的 LED 位置和编号",
- "calibration.tip.toggle_inputs": "点击 LED 总数切换边缘输入",
- "calibration.tip.border_width": "从屏幕边缘采样多少像素来确定 LED 颜色",
- "calibration.tip.skip_leds_start": "跳过灯带起始端的 LED — 被跳过的 LED 保持关闭",
- "calibration.tip.skip_leds_end": "跳过灯带末尾端的 LED — 被跳过的 LED 保持关闭",
- "tour.welcome": "欢迎使用 LED Grab!快速导览将带您了解界面。使用方向键或按钮进行导航。",
- "tour.dashboard": "仪表盘 — 实时查看运行中的目标、自动化和设备状态。",
- "tour.targets": "目标 — 添加 WLED 设备,配置 LED 目标的捕获设置和校准。",
- "tour.sources": "来源 — 管理捕获模板、图片来源、音频来源和色带。",
- "tour.integrations": "集成 — 连接外部服务:天气、Home Assistant、MQTT 和游戏集成。",
- "tour.graph": "图表 — 所有实体及其连接的可视化概览。拖动端口进行连接,右键单击边线断开连接。",
- "tour.automations": "自动化 — 通过时间、音频或数值条件自动切换场景。",
- "tour.settings": "设置 — 备份和恢复配置,管理自动备份。",
- "tour.api": "API 文档 — 基于 Swagger 的交互式 REST API 文档。",
- "tour.search": "搜索 — 使用 Ctrl+K 快速查找并导航到任意实体。",
- "tour.theme": "主题 — 在深色和浅色模式之间切换。",
- "tour.accent": "主题色 — 自定义界面的强调颜色。",
- "tour.language": "语言 — 选择您偏好的界面语言。",
- "tour.restart": "重新开始导览",
- "tour.dash.perf": "性能 — 实时 FPS 图表、延迟指标和轮询间隔控制。",
- "tour.dash.targets": "通道 — 您的所有目标集中显示,按运行中和已停止分组。",
- "tour.dash.running": "运行中的目标 — 实时流媒体指标和快速停止控制。",
- "tour.dash.stopped": "已停止的目标 — 一键启动。",
- "tour.dash.automations": "自动化 — 活动自动化状态和快速启用/禁用切换。",
- "tour.dash.scenes": "场景预设 — 已保存的系统快照,一键应用。",
- "tour.dash.sync_clocks": "同步时钟 — 跨多个源同步动画的共享计时器。",
- "tour.dash.integrations": "集成 — Weather、Home Assistant 和 MQTT 源的连接状态。",
- "tour.dash.customize_btn": "自定义按钮 — 打开侧面板,可重新排序、隐藏或调整仪表盘布局。",
- "tour.dash.customize_panel": "自定义仪表盘 — 布局控制中心。更改即时生效;按 Esc 或 × 关闭。",
- "tour.dash.customize_presets": "预设 — 一键应用精选布局(紧凑、聚焦、完整)。切换预设会覆盖任何手动调整。",
- "tour.dash.customize_global": "全局设置 — 内容宽度、动画级别、性能模式(system/app/both)和图表采样窗口。",
- "tour.dash.customize_sections": "部分 — 拖拽以重新排序;「眼睛」可隐藏;「箭头」可设为默认折叠。每个部分还可选择密度(密集/紧凑/舒适)。",
- "tour.dash.customize_perf_cells": "性能单元 — 选择性能部分中显示哪些指标,配置跨度、采样窗口和 Y 轴比例。",
- "tour.tgt.nav": "使用此下拉菜单在目标类型之间切换:LED 设备、LED 目标和 Home Assistant 灯。",
- "tour.tgt.devices": "设备 — 在网络中发现的 LED 控制器。",
- "tour.tgt.css": "色带 — 定义屏幕区域如何映射到 LED 段。",
- "tour.tgt.targets": "LED 目标 — 将设备、色带和捕获源组合进行流式传输。",
- "tour.tgt.ha_light_targets": "HA 灯目标 — 选择 Home Assistant 灯实体和颜色/数值源进行驱动。",
- "tour.src.nav": "使用此下拉菜单在源类型之间切换 — 图片、色带、音频、数值、同步和资源。",
- "tour.src.raw": "原始 — 来自显示器的实时屏幕捕获源。",
- "tour.src.templates": "捕获模板 — 可复用的捕获配置(分辨率、FPS、裁剪)。",
- "tour.src.static": "静态图片 — 使用图片文件测试您的设置。",
- "tour.src.processed": "处理 — 应用后处理效果,如模糊、亮度或色彩校正。",
- "tour.src.color_strip": "色带 — 定义屏幕区域如何映射到 LED 段。",
- "tour.src.audio": "音频 — 捕获麦克风/系统音频,并通过模板进行处理以生成反应式效果。",
- "tour.src.value": "数值源 — 由时间、音频、系统指标、Home Assistant 实体、渐变或日程驱动的动态数字或颜色。用于动画效果、调制色带和触发自动化。",
- "tour.src.sync": "同步时钟 — 在多个源之间同步动画的共享定时器。",
- "tour.auto.list": "自动化 — 基于时间、音频或数值条件自动激活场景。",
- "tour.auto.add": "点击 + 创建包含条件和要激活场景的新自动化。",
- "tour.auto.card": "每张卡片显示自动化状态、条件和快速编辑/切换控制。",
- "tour.auto.scenes_list": "场景 — 保存的系统状态,自动化可以激活或您可以手动应用。",
- "tour.auto.scenes_add": "点击 + 将当前系统状态捕获为新的场景预设。",
- "tour.auto.scenes_card": "每个场景卡片显示目标/设备数量。点击编辑、重新捕获或激活。",
- "tour.int.nav": "使用此下拉菜单在集成类型之间切换:天气、Home Assistant、MQTT 和游戏集成。",
- "tour.int.weather": "天气 — 获取实时天气数据(温度、状况、预报)作为环境效果的数值源。",
- "tour.int.home_assistant": "Home Assistant — 连接到您的 HA 实例。灯、传感器和实体可作为数值源和目标端点。",
- "tour.int.mqtt": "MQTT — 订阅代理主题,将外部传感器数据、自动化或远程触发器传入 LedGrab。",
- "tour.int.game": "游戏 — 根据游戏内事件(Minecraft、Hammer of God 等)触发场景和色彩效果。",
- "calibration.tutorial.start": "开始教程",
- "calibration.overlay_toggle": "叠加层",
- "calibration.start_position": "起始位置:",
- "calibration.position.bottom_left": "左下",
- "calibration.position.bottom_right": "右下",
- "calibration.position.top_left": "左上",
- "calibration.position.top_right": "右上",
- "calibration.direction": "方向:",
- "calibration.direction.clockwise": "顺时针",
- "calibration.direction.counterclockwise": "逆时针",
- "calibration.leds.top": "顶部 LED:",
- "calibration.leds.right": "右侧 LED:",
- "calibration.leds.bottom": "底部 LED:",
- "calibration.leds.left": "左侧 LED:",
- "calibration.offset": "LED 偏移:",
- "calibration.offset.hint": "从物理 LED 0 到起始角落的距离(沿灯带方向)",
- "calibration.skip_start": "跳过 LED(起始):",
- "calibration.skip_start.hint": "灯带起始端关闭的 LED 数量(0 = 无)",
- "calibration.skip_end": "跳过 LED(末尾):",
- "calibration.skip_end.hint": "灯带末尾端关闭的 LED 数量(0 = 无)",
- "calibration.border_width": "边框(像素):",
- "calibration.roi": "采集区域(%):",
- "calibration.roi.hint": "仅采集屏幕的此子区域,避免任务栏、游戏 HUD 或黑边干扰边缘颜色。全屏 = X/Y 为 0,宽/高为 100。",
- "calibration.roi.x": "X (%)",
- "calibration.roi.y": "Y (%)",
- "calibration.roi.width": "宽度 (%)",
- "calibration.roi.height": "高度 (%)",
- "calibration.border_width.hint": "从屏幕边缘采样多少像素来确定 LED 颜色(1-100)",
- "calibration.button.cancel": "取消",
- "calibration.button.save": "保存",
- "calibration.saved": "校准已保存",
- "calibration.failed": "保存校准失败",
- "server.healthy": "服务器在线",
- "server.offline": "服务器离线",
- "error.unauthorized": "未授权 - 请先登录",
- "error.network": "网络错误",
- "error.unknown": "发生错误",
- "modal.discard_changes": "有未保存的更改。是否放弃?",
- "confirm.title": "确认操作",
- "confirm.yes": "是",
- "confirm.no": "否",
- "confirm.stop_all": "停止所有运行中的目标?",
- "confirm.turn_off_device": "关闭此设备?",
- "common.loading": "加载中...",
- "common.delete": "删除",
- "common.remove": "移除",
- "common.edit": "编辑",
- "common.clone": "克隆",
- "common.hide": "隐藏卡片",
- "common.more_actions": "更多操作",
- "common.card_color": "卡片颜色",
- "common.none": "无",
- "common.none_no_cspt": "无(无处理模板)",
- "common.none_no_input": "无(无输入源)",
- "common.none_own_speed": "无(使用自身速度)",
- "common.undo": "撤销",
- "common.cancel": "取消",
- "common.back": "返回",
- "common.apply": "应用",
- "common.start": "启动",
- "common.stop": "停止",
- "common.led_preview": "LED 预览",
- "device.icon.eyebrow": "卡片图标",
- "device.icon.title": "选择图标",
- "device.icon.for": "用于",
- "device.icon.choose": "选择图标…",
- "device.icon.change": "更换图标…",
- "device.icon.remove": "移除图标",
- "device.icon.search.placeholder": "搜索图标…",
- "device.icon.color_toggle": "颜色",
- "device.icon.recent": "最近使用",
- "device.icon.empty": "无匹配的图标。",
- "device.icon.hint": "↵ 应用 · Esc 取消",
- "device.icon.saved": "图标已保存",
- "device.icon.error.save_failed": "保存图标失败",
- "device.icon.cat.all": "全部",
- "device.icon.cat.hardware": "硬件",
- "device.icon.cat.lighting": "照明",
- "device.icon.cat.rooms": "房间",
- "device.icon.cat.media": "媒体",
- "device.icon.cat.signal": "信号",
- "device.icon.cat.ambience": "氛围",
- "device.icon.cat.weather": "天气",
- "device.icon.cat.nature": "自然",
- "device.icon.cat.controls": "控件",
- "device.icon.cat.status": "状态",
- "device.icon.cat.office": "办公",
- "device.icon.phone": "手机",
- "device.icon.package": "设备模块",
- "device.icon.code": "代码",
- "device.icon.laptop": "笔记本电脑",
- "device.icon.server": "服务器",
- "device.icon.router": "路由器",
- "device.icon.webcam": "网络摄像头",
- "device.icon.bot": "机器人",
- "device.icon.watch": "智能手表",
- "device.icon.mcu": "微控制器",
- "device.icon.dim": "柔光",
- "device.icon.ring": "环形灯",
- "device.icon.point": "点光源",
- "device.icon.ceiling": "吸顶灯",
- "device.icon.desk_lamp": "台灯",
- "device.icon.wall_light": "壁灯",
- "device.icon.flashlight": "手电筒",
- "device.icon.bulb_off": "灯泡关闭",
- "device.icon.candle": "蜡烛",
- "device.icon.kitchen": "厨房",
- "device.icon.bath": "浴室",
- "device.icon.garage": "车库",
- "device.icon.outdoor": "户外",
- "device.icon.projector": "投影仪",
- "device.icon.camcorder": "摄像机",
- "device.icon.disc": "光盘",
- "device.icon.image": "图片",
- "device.icon.audio_file": "音频文件",
- "device.icon.send": "发送",
- "device.icon.rain": "雨",
- "device.icon.snow": "雪",
- "device.icon.thunder": "雷电",
- "device.icon.fog": "雾",
- "device.icon.wind": "风",
- "device.icon.snowflake": "雪花",
- "device.icon.umbrella": "雨伞",
- "device.icon.sunrise": "日出",
- "device.icon.sunset": "日落",
- "device.icon.tree": "树",
- "device.icon.flower": "花",
- "device.icon.mountain": "山",
- "device.icon.waves": "波浪",
- "device.icon.sprout": "嫩芽",
- "device.icon.water_drops": "水滴",
- "device.icon.leaf": "叶子",
- "device.icon.switch": "开关",
- "device.icon.slider": "滑块",
- "device.icon.settings": "设置",
- "device.icon.refresh": "刷新",
- "device.icon.undo": "撤销",
- "device.icon.trash": "回收站",
- "device.icon.link": "链接",
- "device.icon.search": "搜索",
- "device.icon.add": "添加",
- "device.icon.show": "显示",
- "device.icon.lock": "锁定",
- "device.icon.key": "钥匙",
- "device.icon.tool": "工具",
- "device.icon.check": "勾选",
- "device.icon.ok": "正常",
- "device.icon.warning": "警告",
- "device.icon.help": "帮助",
- "device.icon.off": "已禁用",
- "device.icon.shield": "护盾",
- "device.icon.target": "目标",
- "device.icon.pulse": "脉冲",
- "device.icon.trend": "趋势",
- "device.icon.battery": "电池",
- "device.icon.calendar": "日历",
- "device.icon.mail": "邮件",
- "device.icon.coffee": "咖啡",
- "device.icon.briefcase": "公文包",
- "device.icon.doc": "文档",
- "device.icon.checklist": "清单",
- "device.icon.hashtag": "话题",
- "device.icon.clock": "时钟",
- "device.icon.entity.device": "设备",
- "device.icon.entity.target": "LED 目标",
- "device.icon.entity.ha_light_target": "HA 灯目标",
- "device.icon.entity.picture_source": "画面源",
- "device.icon.entity.audio_source": "音频源",
- "device.icon.entity.weather_source": "天气源",
- "device.icon.entity.value_source": "数值源",
- "device.icon.entity.mqtt_source": "MQTT 源",
- "device.icon.entity.ha_source": "Home Assistant 源",
- "device.icon.entity.automation": "自动化",
- "device.icon.entity.scene_preset": "场景预设",
- "device.icon.entity.scene_playlist": "播放列表",
- "device.icon.entity.sync_clock": "同步时钟",
- "device.icon.entity.game_integration": "游戏集成",
- "device.icon.entity.audio_processing_template": "音频处理模板",
- "device.icon.entity.pattern_template": "图案模板",
- "device.icon.entity.capture_template": "捕获模板",
- "device.icon.entity.pp_template": "后处理模板",
- "device.icon.entity.cspt": "色带处理模板",
- "device.icon.entity.audio_template": "音频模板",
- "device.icon.entity.gradient": "渐变",
- "device.icon.entity.color_strip_source": "色带",
- "device.icon.entity.asset": "资源",
- "device.icon.inherited_from": "继承自 %s",
- "device.icon.override_inherited": "覆盖继承的图标…",
- "device.icon.use_inherited": "使用继承的",
- "validation.required": "此字段为必填项",
- "bulk.processing": "处理中…",
- "api.error.timeout": "请求超时 — 请重试",
- "api.error.network": "网络错误 — 请检查连接",
- "palette.search": "搜索…",
- "section.filter.placeholder": "筛选...",
- "section.filter.reset": "清除筛选",
- "tags.label": "标签",
- "tags.hint": "为卡片分配标签以进行分组和筛选",
- "tags.placeholder": "添加标签...",
- "section.expand_all": "全部展开",
- "section.collapse_all": "全部折叠",
- "streams.title": "输入",
- "integrations.title": "集成",
- "streams.description": "源定义采集管线。原始源使用采集模板从显示器采集。处理源对另一个源应用后处理。将源分配给设备。",
- "streams.group.raw": "源",
- "streams.group.raw_templates": "引擎模板",
- "streams.group.processed": "源",
- "streams.group.proc_templates": "滤镜模板",
- "streams.group.css_processing": "处理模板",
- "streams.group.color_strip": "色带源",
- "streams.group.audio": "音频",
- "streams.group.audio_templates": "音频模板",
- "streams.section.streams": "源",
- "streams.add": "添加源",
- "streams.add.raw": "添加屏幕采集",
- "streams.add.processed": "添加处理源",
- "streams.edit": "编辑源",
- "streams.edit.raw": "编辑屏幕采集",
- "streams.edit.processed": "编辑处理源",
- "streams.name": "源名称:",
- "streams.name.placeholder": "我的源",
- "streams.type": "类型:",
- "streams.type.raw": "屏幕采集",
- "streams.type.processed": "已处理",
- "streams.display": "显示器:",
- "streams.display.hint": "采集哪个屏幕",
- "streams.capture_template": "引擎模板:",
- "streams.capture_template.hint": "定义屏幕采集方式的引擎模板",
- "streams.target_fps": "目标 FPS:",
- "streams.target_fps.hint": "采集的目标帧率(1-90)",
- "streams.source": "源:",
- "streams.source.hint": "要应用处理滤镜的源",
- "streams.pp_template": "滤镜模板:",
- "streams.pp_template.hint": "要应用到源的滤镜模板",
- "streams.description_label": "描述(可选):",
- "streams.description_placeholder": "描述此源...",
- "streams.created": "源创建成功",
- "streams.updated": "源更新成功",
- "streams.deleted": "源删除成功",
- "streams.delete.confirm": "确定要删除此源吗?",
- "streams.modal.loading": "加载中...",
- "streams.error.load": "加载源失败",
- "streams.error.required": "请填写所有必填项",
- "streams.error.delete": "删除源失败",
- "streams.test.title": "测试源",
- "streams.test.run": "运行",
- "streams.test.running": "正在测试源...",
- "streams.test.duration": "采集时长(秒):",
- "streams.test.error.failed": "源测试失败",
- "postprocessing.title": "滤镜模板",
- "postprocessing.description": "处理模板定义图像滤镜和色彩校正。将它们分配给处理图片源以实现跨设备的一致后处理。",
- "postprocessing.add": "添加滤镜模板",
- "postprocessing.edit": "编辑滤镜模板",
- "postprocessing.name": "模板名称:",
- "postprocessing.name.placeholder": "我的滤镜模板",
- "filters.select_type": "选择滤镜类型...",
- "filters.add": "添加滤镜",
- "filters.remove": "移除",
- "filters.drag_to_reorder": "拖动以重新排序",
- "filters.empty": "尚未添加滤镜。使用下方选择器添加滤镜。",
- "filters.brightness": "亮度",
- "filters.brightness.desc": "调整整体图像亮度",
- "filters.saturation": "饱和度",
- "filters.saturation.desc": "增强或降低色彩强度",
- "filters.gamma": "伽马",
- "filters.gamma.desc": "非线性亮度曲线校正",
- "filters.downscaler": "缩小",
- "filters.downscaler.desc": "降低分辨率以加快处理",
- "filters.pixelate": "像素化",
- "filters.pixelate.desc": "马赛克式块平均",
- "filters.auto_crop": "自动裁剪",
- "filters.auto_crop.desc": "移除信箱式内容的黑边",
- "filters.flip": "翻转",
- "filters.flip.desc": "水平或垂直镜像翻转",
- "filters.color_correction": "色彩校正",
- "filters.color_correction.desc": "白平衡和色温调整",
- "filters.filter_template": "滤镜模板",
- "filters.filter_template.desc": "嵌入另一个处理模板",
- "filters.css_filter_template": "色带滤镜模板",
- "filters.css_filter_template.desc": "嵌入另一个色带处理模板",
- "filters.frame_interpolation": "帧插值",
- "filters.frame_interpolation.desc": "帧间混合以获得更平滑的输出",
- "filters.noise_gate": "噪声门",
- "filters.noise_gate.desc": "抑制低于阈值的细微色彩变化",
- "filters.palette_quantization": "调色板量化",
- "filters.palette_quantization.desc": "将颜色减少到有限调色板",
- "filters.reverse": "反转",
- "filters.reverse.desc": "反转色带中的LED顺序",
- "postprocessing.description_label": "描述(可选):",
- "postprocessing.description_placeholder": "描述此模板...",
- "postprocessing.created": "模板创建成功",
- "postprocessing.updated": "模板更新成功",
- "postprocessing.deleted": "模板删除成功",
- "postprocessing.delete.confirm": "确定要删除此滤镜模板吗?",
- "postprocessing.error.load": "加载处理模板失败",
- "postprocessing.error.required": "请填写所有必填项",
- "postprocessing.error.delete": "删除处理模板失败",
- "postprocessing.config.show": "显示设置",
- "postprocessing.test.title": "测试滤镜模板",
- "postprocessing.test.source_stream": "源:",
- "postprocessing.test.running": "正在测试处理模板...",
- "postprocessing.test.error.no_stream": "请选择一个源",
- "postprocessing.test.error.failed": "处理模板测试失败",
- "css_processing.title": "色带处理模板",
- "css_processing.add": "添加色带处理模板",
- "css_processing.edit": "编辑色带处理模板",
- "css_processing.name": "模板名称:",
- "css_processing.name_placeholder": "我的色带处理模板",
- "css_processing.description_label": "描述(可选):",
- "css_processing.description_placeholder": "描述此模板...",
- "css_processing.created": "色带处理模板已创建",
- "css_processing.updated": "色带处理模板已更新",
- "css_processing.deleted": "色带处理模板已删除",
- "css_processing.delete.confirm": "确定要删除此色带处理模板吗?",
- "css_processing.error.required": "请填写所有必填字段",
- "css_processing.error.load": "加载色带处理模板出错",
- "css_processing.error.delete": "删除色带处理模板出错",
- "css_processing.error.clone_failed": "克隆色带处理模板失败",
- "device.button.stream_selector": "源设置",
- "device.stream_settings.title": "源设置",
- "device.stream_selector.label": "源:",
- "device.stream_selector.hint": "选择一个源来定义此设备采集和处理的内容",
- "device.stream_selector.none": "-- 未分配源 --",
- "device.stream_selector.saved": "源设置已更新",
- "device.stream_settings.border_width": "边框宽度(像素):",
- "device.stream_settings.border_width_hint": "从屏幕边缘采样多少像素来确定 LED 颜色(1-100)",
- "device.stream_settings.interpolation": "插值模式:",
- "device.stream_settings.interpolation.average": "平均",
- "device.stream_settings.interpolation.median": "中位数",
- "device.stream_settings.interpolation.dominant": "主色",
- "device.stream_settings.interpolation_hint": "如何从采样像素计算 LED 颜色",
- "device.stream_settings.smoothing": "平滑:",
- "device.stream_settings.smoothing_hint": "帧间时间混合(0=无,1=完全)。减少闪烁。",
- "device.tip.stream_selector": "为此设备配置图片源和 LED 投影设置",
- "streams.group.static_image": "静态图片",
- "streams.add.static_image": "添加静态图片源",
- "streams.edit.static_image": "编辑静态图片源",
- "streams.type.static_image": "静态图片",
- "streams.group.video": "视频",
- "streams.add.video": "添加视频源",
- "streams.edit.video": "编辑视频源",
- "picture_source.type.video": "视频",
- "picture_source.type.video.desc": "从上传的视频素材中流式传输帧",
- "picture_source.video.loop": "循环:",
- "picture_source.video.speed": "播放速度:",
- "picture_source.video.start_time": "开始时间(秒):",
- "picture_source.video.end_time": "结束时间(秒):",
- "picture_source.video.resolution_limit": "最大宽度(像素):",
- "picture_source.video.resolution_limit.hint": "解码时缩小视频以提高性能",
- "streams.image_asset": "图片素材:",
- "streams.image_asset.select": "选择图片素材…",
- "streams.image_asset.search": "搜索图片素材…",
- "streams.video_asset": "视频素材:",
- "streams.video_asset.select": "选择视频素材…",
- "streams.video_asset.search": "搜索视频素材…",
- "targets.title": "通道",
- "targets.description": "目标将色带源桥接到输出设备。每个目标引用一个设备和一个色带源。",
- "targets.subtab.wled": "LED",
- "targets.subtab.led": "LED",
- "targets.section.devices": "设备",
- "targets.section.color_strips": "色带源",
- "targets.section.targets": "目标",
- "targets.section.specific_settings": "特定设置",
- "targets.section.advanced": "高级",
- "targets.add": "添加目标",
- "targets.edit": "编辑目标",
- "targets.loading": "正在加载目标...",
- "targets.none": "尚未配置目标",
- "targets.failed": "加载目标失败",
- "targets.name": "目标名称:",
- "targets.name.placeholder": "我的目标",
- "targets.device": "设备:",
- "targets.device.hint": "选择要发送数据的 LED 设备",
- "targets.device.none": "-- 选择设备 --",
- "targets.color_strip_source": "色带源:",
- "targets.color_strip_source.hint": "选择为此目标提供 LED 颜色的色带源",
- "targets.no_css": "无源",
- "targets.source": "源:",
- "targets.source.hint": "要采集和处理的图片源",
- "targets.source.none": "-- 未分配源 --",
- "targets.fps": "目标 FPS:",
- "targets.fps.hint": "采集和 LED 更新的目标帧率(1-90)",
- "targets.fps.rec": "硬件最大 ≈ {fps} fps({leds} 个 LED)",
- "targets.border_width": "边框宽度(像素):",
- "targets.border_width.hint": "从屏幕边缘采样多少像素来确定 LED 颜色(1-100)",
- "targets.interpolation": "插值模式:",
- "targets.interpolation.hint": "如何从采样像素计算 LED 颜色",
- "targets.interpolation.average": "平均",
- "targets.interpolation.median": "中位数",
- "targets.interpolation.dominant": "主色",
- "targets.smoothing": "平滑:",
- "targets.smoothing.hint": "帧间时间混合(0=无,1=完全)。减少闪烁。",
- "targets.keepalive_interval": "心跳间隔:",
- "targets.keepalive_interval.hint": "源静态时重新发送最后一帧的频率,保持设备在活动模式(0.5-5.0秒)",
- "targets.created": "目标创建成功",
- "targets.updated": "目标更新成功",
- "targets.deleted": "目标删除成功",
- "targets.delete.confirm": "确定要删除此目标吗?",
- "targets.error.load": "加载目标失败",
- "targets.error.required": "请填写所有必填项",
- "targets.error.name_required": "请输入目标名称",
- "targets.error.delete": "删除目标失败",
- "targets.button.start": "启动",
- "targets.button.stop": "停止",
- "targets.status.processing": "处理中",
- "targets.status.idle": "空闲",
- "targets.status.error": "错误",
- "targets.metrics.actual_fps": "实际 FPS",
- "targets.metrics.target_fps": "目标 FPS",
- "targets.metrics.frames": "帧数",
- "targets.metrics.errors": "错误",
- "targets.section.pattern_templates": "图案模板",
- "pattern.add": "添加图案模板",
- "pattern.edit": "编辑图案模板",
- "pattern.name": "模板名称:",
- "pattern.name.placeholder": "我的图案模板",
- "pattern.description_label": "描述(可选):",
- "pattern.description_placeholder": "描述此图案...",
- "pattern.rectangles": "矩形",
- "pattern.rect.name": "名称",
- "pattern.rect.x": "X",
- "pattern.rect.y": "Y",
- "pattern.rect.width": "宽",
- "pattern.rect.height": "高",
- "pattern.rect.add": "添加矩形",
- "pattern.rect.remove": "移除",
- "pattern.rect.empty": "尚未定义矩形。请至少添加一个矩形。",
- "pattern.created": "图案模板创建成功",
- "pattern.updated": "图案模板更新成功",
- "pattern.deleted": "图案模板删除成功",
- "pattern.delete.confirm": "确定要删除此图案模板吗?",
- "pattern.delete.referenced": "无法删除:此模板正被目标引用",
- "pattern.error.required": "请填写所有必填项",
- "pattern.visual_editor": "可视编辑器",
- "pattern.capture_bg": "采集背景",
- "pattern.source_for_bg": "背景源:",
- "pattern.source_for_bg.none": "-- 选择源 --",
- "pattern.delete_selected": "删除选中",
- "pattern.name.hint": "此矩形布局的描述性名称",
- "pattern.description.hint": "关于此图案使用位置或方式的可选说明",
- "pattern.visual_editor.hint": "点击 + 按钮添加矩形。拖动边缘调整大小,拖动内部移动位置。",
- "pattern.rectangles.hint": "用精确坐标(0.0 到 1.0)微调矩形位置和大小",
- "overlay.toggle": "切换屏幕叠加层",
- "overlay.button.show": "显示叠加层可视化",
- "overlay.button.hide": "隐藏叠加层可视化",
- "overlay.started": "叠加层可视化已启动",
- "overlay.stopped": "叠加层可视化已停止",
- "overlay.error.start": "启动叠加层失败",
- "overlay.error.stop": "停止叠加层失败",
- "sidebar.workspaces": "工作区",
- "sidebar.load": "负载",
- "sidebar.fps": "帧率",
- "transport.status.ready": "就绪",
- "transport.status.armed": "运行中 · {n}",
- "transport.meta.uptime": "在线",
- "transport.meta.cpu": "CPU",
- "transport.meta.mem": "内存",
- "transport.meta.poll": "轮询",
- "transport.meta.poll_hint": "轮询间隔(点击:1秒 → 2秒 → 5秒 → 10秒)",
- "dashboard.title": "仪表盘",
- "dashboard.section.targets": "通道",
- "dashboard.section.running": "运行中",
- "dashboard.section.stopped": "已停止",
- "dashboard.no_targets": "尚未配置目标",
- "dashboard.uptime": "运行时长",
- "dashboard.fps": "FPS",
- "dashboard.errors": "错误",
- "dashboard.device": "设备",
- "dashboard.stop_all": "全部停止",
- "dashboard.failed": "加载仪表盘失败",
- "dashboard.section.automations": "自动化",
- "dashboard.section.scenes": "场景预设",
- "dashboard.section.playlists": "播放列表",
- "dashboard.section.sync_clocks": "同步时钟",
- "dashboard.targets": "目标",
- "dashboard.section.performance": "系统性能",
- "dashboard.perf.active_patches": "活动通道",
- "dashboard.perf.patches.empty.idle": "准备就绪",
- "dashboard.perf.patches.empty.none": "暂无通道",
- "dashboard.perf.total_fps": "总帧率",
- "dashboard.perf.total_capture_fps": "总输入帧率",
- "dashboard.perf.total_capture_fps_actual": "总采集帧率",
- "dashboard.perf.network": "网络",
- "dashboard.perf.device_latency": "设备延迟",
- "dashboard.perf.send_timing": "发送耗时",
- "dashboard.perf.errors": "错误",
- "dashboard.perf.devices": "设备",
- "dashboard.perf.cpu": "CPU",
- "dashboard.perf.ram": "内存",
- "dashboard.perf.gpu": "GPU",
- "dashboard.perf.temp": "温度",
- "dashboard.perf.temp.install_lhm": "Windows 没有内置的 CPU 温度 API。请安装 LibreHardwareMonitor 并启用“Publish to WMI”以在此处查看实时读数。",
- "dashboard.perf.unavailable": "不可用",
- "dashboard.perf.color": "图表颜色",
- "dashboard.perf.mode.system": "系统",
- "dashboard.perf.mode.app": "应用",
- "dashboard.perf.mode.both": "全部",
- "dashboard.poll_interval": "刷新间隔",
- "dashboard.customize.title": "自定义仪表盘",
- "dashboard.customize.presets": "预设",
- "dashboard.customize.preset.studio": "工作室",
- "dashboard.customize.preset.operator": "操作员",
- "dashboard.customize.preset.showrunner": "演出",
- "dashboard.customize.preset.diagnostics": "诊断",
- "dashboard.customize.preset.tv": "电视",
- "dashboard.customize.modified": "已修改",
- "dashboard.customize.global": "全局",
- "dashboard.customize.width": "宽度",
- "dashboard.customize.width.full": "全宽",
- "dashboard.customize.width.centered": "居中",
- "dashboard.customize.width.narrow": "窄",
- "dashboard.customize.anim": "动画",
- "dashboard.customize.anim.full": "完整",
- "dashboard.customize.anim.reduced": "减少",
- "dashboard.customize.anim.off": "关闭",
- "dashboard.customize.perf_mode": "性能模式",
- "dashboard.customize.sections": "分区",
- "dashboard.customize.perf_cells": "性能面板",
- "dashboard.customize.fixed_top": "固定在顶部",
- "dashboard.customize.drag_help": "拖动行重新排序,或使用 ↑/↓ 按钮。",
- "dashboard.customize.cell_drag_help": "拖动行可更改仪表盘性能条中单元格的顺序。",
- "dashboard.customize.window": "采样窗口",
- "dashboard.customize.scale": "Y 轴刻度",
- "dashboard.customize.mode_short": "模式",
- "dashboard.customize.window_short": "窗口",
- "dashboard.customize.scale_short": "刻度",
- "dashboard.customize.density.comfortable": "宽松",
- "dashboard.customize.density.compact": "紧凑",
- "dashboard.customize.density.dense": "密集",
- "card_mode.tooltip": "卡片大小",
- "card_mode.comfortable": "宽松",
- "card_mode.compact": "紧凑",
- "card_mode.dense": "密集",
- "card_mode.row": "列表",
- "dashboard.customize.collapse_default.on": "默认折叠",
- "dashboard.customize.collapse_default.off": "默认展开",
- "dashboard.customize.show": "显示",
- "dashboard.customize.hide": "隐藏",
- "dashboard.customize.mode.inherit": "继承",
- "dashboard.customize.mode.system": "系统",
- "dashboard.customize.mode.app": "应用",
- "dashboard.customize.mode.both": "两者",
- "dashboard.customize.yscale.auto": "自动",
- "dashboard.customize.yscale.fixed": "固定",
- "dashboard.customize.yscale.log": "对数",
- "dashboard.customize.export": "导出",
- "dashboard.customize.import": "导入",
- "dashboard.customize.reset": "重置",
- "dashboard.customize.reset_confirm": "将仪表盘布局重置为「工作室」预设?",
- "dashboard.customize.exported": "布局已导出",
- "dashboard.customize.imported": "布局已导入",
- "dashboard.customize.import_failed": "导入布局失败",
- "automations.title": "自动化",
- "automations.empty": "尚未配置自动化。创建一个以自动激活场景。",
- "automations.add": "添加自动化",
- "automations.edit": "编辑自动化",
- "automations.delete.confirm": "删除自动化 \"{name}\"?",
- "automations.section.triggers": "触发器",
- "automations.section.action": "动作",
- "automations.section.deactivation": "停用",
- "automations.name": "名称:",
- "automations.name.hint": "此自动化的描述性名称",
- "automations.name.placeholder": "我的自动化",
- "automations.enabled": "启用:",
- "automations.enabled.hint": "禁用的自动化即使满足条件也不会激活",
- "automations.rule_logic": "条件逻辑:",
- "automations.rule_logic.hint": "多个条件的组合方式:任一(或)或 全部(与)",
- "automations.rule_logic.or": "任一条件(或)",
- "automations.rule_logic.and": "全部条件(与)",
- "automations.rule_logic.or.desc": "任一条件匹配时触发",
- "automations.rule_logic.and.desc": "全部匹配时才触发",
- "automations.rules": "条件:",
- "automations.rules.hint": "决定此自动化何时激活的规则",
- "automations.rules.add": "添加条件",
- "automations.rules.empty": "无条件 — 启用后自动化始终处于活动状态",
- "automations.rule.startup": "启动",
- "automations.rule.startup.desc": "服务器启动时",
- "automations.rule.startup.hint": "服务器启动时激活,启用期间保持活动。",
- "automations.rule.application": "应用程序",
- "automations.rule.application.desc": "应用运行/聚焦",
- "automations.rule.application.apps": "应用程序:",
- "automations.rule.application.apps.hint": "进程名,每行一个(例如 firefox.exe)",
- "automations.rule.application.browse": "浏览",
- "automations.rule.application.search": "筛选进程...",
- "automations.rule.application.no_processes": "未找到进程",
- "automations.rule.application.match_type": "匹配类型:",
- "automations.rule.application.match_type.hint": "如何检测应用程序",
- "automations.rule.application.match_type.running": "运行中",
- "automations.rule.application.match_type.running.desc": "进程活跃",
- "automations.rule.application.match_type.topmost": "最前",
- "automations.rule.application.match_type.topmost.desc": "前台窗口",
- "automations.rule.application.match_type.topmost_fullscreen": "最前 + 全屏",
- "automations.rule.application.match_type.topmost_fullscreen.desc": "前台 + 全屏",
- "automations.rule.application.match_type.fullscreen": "全屏",
- "automations.rule.application.match_type.fullscreen.desc": "任意全屏应用",
- "automations.rule.application.apps.hint_android": "包名,每行一个(例如 com.netflix.mediaclient)",
- "automations.rule.application.search_apps": "筛选应用…",
- "automations.rule.application.no_apps": "未找到应用",
- "automations.rule.application.usage_access_required": "需要使用情况访问权限。在您的 LedGrab 电视上打开应用并点按「授予使用情况访问权限」。",
- "automations.rule.time_of_day": "时段",
- "automations.rule.time_of_day.desc": "时间范围",
- "automations.rule.time_of_day.start_time": "开始时间:",
- "automations.rule.time_of_day.end_time": "结束时间:",
- "automations.rule.time_of_day.overnight_hint": "跨夜时段(如 22:00–06:00),请将开始时间设为晚于结束时间。",
- "automations.rule.time_of_day.days": "生效日期",
- "automations.rule.time_of_day.days_hint": "全部不选表示每天生效。跨夜时段归属于其开始的那一天。",
- "automations.rule.time_of_day.timezone": "时区",
- "automations.rule.time_of_day.timezone.placeholder": "服务器本地时间(如 Europe/Berlin)",
- "weekday.short.0": "周一",
- "weekday.short.1": "周二",
- "weekday.short.2": "周三",
- "weekday.short.3": "周四",
- "weekday.short.4": "周五",
- "weekday.short.5": "周六",
- "weekday.short.6": "周日",
- "automations.rule.system_idle": "系统空闲",
- "automations.rule.system_idle.desc": "空闲/活跃",
- "automations.rule.system_idle.idle_minutes": "空闲超时(分钟):",
- "automations.rule.system_idle.mode": "触发模式:",
- "automations.rule.system_idle.when_idle": "空闲时",
- "automations.rule.system_idle.when_idle.desc": "当用户空闲时间超过超时阈值后触发",
- "automations.rule.system_idle.when_active": "活跃时",
- "automations.rule.system_idle.when_active.desc": "当用户正在使用系统时触发",
- "automations.rule.display_state": "显示器状态",
- "automations.rule.display_state.desc": "显示器开/关",
- "automations.rule.display_state.state": "显示器状态:",
- "automations.rule.display_state.on": "开启",
- "automations.rule.display_state.off": "关闭(休眠)",
- "automations.rule.mqtt": "MQTT",
- "automations.rule.mqtt.desc": "MQTT 消息",
- "automations.rule.mqtt.topic": "主题:",
- "automations.rule.mqtt.payload": "消息内容:",
- "automations.rule.mqtt.match_mode": "匹配模式:",
- "automations.rule.mqtt.match_mode.exact": "精确匹配",
- "automations.rule.mqtt.match_mode.contains": "包含",
- "automations.rule.mqtt.match_mode.regex": "正则表达式",
- "automations.rule.mqtt.hint": "当 MQTT 主题收到匹配的消息时激活",
- "automations.rule.webhook": "Webhook",
- "automations.rule.webhook.desc": "HTTP 回调",
- "automations.rule.webhook.hint": "通过外部服务的 HTTP 请求激活(Home Assistant、IFTTT、curl 等)",
- "automations.rule.webhook.url": "Webhook URL:",
- "automations.rule.webhook.copy": "复制",
- "automations.rule.webhook.copied": "已复制!",
- "automations.rule.webhook.save_first": "请先保存自动化以生成 Webhook URL",
- "automations.scene": "场景:",
- "automations.scene.hint": "条件满足时激活的场景预设",
- "automations.scene.search_placeholder": "搜索场景...",
- "automations.scene.none_selected": "无(无场景)",
- "automations.scene.none_available": "没有可用的场景",
- "automations.deactivation_mode": "停用方式:",
- "automations.deactivation_mode.hint": "条件不再满足时的行为",
- "automations.deactivation_mode.none": "无",
- "automations.deactivation_mode.none.desc": "保持当前状态",
- "automations.deactivation_mode.revert": "恢复",
- "automations.deactivation_mode.revert.desc": "恢复到之前的状态",
- "automations.deactivation_mode.fallback_scene": "备用",
- "automations.deactivation_mode.fallback_scene.desc": "激活备用场景",
- "automations.deactivation_scene": "备用场景:",
- "automations.deactivation_scene.hint": "自动化停用时激活的场景",
- "automations.status.active": "活动",
- "automations.status.inactive": "非活动",
- "automations.status.disabled": "已禁用",
- "automations.action.disable": "禁用",
- "automations.last_activated": "上次激活",
- "automations.logic.and": " 与 ",
- "automations.logic.or": " 或 ",
- "automations.logic.all": "全部",
- "automations.logic.any": "任一",
- "automations.updated": "自动化已更新",
- "automations.created": "自动化已创建",
- "automations.deleted": "自动化已删除",
- "automations.error.name_required": "名称为必填项",
- "automations.error.clone_failed": "克隆自动化失败",
- "automations.error.load_failed": "加载自动化失败",
- "automations.error.save_failed": "保存自动化失败",
- "automations.error.delete_failed": "删除自动化失败",
- "automations.error.toggle_failed": "切换自动化失败",
- "scenes.title": "场景",
- "scenes.add": "捕获场景",
- "scenes.edit": "编辑场景",
- "scenes.name": "名称:",
- "scenes.name.hint": "此场景预设的描述性名称",
- "scenes.name.placeholder": "我的场景",
- "scenes.description": "描述:",
- "scenes.description.hint": "此场景功能的可选描述",
- "scenes.targets": "目标:",
- "scenes.targets.hint": "选择要包含在此场景快照中的目标",
- "scenes.targets.add": "添加目标",
- "scenes.targets.search_placeholder": "搜索目标...",
- "scenes.targets.empty": "未选择目标",
- "scenes.capture": "捕获",
- "scenes.activate": "激活场景",
- "scenes.recapture": "重新捕获当前状态",
- "scenes.action.activate": "激活",
- "scenes.action.recapture": "重新捕获",
- "scenes.status.preset": "预设",
- "scenes.delete": "删除场景",
- "scenes.targets_count": "目标",
- "scenes.captured": "场景已捕获",
- "scenes.updated": "场景已更新",
- "scenes.activated": "场景已激活",
- "scenes.activated_partial": "场景部分激活",
- "scenes.errors": "错误",
- "scenes.recaptured": "场景已重新捕获",
- "scenes.deleted": "场景已删除",
- "scenes.recapture_confirm": "将当前状态重新捕获到\"{name}\"中?",
- "scenes.delete_confirm": "删除场景\"{name}\"?",
- "scenes.error.name_required": "名称为必填项",
- "scenes.error.save_failed": "保存场景失败",
- "scenes.error.activate_failed": "激活场景失败",
- "scenes.error.recapture_failed": "重新捕获场景失败",
- "scenes.error.delete_failed": "删除场景失败",
- "scenes.cloned": "场景已克隆",
- "scenes.error.clone_failed": "克隆场景失败",
- "playlists.title": "播放列表",
- "playlists.add": "新建播放列表",
- "playlists.edit": "编辑播放列表",
- "playlists.name": "名称:",
- "playlists.name.placeholder": "我的播放列表",
- "playlists.description": "描述:",
- "playlists.description.hint": "此播放列表的可选描述",
- "playlists.section.playback": "播放",
- "playlists.loop": "循环:",
- "playlists.loop.hint": "最后一个场景结束后从第一个重新开始;关闭则播放一遍后停止",
- "playlists.shuffle": "随机:",
- "playlists.shuffle.hint": "每个循环开始时随机打乱场景顺序",
- "playlists.scenes": "场景:",
- "playlists.scenes.hint": "此播放列表循环的场景预设,每个按各自的时长保持",
- "playlists.scenes.add": "添加场景",
- "playlists.scenes_count": "个场景",
- "playlists.scene_one": "个场景",
- "playlists.scene_many": "个场景",
- "playlists.items.empty": "还没有场景 — 在下方添加",
- "playlists.items.search_placeholder": "搜索场景...",
- "playlists.item.duration": "秒",
- "playlists.item.move_up": "上移",
- "playlists.item.move_down": "下移",
- "playlists.item.missing": "缺失",
- "playlists.chip.loop": "循环",
- "playlists.chip.shuffle": "随机",
- "playlists.action.start": "开始",
- "playlists.action.stop": "停止",
- "playlists.start": "开始播放列表",
- "playlists.stop": "停止播放列表",
- "playlists.status.playing": "播放中",
- "playlists.status.stopped": "已停止",
- "playlists.started": "播放列表已开始",
- "playlists.stopped": "播放列表已停止",
- "playlists.created": "播放列表已创建",
- "playlists.updated": "播放列表已更新",
- "playlists.deleted": "播放列表已删除",
- "playlists.delete_confirm": "删除播放列表“{name}”?",
- "playlists.error.name_required": "需要名称",
- "playlists.error.save_failed": "保存播放列表失败",
- "playlists.error.start_failed": "启动播放列表失败",
- "playlists.error.stop_failed": "停止播放列表失败",
- "playlists.error.delete_failed": "删除播放列表失败",
- "playlists.error.no_presets": "请先创建场景预设",
- "dashboard.type.led": "LED",
- "dashboard.type.kc": "关键颜色",
- "aria.close": "关闭",
- "aria.save": "保存",
- "aria.cancel": "取消",
- "aria.previous": "上一个",
- "aria.next": "下一个",
- "aria.hint": "显示提示",
- "color_strip.select_type": "选择色带类型",
- "color_strip.add": "添加",
- "color_strip.edit": "编辑",
- "color_strip.name": "名称:",
- "color_strip.name.placeholder": "墙壁灯带",
- "color_strip.picture_source": "图片源:",
- "color_strip.picture_source.hint": "用作 LED 颜色计算输入的屏幕采集源",
- "color_strip.fps": "目标 FPS:",
- "color_strip.fps.hint": "LED 颜色更新的目标帧率(10-90)",
- "color_strip.interpolation": "颜色模式:",
- "color_strip.interpolation.hint": "如何从采样的边框像素计算 LED 颜色",
- "color_strip.interpolation.average": "平均",
- "color_strip.interpolation.median": "中位数",
- "color_strip.interpolation.dominant": "主色",
- "color_strip.interpolation.average.desc": "将所有采样像素混合为平滑颜色",
- "color_strip.interpolation.median.desc": "取中间颜色值,减少异常值",
- "color_strip.interpolation.dominant.desc": "使用样本中出现最频繁的颜色",
- "color_strip.smoothing": "平滑:",
- "color_strip.smoothing.hint": "帧间时间混合(0=无,1=完全)。减少闪烁。",
- "color_strip.frame_interpolation": "帧插值:",
- "color_strip.frame_interpolation.hint": "在连续采集帧之间混合,以在采集速率较低时仍以完整目标 FPS 输出。减少慢速环境过渡时的可见阶梯效应。",
- "color_strip.color_corrections": "色彩校正",
- "color_strip.brightness": "亮度:",
- "color_strip.brightness.hint": "输出亮度倍数(0=关闭,1=不变,2=加倍)。在颜色提取后应用。",
- "color_strip.saturation": "饱和度:",
- "color_strip.saturation.hint": "颜色饱和度(0=灰度,1=不变,2=双倍饱和度)",
- "color_strip.gamma": "伽马:",
- "color_strip.gamma.hint": "伽马校正(1=无,<1=更亮的中间调,>1=更暗的中间调)",
- "color_strip.test_device": "测试设备:",
- "color_strip.test_device.hint": "选择一个设备,在点击边缘切换时发送测试像素",
- "color_strip.leds": "LED 数量",
- "color_strip.led_count": "LED 数量:",
- "color_strip.led_count.hint": "物理灯带上的 LED 总数。屏幕源:0 = 从校准自动获取(未映射到边缘的额外 LED 将为黑色)。静态颜色:设置为与设备 LED 数量匹配。",
- "color_strip.created": "色带源已创建",
- "color_strip.updated": "色带源已更新",
- "color_strip.deleted": "色带源已删除",
- "color_strip.delete.confirm": "确定要删除此色带源吗?",
- "color_strip.delete.referenced": "无法删除:此源正在被目标使用",
- "color_strip.error.name_required": "请输入名称",
- "color_strip.type": "类型:",
- "color_strip.type.hint": "图片源从屏幕采集推导 LED 颜色。单色用单一颜色填充所有 LED。渐变在所有 LED 上分布颜色渐变。颜色循环平滑循环用户定义的颜色列表。组合将多个源作为混合图层叠加。音频响应从实时音频输入驱动 LED。API 输入通过 REST 或 WebSocket 从外部客户端接收原始 LED 颜色。",
- "color_strip.type.picture": "图片源",
- "color_strip.type.picture.desc": "从屏幕捕获获取颜色",
- "color_strip.type.picture_advanced": "多显示器",
- "color_strip.type.picture_advanced.desc": "跨显示器的线条校准",
- "color_strip.type.single_color": "单色",
- "color_strip.type.single_color.desc": "单色填充",
- "color_strip.type.gradient": "渐变",
- "color_strip.type.gradient.desc": "LED上的平滑颜色过渡",
- "color_strip.single_color": "颜色:",
- "color_strip.single_color.hint": "将发送到灯带上所有 LED 的纯色。",
- "color_strip.gradient.preview": "渐变:",
- "color_strip.gradient.preview.hint": "可视预览。点击下方标记轨道添加色标。拖动标记重新定位。",
- "color_strip.gradient.stops": "色标:",
- "color_strip.gradient.stops.hint": "每个色标在相对位置定义一种颜色(0.0 = 起始,1.0 = 结束)。↔ 按钮添加右侧颜色以在该色标处创建硬边。",
- "color_strip.gradient.stops_count": "个色标",
- "color_strip.gradient.add_stop": "+ 添加色标",
- "color_strip.gradient.position": "位置(0.0-1.0)",
- "color_strip.gradient.bidir.hint": "在此色标右侧添加第二种颜色以在渐变中创建硬边。",
- "color_strip.gradient.min_stops": "渐变至少需要 2 个色标",
- "color_strip.gradient.preset": "预设:",
- "color_strip.gradient.preset.hint": "加载预定义的渐变调色板。选择预设将替换当前色标。",
- "color_strip.gradient.preset.custom": "— 自定义 —",
- "color_strip.gradient.preset.rainbow": "彩虹",
- "color_strip.gradient.preset.sunset": "日落",
- "color_strip.gradient.preset.ocean": "海洋",
- "color_strip.gradient.preset.forest": "森林",
- "color_strip.gradient.preset.fire": "火焰",
- "color_strip.gradient.preset.lava": "熔岩",
- "color_strip.gradient.preset.aurora": "极光",
- "color_strip.gradient.preset.ice": "冰",
- "color_strip.gradient.preset.warm": "暖色",
- "color_strip.gradient.preset.cool": "冷色",
- "color_strip.gradient.preset.neon": "霓虹",
- "color_strip.gradient.preset.pastel": "柔和",
- "color_strip.gradient.preset.save_button": "保存为预设…",
- "color_strip.gradient.preset.save_prompt": "输入预设名称:",
- "color_strip.gradient.preset.saved": "预设已保存",
- "color_strip.gradient.preset.deleted": "预设已删除",
- "color_strip.gradient.preset.apply": "应用",
- "color_strip.animation": "动画",
- "color_strip.animation.type": "效果:",
- "color_strip.animation.type.hint": "要应用的动画效果。",
- "color_strip.animation.type.none": "无(无动画效果)",
- "color_strip.animation.type.none.desc": "静态颜色,无动画",
- "color_strip.animation.type.breathing": "呼吸",
- "color_strip.animation.type.breathing.desc": "平滑的亮度渐入渐出",
- "color_strip.animation.type.gradient_shift": "渐变移动",
- "color_strip.animation.type.gradient_shift.desc": "渐变沿灯带滑动",
- "color_strip.animation.type.wave": "波浪",
- "color_strip.animation.type.wave.desc": "沿灯带移动的正弦亮度波",
- "color_strip.animation.type.strobe": "频闪",
- "color_strip.animation.type.strobe.desc": "快速开/关闪烁",
- "color_strip.animation.type.sparkle": "闪烁",
- "color_strip.animation.type.sparkle.desc": "随机 LED 短暂闪亮",
- "color_strip.animation.type.pulse": "脉冲",
- "color_strip.animation.type.pulse.desc": "快速衰减的尖锐亮度脉冲",
- "color_strip.animation.type.candle": "烛光",
- "color_strip.animation.type.candle.desc": "温暖的类似蜡烛的闪烁光芒",
- "color_strip.animation.type.rainbow_fade": "彩虹渐变",
- "color_strip.animation.type.rainbow_fade.desc": "循环整个色相光谱",
- "color_strip.animation.speed": "速度:",
- "color_strip.animation.speed.hint": "动画速度倍数。1.0 ≈ 呼吸效果每秒一个循环;更高值循环更快。",
- "color_strip.type.effect": "效果",
- "color_strip.type.effect.desc": "程序化效果:火焰、等离子、极光",
- "color_strip.type.effect.hint": "实时生成的程序化 LED 效果(火焰、流星、等离子、噪声、极光)。",
- "color_strip.type.composite": "组合",
- "color_strip.type.composite.desc": "叠加和混合多个源",
- "color_strip.type.composite.hint": "将多个色带源作为图层叠加,支持混合模式和不透明度。",
- "color_strip.type.mapped": "映射",
- "color_strip.type.mapped.desc": "为LED区域分配源",
- "color_strip.type.mapped.hint": "将不同色带源分配到不同 LED 范围(区域)。与组合的图层混合不同,映射将源并排放置。",
- "color_strip.type.audio": "音频响应",
- "color_strip.type.audio.desc": "由音频输入驱动LED",
- "color_strip.type.audio.hint": "LED 颜色由实时音频输入驱动 — 系统音频或麦克风。",
- "color_strip.type.api_input": "API 输入",
- "color_strip.type.api_input.desc": "从外部应用接收颜色",
- "color_strip.type.api_input.hint": "通过 REST POST 或 WebSocket 从外部客户端接收原始 LED 颜色数组。用于与自定义软件、家庭自动化或任何能发送 HTTP 请求的系统集成。",
- "color_strip.api_input.fallback_color": "备用颜色:",
- "color_strip.api_input.fallback_color.hint": "超时未收到数据时显示的颜色。启动时和连接丢失后 LED 将显示此颜色。",
- "color_strip.api_input.timeout": "超时(秒):",
- "color_strip.api_input.timeout.hint": "等待新颜色数据多长时间后恢复为备用颜色。设为 0 表示永不超时。",
- "color_strip.api_input.endpoints": "推送端点:",
- "color_strip.api_input.endpoints.hint": "使用这些 URL 从外部应用程序推送 LED 颜色数据。REST 接受 JSON,WebSocket 接受 JSON 和原始二进制帧。",
- "color_strip.api_input.save_first": "请先保存源以查看推送端点 URL。",
- "color_strip.api_input.interpolation": "LED 插值:",
- "color_strip.api_input.interpolation.hint": "当传入的 LED 数量与设备 LED 数量不同时如何调整大小。线性提供平滑混合,最近邻保持锐利边缘,无则截断或补零。",
- "color_strip.api_input.interpolation.linear": "线性",
- "color_strip.api_input.interpolation.linear.desc": "LED 之间平滑混合",
- "color_strip.api_input.interpolation.nearest": "最近邻",
- "color_strip.api_input.interpolation.nearest.desc": "锐利边缘,无混合",
- "color_strip.api_input.interpolation.none": "无",
- "color_strip.api_input.interpolation.none.desc": "截断或补零",
- "color_strip.type.notification": "通知",
- "color_strip.type.notification.desc": "通过Webhook触发的一次性效果",
- "color_strip.type.notification.hint": "通过 Webhook 触发时显示一次性视觉效果(闪烁、脉冲、扫描)。设计为组合源中的叠加层。",
- "color_strip.notification.os_listener": "监听系统通知:",
- "color_strip.notification.os_listener.hint": "启用后,当桌面通知出现时(Windows toast / Linux D-Bus),此源会自动触发。需要应用具有通知访问权限。",
- "color_strip.notification.effect": "效果:",
- "color_strip.notification.effect.hint": "通知触发时的视觉效果。闪烁线性衰减,脉冲平滑钟形曲线,扫描从左到右填充后衰减。",
- "color_strip.notification.effect.flash": "闪烁",
- "color_strip.notification.effect.flash.desc": "瞬时点亮,线性衰减",
- "color_strip.notification.effect.pulse": "脉冲",
- "color_strip.notification.effect.pulse.desc": "平滑钟形发光",
- "color_strip.notification.effect.sweep": "扫描",
- "color_strip.notification.effect.sweep.desc": "从左到右填充然后消失",
- "color_strip.notification.duration": "持续时间(毫秒):",
- "color_strip.notification.duration.hint": "通知效果播放的时长(毫秒)。",
- "color_strip.notification.default_color": "默认颜色:",
- "color_strip.notification.default_color.hint": "当通知没有应用特定颜色映射时使用的颜色。",
- "color_strip.notification.filter_mode": "应用过滤:",
- "color_strip.notification.filter_mode.hint": "按应用名称过滤通知。关闭=接受全部,白名单=仅列出的应用,黑名单=排除列出的应用。",
- "color_strip.notification.filter_mode.off": "关闭",
- "color_strip.notification.filter_mode.whitelist": "白名单",
- "color_strip.notification.filter_mode.blacklist": "黑名单",
- "color_strip.notification.filter_mode.off.desc": "接受所有通知",
- "color_strip.notification.filter_mode.whitelist.desc": "仅列出的应用",
- "color_strip.notification.filter_mode.blacklist.desc": "排除列出的应用",
- "color_strip.notification.filter_list": "应用列表:",
- "color_strip.notification.filter_list.hint": "每行一个应用名称。使用「浏览」从运行中的进程中选择。",
- "color_strip.notification.filter_list.placeholder": "Discord\nSlack\nTelegram",
- "color_strip.notification.app_colors": "应用颜色",
- "color_strip.notification.app_colors.label": "颜色映射:",
- "color_strip.notification.app_colors.hint": "每个应用的自定义通知颜色。每行将一个应用名称映射到特定颜色。",
- "color_strip.notification.app_colors.add": "+ 添加映射",
- "color_strip.notification.app_overrides": "按应用覆盖",
- "color_strip.notification.app_overrides.label": "应用覆盖:",
- "color_strip.notification.app_overrides.hint": "为特定应用自定义颜色和声音。每行可设置颜色、声音资源和音量。",
- "color_strip.notification.app_overrides.add": "+ 添加覆盖",
- "color_strip.notification.app_overrides.app_placeholder": "应用名称",
- "color_strip.notification.sound": "声音",
- "color_strip.notification.sound.asset": "声音资源:",
- "color_strip.notification.sound.asset.hint": "选择通知触发时播放的声音资源。留空表示静音。",
- "color_strip.notification.sound.none": "无(静音)",
- "color_strip.notification.sound.search": "搜索声音…",
- "color_strip.notification.sound.volume": "音量:",
- "color_strip.notification.sound.volume.hint": "通知声音的全局音量(0–100%)。",
- "color_strip.notification.sound.app_sounds": "按应用声音:",
- "color_strip.notification.sound.app_sounds.hint": "为特定应用覆盖声音和音量。空声音 = 静音该应用。",
- "color_strip.notification.sound.app_sounds.add": "+ 添加覆盖",
- "color_strip.notification.sound.app_name_placeholder": "应用名称",
- "color_strip.notification.endpoint": "Webhook 端点:",
- "color_strip.notification.endpoint.hint": "使用此 URL 从外部系统触发通知。POST 请求可选 JSON:{\"app\": \"AppName\", \"color\": \"#FF0000\"}。",
- "color_strip.notification.save_first": "请先保存源以查看 Webhook 端点 URL。",
- "color_strip.notification.app_count": "个应用",
- "color_strip.notification.test": "测试通知",
- "color_strip.notification.test.ok": "通知已发送",
- "color_strip.notification.test.no_streams": "此源没有运行中的流",
- "color_strip.notification.test.error": "发送通知失败",
- "color_strip.notification.history.title": "通知历史",
- "color_strip.notification.history.hint": "监听器捕获的最近OS通知(最新在前),最多50条。",
- "color_strip.notification.history.empty": "尚未捕获任何通知",
- "color_strip.notification.history.unavailable": "此平台不支持OS通知监听器",
- "color_strip.notification.history.error": "加载通知历史失败",
- "color_strip.notification.history.refresh": "刷新",
- "color_strip.notification.history.unknown_app": "未知应用",
- "color_strip.notification.history.fired": "触发的流数量",
- "color_strip.notification.history.filtered": "过滤的流数量",
- "color_strip.test.title": "预览测试",
- "color_strip.test.connecting": "连接中...",
- "color_strip.test.error": "无法连接到预览流",
- "color_strip.test.led_count": "LED数量:",
- "color_strip.test.fps": "FPS:",
- "color_strip.test.receive_fps": "接收帧率",
- "color_strip.test.apply": "应用",
- "color_strip.test.composite": "合成",
- "color_strip.preview.title": "实时预览",
- "color_strip.preview.not_connected": "未连接",
- "color_strip.preview.connecting": "连接中...",
- "color_strip.preview.connected": "已连接",
- "color_strip.preview.unsupported": "此源类型不支持预览",
- "color_strip.preview.save_first": "请先保存源——预览需要校准数据",
- "color_strip.type.daylight": "日光循环",
- "color_strip.type.daylight.desc": "模拟24小时自然日光变化",
- "color_strip.type.daylight.hint": "模拟太阳在24小时内的色温变化——从温暖的日出到冷白的日光,再到温暖的日落和昏暗的夜晚。",
- "color_strip.daylight.speed": "速度:",
- "color_strip.daylight.speed.hint": "循环速度倍数。1.0 = 约4分钟完成一个完整的昼夜循环。",
- "color_strip.daylight.use_real_time": "使用实时时间:",
- "color_strip.daylight.use_real_time.hint": "启用后,LED颜色匹配计算机的实际时间。速度设置将被忽略。",
- "color_strip.daylight.real_time": "实时",
- "color_strip.daylight.latitude": "纬度:",
- "color_strip.daylight.latitude.hint": "地理纬度(-90到90)。影响实时模式下的日出/日落时间。",
- "color_strip.type.candlelight": "烛光",
- "color_strip.type.candlelight.desc": "逼真的烛光闪烁模拟",
- "color_strip.type.candlelight.hint": "在所有LED上模拟逼真的蜡烛闪烁,具有温暖色调和有机闪烁模式。",
- "color_strip.type.weather": "天气",
- "color_strip.type.weather.desc": "天气感应环境色彩",
- "color_strip.type.weather.hint": "将实时天气状况映射为环境LED颜色。需要天气源实体。",
- "color_strip.weather.source": "天气源:",
- "color_strip.weather.source.hint": "用于环境颜色的天气数据源。请先在天气标签页中创建。",
- "color_strip.weather.speed": "动画速度:",
- "color_strip.weather.speed.hint": "环境色彩漂移动画速度。越高越快。",
- "color_strip.weather.temperature_influence": "温度影响:",
- "color_strip.weather.temperature_influence.hint": "当前温度对调色板冷暖偏移程度。0=纯天气颜色,1=强偏移。",
- "color_strip.weather.error.no_source": "请选择天气源",
- "color_strip.candlelight.color": "基础颜色:",
- "color_strip.candlelight.color.hint": "蜡烛火焰的温暖基础颜色。默认为自然温暖的琥珀色。",
- "color_strip.candlelight.intensity": "闪烁强度:",
- "color_strip.candlelight.intensity.hint": "蜡烛闪烁程度。低值产生柔和光芒,高值模拟风中的蜡烛。",
- "color_strip.candlelight.num_candles_label": "蜡烛数量:",
- "color_strip.candlelight.num_candles": "支蜡烛",
- "color_strip.candlelight.num_candles.hint": "灯带上独立蜡烛光源的数量。每支蜡烛有自己的闪烁模式。",
- "color_strip.candlelight.speed": "闪烁速度:",
- "color_strip.candlelight.speed.hint": "闪烁动画的速度。较高的值产生更快、更不安定的火焰。",
- "color_strip.type.processed": "已处理",
- "color_strip.type.processed.desc": "将处理模板应用于另一个源",
- "color_strip.type.processed.hint": "包装现有色带源并通过滤镜链处理其输出。",
- "color_strip.processed.input": "源:",
- "color_strip.processed.input.hint": "将被处理的色带源",
- "color_strip.processed.template": "处理模板:",
- "color_strip.processed.template.hint": "应用于输入源输出的滤镜链",
- "color_strip.processed.error.no_input": "请选择输入源",
- "color_strip.composite.layers": "图层:",
- "color_strip.composite.layers.hint": "叠加多个色带源。第一个图层在底部,最后一个在顶部。每个图层可以有自己的混合模式和不透明度。",
- "color_strip.composite.add_layer": "添加图层",
- "color_strip.composite.source": "源",
- "color_strip.composite.blend_mode": "混合",
- "color_strip.composite.blend_mode.normal": "正常",
- "color_strip.composite.blend_mode.normal.desc": "标准 Alpha 混合",
- "color_strip.composite.blend_mode.add": "叠加",
- "color_strip.composite.blend_mode.add.desc": "通过叠加颜色提亮",
- "color_strip.composite.blend_mode.multiply": "正片叠底",
- "color_strip.composite.blend_mode.multiply.desc": "通过相乘颜色变暗",
- "color_strip.composite.blend_mode.screen": "滤色",
- "color_strip.composite.blend_mode.screen.desc": "提亮,正片叠底的反转",
- "color_strip.composite.blend_mode.override": "覆盖",
- "color_strip.composite.blend_mode.overlay": "叠加",
- "color_strip.composite.blend_mode.overlay.desc": "暗部相乘,亮部滤色",
- "color_strip.composite.blend_mode.soft_light": "柔光",
- "color_strip.composite.blend_mode.soft_light.desc": "柔和对比度调整",
- "color_strip.composite.blend_mode.hard_light": "强光",
- "color_strip.composite.blend_mode.hard_light.desc": "强对比度,鲜艳色彩",
- "color_strip.composite.blend_mode.difference": "差值",
- "color_strip.composite.blend_mode.difference.desc": "绝对颜色差异",
- "color_strip.composite.blend_mode.exclusion": "排除",
- "color_strip.composite.blend_mode.exclusion.desc": "类似差值,对比度更低",
- "color_strip.composite.blend_mode.override.desc": "黑色=透明,亮色=不透明",
- "color_strip.composite.opacity": "不透明度",
- "color_strip.composite.brightness": "亮度",
- "color_strip.composite.brightness.none": "无(全亮度)",
- "color_strip.composite.processing": "处理",
- "color_strip.composite.enabled": "启用",
- "color_strip.composite.error.min_layers": "至少需要 1 个图层",
- "color_strip.composite.error.no_source": "每个图层必须选择一个源",
- "color_strip.composite.layers_count": "个图层",
- "color_strip.composite.range": "LED范围",
- "color_strip.composite.range_start": "起始",
- "color_strip.composite.range_end": "结束",
- "color_strip.composite.reverse": "反转",
- "color_strip.mapped.zones": "区域:",
- "color_strip.mapped.zones.hint": "每个区域将色带源映射到特定 LED 范围。区域并排放置 — 区域之间的间隙保持黑色。",
- "color_strip.mapped.add_zone": "+ 添加区域",
- "color_strip.mapped.zone_source": "源",
- "color_strip.mapped.zone_start": "起始 LED",
- "color_strip.mapped.zone_end": "结束 LED",
- "color_strip.mapped.zone_reverse": "反转",
- "color_strip.mapped.zones_count": "个区域",
- "color_strip.mapped.select_source": "搜索源...",
- "color_strip.mapped.error.no_source": "每个区域必须选择一个源",
- "color_strip.audio.visualization": "可视化:",
- "color_strip.audio.visualization.hint": "音频数据如何渲染到 LED。",
- "color_strip.audio.viz.spectrum": "频谱分析",
- "color_strip.audio.viz.spectrum.desc": "频率条分布在灯带上",
- "color_strip.audio.viz.beat_pulse": "节拍脉冲",
- "color_strip.audio.viz.beat_pulse.desc": "所有LED随节拍脉动",
- "color_strip.audio.viz.vu_meter": "VU 表",
- "color_strip.audio.viz.vu_meter.desc": "音量填充灯带",
- "color_strip.audio.viz.pulse_on_beat": "节拍脉动",
- "color_strip.audio.viz.pulse_on_beat.desc": "LED随每个检测到的节拍脉动",
- "color_strip.audio.viz.energy_gradient": "能量渐变",
- "color_strip.audio.viz.energy_gradient.desc": "渐变强度跟随音频能量",
- "color_strip.audio.viz.spectrum_bands": "频谱频段",
- "color_strip.audio.viz.spectrum_bands.desc": "分组频段分布在灯带上",
- "color_strip.audio.viz.strobe_on_drop": "低音闪烁",
- "color_strip.audio.viz.strobe_on_drop.desc": "低音下降时闪烁频闪效果",
- "color_strip.audio.beat_decay": "节拍衰减:",
- "color_strip.audio.beat_decay.hint": "节拍脉冲消退的速度。较低值 = 较长衰减,较高值 = 更灵敏的响应。",
- "color_strip.audio.source": "音频源:",
- "color_strip.audio.source.hint": "此可视化的音频源。可以是多声道(设备)或单声道(单通道)源。在源标签页中创建和管理音频源。",
- "color_strip.audio.sensitivity": "灵敏度:",
- "color_strip.audio.sensitivity.hint": "音频电平的增益倍数。更高值使 LED 对较安静的声音也有反应。",
- "color_strip.audio.smoothing": "平滑:",
- "color_strip.audio.smoothing.hint": "帧间时间平滑。更高值产生更平滑但反应较慢的视觉效果。",
- "color_strip.audio.palette": "调色板:",
- "color_strip.audio.palette.hint": "用于频谱条或节拍脉冲着色的调色板。",
- "color_strip.audio.color": "基础颜色:",
- "color_strip.audio.color.hint": "VU 表条的低电平颜色。",
- "color_strip.audio.color_peak": "峰值颜色:",
- "color_strip.audio.color_peak.hint": "VU 表条顶部的高电平颜色。",
- "color_strip.audio.mirror": "镜像:",
- "color_strip.audio.mirror.hint": "从中心向外镜像频谱:低音在中间,高音在两端。",
- "color_strip.effect.type": "效果类型:",
- "color_strip.effect.type.hint": "选择程序化算法。",
- "color_strip.effect.fire": "火焰",
- "color_strip.effect.fire.desc": "模拟带热量扩散的上升火焰的元胞自动机",
- "color_strip.effect.meteor": "流星",
- "color_strip.effect.meteor.desc": "明亮头部沿灯带移动,带指数衰减的尾迹",
- "color_strip.effect.plasma": "等离子",
- "color_strip.effect.plasma.desc": "映射到调色板的重叠正弦波 — 经典演示场景效果",
- "color_strip.effect.noise": "噪声",
- "color_strip.effect.noise.desc": "滚动的分形值噪声映射到调色板",
- "color_strip.effect.aurora": "极光",
- "color_strip.effect.aurora.desc": "漂移和混合的分层噪声带 — 北极光风格",
- "color_strip.effect.speed": "速度:",
- "color_strip.effect.speed.hint": "效果动画的速度倍数(0.1 = 非常慢,10.0 = 非常快)。",
- "color_strip.effect.palette": "调色板:",
- "color_strip.effect.palette.hint": "用于将效果值映射到 RGB 颜色的调色板。",
- "color_strip.effect.color": "流星颜色:",
- "color_strip.effect.color.hint": "流星效果的头部颜色。",
- "color_strip.effect.intensity": "强度:",
- "color_strip.effect.intensity.hint": "效果强度 — 控制火花率(火焰)、尾迹衰减(流星)或亮度范围(极光)。",
- "color_strip.effect.scale": "比例:",
- "color_strip.effect.scale.hint": "空间比例 — 波频率(等离子)、缩放级别(噪声)或带宽(极光)。",
- "color_strip.effect.mirror": "镜像:",
- "color_strip.effect.mirror.hint": "反弹模式 — 流星在灯带末端反转方向而不是循环。",
- "color_strip.palette.fire": "火焰",
- "color_strip.palette.ocean": "海洋",
- "color_strip.palette.lava": "熔岩",
- "color_strip.palette.forest": "森林",
- "color_strip.palette.rainbow": "彩虹",
- "color_strip.palette.aurora": "极光",
- "color_strip.palette.sunset": "日落",
- "color_strip.palette.ice": "冰",
- "audio_source.title": "音频源",
- "audio_source.add": "添加音频源",
- "audio_source.add.capture": "添加捕获源",
- "audio_source.add.processed": "添加处理源",
- "audio_source.edit": "编辑音频源",
- "audio_source.edit.capture": "编辑捕获源",
- "audio_source.edit.processed": "编辑处理源",
- "audio_source.name": "名称:",
- "audio_source.name.placeholder": "系统音频",
- "audio_source.name.hint": "此音频源的描述性名称",
- "audio_source.type": "类型:",
- "audio_source.type.hint": "捕获包装物理音频设备。处理将音频处理滤波器应用于另一个源。",
- "audio_source.type.capture": "捕获",
- "audio_source.type.processed": "已处理",
- "audio_source.device": "音频设备:",
- "audio_source.device.hint": "音频输入源。回环设备采集系统音频输出;输入设备采集麦克风或线路输入。",
- "audio_source.refresh_devices": "刷新设备",
- "audio_source.parent": "输入音频源:",
- "audio_source.parent.hint": "要应用处理滤波器的音频源",
- "audio_source.processing_template": "处理模板:",
- "audio_source.processing_template.hint": "包含要应用于输入源的滤波器的音频处理模板",
- "audio_source.description": "描述(可选):",
- "audio_source.description.placeholder": "描述此音频源...",
- "audio_source.description.hint": "关于此音频源的可选说明",
- "audio_source.created": "音频源已创建",
- "audio_source.updated": "音频源已更新",
- "audio_source.deleted": "音频源已删除",
- "audio_source.delete.confirm": "确定要删除此音频源吗?",
- "audio_source.error.name_required": "请输入名称",
- "audio_source.audio_template": "音频模板:",
- "audio_source.audio_template.hint": "定义此设备使用哪个引擎和设置的音频采集模板",
- "audio_source.test": "测试",
- "audio_source.test.title": "测试音频源",
- "audio_source.test.rms": "RMS",
- "audio_source.test.peak": "峰值",
- "audio_source.test.beat": "节拍",
- "audio_source.test.connecting": "连接中...",
- "audio_source.test.error": "音频测试失败",
- "audio_template.test": "测试",
- "audio_template.test.title": "测试音频模板",
- "audio_template.test.device": "音频设备:",
- "audio_template.test.device.hint": "选择测试期间要采集的音频设备",
- "audio_template.test.run": "运行",
- "audio_template.title": "音频模板",
- "audio_template.add": "添加音频模板",
- "audio_template.edit": "编辑音频模板",
- "audio_template.name": "模板名称:",
- "audio_template.name.placeholder": "我的音频模板",
- "audio_template.description.label": "描述(可选):",
- "audio_template.description.placeholder": "描述此模板...",
- "audio_template.engine": "音频引擎:",
- "audio_template.engine.hint": "选择要使用的音频采集后端。WASAPI 仅限 Windows 并支持回环。Sounddevice 支持跨平台。",
- "audio_template.engine.unavailable": "不可用",
- "audio_template.engine.unavailable.hint": "此引擎在您的系统上不可用",
- "audio_template.config": "配置",
- "audio_template.config.show": "显示配置",
- "audio_template.created": "音频模板已创建",
- "audio_template.updated": "音频模板已更新",
- "audio_template.deleted": "音频模板已删除",
- "audio_template.delete.confirm": "确定要删除此音频模板吗?",
- "audio_template.error.load": "加载音频模板失败",
- "audio_template.error.engines": "加载音频引擎失败",
- "audio_template.error.required": "请填写所有必填项",
- "audio_template.error.delete": "删除音频模板失败",
- "audio_template.error.save_failed": "保存音频模板失败",
- "audio_template.error.load_failed": "加载音频模板失败",
- "gradient.error.save_failed": "保存渐变失败",
- "gradient.error.delete_failed": "删除渐变失败",
- "streams.group.value": "值源",
- "streams.group.sync": "同步时钟",
- "tree.group.picture": "图片源",
- "tree.group.capture": "屏幕采集",
- "tree.group.static": "静态",
- "tree.group.processing": "已处理",
- "tree.group.strip": "色带",
- "tree.group.audio": "音频",
- "tree.group.audio_capture": "采集",
- "tree.group.audio_processed": "处理",
- "tree.group.utility": "工具",
- "tree.leaf.sources": "源",
- "tree.leaf.engine_templates": "引擎模板",
- "tree.leaf.images": "图片",
- "tree.leaf.video": "视频",
- "tree.leaf.filter_templates": "滤镜模板",
- "tree.leaf.processing_templates": "处理模板",
- "tree.leaf.templates": "模板",
- "value_source.group.title": "值源",
- "value_source.select_type": "选择值源类型",
- "value_source.add": "添加值源",
- "value_source.edit": "编辑值源",
- "value_source.name": "名称:",
- "value_source.name.placeholder": "亮度脉冲",
- "value_source.name.hint": "此值源的描述性名称",
- "value_source.type": "类型:",
- "value_source.type.hint": "静态输出固定值。动画循环波形。音频响应声音输入。自适应类型根据时间或场景内容自动调节亮度。",
- "value_source.type.static": "静态",
- "value_source.type.static.desc": "固定输出值",
- "value_source.type.animated": "动画",
- "value_source.type.animated.desc": "循环波形变化",
- "value_source.type.audio": "音频",
- "value_source.type.audio.desc": "响应声音输入",
- "value_source.type.adaptive_time": "自适应(时间)",
- "value_source.type.adaptive_time.desc": "按时间自动调节",
- "value_source.type.adaptive_scene": "自适应(场景)",
- "value_source.type.adaptive_scene.desc": "按场景内容调节",
- "value_source.type.daylight": "日光周期",
- "value_source.type.daylight.desc": "数值跟随昼夜周期",
- "value_source.daylight.speed": "速度:",
- "value_source.daylight.speed.hint": "周期速度倍率。1.0 = 完整日夜周期约4分钟。",
- "value_source.daylight.use_real_time": "使用实时:",
- "value_source.daylight.use_real_time.hint": "启用后,数值跟随实际时间。速度设置将被忽略。",
- "value_source.normalize": "归一化到 0–1:",
- "value_source.normalize.hint": "开启:使用最小/最大值将原始值缩放到 0–1。关闭:直接将数值钳制到 0–1(适用于本身就输出 0–1 比例的来源)。原始值始终可在模板(raw[name])和自动化中使用。",
- "value_source.daylight.enable_real_time": "跟随系统时钟",
- "value_source.daylight.latitude": "纬度:",
- "value_source.daylight.latitude.hint": "地理纬度(-90到90)。使日出/日落过渡更陡峭或更平缓。",
- "value_source.daylight.longitude": "经度:",
- "value_source.daylight.longitude.hint": "地理经度(-180到180)。偏移正午时刻,使日出/日落与挂钟时间对齐。",
- "value_source.daylight.real_time": "实时",
- "value_source.daylight.speed_label": "速度",
- "value_source.value": "值:",
- "value_source.value.hint": "固定输出值(0.0 = 关闭,1.0 = 最大亮度)",
- "value_source.waveform": "波形:",
- "value_source.waveform.hint": "亮度动画循环的形状",
- "value_source.waveform.sine": "正弦",
- "value_source.waveform.triangle": "三角",
- "value_source.waveform.square": "方波",
- "value_source.waveform.sawtooth": "锯齿",
- "value_source.speed": "速度(周期/分):",
- "value_source.speed.hint": "每分钟周期数 — 波形重复的速度(1 = 非常慢,120 = 非常快)",
- "value_source.min_value": "最小值:",
- "value_source.min_value.hint": "波形周期的最小输出",
- "value_source.max_value": "最大值:",
- "value_source.max_value.hint": "波形周期的最大输出",
- "value_source.audio_source": "音频源:",
- "value_source.audio_source.hint": "要读取音频电平的音频源",
- "value_source.mode": "模式:",
- "value_source.mode.hint": "RMS 测量平均音量。峰值跟踪最响的时刻。节拍在节奏上触发。",
- "value_source.mode.rms": "RMS(音量)",
- "value_source.mode.peak": "峰值",
- "value_source.mode.beat": "节拍",
- "value_source.mode.rms.desc": "平均音量水平",
- "value_source.mode.peak.desc": "最响时刻追踪",
- "value_source.mode.beat.desc": "节奏脉冲检测",
- "value_source.auto_gain": "自动增益:",
- "value_source.auto_gain.hint": "自动归一化音频电平,使输出使用完整范围,无论输入音量大小",
- "value_source.auto_gain.enable": "启用自动增益",
- "value_source.sensitivity": "灵敏度:",
- "value_source.sensitivity.hint": "音频信号的增益倍数(越高反应越灵敏)",
- "value_source.scene_sensitivity.hint": "亮度信号的增益倍数(越高对亮度变化越敏感)",
- "value_source.smoothing": "平滑:",
- "value_source.smoothing.hint": "时间平滑(0 = 即时响应,1 = 非常平滑/缓慢)",
- "value_source.audio_min_value": "最小值:",
- "value_source.audio_min_value.hint": "音频静默时的输出(例如 0.3 = 30% 亮度下限)",
- "value_source.audio_max_value": "最大值:",
- "value_source.audio_max_value.hint": "最大音频电平时的输出",
- "value_source.schedule": "计划:",
- "value_source.schedule.hint": "定义至少 2 个时间点。亮度在各点之间线性插值,午夜循环。",
- "value_source.schedule.add": "+ 添加时间点",
- "value_source.schedule.points": "个时间点",
- "value_source.picture_source": "图片源:",
- "value_source.picture_source.hint": "将分析其帧以获取平均亮度的图片源。",
- "value_source.scene_behavior": "行为:",
- "value_source.scene_behavior.hint": "互补:暗场景 = 高亮度(适合环境背光)。匹配:亮场景 = 高亮度。",
- "value_source.scene_behavior.complement": "互补(暗 → 亮)",
- "value_source.scene_behavior.match": "匹配(亮 → 亮)",
- "value_source.adaptive_min_value": "最小值:",
- "value_source.adaptive_min_value.hint": "最小输出亮度",
- "value_source.adaptive_max_value": "最大值:",
- "value_source.adaptive_max_value.hint": "最大输出亮度",
- "value_source.error.schedule_min": "计划至少需要 2 个时间点",
- "value_source.description": "描述(可选):",
- "value_source.description.placeholder": "描述此值源...",
- "value_source.description.hint": "关于此值源的可选说明",
- "value_source.created": "值源已创建",
- "value_source.updated": "值源已更新",
- "value_source.deleted": "值源已删除",
- "value_source.delete.confirm": "确定要删除此值源吗?",
- "value_source.error.name_required": "请输入名称",
- "value_source.test": "测试",
- "value_source.test.title": "测试值源",
- "value_source.test.connecting": "连接中...",
- "value_source.test.error": "连接失败",
- "value_source.test.current": "当前",
- "value_source.test.min": "最小",
- "value_source.test.max": "最大",
- "test.frames": "帧数",
- "test.fps": "帧率",
- "test.avg_capture": "平均",
- "targets.brightness": "亮度:",
- "targets.brightness.hint": "输出亮度乘数(0–1)。可绑定到值源进行动态控制。",
- "targets.brightness_vs": "亮度源:",
- "targets.brightness_vs.hint": "可选的值源,每帧动态控制亮度(覆盖设备亮度)",
- "targets.brightness_vs.none": "无(设备亮度)",
- "targets.min_brightness_threshold": "最低亮度阈值:",
- "targets.min_brightness_threshold.hint": "当有效输出亮度(像素亮度 × 设备/源亮度)低于此值时,LED完全关闭(0 = 禁用)",
- "targets.adaptive_fps": "自适应FPS:",
- "targets.adaptive_fps.hint": "当设备无响应时自动降低发送速率,稳定后逐步恢复。推荐用于信号较弱的WiFi设备。",
- "targets.protocol": "协议:",
- "targets.protocol.hint": "DDP通过快速UDP发送像素(推荐)。HTTP使用JSON API——较慢但可靠,限制约500个LED。",
- "targets.power_limit": "最大电流 (ABL):",
- "targets.power_limit.hint": "将灯带的估算电流限制在电源预算内,以防止明亮/白色场景下的电压骤降(颜色偏移、闪烁、重启)。请设为电源的额定电流并留有余量。0 = 不限制。",
- "targets.power_limit.ma_suffix": "mA(0 = 不限制)",
- "targets.power_limit.per_led": "每颗 LED 电流(全白):",
- "targets.protocol.ddp": "DDP (UDP)",
- "targets.protocol.ddp.desc": "快速UDP数据包 - 推荐",
- "targets.protocol.udp": "WLED UDP(实时)",
- "targets.protocol.udp.desc": "WLED 原生实时 — 正确的 RGBW 白色,断流时自动恢复",
- "targets.protocol.http": "HTTP",
- "targets.protocol.http.desc": "JSON API - 较慢,≤500 LED",
- "targets.protocol.serial": "串口",
- "search.open": "搜索 (Ctrl+K)",
- "search.placeholder": "搜索实体... (Ctrl+K)",
- "search.loading": "加载中...",
- "search.no_results": "未找到结果",
- "search.group.devices": "设备",
- "search.group.targets": "LED 目标",
- "search.group.kc_targets": "关键颜色目标",
- "search.group.css": "色带源",
- "search.group.automations": "自动化",
- "search.group.streams": "图片流",
- "search.group.capture_templates": "采集模板",
- "search.group.pp_templates": "后处理模板",
- "search.group.pattern_templates": "图案模板",
- "search.group.audio": "音频源",
- "search.group.value": "值源",
- "search.group.scenes": "场景预设",
- "search.group.cspt": "色带处理模板",
- "search.group.sync_clocks": "同步时钟",
- "search.group.actions": "操作",
- "search.action.start": "启动",
- "search.action.stop": "停止",
- "search.action.activate": "激活",
- "search.action.enable": "启用",
- "search.action.disable": "禁用",
- "settings.backup.label": "备份配置",
- "settings.backup.hint": "将所有配置(设备、目标、流、模板、自动化)下载为单个 JSON 文件。",
- "settings.backup.button": "下载",
- "settings.backup.success": "备份下载成功",
- "settings.backup.error": "备份下载失败",
- "settings.restore.label": "恢复配置",
- "settings.restore.hint": "上传之前下载的备份文件以替换所有配置。服务器将自动重启。",
- "settings.restore.button": "恢复",
- "settings.restore.confirm": "这将替换所有配置并重启服务器。确定继续吗?",
- "settings.restore.success": "配置已恢复",
- "settings.restore.error": "恢复失败",
- "settings.restore.restarting": "服务器正在重启...",
- "settings.restore.restart_timeout": "服务器未响应。请手动刷新页面。",
- "settings.restart_server": "重启服务器",
- "settings.restart_confirm": "重启服务器?活跃的目标将被停止。",
- "settings.restarting": "正在重启服务器...",
- "settings.button.close": "关闭",
- "settings.log_level.label": "日志级别",
- "settings.log_level.hint": "实时更改服务器日志详细程度。DEBUG 显示最多细节;CRITICAL 仅显示致命错误。",
- "settings.log_level.save": "应用",
- "settings.log_level.saved": "日志级别已更改",
- "settings.log_level.save_error": "更改日志级别失败",
- "settings.log_level.desc.debug": "详细开发输出",
- "settings.log_level.desc.info": "正常运行消息",
- "settings.log_level.desc.warning": "潜在问题",
- "settings.log_level.desc.error": "仅显示错误",
- "settings.log_level.desc.critical": "仅显示致命错误",
- "settings.shutdown_action.label": "关机时执行",
- "settings.shutdown_action.hint": "服务器关闭时对 LED 目标的处理方式。「停止目标」执行正常的停止流程,启用自动恢复的设备会恢复先前状态。「无」会让灯保持显示最后一帧。",
- "settings.shutdown_action.saved": "已保存关机动作",
- "settings.shutdown_action.save_error": "保存关机动作失败",
- "settings.shutdown_action.opt.stop": "停止目标",
- "settings.shutdown_action.opt.stop_desc": "执行正常停止流程(按设备应用自动恢复)",
- "settings.shutdown_action.opt.nothing": "无",
- "settings.shutdown_action.opt.nothing_desc": "让灯保持最后一帧",
- "settings.daylight_timezone.label": "日光周期时区",
- "settings.daylight_timezone.hint": "所有“实时”日光周期读取挂钟时间所用的 IANA 时区。留空(默认)则使用服务器的系统时区。",
- "settings.daylight_timezone.saved": "日光周期时区已保存",
- "settings.daylight_timezone.save_error": "保存日光周期时区失败",
- "common.daylight_tz.system": "系统默认",
- "common.daylight_tz.system_desc": "服务器时钟 — 不覆盖",
- "common.daylight_tz.detected": "浏览器检测",
- "common.daylight_tz.detected_label": "自动检测",
- "common.daylight_tz.search": "搜索时区、城市、地区…",
- "common.daylight_tz.region.utc": "世界标准",
- "common.daylight_tz.region.europe": "欧洲",
- "common.daylight_tz.region.africa": "非洲",
- "common.daylight_tz.region.me": "中东",
- "common.daylight_tz.region.asia": "亚洲",
- "common.daylight_tz.region.pacific": "太平洋",
- "common.daylight_tz.region.americas": "美洲",
- "settings.auto_backup.label": "自动备份",
- "settings.auto_backup.hint": "自动定期创建所有配置的备份。当达到最大数量时,旧备份会被自动清理。",
- "settings.auto_backup.enable": "启用自动备份",
- "settings.auto_backup.interval_label": "间隔",
- "settings.auto_backup.max_label": "最大备份数",
- "settings.auto_backup.save": "保存设置",
- "settings.auto_backup.saved": "自动备份设置已保存",
- "settings.auto_backup.save_error": "保存自动备份设置失败",
- "settings.auto_backup.backup_now": "立即备份",
- "settings.auto_backup.backup_created": "备份已创建",
- "settings.auto_backup.backup_error": "备份失败",
- "settings.auto_backup.last_backup": "上次备份",
- "settings.auto_backup.never": "从未",
- "settings.saved_backups.label": "已保存的备份",
- "settings.saved_backups.hint": "存储在服务器上的自动备份文件。下载到本地保存,或删除以释放空间。",
- "settings.saved_backups.empty": "没有已保存的备份",
- "settings.saved_backups.restore": "恢复",
- "settings.saved_backups.download": "下载",
- "settings.saved_backups.delete": "删除",
- "settings.saved_backups.delete_confirm": "删除此备份文件?",
- "settings.saved_backups.delete_error": "删除备份失败",
- "settings.saved_backups.type.auto": "自动",
- "settings.saved_backups.type.manual": "手动",
- "settings.mqtt.label": "MQTT",
- "settings.mqtt.hint": "配置 MQTT 代理连接,用于自动化条件和触发器。",
- "settings.mqtt.enabled": "启用 MQTT",
- "settings.mqtt.host_label": "代理主机",
- "settings.mqtt.port_label": "端口",
- "settings.mqtt.username_label": "用户名",
- "settings.mqtt.password_label": "密码",
- "settings.mqtt.password_set_hint": "已设置密码 — 留空以保留",
- "settings.mqtt.client_id_label": "客户端 ID",
- "settings.mqtt.base_topic_label": "基础主题",
- "settings.mqtt.save": "保存 MQTT 设置",
- "settings.mqtt.saved": "MQTT 设置已保存",
- "settings.mqtt.save_error": "保存 MQTT 设置失败",
- "settings.mqtt.error_host_required": "代理主机不能为空",
- "settings.logs.label": "服务器日志",
- "settings.logs.hint": "实时查看服务器日志。使用过滤器显示所需的日志级别。",
- "settings.logs.connect": "连接",
- "settings.logs.disconnect": "断开",
- "settings.logs.clear": "清除",
- "settings.logs.error": "日志查看器连接失败",
- "settings.logs.filter.all": "所有级别",
- "settings.logs.filter.info": "Info+",
- "settings.logs.filter.warning": "Warning+",
- "settings.logs.filter.error": "仅错误",
- "settings.logs.filter.all_desc": "显示所有日志消息",
- "settings.logs.filter.info_desc": "Info、警告和错误",
- "settings.logs.filter.warning_desc": "仅警告和错误",
- "settings.logs.filter.error_desc": "仅错误",
- "settings.logs.stat.lines": "行数",
- "settings.logs.stat.warn": "警告",
- "settings.logs.stat.err": "错误",
- "settings.logs.patch.idle": "待机",
- "settings.logs.patch.connecting": "连接中",
- "settings.logs.patch.live": "传输中",
- "settings.logs.patch.error": "离线",
- "settings.logs.empty.title": "等待日志",
- "settings.logs.empty.sub": "连接 WebSocket 流以开始实时跟踪。",
- "device.error.power_off_failed": "关闭设备失败",
- "device.error.remove_failed": "移除设备失败",
- "device.error.settings_load_failed": "加载设备设置失败",
- "device.error.brightness": "更新亮度失败",
- "device.error.required": "请填写所有字段",
- "device.error.update": "更新设备失败",
- "device.error.save": "保存设置失败",
- "device.error.clone_failed": "克隆设备失败",
- "device.error.load_failed": "加载设备失败",
- "device_discovery.error.fill_all_fields": "请填写所有字段",
- "device_discovery.added": "设备添加成功",
- "device_discovery.error.add_failed": "添加设备失败",
- "calibration.error.load_failed": "加载校准失败",
- "calibration.error.css_load_failed": "加载色带源失败",
- "calibration.error.test_toggle_failed": "切换测试边缘失败",
- "calibration.error.save_failed": "保存校准失败",
- "calibration.error.led_count_mismatch": "LED总数必须等于设备LED数量",
- "calibration.error.led_count_exceeded": "校准的LED超过了LED总数",
- "calibration.mode.simple": "简单",
- "calibration.mode.advanced": "高级",
- "calibration.switch_to_advanced": "切换到高级模式",
- "calibration.advanced.title": "高级校准",
- "calibration.advanced.switch_to_simple": "切换到简单模式",
- "calibration.advanced.lines_title": "线段",
- "calibration.advanced.canvas_hint": "拖动显示器重新排列。点击边缘选择线段。滚动缩放,拖动空白区域平移。",
- "calibration.advanced.reset_view": "重置视图",
- "calibration.advanced.line_properties": "线段属性",
- "calibration.advanced.picture_source": "来源:",
- "calibration.advanced.picture_source.hint": "此线段采样的图片来源(显示器)",
- "calibration.advanced.edge": "边缘:",
- "calibration.advanced.edge.hint": "从屏幕哪条边缘采样像素",
- "calibration.advanced.led_count": "LED数:",
- "calibration.advanced.led_count.hint": "映射到此线段的LED数量",
- "calibration.advanced.span_start": "起始位置:",
- "calibration.advanced.span_start.hint": "沿边缘开始采样的位置(0 = 起点,1 = 终点)。用于仅覆盖边缘的一部分。",
- "calibration.advanced.span_end": "结束位置:",
- "calibration.advanced.span_end.hint": "沿边缘结束采样的位置(0 = 起点,1 = 终点)。与起始位置一起定义活动区域。",
- "calibration.advanced.border_width": "深度(像素):",
- "calibration.advanced.border_width.hint": "从边缘向内采样多少像素。较大的值会捕获更多屏幕内部区域。",
- "calibration.advanced.reverse": "反转",
- "calibration.advanced.no_lines_warning": "请至少添加一条线段",
- "dashboard.error.automation_toggle_failed": "切换自动化失败",
- "dashboard.error.start_failed": "启动处理失败",
- "dashboard.error.stop_failed": "停止处理失败",
- "dashboard.error.stop_all": "停止所有目标失败",
- "target.error.editor_open_failed": "打开目标编辑器失败",
- "target.error.start_failed": "启动目标失败",
- "target.error.stop_failed": "停止目标失败",
- "target.error.clone_failed": "克隆目标失败",
- "target.error.delete_failed": "删除目标失败",
- "target.error.load_failed": "加载目标失败",
- "targets.stop_all.button": "全部停止",
- "targets.stop_all.none_running": "当前没有运行中的目标",
- "targets.stop_all.stopped": "已停止 {count} 个目标",
- "targets.stop_all.error": "停止目标失败",
- "audio_source.error.load": "加载音频源失败",
- "audio_template.error.clone_failed": "克隆音频模板失败",
- "value_source.error.load": "加载数值源失败",
- "color_strip.error.editor_open_failed": "打开色带编辑器失败",
- "color_strip.error.clone_failed": "克隆色带源失败",
- "color_strip.error.delete_failed": "删除色带源失败",
- "pattern.error.editor_open_failed": "打开图案模板编辑器失败",
- "pattern.error.clone_failed": "克隆图案模板失败",
- "pattern.error.delete_failed": "删除图案模板失败",
- "pattern.error.capture_bg_failed": "捕获背景失败",
- "pattern.error.save_failed": "保存图案模板失败",
- "stream.error.clone_picture_failed": "克隆图片源失败",
- "stream.error.clone_capture_failed": "克隆捕获模板失败",
- "stream.error.clone_pp_failed": "克隆后处理模板失败",
- "theme.switched.dark": "已切换到深色主题",
- "theme.switched.light": "已切换到浅色主题",
- "theme.switched.system": "已切换到系统主题",
- "accent.color.updated": "强调色已更新",
- "search.footer": "↑↓ 导航 · Enter 选择 · Esc 关闭",
- "sync_clock.group.title": "同步时钟",
- "sync_clock.add": "添加同步时钟",
- "sync_clock.edit": "编辑同步时钟",
- "sync_clock.name": "名称:",
- "sync_clock.name.placeholder": "主动画时钟",
- "sync_clock.name.hint": "此同步时钟的描述性名称",
- "sync_clock.speed": "速度:",
- "sync_clock.speed.hint": "所有关联源的动画速度倍率。1.0 = 正常,2.0 = 双倍,0.5 = 半速。",
- "sync_clock.description": "描述(可选):",
- "sync_clock.description.placeholder": "可选描述",
- "sync_clock.description.hint": "关于此时钟用途的可选备注",
- "sync_clock.status.running": "运行中",
- "sync_clock.status.paused": "已暂停",
- "sync_clock.action.pause": "暂停",
- "sync_clock.action.resume": "恢复",
- "sync_clock.action.reset": "重置",
- "sync_clock.error.name_required": "时钟名称为必填项",
- "sync_clock.error.load": "加载同步时钟失败",
- "sync_clock.created": "同步时钟已创建",
- "sync_clock.updated": "同步时钟已更新",
- "sync_clock.deleted": "同步时钟已删除",
- "sync_clock.paused": "时钟已暂停",
- "sync_clock.resumed": "时钟已恢复",
- "sync_clock.reset_done": "时钟已重置为零",
- "sync_clock.delete.confirm": "删除此同步时钟?关联的源将失去同步并以默认速度运行。",
- "sync_clock.elapsed": "已用时间",
- "weather_source.group.title": "天气源",
- "weather_source.add": "添加天气源",
- "weather_source.edit": "编辑天气源",
- "weather_source.name": "名称:",
- "weather_source.name.placeholder": "我的天气",
- "weather_source.name.hint": "天气数据源的描述性名称",
- "weather_source.provider": "提供商:",
- "weather_source.provider.hint": "天气数据提供商。Open-Meteo免费且无需API密钥。",
- "weather_source.provider.open_meteo.desc": "免费,无需API密钥",
- "weather_source.location": "位置:",
- "weather_source.location.hint": "您的地理坐标。使用自动检测按钮或手动输入。",
- "weather_source.latitude": "纬度:",
- "weather_source.longitude": "经度:",
- "weather_source.use_my_location": "使用我的位置",
- "weather_source.update_interval": "更新间隔:",
- "weather_source.update_interval.hint": "获取天气数据的频率。值越低,更新越及时。",
- "weather_source.description": "描述(可选):",
- "weather_source.description.placeholder": "可选描述",
- "weather_source.test": "测试",
- "weather_source.error.name_required": "天气源名称为必填项",
- "weather_source.error.load": "加载天气源失败",
- "weather_source.created": "天气源已创建",
- "weather_source.updated": "天气源已更新",
- "weather_source.deleted": "天气源已删除",
- "weather_source.delete.confirm": "删除此天气源?关联的色带源将失去天气数据。",
- "weather_source.geo.success": "位置已检测",
- "weather_source.geo.error": "地理定位失败",
- "weather_source.geo.not_supported": "您的浏览器不支持地理定位",
- "streams.group.weather": "天气",
- "section.empty.weather_sources": "暂无天气源。点击+添加。",
- "color_strip.clock": "同步时钟:",
- "color_strip.clock.hint": "关联同步时钟以在多个源之间同步动画。速度在时钟上控制。",
- "graph.title": "图表",
- "graph.fit_all": "显示所有节点",
- "graph.zoom_in": "放大",
- "graph.zoom_out": "缩小",
- "graph.search": "搜索节点",
- "graph.search_placeholder": "搜索实体...",
- "graph.legend": "图例",
- "graph.minimap": "小地图",
- "graph.relayout": "重新布局",
- "graph.empty": "暂无实体",
- "graph.empty.hint": "创建设备、源和目标后即可在此查看。",
- "graph.disconnect": "断开连接",
- "graph.connection_updated": "连接已更新",
- "graph.connection_failed": "更新连接失败",
- "graph.connection_removed": "连接已移除",
- "graph.disconnect_failed": "断开连接失败",
- "graph.relayout_confirm": "重置所有手动节点位置并重新布局图表?",
- "graph.fullscreen": "切换全屏",
- "graph.add_entity": "添加实体",
- "graph.color_picker": "节点颜色",
- "graph.filter": "筛选节点",
- "graph.filter_placeholder": "按名称筛选...",
- "graph.filter_clear": "清除筛选",
- "graph.filter_running": "运行中",
- "graph.filter_stopped": "已停止",
- "graph.filter_types": "类型",
- "graph.filter_group.capture": "捕获",
- "graph.filter_group.strip": "色带",
- "graph.filter_group.audio": "音频",
- "graph.filter_group.targets": "目标",
- "graph.filter_group.other": "其他",
- "graph.bulk_delete_confirm": "删除 {count} 个选中的实体?",
- "graph.nothing_to_undo": "没有可撤销的操作",
- "graph.nothing_to_redo": "没有可重做的操作",
- "graph.help_title": "键盘快捷键",
- "graph.help.search": "搜索",
- "graph.help.filter": "筛选",
- "graph.help.add": "添加实体",
- "graph.help.shortcuts": "快捷键",
- "graph.help.delete": "删除 / 断开",
- "graph.help.select_all": "全选",
- "graph.help.undo": "撤销",
- "graph.help.redo": "重做",
- "graph.help.fullscreen": "全屏",
- "graph.help.deselect": "取消选择",
- "graph.help.navigate": "节点导航",
- "graph.help.click": "单击",
- "graph.help.click_desc": "选择节点",
- "graph.help.dblclick": "双击",
- "graph.help.dblclick_desc": "缩放到节点",
- "graph.help.shift_click": "Shift+单击",
- "graph.help.shift_click_desc": "多选",
- "graph.help.shift_drag": "Shift+拖拽",
- "graph.help.shift_drag_desc": "框选",
- "graph.help.drag_node": "拖拽节点",
- "graph.help.drag_node_desc": "重新定位",
- "graph.help.drag_port": "拖拽端口",
- "graph.help.drag_port_desc": "连接实体",
- "graph.help.right_click": "右键边线",
- "graph.help.right_click_desc": "断开连接",
- "graph.tooltip.fps": "帧率",
- "graph.tooltip.errors": "错误",
- "graph.tooltip.uptime": "运行时间",
- "graph.undone": "已撤销",
- "graph.redone": "已重做",
- "graph.action.connect": "连接",
- "graph.action.disconnect": "断开连接",
- "graph.action.move": "移动节点",
- "graph.action.rewire": "重新连接槽位",
- "graph.choose_connection": "选择连接",
- "graph.rewire": "重新连接…",
- "graph.rewire_choose_source": "选择新的来源",
- "graph.issues": "问题",
- "graph.issues_none": "未发现问题",
- "graph.issue.broken_ref": "无效引用:{field}",
- "graph.issue.cycle": "属于依赖循环",
- "graph.replace_connection_confirm": "替换现有连接?",
- "graph.no_compatible_connection": "这些实体之间没有兼容的连接",
- "graph.create_and_connect": "创建并连接…",
- "graph.export": "导出图谱 (JSON)",
- "graph.export_done": "图谱已导出",
- "graph.export_failed": "导出图谱失败",
- "graph.duplicate": "复制所选",
- "graph.duplicate_none": "请选择一个或多个节点以复制",
- "graph.duplicate_none_eligible": "所选内容中没有可复制的项(仅值源和色带源)",
- "graph.duplicate_done": "已复制 {count} 个源",
- "graph.duplicate_done_warn": "已复制 {count} 个源 — 部分引用无法重新映射",
- "graph.duplicate_failed": "复制所选失败",
- "graph.delete_with_dependents_confirm": "此实体被 {count} 个其他实体引用:{names}。删除并断开这些连接?",
- "automation.enabled": "自动化已启用",
- "automation.disabled": "自动化已禁用",
- "scene_preset.activated": "预设已激活",
- "scene_preset.used_by": "被 %d 个自动化使用",
- "settings.api_keys.label": "API 密钥",
- "settings.api_keys.hint": "API 密钥在服务器配置文件 (config.yaml) 中定义。编辑文件并重启服务器以应用更改。",
- "settings.api_keys.empty": "未配置 API 密钥",
- "settings.api_keys.load_error": "加载 API 密钥失败",
- "settings.partial.label": "部分导出 / 导入",
- "settings.partial.hint": "导出或导入单个实体类型。导入会替换或合并现有数据并重启服务器。",
- "settings.partial.store.devices": "设备",
- "settings.partial.store.output_targets": "LED 目标",
- "settings.partial.store.color_strip_sources": "色带",
- "settings.partial.store.picture_sources": "图像源",
- "settings.partial.store.audio_sources": "音频源",
- "settings.partial.store.audio_templates": "音频模板",
- "settings.partial.store.capture_templates": "捕获模板",
- "settings.partial.store.postprocessing_templates": "后处理模板",
- "settings.partial.store.color_strip_processing_templates": "CSS 处理模板",
- "settings.partial.store.pattern_templates": "图案模板",
- "settings.partial.store.value_sources": "值源",
- "settings.partial.store.sync_clocks": "同步时钟",
- "settings.partial.store.automations": "自动化",
- "settings.partial.store.scene_presets": "场景预设",
- "settings.partial.export_button": "导出",
- "settings.partial.import_button": "从文件导入",
- "settings.partial.merge_label": "合并(添加/覆盖,保留现有)",
- "settings.partial.export_success": "导出成功",
- "settings.partial.export_error": "导出失败",
- "settings.partial.import_success": "导入成功",
- "settings.partial.import_error": "导入失败",
- "settings.partial.import_confirm_replace": "这将替换所有 {store} 数据并重启服务器。继续吗?",
- "settings.partial.import_confirm_merge": "这将合并 {store} 数据并重启服务器。继续吗?",
- "section.empty.devices": "暂无设备。点击 + 添加。",
- "section.empty.targets": "暂无 LED 目标。点击 + 添加。",
- "section.empty.kc_targets": "暂无键色目标。点击 + 添加。",
- "section.empty.pattern_templates": "暂无图案模板。点击 + 添加。",
- "section.empty.picture_sources": "暂无源。点击 + 添加。",
- "section.empty.capture_templates": "暂无捕获模板。点击 + 添加。",
- "section.empty.pp_templates": "暂无后处理模板。点击 + 添加。",
- "section.empty.audio_sources": "暂无音频源。点击 + 添加。",
- "section.empty.audio_templates": "暂无音频模板。点击 + 添加。",
- "section.empty.color_strips": "暂无色带。点击 + 添加。",
- "section.empty.value_sources": "暂无值源。点击 + 添加。",
- "section.empty.sync_clocks": "暂无同步时钟。点击 + 添加。",
- "section.empty.cspt": "暂无 CSS 处理模板。点击 + 添加。",
- "section.empty.automations": "暂无自动化。点击 + 添加。",
- "section.empty.scenes": "暂无场景预设。点击 + 添加。",
- "section.empty.playlists": "暂无播放列表。点击 + 添加。",
- "bulk.select": "选择",
- "bulk.cancel": "取消",
- "bulk.selected_count.one": "已选 {count} 项",
- "bulk.selected_count.other": "已选 {count} 项",
- "bulk.select_all": "全选",
- "bulk.deselect_all": "取消全选",
- "bulk.delete": "删除",
- "bulk.start": "启动",
- "bulk.stop": "停止",
- "bulk.enable": "启用",
- "bulk.disable": "禁用",
- "bulk.confirm_delete.one": "删除 {count} 项?",
- "bulk.confirm_delete.other": "删除 {count} 项?",
- "appearance.style.label": "样式预设",
- "appearance.style.hint": "选择一个视觉主题 — 字体和配色方案一起应用。",
- "appearance.preset.default": "默认",
- "appearance.preset.midnight": "午夜",
- "appearance.preset.ember": "余烬",
- "appearance.preset.arctic": "极地",
- "appearance.preset.terminal": "终端",
- "appearance.preset.neon": "霓虹",
- "appearance.preset.sakura": "樱花",
- "appearance.preset.ocean": "海洋",
- "appearance.preset.copper": "铜色",
- "appearance.preset.vapor": "蒸汽波",
- "appearance.preset.monolith": "黑白",
- "appearance.preset.applied": "样式已应用",
- "appearance.bg.label": "背景效果",
- "appearance.bg.hint": "在界面后面添加环境背景层。",
- "appearance.bg.none": "无",
- "appearance.bg.noise": "噪声场",
- "appearance.bg.aurora": "极光",
- "appearance.bg.plasma": "等离子",
- "appearance.bg.rain": "数字雨",
- "appearance.bg.stars": "星空",
- "appearance.bg.warp": "隧道",
- "appearance.bg.grid": "点阵",
- "appearance.bg.mesh": "渐变网格",
- "appearance.bg.scanlines": "扫描线",
- "appearance.bg.applied": "背景效果已应用",
- "settings.tab.notifications": "通知",
- "settings.tab.updates": "更新",
- "settings.tab.about": "关于",
- "settings.notifications.intro_label": "设备事件",
- "settings.notifications.intro_hint": "选择每类事件的通知方式。「内置」在页面底部弹出提示,「系统」显示系统通知(需要浏览器授权),「两者」同时显示,「关闭」则不通知。",
- "settings.notifications.row.online": "设备重新上线",
- "settings.notifications.row.offline": "设备离线",
- "settings.notifications.row.discovered": "发现新设备",
- "settings.notifications.row.lost": "已发现的设备消失",
- "settings.notifications.background.label": "后台发现",
- "settings.notifications.background.hint": "持续扫描局域网(mDNS)和串口以发现新的 LED 设备。关闭后将不再产生「发现/消失」事件。重启服务器后生效。",
- "settings.notifications.background.toggle": "启用后台发现",
- "settings.notifications.permission.label": "系统通知权限",
- "settings.notifications.permission.grant": "授权",
- "settings.notifications.permission.granted": "系统通知已启用",
- "settings.notifications.permission.denied": "系统通知被拒绝 — 请在浏览器设置中修改",
- "settings.notifications.permission.state.granted": "已授权 — 系统通知将会显示",
- "settings.notifications.permission.state.denied": "已拒绝 — 请在浏览器设置中修改",
- "settings.notifications.permission.state.default": "尚未请求授权",
- "settings.notifications.permission.hint": "浏览器为每个站点单独管理系统通知权限。一旦被拒绝,LedGrab 将无法再次请求 — 必须在浏览器中重置。点击地址栏中的站点图标(锁形)→ 站点设置 → 通知 → 允许,然后刷新页面。",
- "settings.notifications.test_button": "发送测试通知",
- "settings.notifications.saved": "通知偏好已保存",
- "settings.notifications.save_error": "保存通知偏好失败",
- "settings.notifications.channel.none.label": "关闭",
- "settings.notifications.channel.none.desc": "屏蔽此事件",
- "settings.notifications.channel.snack.label": "内置",
- "settings.notifications.channel.snack.desc": "页面底部的弹出提示",
- "settings.notifications.channel.os.label": "系统",
- "settings.notifications.channel.os.desc": "系统通知(浏览器在后台时也能收到)",
- "settings.notifications.channel.both.label": "两者",
- "settings.notifications.channel.both.desc": "弹出提示与系统通知同时显示",
- "settings.notifications.permission.pill.granted": "已授权",
- "settings.notifications.permission.pill.denied": "已阻止",
- "settings.rail.group.workspace": "工作区",
- "settings.rail.group.system": "系统",
- "settings.save_bar.unsaved": "字段未保存的更改:",
- "settings.save_bar.revert": "还原",
- "settings.save_bar.save": "保存",
- "settings.section.api_keys": "身份与 API",
- "settings.section.server": "服务器",
- "settings.section.lifecycle": "生命周期",
- "settings.section.destructive": "危险操作",
- "settings.section.manual": "手动",
- "settings.section.notif_channels": "通道",
- "settings.section.notif_discovery": "发现",
- "settings.section.notif_permission": "系统权限",
- "settings.api_keys.read_only": "只读",
- "settings.api_keys.meta.one": "个密钥",
- "settings.api_keys.meta.many": "个密钥",
- "settings.logs.sub": "服务器日志的实时流,可按级别过滤。在全屏覆盖层中打开。",
- "settings.restart.sub": "重启 LedGrab 进程。捕获和已连接设备将暂停约 3 秒。",
- "settings.restart.button": "重启",
- "settings.notif_matrix.col.event": "事件",
- "settings.notif_matrix.event_count": "4 个事件",
- "settings.auto_backup.pill.running": "运行中",
- "update.pill.available": "可用更新",
- "update.pill.error": "错误",
- "update.pill.updated": "已是最新",
- "notifications.unknown_device": "未知设备",
- "notifications.device_online.title": "设备已上线",
- "notifications.device_online.body": "{device} 已重新上线",
- "notifications.device_offline.title": "设备离线",
- "notifications.device_offline.body": "{device} 没有响应",
- "notifications.device_discovered.title": "发现新设备",
- "notifications.device_discovered.body": "{device} 出现在网络中",
- "notifications.device_lost.title": "设备消失",
- "notifications.device_lost.body": "{device} 已消失",
- "notifications.bulk.title": "多个设备状态变化",
- "notifications.bulk.body": "同时发生 {count} 个设备事件",
- "notifications.test.title": "LedGrab 测试通知",
- "notifications.test.body": "通知功能已正常工作。",
- "update.status_label": "更新状态",
- "update.current_version": "当前版本:",
- "update.badge_tooltip": "有新版本可用 — 点击查看详情",
- "update.available": "版本 {version} 可用",
- "update.up_to_date": "已是最新版本",
- "update.prerelease": "预发布",
- "update.view_release": "查看发布",
- "update.dismiss": "忽略",
- "update.check_now": "检查更新",
- "update.check_error": "检查更新失败",
- "update.last_check": "上次检查",
- "update.never": "从未",
- "update.release_notes": "发布说明",
- "update.view_release_notes": "查看发布说明",
- "update.release_notes_hint": "当前可用版本的更新内容 — 应用前请先查看变更日志。",
- "update.release_notes_open": "打开",
- "update.assets.title": "下载",
- "update.assets.desc.windows_installer": "Windows 安装程序 — 开始菜单快捷方式、可选自启动、卸载器",
- "update.assets.desc.windows_portable": "Windows 便携版 — 解压后运行 LedGrab.bat",
- "update.assets.desc.windows_msi": "Windows MSI 安装程序",
- "update.assets.desc.windows_exe": "Windows 可执行文件",
- "update.assets.desc.linux_tarball": "Linux 归档 — 解压后运行 ./run.sh",
- "update.assets.desc.linux_appimage": "Linux 便携版 — 单文件可执行",
- "update.assets.desc.linux_deb": "Debian / Ubuntu 软件包",
- "update.assets.desc.linux_rpm": "Fedora / RHEL 软件包",
- "update.assets.desc.linux_sandbox": "Linux 沙盒软件包",
- "update.assets.desc.macos_dmg": "macOS 磁盘镜像 — 拖入「应用程序」",
- "update.assets.desc.macos_installer": "macOS 安装包",
- "update.assets.desc.android": "Android — 在 Android 7.0+ 上侧载",
- "update.assets.desc.android_bundle": "Android App Bundle(Play Store)",
- "update.assets.desc.ios": "iOS 应用",
- "update.assets.desc.zip_archive": "ZIP 归档",
- "update.assets.desc.tarball": "Tar 归档",
- "update.assets.desc.archive": "压缩归档",
- "update.auto_check_label": "自动检查设置",
- "update.auto_check_hint": "在后台定期检查新版本。",
- "update.enable": "启用自动检查",
- "update.interval_label": "检查间隔",
- "update.channel_label": "频道",
- "update.channel.stable": "稳定版",
- "update.channel.stable_desc": "仅稳定版本",
- "update.channel.prerelease": "预发布",
- "update.channel.prerelease_desc": "包括 alpha、beta 和 RC 版本",
- "update.save_settings": "保存设置",
- "update.settings_saved": "更新设置已保存",
- "update.settings_save_error": "保存更新设置失败",
- "update.apply_now": "立即更新",
- "update.apply_confirm": "下载并安装版本 {version}?服务器将自动重启。",
- "update.apply_error": "更新失败",
- "update.applying": "正在应用更新…",
- "update.downloading": "正在下载…",
- "update.install_type_label": "安装类型:",
- "update.install_type.installer": "Windows 安装程序",
- "update.install_type.portable": "便携版",
- "update.install_type.docker": "Docker",
- "update.install_type.dev": "开发环境",
- "color_strip.notification.search_apps": "搜索通知应用…",
- "asset.group.title": "资源",
- "asset.upload": "上传资源",
- "asset.edit": "编辑资源",
- "asset.name": "名称:",
- "asset.name.hint": "资源的显示名称。",
- "asset.description": "描述:",
- "asset.description.hint": "资源的可选描述。",
- "asset.file": "文件:",
- "asset.file.hint": "选择要上传的文件(声音、图片、视频或其他)。",
- "asset.drop_or_browse": "拖放文件到此处或点击浏览",
- "asset.uploaded": "资源已上传",
- "asset.updated": "资源已更新",
- "asset.deleted": "资源已删除",
- "asset.confirm_delete": "删除此资源?",
- "asset.error.name_required": "名称为必填项",
- "asset.error.no_file": "请选择要上传的文件",
- "asset.error.delete_failed": "删除资源失败",
- "asset.error.play_failed": "播放声音失败",
- "asset.error.download_failed": "下载资源失败",
- "asset.play": "播放",
- "asset.download": "下载",
- "asset.prebuilt": "内置",
- "asset.prebuilt_restored": "已恢复 {count} 个内置资源",
- "asset.prebuilt_none_to_restore": "所有内置资源均已可用",
- "asset.restore_prebuilt": "恢复内置声音",
- "asset.type.sound": "声音",
- "asset.type.image": "图片",
- "asset.type.video": "视频",
- "asset.type.other": "其他",
- "streams.group.assets": "资源",
- "section.empty.assets": "暂无资源。点击 + 上传一个。",
- "donation.message": "LedGrab 是免费开源软件。如果它对您有帮助,请考虑支持开发。",
- "donation.support": "支持项目",
- "donation.view_source": "查看源代码",
- "donation.later": "稍后提醒",
- "donation.dismiss": "不再显示",
- "donation.about_title": "关于 LedGrab",
- "donation.about_opensource": "LedGrab 是开源软件,可免费使用和修改。",
- "donation.about_donate": "支持开发",
- "donation.about_license": "MIT 许可证",
- "donation.about_author": "作者:",
- "streams.group.game": "游戏集成",
- "tree.group.game": "游戏",
- "game_integration.section_title": "游戏集成",
- "section.empty.game_integrations": "暂无游戏集成。点击 + 创建。",
- "game_integration.add": "添加游戏集成",
- "game_integration.edit": "编辑游戏集成",
- "game_integration.created": "游戏集成已创建",
- "game_integration.updated": "游戏集成已更新",
- "game_integration.deleted": "游戏集成已删除",
- "game_integration.confirm_delete": "删除此游戏集成?",
- "game_integration.error.name_required": "名称不能为空",
- "game_integration.error.save_failed": "保存游戏集成失败",
- "game_integration.error.delete_failed": "删除游戏集成失败",
- "game_integration.error.save_first": "请先保存集成以测试连接",
- "game_integration.name": "名称:",
- "game_integration.name.hint": "为此游戏集成提供一个描述性名称",
- "game_integration.description": "描述:",
- "game_integration.description.hint": "可选描述此集成的用途",
- "game_integration.enabled": "启用",
- "game_integration.adapter_type": "游戏/适配器:",
- "game_integration.adapter_type.hint": "选择此集成的游戏或适配器类型",
- "game_integration.adapter_config": "适配器配置",
- "game_integration.no_config": "此适配器无需配置。",
- "game_integration.setup_instructions": "设置说明",
- "game_integration.setup_instructions.hint": "按照以下步骤配置您的游戏向此集成发送数据",
- "game_integration.event_mappings": "事件映射",
- "game_integration.event_mappings.hint": "将游戏事件映射到 LED 效果。每种事件类型可触发不同的视觉效果。",
- "game_integration.mapping.add": "+ 添加映射",
- "game_integration.mapping.event_type": "事件",
- "game_integration.mapping.effect_type": "效果",
- "game_integration.mapping.color": "颜色",
- "game_integration.mapping.duration": "持续时间 (毫秒)",
- "game_integration.mapping.intensity": "强度",
- "game_integration.mapping.priority": "优先级",
- "game_integration.mapping.select_preset": "加载预设...",
- "game_integration.preset.select": "加载预设...",
- "game_integration.preset.fps_combat": "FPS 战斗",
- "game_integration.preset.moba_health": "MOBA 生命值",
- "game_integration.adapter": "适配器",
- "game_integration.status": "状态",
- "game_integration.status.active": "活跃",
- "game_integration.status.inactive": "未激活",
- "game_integration.mappings": "映射",
- "game_integration.events.title": "实时事件",
- "game_integration.events.waiting": "等待事件...",
- "game_integration.events.monitor": "事件监控",
- "game_integration.test.button": "测试连接",
- "game_integration.test.waiting": "等待游戏事件...",
- "game_integration.test.success": "连接成功!已收到事件。",
- "game_integration.test.error": "连接错误",
- "game_integration.test.timeout": "在超时期间内未收到事件。",
- "game_integration.auto_setup": "自动配置",
- "game_integration.auto_setup.success": "配置文件写入成功",
- "game_integration.auto_setup.failed": "自动配置失败",
- "game_integration.auto_setup.not_supported": "此适配器不支持自动配置",
- "game_integration.auto_setup.game_not_found": "未找到游戏安装",
- "game_integration.auto_setup.token_generated": "授权令牌已自动生成",
- "game_integration.auto_setup.save_first": "请先保存集成,然后再运行自动配置",
- "color_strip.type.game_event": "游戏事件",
- "color_strip.type.game_event.desc": "由游戏事件触发的LED效果",
- "color_strip.game_event.integration": "游戏集成:",
- "color_strip.game_event.integration.hint": "选择为此源提供事件的游戏集成。",
- "color_strip.game_event.idle_color": "空闲颜色:",
- "color_strip.game_event.idle_color.hint": "没有活动游戏事件时的LED颜色。",
- "color_strip.game_event.event_mappings": "事件映射:",
- "color_strip.game_event.event_mappings.hint": "为此源覆盖或添加事件到效果的映射。这些补充集成级别的映射。",
- "color_strip.game_event.error.no_integration": "请选择游戏集成。",
- "color_strip.type.math_wave": "数学波",
- "color_strip.type.math_wave.desc": "使用渐变色映射的数学波形生成器",
- "color_strip.math_wave.gradient": "颜色渐变:",
- "color_strip.math_wave.gradient.hint": "用于着色波形输出的渐变。波形值映射到此渐变的位置。",
- "color_strip.math_wave.speed": "速度:",
- "color_strip.math_wave.speed.hint": "动画速度倍数。较高的值使波移动更快。",
- "color_strip.math_wave.waves": "波形层:",
- "color_strip.math_wave.waves.hint": "添加多个组合在一起的波形层。每个波形有自己的波形、频率、振幅、相位和偏移。",
- "color_strip.math_wave.add_wave": "+ 添加波形",
- "color_strip.math_wave.waveform": "波形",
- "color_strip.math_wave.waveform.sine": "正弦波",
- "color_strip.math_wave.waveform.triangle": "三角波",
- "color_strip.math_wave.waveform.sawtooth": "锯齿波",
- "color_strip.math_wave.waveform.square": "方波",
- "color_strip.math_wave.frequency": "频率",
- "color_strip.math_wave.amplitude": "振幅",
- "color_strip.math_wave.phase": "相位",
- "color_strip.math_wave.offset": "偏移",
- "color_strip.math_wave.error.no_waves": "请至少添加一个波形层。",
- "value_source.type.game_event": "游戏事件",
- "value_source.type.game_event.desc": "游戏指标(生命值、弹药、法力)作为0-1值",
- "value_source.game_event.integration": "游戏集成:",
- "value_source.game_event.integration.hint": "选择为此值源提供事件的游戏集成。",
- "value_source.game_event.event_type": "事件类型:",
- "value_source.game_event.event_type.hint": "要跟踪的持续游戏事件(生命值、法力、弹药等)。",
- "value_source.game_event.min_game_value": "最小游戏值:",
- "value_source.game_event.min_game_value.hint": "映射到输出0.0的原始游戏值。",
- "value_source.game_event.max_game_value": "最大游戏值:",
- "value_source.game_event.max_game_value.hint": "映射到输出1.0的原始游戏值。",
- "value_source.game_event.smoothing": "平滑:",
- "value_source.game_event.smoothing.hint": "EMA平滑系数。0 = 即时,越高越平滑。",
- "value_source.game_event.default_value": "默认值:",
- "value_source.game_event.default_value.hint": "在超时时间内未收到事件时的输出值。",
- "value_source.game_event.timeout": "超时(秒):",
- "value_source.game_event.timeout.hint": "恢复到默认值前的静默秒数。",
- "audio_processing.title": "音频处理模板",
- "audio_processing.add": "添加音频处理模板",
- "audio_processing.edit": "编辑音频处理模板",
- "audio_processing.name": "模板名称:",
- "audio_processing.name.hint": "此音频处理模板的描述性名称",
- "audio_processing.name_placeholder": "我的音频处理模板",
- "audio_processing.description_label": "描述(可选):",
- "audio_processing.description.hint": "描述此模板的用途",
- "audio_processing.description_placeholder": "描述此模板...",
- "audio_processing.created": "音频处理模板已创建",
- "audio_processing.updated": "音频处理模板已更新",
- "audio_processing.deleted": "音频处理模板已删除",
- "audio_processing.delete.confirm": "确定要删除此音频处理模板吗?",
- "audio_processing.error.required": "请填写所有必填字段",
- "audio_processing.error.load": "加载音频处理模板时出错",
- "audio_processing.error.delete": "删除音频处理模板时出错",
- "audio_processing.error.clone_failed": "克隆音频处理模板失败",
- "audio_processing.error.save_failed": "保存音频处理模板失败",
- "audio_processing.filter_count": "过滤器数量",
- "audio_processing.filters_label": "个过滤器",
- "streams.group.audio_processing": "音频处理",
- "section.empty.audio_processing_templates": "暂无音频处理模板。点击 + 创建一个。",
- "audio_source.group.capture": "音频捕获",
- "audio_source.group.processed": "已处理的源",
- "pairing.title": "配对设备",
- "pairing.instructions.default": "请按住设备上的配对按钮,然后点击「开始」。设备通常会打开 30 秒的配对窗口——请准备好快速操作。",
- "pairing.start": "开始配对",
- "pairing.pairing": "配对中…",
- "pairing.cancel": "取消",
- "pairing.retry": "重试",
- "pairing.close": "关闭",
- "pairing.success": "配对成功",
- "pairing.not_ready": "设备未响应。请按下设备上的配对按钮后重试。",
- "pairing.failed": "配对失败:{detail}",
- "pairing.failed_prefix": "配对失败:",
- "streams.group.http": "HTTP",
- "http_endpoint.group.title": "HTTP 端点",
- "http_endpoint.add": "添加 HTTP 端点",
- "http_endpoint.edit": "编辑 HTTP 端点",
- "http_endpoint.section.request": "请求",
- "http_endpoint.section.headers": "请求头",
- "http_endpoint.name": "名称:",
- "http_endpoint.name.placeholder": "Plex 正在播放",
- "http_endpoint.name.hint": "此端点的描述性名称",
- "http_endpoint.url": "URL:",
- "http_endpoint.url.hint": "要轮询的完整 http(s) URL,允许使用本地地址。",
- "http_endpoint.method": "方法:",
- "http_endpoint.method.get.desc": "获取响应体。",
- "http_endpoint.method.head.desc": "仅返回状态码,不返回响应体。适合健康检查。",
- "http_endpoint.auth_token": "认证令牌(可选):",
- "http_endpoint.auth_token.hint": "作为 'Authorization: Bearer