Settings tabs, log overlay, external URL, Sources tree restructure, audio fixes

- Settings modal split into 3 tabs: General, Backup, MQTT
- Log viewer moved to full-screen overlay with compact toolbar
- External URL setting: API endpoints + UI for configuring server domain
  used in webhook/WS URLs instead of auto-detected local IP
- Sources tab tree restructured: Picture Source (Screen Capture/Static/
  Processed sub-groups), Color Strip, Audio, Utility
- TreeNav extended to support nested groups (3-level tree)
- Audio tab split into Sources and Templates sub-tabs
- Fix audio template test: device picker now filters by engine type
  (was showing WASAPI indices for sounddevice templates)
- Audio template test device picker disabled during active test
- Rename "Input Source" to "Source" in CSS test preview (en/ru/zh)
- Fix i18n: log filter/level items deferred to avoid stale t() calls

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-17 17:16:57 +03:00
parent 191c988cf9
commit 05152a0f51
17 changed files with 335 additions and 71 deletions

View File

@@ -316,6 +316,12 @@
"settings.tab.backup": "Backup",
"settings.tab.mqtt": "MQTT",
"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.capture.title": "Capture Settings",
"settings.capture.saved": "Capture settings updated",
@@ -447,6 +453,7 @@
"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",
@@ -1113,7 +1120,7 @@
"color_strip.type.processed": "Processed",
"color_strip.type.processed.desc": "Apply a processing template to another source",
"color_strip.type.processed.hint": "Wraps an existing color strip source and pipes its output through a filter chain.",
"color_strip.processed.input": "Input Source:",
"color_strip.processed.input": "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",
@@ -1276,11 +1283,20 @@
"audio_template.error.delete": "Failed to delete audio template",
"streams.group.value": "Value Sources",
"streams.group.sync": "Sync Clocks",
"tree.group.picture": "Picture Source",
"tree.group.capture": "Screen Capture",
"tree.group.static": "Static",
"tree.group.processing": "Processed",
"tree.group.picture": "Picture",
"tree.group.strip": "Color Strip",
"tree.group.audio": "Audio",
"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",

View File

@@ -316,6 +316,12 @@
"settings.tab.backup": "Бэкап",
"settings.tab.mqtt": "MQTT",
"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.capture.title": "Настройки Захвата",
"settings.capture.saved": "Настройки захвата обновлены",
@@ -447,6 +453,7 @@
"streams.group.css_processing": "Шаблоны Обработки",
"streams.group.color_strip": "Цветовые Полосы",
"streams.group.audio": "Аудио",
"streams.group.audio_templates": "Аудио шаблоны",
"streams.section.streams": "Источники",
"streams.add": "Добавить Источник",
"streams.add.raw": "Добавить Захват Экрана",
@@ -1113,7 +1120,7 @@
"color_strip.type.processed": "Обработанный",
"color_strip.type.processed.desc": "Применить шаблон обработки к другому источнику",
"color_strip.type.processed.hint": "Оборачивает существующий источник цветовой полосы и пропускает его вывод через цепочку фильтров.",
"color_strip.processed.input": "Входной источник:",
"color_strip.processed.input": "Источник:",
"color_strip.processed.input.hint": "Источник цветовой полосы, вывод которого будет обработан",
"color_strip.processed.template": "Шаблон обработки:",
"color_strip.processed.template.hint": "Цепочка фильтров для применения к выводу входного источника",
@@ -1276,11 +1283,20 @@
"audio_template.error.delete": "Не удалось удалить аудиошаблон",
"streams.group.value": "Источники значений",
"streams.group.sync": "Часы синхронизации",
"tree.group.capture": "Захват Экрана",
"tree.group.picture": "Источники изображений",
"tree.group.capture": "Захват экрана",
"tree.group.static": "Статичные",
"tree.group.processing": "Обработанные",
"tree.group.picture": "Изображения",
"tree.group.strip": "Цветовые Полосы",
"tree.group.strip": "Цветовые полосы",
"tree.group.audio": "Аудио",
"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": "Добавить источник значений",

View File

@@ -316,6 +316,12 @@
"settings.tab.backup": "备份",
"settings.tab.mqtt": "MQTT",
"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.capture.title": "采集设置",
"settings.capture.saved": "采集设置已更新",
@@ -447,6 +453,7 @@
"streams.group.css_processing": "处理模板",
"streams.group.color_strip": "色带源",
"streams.group.audio": "音频",
"streams.group.audio_templates": "音频模板",
"streams.section.streams": "源",
"streams.add": "添加源",
"streams.add.raw": "添加屏幕采集",
@@ -1113,7 +1120,7 @@
"color_strip.type.processed": "已处理",
"color_strip.type.processed.desc": "将处理模板应用于另一个源",
"color_strip.type.processed.hint": "包装现有色带源并通过滤镜链处理其输出。",
"color_strip.processed.input": "输入源:",
"color_strip.processed.input": "源:",
"color_strip.processed.input.hint": "将被处理的色带源",
"color_strip.processed.template": "处理模板:",
"color_strip.processed.template.hint": "应用于输入源输出的滤镜链",
@@ -1276,11 +1283,20 @@
"audio_template.error.delete": "删除音频模板失败",
"streams.group.value": "值源",
"streams.group.sync": "同步时钟",
"tree.group.picture": "图片源",
"tree.group.capture": "屏幕采集",
"tree.group.static": "静态",
"tree.group.processing": "已处理",
"tree.group.picture": "图片",
"tree.group.strip": "色带",
"tree.group.audio": "音频",
"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": "添加值源",