mirror of
https://github.com/blakeblackshear/frigate.git
synced 2026-05-03 06:50:58 +00:00
Compare commits
11 Commits
115cc0a5b4
...
3100e488ea
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3100e488ea | ||
|
|
2a8ada9a14 | ||
|
|
78d84a35cb | ||
|
|
3551b61ca8 | ||
|
|
cbed989717 | ||
|
|
bfc1a77e9b | ||
|
|
0d3fe70cc7 | ||
|
|
a9d3d9044d | ||
|
|
d6a4bd7598 | ||
|
|
3fc018481c | ||
|
|
30a5b1a640 |
@ -159,7 +159,7 @@ Inference speeds vary greatly depending on the CPU or GPU used, some known examp
|
||||
| Intel HD 530 | 15 - 35 ms | | | | Can only run one detector instance |
|
||||
| Intel HD 620 | 15 - 25 ms | | 320: ~ 35 ms | | |
|
||||
| Intel HD 630 | ~ 15 ms | | 320: ~ 30 ms | | |
|
||||
| Intel UHD 730 | ~ 10 ms | t-320: 14ms s-320: 24ms t-640: 34ms s-640: 65ms | 320: ~ 19 ms 640: ~ 54 ms | | |
|
||||
| Intel UHD 730 | ~ 10 ms | | 320: ~ 19 ms 640: ~ 54 ms | | |
|
||||
| Intel UHD 770 | ~ 15 ms | t-320: ~ 16 ms s-320: ~ 20 ms s-640: ~ 40 ms | 320: ~ 20 ms 640: ~ 46 ms | | |
|
||||
| Intel N100 | ~ 15 ms | s-320: 30 ms | 320: ~ 25 ms | | Can only run one detector instance |
|
||||
| Intel N150 | ~ 15 ms | t-320: 16 ms s-320: 24 ms | | | |
|
||||
|
||||
@ -62,8 +62,8 @@ def require_admin_by_default():
|
||||
"/",
|
||||
"/version",
|
||||
"/config/schema.json",
|
||||
# Authenticated user endpoints (allow_any_authenticated)
|
||||
"/metrics",
|
||||
# Authenticated user endpoints (allow_any_authenticated)
|
||||
"/stats",
|
||||
"/stats/history",
|
||||
"/config",
|
||||
@ -76,28 +76,22 @@ def require_admin_by_default():
|
||||
"/recognized_license_plates",
|
||||
"/timeline",
|
||||
"/timeline/hourly",
|
||||
"/events/summary",
|
||||
"/recordings/storage",
|
||||
"/recordings/summary",
|
||||
"/recordings/unavailable",
|
||||
"/go2rtc/streams",
|
||||
"/event_ids",
|
||||
"/events",
|
||||
"/exports",
|
||||
}
|
||||
|
||||
# Path prefixes that should be exempt (for paths with parameters)
|
||||
EXEMPT_PREFIXES = (
|
||||
"/logs/", # /logs/{service}
|
||||
"/review", # /review, /review/{id}, /review/summary, /review_ids, etc.
|
||||
"/review", # /review, /review/{id}, /review_ids, /review/summary, etc.
|
||||
"/reviews/", # /reviews/viewed, /reviews/delete
|
||||
"/events/", # /events/{id}/thumbnail, /events/summary, etc. (camera-scoped)
|
||||
"/export/", # /export/{camera}/start/..., /export/{id}/rename, /export/{id}
|
||||
"/events/", # /events/{id}/thumbnail, etc. (camera-scoped)
|
||||
"/go2rtc/streams/", # /go2rtc/streams/{camera}
|
||||
"/users/", # /users/{username}/password (has own auth)
|
||||
"/preview/", # /preview/{file}/thumbnail.jpg
|
||||
"/exports/", # /exports/{export_id}
|
||||
"/vod/", # /vod/{camera_name}/...
|
||||
"/notifications/", # /notifications/pubkey, /notifications/register
|
||||
)
|
||||
|
||||
async def admin_checker(request: Request):
|
||||
@ -111,24 +105,6 @@ def require_admin_by_default():
|
||||
if path.startswith(EXEMPT_PREFIXES):
|
||||
return
|
||||
|
||||
# Dynamic camera path exemption:
|
||||
# Any path whose first segment matches a configured camera name should
|
||||
# bypass the global admin requirement. These endpoints enforce access
|
||||
# via route-level dependencies (e.g. require_camera_access) to ensure
|
||||
# per-camera authorization. This allows non-admin authenticated users
|
||||
# (e.g. viewer role) to access camera-specific resources without
|
||||
# needing admin privileges.
|
||||
try:
|
||||
if path.startswith("/"):
|
||||
first_segment = path.split("/", 2)[1]
|
||||
if (
|
||||
first_segment
|
||||
and first_segment in request.app.frigate_config.cameras
|
||||
):
|
||||
return
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
# For all other paths, require admin role
|
||||
# Port 5000 (internal) requests have admin role set automatically
|
||||
role = request.headers.get("remote-role")
|
||||
@ -137,7 +113,7 @@ def require_admin_by_default():
|
||||
|
||||
raise HTTPException(
|
||||
status_code=403,
|
||||
detail="Access denied. A user with the admin role is required.",
|
||||
detail="Admin role required for this endpoint",
|
||||
)
|
||||
|
||||
return admin_checker
|
||||
|
||||
@ -70,7 +70,6 @@ router = APIRouter(tags=[Tags.events])
|
||||
@router.get(
|
||||
"/events",
|
||||
response_model=list[EventResponse],
|
||||
dependencies=[Depends(allow_any_authenticated())],
|
||||
summary="Get events",
|
||||
description="Returns a list of events.",
|
||||
)
|
||||
@ -345,7 +344,6 @@ def events(
|
||||
@router.get(
|
||||
"/events/explore",
|
||||
response_model=list[EventResponse],
|
||||
dependencies=[Depends(allow_any_authenticated())],
|
||||
summary="Get summary of objects.",
|
||||
description="""Gets a summary of objects from the database.
|
||||
Returns a list of objects with a max of `limit` objects for each label.
|
||||
@ -438,7 +436,6 @@ def events_explore(
|
||||
@router.get(
|
||||
"/event_ids",
|
||||
response_model=list[EventResponse],
|
||||
dependencies=[Depends(allow_any_authenticated())],
|
||||
summary="Get events by ids.",
|
||||
description="""Gets events by a list of ids.
|
||||
Returns a list of events.
|
||||
@ -472,7 +469,6 @@ async def event_ids(ids: str, request: Request):
|
||||
|
||||
@router.get(
|
||||
"/events/search",
|
||||
dependencies=[Depends(allow_any_authenticated())],
|
||||
summary="Search events.",
|
||||
description="""Searches for events in the database.
|
||||
Returns a list of events.
|
||||
@ -923,7 +919,6 @@ def events_summary(
|
||||
@router.get(
|
||||
"/events/{event_id}",
|
||||
response_model=EventResponse,
|
||||
dependencies=[Depends(allow_any_authenticated())],
|
||||
summary="Get event by id.",
|
||||
description="Gets an event by its id.",
|
||||
)
|
||||
@ -967,7 +962,6 @@ def set_retain(event_id: str):
|
||||
@router.post(
|
||||
"/events/{event_id}/plus",
|
||||
response_model=EventUploadPlusResponse,
|
||||
dependencies=[Depends(require_role(["admin"]))],
|
||||
summary="Send event to Frigate+.",
|
||||
description="""Sends an event to Frigate+.
|
||||
Returns a success message or an error if the event is not found.
|
||||
@ -1108,7 +1102,6 @@ async def send_to_plus(request: Request, event_id: str, body: SubmitPlusBody = N
|
||||
@router.put(
|
||||
"/events/{event_id}/false_positive",
|
||||
response_model=EventUploadPlusResponse,
|
||||
dependencies=[Depends(require_role(["admin"]))],
|
||||
summary="Submit false positive to Frigate+",
|
||||
description="""Submit an event as a false positive to Frigate+.
|
||||
This endpoint is the same as the standard Frigate+ submission endpoint,
|
||||
|
||||
@ -14,7 +14,6 @@ from peewee import DoesNotExist
|
||||
from playhouse.shortcuts import model_to_dict
|
||||
|
||||
from frigate.api.auth import (
|
||||
allow_any_authenticated,
|
||||
get_allowed_cameras_for_filter,
|
||||
require_camera_access,
|
||||
require_role,
|
||||
@ -45,7 +44,6 @@ router = APIRouter(tags=[Tags.export])
|
||||
@router.get(
|
||||
"/exports",
|
||||
response_model=ExportsResponse,
|
||||
dependencies=[Depends(allow_any_authenticated())],
|
||||
summary="Get exports",
|
||||
description="""Gets all exports from the database for cameras the user has access to.
|
||||
Returns a list of exports ordered by date (most recent first).""",
|
||||
@ -274,7 +272,6 @@ async def export_delete(event_id: str, request: Request):
|
||||
@router.get(
|
||||
"/exports/{export_id}",
|
||||
response_model=ExportModel,
|
||||
dependencies=[Depends(allow_any_authenticated())],
|
||||
summary="Get a single export",
|
||||
description="""Gets a specific export by ID. The user must have access to the camera
|
||||
associated with the export.""",
|
||||
|
||||
@ -945,7 +945,6 @@ async def vod_hour(
|
||||
|
||||
@router.get(
|
||||
"/vod/event/{event_id}",
|
||||
dependencies=[Depends(allow_any_authenticated())],
|
||||
description="Returns an HLS playlist for the specified object. Append /master.m3u8 or /index.m3u8 for HLS playback.",
|
||||
)
|
||||
async def vod_event(
|
||||
|
||||
@ -5,12 +5,11 @@ import os
|
||||
from typing import Any
|
||||
|
||||
from cryptography.hazmat.primitives import serialization
|
||||
from fastapi import APIRouter, Depends, Request
|
||||
from fastapi import APIRouter, Request
|
||||
from fastapi.responses import JSONResponse
|
||||
from peewee import DoesNotExist
|
||||
from py_vapid import Vapid01, utils
|
||||
|
||||
from frigate.api.auth import allow_any_authenticated
|
||||
from frigate.api.defs.tags import Tags
|
||||
from frigate.const import CONFIG_DIR
|
||||
from frigate.models import User
|
||||
@ -22,7 +21,6 @@ router = APIRouter(tags=[Tags.notifications])
|
||||
|
||||
@router.get(
|
||||
"/notifications/pubkey",
|
||||
dependencies=[Depends(allow_any_authenticated())],
|
||||
summary="Get VAPID public key",
|
||||
description="""Gets the VAPID public key for the notifications.
|
||||
Returns the public key or an error if notifications are not enabled.
|
||||
@ -49,7 +47,6 @@ def get_vapid_pub_key(request: Request):
|
||||
|
||||
@router.post(
|
||||
"/notifications/register",
|
||||
dependencies=[Depends(allow_any_authenticated())],
|
||||
summary="Register notifications",
|
||||
description="""Registers a notifications subscription.
|
||||
Returns a success message or an error if the subscription is not provided.
|
||||
|
||||
@ -577,9 +577,7 @@ def delete_reviews(body: ReviewModifyMultipleBody):
|
||||
|
||||
|
||||
@router.get(
|
||||
"/review/activity/motion",
|
||||
response_model=list[ReviewActivityMotionResponse],
|
||||
dependencies=[Depends(allow_any_authenticated())],
|
||||
"/review/activity/motion", response_model=list[ReviewActivityMotionResponse]
|
||||
)
|
||||
def motion_activity(
|
||||
params: ReviewActivityMotionQueryParams = Depends(),
|
||||
@ -741,7 +739,6 @@ async def set_not_reviewed(
|
||||
|
||||
@router.post(
|
||||
"/review/summarize/start/{start_ts}/end/{end_ts}",
|
||||
dependencies=[Depends(allow_any_authenticated())],
|
||||
description="Use GenAI to summarize review items over a period of time.",
|
||||
)
|
||||
def generate_review_summary(request: Request, start_ts: float, end_ts: float):
|
||||
|
||||
@ -1,6 +1,5 @@
|
||||
{
|
||||
"form": {
|
||||
"user": "Потребителско име",
|
||||
"password": "Парола"
|
||||
"user": "Потребителско име"
|
||||
}
|
||||
}
|
||||
|
||||
@ -10,7 +10,6 @@
|
||||
"select": "Избери"
|
||||
},
|
||||
"restart": {
|
||||
"title": "Сигурен ли сте, че искате да рестартирате Frigate?",
|
||||
"button": "Рестартирай"
|
||||
"title": "Сигурен ли сте, че искате да рестартирате Frigate?"
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,8 +1,5 @@
|
||||
{
|
||||
"iconPicker": {
|
||||
"selectIcon": "Изберете иконка",
|
||||
"search": {
|
||||
"placeholder": "Потърси за икона…"
|
||||
}
|
||||
"selectIcon": "Изберете иконка"
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,10 +1,7 @@
|
||||
{
|
||||
"button": {
|
||||
"downloadVideo": {
|
||||
"label": "Свали видео",
|
||||
"toast": {
|
||||
"success": "Вашето видео за преглеждане почна да се изтегля."
|
||||
}
|
||||
"label": "Свали видео"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,3 +1 @@
|
||||
{
|
||||
"documentTitle": "Модели за класификация"
|
||||
}
|
||||
{}
|
||||
|
||||
@ -1,4 +1 @@
|
||||
{
|
||||
"documentTitle": "Настройки на конфигурацията - Фригейт",
|
||||
"configEditor": "Настройки на конфигурацията"
|
||||
}
|
||||
{}
|
||||
|
||||
@ -9,7 +9,5 @@
|
||||
"aria": "Избери събития",
|
||||
"noFoundForTimePeriod": "Няма намерени събития за този времеви период."
|
||||
},
|
||||
"allCameras": "Всички камери",
|
||||
"alerts": "Известия",
|
||||
"detections": "Засичания"
|
||||
"allCameras": "Всички камери"
|
||||
}
|
||||
|
||||
@ -8,7 +8,5 @@
|
||||
}
|
||||
},
|
||||
"trackedObjectsCount_one": "{{count}} проследен обект ",
|
||||
"trackedObjectsCount_other": "{{count}} проследени обекта ",
|
||||
"documentTitle": "Разгледай - Фригейт",
|
||||
"generativeAI": "Генериращ Изкъствен Интелект"
|
||||
"trackedObjectsCount_other": "{{count}} проследени обекта "
|
||||
}
|
||||
|
||||
@ -1,4 +1,3 @@
|
||||
{
|
||||
"documentTitle": "Експорт - Frigate",
|
||||
"search": "Търси"
|
||||
"documentTitle": "Експорт - Frigate"
|
||||
}
|
||||
|
||||
@ -10,9 +10,5 @@
|
||||
"deletedName_one": "{{count}} лице бе изтрито успешно.",
|
||||
"deletedName_other": "{{count}} лица бяха изтрити успешно."
|
||||
}
|
||||
},
|
||||
"description": {
|
||||
"addFace": "Добавете нова колекция във библиотеката за лица при качването на първата ви снимка.",
|
||||
"placeholder": "Напишете име за тази колекция"
|
||||
}
|
||||
}
|
||||
|
||||
@ -64,6 +64,5 @@
|
||||
"cameraSettings": {
|
||||
"cameraEnabled": "Камерата е включена"
|
||||
},
|
||||
"documentTitle": "Наживо - Frigate",
|
||||
"documentTitle.withCamera": "{{camera}} - На живо - Фригейт"
|
||||
"documentTitle": "Наживо - Frigate"
|
||||
}
|
||||
|
||||
@ -1,7 +1,5 @@
|
||||
{
|
||||
"button": {
|
||||
"save": "Запазване на търсенето"
|
||||
},
|
||||
"search": "Търси",
|
||||
"savedSearches": "Запазени търсения"
|
||||
}
|
||||
}
|
||||
|
||||
@ -12,9 +12,5 @@
|
||||
"point_one": "{{count}} точка",
|
||||
"point_other": "{{count}} точки"
|
||||
}
|
||||
},
|
||||
"documentTitle": {
|
||||
"default": "Настройки - Фригейт",
|
||||
"authentication": "Настройки за сигурността - Фругейт"
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,9 +1,5 @@
|
||||
{
|
||||
"stats": {
|
||||
"healthy": "Системата е изправна"
|
||||
},
|
||||
"documentTitle": {
|
||||
"cameras": "Статистики за Камери - Фригейт",
|
||||
"storage": "Статистика за паметта - Фригейт"
|
||||
}
|
||||
}
|
||||
|
||||
@ -152,12 +152,7 @@
|
||||
"generateSuccess": "Imatges de mostra generades amb èxit",
|
||||
"allImagesRequired_one": "Classifiqueu totes les imatges. Queda {{count}} imatge.",
|
||||
"allImagesRequired_many": "Classifiqueu totes les imatges. Queden {{count}} imatges.",
|
||||
"allImagesRequired_other": "Classifiqueu totes les imatges. Queden {{count}} imatges.",
|
||||
"modelCreated": "El model s'ha creat correctament. Utilitzeu la vista Classificacions recents per a afegir imatges per als estats que falten i, a continuació, entrenar el model.",
|
||||
"missingStatesWarning": {
|
||||
"title": "Falten exemples d'estat",
|
||||
"description": "No heu seleccionat exemples per a tots els estats. El model no serà entrenat fins que tots els estats tinguin imatges. Després de continuar, utilitzeu la vista Classificacions recents per classificar imatges per als estats que falten, i després entrenar el model."
|
||||
}
|
||||
"allImagesRequired_other": "Classifiqueu totes les imatges. Queden {{count}} imatges."
|
||||
}
|
||||
},
|
||||
"deleteModel": {
|
||||
|
||||
@ -55,8 +55,5 @@
|
||||
"trackedPoint": "Punt de seguiment"
|
||||
},
|
||||
"zoomIn": "Amplia",
|
||||
"zoomOut": "Redueix",
|
||||
"normalActivity": "Normal",
|
||||
"needsReview": "Necessita revisió",
|
||||
"securityConcern": "Preocupació per la seguretat"
|
||||
"zoomOut": "Redueix"
|
||||
}
|
||||
|
||||
@ -468,36 +468,5 @@
|
||||
"tearing": "Reißen",
|
||||
"beep": "Piep",
|
||||
"ping": "Ping",
|
||||
"ding": "klingeln",
|
||||
"thunk": "dumpfes Geräusch",
|
||||
"clang": "Geklirr",
|
||||
"squeal": "Ausruf",
|
||||
"creak": "Knarren",
|
||||
"rustle": "Geknister",
|
||||
"whir": "schwirren",
|
||||
"clatter": "Geratter",
|
||||
"sizzle": "brutzeln",
|
||||
"clicking": "Klicken",
|
||||
"clickety_clack": "Klappergeräuschen",
|
||||
"rumble": "Grollen",
|
||||
"plop": "plumpsen",
|
||||
"hum": "brummen",
|
||||
"zing": "Schwung",
|
||||
"boing": "ferderndes Geräusch",
|
||||
"crunch": "knirschendes",
|
||||
"sine_wave": "Sinus Kurve",
|
||||
"harmonic": "harmonisch",
|
||||
"chirp_tone": "Frequenzwobbelung",
|
||||
"pulse": "Takt",
|
||||
"inside": "drinnen",
|
||||
"outside": "draußen",
|
||||
"reverberation": "Widerhall",
|
||||
"echo": "Echo",
|
||||
"noise": "Lärm",
|
||||
"mains_hum": "Netzbrummen",
|
||||
"distortion": "Verzerrung",
|
||||
"sidetone": "Nebengeräusch",
|
||||
"cacophony": "Dissonanz",
|
||||
"throbbing": "Pochen",
|
||||
"vibration": "Vibration"
|
||||
"ding": "klingeln"
|
||||
}
|
||||
|
||||
@ -231,8 +231,7 @@
|
||||
"logout": "Abmelden"
|
||||
},
|
||||
"uiPlayground": "Testgebiet für Benutzeroberfläche",
|
||||
"export": "Exportieren",
|
||||
"classification": "Klassifizierung"
|
||||
"export": "Exportieren"
|
||||
},
|
||||
"unit": {
|
||||
"speed": {
|
||||
|
||||
@ -173,12 +173,7 @@
|
||||
"generationFailed": "Generierung fehlgeschlagen. Bitte versuchen Sie es erneut.",
|
||||
"classifyFailed": "Bilder konnten nicht klassifiziert werden: {{error}}"
|
||||
},
|
||||
"generateSuccess": "Erfolgreich generierte Beispielbilder",
|
||||
"modelCreated": "Modell erfolgreich erstellt. Verwenden Sie die Ansicht „Aktuelle Klassifizierungen“, um Bilder für fehlende Zustände hinzuzufügen, und trainieren Sie dann das Modell.",
|
||||
"missingStatesWarning": {
|
||||
"title": "Beispiele für fehlende Zustände",
|
||||
"description": "Sie haben nicht für alle Zustände Beispiele ausgewählt. Das Modell wird erst trainiert, wenn für alle Zustände Bilder vorhanden sind. Fahren Sie fort und verwenden Sie die Ansicht „Aktuelle Klassifizierungen“, um Bilder für die fehlenden Zustände zu klassifizieren. Trainieren Sie anschließend das Modell."
|
||||
}
|
||||
"generateSuccess": "Erfolgreich generierte Beispielbilder"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -55,8 +55,5 @@
|
||||
"objectTrack": {
|
||||
"trackedPoint": "Verfolgter Punkt",
|
||||
"clickToSeek": "Klicke, um zu dieser Zeit zu springen"
|
||||
},
|
||||
"normalActivity": "normal",
|
||||
"needsReview": "benötigt Überprüfung",
|
||||
"securityConcern": "Sicherheitsbedenken"
|
||||
}
|
||||
}
|
||||
|
||||
@ -172,7 +172,7 @@
|
||||
"disable": "Live Audio Transkription ausschalten"
|
||||
},
|
||||
"noCameras": {
|
||||
"title": "Keine Kameras konfiguriert",
|
||||
"title": "Keine Kameras eingerichtet",
|
||||
"description": "Beginne indem du eine Kamera anschließt.",
|
||||
"buttonText": "Kamera hinzufügen",
|
||||
"restricted": {
|
||||
|
||||
@ -240,8 +240,7 @@
|
||||
"alreadyExists": "Für diese Kamera existiert bereits eine Zone mit diesem Namen.",
|
||||
"mustBeAtLeastTwoCharacters": "Der Zonenname muss aus mindestens 2 Zeichen bestehen.",
|
||||
"mustNotBeSameWithCamera": "Der Zonenname darf nicht mit dem Kameranamen identisch sein.",
|
||||
"mustNotContainPeriod": "Der Zonenname darf keine Punkte enthalten.",
|
||||
"mustHaveAtLeastOneLetter": "Der Name der Zone muss mindestens einen Buchstaben enthalten."
|
||||
"mustNotContainPeriod": "Der Zonenname darf keine Punkte enthalten."
|
||||
}
|
||||
},
|
||||
"loiteringTime": {
|
||||
@ -320,7 +319,7 @@
|
||||
"name": {
|
||||
"title": "Name",
|
||||
"inputPlaceHolder": "Geben Sie einen Namen ein…",
|
||||
"tips": "Der Name muss mindestens 2 Zeichen lang sein, mindestens einen Buchstaben enthalten und darf nicht der Name einer Kamera oder einer anderen Zone sein."
|
||||
"tips": "Der Name muss aus mindestens 2 Zeichen bestehen und sollte nicht den Namen einer Kamera oder anderen Zone entsprechen."
|
||||
},
|
||||
"objects": {
|
||||
"title": "Objekte",
|
||||
@ -750,7 +749,7 @@
|
||||
"triggers": {
|
||||
"documentTitle": "Auslöser",
|
||||
"management": {
|
||||
"title": "Auslöser",
|
||||
"title": "Auslöser Verwaltung",
|
||||
"desc": "Auslöser für {{camera}} verwalten. Verwenden Sie den Vorschaubild Typ, um ähnliche Vorschaubilder wie das ausgewählte verfolgte Objekt auszulösen, und den Beschreibungstyp, um ähnliche Beschreibungen wie den von Ihnen angegebenen Text auszulösen."
|
||||
},
|
||||
"addTrigger": "Auslöser hinzufügen",
|
||||
@ -771,9 +770,7 @@
|
||||
},
|
||||
"actions": {
|
||||
"alert": "Als Alarm markieren",
|
||||
"notification": "Benachrichtigung senden",
|
||||
"sub_label": "Unterlabel hinzufügen",
|
||||
"attribute": "Attribut hinzufügen"
|
||||
"notification": "Benachrichtigung senden"
|
||||
},
|
||||
"dialog": {
|
||||
"createTrigger": {
|
||||
@ -791,28 +788,25 @@
|
||||
"form": {
|
||||
"name": {
|
||||
"title": "Name",
|
||||
"placeholder": "Benennen Sie diesen Auslöser",
|
||||
"placeholder": "Auslöser Name eingeben",
|
||||
"error": {
|
||||
"minLength": "Der Name muss mindestens 2 Zeichen lang sein.",
|
||||
"invalidCharacters": "Der Name darf nur Buchstaben, Zahlen, Unterstriche und Bindestriche enthalten.",
|
||||
"alreadyExists": "Ein Auslöser mit diesem Namen existiert bereits für diese Kamera."
|
||||
},
|
||||
"description": "Geben Sie einen eindeutigen Namen oder eine Beschreibung ein, um diesen Auslöser zu identifizieren"
|
||||
}
|
||||
},
|
||||
"enabled": {
|
||||
"description": "Diesen Auslöser aktivieren oder deaktivieren"
|
||||
},
|
||||
"type": {
|
||||
"title": "Typ",
|
||||
"placeholder": "Auslöser Typ wählen",
|
||||
"description": "Auslösen, wenn eine ähnliche Beschreibung eines verfolgten Objekts erkannt wird",
|
||||
"thumbnail": "Auslösen, wenn eine ähnliche Miniaturansicht eines verfolgten Objekts erkannt wird"
|
||||
"placeholder": "Auslöser Typ wählen"
|
||||
},
|
||||
"content": {
|
||||
"title": "Inhalt",
|
||||
"imagePlaceholder": "Miniaturansicht auswählen",
|
||||
"imagePlaceholder": "Ein Bild auswählen",
|
||||
"textPlaceholder": "Inhaltstext eingeben",
|
||||
"imageDesc": "Es werden nur die letzten 100 Miniaturansichten angezeigt. Wenn Sie die gewünschte Miniaturansicht nicht finden können, überprüfen Sie bitte frühere Objekte in „Explore“ und richten Sie dort über das Menü einen Trigger ein.",
|
||||
"imageDesc": "Ein Bild auswählen, um diese Aktion auszulösen, wenn ein ähnliches Bild erkannt wird.",
|
||||
"textDesc": "Einen Text eingeben, um diese Aktion auszulösen, wenn eine ähnliche Beschreibung eines verfolgten Objekts erkannt wird.",
|
||||
"error": {
|
||||
"required": "Inhalt ist erforderlich."
|
||||
@ -823,12 +817,11 @@
|
||||
"error": {
|
||||
"min": "Schwellenwert muss mindestens 0 sein",
|
||||
"max": "Schwellenwert darf höchstens 1 sein"
|
||||
},
|
||||
"desc": "Legen Sie den Ähnlichkeitsschwellenwert für diesen Trigger fest. Ein höherer Schwellenwert bedeutet, dass eine größere Übereinstimmung erforderlich ist, um den Trigger auszulösen."
|
||||
}
|
||||
},
|
||||
"actions": {
|
||||
"title": "Aktionen",
|
||||
"desc": "Standardmäßig sendet Frigate für alle Trigger eine MQTT-Nachricht. Unterbezeichnungen fügen den Triggernamen zur Objektbezeichnung hinzu. Attribute sind durchsuchbare Metadaten, die separat in den Metadaten des verfolgten Objekts gespeichert werden.",
|
||||
"desc": "Standardmäßig sendet Frigate eine MQTT-Nachricht für alle Trigger. Wähle eine zusätzliche Aktion aus, die ausgeführt werden soll, wenn dieser Trigger ausgelöst wird.",
|
||||
"error": {
|
||||
"min": "Mindesten eine Aktion muss ausgewählt sein."
|
||||
}
|
||||
@ -855,23 +848,6 @@
|
||||
"semanticSearch": {
|
||||
"title": "Semantische Suche ist deaktiviert",
|
||||
"desc": "Semantische Suche muss aktiviert sein um Auslöser nutzen zu können."
|
||||
},
|
||||
"wizard": {
|
||||
"title": "Auslöser erstellen",
|
||||
"step1": {
|
||||
"description": "Konfigurieren Sie die Grundeinstellungen für Ihren Auslöser."
|
||||
},
|
||||
"step2": {
|
||||
"description": "Legen Sie den Inhalt fest, der diese Aktion auslöst."
|
||||
},
|
||||
"step3": {
|
||||
"description": "Konfigurieren Sie den Schwellenwert und die Aktionen für diesen Trigger."
|
||||
},
|
||||
"steps": {
|
||||
"nameAndType": "Name und Typ",
|
||||
"configureData": "Daten konfigurieren",
|
||||
"thresholdAndActions": "Schwellenwert und Maßnahmen"
|
||||
}
|
||||
}
|
||||
},
|
||||
"roles": {
|
||||
@ -925,7 +901,7 @@
|
||||
"updateCameras": "Kameras für Rolle {{role}} aktualisiert",
|
||||
"deleteRole": "Rolle {{role}} erfolgreich gelöscht",
|
||||
"userRolesUpdated_one": "{{count}} Benutzer, denen diese Rolle zugewiesen wurde, wurden auf „Zuschauer“ aktualisiert, der Zugriff auf alle Kameras hat.",
|
||||
"userRolesUpdated_other": "{{count}} Benutzer, denen diese Rollen zugewiesen wurde, wurden auf „Zuschauer“ aktualisiert, der Zugriff auf alle Kameras habem."
|
||||
"userRolesUpdated_other": ""
|
||||
},
|
||||
"error": {
|
||||
"createRoleFailed": "Fehler beim Erstellen der Rolle: {{errorMessage}}",
|
||||
@ -1003,8 +979,7 @@
|
||||
"detectionMethodDescription": "Suchen Sie die Kamera mit ONVIF (sofern unterstützt), um die URLs der Kamerastreams zu finden, oder wählen Sie manuell die Kameramarke aus, um vordefinierte URLs zu verwenden. Um eine benutzerdefinierte RTSP-URL einzugeben, wählen Sie die manuelle Methode und dann „Andere“.",
|
||||
"onvifPortDescription": "Bei Kameras, die ONVIF unterstützen, ist dies in der Regel 80 oder 8080.",
|
||||
"useDigestAuth": "Digest-Authentifizierung verwenden",
|
||||
"useDigestAuthDescription": "Verwenden Sie die HTTP-Digest-Authentifizierung für ONVIF. Einige Kameras erfordern möglicherweise einen speziellen ONVIF-Benutzernamen/ein spezielles ONVIF-Passwort anstelle des Standard-Admin-Benutzers.",
|
||||
"manualMode": "Manuelle Auswahl"
|
||||
"useDigestAuthDescription": "Verwenden Sie die HTTP-Digest-Authentifizierung für ONVIF. Einige Kameras erfordern möglicherweise einen speziellen ONVIF-Benutzernamen/ein spezielles ONVIF-Passwort anstelle des Standard-Admin-Benutzers."
|
||||
},
|
||||
"step2": {
|
||||
"description": "Suchen Sie in der Kamera nach verfügbaren Streams oder konfigurieren Sie manuelle Einstellungen basierend auf der von Ihnen ausgewählten Erkennungsmethode.",
|
||||
@ -1063,22 +1038,10 @@
|
||||
"profiles": "Profile",
|
||||
"ptzSupport": "PTZ Unterstützung",
|
||||
"autotrackingSupport": "Unterstützung für Autoverfolgung",
|
||||
"presets": "Voreinstellung",
|
||||
"rtspCandidates": "RTSP Kandidaten",
|
||||
"rtspCandidatesDescription": "Die folgenden RTSP-URLs wurden bei der Kameraprobe gefunden. Testen Sie die Verbindung, um die Stream-Metadaten anzuzeigen.",
|
||||
"noRtspCandidates": "Es wurden keine RTSP-URLs von der Kamera gefunden. Möglicherweise sind Ihre Anmeldedaten falsch oder die Kamera unterstützt ONVIF oder die Methode zum Abrufen von RTSP-URLs nicht. Gehen Sie zurück und geben Sie die RTSP-URL manuell ein.",
|
||||
"candidateStreamTitle": "Kandidate {{number}}",
|
||||
"useCandidate": "Verwenden",
|
||||
"uriCopy": "Kopieren",
|
||||
"uriCopied": "ULR in Zwischenablage kopiert",
|
||||
"testConnection": "Test Verbindung",
|
||||
"toggleUriView": "Klicken Sie hier, um die vollständige URI zu sehen",
|
||||
"errors": {
|
||||
"hostRequired": "Host/IP adresse wird benötigt"
|
||||
}
|
||||
"presets": "Voreinstellung"
|
||||
},
|
||||
"step3": {
|
||||
"description": "Konfigurieren Sie Stream-Rollen und fügen Sie zusätzliche Streams für Ihre Kamera hinzu",
|
||||
"description": "Endgültige Validierung und Analyse vor dem Speichern Ihrer neuen Kamera. Verbinde jeden Stream vor dem Speichern.",
|
||||
"validationTitle": "Stream Validierung",
|
||||
"connectAllStreams": "Verbinde alle Streams",
|
||||
"reconnectionSuccess": "Wiederverbindung erfolgreich.",
|
||||
@ -1115,90 +1078,6 @@
|
||||
"hikvision": {
|
||||
"substreamWarning": "Substream 1 ist auf eine niedrige Auflösung festgelegt. Viele Hikvision-Kameras unterstützen zusätzliche Substreams, die in den Kameraeinstellungen aktiviert werden müssen. Es wird empfohlen, diese Streams zu nutzen, sofern sie verfügbar sind."
|
||||
}
|
||||
},
|
||||
"streamsTitle": "Kamera Stream",
|
||||
"addStream": "Hizufügen Stream",
|
||||
"addAnotherStream": "weiteren Stream hinzufügen",
|
||||
"streamUrl": "Stream URL",
|
||||
"streamUrlPlaceholder": "rtsp://benutzername:passwort@host:port/path",
|
||||
"selectStream": "Auswahl Stream",
|
||||
"searchCandidates": "Suche Kandidaten...",
|
||||
"noStreamFound": "Kein Stream gefunden",
|
||||
"url": "URL",
|
||||
"resolution": "Auflösung",
|
||||
"selectResolution": "Wähle Auflösung",
|
||||
"quality": "Qualität",
|
||||
"selectQuality": "Wähle Qualität",
|
||||
"roleLabels": {
|
||||
"detect": "Objekt Erkennung",
|
||||
"record": "Aufnahme",
|
||||
"audio": "Ton"
|
||||
},
|
||||
"testStream": "Verbindungstest",
|
||||
"testSuccess": "Verbindungstest erfolgreich!",
|
||||
"testFailed": "Verbindungstest fehlgeschlagen",
|
||||
"testFailedTitle": "Test fehlgeschlagen",
|
||||
"connected": "Verbunden",
|
||||
"notConnected": "nicht Verbunden",
|
||||
"featuresTitle": "Funktionen",
|
||||
"go2rtc": "Verbindungen zur Kamera reduzieren",
|
||||
"detectRoleWarning": "Mindestens ein Stream muss die Rolle „detect“ haben, um fortfahren zu können.",
|
||||
"rolesPopover": {
|
||||
"title": "Stream Rollen",
|
||||
"detect": "Hauptfeed für die Objekterkennung.",
|
||||
"record": "Speichert Segmente des Video-Feeds basierend auf den Konfigurationseinstellungen.",
|
||||
"audio": "Feed für audiobasierte Erkennung."
|
||||
},
|
||||
"featuresPopover": {
|
||||
"title": "Stream Funktionen",
|
||||
"description": "Verwenden Sie go2rtc-Restreaming, um die Verbindungen zu Ihrer Kamera zu reduzieren."
|
||||
}
|
||||
},
|
||||
"step4": {
|
||||
"description": "Endgültige Validierung und Analyse vor dem Speichern Ihrer neuen Kamera. Verbinden Sie jeden Stream vor dem Speichern.",
|
||||
"validationTitle": "Stream-Validierung",
|
||||
"connectAllStreams": "Alle Streams verbinden",
|
||||
"reconnectionSuccess": "Wiederverbindung erfolgreich.",
|
||||
"reconnectionPartial": "Einige Streams konnten nicht wieder verbunden werden.",
|
||||
"streamUnavailable": "Stream Vorschau nicht verfügbar",
|
||||
"reload": "neu Laden",
|
||||
"connecting": "Verbinden...",
|
||||
"streamTitle": "Stream {{number}}",
|
||||
"valid": "gültig",
|
||||
"failed": "fehlgeschlagen",
|
||||
"notTested": "nicht getestet",
|
||||
"connectStream": "Verbinden",
|
||||
"connectingStream": "Verbinden",
|
||||
"disconnectStream": "getrennt",
|
||||
"estimatedBandwidth": "Voraussichtliche Bandbreite",
|
||||
"roles": "Rollen",
|
||||
"ffmpegModule": "Stream-Kompatibilitätsmodus verwenden",
|
||||
"ffmpegModuleDescription": "Wenn der Stream nach mehreren Versuchen nicht geladen wird, versuchen Sie, diese Option zu aktivieren. Wenn diese Option aktiviert ist, verwendet Frigate das ffmpeg-Modul mit go2rtc. Dies kann zu einer besseren Kompatibilität mit einigen Kamerastreams führen.",
|
||||
"none": "keiner",
|
||||
"error": "Fehler",
|
||||
"streamValidated": "Steeam {{number}} Erfolgreich validiert",
|
||||
"streamValidationFailed": "Stream {{number}} Validierung fehlgeschlagen",
|
||||
"saveAndApply": "Neue Kamera speichern",
|
||||
"saveError": "Ungültige Konfiguration. Bitte überprüfen Sie Ihre Einstellungen.",
|
||||
"issues": {
|
||||
"title": "Stream-Validierung",
|
||||
"videoCodecGood": "Video codec ist {{codec}}.",
|
||||
"audioCodecGood": "Audio codec ist {{codec}}.",
|
||||
"resolutionHigh": "Eine Auflösung von {{resolution}} kann zu einem erhöhten Ressourcenverbrauch führen.",
|
||||
"resolutionLow": "Eine Auflösung von {{resolution}} ist möglicherweise zu gering, um kleine Objekte zuverlässig zu erkennen.",
|
||||
"noAudioWarning": "Für diesen Stream wurde kein Ton erkannt, die Aufzeichnungen enthalten keinen Ton.",
|
||||
"audioCodecRecordError": "Der AAC-Audio-Codec ist erforderlich, um Audio in Aufnahmen zu unterstützen.",
|
||||
"audioCodecRequired": "Ein Audiostream ist erforderlich, um die Audioerkennung zu unterstützen.",
|
||||
"restreamingWarning": "Die Reduzierung der Verbindungen zur Kamera für den Aufzeichnungsstream kann zu einer geringfügigen Erhöhung der CPU-Auslastung führen.",
|
||||
"brands": {
|
||||
"reolink-rtsp": "Reolink RTSP wird nicht empfohlen. Aktivieren Sie HTTP in den Firmware-Einstellungen der Kamera und starten Sie den Assistenten neu."
|
||||
},
|
||||
"dahua": {
|
||||
"substreamWarning": "Substream 1 ist auf eine niedrige Auflösung festgelegt. Viele Kameras von Dahua / Amcrest / EmpireTech unterstützen zusätzliche Substreams, die in den Kameraeinstellungen aktiviert werden müssen. Es wird empfohlen, diese Streams zu überprüfen und zu nutzen, sofern sie verfügbar sind."
|
||||
},
|
||||
"hikvision": {
|
||||
"substreamWarning": "Substream 1 ist auf eine niedrige Auflösung festgelegt. Viele Hikvision-Kameras unterstützen zusätzliche Substreams, die in den Kameraeinstellungen aktiviert werden müssen. Es wird empfohlen, diese Streams zu überprüfen und zu nutzen, sofern sie verfügbar sind."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
@ -66,8 +66,7 @@
|
||||
"failed": "Impossibile avviare l'esportazione: {{error}}",
|
||||
"endTimeMustAfterStartTime": "L'ora di fine deve essere successiva all'ora di inizio",
|
||||
"noVaildTimeSelected": "Nessun intervallo di tempo valido selezionato"
|
||||
},
|
||||
"view": "Visualizzazione"
|
||||
}
|
||||
},
|
||||
"fromTimeline": {
|
||||
"saveExport": "Salva esportazione",
|
||||
|
||||
@ -152,12 +152,7 @@
|
||||
"generateSuccess": "Immagini campione generate correttamente",
|
||||
"allImagesRequired_one": "Classifica tutte le immagini. Rimane {{count}} immagine.",
|
||||
"allImagesRequired_many": "Classifica tutte le immagini. Rimangono {{count}} immagini.",
|
||||
"allImagesRequired_other": "Classifica tutte le immagini. Rimangono {{count}} immagini.",
|
||||
"modelCreated": "Modello creato correttamente. Utilizza la vista Classificazioni recenti per aggiungere immagini per gli stati mancanti, quindi addestrare il modello.",
|
||||
"missingStatesWarning": {
|
||||
"title": "Esempi di stati mancanti",
|
||||
"description": "Non hai selezionato esempi per tutti gli stati. Il modello non verrà addestrato finché tutti gli stati non avranno immagini. Dopo aver continuato, utilizza la vista Classificazioni recenti per classificare le immagini per gli stati mancanti, quindi addestra il modello."
|
||||
}
|
||||
"allImagesRequired_other": "Classifica tutte le immagini. Rimangono {{count}} immagini."
|
||||
}
|
||||
},
|
||||
"deleteModel": {
|
||||
|
||||
@ -56,8 +56,5 @@
|
||||
"clickToSeek": "Premi per cercare in questo momento"
|
||||
},
|
||||
"zoomIn": "Ingrandisci",
|
||||
"zoomOut": "Rimpicciolisci",
|
||||
"normalActivity": "Normale",
|
||||
"needsReview": "Necessita revisione",
|
||||
"securityConcern": "Rischio per la sicurezza"
|
||||
"zoomOut": "Rimpicciolisci"
|
||||
}
|
||||
|
||||
@ -263,8 +263,7 @@
|
||||
"header": {
|
||||
"zones": "Zone",
|
||||
"ratio": "Rapporto",
|
||||
"area": "Area",
|
||||
"score": "Punteggio"
|
||||
"area": "Area"
|
||||
}
|
||||
},
|
||||
"annotationSettings": {
|
||||
|
||||
@ -146,12 +146,7 @@
|
||||
},
|
||||
"generateSuccess": "Eksempelbilder ble generert",
|
||||
"allImagesRequired_one": "Vennligst klassifiser alle bildene. {{count}} bilde gjenstår.",
|
||||
"allImagesRequired_other": "Vennligst klassifiser alle bildene. {{count}} bilder gjenstår.",
|
||||
"modelCreated": "Modellen ble opprettet. Bruk visningen Nylige klassifiseringer for å legge til bilder for manglende tilstander, og tren deretter modellen.",
|
||||
"missingStatesWarning": {
|
||||
"title": "Manglende tilstandseksempler",
|
||||
"description": "Du har ikke valgt eksempler for alle tilstander. Modellen vil ikke trenes før alle tilstander har bilder. Når du har gått videre, bruk visningen Nylige klassifiseringer til å klassifisere bilder for de manglende tilstandene, og tren deretter modellen."
|
||||
}
|
||||
"allImagesRequired_other": "Vennligst klassifiser alle bildene. {{count}} bilder gjenstår."
|
||||
}
|
||||
},
|
||||
"deleteModel": {
|
||||
|
||||
@ -55,8 +55,5 @@
|
||||
"clickToSeek": "Klikk for å gå til dette tidspunktet"
|
||||
},
|
||||
"zoomIn": "Zoom inn",
|
||||
"zoomOut": "Zoom ut",
|
||||
"normalActivity": "Normal",
|
||||
"needsReview": "Trenger inspeksjon",
|
||||
"securityConcern": "Sikkerhetsrisiko"
|
||||
"zoomOut": "Zoom ut"
|
||||
}
|
||||
|
||||
@ -148,12 +148,7 @@
|
||||
},
|
||||
"generateSuccess": "Met succes gegenereerde voorbeeldafbeeldingen",
|
||||
"allImagesRequired_one": "Classificeer alle afbeeldingen. {{count}} afbeelding resterend.",
|
||||
"allImagesRequired_other": "Classificeer alle afbeeldingen. {{count}} afbeeldingen resterend.",
|
||||
"modelCreated": "Model succesvol aangemaakt. Gebruik de weergave Recente classificaties om afbeeldingen voor ontbrekende statussen toe te voegen en train vervolgens het model.",
|
||||
"missingStatesWarning": {
|
||||
"title": "Voorbeelden van ontbrekende staten",
|
||||
"description": "Je hebt geen voorbeelden geselecteerd voor alle staten. Het model wordt pas getraind wanneer alle staten afbeeldingen hebben. Ga je verder, gebruik dan de weergave Recente Classificaties om afbeeldingen voor de ontbrekende staten te classificeren en train daarna het model."
|
||||
}
|
||||
"allImagesRequired_other": "Classificeer alle afbeeldingen. {{count}} afbeeldingen resterend."
|
||||
}
|
||||
},
|
||||
"deleteModel": {
|
||||
|
||||
@ -55,8 +55,5 @@
|
||||
"clickToSeek": "Klik om naar deze tijd te zoeken"
|
||||
},
|
||||
"zoomIn": "Zoom in",
|
||||
"zoomOut": "Zoom uit",
|
||||
"normalActivity": "Normaal",
|
||||
"needsReview": "Heeft een beoordeling nodig",
|
||||
"securityConcern": "Beveiligingsprobleem"
|
||||
"zoomOut": "Zoom uit"
|
||||
}
|
||||
|
||||
@ -87,10 +87,7 @@
|
||||
"formattedTimestampMonthDayYear": {
|
||||
"12hour": "d MMMM yyyy",
|
||||
"24hour": "d MMMM yyyy"
|
||||
},
|
||||
"inProgress": "W trakcie",
|
||||
"invalidStartTime": "Nieprawidłowy czas rozpoczęcia",
|
||||
"invalidEndTime": "Nieprawidłowy czas zakończenia"
|
||||
}
|
||||
},
|
||||
"unit": {
|
||||
"speed": {
|
||||
@ -100,23 +97,10 @@
|
||||
"length": {
|
||||
"feet": "stopy",
|
||||
"meters": "metry"
|
||||
},
|
||||
"data": {
|
||||
"kbps": "kB/s",
|
||||
"mbps": "MB/s",
|
||||
"gbps": "GB/s",
|
||||
"kbph": "kB/godz.",
|
||||
"mbph": "MB/godz.",
|
||||
"gbph": "GB/godz."
|
||||
}
|
||||
},
|
||||
"label": {
|
||||
"back": "Wróć",
|
||||
"hide": "Ukryj {{item}}",
|
||||
"show": "Pokaż {{item}}",
|
||||
"ID": "ID",
|
||||
"none": "Brak",
|
||||
"all": "Wszystko"
|
||||
"back": "Wróć"
|
||||
},
|
||||
"button": {
|
||||
"apply": "Zastosuj",
|
||||
@ -153,8 +137,7 @@
|
||||
"cameraAudio": "Dźwięk kamery",
|
||||
"off": "WYŁĄCZ",
|
||||
"edit": "Edytuj",
|
||||
"copyCoordinates": "Kopiuj współrzędne",
|
||||
"continue": "Kontynuuj"
|
||||
"copyCoordinates": "Kopiuj współrzędne"
|
||||
},
|
||||
"menu": {
|
||||
"system": "System",
|
||||
@ -256,8 +239,7 @@
|
||||
"configurationEditor": "Edytor konfiguracji",
|
||||
"help": "Pomoc",
|
||||
"settings": "Ustawienia",
|
||||
"export": "Eksportuj",
|
||||
"classification": "Klasyfikacja"
|
||||
"export": "Eksportuj"
|
||||
},
|
||||
"role": {
|
||||
"viewer": "Przeglądający",
|
||||
@ -301,9 +283,5 @@
|
||||
"readTheDocumentation": "Przeczytaj dokumentację",
|
||||
"information": {
|
||||
"pixels": "{{area}}px"
|
||||
},
|
||||
"list": {
|
||||
"two": "{{0}} i {{1}}",
|
||||
"many": "{{items}}, oraz {{last}}"
|
||||
}
|
||||
}
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
"button": {
|
||||
"deleteClassificationAttempts": "Usuń obrazy klasyfikacyjne",
|
||||
"renameCategory": "Zmień nazwę klasy",
|
||||
"deleteCategory": "Usuń klasyfikację",
|
||||
"deleteCategory": "Usuń klasę",
|
||||
"deleteImages": "Usuń obrazy",
|
||||
"trainModel": "Przeszkol model",
|
||||
"addClassification": "Dodaj klasyfikację",
|
||||
@ -39,9 +39,7 @@
|
||||
},
|
||||
"deleteCategory": {
|
||||
"title": "Usuń klasę",
|
||||
"desc": "Czy na pewno chcesz usunąć klasę {{name}}? Spowoduje to trawałe usunięcie wszystkich powiązanych obrazków i konieczność ponownego trenowania modelu.",
|
||||
"minClassesTitle": "Nie można usunąć kategorii",
|
||||
"minClassesDesc": "Model klasyfikacyjny musi posiadać co najmniej dwie kategorie. Dodaj inną kategorię aby możliwe było usunięcie tej kategorii."
|
||||
"desc": "Czy na pewno chcesz usunąć klasę {{name}}? Spowoduje to trawałe usunięcie wszystkich powiązanych obrazków i konieczność ponownego trenowania modelu."
|
||||
},
|
||||
"deleteModel": {
|
||||
"title": "Usuń model klasyfikacji",
|
||||
@ -51,29 +49,10 @@
|
||||
"desc_many": "Czy na pewno chcesz usunąć {{count}} modeli? Spowoduje to trwałe usunięcie wszystkich powiązanych danych, włącznie z obrazami i danymi treningowymi. Nie można cofnąć tej operacji."
|
||||
},
|
||||
"edit": {
|
||||
"title": "Edytuj model klasyfikacji",
|
||||
"descriptionObject": "Zmień typ obiektu i kryteria dla tego modelu klasyfikacji.",
|
||||
"stateClassesInfo": "Uwaga: Zmiana typu klasyfikacji wymaga treningu nowego modelu."
|
||||
"title": "Edytuj model klasyfikacji"
|
||||
},
|
||||
"tooltip": {
|
||||
"trainingInProgress": "Trwa trenowanie modelu",
|
||||
"modelNotReady": "Mode nie jest gotowy do trenowania",
|
||||
"noChanges": "Brak zmian w zbiorze danych od czasu ostatniego treningu."
|
||||
},
|
||||
"deleteDatasetImages": {
|
||||
"title": "Usuń obrazy z puli danych"
|
||||
},
|
||||
"renameCategory": {
|
||||
"title": "Zmień nazwę klasy",
|
||||
"desc": "Wprowadź nową nazwę dla {{name}}. Zastosowanie tej zmiany wymagać będzie treningu nowego modelu."
|
||||
},
|
||||
"description": {
|
||||
"invalidName": "Niepoprawna nazwa. Nazwy mogą zawierać tylko: litery, cyfry, spacje, cudzysłowy, podkreślniniki i myślniki."
|
||||
},
|
||||
"train": {
|
||||
"title": "Ostatnie Klasyfikacje"
|
||||
},
|
||||
"createCategory": {
|
||||
"new": "Stwórz nową klasyfikację"
|
||||
"modelNotReady": "Mode nie jest gotowy do trenowania"
|
||||
}
|
||||
}
|
||||
|
||||
@ -43,8 +43,8 @@
|
||||
"label": "Szczegóły",
|
||||
"noDataFound": "Brak szczegółów do przejrzenia",
|
||||
"aria": "Przełącz widok szczegółów",
|
||||
"trackedObject_one": "{{count}} obiekt",
|
||||
"trackedObject_other": "{{count}} obiekty",
|
||||
"trackedObject_one": "obiekt",
|
||||
"trackedObject_other": "obiekty",
|
||||
"noObjectDetailData": "Brak danych szczegółowych dla obiektu.",
|
||||
"settings": "Ustawienia widoku szczegółów",
|
||||
"alwaysExpandActive": {
|
||||
@ -55,6 +55,5 @@
|
||||
"objectTrack": {
|
||||
"trackedPoint": "Śledzony punkt",
|
||||
"clickToSeek": "Kliknij aby przewinąć do tego miejsca"
|
||||
},
|
||||
"needsReview": "Wymaga manualnego sprawdzenia"
|
||||
}
|
||||
}
|
||||
|
||||
@ -160,8 +160,7 @@
|
||||
"snapshot": "zrzut ekranu",
|
||||
"video": "wideo",
|
||||
"object_lifecycle": "cykl życia obiektu",
|
||||
"thumbnail": "miniaturka",
|
||||
"tracking_details": "szczegóły śledzenia"
|
||||
"thumbnail": "miniaturka"
|
||||
},
|
||||
"itemMenu": {
|
||||
"downloadSnapshot": {
|
||||
@ -233,29 +232,6 @@
|
||||
"createObjectMask": "Utwórz maskę obiektu",
|
||||
"adjustAnnotationSettings": "Dostosuj ustawienia adnotacji",
|
||||
"scrollViewTips": "Kliknij, aby zobaczyć najważniejsze momenty cyklu życia tego obiektu.",
|
||||
"count": "{{first}} z {{second}}",
|
||||
"autoTrackingTips": "Pozycja znacznika obiektu jest niedokładna dla kamer z automatycznym śledzeniem.",
|
||||
"lifecycleItemDesc": {
|
||||
"visible": "Wykryto {{label}}",
|
||||
"entered_zone": "{{label}} pojawił się w {{zones}}",
|
||||
"active": "{{label}} poruszył się",
|
||||
"stationary": "{{label}} zatrzymał się",
|
||||
"attribute": {
|
||||
"faceOrLicense_plate": "Wykryto {{attribute}} dla obiektu {{label}}",
|
||||
"other": "{{label}} został rozpoznany jako {{attribute}}"
|
||||
},
|
||||
"gone": "Utracono śledzenie dla {{label}}",
|
||||
"external": "Wykryto {{label}}",
|
||||
"header": {
|
||||
"zones": "Strefy"
|
||||
}
|
||||
},
|
||||
"annotationSettings": {
|
||||
"title": "Ustawienia adnotacji",
|
||||
"showAllZones": {
|
||||
"title": "Pokaż wszystkie strefy",
|
||||
"desc": "Pokazuj linie stref w momencie wejścia obiektu w strefę."
|
||||
}
|
||||
}
|
||||
"count": "{{first}} z {{second}}"
|
||||
}
|
||||
}
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
"description": {
|
||||
"addFace": "Dodaj nową kolekcję do biblioteki twarzy, przesyłając swoje pierwsze zdjęcie.",
|
||||
"placeholder": "Wprowadź nazwę tej kolekcji",
|
||||
"invalidName": "Niepoprawna nazwa. Nazwy mogą zawierać tylko: litery, cyfry, spacje, cudzysłowy, podkreślniniki i myślniki."
|
||||
"invalidName": "Nieprawidłowa nazwa. Nazwy mogą zawierać tylko litery, cyfry, spacje, apostrofy, podkreślenia oraz myślniki."
|
||||
},
|
||||
"details": {
|
||||
"person": "Osoba",
|
||||
|
||||
@ -67,7 +67,7 @@
|
||||
},
|
||||
"manualRecording": {
|
||||
"title": "Nagrywanie na żądanie",
|
||||
"tips": "Ręcznie rozpocznij zdarzenie w oparciu o ustawienia przechowywania nagrań tej kamery.",
|
||||
"tips": "Rozpocznij ręczne zdarzenie w oparciu o ustawienia przechowywania nagrań tej kamery.",
|
||||
"playInBackground": {
|
||||
"label": "Odtwarzaj w tle",
|
||||
"desc": "Włącz tę opcję, aby kontynuować transmisję, gdy odtwarzacz jest ukryty."
|
||||
@ -173,17 +173,7 @@
|
||||
},
|
||||
"noCameras": {
|
||||
"buttonText": "Dodaj kamerę",
|
||||
"description": "Zacznij od podłączenia kamery do Frigate.",
|
||||
"title": "Nie skonfigurowano żadnej kamery",
|
||||
"restricted": {
|
||||
"title": "Brak dostępnych kamer",
|
||||
"description": "Nie masz uprawnień aby przeglądać kamery w tej grupie."
|
||||
}
|
||||
},
|
||||
"snapshot": {
|
||||
"takeSnapshot": "Pobierz miniaturę",
|
||||
"captureFailed": "Nie udało się wykonać migawki.",
|
||||
"downloadStarted": "Pobieranie migawki rozpoczęte.",
|
||||
"noVideoSource": "Brak źródeł video dostępnych do wykonania migawki."
|
||||
"description": "Zacznij od podłączenia kamery.",
|
||||
"title": "Nie ustawiono żadnej kamery"
|
||||
}
|
||||
}
|
||||
|
||||
@ -13,7 +13,7 @@
|
||||
"triggers": "Wyzwalacze",
|
||||
"roles": "Role",
|
||||
"cameraManagement": "Zarządzanie",
|
||||
"cameraReview": "Przegląd"
|
||||
"cameraReview": "Przejrzyj"
|
||||
},
|
||||
"dialog": {
|
||||
"unsavedChanges": {
|
||||
@ -26,7 +26,7 @@
|
||||
"noCamera": "Brak Kamery"
|
||||
},
|
||||
"general": {
|
||||
"title": "Ustawienia interfejsu użytkownika",
|
||||
"title": "Ustawienia Ogólne",
|
||||
"storedLayouts": {
|
||||
"title": "Zapisane Układy",
|
||||
"clearAll": "Wyczyść Wszystkie Układy",
|
||||
@ -50,14 +50,6 @@
|
||||
"playAlertVideos": {
|
||||
"label": "Odtwarzaj Filmy Alarmowe",
|
||||
"desc": "Domyślnie, ostatnie alerty na panelu Na Żywo są odtwarzane jako małe zapętlone filmy. Wyłącz tę opcję, aby pokazywać tylko statyczny obraz ostatnich alertów na tym urządzeniu/przeglądarce."
|
||||
},
|
||||
"displayCameraNames": {
|
||||
"label": "Zawsze pokazuj nazwy kamer",
|
||||
"desc": "Zawsze pokazuj nazwę kamery w widoku wielu kamer."
|
||||
},
|
||||
"liveFallbackTimeout": {
|
||||
"label": "Przekroczono czas oczekiwania dla strumienia",
|
||||
"desc": "W wypadku utraty strumienia wysokiej jakości, użyj trybu niskiej przepustowości po X sekund od utracenia połączenia. Sugerowana wartość: 3."
|
||||
}
|
||||
},
|
||||
"cameraGroupStreaming": {
|
||||
@ -914,200 +906,5 @@
|
||||
"title": "Wyszukiwanie semantyczne jest zablokowane",
|
||||
"desc": "Wyszukiwanie semantyczne musi być włączone, aby korzystać z triggerów."
|
||||
}
|
||||
},
|
||||
"cameraWizard": {
|
||||
"title": "Dodaj kamerę",
|
||||
"steps": {
|
||||
"streamConfiguration": "Konfiguracja strumienia"
|
||||
},
|
||||
"save": {
|
||||
"success": "Zapisano ustawienia nowej kamery {{cameraName}}."
|
||||
},
|
||||
"testResultLabels": {
|
||||
"resolution": "Rozdzielczość",
|
||||
"fps": "kl./s"
|
||||
},
|
||||
"commonErrors": {
|
||||
"noUrl": "Podaj poprawny adres URL",
|
||||
"testFailed": "Negatywny wynik testu strumienia: {{error}}"
|
||||
},
|
||||
"step1": {
|
||||
"cameraName": "Nazwa kamery",
|
||||
"cameraNamePlaceholder": "np. drzwi_frontowe lub Ogród",
|
||||
"host": "Host/Adres IP",
|
||||
"port": "Port",
|
||||
"username": "Nazwa użytkownika",
|
||||
"usernamePlaceholder": "Opcjonalne",
|
||||
"password": "Hasło",
|
||||
"passwordPlaceholder": "Opcjonalne",
|
||||
"selectTransport": "Wybierz protokół warstwy transportowej",
|
||||
"cameraBrand": "Marka Kamery",
|
||||
"selectBrand": "Wybierz markę kamery aby dostosować wzór adresu URL",
|
||||
"customUrl": "Niestandardowy adres URL strumienia",
|
||||
"brandInformation": "Informacje o marce",
|
||||
"brandUrlFormat": "Dla kamer z formatem RTSP, formatuj URL jako: {{exampleUrl}}",
|
||||
"customUrlPlaceholder": "rtsp://nazwa_użytkownika:hasło@host:port/scieżka",
|
||||
"connectionSettings": "Ustawienia Połączenia",
|
||||
"detectionMethod": "Metoda wykrywania strumienia",
|
||||
"onvifPort": "Port ONVIF",
|
||||
"manualMode": "Ręczny wybór",
|
||||
"onvifPortDescription": "Dla kamer wspierających protokół ONVIF, port to zazwyczaj 80 lub 8080.",
|
||||
"errors": {
|
||||
"brandOrCustomUrlRequired": "Wybierz markę kamery oraz host/adres IP lub wybierz 'Inny' i podaj niestandardowy adres URL",
|
||||
"nameRequired": "Wymagana nazwa kamery",
|
||||
"nameLength": "Nazwa kamery musi mieć 64 lub mniej znaków",
|
||||
"invalidCharacters": "Nazwa kamery zawiera niepoprawne znaki",
|
||||
"nameExists": "Nazwa kamery jest już zajęta",
|
||||
"customUrlRtspRequired": "Niestandardowe adresy URL muszą zaczynać się od \"rtsp://\". Ręczna konfiguracja wymagana jest dla strumieniów innych niż RTSP."
|
||||
}
|
||||
},
|
||||
"step2": {
|
||||
"testSuccess": "Test połączenia udany!",
|
||||
"testFailed": "Test połączenia nieudany. Sprawdź adres źródła obrazu i spróbuj ponownie.",
|
||||
"testFailedTitle": "Test Nieudany",
|
||||
"streamDetails": "Szczegóły Strumienia",
|
||||
"testing": {
|
||||
"fetchingSnapshot": "Przygotowywanie migawki kamery..."
|
||||
},
|
||||
"deviceInfo": "Informacje o urządzeniu",
|
||||
"manufacturer": "Producent",
|
||||
"model": "Model",
|
||||
"firmware": "Firmware",
|
||||
"profiles": "Profile",
|
||||
"ptzSupport": "Wsparcie PTZ",
|
||||
"autotrackingSupport": "Wsparcie auto-śledzenia",
|
||||
"uriCopy": "Kopiuj",
|
||||
"uriCopied": "Adres URL skopiowano do schowka",
|
||||
"testConnection": "Przetestuj połączenie",
|
||||
"errors": {
|
||||
"hostRequired": "Wymagany jest Host/Adres IP"
|
||||
}
|
||||
},
|
||||
"step3": {
|
||||
"streamTitle": "Strumień numer: {{number}}",
|
||||
"streamUrl": "URL strumienia",
|
||||
"streamUrlPlaceholder": "rtsp://nazwa_użytkownika:hasło@host:port/scieżka",
|
||||
"selectStream": "Wybierz strumień",
|
||||
"noStreamFound": "Nie znaleziono żadnego strumienia",
|
||||
"url": "adres URL",
|
||||
"resolution": "Rozdzielczość",
|
||||
"selectResolution": "Wybierz rozdzielczość",
|
||||
"quality": "Jakość",
|
||||
"selectQuality": "wybierz jakość",
|
||||
"roles": "Role",
|
||||
"roleLabels": {
|
||||
"detect": "Wykrywanie obiektów",
|
||||
"record": "Nagrywanie",
|
||||
"audio": "Dźwięk"
|
||||
},
|
||||
"testStream": "Przetestuj połączenie",
|
||||
"testSuccess": "Test strumienia udany!",
|
||||
"testFailed": "Test strumienia nieudany",
|
||||
"testFailedTitle": "Test nieudany",
|
||||
"connected": "Połączono",
|
||||
"notConnected": "Nie połączono",
|
||||
"featuresTitle": "Funkcje",
|
||||
"go2rtc": "Ogranicz połączenia do kamery",
|
||||
"detectRoleWarning": "Przynajmniej jeden strumień musi mieć rolę \"detect\".",
|
||||
"rolesPopover": {
|
||||
"title": "Role strumienia",
|
||||
"detect": "Główny strumień służący do wykrywania obiektów."
|
||||
},
|
||||
"featuresPopover": {
|
||||
"title": "Funkcje strumienia"
|
||||
}
|
||||
},
|
||||
"step4": {
|
||||
"description": "Końcowa walidacja i analiza przed zapisaniem ustawień nowej kamery. Połącz się z każdym strumieniem przed zapisaniem.",
|
||||
"validationTitle": "Walidacja strumienia",
|
||||
"reconnectionSuccess": "Ponowna próba połączenia udana.",
|
||||
"streamUnavailable": "Podgląd strumienia niedostępny",
|
||||
"connecting": "Łączenie...",
|
||||
"streamTitle": "Strumień numer: {{number}}",
|
||||
"valid": "Poprawny",
|
||||
"connectingStream": "Łączenie",
|
||||
"disconnectStream": "Rozłącz",
|
||||
"estimatedBandwidth": "Przewidywana przepustowość",
|
||||
"roles": "Role",
|
||||
"ffmpegModuleDescription": "Jeżeli po kilku próbach strumień nadal nie ładuje się, uruchom ten tryb. Gdy włączony jest ten tryb Frigate będzie używać modułu ffmpeg z go2rtc. Może to zapewnić lepszą kompatybilność z niektórymi typami strumieniów.",
|
||||
"none": "Brak",
|
||||
"error": "Błąd",
|
||||
"streamValidated": "Strumień numer: {{number}} przeszedł test pozytywnie.",
|
||||
"streamValidationFailed": "Strumień numer: {{number}} test nieudany",
|
||||
"saveAndApply": "Zapisz nową kamerę",
|
||||
"saveError": "Nieprawidłowa konfiguracja. Sprawdź ustawienia.",
|
||||
"issues": {
|
||||
"title": "Walidacja strumienia",
|
||||
"audioCodecGood": "Kodek dźwięku to {{codec}}.",
|
||||
"resolutionHigh": "Rozdzielczość {{resolution}} może spowodować większe zużycie zasobów.",
|
||||
"resolutionLow": "Rozdzielczość {{resolution}} może okazać się za mała aby poprawnie wykrywać małe obiekty.",
|
||||
"noAudioWarning": "Nie wykryto dźwięku dla tego strumienia, nagrania również nie będą zawierać dźwięku.",
|
||||
"audioCodecRecordError": "Kodek AAC jest wymagany aby uwzględnić dźwięk w nagraniach.",
|
||||
"audioCodecRequired": "Strumień audio jest wymagany aby umożliwić wykrywanie dźwięku.",
|
||||
"restreamingWarning": "Ograniczenie ilości połączeń do strumienia nagrań może delikatnie zwiększyć użycie procesora",
|
||||
"brands": {
|
||||
"reolink-rtsp": "Strumień RTSP dla kamer firmy Reolink nie jest rekomendowany. Uruchom strumień HTTP w oprogramowaniu kamery i uruchom kreator jeszcze raz."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"cameraManagement": {
|
||||
"title": "Zarządzaj kamerami",
|
||||
"addCamera": "Dodaj nową kamerę",
|
||||
"editCamera": "Edytuj kamerę:",
|
||||
"selectCamera": "Wybierz kamerę",
|
||||
"backToSettings": "Powrót do ustawień kamery",
|
||||
"streams": {
|
||||
"title": "Włącz / Wyłącz kamery"
|
||||
},
|
||||
"cameraConfig": {
|
||||
"add": "Dodaj kamerę",
|
||||
"edit": "Edytuj kamerę",
|
||||
"description": "Skonfiguruj ustawienia kamery, wliczając strumienie wejściowe i ich role.",
|
||||
"name": "Nazwa kamery",
|
||||
"nameRequired": "Wymagana nazwa kamery",
|
||||
"nameLength": "Nazwa kamery musi mieć 64 lub mniej znaków.",
|
||||
"namePlaceholder": "np. drzwi_frontowe lub Ogród",
|
||||
"enabled": "Włączone",
|
||||
"ffmpeg": {
|
||||
"inputs": "Strumienie wejściowe",
|
||||
"path": "Ścieżka strumienia",
|
||||
"pathRequired": "Ścieżka strumienia jest wymagana",
|
||||
"pathPlaceholder": "rtsp://...",
|
||||
"roles": "Role",
|
||||
"rolesRequired": "Wymagana jest przynajmniej jedna rola",
|
||||
"rolesUnique": "Każda rola ('audio', 'detect', 'record') może zostać przypisana tylko raz",
|
||||
"addInput": "Dodaj strumień wejściowy",
|
||||
"removeInput": "Usuń strumień wejściowy",
|
||||
"inputsRequired": "Wymagany jest przynajmniej jeden strumień wejściowy"
|
||||
},
|
||||
"go2rtcStreams": "Strumienie go2rtc",
|
||||
"streamUrls": "Adresy URL strumieni",
|
||||
"addUrl": "Dodaj adres URL",
|
||||
"addGo2rtcStream": "Dodaj strumień go2rtc",
|
||||
"toast": {
|
||||
"success": "Zapisano poprawnie kamerę {{cameraName}}"
|
||||
}
|
||||
}
|
||||
},
|
||||
"cameraReview": {
|
||||
"review": {
|
||||
"alerts": "Alerty ",
|
||||
"detections": "Wykrycia "
|
||||
},
|
||||
"reviewClassification": {
|
||||
"title": "Przegląd klasyfikacji",
|
||||
"noDefinedZones": "Nie zdefiniowano żadnych stref dla tej kamery.",
|
||||
"objectDetectionsTips": "Wszystkie obiekty w kategorii {{detectionsLabels}} wykryte przez kamerę {{cameraName}} będą wyświetlane jako Wykrycia niezależnie od strefy w której zostały wykryte.",
|
||||
"zoneObjectDetectionsTips": {
|
||||
"text": "Wszystkie obiekty w kategorii {{detectionsLabels}} nieskategoryzowane w strefie {{zone}} kamery {{cameraName}} będą wyświetlane jako Wykrycia.",
|
||||
"notSelectDetections": "Wszystkie obiekty w kategorii {{detectionsLabels}} wykryte w strefie {{zone}} kamery {{cameraName}} nieskategoryzowane jako Alerty będą wyświetlane jako Wykrycia, niezależnie w której strefie zostaną wykryte.",
|
||||
"regardlessOfZoneObjectDetectionsTips": "Wszystkie obiekty w kategorii {{detectionsLabels}} nieskategoryzowane dla kamery {{cameraName}} będą wyświetlane jako Wykrycia niezależnie w której strefie zostaną wykryte."
|
||||
},
|
||||
"unsavedChanges": "Niezapisane ustawienia klasyfikacji przeglądu dla kamery {{camera}}",
|
||||
"selectAlertsZones": "Wybierz strefę dla Alertów",
|
||||
"selectDetectionsZones": "Wybierz strefę dla Wykryć",
|
||||
"limitDetections": "Ogranicz detekcje do konkretnych stref"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -42,11 +42,7 @@
|
||||
"gpuMemory": "Pamięć GPU",
|
||||
"gpuUsage": "Użycie GPU",
|
||||
"npuUsage": "Użycie NPU",
|
||||
"npuMemory": "Pamięć NPU",
|
||||
"intelGpuWarning": {
|
||||
"message": "Statystyki układu graficznego niedostępne",
|
||||
"description": "W narzędziach telemetrii i statystyki układów graficznych firmy Intel (intel_gpu_top) znajduje się znany błąd powodujący raportowanie użycia układu graficznego wynoszące 0%, nawet gdy akceleracja sprzętowa i wykrywanie obiektów działa prawidłowo korzystając ze zintegrowanego układu graficznego. To nie jest błąd oprogramowania Frigate. Restart hosta może chwilowo rozwiązać problem i pozwolić na weryfikację działania układu graficznego. Ten bład nie wpływa na wydajność systemu,"
|
||||
}
|
||||
"npuMemory": "Pamięć NPU"
|
||||
},
|
||||
"title": "Ogólne",
|
||||
"detector": {
|
||||
|
||||
@ -152,12 +152,7 @@
|
||||
"generateSuccess": "Imaginile de exemplu au fost generate cu succes",
|
||||
"allImagesRequired_one": "Te rog să clasifici toate imaginile. {{count}} imagine rămasă.",
|
||||
"allImagesRequired_few": "Te rog să clasifici toate imaginile. {{count}} imagini rămase.",
|
||||
"allImagesRequired_other": "Te rog să clasifici toate imaginile. {{count}} de imagini rămase.",
|
||||
"modelCreated": "Modelul a fost creat cu succes. Folosește vizualizarea Clasificări recente pentru a adăuga imagini pentru stările lipsă, apoi antrenează modelul.",
|
||||
"missingStatesWarning": {
|
||||
"title": "Exemple de stări lipsă",
|
||||
"description": "Nu ai selectat exemple pentru toate stările. Modelul nu va fi antrenat până când toate stările nu au imagini. După continuare, folosește vizualizarea Clasificări recente pentru a clasifica imagini pentru stările lipsă, apoi antrenează modelul."
|
||||
}
|
||||
"allImagesRequired_other": "Te rog să clasifici toate imaginile. {{count}} de imagini rămase."
|
||||
}
|
||||
},
|
||||
"deleteModel": {
|
||||
|
||||
@ -55,8 +55,5 @@
|
||||
"clickToSeek": "Apasă pentru a naviga la acest moment"
|
||||
},
|
||||
"zoomIn": "Mărește",
|
||||
"zoomOut": "Micșorează",
|
||||
"normalActivity": "Normal",
|
||||
"needsReview": "Necesită revizuire",
|
||||
"securityConcern": "Potențială problemă de securitate"
|
||||
"zoomOut": "Micșorează"
|
||||
}
|
||||
|
||||
@ -152,12 +152,7 @@
|
||||
"generateSuccess": "Зразки зображень успішно створено",
|
||||
"allImagesRequired_one": "Будь ласка, класифікуйте всі зображення. Залишилося {{count}} зображення.",
|
||||
"allImagesRequired_few": "Будь ласка, класифікуйте всі зображення. Залишилося зображень: {{count}}.",
|
||||
"allImagesRequired_many": "Будь ласка, класифікуйте всі зображення. Залишилося зображень: {{count}}.",
|
||||
"modelCreated": "Модель успішно створено. Використовуйте режим перегляду «Нещодавні класифікації», щоб додати зображення для відсутніх станів, а потім навчіть модель.",
|
||||
"missingStatesWarning": {
|
||||
"title": "Приклади відсутніх станів",
|
||||
"description": "Ви не вибрали приклади для всіх станів. Модель не буде навчена, доки всі стани не матимуть зображень. Після продовження скористайтеся поданням «Нещодавні класифікації», щоб класифікувати зображення для відсутніх станів, а потім навчіть модель."
|
||||
}
|
||||
"allImagesRequired_many": "Будь ласка, класифікуйте всі зображення. Залишилося зображень: {{count}}."
|
||||
}
|
||||
},
|
||||
"deleteModel": {
|
||||
|
||||
@ -55,8 +55,5 @@
|
||||
"clickToSeek": "Натисніть, щоб перейти до цього часу"
|
||||
},
|
||||
"zoomIn": "Збільшити масштаб",
|
||||
"zoomOut": "Зменшити масштаб",
|
||||
"normalActivity": "Звичайний",
|
||||
"needsReview": "Потребує перегляду",
|
||||
"securityConcern": "Проблема безпеки"
|
||||
"zoomOut": "Зменшити масштаб"
|
||||
}
|
||||
|
||||
@ -1299,8 +1299,7 @@ function ObjectDetailsTab({
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{isAdmin &&
|
||||
search.data.type === "object" &&
|
||||
{search.data.type === "object" &&
|
||||
config?.plus?.enabled &&
|
||||
search.end_time != undefined &&
|
||||
search.has_snapshot && (
|
||||
|
||||
@ -38,7 +38,6 @@ import { isDesktop, isIOS, isMobileOnly, isSafari } from "react-device-detect";
|
||||
import { useApiHost } from "@/api";
|
||||
import ImageLoadingIndicator from "@/components/indicators/ImageLoadingIndicator";
|
||||
import ObjectTrackOverlay from "../ObjectTrackOverlay";
|
||||
import { useIsAdmin } from "@/hooks/use-is-admin";
|
||||
|
||||
type TrackingDetailsProps = {
|
||||
className?: string;
|
||||
@ -778,7 +777,6 @@ function LifecycleIconRow({
|
||||
const { data: config } = useSWR<FrigateConfig>("config");
|
||||
const [isOpen, setIsOpen] = useState(false);
|
||||
const navigate = useNavigate();
|
||||
const isAdmin = useIsAdmin();
|
||||
|
||||
const aspectRatio = useMemo(() => {
|
||||
if (!config) {
|
||||
@ -995,7 +993,7 @@ function LifecycleIconRow({
|
||||
<div className="ml-3 flex-shrink-0 px-1 text-right text-xs text-primary-variant">
|
||||
<div className="flex flex-row items-center gap-3">
|
||||
<div className="whitespace-nowrap">{formattedEventTimestamp}</div>
|
||||
{((isAdmin && config?.plus?.enabled) || item.data.box) && (
|
||||
{(config?.plus?.enabled || item.data.box) && (
|
||||
<DropdownMenu open={isOpen} onOpenChange={setIsOpen}>
|
||||
<DropdownMenuTrigger>
|
||||
<div className="rounded p-1 pr-2" role="button">
|
||||
@ -1004,7 +1002,7 @@ function LifecycleIconRow({
|
||||
</DropdownMenuTrigger>
|
||||
<DropdownMenuPortal>
|
||||
<DropdownMenuContent>
|
||||
{isAdmin && config?.plus?.enabled && (
|
||||
{config?.plus?.enabled && (
|
||||
<DropdownMenuItem
|
||||
className="cursor-pointer"
|
||||
onSelect={async () => {
|
||||
|
||||
@ -20,7 +20,6 @@ import ImageLoadingIndicator from "@/components/indicators/ImageLoadingIndicator
|
||||
import { baseUrl } from "@/api/baseUrl";
|
||||
import { getTranslatedLabel } from "@/utils/i18n";
|
||||
import useImageLoaded from "@/hooks/use-image-loaded";
|
||||
import { useIsAdmin } from "@/hooks/use-is-admin";
|
||||
|
||||
export type FrigatePlusDialogProps = {
|
||||
upload?: Event;
|
||||
@ -58,9 +57,7 @@ export function FrigatePlusDialog({
|
||||
);
|
||||
|
||||
const [imgRef, imgLoaded, onImgLoad] = useImageLoaded();
|
||||
const isAdmin = useIsAdmin();
|
||||
const showCard =
|
||||
isAdmin &&
|
||||
!!upload &&
|
||||
upload.data.type === "object" &&
|
||||
upload.plus_id !== "not_enabled" &&
|
||||
|
||||
@ -20,7 +20,6 @@ import { cn } from "@/lib/utils";
|
||||
import { ASPECT_VERTICAL_LAYOUT, RecordingPlayerError } from "@/types/record";
|
||||
import { useTranslation } from "react-i18next";
|
||||
import ObjectTrackOverlay from "@/components/overlay/ObjectTrackOverlay";
|
||||
import { useIsAdmin } from "@/hooks/use-is-admin";
|
||||
|
||||
// Android native hls does not seek correctly
|
||||
const USE_NATIVE_HLS = false;
|
||||
@ -84,7 +83,6 @@ export default function HlsVideoPlayer({
|
||||
}: HlsVideoPlayerProps) {
|
||||
const { t } = useTranslation("components/player");
|
||||
const { data: config } = useSWR<FrigateConfig>("config");
|
||||
const isAdmin = useIsAdmin();
|
||||
|
||||
// for detail stream context in History
|
||||
const currentTime = currentTimeOverride;
|
||||
@ -287,7 +285,7 @@ export default function HlsVideoPlayer({
|
||||
volume: true,
|
||||
seek: true,
|
||||
playbackRate: true,
|
||||
plusUpload: isAdmin && config?.plus?.enabled == true,
|
||||
plusUpload: config?.plus?.enabled == true,
|
||||
fullscreen: supportsFullscreen,
|
||||
}}
|
||||
setControlsOpen={setControlsOpen}
|
||||
|
||||
@ -13,7 +13,6 @@ import { useTranslation } from "react-i18next";
|
||||
import { Event } from "@/types/event";
|
||||
import { FrigateConfig } from "@/types/frigateConfig";
|
||||
import { useState } from "react";
|
||||
import { useIsAdmin } from "@/hooks/use-is-admin";
|
||||
|
||||
type EventMenuProps = {
|
||||
event: Event;
|
||||
@ -36,7 +35,6 @@ export default function EventMenu({
|
||||
const navigate = useNavigate();
|
||||
const { t } = useTranslation("views/explore");
|
||||
const [isOpen, setIsOpen] = useState(false);
|
||||
const isAdmin = useIsAdmin();
|
||||
|
||||
const handleObjectSelect = () => {
|
||||
if (isSelected) {
|
||||
@ -87,8 +85,7 @@ export default function EventMenu({
|
||||
</a>
|
||||
</DropdownMenuItem>
|
||||
|
||||
{isAdmin &&
|
||||
event.has_snapshot &&
|
||||
{event.has_snapshot &&
|
||||
event.plus_id == undefined &&
|
||||
event.data.type == "object" &&
|
||||
config?.plus?.enabled && (
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user