Add CSPT entity, processed CSS source type, reverse filter, and UI improvements

- Add Color Strip Processing Template (CSPT) entity: reusable filter chains
  for 1D LED strip postprocessing (backend, storage, API, frontend CRUD)
- Add "processed" color strip source type that wraps another CSS source and
  applies a CSPT filter chain (dataclass, stream, schema, modal, cards)
- Add Reverse filter for strip LED order reversal
- Add CSPT and processed CSS nodes/edges to visual graph editor
- Add CSPT test preview WS endpoint with input source selection
- Add device settings CSPT template selector (add + edit modals with hints)
- Use icon grids for palette quantization preset selector in filter lists
- Use EntitySelect for template references and test modal source selectors
- Fix filters.css_filter_template.desc missing localization
- Fix icon grid cell height inequality (grid-auto-rows: 1fr)
- Rename "Processed" subtab to "Processing Templates"
- Localize all new strings (en/ru/zh)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-15 02:16:59 +03:00
parent 7e78323c9c
commit 294d704eb0
72 changed files with 2992 additions and 1416 deletions

View File

@@ -169,6 +169,8 @@
"device.led_type.hint": "RGB3通道或 RGBW4通道带独立白色",
"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/客厅",
@@ -366,6 +368,7 @@
"streams.description": "源定义采集管线。原始源使用采集模板从显示器采集。处理源对另一个源应用后处理。将源分配给设备。",
"streams.group.raw": "屏幕采集",
"streams.group.processed": "已处理",
"streams.group.css_processing": "处理模板",
"streams.group.color_strip": "色带源",
"streams.group.audio": "音频",
"streams.section.streams": "源",
@@ -434,12 +437,16 @@
"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": "模板创建成功",
@@ -455,6 +462,21 @@
"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": "源:",
@@ -976,6 +998,14 @@
"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": "+ 添加图层",
@@ -992,6 +1022,7 @@
"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": "每个图层必须选择一个源",
@@ -1131,6 +1162,7 @@
"streams.group.value": "值源",
"streams.group.sync": "同步时钟",
"tree.group.picture": "图片",
"tree.group.strip": "色带",
"tree.group.utility": "工具",
"value_source.group.title": "值源",
"value_source.select_type": "选择值源类型",