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": "Для создания надежной базы:
  • Используйте вкладку Обучение, чтобы выбрать изображения и обучить систему для каждого обнаруженного человека.
  • Используйте фронтальные изображения для лучшего результата; избегайте изображений с лицами, снятыми под углом.
  • ", + "nextSteps": "Для создания надежной базы:
  • Используйте вкладку \"Недавние распознавания\", чтобы выбрать изображения каждого обнаруженного человека и обучить систему
  • Используйте фронтальные изображения для лучшего результата; избегайте изображений с лицами, снятыми под углом.
  • ", "title": "Создать коллекцию", "new": "Создать новое лицо" }, @@ -43,7 +43,7 @@ "uploadedImage": "Изображение успешно загружено.", "trainedFace": "Лицо успешно запомнено.", "addFaceLibrary": "{{name}} успешно добавлен(а) в Библиотеку лиц!", - "updatedFaceScore": "Оценка лица успешно обновлена.", + "updatedFaceScore": "Оценка лица успешно обновлена для {{name}} {{score}}.", "renamedFace": "Лицо успешно переименовано в {{name}}" }, "error": { @@ -62,7 +62,7 @@ }, "imageEntry": { "dropActive": "Перетащите изображение сюда…", - "dropInstructions": "Перетащите изображение сюда или нажмите для выбора", + "dropInstructions": "Перетащите или вставьте изображение сюда или щелкните, чтобы выбрать", "maxSize": "Макс. размер: {{size}}Мб", "validation": { "selectImage": "Пожалуйста, выберите файл изображения." diff --git a/web/public/locales/ru/views/live.json b/web/public/locales/ru/views/live.json index 950a9b946..8a189bf76 100644 --- a/web/public/locales/ru/views/live.json +++ b/web/public/locales/ru/views/live.json @@ -86,7 +86,7 @@ "disable": "Скрыть статистику потока" }, "manualRecording": { - "title": "Запись по требованию", + "title": "По требованию", "tips": "Создать ручное событие на основе настроек хранения записей этой камеры.", "playInBackground": { "label": "Воспроизведение в фоне", @@ -170,5 +170,14 @@ "transcription": { "enable": "Включить транскрипцию звука в реальном времени", "disable": "Выключить транскрипцию звука" + }, + "snapshot": { + "noVideoSource": "Нет видеоисточника для снимка", + "captureFailed": "Не удалось сделать снимок." + }, + "noCameras": { + "title": "Камеры не настроены", + "description": "Начните с подключения камеры к Frigate.", + "buttonText": "Добавить камеру" } } diff --git a/web/public/locales/ru/views/settings.json b/web/public/locales/ru/views/settings.json index 73a302ccd..4f45db1bb 100644 --- a/web/public/locales/ru/views/settings.json +++ b/web/public/locales/ru/views/settings.json @@ -4,7 +4,7 @@ "camera": "Настройки камеры - Frigate", "masksAndZones": "Маски и Зоны - Frigate", "motionTuner": "Детекции движения - Frigate", - "general": "Общие настройки - Frigate", + "general": "Настройки интерфейса - Frigate", "frigatePlus": "Настройки Frigate+ - Frigate", "authentication": "Настройки аутентификации - Frigate", "classification": "Настройки распознавания - Frigate", @@ -41,7 +41,7 @@ "noCamera": "Нет камеры" }, "general": { - "title": "Общие настройки", + "title": "Настройки интерфейса", "liveDashboard": { "title": "Панель мониторинга", "automaticLiveView": { @@ -51,6 +51,9 @@ "playAlertVideos": { "label": "Воспроизводить видео с тревогами", "desc": "По умолчанию последние тревоги на панели мониторинга воспроизводятся как короткие зацикленные видео. Отключите эту опцию, чтобы показывать только статичное изображение последних оповещений на этом устройстве/браузере." + }, + "displayCameraNames": { + "label": "Всегда показывать названия камер" } }, "calendar": { @@ -903,6 +906,10 @@ }, "docs": { "reolink": "https://docs.frigate.video/configuration/camera_specific.html#reolink-cameras" + }, + "testing": { + "probingMetadata": "Проверка метаданных камеры…", + "fetchingSnapshot": "Получение снимка с камеры…" } }, "step2": { @@ -928,5 +935,63 @@ "testSuccess": "Тест потока выполнен успешно!", "testFailed": "Тест потока не пройден" } + }, + "roles": { + "addRole": "Добавить роль", + "table": { + "role": "Роль", + "cameras": "Камеры", + "actions": "Действия", + "editCameras": "Редактировать камеры", + "deleteRole": "Удалить роль", + "noRoles": "Пользовательских ролей не найдено." + }, + "toast": { + "success": { + "createRole": "Роль {{role}} успешно создана", + "updateCameras": "Камеры обновлены для роли {{role}}", + "deleteRole": "Роль {{role}} успешно удалена", + "userRolesUpdated_one": "{{count}} пользователь, назначенный на эту роль, был обновлён до роли 'наблюдатель', которая имеет доступ ко всем камерам.", + "userRolesUpdated_few": "{{count}} пользователя, назначенных на эту роль, были обновлены до роли 'наблюдатель', которая имеет доступ ко всем камерам.", + "userRolesUpdated_many": "{{count}} пользователей, назначенных на эту роль, были обновлены до роли 'наблюдатель', которая имеет доступ ко всем камерам." + }, + "error": { + "createRoleFailed": "Не удалось создать роль: {{errorMessage}}", + "updateCamerasFailed": "Не удалось обновить камеры: {{errorMessage}}", + "deleteRoleFailed": "Не удалось удалить роль: {{errorMessage}}", + "userUpdateFailed": "Не удалось обновить роли пользователей: {{errorMessage}}" + } + }, + "dialog": { + "createRole": { + "title": "Создать новую роль", + "desc": "Добавьте новую роль и укажите права доступа к камерам." + }, + "editCameras": { + "title": "Редактировать камеры роли", + "desc": "Обновите доступ к камерам для роли {{role}}." + }, + "deleteRole": { + "title": "Удалить роль", + "desc": "Это действие нельзя отменить. Это действие навсегда удалит роль и назначит всех пользователей с этой ролью на роль 'наблюдатель', что даст наблюдателю доступ ко всем камерам.", + "warn": "Вы уверены, что хотите удалить {{role}}?", + "deleting": "Удаление…" + }, + "form": { + "role": { + "title": "Название роли", + "placeholder": "Введите название роли", + "desc": "Разрешены только буквы, цифры, точки и подчёркивания.", + "roleIsRequired": "Требуется название роли", + "roleOnlyInclude": "Название роли может содержать только буквы, цифры, . или _", + "roleExists": "Роль с таким названием уже существует." + }, + "cameras": { + "title": "Камеры", + "desc": "Выберите камеры, к которым эта роль имеет доступ. Необходимо выбрать хотя бы одну камеру.", + "required": "Необходимо выбрать хотя бы одну камеру." + } + } + } } }