diff --git a/web/public/locales/ru/common.json b/web/public/locales/ru/common.json index 341cad236..0de87d293 100644 --- a/web/public/locales/ru/common.json +++ b/web/public/locales/ru/common.json @@ -88,7 +88,9 @@ "12hour": "d MMM, yyyy", "24hour": "d MMM, yyyy" }, - "inProgress": "В процессе" + "inProgress": "В процессе", + "invalidStartTime": "Некорректное время начала", + "invalidEndTime": "Некорректное время окончания" }, "selectItem": "Выбрать {{item}}", "button": { @@ -126,7 +128,8 @@ "unselect": "Снять выбор", "export": "Экспортировать", "deleteNow": "Удалить сейчас", - "next": "Следующий" + "next": "Следующий", + "continue": "Продолжить" }, "label": { "back": "Вернуться", diff --git a/web/public/locales/ru/components/dialog.json b/web/public/locales/ru/components/dialog.json index a1dc88e86..b935670c2 100644 --- a/web/public/locales/ru/components/dialog.json +++ b/web/public/locales/ru/components/dialog.json @@ -70,7 +70,8 @@ "failed": "Не удалось запустить экспорт: {{error}}", "noVaildTimeSelected": "Не выбран допустимый временной диапазон", "endTimeMustAfterStartTime": "Время окончания должно быть после времени начала" - } + }, + "view": "Просмотр" }, "fromTimeline": { "saveExport": "Сохранить экспорт", diff --git a/web/public/locales/ru/components/filter.json b/web/public/locales/ru/components/filter.json index 0b75d2347..095ea91ba 100644 --- a/web/public/locales/ru/components/filter.json +++ b/web/public/locales/ru/components/filter.json @@ -133,5 +133,9 @@ }, "count_one": "{{count}} класс", "count_other": "{{count}} классы" + }, + "attributes": { + "label": "Атрибуты классификации", + "all": "Все атрибуты" } } diff --git a/web/public/locales/ru/views/classificationModel.json b/web/public/locales/ru/views/classificationModel.json index 1017128fe..b5b7e2222 100644 --- a/web/public/locales/ru/views/classificationModel.json +++ b/web/public/locales/ru/views/classificationModel.json @@ -1,7 +1,9 @@ { - "documentTitle": "Модели классификации", + "documentTitle": "Классификация моделей - Frigate", "details": { - "scoreInfo": "Оценка представляет собой среднюю степень достоверности классификации по всем обнаружениям данного объекта." + "scoreInfo": "Оценка представляет собой среднюю степень достоверности классификации по всем обнаружениям данного объекта.", + "none": "Нет", + "unknown": "Неизвестно" }, "button": { "deleteClassificationAttempts": "Удалить изображения классификации", @@ -31,7 +33,7 @@ "deleteCategoryFailed": "Не удалось удалить класс: {{errorMessage}}", "deleteModelFailed": "Не удалось удалить модель: {{errorMessage}}", "categorizeFailed": "Не удалось классифицировать изображение: {{errorMessage}}", - "trainingFailed": "Не удалось начать обучение модели: {{errorMessage}}", + "trainingFailed": "Ошибка обучения модели. Проверьте логи Frigate для получения подробной информации.", "updateModelFailed": "Не удалось обновить модель: {{errorMessage}}", "renameCategoryFailed": "Не удалось переименовать класс: {{errorMessage}}", "trainingFailedToStart": "Не удалось начать обучение модели: {{errorMessage}}" @@ -39,7 +41,9 @@ }, "deleteCategory": { "title": "Удалить класс", - "desc": "Вы уверены, что хотите удалить класс {{name}}? Это приведёт к безвозвратному удалению всех связанных с ним изображений и потребует повторного обучения модели." + "desc": "Вы уверены, что хотите удалить класс {{name}}? Это приведёт к безвозвратному удалению всех связанных с ним изображений и потребует повторного обучения модели.", + "minClassesTitle": "Не удалось удалить класс", + "minClassesDesc": "Модель классификации должна содержать как минимум 2 класса. Добавьте ещё один класс перед удалением этого." }, "deleteModel": { "title": "Удалить модель классификации", @@ -75,7 +79,7 @@ }, "train": { "title": "Недавние классификации", - "titleShort": "Недавние", + "titleShort": "Недавнее", "aria": "Выбрать недавние классификации" }, "categories": "Классы", @@ -135,7 +139,8 @@ "classesUnique": "Имена классов должны быть уникальными", "stateRequiresTwoClasses": "Модели состояний требуют не менее 2 классов", "objectLabelRequired": "Пожалуйста, выберите метку объекта", - "objectTypeRequired": "Пожалуйста, выберите тип классификации" + "objectTypeRequired": "Пожалуйста, выберите тип классификации", + "noneNotAllowed": "Класс 'нет' не допускается" } }, "step2": { @@ -167,7 +172,22 @@ "generationFailed": "Генерация не удалась. Пожалуйста, попробуйте снова.", "classifyFailed": "Не удалось классифицировать изображения: {{error}}" }, - "generateSuccess": "Примеры изображений успешно сгенерированы" + "generateSuccess": "Примеры изображений успешно сгенерированы", + "allImagesRequired_one": "Пожалуйста, классифицируйте все изображения. Осталось {{count}} изображение.", + "allImagesRequired_few": "Пожалуйста, классифицируйте все изображения. Осталось {{count}} изображения.", + "allImagesRequired_many": "Пожалуйста, классифицируйте все изображения. Осталось {{count}} изображений.", + "modelCreated": "Модель успешно создана. Используйте раздел \"Последние классификации\", чтобы добавить изображения для отсутствующих состояний, а затем обучите модель.", + "missingStatesWarning": { + "title": "Примеры отсутствующих состояний", + "description": "Рекомендуется выбрать примеры для всех состояний для достижения наилучших результатов. Вы можете продолжить, не выбрав все состояния, но модель не будет обучена, пока для всех состояний не появятся изображения. После продолжения используйте раздел «Последние классификации», чтобы классифицировать изображения для отсутствующих состояний, а затем обучите модель." + } } - } + }, + "tooltip": { + "trainingInProgress": "Модель в данный момент обучается", + "noNewImages": "Нет новых изображений для обучения. Сначала классифицируйте больше изображений в наборе данных.", + "noChanges": "В наборе данных не было изменений с момента последнего обучения.", + "modelNotReady": "Модель не готова к обучению" + }, + "none": "Нет" } diff --git a/web/public/locales/ru/views/events.json b/web/public/locales/ru/views/events.json index c54e54262..16fe307ca 100644 --- a/web/public/locales/ru/views/events.json +++ b/web/public/locales/ru/views/events.json @@ -41,8 +41,8 @@ "detail": { "noDataFound": "Нет данных для просмотра", "aria": "Переключить подробный режим просмотра", - "trackedObject_one": "объект", - "trackedObject_other": "объекты", + "trackedObject_one": "{{count}} объект", + "trackedObject_other": "{{count}} объекта", "noObjectDetailData": "Данные о деталях объекта недоступны.", "label": "Деталь", "settings": "Настройки подробного просмотра", @@ -56,5 +56,9 @@ "clickToSeek": "Перейти к этому моменту" }, "zoomIn": "Увеличить", - "zoomOut": "Отдалить" + "zoomOut": "Отдалить", + "select_all": "Всё", + "normalActivity": "Нормальный", + "needsReview": "Требуется ревью", + "securityConcern": "Вопрос безопасности" } diff --git a/web/public/locales/ru/views/explore.json b/web/public/locales/ru/views/explore.json index 18c211a95..3247544f5 100644 --- a/web/public/locales/ru/views/explore.json +++ b/web/public/locales/ru/views/explore.json @@ -49,13 +49,15 @@ "updatedSublabel": "Успешно обновлена дополнительная метка.", "updatedLPR": "Номерной знак успешно обновлён.", "regenerate": "Новое описание запрошено у {{provider}}. В зависимости от скорости работы вашего провайдера, генерация нового описания может занять некоторое время.", - "audioTranscription": "Запрос на транскрипцию звука успешно выполнен." + "audioTranscription": "Запрос на расшифровку аудио успешно отправлен. В зависимости от скорости вашего сервера Frigate, расшифровка может занять некоторое время.", + "updatedAttributes": "Атрибуты успешно обновлены." }, "error": { "updatedSublabelFailed": "Не удалось обновить дополнительную метку: {{errorMessage}}", "updatedLPRFailed": "Не удалось обновить номерной знак: {{errorMessage}}", "regenerate": "Не удалось запросить новое описание у {{provider}}: {{errorMessage}}", - "audioTranscription": "Не удалось запросить транскрипцию аудио: {{errorMessage}}" + "audioTranscription": "Не удалось запросить транскрипцию аудио: {{errorMessage}}", + "updatedAttributesFailed": "Не удалось обновить атрибуты: {{errorMessage}}" } } }, @@ -103,7 +105,12 @@ }, "score": { "label": "Оценка" - } + }, + "editAttributes": { + "title": "Редактировать атрибуты", + "desc": "Выберите атрибуты классификации для этого {{label}}" + }, + "attributes": "Атрибуты классификации" }, "trackedObjectDetails": "Детали объекта", "type": { @@ -111,7 +118,8 @@ "snapshot": "снимок", "video": "видео", "object_lifecycle": "жизненный цикл объекта", - "thumbnail": "миниатюра" + "thumbnail": "миниатюра", + "tracking_details": "подробности отслеживания" }, "objectLifecycle": { "title": "Жизненный цикл объекта", @@ -207,6 +215,10 @@ }, "hideObjectDetails": { "label": "Скрыть путь объекта" + }, + "downloadCleanSnapshot": { + "label": "Скачать чистый снимок", + "aria": "Скачать чистый снимок" } }, "dialog": { @@ -262,7 +274,8 @@ "header": { "zones": "Зоны", "ratio": "Соотношение", - "area": "Область" + "area": "Область", + "score": "Оценка" } }, "annotationSettings": { @@ -277,7 +290,7 @@ "millisecondsToOffset": "Смещение аннотаций детекции в миллисекундах. По умолчанию: 0", "tips": "Уменьшите значение, если воспроизведение видео опережает рамки и точки пути, и увеличьте значение, если воспроизведение видео отстаёт от них. Это значение может быть отрицательным.", "toast": { - "success": "Смещение аннотаций для {{camera}} сохранено в конфигурационном файле. Перезапустите Frigate, чтобы применить изменения." + "success": "Смещение аннотаций для {{camera}} сохранено в конфигурационном файле." } } }, diff --git a/web/public/locales/ru/views/faceLibrary.json b/web/public/locales/ru/views/faceLibrary.json index ee8d702fb..90aa901d1 100644 --- a/web/public/locales/ru/views/faceLibrary.json +++ b/web/public/locales/ru/views/faceLibrary.json @@ -30,7 +30,8 @@ "train": { "aria": "Выберите последние распознавания", "title": "Последние распознавания", - "empty": "Нет недавних попыток распознавания лиц" + "empty": "Нет недавних попыток распознавания лиц", + "titleShort": "Недавнее" }, "toast": { "success": { diff --git a/web/public/locales/ru/views/live.json b/web/public/locales/ru/views/live.json index 8a189bf76..9cda2d3c9 100644 --- a/web/public/locales/ru/views/live.json +++ b/web/public/locales/ru/views/live.json @@ -87,7 +87,7 @@ }, "manualRecording": { "title": "По требованию", - "tips": "Создать ручное событие на основе настроек хранения записей этой камеры.", + "tips": "Скачать моментальный снимок или создать ручное событие, исходя из настроек хранения записей для этой камеры.", "playInBackground": { "label": "Воспроизведение в фоне", "desc": "Включите эту опцию, чтобы продолжать трансляцию при скрытом плеере." @@ -134,7 +134,7 @@ "tips": "Включите эту опцию, чтобы продолжать трансляцию при скрытом плеере." }, "debug": { - "picker": "В режиме отладки выбор потока камеры недоступен. Вид отладчика всегда использует поток настроенный для режима обнаружения." + "picker": "Выбор потока недоступен в режиме отладки. В отладочном представлении всегда используется поток, назначенный на роль обнаружения." } }, "cameraSettings": { @@ -172,12 +172,18 @@ "disable": "Выключить транскрипцию звука" }, "snapshot": { - "noVideoSource": "Нет видеоисточника для снимка", - "captureFailed": "Не удалось сделать снимок." + "noVideoSource": "Нет видеоисточника для снимка.", + "captureFailed": "Не удалось сделать снимок.", + "takeSnapshot": "Скачать моментальный снимок", + "downloadStarted": "Загрузка снимка началась." }, "noCameras": { "title": "Камеры не настроены", "description": "Начните с подключения камеры к Frigate.", - "buttonText": "Добавить камеру" + "buttonText": "Добавить камеру", + "restricted": { + "title": "Нет доступных камер", + "description": "У вас нет разрешения на просмотр камер в этой группе." + } } } diff --git a/web/public/locales/ru/views/search.json b/web/public/locales/ru/views/search.json index 0c7f8477f..cf90fb152 100644 --- a/web/public/locales/ru/views/search.json +++ b/web/public/locales/ru/views/search.json @@ -26,7 +26,8 @@ "max_speed": "Макс. скорость", "has_clip": "Есть клип", "has_snapshot": "Есть снимок", - "labels": "Метки" + "labels": "Метки", + "attributes": "Атрибуты" }, "searchType": { "thumbnail": "Миниатюра", diff --git a/web/public/locales/ru/views/settings.json b/web/public/locales/ru/views/settings.json index 7044dc7e8..504c51178 100644 --- a/web/public/locales/ru/views/settings.json +++ b/web/public/locales/ru/views/settings.json @@ -167,7 +167,12 @@ "setPassword": "Установить пароль", "desc": "Создайте надежный пароль для защиты аккаунта.", "cannotBeEmpty": "Пароль не может быть пустым", - "doNotMatch": "Пароли не совпадают" + "doNotMatch": "Пароли не совпадают", + "currentPasswordRequired": "Текущий пароль обязателен", + "incorrectCurrentPassword": "Текущий пароль указан неверно", + "passwordVerificationFailed": "Не удалось проверить пароль", + "multiDeviceWarning": "Все остальные устройства, на которых вы вошли в систему, потребуют повторного входа в течение {{refresh_time}}.", + "multiDeviceAdmin": "Вы также можете принудительно заставить всех пользователей повторно пройти аутентификацию немедленно, обновив свой JWT-секрет." }, "deleteUser": { "warn": "Вы уверены, что хотите удалить пользователя {{username}}?", @@ -182,7 +187,8 @@ "viewer": "Наблюдатель", "viewerDesc": "Доступны только панель мониторинга, обзор событий, поиск и экспорт данных.", "admin": "Администратор", - "adminDesc": "Полный доступ ко всем функциям." + "adminDesc": "Полный доступ ко всем функциям.", + "customDesc": "Роль с настраиваемыми правами доступа к определённым камерам." }, "select": "Выбрать роль" }, @@ -207,7 +213,16 @@ "veryStrong": "Очень сложный" }, "match": "Пароли совпадают", - "notMatch": "Пароли не совпадают" + "notMatch": "Пароли не совпадают", + "show": "Показать пароль", + "hide": "Скрыть пароль", + "requirements": { + "title": "Требования к паролю:", + "length": "Не менее 8 символов", + "uppercase": "Как минимум одна заглавная буква", + "digit": "Как минимум одна цифра", + "special": "Хотя бы один специальный символ (!@#$%^&*(),.?\":{}|<>)" + } }, "newPassword": { "title": "Новый пароль", @@ -217,7 +232,11 @@ "placeholder": "Введите новый пароль" }, "usernameIsRequired": "Необходимо ввести имя пользователя", - "passwordIsRequired": "Требуется пароль" + "passwordIsRequired": "Требуется пароль", + "currentPassword": { + "title": "Текущий пароль", + "placeholder": "Введите ваш текущий пароль" + } }, "createUser": { "title": "Создать нового пользователя", @@ -244,7 +263,7 @@ "table": { "username": "Имя пользователя", "actions": "Действия", - "password": "Пароль", + "password": "Сбросить пароль", "noUsers": "Пользователей не найдено.", "changeRole": "Изменить роль пользователя", "role": "Роль", @@ -254,7 +273,7 @@ "title": "Управление пользователями", "desc": "Управление учетными записями пользователей Frigate." }, - "updatePassword": "Обновить пароль", + "updatePassword": "Сбросить пароль", "addUser": "Добавить пользователя" }, "notification": { @@ -414,7 +433,7 @@ "name": { "title": "Название", "inputPlaceHolder": "Введите название…", - "tips": "Имя должно содержать не менее 2 символов, включать хотя бы одну букву и не совпадать с названием камеры или другой зоны." + "tips": "Имя должно содержать не менее 2 символов, включать хотя бы одну букву и не должно совпадать с названием камеры или другой зоны на этой камере." }, "inertia": { "title": "Инерция", @@ -436,7 +455,7 @@ "desc": "Задаёт минимальную скорость объектов для учёта в этой зоне." }, "toast": { - "success": "Зона ({{zoneName}}) сохранена. Перезапустите Frigate для применения изменений." + "success": "Зона ({{zoneName}}) сохранена." } }, "motionMasks": { @@ -463,8 +482,8 @@ "documentTitle": "Редактирование маски движения - Frigate", "toast": { "success": { - "title": "{{polygonName}} сохранена. Перезапустите Frigate для применения изменений.", - "noName": "Маска движения сохранена. Перезапустите Frigate для применения изменений." + "title": "{{polygonName}} сохранена.", + "noName": "Маска движения сохранена." } } }, @@ -551,8 +570,8 @@ }, "toast": { "success": { - "title": "{{polygonName}} сохранена. Перезапустите Frigate для применения изменений.", - "noName": "Маска объектов сохранена. Перезапустите Frigate для применения изменений." + "title": "{{polygonName}} сохранена.", + "noName": "Маска объектов сохранена." } } }, @@ -753,7 +772,7 @@ "triggers": { "documentTitle": "Триггеры", "management": { - "title": "Управление триггерами", + "title": "Триггеры", "desc": "Управление триггерами для камеры {{camera}}. Используйте тип миниатюры для срабатывания по миниатюрам, похожим на выбранный отслеживаемый объект, и тип описания для срабатывания по описаниям, похожим на указанный вами текст." }, "addTrigger": "Добавить Триггер", @@ -774,7 +793,9 @@ }, "actions": { "alert": "Отметить как предупреждение", - "notification": "Отправить оповещение" + "notification": "Отправить оповещение", + "sub_label": "Добавить подметку", + "attribute": "Добавить атрибут" }, "dialog": { "createTrigger": { @@ -792,25 +813,28 @@ "form": { "name": { "title": "Имя", - "placeholder": "Введите имя триггера", + "placeholder": "Назовите этот триггер", "error": { - "minLength": "Имя должно быть длиной не менее 2 символов.", - "invalidCharacters": "Имя может содержать только буквы, цифры, символы подчеркивания и дефисы.", + "minLength": "Поле должно содержать не менее 2 символов.", + "invalidCharacters": "Поле может содержать только буквы, цифры, символы подчеркивания и дефисы.", "alreadyExists": "Триггер с таким именем уже существует для этой камеры." - } + }, + "description": "Введите уникальное имя или описание для идентификации этого триггера" }, "enabled": { "description": "Включить или отключить этот триггер" }, "type": { "title": "Тип", - "placeholder": "Выберите тип триггера" + "placeholder": "Выберите тип триггера", + "description": "Срабатывать при обнаружении похожего описания отслеживаемого объекта", + "thumbnail": "Срабатывать при обнаружении похожей миниатюры отслеживаемого объекта" }, "content": { "title": "Содержимое", - "imagePlaceholder": "Выберите изображение", + "imagePlaceholder": "Выберите миниатюру", "textPlaceholder": "Введите текстовое содержимое", - "imageDesc": "Выберите изображение, чтобы активировать это действие при обнаружении похожего изображения.", + "imageDesc": "Отображаются только 100 последних миниатюр. Если вы не можете найти нужную миниатюру, просмотрите предыдущие объекты в разделе \"Обзор\" и настройте триггер оттуда через меню.", "textDesc": "Введите текст, чтобы активировать это действие при обнаружении похожего описания отслеживаемого объекта.", "error": { "required": "Требуется содержимое." @@ -821,11 +845,12 @@ "error": { "min": "Порог должен быть не менее 0", "max": "Порог должен быть не более 1" - } + }, + "desc": "Установите порог схожести для этого триггера. Более высокое значение требует более точного совпадения для срабатывания триггера." }, "actions": { "title": "Действия", - "desc": "По умолчанию Frigate отправляет MQTT-сообщение для всех триггеров. Выберите дополнительное действие, которое будет выполняться при срабатывании этого триггера.", + "desc": "По умолчанию Frigate отправляет MQTT-сообщение для всех триггеров. Подметки добавляют имя триггера к метке объекта. Атрибуты — это доступные для поиска метаданные, хранящиеся отдельно в метаданных отслеживаемого объекта.", "error": { "min": "Необходимо выбрать хотя бы одно действие." } @@ -852,6 +877,23 @@ "semanticSearch": { "title": "Семантический поиск выключен", "desc": "Для использования триггеров необходимо включить семантический поиск." + }, + "wizard": { + "title": "Создать триггер", + "step1": { + "description": "Настройте основные параметры вашего триггера." + }, + "step2": { + "description": "Настройте содержимое, которое будет активировать это действие." + }, + "step3": { + "description": "Настройте порог и действия для этого триггера." + }, + "steps": { + "nameAndType": "Имя и тип", + "configureData": "Настроить данные", + "thresholdAndActions": "Порог и действия" + } } }, "cameraWizard": { @@ -878,7 +920,7 @@ "testFailed": "Тест потока не удался: {{error}}" }, "step1": { - "description": "Введите данные камеры и проверьте подключение.", + "description": "Введите параметры вашей камеры и выберите: автоматическое определение или ручной выбор производителя.", "cameraName": "Имя камеры", "cameraNamePlaceholder": "Например, front_door или Обзор заднего двора", "host": "Хост/IP-адрес", @@ -1134,6 +1176,10 @@ "required": "Необходимо выбрать хотя бы одну камеру." } } + }, + "management": { + "title": "Управление ролями наблюдателя", + "desc": "Управление пользовательскими ролями наблюдателя и их правами доступа к камерам для этого экземпляра Frigate." } }, "cameraManagement": { diff --git a/web/public/locales/ru/views/system.json b/web/public/locales/ru/views/system.json index ad2b914ac..f3f7a3d95 100644 --- a/web/public/locales/ru/views/system.json +++ b/web/public/locales/ru/views/system.json @@ -76,7 +76,12 @@ } }, "npuMemory": "Память NPU", - "npuUsage": "Использование NPU" + "npuUsage": "Использование NPU", + "intelGpuWarning": { + "title": "Предупреждение: статистика Intel GPU", + "message": "Статистика GPU недоступна", + "description": "Это известная ошибка в инструментах отчетности статистики Intel GPU (intel_gpu_top), из-за которой они ломаются и постоянно возвращают уровень использования GPU 0%, даже в случаях, когда аппаратное ускорение и обнаружение объектов корректно работают на (i)GPU. Это не ошибка Frigate. Вы можете перезапустить хост-систему, чтобы временно устранить проблему и убедиться, что GPU работает правильно. На производительность это не влияет." + } }, "otherProcesses": { "title": "Другие процессы", @@ -180,7 +185,17 @@ "yolov9_plate_detection": "Обнаружение номеров YOLOv9", "face_recognition": "Распознавание лиц", "plate_recognition": "Распознавание номеров", - "image_embedding": "Векторизация изображений" - } + "image_embedding": "Векторизация изображений", + "review_description": "Описание проверки", + "review_description_speed": "Скорость просмотра описания", + "review_description_events_per_second": "Описание проверки", + "object_description": "Описание объекта", + "object_description_speed": "Скорость описания объекта", + "object_description_events_per_second": "Описание объекта", + "classification": "{{name}} Классификация", + "classification_speed": "{{name}}Классификация скорости", + "classification_events_per_second": "{{name}} событий классификации в секунду" + }, + "averageInf": "Среднее время обработки" } }