Replace all emoji icons with Lucide SVGs, add accent color picker

- Replace all emoji characters across WebUI with inline Lucide SVG icons
  for cross-platform consistency (icon paths in icon-paths.js)
- Add accent color picker popover with 9 preset colors + custom picker,
  persisted to localStorage, updates all CSS custom properties
- Remove subtab separator line for cleaner look
- Color badge icons with accent color for visual pop
- Remove processing badge from target cards
- Fix hardcoded #4CAF50 in FPS labels and active badges to use CSS vars
- Replace CSS content emoji (▶) with pure CSS triangle

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-27 16:14:18 +03:00
parent efb6cf7ce6
commit c262ec0775
39 changed files with 634 additions and 311 deletions

View File

@@ -3,6 +3,8 @@
"app.version": "Версия:",
"app.api_docs": "Документация API",
"theme.toggle": "Переключить тему",
"accent.title": "Цвет акцента",
"accent.custom": "Свой",
"locale.change": "Изменить язык",
"auth.login": "Войти",
"auth.logout": "Выйти",
@@ -21,7 +23,7 @@
"auth.please_login": "Пожалуйста, войдите для просмотра",
"auth.session_expired": "Ваша сессия истекла или API ключ недействителен. Пожалуйста, войдите снова.",
"displays.title": "Доступные Дисплеи",
"displays.layout": "\uD83D\uDDA5\uFE0F Дисплеи",
"displays.layout": "Дисплеи",
"displays.information": "Информация о Дисплеях",
"displays.legend.primary": "Основной Дисплей",
"displays.legend.secondary": "Вторичный Дисплей",
@@ -44,7 +46,7 @@
"displays.picker.adb_connect.error": "Не удалось подключить устройство",
"displays.picker.adb_disconnect": "Отключить",
"displays.picker.no_android": "Android устройства не найдены. Подключите по USB или введите IP выше.",
"templates.title": "\uD83D\uDCC4 Шаблоны Движков",
"templates.title": "Шаблоны Движков",
"templates.description": "Шаблоны захвата определяют, как захватывается экран. Каждый шаблон использует определённый движок захвата (MSS, DXcam, WGC) с настраиваемыми параметрами. Назначайте шаблоны устройствам для оптимальной производительности.",
"templates.loading": "Загрузка шаблонов...",
"templates.empty": "Шаблоны захвата не настроены",
@@ -77,7 +79,7 @@
"templates.test.display.select": "Выберите дисплей...",
"templates.test.duration": "Длительность Захвата (с):",
"templates.test.border_width": "Ширина Границы (px):",
"templates.test.run": "\uD83E\uDDEA Запустить",
"templates.test.run": "Запустить",
"templates.test.running": "Выполняется тест...",
"templates.test.results.preview": "Полный Предпросмотр Захвата",
"templates.test.results.borders": "Извлечение Границ",
@@ -97,7 +99,7 @@
"templates.test.error.no_engine": "Пожалуйста, выберите движок захвата",
"templates.test.error.no_display": "Пожалуйста, выберите дисплей",
"templates.test.error.failed": "Тест не удался",
"devices.title": "\uD83D\uDCA1 Устройства",
"devices.title": "Устройства",
"devices.add": "Добавить Новое Устройство",
"devices.loading": "Загрузка устройств...",
"devices.none": "Устройства не настроены",
@@ -180,7 +182,7 @@
"device.tip.calibrate": "Калибровка позиций LED, направления и зоны покрытия",
"device.tip.webui": "Открыть встроенный веб-интерфейс устройства для расширенной настройки",
"device.tip.add": "Нажмите, чтобы добавить новое LED устройство",
"settings.title": "Настройки Устройства",
"settings.title": "Настройки",
"settings.general.title": "Основные Настройки",
"settings.capture.title": "Настройки Захвата",
"settings.capture.saved": "Настройки захвата обновлены",
@@ -285,12 +287,12 @@
"section.filter.reset": "Очистить фильтр",
"section.expand_all": "Развернуть все секции",
"section.collapse_all": "Свернуть все секции",
"streams.title": "\uD83D\uDCFA Источники",
"streams.title": "Источники",
"streams.description": "Источники определяют конвейер захвата. Сырой источник захватывает экран с помощью шаблона захвата. Обработанный источник применяет постобработку к другому источнику. Назначайте источники устройствам.",
"streams.group.raw": "Захват Экрана",
"streams.group.processed": "Обработанные",
"streams.group.audio": "Аудио",
"streams.section.streams": "\uD83D\uDCFA Источники",
"streams.section.streams": "Источники",
"streams.add": "Добавить Источник",
"streams.add.raw": "Добавить Захват Экрана",
"streams.add.processed": "Добавить Обработанный",
@@ -322,11 +324,11 @@
"streams.error.required": "Пожалуйста, заполните все обязательные поля",
"streams.error.delete": "Не удалось удалить источник",
"streams.test.title": "Тест Источника",
"streams.test.run": "🧪 Запустить",
"streams.test.run": "Запустить",
"streams.test.running": "Тестирование источника...",
"streams.test.duration": "Длительность Захвата (с):",
"streams.test.error.failed": "Тест источника не удался",
"postprocessing.title": "\uD83D\uDCC4 Шаблоны Фильтров",
"postprocessing.title": "Шаблоны Фильтров",
"postprocessing.description": "Шаблоны обработки определяют фильтры изображений и цветокоррекцию. Назначайте их обработанным источникам для единообразной постобработки на всех устройствах.",
"postprocessing.add": "Добавить Шаблон Фильтра",
"postprocessing.edit": "Редактировать Шаблон Фильтра",
@@ -363,7 +365,7 @@
"postprocessing.test.error.no_stream": "Пожалуйста, выберите источник",
"postprocessing.test.error.failed": "Тест шаблона фильтра не удался",
"device.button.stream_selector": "Настройки источника",
"device.stream_settings.title": "📺 Настройки источника",
"device.stream_settings.title": "Настройки источника",
"device.stream_selector.label": "Источник:",
"device.stream_selector.hint": "Выберите источник, определяющий что это устройство захватывает и обрабатывает",
"device.stream_selector.none": "-- Источник не назначен --",
@@ -388,13 +390,13 @@
"streams.validate_image.validating": "Проверка...",
"streams.validate_image.valid": "Изображение доступно",
"streams.validate_image.invalid": "Изображение недоступно",
"targets.title": "Цели",
"targets.title": "Цели",
"targets.description": "Цели связывают источники цветовых полос с устройствами вывода. Каждая цель ссылается на устройство и источник цветовой полосы.",
"targets.subtab.wled": "LED",
"targets.subtab.led": "LED",
"targets.section.devices": "💡 Устройства",
"targets.section.color_strips": "🎞️ Источники цветовых полос",
"targets.section.targets": "Цели",
"targets.section.devices": "Устройства",
"targets.section.color_strips": "Источники цветовых полос",
"targets.section.targets": "Цели",
"targets.section.specific_settings": "Специальные настройки",
"targets.add": "Добавить Цель",
"targets.edit": "Редактировать Цель",
@@ -444,7 +446,7 @@
"targets.metrics.frames": "Кадры",
"targets.metrics.errors": "Ошибки",
"targets.subtab.key_colors": "Ключевые Цвета",
"targets.section.key_colors": "🎨 Цели Ключевых Цветов",
"targets.section.key_colors": "Цели Ключевых Цветов",
"kc.add": "Добавить Цель Ключевых Цветов",
"kc.edit": "Редактировать Цель Ключевых Цветов",
"kc.name": "Имя Цели:",
@@ -476,9 +478,9 @@
"kc.colors.none": "Цвета пока не извлечены",
"kc.test": "Тест",
"kc.test.error": "Ошибка теста",
"targets.section.pattern_templates": "📄 Шаблоны Паттернов",
"pattern.add": "📄 Добавить Шаблон Паттерна",
"pattern.edit": "📄 Редактировать Шаблон Паттерна",
"targets.section.pattern_templates": "Шаблоны Паттернов",
"pattern.add": "Добавить Шаблон Паттерна",
"pattern.edit": "Редактировать Шаблон Паттерна",
"pattern.name": "Имя Шаблона:",
"pattern.name.placeholder": "Мой Шаблон Паттерна",
"pattern.description_label": "Описание (необязательно):",
@@ -513,7 +515,7 @@
"overlay.stopped": "Визуализация наложения остановлена",
"overlay.error.start": "Не удалось запустить наложение",
"overlay.error.stop": "Не удалось остановить наложение",
"dashboard.title": "📊 Обзор",
"dashboard.title": "Обзор",
"dashboard.section.targets": "Цели",
"dashboard.section.running": "Запущенные",
"dashboard.section.stopped": "Остановленные",
@@ -532,10 +534,9 @@
"dashboard.perf.gpu": "ГП",
"dashboard.perf.unavailable": "недоступно",
"dashboard.poll_interval": "Интервал обновления",
"profiles.title": "\uD83D\uDCCB Профили",
"profiles.title": "Профили",
"profiles.empty": "Профили не настроены. Создайте профиль для автоматизации целей.",
"profiles.add": "\uD83D\uDCCB Добавить профиль",
"profiles.add": "Добавить профиль",
"profiles.edit": "Редактировать профиль",
"profiles.delete.confirm": "Удалить профиль \"{name}\"?",
"profiles.name": "Название:",
@@ -549,7 +550,7 @@
"profiles.conditions": "Условия:",
"profiles.conditions.hint": "Правила, определяющие когда профиль активируется",
"profiles.conditions.add": "Добавить условие",
"profiles.conditions.empty": "Нет условий \u2014 профиль всегда активен когда включён",
"profiles.conditions.empty": "Нет условий профиль всегда активен когда включён",
"profiles.condition.always": "Всегда",
"profiles.condition.always.hint": "Профиль активируется сразу при включении и остаётся активным. Используйте для автозапуска целей при старте сервера.",
"profiles.condition.application": "Приложение",
@@ -597,9 +598,8 @@
"aria.previous": "Назад",
"aria.next": "Вперёд",
"aria.hint": "Показать подсказку",
"color_strip.add": "🎞️ Добавить источник цветовой полосы",
"color_strip.edit": "🎞️ Редактировать источник цветовой полосы",
"color_strip.add": "Добавить источник цветовой полосы",
"color_strip.edit": "Редактировать источник цветовой полосы",
"color_strip.name": "Название:",
"color_strip.name.placeholder": "Настенная полоса",
"color_strip.picture_source": "Источник изображения:",
@@ -786,7 +786,6 @@
"color_strip.palette.aurora": "Аврора",
"color_strip.palette.sunset": "Закат",
"color_strip.palette.ice": "Лёд",
"audio_source.title": "Аудиоисточники",
"audio_source.group.multichannel": "Многоканальные",
"audio_source.group.mono": "Моно",
@@ -829,14 +828,12 @@
"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.test.run": "Запуск",
"audio_template.title": "Аудиошаблоны",
"audio_template.add": "Добавить аудиошаблон",
"audio_template.edit": "Редактировать аудиошаблон",
"audio_template.name": "Название шаблона:",
@@ -857,9 +854,8 @@
"audio_template.error.engines": "Не удалось загрузить аудиодвижки",
"audio_template.error.required": "Пожалуйста, заполните все обязательные поля",
"audio_template.error.delete": "Не удалось удалить аудиошаблон",
"streams.group.value": "Источники значений",
"value_source.group.title": "🔢 Источники значений",
"value_source.group.title": "Источники значений",
"value_source.add": "Добавить источник значений",
"value_source.edit": "Редактировать источник значений",
"value_source.name": "Название:",
@@ -947,7 +943,6 @@
"targets.protocol": "Протокол:",
"targets.protocol.hint": "DDP отправляет пиксели по быстрому UDP (рекомендуется). HTTP использует JSON API — медленнее, но надёжнее, ограничение ~500 LED.",
"targets.protocol.serial": "Serial",
"search.open": "Поиск (Ctrl+K)",
"search.placeholder": "Поиск... (Ctrl+K)",
"search.loading": "Загрузка...",
@@ -963,8 +958,6 @@
"search.group.pattern_templates": "Шаблоны паттернов",
"search.group.audio": "Аудиоисточники",
"search.group.value": "Источники значений",
"settings.title": "Настройки",
"settings.backup.label": "Резервное копирование",
"settings.backup.hint": "Скачать всю конфигурацию (устройства, цели, потоки, шаблоны, профили) в виде одного JSON-файла.",
"settings.backup.button": "Скачать резервную копию",
@@ -979,7 +972,6 @@
"settings.restore.restarting": "Сервер перезапускается...",
"settings.restore.restart_timeout": "Сервер не отвечает. Обновите страницу вручную.",
"settings.button.close": "Закрыть",
"settings.auto_backup.label": "Авто-бэкап",
"settings.auto_backup.hint": "Автоматическое создание периодических резервных копий конфигурации. Старые копии удаляются при превышении максимального количества.",
"settings.auto_backup.enable": "Включить авто-бэкап",
@@ -990,7 +982,6 @@
"settings.auto_backup.save_error": "Не удалось сохранить настройки авто-бэкапа",
"settings.auto_backup.last_backup": "Последний бэкап",
"settings.auto_backup.never": "Никогда",
"settings.saved_backups.label": "Сохранённые копии",
"settings.saved_backups.hint": "Файлы авто-бэкапа на сервере. Скачайте для локального хранения или удалите для освобождения места.",
"settings.saved_backups.empty": "Нет сохранённых копий",