diff --git a/web/public/locales/ru/audio.json b/web/public/locales/ru/audio.json
index 9f5e58530..e9e6bfc21 100644
--- a/web/public/locales/ru/audio.json
+++ b/web/public/locales/ru/audio.json
@@ -315,7 +315,7 @@
"slam": "Хлопок",
"knock": "Стук",
"tap": "Небольшой стук",
- "squeak": "Скрип",
+ "squeak": "Писк",
"cupboard_open_or_close": "Открытие или закрытие шкафа",
"drawer_open_or_close": "Открытие или закрытие ящика",
"dishes": "Тарелки",
@@ -425,5 +425,79 @@
"pink_noise": "Розовый шум",
"hammer": "Молоток",
"firecracker": "Петарда",
- "television": "Телевидение"
+ "television": "Телевидение",
+ "echo": "Эхо",
+ "noise": "Шум",
+ "mains_hum": "Гул сети",
+ "cacophony": "Какофония",
+ "throbbing": "Пульсирующий",
+ "vibration": "Вибрация",
+ "sodeling": "Соделинг",
+ "chird": "Чирд",
+ "change_ringing": "Перезвон",
+ "shofar": "Шофар",
+ "liquid": "Жидкость",
+ "splash": "Брызги",
+ "slosh": "Плеск",
+ "squish": "Хлюпанье",
+ "drip": "Капля",
+ "pour": "Литьё",
+ "trickle": "Струйка",
+ "gush": "Бурный поток",
+ "fill": "Наполнение",
+ "spray": "Распыление",
+ "pump": "Насос",
+ "stir": "Перемешивание",
+ "boiling": "Кипение",
+ "sonar": "Сонар",
+ "arrow": "Стрела",
+ "whoosh": "Вжух",
+ "thump": "Глухой удар",
+ "thunk": "Тупой удар",
+ "electronic_tuner": "Электронный тюнер",
+ "effects_unit": "Блок эффектов",
+ "chorus_effect": "Эффект хоруса",
+ "basketball_bounce": "Отскок баскетбольного мяча",
+ "bang": "Бах",
+ "slap": "Шлепок",
+ "whack": "Удар",
+ "smash": "Разбивание",
+ "breaking": "Разрушение",
+ "bouncing": "Отскок",
+ "whip": "Хлыст",
+ "flap": "Хлопание",
+ "scratch": "Царапанье",
+ "scrape": "Скребок",
+ "rub": "Трение",
+ "roll": "Качение",
+ "crushing": "Дробление",
+ "crumpling": "Сминание",
+ "tearing": "Разрывание",
+ "beep": "Бип",
+ "ping": "Пинг",
+ "ding": "Динь",
+ "clang": "Лязг",
+ "squeal": "Визг",
+ "creak": "Скрипение",
+ "rustle": "Шуршание",
+ "whir": "Жужжание",
+ "clatter": "Грохот",
+ "sizzle": "Шипение",
+ "clicking": "Щелканье",
+ "clickety_clack": "Щелчок-Клак",
+ "rumble": "Грохотать",
+ "plop": "Плюх",
+ "hum": "Гул",
+ "zing": "Зинг",
+ "boing": "Боинг",
+ "crunch": "Хруст",
+ "sine_wave": "Синусоида",
+ "harmonic": "Гармоника",
+ "chirp_tone": "Тон чириканья",
+ "pulse": "Импульс",
+ "inside": "Внутри",
+ "outside": "Снаружи",
+ "reverberation": "Реверберация",
+ "distortion": "Искажение",
+ "sidetone": "Боковой тон"
}
diff --git a/web/public/locales/ru/common.json b/web/public/locales/ru/common.json
index 8b15aed2a..341cad236 100644
--- a/web/public/locales/ru/common.json
+++ b/web/public/locales/ru/common.json
@@ -87,7 +87,8 @@
"formattedTimestampMonthDayYear": {
"12hour": "d MMM, yyyy",
"24hour": "d MMM, yyyy"
- }
+ },
+ "inProgress": "В процессе"
},
"selectItem": "Выбрать {{item}}",
"button": {
@@ -128,7 +129,12 @@
"next": "Следующий"
},
"label": {
- "back": "Вернуться"
+ "back": "Вернуться",
+ "hide": "Скрыть {{item}}",
+ "show": "Показать {{item}}",
+ "ID": "ID",
+ "all": "Все",
+ "none": "Ничего"
},
"unit": {
"speed": {
@@ -248,7 +254,8 @@
"logout": "Выход",
"setPassword": "Установить пароль"
},
- "appearance": "Внешний вид"
+ "appearance": "Внешний вид",
+ "classification": "Распознование"
},
"pagination": {
"label": "пагинация",
@@ -291,5 +298,14 @@
"readTheDocumentation": "Читать документацию",
"information": {
"pixels": "{{area}}px"
+ },
+ "list": {
+ "two": "{{0}} и {{1}}",
+ "many": "{{items}}, и {{last}}",
+ "separatorWithSpace": ", "
+ },
+ "field": {
+ "optional": "Необязательный",
+ "internalID": "Внутренний идентификатор Frigate, используемый в конфигурации и базе данных"
}
}
diff --git a/web/public/locales/ru/components/dialog.json b/web/public/locales/ru/components/dialog.json
index 748d079db..a1dc88e86 100644
--- a/web/public/locales/ru/components/dialog.json
+++ b/web/public/locales/ru/components/dialog.json
@@ -65,7 +65,7 @@
"export": "Экспорт",
"selectOrExport": "Выбрать или экспортировать",
"toast": {
- "success": "Экспорт успешно запущен. Файл доступен в папке /exports.",
+ "success": "Экспорт успешно запущен. Файл доступен на странице экспорта.",
"error": {
"failed": "Не удалось запустить экспорт: {{error}}",
"noVaildTimeSelected": "Не выбран допустимый временной диапазон",
@@ -120,7 +120,8 @@
"button": {
"export": "Экспорт",
"markAsReviewed": "Пометить как просмотренное",
- "deleteNow": "Удалить сейчас"
+ "deleteNow": "Удалить сейчас",
+ "markAsUnreviewed": "Отметить как непросмотренное"
}
},
"imagePicker": {
@@ -128,6 +129,7 @@
"placeholder": "Искать по метке..."
},
"selectImage": "Выбор миниатюры отслеживаемого объекта",
- "noImages": "Не обнаружено миниатюр для этой камеры"
+ "noImages": "Не обнаружено миниатюр для этой камеры",
+ "unknownLabel": "Сохраненное изображение триггера"
}
}
diff --git a/web/public/locales/ru/views/classificationModel.json b/web/public/locales/ru/views/classificationModel.json
index cabb7793e..1017128fe 100644
--- a/web/public/locales/ru/views/classificationModel.json
+++ b/web/public/locales/ru/views/classificationModel.json
@@ -15,26 +15,159 @@
},
"toast": {
"success": {
- "deletedCategory": "Удаленный класс",
- "deletedImage": "Удалённые изображения",
+ "deletedCategory": "Класс удалён",
+ "deletedImage": "Изображения удалены",
"deletedModel_one": "Успешно удалена {{count}} модель",
"deletedModel_few": "Успешно удалены {{count}} модели",
"deletedModel_many": "Успешно удалены {{count}} моделей",
"categorizedImage": "Изображение успешно классифицировано",
- "trainedModel": "Успешно обученная модель.",
- "trainingModel": "Успешно начато обучение моделей.",
- "updatedModel": "Успешно обновлена конфигурация модели"
+ "trainedModel": "Модель успешно обучена.",
+ "trainingModel": "Обучение модели успешно запущено.",
+ "updatedModel": "Конфигурация модели успешно обновлена",
+ "renamedCategory": "Класс успешно переименован в {{name}}"
},
"error": {
"deleteImageFailed": "Не удалось удалить: {{errorMessage}}",
"deleteCategoryFailed": "Не удалось удалить класс: {{errorMessage}}",
"deleteModelFailed": "Не удалось удалить модель: {{errorMessage}}",
"categorizeFailed": "Не удалось классифицировать изображение: {{errorMessage}}",
- "trainingFailed": "Не удалось начать обучение модели: {{errorMessage}}"
+ "trainingFailed": "Не удалось начать обучение модели: {{errorMessage}}",
+ "updateModelFailed": "Не удалось обновить модель: {{errorMessage}}",
+ "renameCategoryFailed": "Не удалось переименовать класс: {{errorMessage}}",
+ "trainingFailedToStart": "Не удалось начать обучение модели: {{errorMessage}}"
}
},
"deleteCategory": {
"title": "Удалить класс",
"desc": "Вы уверены, что хотите удалить класс {{name}}? Это приведёт к безвозвратному удалению всех связанных с ним изображений и потребует повторного обучения модели."
+ },
+ "deleteModel": {
+ "title": "Удалить модель классификации",
+ "single": "Вы уверены, что хотите удалить {{name}}? Это приведёт к безвозвратному удалению всех связанных данных, включая изображения и данные обучения. Это действие нельзя отменить.",
+ "desc_one": "Вы уверены, что хотите удалить {{count}} модель? Это приведёт к безвозвратному удалению всех связанных данных, включая изображения и данные обучения. Это действие нельзя отменить.",
+ "desc_few": "Вы уверены, что хотите удалить {{count}} модели? Это приведёт к безвозвратному удалению всех связанных данных, включая изображения и данные обучения. Это действие нельзя отменить.",
+ "desc_many": "Вы уверены, что хотите удалить {{count}} моделей? Это приведёт к безвозвратному удалению всех связанных данных, включая изображения и данные обучения. Это действие нельзя отменить."
+ },
+ "edit": {
+ "title": "Редактировать модель классификации",
+ "descriptionState": "Редактировать классы для этой модели классификации состояний. Изменения потребуют повторного обучения модели.",
+ "descriptionObject": "Редактировать тип объекта и тип классификации для этой модели классификации объектов.",
+ "stateClassesInfo": "Примечание: изменение классов состояний требует повторного обучения модели с обновлёнными классами."
+ },
+ "deleteDatasetImages": {
+ "title": "Удалить изображения набора данных",
+ "desc_one": "Вы уверены, что хотите удалить {{count}} изображение из {{dataset}}? Это действие нельзя отменить и потребует повторного обучения модели.",
+ "desc_few": "Вы уверены, что хотите удалить {{count}} изображения из {{dataset}}? Это действие нельзя отменить и потребует повторного обучения модели.",
+ "desc_many": "Вы уверены, что хотите удалить {{count}} изображений из {{dataset}}? Это действие нельзя отменить и потребует повторного обучения модели."
+ },
+ "deleteTrainImages": {
+ "title": "Удалить обучающие изображения",
+ "desc_one": "Вы уверены, что хотите удалить {{count}} изображение? Это действие нельзя отменить.",
+ "desc_few": "Вы уверены, что хотите удалить {{count}} изображения? Это действие нельзя отменить.",
+ "desc_many": "Вы уверены, что хотите удалить {{count}} изображений? Это действие нельзя отменить."
+ },
+ "renameCategory": {
+ "title": "Переименовать класс",
+ "desc": "Введите новое имя для {{name}}. Вам потребуется повторно обучить модель, чтобы изменение имени вступило в силу."
+ },
+ "description": {
+ "invalidName": "Недопустимое имя. Имена могут содержать только буквы, цифры, пробелы, апострофы, подчёркивания и дефисы."
+ },
+ "train": {
+ "title": "Недавние классификации",
+ "titleShort": "Недавние",
+ "aria": "Выбрать недавние классификации"
+ },
+ "categories": "Классы",
+ "createCategory": {
+ "new": "Создать новый класс"
+ },
+ "categorizeImageAs": "Классифицировать изображение как:",
+ "categorizeImage": "Классифицировать изображение",
+ "menu": {
+ "objects": "Объекты",
+ "states": "Состояния"
+ },
+ "noModels": {
+ "object": {
+ "title": "Нет моделей классификации объектов",
+ "description": "Создайте пользовательскую модель для классификации обнаруженных объектов.",
+ "buttonText": "Создать модель объекта"
+ },
+ "state": {
+ "title": "Нет моделей классификации состояний",
+ "description": "Создайте пользовательскую модель для мониторинга и классификации изменений состояний в определённых областях камеры.",
+ "buttonText": "Создать модель состояния"
+ }
+ },
+ "wizard": {
+ "title": "Создать новую классификацию",
+ "steps": {
+ "nameAndDefine": "Имя и определение",
+ "stateArea": "Область состояния",
+ "chooseExamples": "Выбрать примеры"
+ },
+ "step1": {
+ "description": "Модели состояний отслеживают фиксированные области камеры на предмет изменений (например, дверь открыта/закрыта). Модели объектов добавляют классификации к обнаруженным объектам (например, известные животные, курьеры и т.д.).",
+ "name": "Имя",
+ "namePlaceholder": "Введите имя модели…",
+ "type": "Тип",
+ "typeState": "Состояние",
+ "typeObject": "Объект",
+ "objectLabel": "Метка объекта",
+ "objectLabelPlaceholder": "Выберите тип объекта…",
+ "classificationType": "Тип классификации",
+ "classificationTypeTip": "Узнать о типах классификации",
+ "classificationTypeDesc": "Подметки добавляют дополнительный текст к метке объекта (например, 'Человек: UPS'). Атрибуты — это доступные для поиска метаданные, хранящиеся отдельно в метаданных объекта.",
+ "classificationSubLabel": "Подметка",
+ "classificationAttribute": "Атрибут",
+ "classes": "Классы",
+ "states": "Состояния",
+ "classesTip": "Узнать о классах",
+ "classesStateDesc": "Определите различные состояния, в которых может находиться область вашей камеры. Например: 'открыто' и 'закрыто' для гаражных ворот.",
+ "classesObjectDesc": "Определите различные категории для классификации обнаруженных объектов. Например: 'курьер', 'житель', 'незнакомец' для классификации людей.",
+ "classPlaceholder": "Введите имя класса…",
+ "errors": {
+ "nameRequired": "Имя модели обязательно",
+ "nameLength": "Имя модели должно содержать не более 64 символов",
+ "nameOnlyNumbers": "Имя модели не может состоять только из цифр",
+ "classRequired": "Требуется хотя бы 1 класс",
+ "classesUnique": "Имена классов должны быть уникальными",
+ "stateRequiresTwoClasses": "Модели состояний требуют не менее 2 классов",
+ "objectLabelRequired": "Пожалуйста, выберите метку объекта",
+ "objectTypeRequired": "Пожалуйста, выберите тип классификации"
+ }
+ },
+ "step2": {
+ "description": "Выберите камеры и определите область для мониторинга для каждой камеры. Модель будет классифицировать состояние этих областей.",
+ "cameras": "Камеры",
+ "selectCamera": "Выбрать камеру",
+ "noCameras": "Нажмите +, чтобы добавить камеры",
+ "selectCameraPrompt": "Выберите камеру из списка, чтобы определить область её мониторинга"
+ },
+ "step3": {
+ "selectImagesPrompt": "Выберите все изображения с {{className}}",
+ "selectImagesDescription": "Нажмите на изображения, чтобы выбрать их. Нажмите Продолжить, когда закончите с этим классом.",
+ "generating": {
+ "title": "Генерация примеров изображений",
+ "description": "Frigate извлекает репрезентативные изображения из ваших записей. Это может занять некоторое время…"
+ },
+ "training": {
+ "title": "Обучение модели",
+ "description": "Ваша модель обучается в фоновом режиме. Закройте это диалоговое окно, и ваша модель начнёт работать, как только обучение будет завершено."
+ },
+ "retryGenerate": "Повторить генерацию",
+ "noImages": "Примеры изображений не сгенерированы",
+ "classifying": "Классификация и обучение…",
+ "trainingStarted": "Обучение успешно запущено",
+ "errors": {
+ "noCameras": "Камеры не настроены",
+ "noObjectLabel": "Метка объекта не выбрана",
+ "generateFailed": "Не удалось сгенерировать примеры: {{error}}",
+ "generationFailed": "Генерация не удалась. Пожалуйста, попробуйте снова.",
+ "classifyFailed": "Не удалось классифицировать изображения: {{error}}"
+ },
+ "generateSuccess": "Примеры изображений успешно сгенерированы"
+ }
}
}
diff --git a/web/public/locales/ru/views/events.json b/web/public/locales/ru/views/events.json
index 85f8bed39..c54e54262 100644
--- a/web/public/locales/ru/views/events.json
+++ b/web/public/locales/ru/views/events.json
@@ -45,7 +45,11 @@
"trackedObject_other": "объекты",
"noObjectDetailData": "Данные о деталях объекта недоступны.",
"label": "Деталь",
- "settings": "Настройки подробного просмотра"
+ "settings": "Настройки подробного просмотра",
+ "alwaysExpandActive": {
+ "title": "Всегда раскрывать активный",
+ "desc": "Всегда раскрывать сведения об объекте активного элемента обзора, если они доступны."
+ }
},
"objectTrack": {
"trackedPoint": "Отслеживаемая точка",
diff --git a/web/public/locales/ru/views/explore.json b/web/public/locales/ru/views/explore.json
index 778ffd7d1..18c211a95 100644
--- a/web/public/locales/ru/views/explore.json
+++ b/web/public/locales/ru/views/explore.json
@@ -102,7 +102,7 @@
"label": "Оценка снимка"
},
"score": {
- "label": "Балл"
+ "label": "Оценка"
}
},
"trackedObjectDetails": "Детали объекта",
@@ -197,16 +197,26 @@
"audioTranscription": {
"label": "Транскрибировать",
"aria": "Запросить аудиотранскрипцию"
+ },
+ "viewTrackingDetails": {
+ "label": "Просмотреть детали отслеживания",
+ "aria": "Показать детали отслеживания"
+ },
+ "showObjectDetails": {
+ "label": "Показать путь объекта"
+ },
+ "hideObjectDetails": {
+ "label": "Скрыть путь объекта"
}
},
"dialog": {
"confirmDelete": {
"title": "Подтвердить удаление",
- "desc": "Удаление этого отслеживаемого объекта приведёт к удалению его снимка, всех сохранённых эмбеддингов и записей жизненного цикла. Сами записи в разделе История НЕ будут удалены.
Вы уверены, что хотите продолжить?"
+ "desc": "Удаление этого отслеживаемого объекта приведёт к удалению снимка, всех сохранённых эмбеддингов и всех связанных записей деталей отслеживания. Записанное видео этого отслеживаемого объекта в представлении Истории НЕ будет удалено.
Вы уверены, что хотите продолжить?"
}
},
- "noTrackedObjects": "Не найдено отслеживаемых объектов",
- "fetchingTrackedObjectsFailed": "При получении списка отслеживаемых объектов произошла ошибка: {{errorMessage}}",
+ "noTrackedObjects": "Отслеживаемые объекты не найдены",
+ "fetchingTrackedObjectsFailed": "Ошибка при получении отслеживаемых объектов: {{errorMessage}}",
"trackedObjectsCount_one": "{{count}} отслеживаемый объект ",
"trackedObjectsCount_few": "{{count}} отслеживаемых объекта ",
"trackedObjectsCount_many": "{{count}} отслеживаемых объектов ",
@@ -217,7 +227,9 @@
"error": "Не удалось удалить отслеживаемый объект: {{errorMessage}}"
}
},
- "tooltip": "Соответствие с {{type}} на {{confidence}}%"
+ "tooltip": "Соответствие с {{type}} на {{confidence}}%",
+ "previousTrackedObject": "Предыдущий отслеживаемый объект",
+ "nextTrackedObject": "Следующий отслеживаемый объект"
},
"exploreMore": "Просмотреть больше объектов {{label}}",
"aiAnalysis": {
@@ -225,5 +237,53 @@
},
"concerns": {
"label": "Требуют внимания"
+ },
+ "trackingDetails": {
+ "count": "{{first}} из {{second}}",
+ "title": "Детали отслеживания",
+ "noImageFound": "Для этой метки времени изображение не найдено.",
+ "createObjectMask": "Создать маску объекта",
+ "adjustAnnotationSettings": "Изменить настройки аннотаций",
+ "scrollViewTips": "Нажмите, чтобы просмотреть ключевые моменты жизненного цикла этого объекта.",
+ "autoTrackingTips": "Позиции ограничивающих рамок будут неточными для камер с автотрекингом.",
+ "trackedPoint": "Отслеживаемая точка",
+ "lifecycleItemDesc": {
+ "visible": "Обнаружен(а) {{label}}",
+ "entered_zone": "{{label}} зафиксирован(а) в {{zones}}",
+ "active": "{{label}} активировался(ась)",
+ "stationary": "{{label}} перестал(а) двигаться",
+ "attribute": {
+ "faceOrLicense_plate": "{{attribute}} обнаружен для {{label}}",
+ "other": "{{label}} распознан(а) как {{attribute}}"
+ },
+ "gone": "{{label}} покинул(а) зону",
+ "heard": "Обнаружен звук {{label}}",
+ "external": "Обнаружен(а) {{label}}",
+ "header": {
+ "zones": "Зоны",
+ "ratio": "Соотношение",
+ "area": "Область"
+ }
+ },
+ "annotationSettings": {
+ "title": "Настройки аннотаций",
+ "showAllZones": {
+ "title": "Показать все зоны",
+ "desc": "Всегда показывать зоны на кадрах, где объекты вошли в зону."
+ },
+ "offset": {
+ "label": "Сдвиг аннотаций",
+ "desc": "Эти данные поступают из потока детекции вашей камеры, но накладываются на изображения из потока записи. Потоки вряд ли идеально синхронизированы, поэтому ограничивающая рамка и видео могут не совпадать. Вы можете использовать эту настройку для смещения аннотаций вперед или назад во времени, чтобы лучше выровнять их с записанным видео.",
+ "millisecondsToOffset": "Смещение аннотаций детекции в миллисекундах. По умолчанию: 0",
+ "tips": "Уменьшите значение, если воспроизведение видео опережает рамки и точки пути, и увеличьте значение, если воспроизведение видео отстаёт от них. Это значение может быть отрицательным.",
+ "toast": {
+ "success": "Смещение аннотаций для {{camera}} сохранено в конфигурационном файле. Перезапустите Frigate, чтобы применить изменения."
+ }
+ }
+ },
+ "carousel": {
+ "previous": "Предыдущий слайд",
+ "next": "Следующий слайд"
+ }
}
}
diff --git a/web/public/locales/ru/views/faceLibrary.json b/web/public/locales/ru/views/faceLibrary.json
index 3dcfd7cd5..ee8d702fb 100644
--- a/web/public/locales/ru/views/faceLibrary.json
+++ b/web/public/locales/ru/views/faceLibrary.json
@@ -13,11 +13,11 @@
"description": {
"placeholder": "Введите название коллекции",
"addFace": "Добавьте новую коллекцию в библиотеку лиц, загрузив свое первое изображение.",
- "invalidName": "Недопустимое имя. Имена могут содержать только буквы, цифры, пробелы, апострофы, подчеркивания и дефисы."
+ "invalidName": "Недопустимое имя. Имена могут содержать только буквы, цифры, пробелы, апострофы, подчёркивания и дефисы."
},
"createFaceLibrary": {
"desc": "Создание новой коллекции",
- "nextSteps": "Для создания надежной базы: