Add EntitySelect/IconSelect UI improvements across modals
- Portal IconSelect popups to document.body with position:fixed to prevent clipping by modal overflow-y:auto - Replace custom scene selectors in automation editor with EntitySelect command-palette pickers (main scene + fallback scene) - Add IconSelect grid for automation deactivation mode (none/revert/fallback) - Add IconSelect grid for automation condition type and match type - Replace mapped zone source dropdowns with EntitySelect pickers - Replace scene target selector with EntityPalette.pick() pattern - Remove effect palette preview bar from CSS editor - Remove sensitivity badge from audio color strip source cards - Clean up unused scene-selector CSS and scene-target-add-row CSS - Add locale keys for all new UI elements across en/ru/zh Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -624,10 +624,13 @@
|
||||
"automations.conditions.add": "Add Condition",
|
||||
"automations.conditions.empty": "No conditions — automation is always active when enabled",
|
||||
"automations.condition.always": "Always",
|
||||
"automations.condition.always.desc": "Always active",
|
||||
"automations.condition.always.hint": "Automation activates immediately when enabled and stays active.",
|
||||
"automations.condition.startup": "Startup",
|
||||
"automations.condition.startup.desc": "On server start",
|
||||
"automations.condition.startup.hint": "Activates when the server starts and stays active while enabled.",
|
||||
"automations.condition.application": "Application",
|
||||
"automations.condition.application.desc": "App running/focused",
|
||||
"automations.condition.application.apps": "Applications:",
|
||||
"automations.condition.application.apps.hint": "Process names, one per line (e.g. firefox.exe)",
|
||||
"automations.condition.application.browse": "Browse",
|
||||
@@ -636,23 +639,31 @@
|
||||
"automations.condition.application.match_type": "Match Type:",
|
||||
"automations.condition.application.match_type.hint": "How to detect the application",
|
||||
"automations.condition.application.match_type.running": "Running",
|
||||
"automations.condition.application.match_type.topmost": "Topmost (foreground)",
|
||||
"automations.condition.application.match_type.topmost_fullscreen": "Topmost + Fullscreen",
|
||||
"automations.condition.application.match_type.running.desc": "Process is active",
|
||||
"automations.condition.application.match_type.topmost": "Topmost",
|
||||
"automations.condition.application.match_type.topmost.desc": "Foreground window",
|
||||
"automations.condition.application.match_type.topmost_fullscreen": "Topmost + FS",
|
||||
"automations.condition.application.match_type.topmost_fullscreen.desc": "Foreground + fullscreen",
|
||||
"automations.condition.application.match_type.fullscreen": "Fullscreen",
|
||||
"automations.condition.application.match_type.fullscreen.desc": "Any fullscreen app",
|
||||
"automations.condition.time_of_day": "Time of Day",
|
||||
"automations.condition.time_of_day.desc": "Time range",
|
||||
"automations.condition.time_of_day.start_time": "Start Time:",
|
||||
"automations.condition.time_of_day.end_time": "End Time:",
|
||||
"automations.condition.time_of_day.overnight_hint": "For overnight ranges (e.g. 22:00–06:00), set start time after end time.",
|
||||
"automations.condition.system_idle": "System Idle",
|
||||
"automations.condition.system_idle.desc": "User idle/active",
|
||||
"automations.condition.system_idle.idle_minutes": "Idle Timeout (minutes):",
|
||||
"automations.condition.system_idle.mode": "Trigger Mode:",
|
||||
"automations.condition.system_idle.when_idle": "When idle",
|
||||
"automations.condition.system_idle.when_active": "When active",
|
||||
"automations.condition.display_state": "Display State",
|
||||
"automations.condition.display_state.desc": "Monitor on/off",
|
||||
"automations.condition.display_state.state": "Monitor State:",
|
||||
"automations.condition.display_state.on": "On",
|
||||
"automations.condition.display_state.off": "Off (sleeping)",
|
||||
"automations.condition.mqtt": "MQTT",
|
||||
"automations.condition.mqtt.desc": "MQTT message",
|
||||
"automations.condition.mqtt.topic": "Topic:",
|
||||
"automations.condition.mqtt.payload": "Payload:",
|
||||
"automations.condition.mqtt.match_mode": "Match Mode:",
|
||||
@@ -661,6 +672,7 @@
|
||||
"automations.condition.mqtt.match_mode.regex": "Regex",
|
||||
"automations.condition.mqtt.hint": "Activate when an MQTT topic receives a matching payload",
|
||||
"automations.condition.webhook": "Webhook",
|
||||
"automations.condition.webhook.desc": "HTTP callback",
|
||||
"automations.condition.webhook.hint": "Activate via an HTTP call from external services (Home Assistant, IFTTT, curl, etc.)",
|
||||
"automations.condition.webhook.url": "Webhook URL:",
|
||||
"automations.condition.webhook.copy": "Copy",
|
||||
@@ -673,9 +685,12 @@
|
||||
"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 — keep current state",
|
||||
"automations.deactivation_mode.revert": "Revert to previous state",
|
||||
"automations.deactivation_mode.fallback_scene": "Activate fallback scene",
|
||||
"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",
|
||||
@@ -702,6 +717,8 @@
|
||||
"scenes.description.hint": "Optional description of what this scene does",
|
||||
"scenes.targets": "Targets:",
|
||||
"scenes.targets.hint": "Select which targets to include in this scene snapshot",
|
||||
"scenes.targets.add": "Add Target",
|
||||
"scenes.targets.search_placeholder": "Search targets...",
|
||||
"scenes.capture": "Capture",
|
||||
"scenes.activate": "Activate scene",
|
||||
"scenes.recapture": "Recapture current state",
|
||||
@@ -747,6 +764,9 @@
|
||||
"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:",
|
||||
@@ -773,6 +793,8 @@
|
||||
"color_strip.type.hint": "Picture Source derives LED colors from a screen capture. Static Color fills all LEDs with a single constant color. Gradient distributes a color gradient across all LEDs. Color Cycle smoothly cycles through a user-defined list of colors. Composite stacks multiple sources as blended layers. Audio Reactive drives LEDs from real-time audio input. API Input receives raw LED colors from external clients via REST or WebSocket.",
|
||||
"color_strip.type.picture": "Picture Source",
|
||||
"color_strip.type.picture.desc": "Colors from screen capture",
|
||||
"color_strip.type.picture_advanced": "Multi-Monitor",
|
||||
"color_strip.type.picture_advanced.desc": "Line-based calibration across monitors",
|
||||
"color_strip.type.static": "Static Color",
|
||||
"color_strip.type.static.desc": "Single solid color fill",
|
||||
"color_strip.type.gradient": "Gradient",
|
||||
@@ -910,6 +932,7 @@
|
||||
"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.",
|
||||
@@ -1197,6 +1220,29 @@
|
||||
"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",
|
||||
|
||||
@@ -624,10 +624,13 @@
|
||||
"automations.conditions.add": "Добавить условие",
|
||||
"automations.conditions.empty": "Нет условий — автоматизация всегда активна когда включена",
|
||||
"automations.condition.always": "Всегда",
|
||||
"automations.condition.always.desc": "Всегда активно",
|
||||
"automations.condition.always.hint": "Автоматизация активируется сразу при включении и остаётся активной.",
|
||||
"automations.condition.startup": "Автозапуск",
|
||||
"automations.condition.startup.desc": "При запуске сервера",
|
||||
"automations.condition.startup.hint": "Активируется при запуске сервера и остаётся активной пока включена.",
|
||||
"automations.condition.application": "Приложение",
|
||||
"automations.condition.application.desc": "Приложение запущено",
|
||||
"automations.condition.application.apps": "Приложения:",
|
||||
"automations.condition.application.apps.hint": "Имена процессов, по одному на строку (например firefox.exe)",
|
||||
"automations.condition.application.browse": "Обзор",
|
||||
@@ -636,23 +639,31 @@
|
||||
"automations.condition.application.match_type": "Тип соответствия:",
|
||||
"automations.condition.application.match_type.hint": "Как определять наличие приложения",
|
||||
"automations.condition.application.match_type.running": "Запущено",
|
||||
"automations.condition.application.match_type.running.desc": "Процесс активен",
|
||||
"automations.condition.application.match_type.topmost": "На переднем плане",
|
||||
"automations.condition.application.match_type.topmost_fullscreen": "На переднем плане + Полный экран",
|
||||
"automations.condition.application.match_type.topmost.desc": "Окно в фокусе",
|
||||
"automations.condition.application.match_type.topmost_fullscreen": "Передний план + ПЭ",
|
||||
"automations.condition.application.match_type.topmost_fullscreen.desc": "В фокусе + полный экран",
|
||||
"automations.condition.application.match_type.fullscreen": "Полный экран",
|
||||
"automations.condition.application.match_type.fullscreen.desc": "Любое полноэкранное",
|
||||
"automations.condition.time_of_day": "Время суток",
|
||||
"automations.condition.time_of_day.desc": "Диапазон времени",
|
||||
"automations.condition.time_of_day.start_time": "Время начала:",
|
||||
"automations.condition.time_of_day.end_time": "Время окончания:",
|
||||
"automations.condition.time_of_day.overnight_hint": "Для ночных диапазонов (например 22:00–06:00) укажите время начала позже времени окончания.",
|
||||
"automations.condition.system_idle": "Бездействие системы",
|
||||
"automations.condition.system_idle.desc": "Бездействие/активность",
|
||||
"automations.condition.system_idle.idle_minutes": "Тайм-аут бездействия (минуты):",
|
||||
"automations.condition.system_idle.mode": "Режим срабатывания:",
|
||||
"automations.condition.system_idle.when_idle": "При бездействии",
|
||||
"automations.condition.system_idle.when_active": "При активности",
|
||||
"automations.condition.display_state": "Состояние дисплея",
|
||||
"automations.condition.display_state.desc": "Монитор вкл/выкл",
|
||||
"automations.condition.display_state.state": "Состояние монитора:",
|
||||
"automations.condition.display_state.on": "Включён",
|
||||
"automations.condition.display_state.off": "Выключен (спящий режим)",
|
||||
"automations.condition.mqtt": "MQTT",
|
||||
"automations.condition.mqtt.desc": "MQTT сообщение",
|
||||
"automations.condition.mqtt.topic": "Топик:",
|
||||
"automations.condition.mqtt.payload": "Значение:",
|
||||
"automations.condition.mqtt.match_mode": "Режим сравнения:",
|
||||
@@ -661,6 +672,7 @@
|
||||
"automations.condition.mqtt.match_mode.regex": "Регулярное выражение",
|
||||
"automations.condition.mqtt.hint": "Активировать при получении совпадающего значения по MQTT топику",
|
||||
"automations.condition.webhook": "Вебхук",
|
||||
"automations.condition.webhook.desc": "HTTP вызов",
|
||||
"automations.condition.webhook.hint": "Активировать через HTTP-запрос от внешних сервисов (Home Assistant, IFTTT, curl и т.д.)",
|
||||
"automations.condition.webhook.url": "URL вебхука:",
|
||||
"automations.condition.webhook.copy": "Скопировать",
|
||||
@@ -673,9 +685,12 @@
|
||||
"automations.scene.none_available": "Нет доступных сцен",
|
||||
"automations.deactivation_mode": "Деактивация:",
|
||||
"automations.deactivation_mode.hint": "Что происходит, когда условия перестают выполняться",
|
||||
"automations.deactivation_mode.none": "Ничего — оставить текущее состояние",
|
||||
"automations.deactivation_mode.revert": "Вернуть предыдущее состояние",
|
||||
"automations.deactivation_mode.fallback_scene": "Активировать резервную сцену",
|
||||
"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": "Активна",
|
||||
@@ -702,6 +717,8 @@
|
||||
"scenes.description.hint": "Необязательное описание назначения этой сцены",
|
||||
"scenes.targets": "Цели:",
|
||||
"scenes.targets.hint": "Выберите какие цели включить в снимок сцены",
|
||||
"scenes.targets.add": "Добавить цель",
|
||||
"scenes.targets.search_placeholder": "Поиск целей...",
|
||||
"scenes.capture": "Захват",
|
||||
"scenes.activate": "Активировать сцену",
|
||||
"scenes.recapture": "Перезахватить текущее состояние",
|
||||
@@ -747,6 +764,9 @@
|
||||
"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": "Интерполяция кадров:",
|
||||
@@ -773,6 +793,8 @@
|
||||
"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.static": "Статический цвет",
|
||||
"color_strip.type.static.desc": "Заливка одним цветом",
|
||||
"color_strip.type.gradient": "Градиент",
|
||||
@@ -910,6 +932,7 @@
|
||||
"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.",
|
||||
@@ -1197,6 +1220,29 @@
|
||||
"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": "Не удалось остановить обработку",
|
||||
|
||||
@@ -624,10 +624,13 @@
|
||||
"automations.conditions.add": "添加条件",
|
||||
"automations.conditions.empty": "无条件 — 启用后自动化始终处于活动状态",
|
||||
"automations.condition.always": "始终",
|
||||
"automations.condition.always.desc": "始终活跃",
|
||||
"automations.condition.always.hint": "自动化启用后立即激活并保持活动。",
|
||||
"automations.condition.startup": "启动",
|
||||
"automations.condition.startup.desc": "服务器启动时",
|
||||
"automations.condition.startup.hint": "服务器启动时激活,启用期间保持活动。",
|
||||
"automations.condition.application": "应用程序",
|
||||
"automations.condition.application.desc": "应用运行/聚焦",
|
||||
"automations.condition.application.apps": "应用程序:",
|
||||
"automations.condition.application.apps.hint": "进程名,每行一个(例如 firefox.exe)",
|
||||
"automations.condition.application.browse": "浏览",
|
||||
@@ -636,23 +639,31 @@
|
||||
"automations.condition.application.match_type": "匹配类型:",
|
||||
"automations.condition.application.match_type.hint": "如何检测应用程序",
|
||||
"automations.condition.application.match_type.running": "运行中",
|
||||
"automations.condition.application.match_type.topmost": "最前(前台)",
|
||||
"automations.condition.application.match_type.running.desc": "进程活跃",
|
||||
"automations.condition.application.match_type.topmost": "最前",
|
||||
"automations.condition.application.match_type.topmost.desc": "前台窗口",
|
||||
"automations.condition.application.match_type.topmost_fullscreen": "最前 + 全屏",
|
||||
"automations.condition.application.match_type.topmost_fullscreen.desc": "前台 + 全屏",
|
||||
"automations.condition.application.match_type.fullscreen": "全屏",
|
||||
"automations.condition.application.match_type.fullscreen.desc": "任意全屏应用",
|
||||
"automations.condition.time_of_day": "时段",
|
||||
"automations.condition.time_of_day.desc": "时间范围",
|
||||
"automations.condition.time_of_day.start_time": "开始时间:",
|
||||
"automations.condition.time_of_day.end_time": "结束时间:",
|
||||
"automations.condition.time_of_day.overnight_hint": "跨夜时段(如 22:00–06:00),请将开始时间设为晚于结束时间。",
|
||||
"automations.condition.system_idle": "系统空闲",
|
||||
"automations.condition.system_idle.desc": "空闲/活跃",
|
||||
"automations.condition.system_idle.idle_minutes": "空闲超时(分钟):",
|
||||
"automations.condition.system_idle.mode": "触发模式:",
|
||||
"automations.condition.system_idle.when_idle": "空闲时",
|
||||
"automations.condition.system_idle.when_active": "活跃时",
|
||||
"automations.condition.display_state": "显示器状态",
|
||||
"automations.condition.display_state.desc": "显示器开/关",
|
||||
"automations.condition.display_state.state": "显示器状态:",
|
||||
"automations.condition.display_state.on": "开启",
|
||||
"automations.condition.display_state.off": "关闭(休眠)",
|
||||
"automations.condition.mqtt": "MQTT",
|
||||
"automations.condition.mqtt.desc": "MQTT 消息",
|
||||
"automations.condition.mqtt.topic": "主题:",
|
||||
"automations.condition.mqtt.payload": "消息内容:",
|
||||
"automations.condition.mqtt.match_mode": "匹配模式:",
|
||||
@@ -661,6 +672,7 @@
|
||||
"automations.condition.mqtt.match_mode.regex": "正则表达式",
|
||||
"automations.condition.mqtt.hint": "当 MQTT 主题收到匹配的消息时激活",
|
||||
"automations.condition.webhook": "Webhook",
|
||||
"automations.condition.webhook.desc": "HTTP 回调",
|
||||
"automations.condition.webhook.hint": "通过外部服务的 HTTP 请求激活(Home Assistant、IFTTT、curl 等)",
|
||||
"automations.condition.webhook.url": "Webhook URL:",
|
||||
"automations.condition.webhook.copy": "复制",
|
||||
@@ -673,9 +685,12 @@
|
||||
"automations.scene.none_available": "没有可用的场景",
|
||||
"automations.deactivation_mode": "停用方式:",
|
||||
"automations.deactivation_mode.hint": "条件不再满足时的行为",
|
||||
"automations.deactivation_mode.none": "无 — 保持当前状态",
|
||||
"automations.deactivation_mode.revert": "恢复到之前的状态",
|
||||
"automations.deactivation_mode.fallback_scene": "激活备用场景",
|
||||
"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": "活动",
|
||||
@@ -702,6 +717,8 @@
|
||||
"scenes.description.hint": "此场景功能的可选描述",
|
||||
"scenes.targets": "目标:",
|
||||
"scenes.targets.hint": "选择要包含在此场景快照中的目标",
|
||||
"scenes.targets.add": "添加目标",
|
||||
"scenes.targets.search_placeholder": "搜索目标...",
|
||||
"scenes.capture": "捕获",
|
||||
"scenes.activate": "激活场景",
|
||||
"scenes.recapture": "重新捕获当前状态",
|
||||
@@ -747,6 +764,9 @@
|
||||
"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": "帧插值:",
|
||||
@@ -773,6 +793,8 @@
|
||||
"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.static": "静态颜色",
|
||||
"color_strip.type.static.desc": "单色填充",
|
||||
"color_strip.type.gradient": "渐变",
|
||||
@@ -910,6 +932,7 @@
|
||||
"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。",
|
||||
@@ -1197,6 +1220,29 @@
|
||||
"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": "停止处理失败",
|
||||
|
||||
Reference in New Issue
Block a user