From b914f32cea8b43e916723ffc6f08cfd051750fa2 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Fri, 21 Aug 2026 21:27:31 +0200 Subject: [PATCH] Translated using Weblate (Russian) Currently translated at 100.0% (45 of 45 strings) Translated using Weblate (Russian) Currently translated at 100.0% (62 of 62 strings) Translated using Weblate (Russian) Currently translated at 100.0% (54 of 54 strings) Translated using Weblate (Russian) Currently translated at 99.7% (798 of 800 strings) Translated using Weblate (Russian) Currently translated at 100.0% (474 of 474 strings) Translated using Weblate (Russian) Currently translated at 100.0% (185 of 185 strings) Translated using Weblate (Russian) Currently translated at 100.0% (1295 of 1295 strings) Translated using Weblate (Russian) Currently translated at 100.0% (86 of 86 strings) Translated using Weblate (Russian) Currently translated at 64.1% (43 of 67 strings) Translated using Weblate (Russian) Currently translated at 77.7% (84 of 108 strings) Co-authored-by: Artem Vladimirov Co-authored-by: Hosted Weblate Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/components-dialog/ru/ Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/config-cameras/ru/ Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/config-global/ru/ Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-chat/ru/ Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-events/ru/ Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-exports/ru/ Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-motionsearch/ru/ Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-replay/ru/ Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-settings/ru/ Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-system/ru/ Translation: Frigate NVR/Config - Cameras Translation: Frigate NVR/Config - Global Translation: Frigate NVR/components-dialog Translation: Frigate NVR/views-chat Translation: Frigate NVR/views-events Translation: Frigate NVR/views-exports Translation: Frigate NVR/views-motionSearch Translation: Frigate NVR/views-replay Translation: Frigate NVR/views-settings Translation: Frigate NVR/views-system --- web/public/locales/ru/components/dialog.json | 4 +- web/public/locales/ru/config/cameras.json | 200 ++++++++++-- web/public/locales/ru/config/global.json | 2 +- web/public/locales/ru/views/chat.json | 73 ++++- web/public/locales/ru/views/events.json | 2 +- web/public/locales/ru/views/exports.json | 93 +++++- web/public/locales/ru/views/motionSearch.json | 81 ++++- web/public/locales/ru/views/replay.json | 60 +++- web/public/locales/ru/views/settings.json | 290 ++++++++++++++++++ web/public/locales/ru/views/system.json | 62 +++- 10 files changed, 828 insertions(+), 39 deletions(-) diff --git a/web/public/locales/ru/components/dialog.json b/web/public/locales/ru/components/dialog.json index ab02acd280..507181a103 100644 --- a/web/public/locales/ru/components/dialog.json +++ b/web/public/locales/ru/components/dialog.json @@ -119,7 +119,9 @@ "noCameras": "Нет доступных камер", "detectionCount_one": "{{count}} отслеживаемый объект", "detectionCount_few": "{{count}} отслеживаемых объекта", - "detectionCount_many": "{{count}} отслеживаемых объектов" + "detectionCount_many": "{{count}} отслеживаемых объектов", + "nameLabel": "экспортируемое имя", + "namePlaceholder": "Необязательное базовое имя для экспорта" } }, "streaming": { diff --git a/web/public/locales/ru/config/cameras.json b/web/public/locales/ru/config/cameras.json index 80cc6b63a9..631dbe2b5e 100644 --- a/web/public/locales/ru/config/cameras.json +++ b/web/public/locales/ru/config/cameras.json @@ -140,12 +140,42 @@ } }, "mqtt": { - "label": "MQTT" + "label": "MQTT", + "description": "Настройки публикации изображений в MQTT.", + "enabled": { + "label": "Отправлять изображение", + "description": "Включить публикацию снимков объектов в MQTT-топики этой камеры." + }, + "timestamp": { + "label": "Добавить временную метку", + "description": "Накладывать временную метку на изображения, публикуемые в MQTT." + }, + "bounding_box": { + "label": "Добавить ограничивающую рамку", + "description": "Рисовать ограничивающие рамки на изображениях, публикуемых в MQTT." + }, + "crop": { + "label": "Обрезать изображение", + "description": "Обрезать изображения, публикуемые в MQTT, по ограничивающей рамке обнаруженного объекта." + }, + "height": { + "label": "Высота изображения", + "description": "Высота (в пикселях) для изменения размера изображений, публикуемых в MQTT." + }, + "required_zones": { + "label": "Обязательные зоны", + "description": "Зоны, в которые должен войти объект, чтобы изображение было опубликовано в MQTT." + }, + "quality": { + "label": "Качество JPEG", + "description": "Качество JPEG изображений, публикуемых в MQTT (0–100)." + } }, "notifications": { "label": "Уведомления", "enabled": { - "label": "Включить уведомления" + "label": "Включить уведомления", + "description": "Включить или отключить уведомления для этой камеры." }, "email": { "label": "Уведомление по электронной почте", @@ -158,7 +188,8 @@ "enabled_in_config": { "label": "Исходное состояние уведомлений", "description": "Указывает, были ли уведомления включены в исходной статической конфигурации." - } + }, + "description": "Настройки включения и управления уведомлениями для этой камеры." }, "ffmpeg": { "path": { @@ -222,9 +253,11 @@ }, "input_args": { "label": "Входные аргументы", - "description": "Входные аргументы, специфичные для этого потока." + "description": "Входные аргументы именно для этого потока." } - } + }, + "label": "Потоки (FFmpeg)", + "description": "Входы потоков камеры и параметры FFmpeg: путь к бинарнику, аргументы, аппаратное ускорение и выходные аргументы по ролям." }, "live": { "label": "Просмотр в реальном времени", @@ -239,12 +272,14 @@ "quality": { "label": "Качество live-потока", "description": "Качество кодирования потока jsmpeg (1 — наивысшее, 31 — наинизшее)." - } + }, + "description": "Настройки веб-интерфейса для выбора live-потока, разрешения и качества." }, "motion": { "label": "Обнаружение движения", "enabled": { - "label": "Включить обнаружение движения" + "label": "Включить обнаружение движения", + "description": "Включить или отключить обнаружение движения для этой камеры." }, "threshold": { "label": "Порог движения", @@ -292,13 +327,15 @@ }, "raw_mask": { "label": "Исходная маска" - } + }, + "description": "Настройки обнаружения движения по умолчанию для этой камеры." }, "objects": { "label": "Объекты", "description": "Параметры отслеживания объектов по умолчанию, включая метки для отслеживания и фильтры для каждого объекта.", "track": { - "label": "Объекты для отслеживания" + "label": "Объекты для отслеживания", + "description": "Список меток объектов для отслеживания на этой камере." }, "filters": { "label": "Фильтры объектов", @@ -394,7 +431,8 @@ "record": { "label": "Запись", "enabled": { - "label": "Включить запись" + "label": "Включить запись", + "description": "Включить или отключить запись для этой камеры." }, "expire_interval": { "label": "Запись интервала очистки", @@ -490,7 +528,8 @@ "enabled_in_config": { "label": "Исходное состояние записи", "description": "Указывает, была ли запись включена в исходной статической конфигурации." - } + }, + "description": "Настройки записи и хранения для этой камеры." }, "review": { "label": "Проверка", @@ -498,7 +537,8 @@ "label": "Конфигурация оповещений", "description": "Настройки, для которых отслеживаемые объекты генерируют оповещения и как оповещения сохраняются.", "enabled": { - "label": "Включить оповещения" + "label": "Включить оповещения", + "description": "Включить или отключить создание тревог для этой камеры." }, "labels": { "label": "Предупреждающие ярлыки", @@ -521,7 +561,8 @@ "label": "Конфигурация обнаружения", "description": "Настройки, для которых отслеживаемые объекты генерируют обнаружения (без оповещения) и порядок сохранения обнаружений.", "enabled": { - "label": "Включить обнаружение" + "label": "Включить обнаружение", + "description": "Включить или отключить события обнаружения для этой камеры." }, "labels": { "label": "Метки обнаружения", @@ -579,12 +620,14 @@ "label": "Промпт контекста активности", "description": "Пользовательский промпт, описывающий, какая активность считается подозрительной, а какая нет, для контекста сводок GenAI." } - } + }, + "description": "Настройки тревог, обнаружений и сводок GenAI для проверки, которые использует интерфейс и хранилище этой камеры." }, "snapshots": { "label": "Снимки", "enabled": { - "label": "Включить снимки" + "label": "Включить снимки", + "description": "Включить или отключить сохранение снимков для этой камеры." }, "timestamp": { "label": "Наложение временной метки", @@ -621,7 +664,8 @@ "quality": { "label": "Качество снимка", "description": "Качество кодирования для сохраненных снимков (0–100)." - } + }, + "description": "Настройки снимков отслеживаемых объектов, создаваемых через API для этой камеры." }, "timestamp_style": { "label": "Стиль временной метки", @@ -656,7 +700,8 @@ "effect": { "label": "Эффект временной метки", "description": "Визуальный эффект для текста метки времени (нет, сплошной, тень)." - } + }, + "description": "Параметры оформления временных меток на снимках и в Debug-виде." }, "semantic_search": { "label": "Семантический поиск", @@ -687,23 +732,27 @@ "label": "Триггерные действия", "description": "Список действий при срабатывании триггера (notification, sub_label, attribute)." } - } + }, + "description": "Настройки семантического поиска: построение и запросы эмбеддингов объектов для поиска похожих элементов." }, "face_recognition": { "label": "Распознавание лиц", "enabled": { - "label": "Включить распознавание лиц" + "label": "Включить распознавание лиц", + "description": "Включить или отключить распознавание лиц." }, "min_area": { "label": "Минимальная площадь лица", "description": "Минимальная площадь (пиксели) обнаруженного лицевого окна, необходимая для попытки распознавания." - } + }, + "description": "Настройки обнаружения и распознавания лиц для этой камеры." }, "lpr": { "label": "Распознавание номерных знаков", "description": "Настройки распознавания номерных знаков, включая пороговые значения обнаружения, форматирование и известные номера.", "enabled": { - "label": "Включить LPR" + "label": "Включить LPR", + "description": "Включить или отключить LPR на этой камере." }, "min_area": { "label": "Минимальная площадь номера", @@ -719,7 +768,8 @@ } }, "profiles": { - "label": "Профили" + "label": "Профили", + "description": "Именованные профили конфигурации с частичными переопределениями, которые можно активировать во время работы." }, "onvif": { "label": "ONVIF", @@ -796,5 +846,111 @@ "label": "Игнорировать несоответствие времени", "description": "Игнорировать расхождение времени между камерой и сервером Frigate при обмене по ONVIF." } + }, + "best_image_timeout": { + "label": "Таймаут лучшего кадра", + "description": "Как долго ждать кадр с наибольшей уверенностью." + }, + "type": { + "label": "Тип камеры", + "description": "Тип камеры" + }, + "ui": { + "label": "Интерфейс камеры", + "description": "Порядок отображения и видимость этой камеры в интерфейсе. Порядок влияет на дашборд по умолчанию. Для более гибкой настройки используйте группы камер.", + "order": { + "label": "Порядок в интерфейсе", + "description": "Числовой порядок сортировки камеры в интерфейсе (дашборд по умолчанию и списки); большие числа отображаются позже." + }, + "dashboard": { + "label": "Показывать на Live-дашборде", + "description": "Показывать ли эту камеру на дашборде «Все камеры». Камера останется доступной в остальном интерфейсе, включая группы камер и настройки." + }, + "review": { + "label": "Показывать в обзоре событий", + "description": "Показывать ли эту камеру в проверке (страница проверки и её фильтр камер, проверка движения и история)." + } + }, + "webui_url": { + "label": "URL камеры", + "description": "URL для перехода к веб-интерфейсу камеры со страницы системы" + }, + "zones": { + "label": "Зоны", + "description": "Зоны позволяют задать область кадра, чтобы определять, находится ли объект в этой области.", + "friendly_name": { + "label": "Имя зоны", + "description": "Понятное имя зоны для интерфейса Frigate. Если не задано, используется отформатированное имя зоны." + }, + "enabled": { + "label": "Включено", + "description": "Включить или отключить эту зону. Отключённые зоны игнорируются во время работы." + }, + "enabled_in_config": { + "label": "Исходное состояние зоны." + }, + "filters": { + "label": "Фильтры зоны", + "description": "Фильтры объектов внутри зоны. Используются для снижения ложных срабатываний или ограничения, какие объекты считаются присутствующими в зоне.", + "min_area": { + "label": "Минимальная площадь объекта", + "description": "Минимальная площадь ограничивающей рамки (пиксели или доля кадра) для этого типа объекта. Пиксели — целое число; доля — число с плавающей точкой от 0.000001 до 0.99." + }, + "max_area": { + "label": "Максимальная площадь объекта", + "description": "Максимальная площадь ограничивающей рамки (пиксели или доля кадра) для этого типа объекта. Пиксели — целое число; доля — число с плавающей точкой от 0.000001 до 0.99." + }, + "min_ratio": { + "label": "Минимальное соотношение сторон", + "description": "Минимальное отношение ширины к высоте ограничивающей рамки." + }, + "max_ratio": { + "label": "Максимальное соотношение сторон", + "description": "Максимальное отношение ширины к высоте ограничивающей рамки." + }, + "threshold": { + "label": "Порог уверенности", + "description": "Средний порог уверенности обнаружения, при котором объект считается истинным срабатыванием." + }, + "min_score": { + "label": "Минимальная уверенность", + "description": "Минимальная уверенность на одном кадре, при которой объект учитывается." + }, + "mask": { + "label": "Маска фильтра", + "description": "Координаты многоугольника, где применяется этот фильтр." + }, + "raw_mask": { + "label": "Исходная маска" + } + }, + "coordinates": { + "label": "Координаты", + "description": "Координаты многоугольника зоны. Можно задать строкой через запятую или списком строк. Координаты должны быть относительными (0–1) или абсолютными (устаревший вариант)." + }, + "distances": { + "label": "Реальные расстояния", + "description": "Необязательные реальные длины сторон четырёхугольника зоны для расчёта скорости или расстояния. Если заданы, должно быть ровно 4 значения." + }, + "inertia": { + "label": "Кадры инерции", + "description": "Сколько кадров подряд объект должен обнаруживаться в зоне, прежде чем считаться присутствующим. Помогает отфильтровать кратковременные срабатывания." + }, + "loitering_time": { + "label": "Время присутствия (сек)", + "description": "Сколько секунд объект должен оставаться в зоне, чтобы считаться задержавшимся. 0 отключает детектирование присутствия." + }, + "speed_threshold": { + "label": "Минимальная скорость", + "description": "Минимальная скорость (в реальных единицах, если заданы distances), при которой объект считается присутствующим в зоне. Для триггеров по скорости." + }, + "objects": { + "label": "Объекты-триггеры", + "description": "Список типов объектов (из labelmap), которые могут активировать эту зону. Строка или список строк. Если пусто — учитываются все объекты." + } + }, + "enabled_in_config": { + "label": "Исходное состояние камеры", + "description": "Сохраняет исходное состояние камеры." } } diff --git a/web/public/locales/ru/config/global.json b/web/public/locales/ru/config/global.json index 847d0461a2..96f8a97fe3 100644 --- a/web/public/locales/ru/config/global.json +++ b/web/public/locales/ru/config/global.json @@ -766,7 +766,7 @@ }, "input_args": { "label": "Входные аргументы", - "description": "Входные аргументы, специфичные для этого потока." + "description": "Входные аргументы именно для этого потока." } } }, diff --git a/web/public/locales/ru/views/chat.json b/web/public/locales/ru/views/chat.json index 0967ef424b..507d0bf110 100644 --- a/web/public/locales/ru/views/chat.json +++ b/web/public/locales/ru/views/chat.json @@ -1 +1,72 @@ -{} +{ + "documentTitle": "Чат - Frigate", + "title": "Чат Frigate", + "subtitle": "Ваш ИИ-помощник для управления камерами и аналитики", + "placeholder": "Спросите что угодно…", + "error": "Что-то пошло не так. Попробуйте ещё раз.", + "processing": "Обработка…", + "toolsUsed": "Использовано: {{tools}}", + "showTools": "Показать инструменты ({{count}})", + "hideTools": "Скрыть инструменты", + "call": "Вызов", + "result": "Результат", + "arguments": "Аргументы:", + "response": "Ответ:", + "attachment_chip_label": "{{label}} на {{camera}}", + "attachment_chip_remove": "Удалить вложение", + "open_in_explore": "Открыть в Поиске событий", + "attach_event_aria": "Прикрепить событие {{eventId}}", + "attachment_picker_paste_label": "Или вставьте ID события", + "attachment_picker_attach": "Прикрепить", + "attachment_picker_placeholder": "Прикрепить событие", + "quick_reply_find_similar": "Найти похожие", + "quick_reply_tell_me_more": "Расскажи подробнее", + "quick_reply_when_else": "Когда ещё это видели?", + "quick_reply_find_similar_text": "Найди похожие появления этого объекта.", + "quick_reply_tell_me_more_text": "Расскажи подробнее об этом.", + "quick_reply_when_else_text": "Когда ещё это появлялось?", + "anchor": "Образец", + "similarity_score": "Сходство", + "no_similar_objects_found": "Похожие объекты не найдены.", + "semantic_search_required": "Для поиска похожих объектов должен быть включён семантический поиск.", + "send": "Отправить", + "suggested_requests": "Попробуйте спросить:", + "starting_requests": { + "show_recent_events": "Показать недавние события", + "show_camera_status": "Показать статус камер", + "recap": "Что произошло, пока меня не было?", + "watch_camera": "Следить за активностью на камере" + }, + "starting_requests_prompts": { + "show_recent_events": "Покажи недавние события за последний час", + "show_camera_status": "Какой сейчас статус моих камер?", + "recap": "Что произошло, пока меня не было?", + "watch_camera": "Следи за входной дверью и сообщи, если кто-нибудь появится" + }, + "new_chat": "Новый чат", + "settings": { + "title": "Настройки чата", + "show_stats": { + "title": "Показывать статистику", + "desc": "Показывать скорость генерации и размер контекста для ответов чата.", + "while_generating": "Во время генерации", + "always": "Всегда" + }, + "auto_scroll": { + "title": "Автопрокрутка", + "desc": "Следовать за новыми сообщениями по мере их появления." + } + }, + "stats": { + "context": "{{tokens}} токенов", + "tokens_per_second": "{{rate}} t/s" + }, + "reasoning": { + "active": "Думает…", + "show": "Показать рассуждения", + "hide": "Скрыть рассуждения" + }, + "thinking": { + "toggle": "Режим рассуждений" + } +} diff --git a/web/public/locales/ru/views/events.json b/web/public/locales/ru/views/events.json index 20fa143aed..989894c683 100644 --- a/web/public/locales/ru/views/events.json +++ b/web/public/locales/ru/views/events.json @@ -39,7 +39,7 @@ }, "markTheseItemsAsReviewed": "Пометить эти элементы как просмотренные", "selected": "{{count}} выбрано", - "selected_one": "{{count}} выбрано", + "selected_one": "{{count}} выбран", "selected_other": "{{count}} выбрано", "detected": "обнаружен", "suspiciousActivity": "Подозрительная активность", diff --git a/web/public/locales/ru/views/exports.json b/web/public/locales/ru/views/exports.json index 70f8753b6e..0951342d5d 100644 --- a/web/public/locales/ru/views/exports.json +++ b/web/public/locales/ru/views/exports.json @@ -14,7 +14,9 @@ "toast": { "error": { "renameExportFailed": "Не удалось переименовать экспорт: {{errorMessage}}", - "assignCaseFailed": "Не удалось обновить назначение случая: {{errorMessage}}" + "assignCaseFailed": "Не удалось обновить назначение случая: {{errorMessage}}", + "caseSaveFailed": "Не удалось сохранить случай: {{errorMessage}}", + "caseDeleteFailed": "Не удалось удалить случай: {{errorMessage}}" } }, "tooltip": { @@ -22,7 +24,8 @@ "downloadVideo": "Скачать видео", "editName": "Изменить название", "deleteExport": "Удалить экспорт", - "assignToCase": "Добавить в случай" + "assignToCase": "Добавить в случай", + "removeFromCase": "Убрать из случая" }, "headings": { "cases": "Случаи", @@ -35,5 +38,91 @@ "newCaseOption": "Создать новый случай", "nameLabel": "Название случая", "descriptionLabel": "Описание" + }, + "toolbar": { + "newCase": "Новый случай", + "addExport": "Добавить экспорт", + "editCase": "Редактировать случай", + "deleteCase": "Удалить случай" + }, + "deleteCase": { + "label": "Удалить случай", + "desc": "Вы уверены, что хотите удалить {{caseName}}?", + "descKeepExports": "Экспорты останутся доступны без категории.", + "descDeleteExports": "Все экспорты в этом случае будут удалены безвозвратно.", + "deleteExports": "Также удалить экспорты" + }, + "caseCard": { + "emptyCase": "Пока нет экспортов" + }, + "jobCard": { + "defaultName": "Экспорт {{camera}}", + "queued": "В очереди", + "running": "Выполняется", + "preparing": "Подготовка", + "copying": "Копирование", + "encoding": "Кодирование", + "encodingRetry": "Кодирование (повтор)", + "finalizing": "Завершение" + }, + "caseView": { + "noDescription": "Без описания", + "createdAt": "Создан {{value}}", + "exportCount_one": "1 экспорт", + "exportCount_other": "{{count}} экспорта", + "cameraCount_one": "1 камера", + "cameraCount_other": "{{count}} камеры", + "showMore": "Показать больше", + "showLess": "Свернуть", + "emptyTitle": "Этот случай пуст", + "emptyDescription": "Добавьте существующие экспорты без категории, чтобы упорядочить случай.", + "emptyDescriptionNoExports": "Пока нет экспортов без категории, которые можно добавить." + }, + "caseEditor": { + "createTitle": "Создать случай", + "editTitle": "Редактировать случай", + "namePlaceholder": "Название случая", + "descriptionPlaceholder": "Добавьте заметки или контекст для этого случая" + }, + "addExportDialog": { + "title": "Добавить экспорт в {{caseName}}", + "searchPlaceholder": "Поиск экспортов без категории", + "empty": "Нет экспортов без категории, подходящих под этот поиск.", + "addButton_one": "Добавить 1 экспорт", + "addButton_other": "Добавить {{count}} экспорта", + "adding": "Добавление…" + }, + "selected_one": "{{count}} выбран", + "selected_other": "{{count}} выбрано", + "bulkActions": { + "addToCase": "Добавить в случай", + "moveToCase": "Переместить в случай", + "removeFromCase": "Убрать из случая", + "delete": "Удалить", + "deleteNow": "Удалить сейчас" + }, + "bulkDelete": { + "title": "Удалить экспорты", + "desc_one": "Вы уверены, что хотите удалить {{count}} экспорт?", + "desc_other": "Вы уверены, что хотите удалить {{count}} экспорта?" + }, + "bulkRemoveFromCase": { + "title": "Убрать из случая", + "desc_one": "Убрать {{count}} экспорт из этого случая?", + "desc_other": "Убрать {{count}} экспорта из этого случая?", + "descKeepExports": "Экспорты будут перемещены в раздел без категории.", + "descDeleteExports": "Экспорты будут удалены безвозвратно.", + "deleteExports": "Вместо этого удалить экспорты" + }, + "bulkToast": { + "success": { + "delete": "Экспорты успешно удалены", + "reassign": "Назначение случая успешно обновлено", + "remove": "Экспорты успешно убраны из случая" + }, + "error": { + "deleteFailed": "Не удалось удалить экспорты: {{errorMessage}}", + "reassignFailed": "Не удалось обновить назначение случая: {{errorMessage}}" + } } } diff --git a/web/public/locales/ru/views/motionSearch.json b/web/public/locales/ru/views/motionSearch.json index 0967ef424b..80ac414197 100644 --- a/web/public/locales/ru/views/motionSearch.json +++ b/web/public/locales/ru/views/motionSearch.json @@ -1 +1,80 @@ -{} +{ + "documentTitle": "Поиск по движению - Frigate", + "title": "Поиск по движению", + "description": "Нарисуйте полигон области интереса и укажите диапазон времени, чтобы найти изменения движения в этой области.", + "selectCamera": "Поиск по движению загружается", + "startSearch": "Начать поиск", + "searchStarted": "Поиск запущен", + "searchCancelled": "Поиск отменён", + "cancelSearch": "Отменить", + "searching": "Идёт поиск.", + "scanning": "Сканирование {{time}}", + "searchComplete": "Поиск завершён", + "noResultsYet": "Запустите поиск, чтобы найти изменения движения в выбранной области", + "noChangesFound": "В выбранной области не обнаружено изменений пикселей", + "changesFound_one": "Найдено {{count}} изменение движения", + "changesFound_few": "Найдено {{count}} изменения движения", + "changesFound_many": "Найдено {{count}} изменений движения", + "framesProcessed": "{{count}} кадров обработано", + "jumpToTime": "Перейти к этому времени", + "results": "Результаты", + "showSegmentHeatmap": "Тепловая карта", + "newSearch": "Новый поиск", + "clearResults": "Очистить результаты", + "clearROI": "Очистить полигон", + "polygonControls": { + "points_one": "{{count}} точка", + "points_few": "{{count}} точки", + "points_many": "{{count}} точек", + "undo": "Отменить последнюю точку", + "reset": "Сбросить полигон", + "drawMode": "Рисовать", + "moveMode": "Перемещать" + }, + "motionHeatmapLabel": "Тепловая карта движения", + "dialog": { + "title": "Поиск по движению", + "cameraLabel": "Камера", + "previewAlt": "Превью камеры {{camera}}" + }, + "timeRange": { + "title": "Диапазон поиска", + "start": "Время начала", + "end": "Время окончания" + }, + "settings": { + "title": "Настройки поиска", + "parallelMode": "Параллельный режим", + "parallelModeDesc": "Сканировать несколько диапазонов записи одновременно (быстрее, больше нагрузка на декодирование)", + "threshold": "Порог чувствительности", + "thresholdDesc": "Меньшие значения обнаруживают более слабые изменения (1–255)", + "minArea": "Минимальная площадь изменения", + "minAreaDesc": "Минимальный размер одной движущейся области в процентах от области интереса", + "maxResults": "Максимум результатов", + "maxResultsDesc": "Остановить поиск после этого числа совпавших меток времени" + }, + "errors": { + "noCamera": "Выберите камеру", + "noROI": "Нарисуйте область интереса", + "noTimeRange": "Выберите диапазон времени", + "invalidTimeRange": "Время окончания должно быть позже времени начала", + "searchFailed": "Поиск не удался: {{message}}", + "polygonTooSmall": "В полигоне должно быть не менее 3 точек", + "unknown": "Неизвестная ошибка" + }, + "changePercentage": "{{percentage}}% изменено", + "metrics": { + "title": "Метрики поиска", + "segmentsScanned": "Просканировано сегментов", + "segmentsProcessed": "Обработано", + "segmentsSkippedInactive": "Пропущено (нет активности)", + "segmentsSkippedHeatmap": "Пропущено (нет пересечения с областью)", + "fallbackFullRange": "Резервное сканирование всего диапазона", + "framesDecoded": "Декодировано кадров", + "wallTime": "Время поиска", + "segmentErrors": "Ошибки сегментов", + "seconds": "{{seconds}} с", + "minutesSeconds": "{{minutes}}м {{seconds}}с", + "scanSummary": "{{segments}} сегм. · {{time}}" + } +} diff --git a/web/public/locales/ru/views/replay.json b/web/public/locales/ru/views/replay.json index 0967ef424b..8b5d21c988 100644 --- a/web/public/locales/ru/views/replay.json +++ b/web/public/locales/ru/views/replay.json @@ -1 +1,59 @@ -{} +{ + "title": "Отладочный повтор", + "description": "Повтор записей камеры для отладки. Список объектов показывает отложенную по времени сводку обнаруженных объектов, а вкладка «Сообщения» — поток внутренних сообщений Frigate по этому фрагменту.", + "websocket_messages": "Сообщения", + "dialog": { + "title": "Запустить отладочный повтор", + "description": "Создаёт временную камеру повтора, которая зацикливает историческую запись для отладки обнаружения и отслеживания объектов. У камеры повтора будет та же конфигурация обнаружения, что и у исходной камеры. Выберите диапазон времени, чтобы начать.", + "camera": "Исходная камера", + "timeRange": "Диапазон времени", + "preset": { + "1m": "Последняя минута", + "5m": "Последние 5 минут", + "timeline": "С хронологии", + "custom": "Свой" + }, + "startButton": "Запустить повтор", + "selectFromTimeline": "Выбрать", + "starting": "Запуск повтора…", + "startLabel": "Начало", + "endLabel": "Конец", + "toast": { + "error": "Не удалось запустить отладочный повтор: {{error}}", + "alreadyActive": "Сессия повтора уже запущена", + "stopError": "Не удалось остановить отладочный повтор: {{error}}", + "goToReplay": "Перейти к повтору" + } + }, + "page": { + "noSession": "Нет активной сессии отладочного повтора", + "noSessionDesc": "Запустите отладочный повтор из раздела «История»: нажмите «Действия» на панели инструментов и выберите «Отладочный повтор».", + "goToRecordings": "Перейти к Истории", + "preparingClip": "Подготовка клипа…", + "preparingClipDesc": "Frigate склеивает записи за выбранный диапазон. Для длинных диапазонов это может занять около минуты.", + "startingCamera": "Запуск отладочного повтора…", + "startError": { + "title": "Не удалось запустить отладочный повтор", + "back": "Назад к Истории" + }, + "sourceCamera": "Исходная камера", + "replayCamera": "Камера повтора", + "initializingReplay": "Инициализация отладочного повтора…", + "stoppingReplay": "Остановка отладочного повтора…", + "stopReplay": "Остановить повтор", + "confirmStop": { + "title": "Остановить отладочный повтор?", + "description": "Сессия будет остановлена, все временные данные будут удалены. Продолжить?", + "confirm": "Остановить повтор", + "cancel": "Отменить" + }, + "activity": "Активность", + "objects": "Список объектов", + "audioDetections": "Обнаружения звука", + "noActivity": "Активность не обнаружена", + "activeTracking": "Активное отслеживание", + "noActiveTracking": "Нет активного отслеживания", + "configuration": "Конфигурация", + "configurationDesc": "Точная настройка обнаружения движения и отслеживания объектов для камеры отладочного повтора. Изменения не сохраняются в конфигурационный файл Frigate." + } +} diff --git a/web/public/locales/ru/views/settings.json b/web/public/locales/ru/views/settings.json index afb63ff6ef..2c618d425f 100644 --- a/web/public/locales/ru/views/settings.json +++ b/web/public/locales/ru/views/settings.json @@ -1890,6 +1890,296 @@ }, "timestamp_style": { "title": "Настройки временной метки" + }, + "searchPlaceholder": "Поиск…", + "addCustomLabel": "Добавить персонализированную метку…", + "genaiModel": { + "placeholder": "Выберите или введите модель…", + "search": "Найдите или введите модель…", + "noModels": "Нет доступных моделей", + "available": "Доступные модели", + "useCustom": "Используйте «{{value}}»", + "refresh": "Обновить модели", + "probeFailed": "Не удалось проверить модели", + "fetchedModels": "Список моделей успешно получен" + }, + "ptzPresets": { + "placeholder": "Выберите или введите предустановку…", + "search": "Найдите или введите предустановку…", + "noPresets": "Нет доступных предустановок", + "available": "Настройки камеры", + "useCustom": "Используйте «{{value}}»" + }, + "defaultRole": { + "admin": "Админ", + "viewer": "Зритель" + } + }, + "globalConfig": { + "title": "Глобальная конфигурация", + "description": "Настройте глобальные параметры, которые применяются ко всем камерам, если не переопределены.", + "toast": { + "success": "Глобальные настройки успешно сохранены", + "error": "Не удалось сохранить глобальные настройки", + "validationError": "Ошибка проверки" + } + }, + "cameraConfig": { + "title": "Конфигурация камеры", + "description": "Настройте параметры отдельных камер. Эти настройки переопределяют глобальные значения по умолчанию.", + "overriddenBadge": "Переопределено", + "resetToGlobal": "Сбросить до глобальных", + "toast": { + "success": "Настройки камеры успешно сохранены", + "error": "Не удалось сохранить настройки камеры" + } + }, + "toast": { + "success": "Настройки успешно сохранены", + "applied": "Настройки успешно применены", + "successRestartRequired": "Настройки успешно сохранены. Перезапустите Frigate, чтобы применить изменения.", + "error": "Не удалось сохранить настройки", + "validationError": "Ошибка проверки: {{message}}", + "resetSuccess": "Сброшено до глобальных значений по умолчанию", + "resetError": "Не удалось сбросить настройки", + "saveAllSuccess_one": "Успешно сохранён {{count}} раздел.", + "saveAllSuccess_few": "Успешно сохранены все {{count}} раздела.", + "saveAllSuccess_many": "Успешно сохранены все {{count}} разделов.", + "saveAllSuccessRestartRequired_one": "Успешно сохранён {{count}} раздел. Перезапустите Frigate, чтобы применить изменения.", + "saveAllSuccessRestartRequired_few": "Успешно сохранены все {{count}} раздела. Перезапустите Frigate, чтобы применить изменения.", + "saveAllSuccessRestartRequired_many": "Успешно сохранены все {{count}} разделов. Перезапустите Frigate, чтобы применить изменения.", + "saveAllPartial_one": "Сохранён {{successCount}} из {{totalCount}} раздела. Не удалось: {{failCount}}.", + "saveAllPartial_few": "Сохранено {{successCount}} из {{totalCount}} разделов. Не удалось: {{failCount}}.", + "saveAllPartial_many": "Сохранено {{successCount}} из {{totalCount}} разделов. Не удалось: {{failCount}}.", + "saveAllFailure": "Не удалось сохранить все разделы." + }, + "profiles": { + "title": "Профили", + "activeProfile": "Активный профиль", + "noActiveProfile": "Нет активного профиля", + "active": "Активный", + "activated": "Профиль «{{profile}}» активирован", + "activateFailed": "Не удалось установить профиль", + "deactivated": "Профиль деактивирован", + "noProfiles": "Профили не определены.", + "noOverrides": "Никаких переопределений", + "cameraCount_one": "{{count}} камера", + "cameraCount_few": "{{count}} камеры", + "cameraCount_many": "{{count}} камер", + "columnCamera": "Камера", + "columnOverrides": "Переопределения профиля", + "baseConfig": "Базовая конфигурация", + "addProfile": "Добавить профиль", + "newProfile": "Новый профиль", + "profileNamePlaceholder": "например, «На охране», «Нет на месте», «Ночной режим»", + "friendlyNameLabel": "Имя профиля", + "profileIdLabel": "Идентификатор профиля", + "profileIdDescription": "Внутренний идентификатор, используемый в конфигурации и автоматизации.", + "nameInvalid": "Разрешены только строчные буквы, цифры и подчеркивания", + "nameDuplicate": "Профиль с таким именем уже существует", + "error": { + "mustBeAtLeastTwoCharacters": "Должно быть минимум 2 символа", + "mustNotContainPeriod": "Не должно содержать точек", + "alreadyExists": "Профиль с таким идентификатором уже существует" + }, + "renameProfile": "Переименовать профиль", + "renameSuccess": "Профиль переименован в '{{profile}}'", + "deleteProfile": "Удалить профиль", + "deleteProfileConfirm": "Удалить профиль \"{{profile}}\" со всех камер? Это невозможно отменить.", + "deleteSuccess": "Профиль «{{profile}}» удален", + "createSuccess": "Профиль «{{profile}}» создан", + "removeOverride": "Удалить переопределение профиля", + "deleteSection": "Удаление переопределений раздела", + "deleteSectionConfirm": "Удалить переопределения {{section}} для профиля {{profile}} на {{camera}}?", + "deleteSectionSuccess": "Удалены переопределения {{section}} для {{profile}}", + "enableSwitch": "Включить профили", + "enabledDescription": "Профили включены. Создайте новый профиль ниже, перейдите в раздел конфигурации камеры, чтобы внести изменения, и сохраните их, чтобы изменения вступили в силу.", + "disabledDescription": "Профили позволяют вам определять именованные наборы переопределений конфигурации камеры (например, «охрана», «отсутствие», «ночь»), которые можно активировать по требованию." + }, + "unsavedChanges": "У вас есть несохранённые изменения", + "confirmReset": "Подтвердить сброс", + "resetToDefaultDescription": "Все настройки в этом разделе будут сброшены до значений по умолчанию. Это действие нельзя отменить.", + "resetToGlobalDescription": "Настройки в этом разделе будут сброшены до глобальных значений по умолчанию. Это действие нельзя отменить.", + "go2rtcStreams": { + "title": "Потоки go2rtc", + "description": "Управляйте конфигурациями потоков go2rtc для рестриминга камер. У каждого потока есть имя и один или несколько URL источников.", + "addStream": "Добавить поток", + "addStreamDesc": "Введите имя нового потока. Это имя будет использоваться для ссылки на поток в конфигурации вашей камеры.", + "addUrl": "Добавить URL", + "sourceNumber": "Источник {{index}}", + "streamName": "Название потока", + "streamNamePlaceholder": "например, front_door", + "streamUrlPlaceholder": "например, rtsp://user:pass@192.168.1.100/stream", + "deleteStream": "Удалить поток", + "deleteStreamConfirm": "Вы уверены, что хотите удалить поток «{{streamName}}»? Камеры, ссылающиеся на этот поток, могут перестать работать.", + "noStreams": "Потоки go2rtc не настроены. Добавьте поток, чтобы начать.", + "validation": { + "nameRequired": "Необходимо указать имя камеры", + "nameDuplicate": "Поток с таким названием уже существует", + "nameInvalid": "Имя потока может содержать только буквы, цифры, символы подчеркивания и дефисы", + "urlRequired": "Требуется хотя бы один URL" + }, + "renameStream": "Переименовать поток", + "renameStreamDesc": "Введите новое имя для этого потока. Переименование потока может привести к поломке камер или других потоков, ссылающихся на него по имени.", + "newStreamName": "Новое название потока", + "ffmpeg": { + "useFfmpegModule": "Использовать режим совместимости (FFmpeg)", + "video": "Видео", + "audio": "Аудио", + "hardware": "Аппаратное ускорение", + "videoCopy": "Копировать", + "videoH264": "Перекодировать в H.264", + "videoH265": "Перекодировать в H.265", + "videoExclude": "Исключать", + "audioCopy": "Копировать", + "audioAac": "Перекодировать в AAC", + "audioOpus": "Перекодировать в Opus", + "audioPcmu": "Перекодировать в PCM μ-law", + "audioPcma": "Перекодировать в PCM A-law", + "audioPcm": "Перекодировать в PCM", + "audioMp3": "Перекодировать в MP3", + "audioExclude": "Исключать", + "hardwareNone": "Нет аппаратного ускорения", + "hardwareAuto": "Автоматический (рекомендуется)", + "hardwareVaapi": "VAAPI", + "hardwareCuda": "CUDA", + "hardwareV4l2m2m": "V4L2 M2M", + "hardwareDxva2": "DXVA2", + "hardwareVideotoolbox": "VideoToolbox", + "addVideoCodec": "Добавить видеокодек", + "addAudioCodec": "Добавить аудиокодек", + "removeCodec": "Удалить кодек" + } + }, + "birdseye": { + "trackingMode": { + "objects": "Объекты", + "motion": "Движение", + "continuous": "Непрерывно" + }, + "cameraOrder": { + "label": "Порядок камер", + "description": "Перетащите камеры, чтобы задать их порядок в макете Birdseye.", + "reorderHandle": "Перетащите для изменения порядка", + "saving": "Сохранение…", + "saved": "Сохранено" + } + }, + "retainMode": { + "all": "Все", + "motion": "Движение", + "active_objects": "Активные объекты" + }, + "previewQuality": { + "very_high": "Очень высокое", + "high": "Высокое", + "medium": "Среднее", + "low": "Низкое", + "very_low": "Очень низкое" + }, + "ui": { + "timeFormat": { + "browser": "Браузер", + "12hour": "12 часовой", + "24hour": "24 часовой" + }, + "unitSystem": { + "metric": "Метрическая", + "imperial": "Имперская" + } + }, + "review": { + "imageSource": { + "recordings": "Записи", + "previews": "Превью" + } + }, + "logger": { + "logLevel": { + "debug": "Отладочный", + "info": "Инфо", + "warning": "Предупреждение", + "error": "Ошибка", + "critical": "Критический" + } + }, + "onvif": { + "profileAuto": "Авто", + "profileLoading": "Загрузка профилей…", + "autotracking": { + "zooming": { + "disabled": "Отключено", + "absolute": "Абсолютное", + "relative": "Относительное" + } + } + }, + "modelSize": { + "small": "Малая", + "large": "Большая" + }, + "configMessages": { + "review": { + "recordDisabled": "Запись отключена, элементы обзора создаваться не будут.", + "detectDisabled": "Обнаружение объектов отключено. Для просмотра элементов требуются обнаруженные объекты для классификации предупреждений и обнаружений.", + "allNonAlertDetections": "Все действия, не связанные с оповещением, будут учитываться как обнаружения.", + "genaiImageSourceRecordingsRecordDisabled": "В качестве источника изображения выбрано «запись», но запись отключена. Frigate вернется к предварительному просмотру изображений." + }, + "audio": { + "noAudioRole": "Ни для одного потока не определена роль аудио. Для работы обнаружения звука необходимо включить роль звука." + }, + "audioTranscription": { + "audioDetectionDisabled": "Обнаружение звука не включено для этой камеры. Для транскрипции звука необходимо, чтобы обнаружение звука было активным." + }, + "detect": { + "fpsGreaterThanFive": "Не рекомендуется устанавливать значение обнаружения FPS выше 5. Более высокие значения могут вызвать проблемы с производительностью и не принесут никакой пользы.", + "disabled": "Обнаружение объектов отключено. Снимки, элементы обзора и обогащения, такие как распознавание лиц, распознавание номерных знаков и генеративный искусственный интеллект, не будут работать.", + "resolutionShouldBeMultipleOfFour": "Для достижения наилучших результатов ширина и высота обнаружения должны быть кратны 4. Другие четные значения могут привести к визуальным артефактам или небольшим искажениям в потоке обнаружения.", + "aspectRatioMismatch": "Введенные вами ширина и высота не соответствуют соотношению сторон вашего текущего разрешения обнаружения. Это может привести к растягиванию или искажению изображения.", + "maxFramesSet": "Установка максимального количества кадров отменяет поведение по умолчанию и отключает отслеживание неподвижных объектов. Ситуаций, когда это необходимо, очень мало, используйте с осторожностью.", + "squareResolution": "Разрешение обнаружения квадратов необычно. Ширина и высота обнаружения должны соответствовать соотношению сторон вашей камеры (например, 16:9), а не размерам модели обнаружения объекта. Несовпадающее соотношение сторон может растянуть изображение и снизить точность обнаружения.", + "resolutionHigh": "Это разрешение обнаружения выше рекомендуемого и может привести к увеличению использования ресурсов без повышения точности обнаружения. Для большинства камер рекомендуется разрешение обнаружения 1080p или ниже.", + "globalResolutionMultipleCameras": "Глобальное разрешение обнаружения устанавливается при настройке нескольких камер. Если все камеры не имеют одинакового разрешения и соотношения сторон, ширина и высота обнаружения должны быть определены для каждой камеры, чтобы соответствовать собственному соотношению сторон каждой камеры." + }, + "model": { + "optimizedFor320": "Frigate оптимизирован для модели 320x320, которая является лучшим выбором для большинства настроек. Модель 640x640 работает медленнее и помогает только в определенных сценариях.", + "inputDimensionsNotDetectResolution": "Входная ширина и высота модели — это входные размеры модели обнаружения объектов, а не разрешение обнаружения вашей камеры. Они должны соответствовать размерам используемой вами модели — обычно квадратного размера, например 320x320 или 640x640." + }, + "ffmpeg": { + "hwaccelManualNotRecommended": "Аргументы аппаратного ускорения вручную не рекомендуются. Если не существует особых требований, выберите предустановку, соответствующую вашему оборудованию.", + "inputsMissingGo2rtcStream": "Один из входных потоков ниже указывает на рестрим go2rtc, которого больше не существует. Выберите существующий рестрим или введите URL камеры вручную, иначе камера не сможет подключиться." + }, + "objects": { + "genaiNoDescriptionsProvider": "Для создания описаний необходимо настроить поставщика GenAI с ролью «описания»." + }, + "faceRecognition": { + "globalDisabled": "Расширение распознавания лиц должно быть включено, чтобы функции распознавания лиц работали на этой камере.", + "personNotTracked": "Распознавание лиц требует отслеживания объекта «человек». Включите «человек» в объектах для этой камеры.", + "modelSizeLarge": "«Большая» модель требует GPU или NPU для обеспечения приемлемой производительности. Используйте слово «small» в системах, поддерживающих только CPU." + }, + "lpr": { + "globalDisabled": "Для работы функций LPR на этой камере необходимо включить расширение распознавания номерных знаков.", + "vehicleNotTracked": "Распознавание номерных знаков требует отслеживания «автомобиля» или «мотоцикла». Включите «автомобиль» или «мотоцикл» в объектах для этой камеры.", + "modelSizeLarge": "«Большая» модель оптимизирована для многострочных номерных знаков. «Маленькая» модель обеспечивает лучшую производительность по сравнению с «большой», и ее следует использовать, если в вашем регионе не используются форматы многострочных табличек." + }, + "record": { + "noRecordRole": "Ни для одного потока не определена роль записи. Запись не будет работать." + }, + "birdseye": { + "objectsModeDetectDisabled": "Birdseye установлен в режим «объекты», но обнаружение объектов для этой камеры отключено. Камера не появится в Birdseye." + }, + "snapshots": { + "detectDisabled": "Обнаружение объектов отключено. Снимки создаются на основе отслеживаемых объектов и не создаются." + }, + "detectors": { + "mixedTypes": "Все детекторы должны использовать один и тот же тип. Удалите существующие детекторы, чтобы использовать другой тип.", + "mixedTypesSuggestion": "Все детекторы должны использовать один и тот же тип. Удалите существующие детекторы или выберите {{type}}." + }, + "semanticSearch": { + "jinav2SmallModelSize": "«Маленький» размер модели Jina V2 имеет большой объем оперативной памяти и стоимость вывода. Рекомендуется «большая» модель с дискретным GPU." + }, + "onvif": { + "autotrackingNoZones": "Для автослежения требуется хотя бы одна зона. Определите зону для этой камеры в Масках/Зонах, затем установите ее как обязательную зону ниже." } } } diff --git a/web/public/locales/ru/views/system.json b/web/public/locales/ru/views/system.json index 887678a201..e00e9b0dba 100644 --- a/web/public/locales/ru/views/system.json +++ b/web/public/locales/ru/views/system.json @@ -52,9 +52,15 @@ "camera": "Камера", "all_cameras": "Все камеры", "cameras_count_one": "{{count}} камера", - "cameras_count_other": "{{count}} камеры" + "cameras_count_other": "{{count}} камеры", + "reviews": "Проверки" }, - "empty": "Сообщения ещё не были получены" + "empty": "Сообщения ещё не были получены", + "count_one": "{{count}} сообщение", + "count_other": "{{count}} сообщения", + "expanded": { + "payload": "Содержимое" + } } }, "general": { @@ -103,7 +109,10 @@ "title": "Предупреждение: статистика Intel GPU", "message": "Статистика GPU недоступна", "description": "Это известная ошибка в инструментах отчетности статистики Intel GPU (intel_gpu_top), из-за которой они ломаются и постоянно возвращают уровень использования GPU 0%, даже в случаях, когда аппаратное ускорение и обнаружение объектов корректно работают на (i)GPU. Это не ошибка Frigate. Вы можете перезапустить хост-систему, чтобы временно устранить проблему и убедиться, что GPU работает правильно. На производительность это не влияет." - } + }, + "gpuCompute": "Вычисления / кодирование GPU", + "gpuTemperature": "Температура GPU", + "npuTemperature": "Температура NPU" }, "otherProcesses": { "title": "Другие процессы", @@ -113,7 +122,7 @@ "go2rtc": "go2rtc", "recording": "запись", "review_segment": "сегмент обзора", - "embeddings": "вложения", + "embeddings": "эмбеддинги", "audio_detector": "аудиодетектор" } } @@ -140,7 +149,11 @@ }, "shm": { "title": "Выделение разделяемой памяти", - "warning": "Текущеее значение разделяемой памяти в {{total}}MB слишком мало. Увеличьте его хотя бы до {{min_shm}}MB." + "warning": "Текущее значение разделяемой памяти в {{total}}MB слишком мало. Увеличьте его хотя бы до {{min_shm}}MB.", + "frameLifetime": { + "title": "Время жизни кадра", + "description": "У каждой камеры в разделяемой памяти {{frames}} слотов кадров. При частоте кадров самой быстрой камеры каждый кадр доступен примерно {{lifetime}} с, пока его не перезапишут." + } } }, "cameras": { @@ -161,7 +174,22 @@ "tips": { "title": "Информация о тестировании камеры" }, - "aspectRatio": "соотношение сторон" + "aspectRatio": "соотношение сторон", + "keyframes": { + "title": "Анализ ключевых кадров", + "analyzing": "Анализ ключевых кадров… осталось {{seconds}} с", + "stillAnalyzing": "Анализ ключевых кадров ещё идёт…", + "recordStream": "Поток записи:", + "keyframeCount": "Наблюдалось ключевых кадров:", + "observedDuration": "Наблюдаемая длительность:", + "gap": "Интервал ключевых кадров (мин / сред / макс):", + "segmentLength": "Длина сегмента записи:", + "ok": "Ключевые кадры примерно каждые {{seconds}} с, этого достаточно для записи и воспроизведения.", + "warning": "Редкие или неравномерные ключевые кадры (самый длинный интервал ~{{seconds}} с), вероятно включён smart-кодек (H.264+/H.265+), это не рекомендуется.", + "error": "Интервал ключевых кадров (~{{seconds}} с) больше длины сегмента записи ({{segmentTime}} с). В части сегментов может не быть ключевого кадра, из-за этого ломается воспроизведение. Отключите smart/+ кодек на камере или уменьшите интервал ключевых кадров.", + "unknown": "Не удалось определить интервал ключевых кадров.", + "recordDisabled": "Запись для этой камеры отключена." + } }, "framesAndDetections": "Кадры/детекции", "label": { @@ -178,7 +206,8 @@ "overallSkippedDetectionsPerSecond": "общее количество пропущенных обнаружений в секунду", "cameraFfmpeg": "{{camName}} FFmpeg", "cameraCapture": "{{camName}} захват", - "cameraDetect": "{{camName}} обнаружения" + "cameraDetect": "{{camName}} обнаружения", + "cameraGpu": "{{camName}} GPU" }, "toast": { "success": { @@ -187,6 +216,20 @@ "error": { "unableToProbeCamera": "Не удалось протестировать камеру: {{errorMessage}}" } + }, + "noCameras": { + "title": "Камеры не найдены" + }, + "connectionQuality": { + "title": "Качество соединения", + "excellent": "Отлично", + "fair": "Нормально", + "poor": "Плохо", + "unusable": "Непригодно", + "fps": "FPS", + "expectedFps": "Ожидаемый FPS", + "reconnectsLastHour": "Переподключения (за последний час)", + "stallsLastHour": "Зависания (за последний час)" } }, "lastRefreshed": "Обновлено: ", @@ -195,10 +238,11 @@ "detectHighCpuUsage": "Камера {{camera}} использует слишком много ресурсов CPU для детекции ({{detectAvg}}%)", "healthy": "Система в порядке", "reindexingEmbeddings": "Переиндексация эмбеддингов (выполнено {{processed}} %)", - "cameraIsOffline": "{{camera}} отключена", + "cameraIsOffline": "{{camera}} не в сети", "detectIsVerySlow": "{{detect}} идёт очень медленно ({{speed}} мс)", "detectIsSlow": "{{detect}} идёт медленно ({{speed}} мс)", - "shmTooLow": "Объем выделенной памяти /dev/shm ({{total}} МБ) должен быть увеличен как минимум до {{min}} МБ." + "shmTooLow": "Объем выделенной памяти /dev/shm ({{total}} МБ) должен быть увеличен как минимум до {{min}} МБ.", + "debugReplayActive": "Активна сессия отладочного повтора" }, "enrichments": { "title": "Обогащение данных",