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:
2026-03-09 16:00:30 +03:00
parent 186940124c
commit 2712c6682e
32 changed files with 1204 additions and 391 deletions

View File

@@ -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:0006: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": "停止处理失败",