mirror of
https://github.com/blakeblackshear/frigate.git
synced 2025-12-19 19:46:43 +03:00
Compare commits
26 Commits
64f9e7076b
...
8af52a5d1b
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8af52a5d1b | ||
|
|
b4d8c08aca | ||
|
|
20365b3465 | ||
|
|
f70c23f7d7 | ||
|
|
8a46dbac34 | ||
|
|
0ce4a1b2a0 | ||
|
|
2e8f643ef6 | ||
|
|
15d9b10db1 | ||
|
|
ef95ccd08f | ||
|
|
a43bc8aee4 | ||
|
|
29d4deb0f0 | ||
|
|
4cf94e7828 | ||
|
|
89973e85fd | ||
|
|
82b8ceb2fe | ||
|
|
e128b4a2f1 | ||
|
|
bcd29ec729 | ||
|
|
eecfa1e3fd | ||
|
|
eaeb161297 | ||
|
|
5e6c72179a | ||
|
|
8385f198cb | ||
|
|
175390a2a0 | ||
|
|
e671844a32 | ||
|
|
b45188a282 | ||
|
|
f95fdc6c71 | ||
|
|
b0a74372a0 | ||
|
|
3bbe24f5f8 |
@ -2,7 +2,7 @@ variable "AMDGPU" {
|
|||||||
default = "gfx900"
|
default = "gfx900"
|
||||||
}
|
}
|
||||||
variable "ROCM" {
|
variable "ROCM" {
|
||||||
default = "7.1"
|
default = "7.1.0"
|
||||||
}
|
}
|
||||||
variable "HSA_OVERRIDE_GFX_VERSION" {
|
variable "HSA_OVERRIDE_GFX_VERSION" {
|
||||||
default = ""
|
default = ""
|
||||||
|
|||||||
@ -232,7 +232,7 @@ When your browser runs into problems playing back your camera streams, it will l
|
|||||||
- **mse-decode**
|
- **mse-decode**
|
||||||
|
|
||||||
- What it means: The browser reported a decoding error while trying to play the stream, which usually is a result of a codec incompatibility or corrupted frames.
|
- What it means: The browser reported a decoding error while trying to play the stream, which usually is a result of a codec incompatibility or corrupted frames.
|
||||||
- What to try: Ensure your camera/restream is using H.264 video and AAC audio (these are the most compatible). If your camera uses a non-standard audio codec, configure `go2rtc` to transcode the stream to AAC. Try another browser (some browsers have stricter MSE/codec support) and, for iPhone, ensure you're on iOS 17.1 or newer.
|
- What to try: Check the browser console for the supported and negotiated codecs. Ensure your camera/restream is using H.264 video and AAC audio (these are the most compatible). If your camera uses a non-standard audio codec, configure `go2rtc` to transcode the stream to AAC. Try another browser (some browsers have stricter MSE/codec support) and, for iPhone, ensure you're on iOS 17.1 or newer.
|
||||||
|
|
||||||
- Possible console messages from the player code:
|
- Possible console messages from the player code:
|
||||||
|
|
||||||
|
|||||||
@ -1753,7 +1753,7 @@ def create_trigger_embedding(
|
|||||||
body.data, (base64.b64encode(thumbnail).decode("ASCII"))
|
body.data, (base64.b64encode(thumbnail).decode("ASCII"))
|
||||||
)
|
)
|
||||||
|
|
||||||
if embedding is None:
|
if not embedding:
|
||||||
return JSONResponse(
|
return JSONResponse(
|
||||||
content={
|
content={
|
||||||
"success": False,
|
"success": False,
|
||||||
@ -1888,7 +1888,7 @@ def update_trigger_embedding(
|
|||||||
body.data, (base64.b64encode(thumbnail).decode("ASCII"))
|
body.data, (base64.b64encode(thumbnail).decode("ASCII"))
|
||||||
)
|
)
|
||||||
|
|
||||||
if embedding is None:
|
if not embedding:
|
||||||
return JSONResponse(
|
return JSONResponse(
|
||||||
content={
|
content={
|
||||||
"success": False,
|
"success": False,
|
||||||
|
|||||||
@ -32,7 +32,9 @@
|
|||||||
"renamedCategory": "Klasse erfolgreich in {{name}} umbenannt"
|
"renamedCategory": "Klasse erfolgreich in {{name}} umbenannt"
|
||||||
},
|
},
|
||||||
"error": {
|
"error": {
|
||||||
"deleteImageFailed": "Löschen fehlgeschlagen: {{errorMessage}}"
|
"deleteImageFailed": "Löschen fehlgeschlagen: {{errorMessage}}",
|
||||||
|
"deleteCategoryFailed": "Klasse konnte nicht gelöscht werden: {{errorMessage}}",
|
||||||
|
"deleteModelFailed": "Model konnte nicht gelöscht werden: {{errorMessage}}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -46,6 +46,12 @@
|
|||||||
"trackedObject_other": "{{count}} Objekte",
|
"trackedObject_other": "{{count}} Objekte",
|
||||||
"noObjectDetailData": "Keine detaillierten Daten des Objekt verfügbar.",
|
"noObjectDetailData": "Keine detaillierten Daten des Objekt verfügbar.",
|
||||||
"noDataFound": "Keine Detaildaten zur Überprüfung",
|
"noDataFound": "Keine Detaildaten zur Überprüfung",
|
||||||
"settings": "Detailansicht Einstellungen"
|
"settings": "Detailansicht Einstellungen",
|
||||||
|
"alwaysExpandActive": {
|
||||||
|
"desc": "Immer die Objektdetails des aktiven Überprüfungselements erweitern, sofern verfügbar."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"objectTrack": {
|
||||||
|
"trackedPoint": "Verfolgter Punkt"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -277,6 +277,7 @@
|
|||||||
"carousel": {
|
"carousel": {
|
||||||
"previous": "Vorherige Anzeige",
|
"previous": "Vorherige Anzeige",
|
||||||
"next": "Nächste Anzeige"
|
"next": "Nächste Anzeige"
|
||||||
}
|
},
|
||||||
|
"title": "Verfolgungsdetails"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -53,6 +53,7 @@
|
|||||||
"selectOrExport": "Select or Export",
|
"selectOrExport": "Select or Export",
|
||||||
"toast": {
|
"toast": {
|
||||||
"success": "Successfully started export. View the file in the exports page.",
|
"success": "Successfully started export. View the file in the exports page.",
|
||||||
|
"view": "View",
|
||||||
"error": {
|
"error": {
|
||||||
"failed": "Failed to start export: {{error}}",
|
"failed": "Failed to start export: {{error}}",
|
||||||
"endTimeMustAfterStartTime": "End time must be after start time",
|
"endTimeMustAfterStartTime": "End time must be after start time",
|
||||||
|
|||||||
@ -61,7 +61,8 @@
|
|||||||
"header": {
|
"header": {
|
||||||
"zones": "Zones",
|
"zones": "Zones",
|
||||||
"ratio": "Ratio",
|
"ratio": "Ratio",
|
||||||
"area": "Area"
|
"area": "Area",
|
||||||
|
"score": "Score"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"annotationSettings": {
|
"annotationSettings": {
|
||||||
|
|||||||
@ -4,7 +4,8 @@
|
|||||||
"deleteClassificationAttempts": "Osztályozási képek törlése",
|
"deleteClassificationAttempts": "Osztályozási képek törlése",
|
||||||
"deleteImages": "Képek törlése",
|
"deleteImages": "Képek törlése",
|
||||||
"trainModel": "Modell betanítása",
|
"trainModel": "Modell betanítása",
|
||||||
"deleteModels": "Modellek törlése"
|
"deleteModels": "Modellek törlése",
|
||||||
|
"editModel": "Modell szerkesztése"
|
||||||
},
|
},
|
||||||
"toast": {
|
"toast": {
|
||||||
"success": {
|
"success": {
|
||||||
|
|||||||
@ -53,7 +53,7 @@
|
|||||||
"regenerate": "È stata richiesta una nuova descrizione a {{provider}}. A seconda della velocità del tuo provider, la rigenerazione della nuova descrizione potrebbe richiedere del tempo.",
|
"regenerate": "È stata richiesta una nuova descrizione a {{provider}}. A seconda della velocità del tuo provider, la rigenerazione della nuova descrizione potrebbe richiedere del tempo.",
|
||||||
"updatedSublabel": "Sottoetichetta aggiornata correttamente.",
|
"updatedSublabel": "Sottoetichetta aggiornata correttamente.",
|
||||||
"updatedLPR": "Targa aggiornata con successo.",
|
"updatedLPR": "Targa aggiornata con successo.",
|
||||||
"audioTranscription": "Trascrizione audio richiesta con successo."
|
"audioTranscription": "Trascrizione audio richiesta con successo. A seconda della velocità del server Frigate, la trascrizione potrebbe richiedere del tempo."
|
||||||
},
|
},
|
||||||
"error": {
|
"error": {
|
||||||
"regenerate": "Impossibile chiamare {{provider}} per una nuova descrizione: {{errorMessage}}",
|
"regenerate": "Impossibile chiamare {{provider}} per una nuova descrizione: {{errorMessage}}",
|
||||||
|
|||||||
@ -71,7 +71,7 @@
|
|||||||
},
|
},
|
||||||
"snapshots": {
|
"snapshots": {
|
||||||
"enable": "Permitir Capturas de Imagem",
|
"enable": "Permitir Capturas de Imagem",
|
||||||
"disable": "Desativar Campturas de Imagem"
|
"disable": "Desativar Capturas de Imagem"
|
||||||
},
|
},
|
||||||
"audioDetect": {
|
"audioDetect": {
|
||||||
"enable": "Ativar Detecção de Áudio",
|
"enable": "Ativar Detecção de Áudio",
|
||||||
|
|||||||
@ -106,7 +106,7 @@
|
|||||||
"regenerate": "O nouă descriere a fost solicitată de la {{provider}}. În funcție de viteza furnizorului tău, regenerarea noii descrieri poate dura ceva timp.",
|
"regenerate": "O nouă descriere a fost solicitată de la {{provider}}. În funcție de viteza furnizorului tău, regenerarea noii descrieri poate dura ceva timp.",
|
||||||
"updatedSublabel": "Subeticheta a fost actualizată cu succes.",
|
"updatedSublabel": "Subeticheta a fost actualizată cu succes.",
|
||||||
"updatedLPR": "Plăcuța de înmatriculare a fost actualizată cu succes.",
|
"updatedLPR": "Plăcuța de înmatriculare a fost actualizată cu succes.",
|
||||||
"audioTranscription": "Transcrierea audio a fost solicitată cu succes."
|
"audioTranscription": "Transcrierea audio a fost solicitată cu succes. În funcție de viteza serverului dumneavoastră Frigate, transcrierea poate dura ceva timp până la finalizare."
|
||||||
},
|
},
|
||||||
"error": {
|
"error": {
|
||||||
"updatedSublabelFailed": "Nu s-a putut actualiza sub-etichetarea: {{errorMessage}}",
|
"updatedSublabelFailed": "Nu s-a putut actualiza sub-etichetarea: {{errorMessage}}",
|
||||||
|
|||||||
@ -57,7 +57,7 @@
|
|||||||
},
|
},
|
||||||
"liveFallbackTimeout": {
|
"liveFallbackTimeout": {
|
||||||
"label": "Timp de expirare pentru redarea live",
|
"label": "Timp de expirare pentru redarea live",
|
||||||
"desc": "Când stream-ul live de înaltă calitate al unei camere nu este disponibil, revino la modul de lățime de bandă redusă după acest număr de secunde. Valoare implicită: 3."
|
"desc": "Când stream-ul live de înaltă calitate al unei camere nu este disponibil, revino la modul cu lățime de bandă scăzută după acest număr de secunde. Implicit: 3."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"storedLayouts": {
|
"storedLayouts": {
|
||||||
@ -833,9 +833,9 @@
|
|||||||
"createRole": "Rolul {{role}} a fost creat cu succes",
|
"createRole": "Rolul {{role}} a fost creat cu succes",
|
||||||
"updateCameras": "Camerele au fost actualizate pentru rolul {{role}}",
|
"updateCameras": "Camerele au fost actualizate pentru rolul {{role}}",
|
||||||
"deleteRole": "Rolul {{role}} a fost șters cu succes",
|
"deleteRole": "Rolul {{role}} a fost șters cu succes",
|
||||||
"userRolesUpdated_one": "{{count}} utilizator(i) atribuiți acestui rol au fost actualizați la „vizualizator”, care are acces la toate camerele.",
|
"userRolesUpdated_one": "{{count}} utilizator atribuit acestui rol a fost actualizat la „vizualizator”, care are acces la toate camerele.",
|
||||||
"userRolesUpdated_few": "{{count}} utilizator atribuit acestui rol a fost actualizat la „vizualizator”, care are acces la toate camerele.",
|
"userRolesUpdated_few": "{{count}} utilizatori atribuiți acestui rol au fost actualizați la „vizualizatori”, care are acces la toate camerele.",
|
||||||
"userRolesUpdated_other": "{{count}} utilizatori atribuiți acestui rol au fost actualizați la „vizualizator”, care are acces la toate camerele."
|
"userRolesUpdated_other": "{{count}} de utilizatori atribuiți acestui rol au fost actualizați la „vizualizatori”, care are acces la toate camerele."
|
||||||
},
|
},
|
||||||
"error": {
|
"error": {
|
||||||
"createRoleFailed": "Crearea rolului a eșuat: {{errorMessage}}",
|
"createRoleFailed": "Crearea rolului a eșuat: {{errorMessage}}",
|
||||||
@ -883,7 +883,7 @@
|
|||||||
"nameAndConnection": "Nume și Conexiune",
|
"nameAndConnection": "Nume și Conexiune",
|
||||||
"streamConfiguration": "Configurare streaming",
|
"streamConfiguration": "Configurare streaming",
|
||||||
"validationAndTesting": "Validare și Testare",
|
"validationAndTesting": "Validare și Testare",
|
||||||
"probeOrSnapshot": "Test sau snapshot"
|
"probeOrSnapshot": "Sondează sau fă snapshot"
|
||||||
},
|
},
|
||||||
"save": {
|
"save": {
|
||||||
"success": "Camera nouă {{cameraName}} a fost salvată cu succes.",
|
"success": "Camera nouă {{cameraName}} a fost salvată cu succes.",
|
||||||
@ -941,15 +941,15 @@
|
|||||||
"probingMetadata": "Sondare metadate cameră...",
|
"probingMetadata": "Sondare metadate cameră...",
|
||||||
"fetchingSnapshot": "Preluare snapshot cameră..."
|
"fetchingSnapshot": "Preluare snapshot cameră..."
|
||||||
},
|
},
|
||||||
"connectionSettings": "Setări de conexiune",
|
"connectionSettings": "Setări conexiune",
|
||||||
"detectionMethod": "Metodă de detectare a stream-ului",
|
"detectionMethod": "Metoda de detecție stream",
|
||||||
"onvifPort": "Portul ONVIF",
|
"onvifPort": "Port ONVIF",
|
||||||
"probeMode": "Testează camera",
|
"probeMode": "Sondare cameră",
|
||||||
"manualMode": "Selectare manuală",
|
"manualMode": "Selecție manuală",
|
||||||
"detectionMethodDescription": "Testează camera cu ONVIF (dacă este suportat) pentru a găsi URL-urile de stream ale camerei sau selectează manual marca camerei pentru a folosi URL-uri predefinite. Pentru a introduce un URL RTSP personalizat, alege metoda manuală și selectează „Altele”.",
|
"detectionMethodDescription": "Sondează camera cu ONVIF (dacă este suportat) pentru a găsi URL-urile de stream ale camerei, sau selectează manual marca camerei pentru a utiliza URL-uri predefinite. Pentru a introduce un URL RTSP personalizat, alege metoda manuală și selectează \"Altele\".",
|
||||||
"onvifPortDescription": "Pentru camerele care suportă ONVIF, acesta este de obicei 80 sau 8080.",
|
"onvifPortDescription": "Pentru camerele care suportă ONVIF, acesta este de obicei 80 sau 8080.",
|
||||||
"useDigestAuth": "Folosește autentificare digest",
|
"useDigestAuth": "Utilizați autentificarea digest",
|
||||||
"useDigestAuthDescription": "Folosește autentificare HTTP digest pentru ONVIF. Unele camere pot necesita un nume de utilizator/parolă ONVIF dedicat în locul utilizatorului standard admin."
|
"useDigestAuthDescription": "Utilizați autentificarea HTTP digest pentru ONVIF. Unele camere pot necesita un nume de utilizator/parolă ONVIF dedicat în locul utilizatorului standard de administrare."
|
||||||
},
|
},
|
||||||
"step2": {
|
"step2": {
|
||||||
"description": "Testează camera pentru fluxurile disponibile sau configurează setările manuale pe baza metodei de detectare selectate.",
|
"description": "Testează camera pentru fluxurile disponibile sau configurează setările manuale pe baza metodei de detectare selectate.",
|
||||||
@ -990,36 +990,36 @@
|
|||||||
"description": "Folosește restreaming go2rtc pentru a reduce conexiunile la cameră."
|
"description": "Folosește restreaming go2rtc pentru a reduce conexiunile la cameră."
|
||||||
},
|
},
|
||||||
"streamDetails": "Detalii stream",
|
"streamDetails": "Detalii stream",
|
||||||
"probing": "Se testează camera...",
|
"probing": "Se sondează camera...",
|
||||||
"retry": "Reîncearcă",
|
"retry": "Reîncercare",
|
||||||
"testing": {
|
"testing": {
|
||||||
"probingMetadata": "Se testează metadatele camerei...",
|
"probingMetadata": "Se sondează metadatele camerei...",
|
||||||
"fetchingSnapshot": "Se preia snapshot-ul camerei..."
|
"fetchingSnapshot": "Se aduce snapshot cameră..."
|
||||||
},
|
},
|
||||||
"probeFailed": "Nu s-a putut testa camera: {{error}}",
|
"probeFailed": "Sondarea camerei a eșuat: {{error}}",
|
||||||
"probingDevice": "Se testează dispozitivul...",
|
"probingDevice": "Se sondează dispozitivul...",
|
||||||
"probeSuccessful": "Testul a fost realizat cu succes",
|
"probeSuccessful": "Sondare reușită",
|
||||||
"probeError": "Eroare la testare",
|
"probeError": "Eroare la sondare",
|
||||||
"probeNoSuccess": "Testul a eșuat",
|
"probeNoSuccess": "Sondare nereușită",
|
||||||
"deviceInfo": "Informații dispozitiv",
|
"deviceInfo": "Informații dispozitiv",
|
||||||
"manufacturer": "Producător",
|
"manufacturer": "Producător",
|
||||||
"model": "Model",
|
"model": "Model",
|
||||||
"firmware": "Firmware",
|
"firmware": "Firmware",
|
||||||
"profiles": "Profiluri",
|
"profiles": "Profiluri",
|
||||||
"ptzSupport": "Suport PTZ",
|
"ptzSupport": "Suport PTZ",
|
||||||
"autotrackingSupport": "Suport pentru urmărire automată",
|
"autotrackingSupport": "Suport autourmărire",
|
||||||
"presets": "Presetări",
|
"presets": "Presetări",
|
||||||
"rtspCandidates": "Candidați RTSP",
|
"rtspCandidates": "Candidați RTSP",
|
||||||
"rtspCandidatesDescription": "Următoarele URL-uri RTSP au fost găsite în urma testului camerei. Testează conexiunea pentru a vizualiza metadatele fluxului.",
|
"rtspCandidatesDescription": "Următoarele URL-uri RTSP au fost găsite în urma sondării camerei. Testați conexiunea pentru a vizualiza metadatele stream-ului.",
|
||||||
"noRtspCandidates": "Nu au fost găsite URL-uri RTSP pentru cameră. Datele tale de autentificare pot fi incorecte sau camera poate să nu suporte ONVIF sau metoda folosită pentru a obține URL-urile RTSP. Revino și introdu URL-ul RTSP manual.",
|
"noRtspCandidates": "Nu au fost găsite URL-uri RTSP de la cameră. Este posibil ca datele dumneavoastră de autentificare să fie incorecte, sau este posibil ca aparatul foto să nu suporte ONVIF sau metoda utilizată pentru a prelua URL-urile RTSP. Întoarceți-vă și introduceți URL-ul RTSP manual.",
|
||||||
"candidateStreamTitle": "Candidat {{number}}",
|
"candidateStreamTitle": "Candidat {{number}}",
|
||||||
"useCandidate": "Folosește",
|
"useCandidate": "Folosește",
|
||||||
"uriCopy": "Copiază",
|
"uriCopy": "Copiază",
|
||||||
"uriCopied": "URI copiat în clipboard",
|
"uriCopied": "URI copiat în clipboard",
|
||||||
"testConnection": "Testează conexiunea",
|
"testConnection": "Testează conexiunea",
|
||||||
"toggleUriView": "Click pentru a comuta la vizualizarea completă a URI-ulu",
|
"toggleUriView": "Click pentru a comuta vizualizarea URI completă",
|
||||||
"errors": {
|
"errors": {
|
||||||
"hostRequired": "Adresa gazdă/IP este obligatorie"
|
"hostRequired": "Gazdă/adresaIP este necesară"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"step3": {
|
"step3": {
|
||||||
@ -1069,84 +1069,84 @@
|
|||||||
"addStream": "Adaugă stream",
|
"addStream": "Adaugă stream",
|
||||||
"addAnotherStream": "Adaugă alt stream",
|
"addAnotherStream": "Adaugă alt stream",
|
||||||
"streamUrl": "URL stream",
|
"streamUrl": "URL stream",
|
||||||
"streamUrlPlaceholder": "rtsp://utilizator:parolă@gazdă:port/cale",
|
"streamUrlPlaceholder": "rtsp://utilizator:parolă@adresaIP:port/cale",
|
||||||
"selectStream": "Selectează stream",
|
"selectStream": "Selectați un flux",
|
||||||
"searchCandidates": "Se caută candidați...",
|
"searchCandidates": "Căutați candidați...",
|
||||||
"noStreamFound": "Nu a fost găsit niciun stream",
|
"noStreamFound": "Niciun stream găsit",
|
||||||
"url": "URL",
|
"url": "URL",
|
||||||
"resolution": "Rezoluție",
|
"resolution": "Rezoluție",
|
||||||
"quality": "Calitate",
|
"quality": "Calitate",
|
||||||
"selectResolution": "Selectează rezoluția",
|
"selectResolution": "Selectează rezoluția",
|
||||||
"selectQuality": "Selectează calitatea",
|
"selectQuality": "Selectează calitatea",
|
||||||
"roleLabels": {
|
"roleLabels": {
|
||||||
"detect": "Detectare obiecte",
|
"detect": "Detecție Obiect",
|
||||||
"record": "Înregistrare",
|
"record": "Înregistrare",
|
||||||
"audio": "Audio"
|
"audio": "Audio"
|
||||||
},
|
},
|
||||||
"testStream": "Testează conexiunea",
|
"testStream": "Testează conexiunea",
|
||||||
"testSuccess": "Stream-ul a fost testat cu succes!",
|
"testSuccess": "Testul stream-ului a avut succes!",
|
||||||
"testFailed": "Testul stream-ului a eșuat",
|
"testFailed": "Testul stream-ului a eșuat",
|
||||||
"testFailedTitle": "Testul a eșuat",
|
"testFailedTitle": "Testul a eșuat",
|
||||||
"connected": "Conectat",
|
"connected": "Conectat",
|
||||||
"notConnected": "Neconectat",
|
"notConnected": "Neconectat",
|
||||||
"featuresTitle": "Funcționalități",
|
"featuresTitle": "Funcționalități",
|
||||||
"go2rtc": "Reduceți conexiunile la cameră",
|
"go2rtc": "Reduceți conexiunile la cameră",
|
||||||
"detectRoleWarning": "Cel puțin un stream trebuie să aibă rolul „detect” pentru a continua.",
|
"detectRoleWarning": "Cel puțin un stream trebuie să aibă rolul \"detect\" pentru a continua.",
|
||||||
"rolesPopover": {
|
"rolesPopover": {
|
||||||
"title": "Roluri stream",
|
"title": "Roluri stream",
|
||||||
"detect": "Stream principal pentru detectarea obiectelor.",
|
"detect": "Stream principal pentru detecția obiectelor.",
|
||||||
"record": "Salvează segmente din stream-ul video pe baza setărilor de configurare.",
|
"record": "Salvează segmente ale stream-ului video pe baza setărilor de configurare.",
|
||||||
"audio": "Stream pentru detectarea bazată pe audio."
|
"audio": "Stream pentru detecția bazată pe audio."
|
||||||
},
|
},
|
||||||
"featuresPopover": {
|
"featuresPopover": {
|
||||||
"title": "Funcționalități stream",
|
"title": "Funcționalități stream",
|
||||||
"description": "Folosește redirecționarea go2rtc pentru a reduce conexiunile către camera ta."
|
"description": "Utilizați go2rtc restreaming pentru a reduce conexiunile la cameră."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"step4": {
|
"step4": {
|
||||||
"description": "Validare și analiză finală înainte de salvarea noii camere. Conectează fiecare stream înainte de a salva.",
|
"description": "Validare finală și analiză înainte de a salva noua cameră. Conectați fiecare stream înainte de a salva.",
|
||||||
"validationTitle": "Validare stream",
|
"validationTitle": "Validare stream",
|
||||||
"connectAllStreams": "Conectează toate streamurile",
|
"connectAllStreams": "Conectează toate stream-urile",
|
||||||
"reconnectionSuccess": "Reconectare reușită.",
|
"reconnectionSuccess": "Reconectare reușită.",
|
||||||
"reconnectionPartial": "Unele stream-uri nu s-au reconectat.",
|
"reconnectionPartial": "Unele stream-uri nu au reușit să se reconecteze.",
|
||||||
"streamUnavailable": "Previzualizarea stream indisponibilă",
|
"streamUnavailable": "Previzualizare flux indisponibilă",
|
||||||
"reload": "Reîncarcă",
|
"reload": "Reîncarcă",
|
||||||
"connecting": "Se conectează...",
|
"connecting": "Conectare...",
|
||||||
"streamTitle": "Stream {{number}}",
|
"streamTitle": "Stream {{number}}",
|
||||||
"valid": "Valid",
|
"valid": "Valid",
|
||||||
"failed": "A eșuat",
|
"failed": "Eșuat",
|
||||||
"notTested": "Nu s-a testat",
|
"notTested": "Netestat",
|
||||||
"connectStream": "Conectare",
|
"connectStream": "Conectare",
|
||||||
"connectingStream": "Se conectează",
|
"connectingStream": "Se conectează",
|
||||||
"disconnectStream": "Deconectare",
|
"disconnectStream": "Deconectare",
|
||||||
"estimatedBandwidth": "Lățime de bandă estimată",
|
"estimatedBandwidth": "Lățime de bandă estimată",
|
||||||
"roles": "Roluri",
|
"roles": "Roluri",
|
||||||
"ffmpegModule": "Folosește modul de compatibilitate al fluxului",
|
"ffmpegModule": "Utilizează modul de compatibilitate stream",
|
||||||
"ffmpegModuleDescription": "Dacă stream-ul nu se încarcă după mai multe încercări, încearcă să activezi această opțiune. Când este activată, Frigate va folosi modulul ffmpeg împreună cu go2rtc. Aceasta poate oferi o compatibilitate mai bună cu unele stream-uri de camere.",
|
"ffmpegModuleDescription": "Dacă stream-ul nu se încarcă după câteva încercări, activați această opțiune. Când este activată, Frigate va utiliza modulul ffmpeg cu go2rtc. Acest lucru poate oferi o compatibilitate mai bună cu unele stream-uri de cameră.",
|
||||||
"none": "Niciunul",
|
"none": "Niciuna",
|
||||||
"error": "Eroare",
|
"error": "Eroare",
|
||||||
"streamValidated": "Stream-ul {{number}} a fost validat cu succes",
|
"streamValidated": "Stream-ul {{number}} validat cu succes",
|
||||||
"streamValidationFailed": "Validarea stream-ului {{number}} a eșuat",
|
"streamValidationFailed": "Validarea stream-ului {{number}} a eșuat",
|
||||||
"saveAndApply": "Salvează camera nouă",
|
"saveAndApply": "Salvează camera nouă",
|
||||||
"saveError": "Configurație invalidă. Vă rugăm să verificați setările.",
|
"saveError": "Configurație nevalidă. Vă rugăm să vă verificați setările.",
|
||||||
"issues": {
|
"issues": {
|
||||||
"title": "Validare Stream",
|
"title": "Validare stream",
|
||||||
"videoCodecGood": "Codec-ul video este {{codec}}.",
|
"videoCodecGood": "Codecul video: {{codec}}.",
|
||||||
"audioCodecGood": "Codec-ul audio este {{codec}}.",
|
"audioCodecGood": "Codecul audio: {{codec}}.",
|
||||||
"resolutionHigh": "O rezoluție de {{resolution}} poate cauza o utilizare crescută a resurselor.",
|
"resolutionHigh": "O rezoluție de {{resolution}} poate cauza o utilizare crescută a resurselor.",
|
||||||
"resolutionLow": "O rezoluție de {{resolution}} poate fi prea scăzută pentru detectarea fiabilă a obiectelor mici.",
|
"resolutionLow": "O rezoluție de {{resolution}} ar putea fi prea mică pentru detectarea fiabilă a obiectelor mici.",
|
||||||
"noAudioWarning": "Nu s-a detectat audio pentru acest flux, înregistrările nu vor avea sunet.",
|
"noAudioWarning": "Nu a fost detectat audio pentru acest stream, înregistrările nu vor avea audio.",
|
||||||
"audioCodecRecordError": "Codec-ul audio AAC este necesar pentru a suporta audio în înregistrări.",
|
"audioCodecRecordError": "Codec-ul audio AAC este necesar pentru a suporta audio în înregistrări.",
|
||||||
"audioCodecRequired": "Un stream audio este necesar pentru a suporta detectarea audio.",
|
"audioCodecRequired": "Este necesar un stream audio pentru a suporta detecția audio.",
|
||||||
"restreamingWarning": "Reducerea conexiunilor la cameră pentru stream-ul de înregistrare poate crește ușor utilizarea procesorului.",
|
"restreamingWarning": "Reducerea conexiunilor la cameră pentru stream-ul de înregistrare poate crește ușor utilizarea procesorului (CPU).",
|
||||||
"brands": {
|
"brands": {
|
||||||
"reolink-rtsp": "Reolink RTSP nu este recomandat. Activați HTTP în setările de firmware ale camerei și reporniți asistentul."
|
"reolink-rtsp": "RTSP Reolink nu este recomandat. Activați HTTP în setările de firmware ale camerei și reporniți asistentul."
|
||||||
},
|
},
|
||||||
"dahua": {
|
"dahua": {
|
||||||
"substreamWarning": "Substream-ul 1 este blocat la o rezoluție scăzută. Multe camere Dahua / Amcrest / EmpireTech suportă substream-uri adiționale care trebuie activate în setările camerei. Este recomandat să verificați și să utilizați acele stream-uri, dacă sunt disponibile."
|
"substreamWarning": "Substream-ul 1 este blocat la o rezoluție scăzută. Multe camere Dahua / Amcrest / EmpireTech suportă stream-uri secundare suplimentare care trebuie activate în setările camerei. Se recomandă să verificați și să utilizați aceste stream-uri dacă sunt disponibile."
|
||||||
},
|
},
|
||||||
"hikvision": {
|
"hikvision": {
|
||||||
"substreamWarning": "Substream-ul 1 este blocat la o rezoluție scăzută. Multe camere Hikvision suportă substream-uri adiționale care trebuie activate în setările camerei. Este recomandat să verificați și să utilizați acele stream-uri, dacă sunt disponibile."
|
"substreamWarning": "Substream-ul 1 este blocat la o rezoluție scăzută. Multe camere Hikvision suportă stream-uri secundare suplimentare care trebuie activate în setările camerei. Se recomandă să verificați și să utilizați aceste stream-uri dacă sunt disponibile."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -48,7 +48,7 @@
|
|||||||
"regenerate": "En ny beskrivning har begärts från {{provider}}. Beroende på din leverantörs hastighet kan det ta lite tid att generera den nya beskrivningen.",
|
"regenerate": "En ny beskrivning har begärts från {{provider}}. Beroende på din leverantörs hastighet kan det ta lite tid att generera den nya beskrivningen.",
|
||||||
"updatedSublabel": "Underetiketten har uppdaterats.",
|
"updatedSublabel": "Underetiketten har uppdaterats.",
|
||||||
"updatedLPR": "Nummerplåt har uppdaterats.",
|
"updatedLPR": "Nummerplåt har uppdaterats.",
|
||||||
"audioTranscription": "Ljudtranskription har begärts."
|
"audioTranscription": "Ljudtranskription har begärts. Beroende på hastigheten på din Frigate-server kan transkriptionen ta lite tid att slutföra."
|
||||||
},
|
},
|
||||||
"error": {
|
"error": {
|
||||||
"regenerate": "Kunde inte ringa {{provider}} för en ny beskrivning: {{errorMessage}}",
|
"regenerate": "Kunde inte ringa {{provider}} för en ny beskrivning: {{errorMessage}}",
|
||||||
|
|||||||
@ -76,7 +76,12 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"npuUsage": "NPU-användning",
|
"npuUsage": "NPU-användning",
|
||||||
"npuMemory": "NPU-minne"
|
"npuMemory": "NPU-minne",
|
||||||
|
"intelGpuWarning": {
|
||||||
|
"title": "Intel GPU statistik varning",
|
||||||
|
"message": "GPU statistik otillgänglig",
|
||||||
|
"description": "Detta är en känd bugg i Intels GPU-statistikrapporteringsverktyg (intel_gpu_top) där den slutar fungera och upprepade gånger returnerar en GPU-användning på 0 %, även i fall där hårdvaruacceleration och objektdetektering körs korrekt på (i)GPU:n. Detta är inte en Frigate-bugg. Du kan starta om värden för att tillfälligt åtgärda problemet och bekräfta att GPU:n fungerar korrekt. Detta påverkar inte prestandan."
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"otherProcesses": {
|
"otherProcesses": {
|
||||||
"title": "Övriga processer",
|
"title": "Övriga processer",
|
||||||
|
|||||||
@ -87,7 +87,7 @@ export default function ReviewCard({
|
|||||||
position: "top-center",
|
position: "top-center",
|
||||||
action: (
|
action: (
|
||||||
<a href="/export" target="_blank" rel="noopener noreferrer">
|
<a href="/export" target="_blank" rel="noopener noreferrer">
|
||||||
<Button>View</Button>
|
<Button>{t("export.toast.view")}</Button>
|
||||||
</a>
|
</a>
|
||||||
),
|
),
|
||||||
});
|
});
|
||||||
|
|||||||
@ -148,7 +148,9 @@ export default function Step3ChooseExamples({
|
|||||||
// Step 3: Kick off training
|
// Step 3: Kick off training
|
||||||
await axios.post(`/classification/${step1Data.modelName}/train`);
|
await axios.post(`/classification/${step1Data.modelName}/train`);
|
||||||
|
|
||||||
toast.success(t("wizard.step3.trainingStarted"));
|
toast.success(t("wizard.step3.trainingStarted"), {
|
||||||
|
closeButton: true,
|
||||||
|
});
|
||||||
setIsTraining(true);
|
setIsTraining(true);
|
||||||
},
|
},
|
||||||
[step1Data, step2Data, t],
|
[step1Data, step2Data, t],
|
||||||
|
|||||||
@ -314,11 +314,10 @@ function GeneralFilterButton({
|
|||||||
<PlatformAwareDialog
|
<PlatformAwareDialog
|
||||||
trigger={trigger}
|
trigger={trigger}
|
||||||
content={content}
|
content={content}
|
||||||
contentClassName={
|
contentClassName={cn(
|
||||||
isDesktop
|
"scrollbar-container h-auto overflow-y-auto",
|
||||||
? "scrollbar-container h-auto max-h-[80dvh] overflow-y-auto"
|
isDesktop ? "max-h-[80dvh]" : "px-4",
|
||||||
: "max-h-[75dvh] overflow-hidden p-4"
|
)}
|
||||||
}
|
|
||||||
open={open}
|
open={open}
|
||||||
onOpenChange={(open) => {
|
onOpenChange={(open) => {
|
||||||
if (!open) {
|
if (!open) {
|
||||||
@ -510,11 +509,10 @@ function SortTypeButton({
|
|||||||
<PlatformAwareDialog
|
<PlatformAwareDialog
|
||||||
trigger={trigger}
|
trigger={trigger}
|
||||||
content={content}
|
content={content}
|
||||||
contentClassName={
|
contentClassName={cn(
|
||||||
isDesktop
|
"scrollbar-container h-auto overflow-y-auto",
|
||||||
? "scrollbar-container h-auto max-h-[80dvh] overflow-y-auto"
|
isDesktop ? "max-h-[80dvh]" : "px-4",
|
||||||
: "max-h-[75dvh] overflow-hidden p-4"
|
)}
|
||||||
}
|
|
||||||
open={open}
|
open={open}
|
||||||
onOpenChange={(open) => {
|
onOpenChange={(open) => {
|
||||||
if (!open) {
|
if (!open) {
|
||||||
|
|||||||
@ -97,7 +97,7 @@ export default function ExportDialog({
|
|||||||
position: "top-center",
|
position: "top-center",
|
||||||
action: (
|
action: (
|
||||||
<a href="/export" target="_blank" rel="noopener noreferrer">
|
<a href="/export" target="_blank" rel="noopener noreferrer">
|
||||||
<Button>View</Button>
|
<Button>{t("export.toast.view")}</Button>
|
||||||
</a>
|
</a>
|
||||||
),
|
),
|
||||||
});
|
});
|
||||||
|
|||||||
@ -106,7 +106,9 @@ export default function MobileReviewSettingsDrawer({
|
|||||||
position: "top-center",
|
position: "top-center",
|
||||||
action: (
|
action: (
|
||||||
<a href="/export" target="_blank" rel="noopener noreferrer">
|
<a href="/export" target="_blank" rel="noopener noreferrer">
|
||||||
<Button>View</Button>
|
<Button>
|
||||||
|
{t("export.toast.view", { ns: "components/dialog" })}
|
||||||
|
</Button>
|
||||||
</a>
|
</a>
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
|||||||
@ -44,8 +44,8 @@ export default function PlatformAwareDialog({
|
|||||||
return (
|
return (
|
||||||
<Drawer open={open} onOpenChange={onOpenChange}>
|
<Drawer open={open} onOpenChange={onOpenChange}>
|
||||||
<DrawerTrigger asChild>{trigger}</DrawerTrigger>
|
<DrawerTrigger asChild>{trigger}</DrawerTrigger>
|
||||||
<DrawerContent className="max-h-[75dvh] overflow-hidden px-4">
|
<DrawerContent className="max-h-[75dvh] overflow-hidden">
|
||||||
{content}
|
<div className={contentClassName}>{content}</div>
|
||||||
</DrawerContent>
|
</DrawerContent>
|
||||||
</Drawer>
|
</Drawer>
|
||||||
);
|
);
|
||||||
|
|||||||
@ -94,12 +94,19 @@ function MSEPlayer({
|
|||||||
console.error(
|
console.error(
|
||||||
`${camera} - MSE error '${error}': ${description} See the documentation: https://docs.frigate.video/configuration/live/#live-player-error-messages`,
|
`${camera} - MSE error '${error}': ${description} See the documentation: https://docs.frigate.video/configuration/live/#live-player-error-messages`,
|
||||||
);
|
);
|
||||||
|
|
||||||
if (mseCodecRef.current) {
|
if (mseCodecRef.current) {
|
||||||
// eslint-disable-next-line no-console
|
// eslint-disable-next-line no-console
|
||||||
console.error(`${camera} - MSE codec in use: ${mseCodecRef.current}`);
|
console.error(
|
||||||
|
`${camera} - Browser negotiated codecs: ${mseCodecRef.current}`,
|
||||||
|
);
|
||||||
|
// eslint-disable-next-line no-console
|
||||||
|
console.error(`${camera} - Supported codecs: ${CODECS.join(", ")}`);
|
||||||
}
|
}
|
||||||
onError?.(error);
|
onError?.(error);
|
||||||
},
|
},
|
||||||
|
// we know that these deps are correct
|
||||||
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||||
[camera, onError],
|
[camera, onError],
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@ -136,11 +136,10 @@ export default function ExploreSettings({
|
|||||||
<PlatformAwareDialog
|
<PlatformAwareDialog
|
||||||
trigger={trigger}
|
trigger={trigger}
|
||||||
content={content}
|
content={content}
|
||||||
contentClassName={
|
contentClassName={cn(
|
||||||
isDesktop
|
"scrollbar-container h-auto overflow-y-auto",
|
||||||
? "scrollbar-container h-auto max-h-[80dvh] overflow-y-auto"
|
isDesktop ? "max-h-[80dvh]" : "px-4",
|
||||||
: "max-h-[75dvh] overflow-hidden p-4"
|
)}
|
||||||
}
|
|
||||||
open={open}
|
open={open}
|
||||||
onOpenChange={(open) => {
|
onOpenChange={(open) => {
|
||||||
setOpen(open);
|
setOpen(open);
|
||||||
|
|||||||
@ -681,22 +681,62 @@ function LifecycleItem({
|
|||||||
})
|
})
|
||||||
: "";
|
: "";
|
||||||
|
|
||||||
const ratio =
|
const ratio = useMemo(
|
||||||
Array.isArray(item?.data.box) && item?.data.box.length >= 4
|
() =>
|
||||||
? (aspectRatio * (item?.data.box[2] / item?.data.box[3])).toFixed(2)
|
Array.isArray(item?.data.box) && item?.data.box.length >= 4
|
||||||
: "N/A";
|
? (aspectRatio * (item?.data.box[2] / item?.data.box[3])).toFixed(2)
|
||||||
const areaPx =
|
: "N/A",
|
||||||
Array.isArray(item?.data.box) && item?.data.box.length >= 4
|
[aspectRatio, item],
|
||||||
? Math.round(
|
);
|
||||||
(config?.cameras[item?.camera]?.detect?.width ?? 0) *
|
|
||||||
(config?.cameras[item?.camera]?.detect?.height ?? 0) *
|
const areaPx = useMemo(
|
||||||
(item?.data.box[2] * item?.data.box[3]),
|
() =>
|
||||||
)
|
Array.isArray(item?.data.box) && item?.data.box.length >= 4
|
||||||
: undefined;
|
? Math.round(
|
||||||
const areaPct =
|
(config?.cameras[item?.camera]?.detect?.width ?? 0) *
|
||||||
Array.isArray(item?.data.box) && item?.data.box.length >= 4
|
(config?.cameras[item?.camera]?.detect?.height ?? 0) *
|
||||||
? (item?.data.box[2] * item?.data.box[3]).toFixed(4)
|
(item?.data.box[2] * item?.data.box[3]),
|
||||||
: undefined;
|
)
|
||||||
|
: undefined,
|
||||||
|
[config, item],
|
||||||
|
);
|
||||||
|
|
||||||
|
const areaPct = useMemo(
|
||||||
|
() =>
|
||||||
|
Array.isArray(item?.data.box) && item?.data.box.length >= 4
|
||||||
|
? (item?.data.box[2] * item?.data.box[3]).toFixed(4)
|
||||||
|
: undefined,
|
||||||
|
[item],
|
||||||
|
);
|
||||||
|
|
||||||
|
const attributeAreaPx = useMemo(
|
||||||
|
() =>
|
||||||
|
Array.isArray(item?.data.attribute_box) &&
|
||||||
|
item?.data.attribute_box.length >= 4
|
||||||
|
? Math.round(
|
||||||
|
(config?.cameras[item?.camera]?.detect?.width ?? 0) *
|
||||||
|
(config?.cameras[item?.camera]?.detect?.height ?? 0) *
|
||||||
|
(item?.data.attribute_box[2] * item?.data.attribute_box[3]),
|
||||||
|
)
|
||||||
|
: undefined,
|
||||||
|
[config, item],
|
||||||
|
);
|
||||||
|
|
||||||
|
const attributeAreaPct = useMemo(
|
||||||
|
() =>
|
||||||
|
Array.isArray(item?.data.attribute_box) &&
|
||||||
|
item?.data.attribute_box.length >= 4
|
||||||
|
? (item?.data.attribute_box[2] * item?.data.attribute_box[3]).toFixed(4)
|
||||||
|
: undefined,
|
||||||
|
[item],
|
||||||
|
);
|
||||||
|
|
||||||
|
const score = useMemo(() => {
|
||||||
|
if (item?.data?.score !== undefined) {
|
||||||
|
return (item.data.score * 100).toFixed(0) + "%";
|
||||||
|
}
|
||||||
|
return "N/A";
|
||||||
|
}, [item?.data?.score]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
@ -733,6 +773,13 @@ function LifecycleItem({
|
|||||||
<TooltipContent>
|
<TooltipContent>
|
||||||
<div className="mt-1 flex flex-wrap items-start gap-3 text-sm text-secondary-foreground">
|
<div className="mt-1 flex flex-wrap items-start gap-3 text-sm text-secondary-foreground">
|
||||||
<div className="flex flex-col gap-1">
|
<div className="flex flex-col gap-1">
|
||||||
|
<div className="flex items-start gap-1">
|
||||||
|
<span className="text-muted-foreground">
|
||||||
|
{t("trackingDetails.lifecycleItemDesc.header.score")}
|
||||||
|
</span>
|
||||||
|
<span className="font-medium text-foreground">{score}</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div className="flex items-start gap-1">
|
<div className="flex items-start gap-1">
|
||||||
<span className="text-muted-foreground">
|
<span className="text-muted-foreground">
|
||||||
{t("trackingDetails.lifecycleItemDesc.header.ratio")}
|
{t("trackingDetails.lifecycleItemDesc.header.ratio")}
|
||||||
@ -742,7 +789,13 @@ function LifecycleItem({
|
|||||||
|
|
||||||
<div className="flex items-start gap-1">
|
<div className="flex items-start gap-1">
|
||||||
<span className="text-muted-foreground">
|
<span className="text-muted-foreground">
|
||||||
{t("trackingDetails.lifecycleItemDesc.header.area")}
|
{t("trackingDetails.lifecycleItemDesc.header.area")}{" "}
|
||||||
|
{attributeAreaPx !== undefined &&
|
||||||
|
attributeAreaPct !== undefined && (
|
||||||
|
<span className="text-muted-foreground">
|
||||||
|
({getTranslatedLabel(item.data.label)})
|
||||||
|
</span>
|
||||||
|
)}
|
||||||
</span>
|
</span>
|
||||||
{areaPx !== undefined && areaPct !== undefined ? (
|
{areaPx !== undefined && areaPct !== undefined ? (
|
||||||
<span className="font-medium text-foreground">
|
<span className="font-medium text-foreground">
|
||||||
@ -754,6 +807,26 @@ function LifecycleItem({
|
|||||||
<span>N/A</span>
|
<span>N/A</span>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{attributeAreaPx !== undefined &&
|
||||||
|
attributeAreaPct !== undefined && (
|
||||||
|
<div className="flex items-start gap-1">
|
||||||
|
<span className="text-muted-foreground">
|
||||||
|
{t("trackingDetails.lifecycleItemDesc.header.area")}{" "}
|
||||||
|
{attributeAreaPx !== undefined &&
|
||||||
|
attributeAreaPct !== undefined && (
|
||||||
|
<span className="text-muted-foreground">
|
||||||
|
({getTranslatedLabel(item.data.attribute)})
|
||||||
|
</span>
|
||||||
|
)}
|
||||||
|
</span>
|
||||||
|
<span className="font-medium text-foreground">
|
||||||
|
{attributeAreaPx} {t("pixels", { ns: "common" })}{" "}
|
||||||
|
<span className="text-secondary-foreground">·</span>{" "}
|
||||||
|
{attributeAreaPct}%
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</TooltipContent>
|
</TooltipContent>
|
||||||
@ -820,7 +893,7 @@ function ObjectTimeline({
|
|||||||
}, [config, fullTimeline, review]);
|
}, [config, fullTimeline, review]);
|
||||||
|
|
||||||
if (isValidating && (!timeline || timeline.length === 0)) {
|
if (isValidating && (!timeline || timeline.length === 0)) {
|
||||||
return <ActivityIndicator className="ml-2 size-3" />;
|
return <ActivityIndicator className="ml-2.5 size-3" />;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!timeline || timeline.length === 0) {
|
if (!timeline || timeline.length === 0) {
|
||||||
|
|||||||
@ -808,6 +808,7 @@ function FaceAttemptGroup({
|
|||||||
if (resp.status == 200) {
|
if (resp.status == 200) {
|
||||||
toast.success(t("toast.success.trainedFace"), {
|
toast.success(t("toast.success.trainedFace"), {
|
||||||
position: "top-center",
|
position: "top-center",
|
||||||
|
closeButton: true,
|
||||||
});
|
});
|
||||||
onRefresh();
|
onRefresh();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -104,12 +104,14 @@ export default function ModelTrainingView({ model }: ModelTrainingViewProps) {
|
|||||||
if (modelState == "complete") {
|
if (modelState == "complete") {
|
||||||
toast.success(t("toast.success.trainedModel"), {
|
toast.success(t("toast.success.trainedModel"), {
|
||||||
position: "top-center",
|
position: "top-center",
|
||||||
|
closeButton: true,
|
||||||
});
|
});
|
||||||
setWasTraining(false);
|
setWasTraining(false);
|
||||||
refreshDataset();
|
refreshDataset();
|
||||||
} else if (modelState == "failed") {
|
} else if (modelState == "failed") {
|
||||||
toast.error(t("toast.error.trainingFailed"), {
|
toast.error(t("toast.error.trainingFailed"), {
|
||||||
position: "top-center",
|
position: "top-center",
|
||||||
|
closeButton: true,
|
||||||
});
|
});
|
||||||
setWasTraining(false);
|
setWasTraining(false);
|
||||||
}
|
}
|
||||||
@ -182,6 +184,7 @@ export default function ModelTrainingView({ model }: ModelTrainingViewProps) {
|
|||||||
setWasTraining(true);
|
setWasTraining(true);
|
||||||
toast.success(t("toast.success.trainingModel"), {
|
toast.success(t("toast.success.trainingModel"), {
|
||||||
position: "top-center",
|
position: "top-center",
|
||||||
|
closeButton: true,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@ -193,6 +196,7 @@ export default function ModelTrainingView({ model }: ModelTrainingViewProps) {
|
|||||||
|
|
||||||
toast.error(t("toast.error.trainingFailedToStart", { errorMessage }), {
|
toast.error(t("toast.error.trainingFailedToStart", { errorMessage }), {
|
||||||
position: "top-center",
|
position: "top-center",
|
||||||
|
closeButton: true,
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}, [model, t]);
|
}, [model, t]);
|
||||||
|
|||||||
@ -219,7 +219,9 @@ export default function EventView({
|
|||||||
position: "top-center",
|
position: "top-center",
|
||||||
action: (
|
action: (
|
||||||
<a href="/export" target="_blank" rel="noopener noreferrer">
|
<a href="/export" target="_blank" rel="noopener noreferrer">
|
||||||
<Button>View</Button>
|
<Button>
|
||||||
|
{t("export.toast.view", { ns: "components/dialog" })}
|
||||||
|
</Button>
|
||||||
</a>
|
</a>
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user