@camstack/addon-pipeline-orchestrator 1.2.274 → 1.2.276
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/viewer/.viewer-current-files.json +1 -1
- package/assets/viewer/.viewer-version +1 -1
- package/assets/viewer/_expo/static/js/web/{index-ec729a36dbd732531b7d6e68f9c3faca.js → index-433d31e04c2d44de395b0c0364df6667.js} +8 -8
- package/assets/viewer/_expo/static/js/web/{index-ce1c243edfee3844b0833c93c37fd7dd.js → index-87f81fc67bc0ebb1b0ad8b862af7d201.js} +11 -11
- package/assets/viewer/index.html +1 -1
- package/dist/{_virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_orchestrator_widgets-CCWPKb-T.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_orchestrator_widgets-cRU_TEoP.mjs} +1 -1
- package/dist/{hostInit-4DkhYyNP.mjs → hostInit-UxR14qSv.mjs} +1 -1
- package/dist/index.js +500 -0
- package/dist/index.mjs +500 -0
- package/dist/remoteEntry.js +1 -1
- package/package.json +1 -1
|
@@ -405,7 +405,7 @@ __d(function(g,r,i,_a,m,_e,_d){'use strict';m.exports=function(e,n,o,t,a,f,s,d){
|
|
|
405
405
|
__d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,'__esModule',{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t}});var t={}},324,[]);
|
|
406
406
|
__d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,'__esModule',{value:!0}),e.installOnUIRuntime=function(t){const o=globalThis?.expo?.installOnUIRuntime;if(!o)throw Error("Native method to install Expo Modules on the worklets UI runtime wasn't found in `expo-modules-core`.");o(t)}},325,[]);
|
|
407
407
|
__d(function(g,r,i,a,m,e,d){"use strict";var t,n,o;Object.defineProperty(e,'__esModule',{value:!0}),Object.defineProperty(e,"AppOwnership",{enumerable:!0,get:function(){return t}}),Object.defineProperty(e,"ExecutionEnvironment",{enumerable:!0,get:function(){return n}}),Object.defineProperty(e,"UserInterfaceIdiom",{enumerable:!0,get:function(){return o}}),(function(t){t.Expo="expo"})(t||(t={})),(function(t){t.Bare="bare",t.Standalone="standalone",t.StoreClient="storeClient"})(n||(n={})),(function(t){t.Handset="handset",t.Tablet="tablet",t.Desktop="desktop",t.TV="tv",t.Unsupported="unsupported"})(o||(o={}))},326,[]);
|
|
408
|
-
__d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,'__esModule',{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return s}});var t=r(d[0]);const n=(Date.now()+'-'+Math.floor(1e9*Math.random())).toString();function o(){if('undefined'!=typeof navigator&&'string'==typeof navigator.userAgent){const t=navigator.userAgent.toLowerCase();if(t.includes('edge'))return'Edge';if(t.includes('edg'))return'Chromium Edge';if(t.includes('opr')&&'opr'in window&&window.opr)return'Opera';if(t.includes('chrome')&&'chrome'in window&&window.chrome)return'Chrome';if(t.includes('trident'))return'IE';if(t.includes('firefox'))return'Firefox';if(t.includes('safari'))return'Safari'}}var s={get appOwnership(){return null},get executionEnvironment(){return t.ExecutionEnvironment.Bare},get sessionId(){return n},get isHeadless(){return'undefined'==typeof navigator||/\bHeadlessChrome\//.test(navigator.userAgent)},get expoVersion(){return this.manifest.sdkVersion||null},get linkingUri(){return'undefined'!=typeof location?location.origin:''},get expoRuntimeVersion(){return this.expoVersion},get deviceName(){return o()},get systemFonts(){return[]},get statusBarHeight(){return 0},get deviceYearClass(){return null},get manifest(){return"{\"name\":\"CamStack\",\"slug\":\"camstack\",\"version\":\"1.0.
|
|
408
|
+
__d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,'__esModule',{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return s}});var t=r(d[0]);const n=(Date.now()+'-'+Math.floor(1e9*Math.random())).toString();function o(){if('undefined'!=typeof navigator&&'string'==typeof navigator.userAgent){const t=navigator.userAgent.toLowerCase();if(t.includes('edge'))return'Edge';if(t.includes('edg'))return'Chromium Edge';if(t.includes('opr')&&'opr'in window&&window.opr)return'Opera';if(t.includes('chrome')&&'chrome'in window&&window.chrome)return'Chrome';if(t.includes('trident'))return'IE';if(t.includes('firefox'))return'Firefox';if(t.includes('safari'))return'Safari'}}var s={get appOwnership(){return null},get executionEnvironment(){return t.ExecutionEnvironment.Bare},get sessionId(){return n},get isHeadless(){return'undefined'==typeof navigator||/\bHeadlessChrome\//.test(navigator.userAgent)},get expoVersion(){return this.manifest.sdkVersion||null},get linkingUri(){return'undefined'!=typeof location?location.origin:''},get expoRuntimeVersion(){return this.expoVersion},get deviceName(){return o()},get systemFonts(){return[]},get statusBarHeight(){return 0},get deviceYearClass(){return null},get manifest(){return"{\"name\":\"CamStack\",\"slug\":\"camstack\",\"version\":\"1.0.572\",\"sdkVersion\":\"57.0.0\",\"platforms\":[\"ios\",\"android\",\"web\"],\"runtimeVersion\":\"1.0.454\",\"orientation\":\"default\",\"icon\":\"./assets/images/icon.png\",\"scheme\":\"camstack\",\"userInterfaceStyle\":\"automatic\",\"web\":{\"output\":\"single\",\"favicon\":\"./assets/images/favicon.png\",\"shortName\":\"CamStack\",\"backgroundColor\":\"#e67e22\",\"name\":\"CamStack\"},\"experiments\":{\"typedRoutes\":true,\"reactCompiler\":true,\"baseUrl\":\"/viewer/camstack\"},\"extra\":{\"router\":{\"root\":\"app\"},\"eas\":{\"projectId\":\"8fb06894-6375-41ff-959f-1a22a03dbd73\"}},\"updates\":{\"url\":\"https://u.expo.dev/8fb06894-6375-41ff-959f-1a22a03dbd73\"},\"owner\":\"zentik-notifier\"}"},get manifest2(){return null},get experienceUrl(){return'undefined'!=typeof location?location.origin:''},get debugMode(){return!1},getWebViewUserAgentAsync:async()=>'undefined'!=typeof navigator?navigator.userAgent:null}},327,[326]);
|
|
409
409
|
__d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SITEMAP_ROUTE_NAME=e.NOT_FOUND_ROUTE_NAME=e.INTERNAL_SLOT_NAME=void 0,e.INTERNAL_SLOT_NAME='__root',e.NOT_FOUND_ROUTE_NAME='+not-found',e.SITEMAP_ROUTE_NAME='_sitemap'},328,[]);
|
|
410
410
|
__d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.useCurrentRouteInfo=function(){const n=(0,u.useStateForPath)();return(0,t.useMemo)(()=>n?(0,o.getCachedRouteInfo)(n):void 0,[n])};const t=r(d[0]),o=r(d[1]),u=r(d[2])},329,[17,330,338]);
|
|
411
411
|
__d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.routeInfoSubscribe=e.routeInfoSubscribers=void 0,e.getCachedRouteInfo=function(s){let u=o.get(s);if(!u){u=(0,t.getRouteInfoFromState)(s);const f=JSON.stringify(u),c=n.get(f);c?u=c:n.set(f,u),o.set(s,u)}return u},e.setCachedRouteInfo=function(t,s){o.set(t,s),n.set(JSON.stringify(s),s)};const t=r(d[0]),o=new WeakMap,n=new Map;e.routeInfoSubscribers=new Set;e.routeInfoSubscribe=t=>(e.routeInfoSubscribers.add(t),()=>{e.routeInfoSubscribers.delete(t)})},330,[331]);
|
|
@@ -4102,7 +4102,7 @@ __d(function(g,r,i,a,m,_e,_d){"use strict";Object.defineProperty(_e,'__esModule'
|
|
|
4102
4102
|
__d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,'__esModule',{value:!0}),Object.defineProperty(e,"CRASH_SCOPE",{enumerable:!0,get:function(){return l}}),e.setRunningBundle=function(t){s=t},e.readErrorUtils=u,e.reportFatal=f,e.installCrashReporter=function(s=(0,o.getExitMarkerRecorder)()){if(b)return!1;const c=u();if(null===c)return!1;b=!0;const k=c.getGlobalHandler?.();return c.setGlobalHandler((o,c)=>{if(!1===c){const s=(0,n.describeThrown)(o);t.log.warn(l,'non-fatal error reached the global handler',{message:s.message,stack:s.stack})}else f('js-fatal',o,s);k?.(o,c)}),!0},e.reportPreviousExit=async function(c=(0,o.getExitMarkerRecorder)()){const u=await c.readPrevious(),f=(0,n.classifyPreviousExit)(u);t.log.info(l,`previous runtime exit: ${f}`,{exit:f,crash:(0,n.isCrashExit)(f),markedAt:u?.at??null,message:u?.message??null,stack:u?.stack??null,version:s?.version??null,bundle:s?.bundle??null}),await c.arm()},e.bindExitMarkerToAppState=function(t,n=(0,o.getExitMarkerRecorder)()){let l=t.currentState;const s=t.addEventListener('change',t=>{const o='background'!==l;l=t,'background'===t&&o?n.record('backgrounded'):'active'===t&&n.arm()});return()=>s.remove()};var t=r(d[0]),n=r(d[1]),o=r(d[2]);const l='crash';let s=null;function c(t){if('object'!=typeof t||null===t)return!1;return'function'==typeof Reflect.get(t,'setGlobalHandler')}function u(){const t=Reflect.get(globalThis,'ErrorUtils');return c(t)?t:null}function f(c,u,f=(0,o.getExitMarkerRecorder)()){const b=(0,n.describeThrown)(u);t.log.error(l,`runtime fatal (${c})`,{kind:c,message:b.message,stack:b.stack,version:s?.version??null,bundle:s?.bundle??null}),f.record(c,b),(0,t.flushLogsNow)()}let b=!1},2202,[1194,2203,2204]);
|
|
4103
4103
|
__d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,'__esModule',{value:!0}),Object.defineProperty(e,"CRASH_STACK_MAX_CHARS",{enumerable:!0,get:function(){return n}}),e.describeThrown=function(t){if(t instanceof Error){const s='string'==typeof t.stack?t.stack:null;return{message:`${t.name}: ${t.message}`,stack:null===s?null:s.slice(0,n)}}try{return{message:String(t),stack:null}}catch{return{message:'unstringifiable thrown value',stack:null}}},e.serializeExitMarker=function(n){try{return JSON.stringify(n)}catch{return JSON.stringify({kind:n.kind,at:n.at})}},e.parseExitMarker=function(n){if(null===n||0===n.length)return null;let s;try{s=JSON.parse(n)}catch{return null}if('object'!=typeof s||null===s||Array.isArray(s))return null;const u=Object.assign({},s),l=u.kind;if(c=l,'running'!==c&&'backgrounded'!==c&&'ota-reload'!==c&&'js-fatal'!==c&&'render-error'!==c)return null;var c;const o=u.at;return{kind:l,at:'number'==typeof o&&Number.isFinite(o)?o:0,message:t(u,'message'),stack:t(u,'stack')}},e.classifyPreviousExit=function(n){return null===n?'first-launch':'running'===n.kind?'vanished':n.kind},e.isCrashExit=function(n){return'js-fatal'===n||'render-error'===n||'vanished'===n};const n=2e3;function t(n,t){const s=n[t];return'string'==typeof s&&s.length>0?s:void 0}},2203,[]);
|
|
4104
4104
|
__d(function(g,r,i,a,m,_e,d){"use strict";Object.defineProperty(_e,'__esModule',{value:!0}),Object.defineProperty(_e,"EXIT_MARKER_STORAGE_KEY",{enumerable:!0,get:function(){return s}}),_e.createExitMarkerPort=o,Object.defineProperty(_e,"ExitMarkerRecorder",{enumerable:!0,get:function(){return u}}),_e.getExitMarkerRecorder=function(){return l??=new u(o()),l};var e,t=r(d[0]),n=(e=t)&&e.__esModule?e:{default:e},c=r(d[1]);const s='camstack.runtime.exit-marker.v1';function o(){return{read:()=>n.default.getItem(s),write:e=>n.default.setItem(s,e)}}class u{constructor(e,t=Date.now){this.port=e,this.now=t}readPrevious=async()=>{try{return(0,c.parseExitMarker)(await this.port.read())}catch{return null}};arm=()=>this.record('running');record=async(e,t)=>{const n={kind:e,at:this.now(),message:t?.message,stack:t?.stack??void 0};try{await this.port.write((0,c.serializeExitMarker)(n))}catch{}}}let l},2204,[783,2203]);
|
|
4105
|
-
__d(function(g,r,i,a,m,_e,d){"use strict";Object.defineProperty(_e,'__esModule',{value:!0}),Object.defineProperty(_e,"WHATS_NEW",{enumerable:!0,get:function(){return e}}),_e.whatsNewHistory=function(n){const t=o(n);return{latest:t,past:e.filter(e=>e!==t)}},_e.whatsNewFor=o,_e.whatsNewLines=function(e,o){const n=o.toLowerCase().startsWith('it')?'it':'en',t=e.notes[n];return t.length>0?t:e.notes.en},_e.shouldShowWhatsNew=function(e,n){return!!n&&(e!==n&&null!==o(n))};const e=[{version:'1.0.571',date:'2026-10-02',notes:{en:['Alarm: each mode lists only the sensors its rules cover, in the same table, rows and fields as the rest of the app.'],it:["Allarme: ogni modalit\xe0 elenca solo i sensori coperti dalle sue regole, con la stessa tabella, righe e campi del resto dell'app."]}},{version:'1.0.570',date:'2026-10-02',notes:{en:['Alarm: exit, entry and siren delays can be set per arm mode (unset modes keep the default).','Alarm: each mode lists its sensors in a table with their state and a switch to stop a sensor from blocking the arm.','Device picker: filter by device type, area and location, with a button to reset the filters.'],it:['Allarme: i ritardi di uscita, ingresso e sirena si impostano per modalit\xe0 (senza valore vale il default).','Allarme: ogni modalit\xe0 elenca i sensori in una tabella con lo stato e uno switch per non bloccare l\'inserimento.','Selezione dispositivi: filtri per tipo, area e posizione, con un pulsante per azzerarli.']}},{version:'1.0.569',date:'2026-10-01',notes:{en:['A scheduled system summary can be sent as one notification per category (offline devices, batteries, consumables, ...).','Testing a summary rule now sends the current summary.'],it:['Il riepilogo programmato di sistema pu\xf2 arrivare come una notifica per categoria (dispositivi offline, batterie, consumabili, ...).','Il test di una regola di riepilogo ora invia il riepilogo attuale.']}},{version:'1.0.568',date:'2026-10-01',notes:{en:['Deleting a rule asks for confirmation in the standard dialog.'],it:["L'eliminazione di una regola chiede conferma con la finestra standard."]}},{version:'1.0.567',date:'2026-10-01',notes:{en:['A person who steps out of frame for a few seconds stays the same track.','A track fused into another still opens from its old link.','Rule editor: the Advanced section is unified across rule kinds.','Cooldown defaults to separate windows per class.','Sensor rules attach one snapshot, not a choice of media.','The device picker lists only devices the rule kind can target.'],it:["Una persona che esce dall'inquadratura per pochi secondi resta la stessa traccia.","Una traccia fusa in un'altra si apre ancora dal suo vecchio collegamento.",'Editor regole: la sezione Avanzate \xe8 unificata per ogni tipo di regola.','Il cooldown usa di default finestre separate per classe.',"Le regole sui sensori allegano un'unica foto, senza scelta del media.",'Il selettore dispositivi mostra solo quelli compatibili con la regola.']}},{version:'1.0.566',date:'2026-10-01',notes:{en:['Rules are sorted by name, and tapping anywhere on a rule opens it.','A Snooze switch on each rule silences it for 30 minutes.','Deleting a rule asks for confirmation right on the button.','Rule conditions are all shown; source and zone crossing moved to Advanced.','Faces, zones and labels use the same Only / All except picker as classes.','Zones are listed as "camera:zone", from every camera.','Zone crossing: Entering, Leaving or Either \u2014 Entering by default.','New detection rules watch the pipeline; sounds are no longer offered as classes.','Device and scene states are shown as readable words.'],it:['Le regole sono ordinate per nome e un tocco ovunque sulla regola la apre.','Un interruttore Silenzia su ogni regola la silenzia per 30 minuti.','Eliminare una regola chiede conferma direttamente sul pulsante.','Le condizioni sono tutte visibili; sorgente e attraversamento zona sono in Avanzate.','Volti, zone ed etichette usano lo stesso selettore delle classi.','Le zone sono elencate come "camera:zona", da tutte le camere.','Attraversamento zona: In entrata, In uscita o Entrambe \u2014 In entrata di default.','Le nuove regole di rilevamento usano la pipeline; i suoni non sono pi\xf9 tra le classi.','Gli stati di dispositivi e scene sono mostrati in parole leggibili.']}},{version:'1.0.565',date:'2026-09-29',notes:{en:['The "Groups" view is gone from the timeline, Events and the Recent reel: they always list subjects now.','Summary rules no longer offer "one line is a group"; a rule that had it now lists subjects.'],it:['La vista \xabGruppi\xbb \xe8 stata rimossa da timeline, Eventi e striscia Recenti: ora mostrano sempre i soggetti.','Le regole di riepilogo non offrono pi\xf9 \xabuna riga \xe8 un gruppo\xbb; una regola che lo usava ora elenca i soggetti.']}},{version:'1.0.564',date:'2026-09-26',notes:{en:['Device and system rules can send a scheduled summary instead of one notification per event.','Summary rules show their send times in the list, e.g. "Summary \xb7 daily 08:00".','Semantic search in Events uses the server\'s own score threshold unless you set one.','On a server that does not support summaries yet, the app says the rule stayed instant and keeps its active hours.'],it:['Le regole dei dispositivi e di sistema possono inviare un riepilogo pianificato invece di una notifica per evento.','Le regole di riepilogo mostrano gli orari di invio nell\'elenco, ad es. "Riepilogo \xb7 ogni giorno 08:00".','La ricerca semantica negli Eventi usa la soglia di punteggio del server, salvo che tu ne imposti una.','Su un server che non supporta ancora i riepiloghi, l\'app avvisa che la regola \xe8 rimasta immediata e ne conserva le fasce orarie.']}},{version:'1.0.563',date:'2026-09-26',notes:{en:['Sensor rules now pick from your sensors, not cameras.',"A rule's overview lists the devices it is active on.",'Selected devices are always all shown, with no "show more".','The "off" note is gone where the switch already says it.'],it:['Le regole dei sensori ora scelgono tra i sensori, non tra le camere.','La panoramica di una regola elenca i dispositivi su cui \xe8 attiva.','I dispositivi selezionati sono sempre tutti visibili, senza "mostra altri".','Niente pi\xf9 scritta "disattivata" dove c\'\xe8 gi\xe0 l\'interruttore.']}},{version:'1.0.562',date:'2026-09-26',notes:{en:['Device rules can set their own consumable threshold (1\u201395 %).','Robot vacuum tank alerts: tank low, tank full, back to normal.'],it:['Le regole dei dispositivi possono avere una propria soglia dei consumabili (1\u201395 %).','Avvisi dei serbatoi del robot: serbatoio basso, pieno, tornato normale.']}},{version:'1.0.561',date:'2026-09-26',notes:{en:['Rules: pick All, Only these or All except these for devices and classes, with a smarter class picker.','Sensor rules can notify only when a sensor triggers, or only when it clears.','Each rule shows its last run; tap it for the delivery history (admins).','Rule cards keep the name readable, with the switch, Edit and Delete on one row.','The device picker groups by zone, location or not at all.'],it:['Regole: scegli Tutti, Solo questi o Tutti tranne questi per dispositivi e classi, con un selettore classi migliore.','Le regole dei sensori possono notificare solo quando il sensore scatta, o solo quando rientra.',"Ogni regola mostra l'ultima esecuzione; toccala per lo storico degli invii (admin).",'Le schede delle regole mostrano sempre il nome, con interruttore, Modifica ed Elimina su una riga.','Il selettore dispositivi raggruppa per zona, posizione o nessuno.']}},{version:'1.0.560',date:'2026-09-26',notes:{en:['System alerts are now three rule kinds: device events, system and alarm, each with its own settings.','System rules pick nodes and packages from a list instead of typed names.','A rule that mixes families is shown read-only, marked to recreate.'],it:['Gli avvisi di sistema sono ora tre tipi di regola: eventi dispositivi, sistema e allarme.','Le regole di sistema scelgono nodi e pacchetti da un elenco, non pi\xf9 a testo libero.','Una regola che mescola famiglie \xe8 in sola lettura, segnata da ricreare.']}},{version:'1.0.559',date:'2026-09-26',notes:{en:['Sensor rules can send one mosaic of every linked camera, or one picture per camera.','Clip thumbnails load one at a time per camera and no longer hammer it with retries.','PTZ Home is greyed out when the camera has no home position set.'],it:['Le regole dei sensori inviano un mosaico di tutte le camere collegate, o una foto per camera.','Le anteprime delle clip arrivano una alla volta per camera, senza raffiche di tentativi.','Il tasto PTZ "posizione iniziale" \xe8 disattivato se la camera non ne ha una impostata.']}},{version:'1.0.558',date:'2026-09-25',notes:{en:['Live quality now climbs on a good connection instead of staying stuck on low.','Rules for batteries and consumables have their own section.','System-event rules can exclude devices.','A new compact device picker, with search and groups.',"The alarm's non-blocking list offers every door, window and lock."],it:['La qualit\xe0 live ora sale con una buona connessione invece di restare su bassa.','Le regole per batterie e consumabili hanno una sezione dedicata.','Le regole sugli eventi di sistema possono escludere dispositivi.','Un nuovo selettore di dispositivi compatto, con ricerca e gruppi.',"La lista non bloccante dell'allarme propone ogni porta, finestra e serratura."]}},{version:'1.0.557',date:'2026-09-25',notes:{en:['Rules are edited per kind, on their own screens, like the admin UI.','Text fields offer the placeholders of that rule: tap to insert, with a live preview.','Timelapse and summary rules expose every field; admins can test a rule from the phone.','A device that no longer exists shows as "removed" and can be deselected.','Alarm: every mode, what is open when arming is refused, and Arm anyway for admins.','Disarm is always available, and admins can configure the alarm from the phone.'],it:['Le regole si modificano per tipo, su schermate dedicate, come nell\'admin UI.','I campi di testo propongono i segnaposto della regola: tocca per inserire, con anteprima.','Timelapse e riepiloghi hanno tutti i campi; gli admin possono provare una regola dal telefono.','Un dispositivo che non esiste pi\xf9 appare come "rimosso" e si pu\xf2 togliere.','Allarme: tutte le modalit\xe0, cosa \xe8 aperto quando \xe8 rifiutato, e Arma comunque per gli admin.','Disarma \xe8 sempre disponibile, e gli admin configurano l\'allarme dal telefono.']}},{version:'1.0.556',date:'2026-09-24',notes:{en:['A camera function with a warning now shows whether it is ON \u2014 the privacy mask could never look enabled.'],it:['Una funzione con un avviso ora mostra se \xe8 ACCESA: la privacy mask non poteva mai sembrarlo.']}},{version:'1.0.555',date:'2026-09-24',notes:{en:['A shutter on its way up or down makes the button you pressed pulse.'],it:['Una tapparella che sta salendo o scendendo fa pulsare il tasto che hai premuto.']}},{version:'1.0.554',date:'2026-09-24',notes:{en:['Closing clip mode returns to the recording at the moment the clip was at.','The privacy-mask switch no longer looks locked when the camera has no zone drawn.'],it:['Chiudendo la modalit\xe0 clip si torna alla registrazione nel punto in cui era la clip.',"L'interruttore della privacy mask non sembra pi\xf9 bloccato quando la camera non ha zone disegnate."]}},{version:'1.0.553',date:'2026-09-24',notes:{en:['Recordings read the source each camera is set to, and you can pick it per camera.','The camera reel says it is loading instead of looking like you own one camera.'],it:['Le registrazioni leggono la sorgente impostata per ogni camera, e la scegli tu camera per camera.','La striscia delle camere dice che sta caricando, invece di sembrare che ne hai una sola.']}},{version:'1.0.552',date:'2026-09-24',notes:{en:['A clip the camera cut short now says so, with how much arrived.'],it:['Una clip che la camera ha troncato ora lo dice, e quanto ne \xe8 arrivato.']}},{version:'1.0.551',date:'2026-09-24',notes:{en:['A clip silent because of the speed now says so, on the speaker.','Recorded playback reaches 8\xd7.'],it:['Una clip muta per via della velocit\xe0 ora lo dice, sull\u2019altoparlante.','La riproduzione delle registrazioni arriva a 8\xd7.']}},{version:'1.0.550',date:'2026-09-23',notes:{en:['Renaming a linked device is a field in the row now, and no longer hangs the app.'],it:['Rinominare un dispositivo collegato si fa nella riga, e non blocca pi\xf9 l\u2019app.']}},{version:'1.0.549',date:'2026-09-23',notes:{en:['Turning the sound back on now really turns it back on, clips included.'],it:['Riaccendere l\u2019audio ora lo riaccende davvero, clip comprese.']}},{version:'1.0.548',date:'2026-09-23',notes:{en:['In a linked device\u2019s edit mode, the name now looks tappable \u2014 it always was.'],it:['Nella modifica di un dispositivo collegato il nome ora si vede che si tocca.']}},{version:'1.0.547',date:'2026-09-23',notes:{en:['A clip now repeats when it ends. There is a loop switch beside the transport.','A clip that simply finished no longer looks like a fault.'],it:['Una clip ora si ripete alla fine. L\u2019interruttore \xe8 accanto ai comandi.','Una clip che \xe8 semplicemente finita non sembra pi\xf9 un errore.']}},{version:'1.0.546',date:'2026-09-23',notes:{en:['Tapping a clip brings it to the middle of the timeline.','Reolink clips play again \u2014 the camera was being asked with the wrong handle.'],it:['Toccare una clip la porta al centro della linea del tempo.','Le clip Reolink ripartono: chiedevamo alla camera con la maniglia sbagliata.']}},{version:'1.0.545',date:'2026-09-23',notes:{en:['The cursor moves as you drag away from live, not when you let go.','The speed menu lists only the speeds your camera has, with no note.','A camera recorded on events opens on its clips.'],it:['Il cursore si sposta mentre trascini via dal live, non quando lasci.','Il menu velocit\xe0 elenca solo quelle che la camera ha, senza scritte.','Una camera registrata a eventi si apre sulle sue clip.']}},{version:'1.0.544',date:'2026-09-23',notes:{en:['Tapping a clip sends one command to the camera instead of two.'],it:['Toccare una clip manda un comando solo alla camera invece di due.']}},{version:'1.0.543',date:'2026-09-23',notes:{en:['The cursor now slides between its two positions instead of jumping there.','Hikvision clips no longer stop after a few seconds.'],it:['Il cursore ora scivola fra le sue due posizioni invece di saltarci.','Le clip Hikvision non si fermano pi\xf9 dopo qualche secondo.']}},{version:'1.0.542',date:'2026-09-23',notes:{en:['Away from live the cursor sits mid-screen, so a cluster you tap fits on it.','Previous updates are tucked behind one panel, leaving the newest room to breathe.'],it:['Lontano dal live il cursore sta a met\xe0 schermo, cos\xec il cluster che tocchi ci sta tutto.','Gli aggiornamenti precedenti stanno dietro un pannello, e il pi\xf9 recente ha spazio.']}},{version:'1.0.541',date:'2026-09-23',notes:{en:['While a clip plays the timeline stays put: no cursor, and scrolling does nothing.','Scrolling to the top of a clip list no longer jumps you back to live.'],it:['Mentre una clip gira la linea del tempo sta ferma: niente cursore, e scorrere non fa nulla.','Scorrere in cima a una lista di clip non ti riporta pi\xf9 al live.']}},{version:'1.0.540',date:'2026-09-23',notes:{en:['The oldest clips can be scrolled under the cursor again.','The cursor reads the clip on the frame, not a time it is not at.','The timeline follows the clip that is playing; drag it and it lets go.'],it:['Le clip pi\xf9 vecchie si possono di nuovo portare sotto il cursore.','Il cursore legge la clip nel riquadro, non un orario che non le appartiene.','La linea del tempo segue la clip in riproduzione; se la trascini, si sgancia.']}},{version:'1.0.539',date:'2026-09-23',notes:{en:['The timeline follows the clip that is playing, and stops when you drag it.','Speeds a camera cannot really do are greyed out instead of pretending.','Download now asks which quality, and the file lands in your exports.','A clip you have not seen before gets a picture, taken from its middle.','Clips that would not start on the studio and laundry cameras now do.'],it:['La linea del tempo segue la clip in riproduzione e si ferma se la trascini.','Le velocit\xe0 che una telecamera non sa fare sono spente invece di fingere.','Il download ora chiede la qualit\xe0, e il file finisce nelle esportazioni.','Una clip mai vista prima ora ha una foto, presa dal suo centro.','Le clip che non partivano su studio e lavanderia adesso partono.']}},{version:'1.0.538',date:'2026-09-23',notes:{en:['A camera that just woke no longer shows its old sleeping snapshot.','The speed menu opens upward, so it no longer covers the clip track.','Clip controls now offer only what the camera can really do.','Tapping anywhere outside a grid panel closes it.'],it:['Una telecamera appena sveglia non mostra pi\xf9 la vecchia foto di quando dormiva.','Il menu della velocit\xe0 si apre verso l\u2019alto e non copre pi\xf9 la barra della clip.','I comandi delle clip offrono solo ci\xf2 che la telecamera sa fare davvero.','Toccando fuori da un pannello della griglia, il pannello si chiude.']}},{version:'1.0.537',date:'2026-09-22',notes:{en:['A clip tapped while the player is starting now plays, instead of the live view.'],it:['Una clip toccata mentre il player sta partendo adesso parte davvero, invece del live.']}},{version:'1.0.536',date:'2026-09-22',notes:{en:['One devices panel everywhere, with the camera functions under it.','Edit that panel: reorder, rename, re-icon, hide, and add your own devices.','Linked devices are now edited in the admin UI, not here.','The privacy-mask switch works with no zones drawn.','A clip\u2019s progress bar no longer snaps forward when dragged back.','157 icons to choose from, with search.'],it:['Un solo pannello dispositivi ovunque, con sotto le funzioni della telecamera.','Modifica quel pannello: riordina, rinomina, cambia icona, nascondi e aggiungi dispositivi tuoi.','I dispositivi collegati si modificano dall\u2019interfaccia admin, non pi\xf9 da qui.','L\u2019interruttore della maschera privacy funziona anche senza zone disegnate.','La barra di una clip non scatta pi\xf9 in avanti se la trascini indietro.','157 icone fra cui scegliere, con ricerca.']}},{version:'1.0.535',date:'2026-09-22',notes:{en:['Clips start faster. When a camera\u2019s list comes up, the hub now fetches its newest few clips in the background, so the first ones you open are already there \u2014 on a hub camera that was a 6\u20138 s wait per clip, now a fraction of a second. Never on a battery camera that would have to wake for it.','Opening a clip now shows that it is loading: the ring around the play button turns while the file is being fetched and stops when it plays. Before, the frame just sat there until the clip appeared.','The quality badge by the play button now works on the web too. It used to show only in the app.','A live recording in progress stops when you open a clip, and asks whether to keep what it captured. It used to keep recording the clip as if it were the live picture.','Tapping a clip plays the clip. It used to start the live view instead: the command was sent once, at the tap, and the player is created BY that tap \u2014 so it arrived before there was anything to receive it, and what came up was the live edge. Previous/next clip fell in the same hole, which is why they appeared to do nothing.'],it:['Le clip partono pi\xf9 in fretta. Quando compare la lista di una telecamera, l\u2019hub scarica in sottofondo le sue clip pi\xf9 recenti, cos\xec le prime che apri sono gi\xe0 pronte \u2014 su una telecamera dell\u2019hub erano 6\u20138 s di attesa a clip, ora una frazione di secondo. Mai su una telecamera a batteria che dovrebbe svegliarsi per farlo.','Aprire una clip adesso mostra che sta caricando: l\u2019anello attorno al tasto play gira mentre il file viene scaricato e si ferma quando parte. Prima il riquadro restava fermo finch\xe9 la clip non compariva.','Il badge della qualit\xe0 accanto al tasto play adesso funziona anche sul web. Prima compariva solo nell\u2019app.','Una registrazione live in corso si ferma quando apri una clip, e chiede se tenere quanto catturato. Prima continuava a registrare la clip come se fosse il live.','Toccare una clip riproduce la clip. Prima partiva il live: il comando veniva inviato una volta sola, al tocco, e il player nasce PROPRIO da quel tocco \u2014 quindi arrivava prima che ci fosse qualcosa ad ascoltarlo, e a schermo veniva il live. Clip precedente/successiva cadevano nello stesso buco, ed \xe8 per questo che sembravano non fare nulla.']}},{version:'1.0.534',date:'2026-09-22',notes:{en:['A clip in the frame now shows where you are inside it: a position track under the transport, with the file\u2019s real length once the hub has measured it, and a drag along it that seeks inside the clip. While the length is not known yet the track says so instead of pretending the file is empty.','Go live now really leaves the clip \u2014 the frame goes back to the live view (or the poster, on a battery camera). Previous/next still keep you in the list.','Play/pause on a clip is the clip\u2019s own pause. Opened from the live edge, it used to run the live pause instead, which took the player down and the clip with it.','Seeking inside a clip stays inside the clip. A release used to land on the recorder\u2019s footage at a nonsense moment and the file was gone.','A clip in the frame now keeps its controls. Play/pause, speed, frame-step, previous/next clip and Go live are all there \u2014 before, opening a clip took the whole bar away, because the bar was asking whether the picture was live and a clip leaves the session exactly where it was.','A camera whose current day is empty now looks back by itself, up to fourteen days, and says how far it has got. It used to show \u201cNo clips\u201d straight away and only reveal the earlier ones once you dragged the list by hand.','When a source cannot answer, the reason is now printed. The sentence used to arrive with the placeholder still in it.'],it:['Una clip nel riquadro adesso mostra a che punto sei: una traccia di posizione sotto i controlli, con la durata reale del file appena l\u2019hub l\u2019ha misurata, e un trascinamento lungo la traccia per cercare dentro la clip. Finch\xe9 la durata non \xe8 nota la traccia lo dice, invece di fingere che il file sia vuoto.','Vai al live adesso esce davvero dalla clip \u2014 il riquadro torna al live (o al poster, su una telecamera a batteria). Precedente/successiva restano nella lista.','Play/pausa su una clip \xe8 la pausa della clip. Aperta dal live, prima eseguiva la pausa del live, che smontava il player e con lui la clip.','Cercare dentro una clip resta dentro la clip. Prima il rilascio finiva sulle registrazioni in un istante senza senso e il file spariva.','Una clip nel riquadro adesso mantiene i suoi controlli. Play/pausa, velocit\xe0, avanzamento a fotogramma, clip precedente/successiva e Vai al live ci sono tutti \u2014 prima aprire una clip faceva sparire l\u2019intera barra, perch\xe9 la barra chiedeva se l\u2019immagine fosse il live e una clip lascia la sessione esattamente dov\u2019era.','Una telecamera il cui giorno corrente \xe8 vuoto adesso cerca da sola nei giorni precedenti, fino a quattordici, e dice a che punto \xe8 arrivata. Prima mostrava subito \u201cNessuna clip\u201d e le pi\xf9 vecchie comparivano solo trascinando la lista a mano.','Quando una sorgente non pu\xf2 rispondere, adesso il motivo viene scritto. Prima la frase arrivava con il segnaposto ancora dentro.']}},{version:'1.0.533',date:'2026-09-21',notes:{en:['While a clip is playing, the time around the picture is the clip\u2019s own. It used to keep showing wherever the timeline had been left, which made a card from the afternoon sit under a frame claiming the evening \u2014 and made the list look wrong when it was not.'],it:['Mentre una clip \xe8 in riproduzione, l\u2019ora attorno all\u2019immagine \xe8 quella della clip. Prima continuava a mostrare il punto in cui era rimasta la timeline, cos\xec una scheda del pomeriggio finiva sotto un riquadro che dichiarava la sera \u2014 e faceva sembrare sbagliata la lista, che non lo era.']}},{version:'1.0.532',date:'2026-09-21',notes:{en:['A camera that was asleep is no longer woken after a clip finishes. Playing a clip brings the player up, and until now nothing took that reason away again \u2014 so the player stayed up and the live stream started by itself.'],it:['Una camera che dormiva non viene pi\xf9 svegliata quando una clip finisce. Riprodurre una clip accende il player, e finora nulla toglieva pi\xf9 quel motivo \u2014 cos\xec il player restava acceso e la diretta partiva da sola.']}},{version:'1.0.531',date:'2026-09-21',notes:{en:['Clips from a camera\u2019s own storage play, instead of flashing for an instant and stopping. The hub was asking the wrong source for the file \u2014 CamStack\u2019s own recorder, which has no file behind a clip the camera wrote \u2014 because nothing said which source the clip came from.'],it:['Le clip dall\u2019archivio della camera si riproducono, invece di lampeggiare un istante e fermarsi. L\u2019hub chiedeva il file alla sorgente sbagliata \u2014 il registratore di CamStack, che dietro una clip scritta dalla camera non ha alcun file \u2014 perch\xe9 nessuno diceva da quale sorgente venisse la clip.']}},{version:'1.0.530',date:'2026-09-21',notes:{en:['Clips from a camera\u2019s own storage play. On a camera that is asleep the player is deliberately kept down so nothing wakes it, and the command to play a clip was dropped into that gap without a word. A clip now brings the player up and opens straight on the file \u2014 the camera is never dialled.'],it:['Le clip dall\u2019archivio della camera si riproducono. Su una camera che dorme il player resta spento apposta perch\xe9 nulla la svegli, e il comando per riprodurre una clip finiva in quel vuoto senza una parola. Ora una clip accende il player e apre direttamente sul file \u2014 la camera non viene mai contattata.']}},{version:'1.0.529',date:'2026-09-21',notes:{en:['The download button on a clip says it is working. It fetches a file of several megabytes, and until now a press looked exactly like a press that did nothing.'],it:['Il pulsante di scaricamento su una clip dice che sta lavorando. Scarica un file di diversi megabyte, e finora premerlo era identico a premere qualcosa che non fa niente.']}},{version:'1.0.528',date:'2026-09-21',notes:{en:['In the clips view the timeline no longer seeks while you scroll. Browsing the list moves the list and nothing else \u2014 the rule was written months ago and only one of its four parts was ever obeyed.'],it:['Nella vista clip la timeline non cerca pi\xf9 mentre scorri. Sfogliare la lista muove la lista e nient\u2019altro \u2014 la regola era scritta da mesi e di quattro sue parti ne veniva rispettata una.']}},{version:'1.0.527',date:'2026-09-21',notes:{en:['Clip thumbnails appear. They were being requested without the session\u2019s credentials, so the hub refused every one of them and the cards went black \u2014 a clip still now gets its credentials from the same single place as every other image on the timeline.'],it:['Le miniature delle clip compaiono. Venivano richieste senza le credenziali della sessione, quindi l\u2019hub le rifiutava tutte e le schede restavano nere \u2014 ora un\u2019immagine di clip prende le credenziali dallo stesso unico posto di ogni altra immagine della timeline.']}},{version:'1.0.526',date:'2026-09-21',notes:{en:['Clip thumbnails render, and the second look at a clip is instant. A still the camera already holds now goes straight to the image cache with the session\u2019s credentials, so it is kept on the device instead of being downloaded and re-encoded every time \u2014 and it no longer trips the limit that printed an error across every card.'],it:['Le miniature delle clip si vedono, e riaprire una clip \xe8 istantaneo. Un\u2019immagine che la camera ha gi\xe0 va ora direttamente alla cache immagini con le credenziali della sessione, quindi resta sul dispositivo invece di essere riscaricata e ricodificata ogni volta \u2014 e non incappa pi\xf9 nel limite che stampava un errore su ogni scheda.']}},{version:'1.0.525',date:'2026-09-21',notes:{en:['Clips from a camera\u2019s own storage get their thumbnails back. Those rows carry a still the camera already holds, and the card was only ever passed the OTHER kind of address \u2014 so no thumbnail was ever requested, on any of them.'],it:['Le clip dall\u2019archivio della camera ritrovano le loro miniature. Quelle righe portano un\u2019immagine che la camera ha gi\xe0, e alla scheda veniva passato solo l\u2019ALTRO tipo di indirizzo \u2014 quindi nessuna miniatura veniva mai richiesta, su nessuna di esse.']}},{version:'1.0.524',date:'2026-09-21',notes:{en:['While a clip is playing in the camera\u2019s picture, the timeline no longer drives the player. Scrolling used to re-arm a seek into the live session behind the clip, which left the picture loading on cameras that record only on events.','The clip surface now reports what it did \u2014 how many rows a list returned, how many stills were served, queued or refused, and what playback resolved to \u2014 so a camera whose clips do not appear can be diagnosed from the logs instead of guessed at.'],it:['Mentre una clip \xe8 in riproduzione nell\u2019immagine della camera, la timeline non pilota pi\xf9 il player. Prima lo scorrimento riarmava una ricerca sulla sessione dal vivo dietro la clip, e l\u2019immagine restava in caricamento sulle camere che registrano solo a eventi.','La superficie clip ora riferisce quel che ha fatto \u2014 quante righe ha restituito un elenco, quante miniature sono state servite, messe in coda o rifiutate, e a cosa si \xe8 risolta la riproduzione \u2014 cos\xec una camera le cui clip non compaiono si diagnostica dai log invece che a intuito.']}},{version:'1.0.523',date:'2026-09-21',notes:{en:['The camera dot no longer claims a camera is not recording when it simply could not be asked. A recording state that failed to load now shows as unknown, in grey, instead of the green of a camera that is idle \u2014 and the timeline says the same about a footage band it could not read.','A finger bouncing off the glass at the end of a pinch no longer advances the zoom a step.','Zooming into a camera no longer follows you out of it: the zoom resets when you open a camera, instead of surviving until the app is killed.'],it:['Il pallino della camera non afferma pi\xf9 che una camera non registra quando semplicemente non \xe8 riuscito a chiederlo. Uno stato di registrazione che non si \xe8 caricato ora appare come sconosciuto, in grigio, invece del verde di una camera ferma \u2014 e la timeline dice lo stesso di una fascia di filmato che non ha potuto leggere.','Un dito che rimbalza sul vetro alla fine di una pizzicata non fa pi\xf9 avanzare lo zoom di un gradino.','Lo zoom su una camera non ti segue pi\xf9 fuori: si azzera all\u2019apertura di una camera, invece di sopravvivere finch\xe9 l\u2019app non viene chiusa.']}},{version:'1.0.522',date:'2026-09-21',notes:{en:['Previous and next clip are on the playback controls. While a clip is playing in the camera\u2019s picture, the two skip buttons step between clips instead of jumping ten seconds \u2014 inside a clip, what comes before and after is another clip.'],it:['Clip precedente e successiva sono nei comandi di riproduzione. Mentre una clip \xe8 in riproduzione nell\u2019immagine della camera, i due pulsanti laterali passano da una clip all\u2019altra invece di saltare dieci secondi \u2014 dentro una clip, ci\xf2 che viene prima e dopo \xe8 un\u2019altra clip.']}},{version:'1.0.521',date:'2026-09-21',notes:{en:['The side navigation is icons only. Beside the picture there was never room for the words, so they were being cut off mid-name; the bar along the bottom, which has the whole width, keeps its labels.','The playback controls now fit the panel they are in. They were sized against the whole window rather than the box around them, so on a narrow panel the rightmost controls ran off the edge instead of stepping aside.'],it:['La navigazione laterale \xe8 a sole icone. Di fianco all\u2019immagine lo spazio per le parole non c\u2019\xe8 mai stato, e i nomi venivano tagliati a met\xe0; la barra in basso, che ha tutta la larghezza, mantiene le sue etichette.','I comandi di riproduzione ora stanno nel pannello che li contiene. Erano dimensionati sull\u2019intera finestra invece che sul riquadro attorno a loro, quindi su un pannello stretto quelli a destra uscivano dal bordo invece di farsi da parte.']}},{version:'1.0.520',date:'2026-09-21',notes:{en:['Settings templates now keep themselves up to date. Save one from the device you set up the way you like, mark that device as the one that keeps it current, and any other device can follow it \u2014 it takes the newest version on its own, including a template someone else in the house made. A following device is read-only on the shared settings: the template wins.','The rows that only mean something on a phone or tablet \u2014 build number, runtime, running bundle \u2014 are no longer shown in the desktop app, where there is no native build behind them.'],it:['I template delle impostazioni ora si mantengono aggiornati da soli. Salvane uno dal dispositivo che hai configurato come vuoi, segna quel dispositivo come quello che lo tiene aggiornato, e qualunque altro pu\xf2 seguirlo \u2014 prende l\u2019ultima versione da solo, anche un template fatto da un\u2019altra persona di casa. Un dispositivo che segue \xe8 in sola lettura sulle impostazioni condivise: vince il template.','Le righe che hanno senso solo su telefono o tablet \u2014 numero di build, runtime, bundle in esecuzione \u2014 non compaiono pi\xf9 nell\u2019app desktop, dove non c\u2019\xe8 una build nativa dietro.']}},{version:'1.0.518',date:'2026-09-21',notes:{en:['A camera that simply has no clips of a kind no longer looks broken. HomeKit clips were showing as a failure with a retry button on cameras HomeKit has never recorded \u2014 which retrying could never fix. The source already explains itself, and the app now shows that explanation instead of an error. A real fault still shows as a fault.'],it:['Una camera che semplicemente non ha clip di un certo tipo non sembra pi\xf9 rotta. Le clip HomeKit comparivano come errore con un pulsante Riprova su camere che HomeKit non ha mai registrato \u2014 e riprovare non poteva cambiarlo. La sorgente si spiega gi\xe0 da s\xe9, e ora l\u2019app mostra quella spiegazione invece di un errore. Un guasto vero continua a comparire come guasto.']}},{version:'1.0.517',date:'2026-09-21',notes:{en:['A clip from the camera now plays in the camera\u2019s own picture, not in a panel on top of it. It is the same player and the same connection the live view and the recorded timeline already use \u2014 so the controls under it are its controls, and going live leaves the clip. A clip that is only ever a link still opens in its own panel, because there is nothing for the player to fetch.'],it:['Una clip della camera ora si riproduce nell\u2019immagine della camera stessa, non in un pannello sopra. \xc8 lo stesso player e la stessa connessione che gi\xe0 usano la diretta e la timeline registrata \u2014 quindi i comandi sotto sono i suoi comandi, e tornare in diretta esce dalla clip. Una clip che \xe8 solo un collegamento continua ad aprirsi nel suo pannello, perch\xe9 non c\u2019\xe8 nulla che il player possa scaricare.']}},{version:'1.0.516',date:'2026-09-21',notes:{en:['The clip list no longer disappears while it is loading. Scrolling could take the list off the screen and leave a loading message in its place \u2014 the rows were being dropped whenever anything upstream flickered, not only when a new window was being read. What is on screen now stays on screen until there is an answer to replace it, and a list that is genuinely empty still says so.'],it:['L\u2019elenco delle clip non sparisce pi\xf9 mentre carica. Scorrendo poteva togliere la lista dallo schermo lasciando al suo posto un messaggio di caricamento \u2014 le righe venivano buttate a ogni sfarfallio a monte, non solo quando si leggeva una finestra nuova. Ora ci\xf2 che \xe8 a schermo ci resta finch\xe9 non arriva una risposta che lo sostituisca, e un elenco davvero vuoto continua a dirlo.']}},{version:'1.0.515',date:'2026-09-21',notes:{en:['Clip thumbnails appear straight away. The hub already held a finished picture for almost every clip \u2014 275 of 300 on one camera \u2014 and the app ignored it, asking the camera to cut a fresh one out of the video file instead, one at a time, in a queue. It now uses the picture that already exists and only asks for one to be made when there genuinely is none.'],it:['Le miniature delle clip compaiono subito. L\u2019hub aveva gi\xe0 pronta l\u2019immagine per quasi ogni clip \u2014 275 su 300 di una camera \u2014 e l\u2019app la ignorava, chiedendo invece alla camera di ritagliarne una nuova dal file video, una alla volta, in coda. Ora usa l\u2019immagine che esiste gi\xe0 e ne fa produrre una solo quando davvero non c\u2019\xe8.']}},{version:'1.0.514',date:'2026-09-21',notes:{en:['Scrolling the clip list no longer sticks on loading. Reaching the oldest end buys another day of history, and the list was buying one from a scroll it had caused itself: a wider window has no cards yet, an empty body collapses, and collapsing snaps the position \u2014 which counted as reaching the end again. Measured at twenty-nine days bought with no finger on the screen. A day of history is now bought by a touch.','A clip\u2019s still stays once it has arrived. The list only keeps the tiles near what you are looking at, so an ordinary scroll was throwing away pictures the camera had already been asked for, and asking again put them back at the end of the queue \u2014 the camera makes one at a time. They are now kept across scrolling, leaving the list and coming back.'],it:['Scorrendo l\u2019elenco delle clip non resta pi\xf9 bloccato sul caricamento. Arrivare in fondo compra un altro giorno di storia, e l\u2019elenco se lo comprava da uno scorrimento causato da s\xe9: una finestra pi\xf9 larga non ha ancora schede, un corpo vuoto si accorcia, e accorciandosi fa scattare la posizione \u2014 che contava come essere di nuovo in fondo. Misurati ventinove giorni comprati senza un dito sullo schermo. Ora un giorno di storia si compra con un tocco.','La miniatura di una clip resta, una volta arrivata. L\u2019elenco tiene montate solo le schede vicine a ci\xf2 che guardi, quindi un normale scorrimento buttava via immagini gi\xe0 chieste alla camera, e richiederle le rimetteva in fondo alla coda \u2014 la camera ne produce una alla volta. Ora si conservano scorrendo, uscendo dall\u2019elenco e tornandoci.']}},{version:'1.0.513',date:'2026-09-20',notes:{en:['Fixes a camera becoming unusable after opening a clip \u2014 continuous vibration and a frozen timeline. Two separate loops caused it. The timeline asks to return to live whenever its list sits at the newest end, and it stops asking once it gets there; the clip mode added yesterday could not be left that way, so the request repeated for ever and each repeat buzzed. It showed up on a sleeping battery camera with few clips, whose short list sits at that end permanently, and never on a mains camera with hundreds. The clip no longer takes over the camera\u2019s frame at all, which removes the cause rather than muting it.','A clip tile\u2019s still now arrives instead of staying blank. The camera mints one still at a time, so on a page of sixty most requests are told to come back \u2014 and the app was treating that like a refusal. It now waits and asks again, spread out so the tiles do not collide, and gives up with a reason rather than silently.'],it:['Corregge una camera che diventava inutilizzabile dopo l\u2019apertura di una clip \u2014 vibrazione continua e timeline bloccata. Le cause erano due cicli distinti. La timeline chiede di tornare al live ogni volta che la sua lista \xe8 sull\u2019estremo pi\xf9 recente, e smette di chiederlo una volta arrivata; la modalit\xe0 clip introdotta ieri non poteva essere abbandonata in quel modo, quindi la richiesta si ripeteva all\u2019infinito e ogni ripetizione vibrava. Si vedeva su una camera a batteria addormentata con poche clip, la cui lista corta sta sempre su quell\u2019estremo, e mai su una camera a rete con centinaia. La clip non occupa pi\xf9 il riquadro della camera, il che elimina la causa invece di zittirla.','La miniatura di una clip ora arriva invece di restare vuota. La camera ne produce una alla volta, quindi su una pagina da sessanta la maggior parte delle richieste riceve un \u201ctorna fra poco\u201d \u2014 e l\u2019app lo trattava come un rifiuto. Ora aspetta e richiede, distanziando i tentativi perch\xe9 non si scontrino, e si arrende dicendo il motivo invece che in silenzio.']}},{version:'1.0.512',date:'2026-09-20',notes:{en:['A camera\u2019s own clip now plays in the camera\u2019s own frame instead of a separate window, and repeats. While it does, the timeline\u2019s transport, heatmap and position line are gone \u2014 there is nothing for them to point at, and an empty scrubber still takes a drag that seeks the wrong footage. Arrows step to the previous and next clip, skipping any the camera cannot serve, and closing puts the frame back on exactly what it was showing rather than jumping to live \u2014 which on a battery camera would be a wake nobody asked for. A clip still being recorded plays once and says why it does not repeat: its end time is a guess the camera has not updated yet.','Each clip tile has a save control where the cluster magnifier normally sits. It asks for the full-size copy, because that is the one worth keeping \u2014 the opposite of what the frame plays, which is deliberately the small one. A clip the camera cannot serve shows the control disabled with the camera\u2019s own reason rather than hiding it.'],it:['Una clip della camera ora si riproduce nel riquadro della camera stessa invece che in una finestra separata, e si ripete. Mentre gira, il trasporto della timeline, la mappa di densit\xe0 e la linea di posizione spariscono: non hanno niente da indicare, e una barra vuota accetta comunque un trascinamento che cerca nel materiale sbagliato. Le frecce passano alla clip precedente e successiva saltando quelle che la camera non riesce a servire, e chiudendo il riquadro torna esattamente a ci\xf2 che mostrava invece di saltare al live \u2014 che su una camera a batteria sarebbe un risveglio che nessuno ha chiesto. Una clip ancora in registrazione si riproduce una volta e dice perch\xe9 non si ripete: la sua fine \xe8 una stima che la camera non ha ancora aggiornato.','Ogni riquadro di clip ha un comando di salvataggio dove di solito sta la lente del gruppo. Chiede la copia a piena dimensione, perch\xe9 \xe8 quella che vale la pena tenere \u2014 il contrario di quella che il riquadro riproduce, che \xe8 deliberatamente la piccola. Una clip che la camera non riesce a servire mostra il comando disattivato con il motivo della camera, invece di nasconderlo.']}},{version:'1.0.511',date:'2026-09-20',notes:{en:['Cameras that keep their own recordings \u2014 on an SD card, or on a Reolink hub \u2014 now show those clips in the app. Pick the source under Timeline \u2192 Clip source; the row only appears on a camera that actually has more than one. Tapping a clip plays the camera\u2019s own file, at the small copy rather than the one thirty times its size, in the same player a saved export opens in. Leaving the setting on CamStack recordings keeps the timeline exactly as it was.'],it:['Le camere che conservano registrazioni proprie \u2014 su scheda SD, o su un hub Reolink \u2014 ora mostrano quelle clip nell\u2019app. La sorgente si sceglie in Timeline \u2192 Sorgente clip, e la riga compare solo su una camera che ne ha davvero pi\xf9 di una. Toccando una clip si riproduce il file della camera stessa, nella copia piccola invece di quella trenta volte pi\xf9 pesante, nello stesso player con cui si apre un export salvato. Lasciando l\u2019impostazione su Registrazioni CamStack la timeline resta esattamente com\u2019era.']}},{version:'1.0.510',date:'2026-09-20',notes:{en:['A single camera\u2019s live view now recovers from a freeze on its own. A stream whose picture stops is not an errored stream \u2014 the connection stays up and the player still reports that it is playing \u2014 so every recovery path in the app slept through it, and pressing pause and then play was the only way out. That gesture worked because the session could always be rebuilt; what was missing was anything that decided to. The grid already healed itself this way; the single-camera view never did.','Animal, vehicle and audio labels on the Events page are translated. The translations were never missing: the app asked each camera which classes it advertises and printed the raw English id whenever that list did not carry one \u2014 which happens whenever a camera has its animal or vehicle group switched off while older events still mention a dog, whenever that per-camera list is still loading, and for every raw label the audio classifier produces. A label now falls back to its family and, in the last resort, shows the original word rather than a blank.'],it:['La vista dal vivo di una singola camera ora riparte da sola quando si blocca. Uno stream la cui immagine si ferma non \xe8 uno stream in errore \u2014 la connessione resta su e il player continua a dire che sta riproducendo \u2014 quindi tutti i percorsi di recupero dell\u2019app ci dormivano sopra, e premere pausa e poi play era l\u2019unico modo per uscirne. Quel gesto funzionava perch\xe9 la sessione si poteva sempre ricostruire; mancava solo qualcuno che decidesse di farlo. La griglia si curava gi\xe0 cos\xec, la vista a camera singola no.','Le etichette di animali, veicoli e audio nella pagina Eventi sono tradotte. Le traduzioni non erano mai mancate: l\u2019app chiedeva a ogni camera quali classi dichiara e stampava l\u2019identificativo inglese grezzo ogni volta che quella lista non ne conteneva una \u2014 cosa che succede quando una camera ha il gruppo animali o veicoli spento mentre lo storico parla ancora di un cane, quando quella lista sta ancora caricando, e per ogni etichetta grezza prodotta dal classificatore audio. Ora un\u2019etichetta ripiega sulla sua famiglia e, in ultima istanza, mostra la parola originale invece del vuoto.']}},{version:'1.0.509',date:'2026-09-19',notes:{en:['The timeline column on a tablet is wider, because its toolbar had stopped fitting: the row had wrapped onto a second line and the menu that opens from it was clipped by the column\u2019s edge. The second line was eating the space the timeline itself needs.'],it:['La colonna della timeline su tablet \xe8 pi\xf9 larga, perch\xe9 la sua barra non ci stava pi\xf9: la riga era andata a capo su due righe e il menu che si apre da l\xec veniva tagliato dal bordo della colonna. La seconda riga si mangiava lo spazio che serve alla timeline stessa.']}},{version:'1.0.508',date:'2026-09-19',notes:{en:['The stream numbers on the camera card now actually arrive. They were being measured once a second and thrown away on the way in: the app checks incoming messages for a stats reply, and it was matching any message that merely mentioned stats \u2014 which every sample does. So the card said "no measurement yet" on every camera, permanently, while the data was arriving the whole time.'],it:['I numeri dello stream sulla scheda della telecamera adesso arrivano davvero. Venivano misurati una volta al secondo e buttati via all\u2019ingresso: l\u2019app controlla nei messaggi in arrivo se \xe8 una risposta di statistiche, e accettava qualunque messaggio che nominasse le statistiche \u2014 cosa che ogni campione fa. Cos\xec la scheda diceva \u201cnessuna misura ancora\u201d su ogni telecamera, per sempre, mentre i dati arrivavano da subito.']}},{version:'1.0.507',date:'2026-09-19',notes:{en:['A camera that reports neither a battery nor a link now gets a chart glyph of its own, which opens the same card and its stream numbers. Those cameras had no badge at all, so the card could not be opened on them \u2014 the permanently-powered, wired ones, which are exactly the cameras you are most likely to be investigating.'],it:['Una telecamera che non riporta n\xe9 batteria n\xe9 collegamento adesso ha un\u2019icona a grafico tutta sua, che apre la stessa scheda e i suoi numeri dello stream. Su quelle telecamere non c\u2019era nessuna icona, quindi la scheda non si poteva aprire \u2014 e sono le telecamere fisse alimentate, cio\xe8 proprio quelle su cui \xe8 pi\xf9 probabile che tu stia indagando.']}},{version:'1.0.506',date:'2026-09-19',notes:{en:['The stream numbers moved to where you can reach them. Tap the battery or link glyph on a camera and the card now also carries the stream: the verdict first \u2014 is a frozen picture the network or the decoder? \u2014 then the evidence. Frames decoded and whether they are still advancing, freezes and how long they lasted, key-frame requests, loss, latency and the connection path; and from the hub, which profile you are actually being served, whether that stream is native or transcoded here, which node ingests it, and why the quality ladder last moved. The pill on the picture stays as it is: on a phone the panel behind it could never be opened, because the app owns the touches over the player.'],it:['I numeri dello stream si sono spostati dove puoi raggiungerli. Tocca l\u2019icona della batteria o del collegamento su una telecamera e la scheda adesso porta anche lo stream: prima il verdetto \u2014 un\u2019immagine bloccata \xe8 la rete o il decoder? \u2014 e poi le prove. Fotogrammi decodificati e se stanno ancora avanzando, blocchi e quanto sono durati, richieste di key frame, perdita, latenza e il percorso della connessione; e dall\u2019hub, quale profilo ti sta servendo davvero, se quello stream \xe8 nativo o transcodificato qui, quale nodo lo ingerisce e perch\xe9 la scala di qualit\xe0 si \xe8 mossa l\u2019ultima volta. La pastiglia sull\u2019immagine resta com\u2019\xe8: sul telefono il pannello dietro non si poteva aprire, perch\xe9 i tocchi sopra il player appartengono all\u2019app.']}},{version:'1.0.505',date:'2026-09-19',notes:{en:['The stream stats are a real debug tool now, and they stay out of your way. A small pill above the controls carries the verdict, the resolution, the frame rate and the bitrate; tap it for the full panel. The panel answers the question that mattered and could not be answered before: when a picture freezes, is it the network or the decoder? It shows frames decoded, freezes and their duration, key-frame requests, retransmissions, jitter, loss and the ICE path on the client side \u2014 and, from the hub, which rung you are actually being served, whether that stream is native or transcoded, which node is ingesting it, and why the quality ladder last moved.'],it:['Le statistiche dello stream sono diventate uno strumento di debug vero, e stanno fuori dai piedi. Una pastiglia sopra i controlli porta il verdetto, la risoluzione, i fotogrammi al secondo e il bitrate; toccala per il pannello completo. Il pannello risponde alla domanda che contava e a cui non si poteva rispondere: quando l\u2019immagine si blocca, \xe8 la rete o il decoder? Mostra i fotogrammi decodificati, i blocchi e quanto sono durati, le richieste di key frame, le ritrasmissioni, jitter, perdita e il percorso ICE lato client \u2014 e, dall\u2019hub, quale profilo ti sta servendo davvero, se quello stream \xe8 nativo o transcodificato, quale nodo lo sta ingerendo e perch\xe9 la scala di qualit\xe0 si \xe8 mossa l\u2019ultima volta.']}},{version:'1.0.504',date:'2026-09-17',notes:{en:['The Home button on a PTZ camera now tells you when it cannot do anything. It used to send the camera to whichever preset happened to sit in the first slot \u2014 on these cameras that was \u201cstanza\u201d, \u201cCredenza\u201d and \u201cPreset1\u201d, nobody\u2019s idea of home \u2014 and when that slot was empty it failed in silence. The hub now asks which preset you chose as home, refuses rather than guessing, and the app shows you the refusal instead of swallowing it. Pick one under PTZ settings.'],it:['Il pulsante Home su una telecamera PTZ ora ti dice quando non pu\xf2 fare niente. Prima mandava la telecamera al preset che si trovava nel primo posto \u2014 su queste telecamere erano \u201cstanza\u201d, \u201cCredenza\u201d e \u201cPreset1\u201d, che home non sono \u2014 e quando quel posto era vuoto falliva in silenzio. Adesso l\u2019hub chiede quale preset hai scelto come home, rifiuta invece di indovinare, e l\u2019app ti mostra il rifiuto invece di ingoiarlo. Scegline uno nelle impostazioni PTZ.']}},{version:'1.0.503',date:'2026-09-16',notes:{en:['Pages with camera tiles scroll again on a phone. A tile claimed every touch that landed on it \u2014 and on a phone a tile is most of the screen \u2014 then did nothing with it, because dragging only pans a tile you have already zoomed into. Now the gesture is yours until you zoom in; pinch and double-tap are unchanged.'],it:['Le pagine con i riquadri delle telecamere tornano a scorrere sul telefono. Un riquadro si prendeva ogni tocco che ci finiva sopra \u2014 e sul telefono un riquadro e\u2019 quasi tutto lo schermo \u2014 e poi non ne faceva niente, perche\u2019 trascinare sposta solo un riquadro in cui hai gia\u2019 zoomato. Ora il gesto resta tuo finche\u2019 non zoomi; pinch e doppio tocco invariati.']}},{version:'1.0.502',date:'2026-09-16',notes:{en:['Zones, above the places: a part of the home that holds several rooms \u2014 \u201cZona notte\u201d for the bedrooms. They come first in the filter strip, with their own icon, because it is the coarser question: asking for upstairs should not mean pressing four rooms. Create them on the hub, under Locations.','A camera still belongs to exactly one place, and a place to at most one zone. Nothing about your cameras changed to make this work.','The drawn zones in the rule editor are now called detection zones, which is what they are \u2014 so the word is free for the rooms of your home.'],it:['Le zone, sopra i luoghi: una parte della casa che tiene pi\xf9 stanze \u2014 \u201cZona notte\u201d per le camere da letto. Vengono per prime nella striscia dei filtri, con la loro icona, perch\xe9 sono la domanda pi\xf9 grossa: chiedere il piano di sopra non deve voler dire premere quattro stanze. Si creano sull\u2019hub, sotto Locations.','Una telecamera resta in un solo luogo, e un luogo in al massimo una zona. Non \xe8 cambiato nulla sulle tue telecamere perch\xe9 questo funzionasse.','Le zone disegnate nell\u2019editor delle regole ora si chiamano zone di rilevamento, che \xe8 quello che sono \u2014 cos\xec la parola resta libera per le stanze di casa.']}},{version:'1.0.501',date:'2026-09-16',notes:{en:['Choosing a place that has nothing in it no longer takes the page away. Pressing Favourites with nothing starred replaced the reel, the selector and the cameras with \u201cno cameras configured\u201d \u2014 and took away the control that would have undone it. The reel and the strip stay put; only the list below says it is empty.','The location chips are the size of chips again, and Favourites is in your language.'],it:['Scegliere un luogo vuoto non porta pi\xf9 via la pagina. Premere Preferite senza averne sostituiva reel, selettore e camere con \u201cnessuna camera configurata\u201d \u2014 e toglieva proprio il comando per tornare indietro. Reel e striscia restano al loro posto; \xe8 la lista sotto a dire che \xe8 vuota.','I chip dei luoghi sono tornati alti quanto un chip, e Preferite \xe8 nella tua lingua.']}},{version:'1.0.500',date:'2026-09-16',notes:{en:['The camera list has a location strip, between the reel and the cameras. Favourites first \u2014 with a count, because an empty shortlist is worth knowing before you press into it \u2014 then \u201cAll\u201d, then every place your cameras actually name. Pressing the place you are already in takes you back out, so a room whose cameras are all offline is never a dead end.','A heart on each camera, top left. Favourites live in your profile and travel with it: share the profile and they go too. They are yours alone otherwise.','A place can carry its own icon, chosen in the hub. A room nobody gave one to shows no icon at all rather than a default \u2014 \u201cnobody chose\u201d and \u201cthe pin was chosen\u201d are different things.'],it:['La lista camere ha una striscia dei luoghi, fra il reel e le camere. Prima le Preferite \u2014 col conteggio, perch\xe9 una lista corta vuota \xe8 meglio saperlo prima di entrarci \u2014 poi \u201cTutte\u201d, poi ogni luogo che le tue camere hanno davvero. Premere il luogo in cui sei gi\xe0 ti riporta indietro, cos\xec una stanza con tutte le camere offline non \xe8 mai un vicolo cieco.','Un cuore su ogni camera, in alto a sinistra. Le preferite stanno nel tuo profilo e viaggiano con lui: condividi il profilo e vanno con quello. Per il resto sono solo tue.','Un luogo pu\xf2 avere la sua icona, scelta sull\u2019hub. Una stanza a cui nessuno l\u2019ha data non disegna nessuna icona invece di una di default \u2014 \u201cnessuno ha scelto\u201d e \u201cha scelto il pin\u201d sono due cose diverse.']}},{version:'1.0.499',date:'2026-09-15',notes:{en:['The debug reasons are the ones you actually use. Nine of them, in your order \u2014 the old list had been inferred from a reading of eleven real notes; this one was dictated by the person who reviews with it. \u201cNo crop\u201d is gone: a crop that is WRONG and a crop that is ABSENT are two different findings, and one checkbox was blurring them.','A track\u2019s media strip can now show \u201cGate crop\u201d \u2014 the pixels the confirmation gate judged, kept when it refused to confirm a birth. It exists to be argued with: it is the only thing that can say whether the detector was right to drop a sighting.'],it:['Le reason di debug sono quelle che usi davvero. Nove, nel tuo ordine \u2014 la lista precedente era stata dedotta da una lettura di undici note reali; questa l\u2019ha dettata chi ci rivede. \xc8 sparito \u201cnessun ritaglio\u201d: un crop SBAGLIATO e un crop ASSENTE sono due reperti diversi, e una casella sola li confondeva.','La striscia media di una traccia pu\xf2 ora mostrare \u201cGate crop\u201d \u2014 i pixel su cui il confirmation gate ha deciso, tenuti quando ha rifiutato di confermare una nascita. Serve per poterlo contestare: \xe8 l\u2019unica cosa che dice se il detector avesse ragione a scartare un avvistamento.']}},{version:'1.0.498',date:'2026-09-15',notes:{en:['The \u201c?\u201d on an events card really does open the assignment now. It was made a button last time and still could not be tapped: it sits in the caption row, which is deliberately transparent to touches so the labels never swallow the card\u2019s own open \u2014 and the button inherited that.','Audio on open is no longer one answer for every camera. Alongside \u201calways on\u201d and \u201calways off\u201d there is now \u201cas you left it\u201d, which is the new default: each camera opens the way you last left it, and a camera you have never chosen on opens silent.'],it:['Il \u201c?\u201d su una card degli eventi ora apre davvero l\u2019assegnazione. L\u2019ultima volta era diventato un pulsante e restava comunque intoccabile: sta nella riga delle etichette, che \xe8 trasparente ai tocchi apposta perch\xe9 le etichette non si mangino l\u2019apertura della card \u2014 e il pulsante ereditava quella trasparenza.','L\u2019audio all\u2019apertura non \xe8 pi\xf9 una risposta sola per tutte le camere. Accanto a \u201csempre acceso\u201d e \u201csempre spento\u201d c\u2019\xe8 ora \u201ccome l\u2019hai lasciato\u201d, che \xe8 il nuovo default: ogni camera si apre com\u2019era l\u2019ultima volta, e una camera su cui non hai mai scelto si apre muta.']}},{version:'1.0.497',date:'2026-09-14',notes:{en:['You can add a linked device from the camera\u2019s own panel, not only from the cameras list. The panel showed you what was linked and gave you nowhere to add one, so the answer was to leave the camera you were looking at.','The keyboard no longer covers the device picker while you search it. And tapping outside now closes the keyboard first, so a search you were half way through is not thrown away with it.'],it:['Puoi aggiungere un dispositivo collegato dal pannello della camera stessa, non solo dalla lista camere. Il pannello ti mostrava cosa era collegato e non ti dava dove aggiungerne uno, quindi la risposta era uscire dalla camera che stavi guardando.','La tastiera non copre pi\xf9 il selettore dei dispositivi mentre lo cerchi. E il tocco fuori ora chiude prima la tastiera, cos\xec una ricerca lasciata a met\xe0 non se ne va con lei.']}},{version:'1.0.496',date:'2026-09-14',notes:{en:['The \u201c?\u201d on an events card now opens the assignment. It was a label that said a face was waiting for a name and did nothing when you tapped it \u2014 so you opened the card and looked for the assignment again, answering a question you had already asked.','A group now shows its PATH: what each of its subjects did, drawn on the picture they were in together, one colour each. Every member already had its own crop in the group; what was missing was where they went.'],it:['Il \u201c?\u201d su una card degli eventi ora apre l\u2019assegnazione. Era un\u2019etichetta che diceva che un volto aspettava un nome e non faceva niente al tocco \u2014 cos\xec aprivi la card e ricercavi l\u2019assegnazione, rispondendo a una domanda che avevi gi\xe0 fatto.','Un gruppo ora mostra il suo PERCORSO: cosa ha fatto ognuno dei suoi soggetti, disegnato sull\u2019immagine in cui erano insieme, un colore per ciascuno. Ogni membro aveva gi\xe0 il suo ritaglio nel gruppo; mancava dove sono andati.']}},{version:'1.0.495',date:'2026-09-13',notes:{en:['Groups with no camera filter now list every camera. Leaving the camera chip untouched means "all of them" here, and it meant "none of them" to the hub \u2014 so the gallery came back empty on a system full of groups.'],it:['I gruppi senza filtro camera ora elencano tutte le telecamere. Non toccare il chip delle camere qui significa \u201ctutte\u201d, e per l\u2019hub significava \u201cnessuna\u201d \u2014 cos\xec la galleria tornava vuota su un sistema pieno di gruppi.']}},{version:'1.0.494',date:'2026-09-13',notes:{en:['Administrators can link devices to a camera from the phone \u2014 a doorbell, a sensor, a light \u2014 in the same list the pencil arranges. The picker suggests the devices in that camera\u2019s own room first, and nothing is linked until you pick it.'],it:['Gli amministratori possono collegare device a una telecamera dal telefono \u2014 un campanello, un sensore, una luce \u2014 nella stessa lista che la matita riordina. Il selettore suggerisce per primi i device della stanza di quella telecamera, e niente viene collegato finch\xe9 non lo scegli tu.']}},{version:'1.0.493',date:'2026-09-13',notes:{en:['You can arrange the camera list by hand. A small pencil in the corner turns the list into edit mode, you drag the rows, and a tick saves. Nothing is draggable until you ask \u2014 no more reordering a camera by accident \u2014 and cancelling puts back exactly the order you started with, not the last one saved.','The arrangement is yours and stays on this device. A camera added on the hub appears at the end rather than somewhere unpredictable, and an order can move a camera but can never hide one.'],it:['Puoi sistemare la lista delle telecamere a mano. Una piccola matita nell\u2019angolo mette la lista in modifica, trascini le righe, e la spunta salva. Niente \xe8 trascinabile finch\xe9 non lo chiedi \u2014 niente pi\xf9 riordini per sbaglio \u2014 e annullare rimette esattamente l\u2019ordine da cui eri partito, non l\u2019ultimo salvato.','La disposizione \xe8 tua e resta su questo dispositivo. Una telecamera aggiunta sull\u2019hub compare in fondo invece che in un punto imprevedibile, e un ordine pu\xf2 spostare una telecamera ma non pu\xf2 mai nasconderla.']}},{version:'1.0.492',date:'2026-09-13',notes:{en:['Three pages can now list GROUPS instead of subjects: the camera timeline, the reel on the cameras page, and the Events gallery. A family walking in together is one entry with several pictures, not four cards. Each page has its OWN switch and each one starts on subjects \u2014 nothing changes until you ask it to, and you can always switch back from the page itself.','A group card shows what the group was made of \u2014 two people and a dog \u2014 and a Live chip while the session is still running. Opening it lists the members, each one linking to its own track.','The reel draws groups as their own strip, with several images per entry and no clustering: two sessions seconds apart are two things that happened, and the old grouping used to swallow one of them.','Filtering understands groups. Picking Dog now finds the arrivals that HAD a dog with them, including the group of four people \u2014 the filter asks about the members, and it runs on the hub rather than on your phone.'],it:['Tre pagine possono ora elencare i GRUPPI invece dei soggetti: la timeline della telecamera, il reel nella pagina telecamere e la galleria Eventi. Una famiglia che entra insieme \xe8 una voce sola con pi\xf9 immagini, non quattro schede. Ogni pagina ha il SUO interruttore e parte dai soggetti \u2014 non cambia nulla finch\xe9 non lo chiedi tu, e si torna indietro dalla pagina stessa.','La scheda di un gruppo dice di cosa era fatto \u2014 due persone e un cane \u2014 e porta la pastiglia Live finch\xe9 la sessione \xe8 in corso. Aprendola trovi i membri, ognuno con il link alla sua traccia.','Nel reel i gruppi hanno una striscia propria, con pi\xf9 immagini per voce e senza raggruppamento: due sessioni a pochi secondi di distanza sono due cose successe, e il vecchio accorpamento se ne mangiava una.','Il filtro capisce i gruppi. Scegliere Cane ora trova gli arrivi che AVEVANO un cane con loro, compreso il gruppo di quattro persone \u2014 il filtro chiede dei membri, e gira sull\u2019hub invece che sul telefono.']}},{version:'1.0.491',date:'2026-09-13',notes:{en:['The movable window now carries the stream\u2019s own controls: audio, talk-back, picture-in-picture, and a button that opens that camera full-screen. They are the same controls as the single-camera screen \u2014 the same code, so they cannot drift apart.','The resize corner wore the FULLSCREEN icon, so the grip was signing the wrong action. It now looks like every other control in the app.','The heatmap in that window only ever drew recordings. Motion and audio were never missing from the hub \u2014 the window was handing the bar an empty list. Both lanes are there now. Detections are deliberately still absent: loading them costs a few hundred kilobytes, which a floating panel over a live stream should not spend.','Exports and the hub\u2019s own files are ONE section, now called Media. An export finally has a detail view and plays in the app instead of only downloading, and the filter is the one from Events \u2014 a chip per facet that says what it is narrowing, instead of a pill that only counted.','You can delete what the hub produced. Until now a timelapse could only be waited out. A video takes its preview still with it, so one card frees both files.','The timeline can show GROUPS instead of subjects: a family arriving together is one card, not three. Off by default \u2014 turn it on in the timeline filters or in Settings. A session still in progress is listed with a Live chip rather than hidden.'],it:['La finestra mobile ora porta i comandi dello stream: audio, microfono, picture-in-picture e un pulsante che apre quella telecamera a schermo intero. Sono gli STESSI comandi della schermata singola \u2014 lo stesso codice, quindi non possono divergere.','L\u2019angolo di ridimensionamento portava l\u2019icona dello SCHERMO INTERO: la presa firmava l\u2019azione sbagliata. Ora ha l\u2019aspetto di ogni altro comando dell\u2019app.','La heatmap in quella finestra disegnava solo le registrazioni. Movimento e audio non sono mai mancati dall\u2019hub \u2014 era la finestra a passare alla barra una lista vuota. Ora ci sono entrambi. Le rilevazioni restano fuori di proposito: caricarle costa qualche centinaio di kilobyte, che un pannello sopra uno stream dal vivo non deve spendere.','Gli export e i file prodotti dall\u2019hub sono UNA sezione sola, che ora si chiama Media. Un export ha finalmente una scheda e si riproduce dentro l\u2019app invece di poter solo essere scaricato, e il filtro \xe8 quello di Eventi \u2014 una pastiglia per faceta che dice cosa sta restringendo, invece di una che contava e basta.','Puoi cancellare quello che ha prodotto l\u2019hub. Fino a ora un timelapse si poteva solo aspettare. Un video porta via anche la sua anteprima, quindi una card libera due file.','La timeline pu\xf2 mostrare i GRUPPI invece dei soggetti: una famiglia che arriva insieme \xe8 una card, non tre. Spento di default \u2014 si accende dai filtri della timeline o dalle Impostazioni. Una sessione ancora in corso viene elencata con la pastiglia Live, non nascosta.']}},{version:'1.0.490',date:'2026-09-13',notes:{en:['The movable window resizes properly now. The handle always worked \u2014 the sizes behind it did not: all three snaps came out the same box on a phone, so dragging changed nothing. The grip is finger-sized and no longer shares its corner with the playback controls.','The playback bar inside that window fits the width it is given. It was drawing a full-width bar into a small window with nothing to wrap into, which is why LIVE broke onto two lines and buttons landed on top of each other.','Event thumbnails stop failing to warm. The list was pre-fetching them with the wrong kind of id \u2014 an event\u2019s, where a track\u2019s was needed \u2014 so every pre-fetch missed and the picture had to be fetched again when the card appeared.','Picture-in-picture on app close is gone. It was granted by the system and lost 176 ms later, every time: Apple only starts picture-in-picture in response to something you do, and an app closing is not that. The button on the player still works and survives closing the app.'],it:['La finestra mobile ora si ridimensiona davvero. La maniglia ha sempre funzionato \u2014 erano le misure dietro a non funzionare: su telefono tutte e tre le taglie davano la stessa identica finestra, quindi trascinare non cambiava nulla. L\u2019angolo di presa \xe8 dimensionato per un dito e non se lo contende pi\xf9 con i comandi di riproduzione.','La barra di riproduzione dentro quella finestra si adatta alla larghezza che ha. Prima disegnava una barra intera dentro una finestra piccola senza spazio in cui andare a capo: per questo LIVE finiva su due righe e i pulsanti si sovrapponevano.','Le miniature degli eventi smettono di fallire il precaricamento. La lista le chiedeva con il tipo di id sbagliato \u2014 quello dell\u2019evento invece che quello della traccia \u2014 quindi ogni precaricamento mancava e l\u2019immagine andava richiesta da capo quando la card compariva.','Il picture-in-picture alla chiusura dell\u2019app non c\u2019\xe8 pi\xf9. Il sistema lo concedeva e lo perdeva 176 ms dopo, ogni volta: Apple avvia il picture-in-picture solo in risposta a qualcosa che fai tu, e chiudere l\u2019app non lo \xe8. Il pulsante sul player continua a funzionare e sopravvive alla chiusura.']}},{version:'1.0.489',date:'2026-09-13',notes:{en:['Review: deleting a sample from a person now actually deletes it. The request was never leaving the app \u2014 it was looked up in a way that can never find it, so nothing happened and nothing said so.','Review: you can delete parked faces you do not want to keep, and create a new person without leaving the page. Picking a person is a searchable list instead of a row of chips that grew with your gallery.','Review: the similar-groups button kept going quiet after the first pass. It was comparing faces over a wide window and then only showing groups that fell inside a much narrower one, so the matches sitting just outside vanished. One window now \u2014 and the button no longer claims a number.','The movable player lost its padlock: it came along with the shared playback bar and did nothing there but swallow your taps.','Opening a camera full-screen now closes the movable window if it was showing that same camera, instead of leaving two pictures of it.'],it:['Review: cancellare un campione da una persona ora lo cancella davvero. La richiesta non usciva nemmeno dall\u2019app \u2014 veniva cercata in un modo che non pu\xf2 trovarla, quindi non succedeva nulla e nulla lo diceva.','Review: puoi cancellare le facce parcheggiate che non vuoi tenere, e creare una nuova persona senza uscire dalla pagina. Scegliere una persona ora \xe8 una lista con ricerca invece di una fila di pastiglie che cresceva con la tua galleria.','Review: il pulsante dei gruppi simili ammutoliva dopo il primo giro. Confrontava le facce su una finestra ampia e poi mostrava solo i gruppi che cadevano dentro una molto pi\xf9 stretta, quindi le somiglianze appena fuori sparivano. Ora la finestra \xe8 una sola \u2014 e il pulsante non promette pi\xf9 un numero.','Il player mobile ha perso il lucchetto: arrivava insieme alla barra di riproduzione condivisa e l\xec non faceva altro che ingoiare i tuoi tocchi.','Aprire una telecamera a schermo intero ora chiude la finestra mobile se mostrava quella stessa telecamera, invece di lasciarne due immagini.']}},{version:'1.0.488',date:'2026-09-13',notes:{en:['The movable player works on the phone now, not only on tablets and wide windows. A button on each camera card summons it without leaving the list, and its title is the CAMERA\u2019s name \u2014 it used to say "Playback", which cannot tell two open windows apart.','The downward swipe on a camera changed hands: one finger goes back, two fingers hand the camera to the movable player and go back. Picture-in-picture is no longer a gesture at all \u2014 it now happens by itself when you close the app on a single camera, because that is the moment your hands are busy pressing Home. There is a switch for it under Stream.','Audio is on when you open a camera. It used to open muted until you found the button.','Settings were reorganised: General (theme, language, press feedback) sits right under Server, the event-vibration switches are gone, and on a tablet or a desktop window the sections lay out in two or three columns instead of one long scroll.'],it:['Il player mobile ora funziona anche sul telefono, non solo su tablet e finestre larghe. Un pulsante su ogni scheda telecamera lo apre senza uscire dalla lista, e il titolo \xe8 il nome della TELECAMERA \u2014 prima diceva "Riproduzione", che non distingue due finestre aperte.','Lo scorrimento verso il basso su una telecamera cambia mano: un dito torna indietro, due dita passano la telecamera al player mobile e tornano indietro. Il picture-in-picture non \xe8 pi\xf9 un gesto \u2014 ora parte da solo quando chiudi l\u2019app su una singola telecamera, perch\xe9 quello \xe8 il momento in cui le mani sono occupate a premere Home. C\u2019\xe8 un interruttore sotto Streaming.','L\u2019audio \xe8 attivo quando apri una telecamera. Prima si apriva muta finch\xe9 non trovavi il pulsante.','Impostazioni riorganizzate: Generale (tema, lingua, vibrazione alla pressione) sta subito sotto Server, gli interruttori di vibrazione sugli eventi sono spariti, e su tablet o finestra desktop le sezioni si dispongono su due o tre colonne invece di una lista lunga.']}},{version:'1.0.487',date:'2026-09-13',notes:{en:['Thumbnails and track media are back. A media file used to be addressed by a composite key that embedded a foreign id, and once every event table got its own numbering those keys started naming the wrong row \u2014 a night shot could answer for a different camera. The hub now addresses a media file by its own id, and asks for "the best picture of this track" as its own question. The app had been left on the old address, so every thumbnail it asked for came back missing: the track detail opened empty and the timeline drew nothing.','Playback got a player you can move. Open a recording from anywhere and it keeps playing in a window you can drag and resize, and it survives you navigating elsewhere in the app.','The camera reel lights up when something happens \u2014 motion and audio, on by default, with a settings panel to choose what counts. Tapping a camera in the reel now swaps it in place instead of reloading the page, and if you are in playback the new camera opens at the same instant you were watching, not at its own live edge.'],it:['Le miniature e i media delle tracce sono tornati. Un file media veniva indirizzato con una chiave composta che conteneva un id altrui, e da quando ogni tabella di eventi ha una sua numerazione quelle chiavi hanno cominciato a nominare la riga sbagliata \u2014 uno scatto notturno poteva rispondere per un\u2019altra telecamera. L\u2019hub ora indirizza un media con il suo id, e chiede \u201cla foto migliore di questa traccia\u201d come domanda a s\xe9. L\u2019app era rimasta all\u2019indirizzo vecchio, quindi ogni miniatura che chiedeva tornava mancante: il dettaglio della traccia si apriva vuoto e la timeline non disegnava nulla.','La riproduzione ha un player che puoi spostare. Apri una registrazione da qualsiasi punto e continua in una finestra che puoi trascinare e ridimensionare, e resta l\xec anche se navighi altrove nell\u2019app.','Il carosello delle telecamere si illumina quando succede qualcosa \u2014 movimento e audio, attivi di default, con un pannello per scegliere cosa conta. Toccare una telecamera nel carosello ora la scambia sul posto invece di ricaricare la pagina, e se sei in riproduzione la nuova telecamera si apre allo stesso istante che stavi guardando, non al suo live.']}},{version:'1.0.486',date:'2026-09-11',notes:{en:['The camera timeline now opens on the last hour instead of the last three. Three hours was the density the timeline had always drawn, not a decision about what you want to see when you open a camera \u2014 it put whatever just happened in a third of the screen and made the rest yesterday\u2019s scrolling.','Event cards now sit ON the track they describe. The timeline runs newest at the top, so a track ends above and begins below \u2014 but the card was anchored by its top edge to the track\u2019s beginning, which hung it under the event, over the minutes before anything happened. Now the card\u2019s bottom edge is where the track starts, so the card covers the subject\u2019s own passage and reading upward follows it.'],it:['La timeline della telecamera si apre sull\u2019ultima ora invece che sulle ultime tre. Tre ore erano la densit\xe0 che la timeline aveva sempre disegnato, non una scelta su cosa serve vedere aprendo una telecamera: mettevano quello appena successo in un terzo di schermo e rendevano il resto lo scroll di ieri.','Le card degli eventi ora stanno SOPRA la traccia che descrivono. La timeline ha il pi\xf9 recente in alto, quindi una traccia finisce sopra e comincia sotto \u2014 ma la card era ancorata col bordo superiore all\u2019inizio della traccia, il che la appendeva sotto l\u2019evento, sui minuti in cui non era ancora successo nulla. Ora il bordo inferiore della card \xe8 dove la traccia comincia, cos\xec la card copre il passaggio del soggetto e leggere verso l\u2019alto lo segue.']}},{version:'1.0.485',date:'2026-09-11',notes:{en:['The app now hangs up when you leave it, and calls back when you return. In the background the phone freezes the app and stops reading, but the connection stayed open \u2014 so the hub kept piling up messages for a listener that was asleep. One evening of that was 88 MB held on the hub for a phone nobody was holding. The app now closes the connection as it leaves and opens a new one as it comes back.','Coming back is a normal thing, not a fault: no error, no "offline", nothing emptied. You see a brief "connecting" and the screen you left, and the app re-asks the hub for everything that can have changed while it was away \u2014 cameras, batteries, switches, who is in frame \u2014 so what you are looking at a second later is current rather than remembered.'],it:['L\u2019app ora chiude la linea quando la lasci, e richiama quando torni. In background il telefono congela l\u2019app e smette di leggere, ma la connessione restava aperta \u2014 cos\xec l\u2019hub continuava ad accumulare messaggi per un ascoltatore che dormiva. Una sera cos\xec erano 88 MB tenuti sull\u2019hub per un telefono che nessuno aveva in mano. Ora l\u2019app chiude la connessione mentre esce e ne apre una nuova quando rientra.','Il rientro \xe8 una cosa normale, non un guasto: nessun errore, nessun \u201coffline\u201d, niente che si svuota. Vedi un breve \u201cconnessione\u201d e la schermata che avevi lasciato, e l\u2019app richiede all\u2019hub tutto quello che pu\xf2 essere cambiato mentre era via \u2014 telecamere, batterie, interruttori, chi \xe8 inquadrato \u2014 cos\xec quello che guardi un secondo dopo \xe8 attuale e non ricordato.']}},{version:'1.0.484',date:'2026-09-11',notes:{en:['Pinch-to-zoom, the pan while zoomed and the PTZ joystick work again. The crash guard added in 1.0.479 wrapped every gesture handler, and the wrapped handlers were no longer compiled for the UI thread \u2014 so each gesture was caught and dropped on every frame instead of running. Nothing was lost on the hub: every dropped gesture was logged, which is how this was found.','The camera timeline filter now lists every detection class that actually appears in the loaded window, even when the hub does not advertise it for that camera. A class you could see on the timeline but not tick in the filter was the hub describing the camera from a momentary status; the viewer no longer hides what it is showing.'],it:['Il pinch-to-zoom, lo spostamento da zoomato e il joystick PTZ funzionano di nuovo. La protezione anti-crash aggiunta nella 1.0.479 avvolgeva ogni gestore dei gesti, e i gestori avvolti non venivano pi\xf9 compilati per il thread UI \u2014 quindi ogni gesto veniva intercettato e scartato a ogni frame invece di eseguire. Sull\u2019hub non \xe8 andato perso nulla: ogni gesto scartato \xe8 stato registrato, ed \xe8 cos\xec che \xe8 stato trovato.','Il filtro della timeline della telecamera ora elenca ogni classe di rilevamento che compare davvero nella finestra caricata, anche quando l\u2019hub non la dichiara per quella telecamera. Una classe che vedevi sulla timeline ma non potevi spuntare nel filtro era l\u2019hub che descriveva la telecamera da uno stato momentaneo; il viewer non nasconde pi\xf9 ci\xf2 che sta mostrando.']}},{version:'1.0.483',date:'2026-09-10',notes:{en:['On a tablet, turning from portrait to landscape puts the timeline back beside the picture. The app was reading its window size from a notification that sometimes arrived seconds late, or not at all, so it kept laying out for portrait inside a landscape screen until you killed it. It now reads the size of the view you are actually looking at.','The camera reel under the player refreshes in turns instead of all at once. Every card used to ask the hub for a new frame in the same second, every fifteen seconds \u2014 thirty captures in a burst, and the slow cameras never made it in time. Now a quarter of the reel takes its turn on each poll, so each card refreshes about every twenty seconds and the hub is never asked for thirty frames at once.'],it:['Su tablet, ruotando da verticale a orizzontale la timeline torna accanto all\u2019immagine. L\u2019app leggeva la dimensione della finestra da una notifica che a volte arrivava con secondi di ritardo, o mai, e continuava a impaginare in verticale dentro uno schermo orizzontale finch\xe9 non la chiudevi. Ora legge la dimensione della vista che stai davvero guardando.','Il nastro delle telecamere sotto il player si aggiorna a turni invece che tutto insieme. Ogni scheda chiedeva all\u2019hub un frame nuovo nello stesso secondo, ogni quindici secondi \u2014 trenta catture in raffica, e le telecamere lente non facevano mai in tempo. Ora a ogni giro tocca a un quarto del nastro, cos\xec ogni scheda si aggiorna circa ogni venti secondi e all\u2019hub non vengono mai chiesti trenta frame in una volta.']}},{version:'1.0.482',date:'2026-09-10',notes:{en:['When assigning a face fails, it now says why. The failure was caught and thrown away in eight different places \u2014 you saw "could not assign a face" and there was nothing, anywhere, to explain it. The reason is now recorded and reaches the hub, including the case where the server answers but assigns nothing.','The app also stopped narrating itself. Four routine messages \u2014 one per camera tile, several times each \u2014 were more than half of everything it sent to the hub. They are still there in debug mode; what stays are the lines that report something going wrong.'],it:['Quando assegnare una faccia fallisce, ora dice perch\xe9. L\u2019errore veniva catturato e buttato via in otto punti diversi \u2014 tu vedevi \u201cimpossibile assegnare una faccia\u201d e non c\u2019era nulla, da nessuna parte, che lo spiegasse. Ora il motivo viene registrato e arriva all\u2019hub, compreso il caso in cui il server risponde ma non assegna niente.','L\u2019app ha anche smesso di raccontarsi. Quattro messaggi di routine \u2014 uno per riquadro di telecamera, pi\xf9 volte ciascuno \u2014 erano pi\xf9 della met\xe0 di tutto ci\xf2 che spediva all\u2019hub. Restano in modalit\xe0 debug; quel che resta sempre sono le righe che segnalano qualcosa che non va.']}},{version:'1.0.481',date:'2026-09-10',notes:{en:['Assigning faces no longer freezes the page. "Apply suggestions" writes one group per person, and each group used to wait for the whole gallery to be re-read before the next one started \u2014 six people meant dozens of round trips before you got the screen back. The gallery is now re-read once, when the last group is written. Assigning one face at a time waits only for the card you are looking at.','Scrubbing the timeline had a pulse every 80 ms \u2014 twelve a second, which is a buzz and not detents. It is now paced to feel like clicks, and dragging is lighter for it.'],it:['Assegnare le facce non blocca pi\xf9 la pagina. "Applica suggerimenti" scrive un gruppo per persona, e ogni gruppo aspettava che l\u2019intera galleria fosse riletta prima che partisse il successivo \u2014 sei persone significavano decine di andate e ritorni prima di riavere lo schermo. Ora la galleria si rilegge una volta sola, quando l\u2019ultimo gruppo \xe8 scritto. Assegnando una faccia per volta si aspetta soltanto la scheda che stai guardando.','Lo scrub della timeline aveva una vibrazione ogni 80 ms \u2014 dodici al secondo, che \xe8 un ronzio e non degli scatti. Ora \xe8 cadenzata per sembrare clic, e trascinare \xe8 pi\xf9 leggero.']}},{version:'1.0.480',date:'2026-09-10',notes:{en:['The timeline\u2019s audio bar shows the LEVEL now. It was showing how MANY audio events fell in each slot, painted on the same six-rung meter the live view uses for decibels \u2014 so fifty short clicks in a quiet hour lit every rung, whatever their volume. The hub now works out the average loudness of each slot and the bar draws that: a busy quiet hour reads quiet, one door slam reads loud. A slot with no audio at all draws nothing, because \u201cnothing was heard\u201d and \u201cnothing was measured\u201d are not the same thing.','A gesture that fails no longer takes the app down with it. The joystick and the pinch-zoom ran code that, if it threw, closed the app outright \u2014 three crash reports came from exactly that. Now the gesture is simply dropped and the reason is sent back, so the next one can be fixed instead of guessed at.'],it:['La barra audio della timeline mostra finalmente il LIVELLO. Prima mostrava QUANTI eventi audio cadevano in ogni fascia, disegnati sullo stesso misuratore a sei tacche che la vista live usa per i decibel \u2014 cos\xec cinquanta clic brevi in un\u2019ora tranquilla accendevano tutte le tacche, qualunque fosse il volume. Ora l\u2019hub calcola la rumorosit\xe0 media di ogni fascia e la barra disegna quella: un\u2019ora tranquilla ma affollata resta bassa, una porta sbattuta si vede. Una fascia senza audio non disegna nulla, perch\xe9 \u201cnon si \xe8 sentito niente\u201d e \u201cnessuno ha misurato\u201d non sono la stessa cosa.','Un gesto che va in errore non porta pi\xf9 gi\xf9 l\u2019app. Il joystick e lo zoom a pinch eseguivano codice che, se falliva, chiudeva l\u2019app di netto \u2014 tre segnalazioni di crash venivano esattamente da l\xec. Ora il gesto viene semplicemente ignorato e il motivo viene rimandato indietro, cos\xec il prossimo si corregge invece di indovinarlo.']}},{version:'1.0.479',date:'2026-09-09',notes:{en:['Pinch-zoom, second attempt. Yesterday\u2019s fix stopped the box resizing under your fingers, and that turned out to be the wrong half: with the panel set to grow, the picture kept zooming and sliding for a third of a second AFTER you let go \u2014 worst at full zoom, where all of the growth was still pending. The panel now grows under your fingers again, but the player\u2019s own frame never moves: the growth is folded into the zoom itself. Turn on debug mode and a pinch now writes one trace line you can send back.','The app also says far less to the hub: two diagnostics were 72% of everything it shipped \u2014 one of them logged every camera tile twice more just for sitting still while its snapshot aged.'],it:['Zoom a pinch, secondo tentativo. La correzione di ieri ha tolto il riquadro che si ridimensionava sotto le dita, e si \xe8 rivelata la met\xe0 sbagliata: col pannello impostato per crescere, l\u2019immagine continuava a zoomare e scivolare per un terzo di secondo DOPO che avevi lasciato \u2014 peggio al massimo, dove restava pendente tutta la crescita. Ora il pannello cresce di nuovo sotto le dita, ma il frame del player non si muove mai: la crescita \xe8 piegata dentro lo zoom stesso. Con la modalit\xe0 debug accesa, una pinch scrive una riga di traccia da rimandare indietro.','L\u2019app dice anche molto meno all\u2019hub: due diagnostiche facevano il 72% di tutto ci\xf2 che spediva \u2014 una di queste rilogga ogni tessera due volte solo per essere rimasta ferma mentre lo snapshot invecchiava.']}},{version:'1.0.478',date:'2026-09-09',notes:{en:['Pinch-zoom on the live view is smooth again. The picture box no longer resizes under your fingers frame by frame \u2014 it settles once, after you let go \u2014 the pan no longer springs back at the end of a gesture, and the double tap now runs on the UI thread instead of queueing behind the screen. The gesture feels slightly different on purpose: the panel grows after the pinch, not during it.'],it:['Lo zoom a pinch sulla vista live \xe8 di nuovo fluido. Il riquadro dell\u2019immagine non si ridimensiona pi\xf9 sotto le dita frame per frame \u2014 si assesta una volta sola, dopo che hai lasciato \u2014 la panoramica non torna pi\xf9 indietro a fine gesto, e il doppio tap gira sul thread della UI invece di accodarsi dietro allo schermo. Il gesto si sente un po\u2019 diverso di proposito: il pannello cresce dopo la pinch, non durante.']}},{version:'1.0.477',date:'2026-09-08',notes:{en:['The debug note\u2019s preset reasons now come from the notes actually written, not from guesswork: \u201ctrack started late\u201d leads, the thumbnail entry is reworded as \u201ca better frame existed (face/plate)\u201d \u2014 which is what gets typed by hand every time \u2014 and three reasons that were being typed out are now checkboxes: last frame before the first, two subjects in one track, and a two-wheeler whose rider is outside the keyframe.'],it:['Le ragioni preset della nota di debug ora vengono dalle note davvero scritte, non da supposizioni: \u201ctraccia partita in ritardo\u201d \xe8 la prima, la voce sulla miniatura diventa \u201cc\u2019era un frame migliore (volto/targa)\u201d \u2014 che \xe8 quello che viene digitato ogni volta \u2014 e tre ragioni che venivano scritte a mano sono ora caselle: ultimo frame prima del primo, due soggetti nella stessa traccia, e il conducente di un due ruote fuori dal keyframe.']}},{version:'1.0.476',date:'2026-09-08',notes:{en:['Closing the keyboard in the note dialog is the keyboard\u2019s own button now: on iOS a Done bar sits docked to it, drawn by the system above the keys, instead of a button crowding the card.'],it:['Chiudere la tastiera nel dialogo della nota ora \xe8 un pulsante della tastiera stessa: su iOS una barra Fatto le sta agganciata, disegnata dal sistema sopra i tasti, invece di un pulsante che toglie spazio alla scheda.']}},{version:'1.0.475',date:'2026-09-08',notes:{en:['The note dialog was a trap with the keyboard up: its buttons sat behind it, a multiline field has no return key, and tapping outside threw the note away. The card now lifts above the keyboard, a tap outside closes the keyboard first, and there is a Close keyboard button while it is open.'],it:['Il dialogo della nota era una trappola con la tastiera aperta: i pulsanti restavano dietro, un campo multiriga non ha tasto invio, e toccare fuori buttava via la nota. Ora la scheda si solleva sopra la tastiera, un tocco fuori chiude prima la tastiera, e c\u2019\xe8 un pulsante Chiudi tastiera finch\xe9 \xe8 aperta.']}},{version:'1.0.474',date:'2026-09-08',notes:{en:['On a Mac the player still opened the embed page in a browser: the WebView declines that load without reporting an error, so the previous fallback had nothing to react to. The player now watches for silence \u2014 if the bundled page has not spoken within six seconds, it loads the same page from the hub.'],it:['Su Mac il player apriva ancora la pagina dell\u2019embed nel browser: la WebView rifiuta quel caricamento senza segnalare alcun errore, quindi il fallback precedente non aveva nulla a cui reagire. Ora il player sorveglia il silenzio \u2014 se la pagina inclusa non ha parlato entro sei secondi, carica la stessa pagina dall\u2019hub.']}},{version:'1.0.473',date:'2026-09-08',notes:{en:['A sample whose picture is gone now says so, instead of drawing an empty square. Most of the gallery is in that state today \u2014 the crops were lost before the panel existed \u2014 and the scores beside them are unaffected: they come from the stored vector, which is intact.'],it:['Un campione la cui immagine non c\u2019\xe8 pi\xf9 ora lo dice, invece di disegnare un quadrato vuoto. Oggi gran parte della galleria \xe8 in quello stato \u2014 i ritagli erano gi\xe0 andati persi prima che il pannello esistesse \u2014 e i punteggi accanto non ne risentono: vengono dal vettore memorizzato, che \xe8 intatto.']}},{version:'1.0.472',date:'2026-09-08',notes:{en:['Library \u2192 Review can re-analyse one person\u2019s enrolled samples. Worst first, each with its crop and the reason \u2014 \u201clooks like Matthias (61%) more than like this person (12%)\u201d \u2014 and a sample is flagged only when it could actually be auto-assigned to the other person. Remove is one tap, and nothing is removed for you.'],it:['Libreria \u2192 Revisione pu\xf2 rianalizzare i campioni di una persona. Peggiori in cima, ognuno col suo ritaglio e il motivo \u2014 \u201csomiglia a Matthias (61%) pi\xf9 che a questa persona (12%)\u201d \u2014 e un campione \xe8 segnalato solo se potrebbe davvero essere auto-assegnato all\u2019altra persona. Rimuovere \xe8 un tocco, e nessuno rimuove niente al posto tuo.']}},{version:'1.0.471',date:'2026-09-08',notes:{en:['Opening the Cameras page now refreshes every camera\u2019s thumbnail, two at a time, once \u2014 so the tiles below the fold are minutes old instead of hours. It stops when it has been round the list.','What\u2019s new is a panel now, not a one-line dialog: the build that just arrived is at the top, and every earlier update is listed under it by version and date, tap to open. Settings \u2192 Info opens the same panel.'],it:['Aprendo la pagina Telecamere ora si aggiorna la miniatura di ogni camera, due alla volta, una sola volta \u2014 cos\xec i riquadri sotto la piega sono vecchi di minuti e non di ore. Finito il giro, si ferma.','Le novit\xe0 sono un pannello, non pi\xf9 un avviso a una riga: in alto la build appena arrivata, sotto l\u2019elenco di tutti gli aggiornamenti precedenti per versione e data, che si aprono al tocco. Impostazioni \u2192 Info apre lo stesso pannello.']}},{version:'1.0.470',date:'2026-09-08',notes:{en:['The debug checkboxes changed with use: an edge crop that came back mirrored, and a box that does not match the path the track drew \u2014 which usually means two subjects ended up sharing one id. "Wrong class" and "audio-only" left; neither was what anyone was actually reporting.'],it:['Le caselle di debug sono cambiate con l\u2019uso: un ritaglio sul bordo tornato specchiato, e un box che non coincide col percorso disegnato dalla traccia \u2014 che di solito significa due soggetti finiti sullo stesso id. Sono uscite "classe sbagliata" e "solo audio": non era quello che si segnalava davvero.']}},{version:'1.0.469',date:'2026-09-08',notes:{en:['Marking an event for debug now offers the questions that keep coming back as checkboxes, so a mark carries a question without typing one. Ticking one writes its phrase into the note; the field below still takes anything the boxes cannot say.'],it:['Marcando un evento per il debug ora trovi come caselle le domande che ricorrono, cos\xec una marcatura porta con s\xe9 una domanda senza doverla scrivere. Spuntarne una scrive la sua frase nella nota; il campo sotto accetta ancora tutto ci\xf2 che le caselle non dicono.']}},{version:'1.0.468',date:'2026-09-08',notes:{en:['The privacy-mask switch now says what is actually missing: no privacy zone is drawn on the camera. It used to give the same general "nothing is set up yet" sentence as every other control, which left no next step \u2014 and the next step is on the camera, not in this app.'],it:["L'interruttore della maschera privacy ora dice cosa manca davvero: sulla telecamera non \xe8 disegnata nessuna zona di privacy. Prima dava la stessa frase generica di ogni altro controllo, che non indicava alcun passo successivo \u2014 e il passo successivo \xe8 sulla telecamera, non in questa app."]}},{version:'1.0.467',date:'2026-09-08',notes:{en:['Unticking every event kind used to leave invisible leftovers behind, so the list stayed empty and the counters disagreed with the boxes. The leftovers are cleared, and no ticks now means no constraint.','Ticking only Faces or Plates therefore works on its own, across every kind, while narrowing them with a kind still works as before.','A collapsed group now shows a partial mark when something inside it is ticked, so nothing can be on where you cannot see it.'],it:["Togliendo la spunta a tutti i tipi di evento restavano dietro dei residui invisibili, cos\xec la lista restava vuota e i contatori non coincidevano con le caselle. I residui vengono ripuliti, e nessuna spunta adesso vuol dire nessun vincolo.","Spuntare solo Volti o Targhe funziona quindi da solo, su tutti i tipi, mentre restringerli a un tipo continua a funzionare come prima.","Un gruppo chiuso mostra adesso un segno parziale quando qualcosa al suo interno \xe8 spuntato, cos\xec niente pu\xf2 essere attivo dove non lo vedi."]}},{version:'1.0.466',date:'2026-09-08',notes:{en:['A filter that matched nothing on the first page used to stop the list from loading any further, so a narrow choice looked empty even when matches existed further back. The list now keeps reading until it finds them.','Plates were the clearest case: they sat four pages deep and were never reached. Faces happened to match early, which is why the same defect looked intermittent.','An empty list now says which kind of empty it is, and offers to load older events instead of ending the road.'],it:["Un filtro che non trovava nulla nella prima pagina impediva alla lista di caricare oltre, cos\xec una scelta stretta sembrava vuota anche quando i risultati c'erano pi\xf9 indietro. Adesso la lista continua a leggere finch\xe9 li trova.","Le targhe erano il caso pi\xf9 evidente: stavano quattro pagine pi\xf9 in l\xe0 e non venivano mai raggiunte. I volti capitavano presto, ed \xe8 per questo che lo stesso difetto sembrava intermittente.","Una lista vuota adesso dice di che vuoto si tratta, e propone di caricare gli eventi pi\xf9 vecchi invece di finire l\xec."]}},{version:'1.0.465',date:'2026-09-08',notes:{en:['The event kinds you already had \u2014 Audio, Sensor, Control \u2014 now actually filter. Ticking one shows those events, unticking hides them; there is no second filter to find, because the tree you were already using is the one that works.','Audio events start unticked, so the list opens on what you look at. A Default button puts the preset back without re-ticking everything by hand.','The chip counts what you kept in the terms you picked it in, so a default that hides one thing reads as one thing hidden.'],it:["I tipi di evento che avevi gi\xe0 \u2014 Audio, Sensore, Controllo \u2014 adesso filtrano davvero. Spuntandone uno vedi quegli eventi, togliendo la spunta li nascondi, e non c'\xe8 un secondo filtro da cercare: quello che usavi \xe8 quello che funziona.","Gli eventi audio partono senza spunta, cos\xec la lista si apre su quello che guardi. Un pulsante Predefinito rimette il preset senza dover rispuntare tutto a mano.","Il contatore conta quello che hai tenuto nei termini in cui l'hai scelto, cos\xec un default che nasconde una cosa si legge come una cosa nascosta."]}},{version:'1.0.464',date:'2026-09-07',notes:{en:['The events page can now filter by where an event came from, and audio-only events start hidden. The filter sits in More with the others, and the chip counts it, so a shorter list always says why it is shorter.','Picking a class used to drag every sensor and audio event along with it, and picking a sensor selected nothing at all. Provenance is now its own axis, so both do what they say.','The Recent strip on the Cameras screen has its own filter, in the same fan menu, showing detections by default and remembering what you choose.'],it:["La pagina eventi ora filtra anche per provenienza, e gli eventi di solo audio partono nascosti. Il filtro sta in Altro insieme agli altri e il contatore lo conta, cos\xec una lista pi\xf9 corta dice sempre perch\xe9 lo \xe8.","Scegliere una classe si portava dietro ogni evento di sensore e di audio, e scegliere un sensore non selezionava nulla. La provenienza adesso \xe8 un asse suo, quindi entrambi fanno quello che dicono.","La striscia Recenti nella schermata Camere ha un filtro suo, nello stesso menu a ventaglio, che di default mostra le rilevazioni e ricorda quello che scegli."]}},{version:'1.0.463',date:'2026-09-07',notes:{en:['One record button, the same pair of buttons everywhere: press it, then Keep \u2014 with the duration on it \u2014 or Discard. On the live picture it records forward from now; on the recording it anchors a period you draw with the scrub, in either direction.','Pressing it during playback no longer reports that the live view cannot be recorded, and the period you draw stops at the live edge instead of losing itself there.','While you are drawing a period the timeline no longer buzzes at every step: the notch feedback belongs to looking for an event, not to choosing a moment.'],it:["Un solo pulsante di registrazione, e la stessa coppia di pulsanti ovunque: premi, poi Salva \u2014 con la durata sopra \u2014 oppure Scarta. Sull'immagine live registra da adesso in avanti; sul registrato fissa un periodo che disegni con lo scorrimento, in entrambe le direzioni.","Premendolo durante la riproduzione non dice pi\xf9 che non pu\xf2 registrare la vista live, e il periodo che stai disegnando si ferma al bordo live invece di perdersi.","Mentre disegni un periodo la timeline non vibra pi\xf9 a ogni passo: lo scatto delle tacche serve a cercare un evento, non a scegliere un momento."]}},{version:'1.0.462',date:'2026-09-07',notes:{en:['Save a stretch of the recording from the timeline: press the record button during playback to anchor the period, scrub to the other end, then Save or Discard. The selected period is highlighted on the strip.','While you are choosing, the recording does not play \u2014 you see the frame you scrubbed to. Nothing is created on the hub until you press Save, and a period that crosses a stretch with no recording says so before it is exported.'],it:["Salva un tratto di registrato dalla timeline: durante la riproduzione premi il pulsante di registrazione per fissare il periodo, scorri fino all'altro estremo, poi Salva o Scarta. Il periodo selezionato \xe8 evidenziato sulla striscia.","Mentre scegli la registrazione non parte: vedi il fotogramma su cui ti sei fermato. Sull'hub non viene creato nulla finch\xe9 non premi Salva, e un periodo che attraversa un tratto senza registrazione lo dice prima di esportare."]}},{version:'1.0.461',date:'2026-09-07',notes:{en:['A host with nowhere to show a tile\'s linked-devices and view-options panels can now say so, and the embed stops drawing two buttons that would do nothing.'],it:["Un ospite che non ha dove mostrare i pannelli dispositivi collegati e opzioni di vista pu\xf2 dirlo, e l'embed smette di disegnare due pulsanti che non farebbero nulla."]}},{version:'1.0.460',date:'2026-09-06',notes:{en:['Battery and signal icons are now buttons: tapping one opens the figures \u2014 charge, power source, sleeping, link type, signal and Wi-Fi network \u2014 on the stream and in the cameras list.','What the camera does not report is said in words, never as a fabricated 0%.'],it:["Le icone di batteria e segnale sono diventate pulsanti: toccandone una si aprono i numeri \u2014 carica, alimentazione, sospensione, tipo di collegamento, segnale e rete Wi-Fi \u2014 sullo stream e nella lista camere.","Ci\xf2 che la camera non riporta viene detto a parole, mai come uno 0% inventato."]}},{version:'1.0.459',date:'2026-09-06',notes:{en:['Home Assistant cards: the embed no longer needs a viewing token in the page \u2014 Home Assistant carries it, and the events card URL stops carrying a credential.'],it:["Card di Home Assistant: l'embed non ha pi\xf9 bisogno del token nella pagina, lo porta Home Assistant, e l'URL della card eventi smette di trasportare una credenziale."]}},{version:'1.0.458',date:'2026-09-06',notes:{en:['Robot camera in landscape: with the timeline open the drive buttons move onto the visible picture and shrink to fit; the "\u2026" is gone there, the timeline has its own.'],it:['Camera del robot in landscape: con la timeline aperta i pulsanti di guida passano sul video visibile e si rimpiccioliscono; l\xec sparisce il "\u2026", la timeline ha gi\xe0 il suo.']}},{version:'1.0.457',date:'2026-09-06',notes:{en:['A restart for an update waits for the snapshot downloads in flight \u2014 the crash right after an update on build 16.'],it:['Il riavvio per un aggiornamento aspetta i download degli snapshot in corso: il crash subito dopo un aggiornamento sulla build 16.']}},{version:'1.0.456',date:'2026-09-06',notes:{en:['An OTA update asks before restarting the app.','A newer TestFlight / store build is announced, with a button to open it.',"What's new: these notes, once per version and in Settings \u2192 Info."],it:["Un aggiornamento OTA chiede conferma prima di riavviare l'app.",'Una build TestFlight / Store pi\xf9 recente viene segnalata, con il pulsante per aprirla.','Novit\xe0: queste note, una volta per versione e in Impostazioni \u2192 Info.']}},{version:'1.0.455',date:'2026-09-06',notes:{en:['Robot camera: a drive joystick in landscape, with Stop, light, Follow me and Return to dock.','The controls button opens for robot cameras too.','Battery and signal are glyphs in the toolbar; the day arrows fold on a narrow row.','A sleeping camera shows the moon in its name chip.'],it:['Camera del robot: joystick di guida in landscape, con Stop, luce, Seguimi e Torna alla base.','Il pulsante dei controlli si apre anche per le camere del robot.','Batteria e segnale sono glifi nella toolbar; le frecce del giorno si ripiegano su riga stretta.','Una camera dormiente mostra la luna nel chip del nome.']}}];function o(o){return o?e.find(e=>e.version===o)??null:null}},2205,[]);
|
|
4105
|
+
__d(function(g,r,i,a,m,_e,d){"use strict";Object.defineProperty(_e,'__esModule',{value:!0}),Object.defineProperty(_e,"WHATS_NEW",{enumerable:!0,get:function(){return e}}),_e.whatsNewHistory=function(n){const t=o(n);return{latest:t,past:e.filter(e=>e!==t)}},_e.whatsNewFor=o,_e.whatsNewLines=function(e,o){const n=o.toLowerCase().startsWith('it')?'it':'en',t=e.notes[n];return t.length>0?t:e.notes.en},_e.shouldShowWhatsNew=function(e,n){return!!n&&(e!==n&&null!==o(n))};const e=[{version:'1.0.572',date:'2026-10-02',notes:{en:['Alarm: pick a mode at the top; each mode is one short summary, its delays and its sensors sorted by name.'],it:['Allarme: scegli la modalit\xe0 in alto; ogni modalit\xe0 mostra un riepilogo breve, i suoi ritardi e i sensori in ordine di nome.']}},{version:'1.0.571',date:'2026-10-02',notes:{en:['Alarm: each mode lists only the sensors its rules cover, in the same table, rows and fields as the rest of the app.'],it:["Allarme: ogni modalit\xe0 elenca solo i sensori coperti dalle sue regole, con la stessa tabella, righe e campi del resto dell'app."]}},{version:'1.0.570',date:'2026-10-02',notes:{en:['Alarm: exit, entry and siren delays can be set per arm mode (unset modes keep the default).','Alarm: each mode lists its sensors in a table with their state and a switch to stop a sensor from blocking the arm.','Device picker: filter by device type, area and location, with a button to reset the filters.'],it:['Allarme: i ritardi di uscita, ingresso e sirena si impostano per modalit\xe0 (senza valore vale il default).','Allarme: ogni modalit\xe0 elenca i sensori in una tabella con lo stato e uno switch per non bloccare l\'inserimento.','Selezione dispositivi: filtri per tipo, area e posizione, con un pulsante per azzerarli.']}},{version:'1.0.569',date:'2026-10-01',notes:{en:['A scheduled system summary can be sent as one notification per category (offline devices, batteries, consumables, ...).','Testing a summary rule now sends the current summary.'],it:['Il riepilogo programmato di sistema pu\xf2 arrivare come una notifica per categoria (dispositivi offline, batterie, consumabili, ...).','Il test di una regola di riepilogo ora invia il riepilogo attuale.']}},{version:'1.0.568',date:'2026-10-01',notes:{en:['Deleting a rule asks for confirmation in the standard dialog.'],it:["L'eliminazione di una regola chiede conferma con la finestra standard."]}},{version:'1.0.567',date:'2026-10-01',notes:{en:['A person who steps out of frame for a few seconds stays the same track.','A track fused into another still opens from its old link.','Rule editor: the Advanced section is unified across rule kinds.','Cooldown defaults to separate windows per class.','Sensor rules attach one snapshot, not a choice of media.','The device picker lists only devices the rule kind can target.'],it:["Una persona che esce dall'inquadratura per pochi secondi resta la stessa traccia.","Una traccia fusa in un'altra si apre ancora dal suo vecchio collegamento.",'Editor regole: la sezione Avanzate \xe8 unificata per ogni tipo di regola.','Il cooldown usa di default finestre separate per classe.',"Le regole sui sensori allegano un'unica foto, senza scelta del media.",'Il selettore dispositivi mostra solo quelli compatibili con la regola.']}},{version:'1.0.566',date:'2026-10-01',notes:{en:['Rules are sorted by name, and tapping anywhere on a rule opens it.','A Snooze switch on each rule silences it for 30 minutes.','Deleting a rule asks for confirmation right on the button.','Rule conditions are all shown; source and zone crossing moved to Advanced.','Faces, zones and labels use the same Only / All except picker as classes.','Zones are listed as "camera:zone", from every camera.','Zone crossing: Entering, Leaving or Either \u2014 Entering by default.','New detection rules watch the pipeline; sounds are no longer offered as classes.','Device and scene states are shown as readable words.'],it:['Le regole sono ordinate per nome e un tocco ovunque sulla regola la apre.','Un interruttore Silenzia su ogni regola la silenzia per 30 minuti.','Eliminare una regola chiede conferma direttamente sul pulsante.','Le condizioni sono tutte visibili; sorgente e attraversamento zona sono in Avanzate.','Volti, zone ed etichette usano lo stesso selettore delle classi.','Le zone sono elencate come "camera:zona", da tutte le camere.','Attraversamento zona: In entrata, In uscita o Entrambe \u2014 In entrata di default.','Le nuove regole di rilevamento usano la pipeline; i suoni non sono pi\xf9 tra le classi.','Gli stati di dispositivi e scene sono mostrati in parole leggibili.']}},{version:'1.0.565',date:'2026-09-29',notes:{en:['The "Groups" view is gone from the timeline, Events and the Recent reel: they always list subjects now.','Summary rules no longer offer "one line is a group"; a rule that had it now lists subjects.'],it:['La vista \xabGruppi\xbb \xe8 stata rimossa da timeline, Eventi e striscia Recenti: ora mostrano sempre i soggetti.','Le regole di riepilogo non offrono pi\xf9 \xabuna riga \xe8 un gruppo\xbb; una regola che lo usava ora elenca i soggetti.']}},{version:'1.0.564',date:'2026-09-26',notes:{en:['Device and system rules can send a scheduled summary instead of one notification per event.','Summary rules show their send times in the list, e.g. "Summary \xb7 daily 08:00".','Semantic search in Events uses the server\'s own score threshold unless you set one.','On a server that does not support summaries yet, the app says the rule stayed instant and keeps its active hours.'],it:['Le regole dei dispositivi e di sistema possono inviare un riepilogo pianificato invece di una notifica per evento.','Le regole di riepilogo mostrano gli orari di invio nell\'elenco, ad es. "Riepilogo \xb7 ogni giorno 08:00".','La ricerca semantica negli Eventi usa la soglia di punteggio del server, salvo che tu ne imposti una.','Su un server che non supporta ancora i riepiloghi, l\'app avvisa che la regola \xe8 rimasta immediata e ne conserva le fasce orarie.']}},{version:'1.0.563',date:'2026-09-26',notes:{en:['Sensor rules now pick from your sensors, not cameras.',"A rule's overview lists the devices it is active on.",'Selected devices are always all shown, with no "show more".','The "off" note is gone where the switch already says it.'],it:['Le regole dei sensori ora scelgono tra i sensori, non tra le camere.','La panoramica di una regola elenca i dispositivi su cui \xe8 attiva.','I dispositivi selezionati sono sempre tutti visibili, senza "mostra altri".','Niente pi\xf9 scritta "disattivata" dove c\'\xe8 gi\xe0 l\'interruttore.']}},{version:'1.0.562',date:'2026-09-26',notes:{en:['Device rules can set their own consumable threshold (1\u201395 %).','Robot vacuum tank alerts: tank low, tank full, back to normal.'],it:['Le regole dei dispositivi possono avere una propria soglia dei consumabili (1\u201395 %).','Avvisi dei serbatoi del robot: serbatoio basso, pieno, tornato normale.']}},{version:'1.0.561',date:'2026-09-26',notes:{en:['Rules: pick All, Only these or All except these for devices and classes, with a smarter class picker.','Sensor rules can notify only when a sensor triggers, or only when it clears.','Each rule shows its last run; tap it for the delivery history (admins).','Rule cards keep the name readable, with the switch, Edit and Delete on one row.','The device picker groups by zone, location or not at all.'],it:['Regole: scegli Tutti, Solo questi o Tutti tranne questi per dispositivi e classi, con un selettore classi migliore.','Le regole dei sensori possono notificare solo quando il sensore scatta, o solo quando rientra.',"Ogni regola mostra l'ultima esecuzione; toccala per lo storico degli invii (admin).",'Le schede delle regole mostrano sempre il nome, con interruttore, Modifica ed Elimina su una riga.','Il selettore dispositivi raggruppa per zona, posizione o nessuno.']}},{version:'1.0.560',date:'2026-09-26',notes:{en:['System alerts are now three rule kinds: device events, system and alarm, each with its own settings.','System rules pick nodes and packages from a list instead of typed names.','A rule that mixes families is shown read-only, marked to recreate.'],it:['Gli avvisi di sistema sono ora tre tipi di regola: eventi dispositivi, sistema e allarme.','Le regole di sistema scelgono nodi e pacchetti da un elenco, non pi\xf9 a testo libero.','Una regola che mescola famiglie \xe8 in sola lettura, segnata da ricreare.']}},{version:'1.0.559',date:'2026-09-26',notes:{en:['Sensor rules can send one mosaic of every linked camera, or one picture per camera.','Clip thumbnails load one at a time per camera and no longer hammer it with retries.','PTZ Home is greyed out when the camera has no home position set.'],it:['Le regole dei sensori inviano un mosaico di tutte le camere collegate, o una foto per camera.','Le anteprime delle clip arrivano una alla volta per camera, senza raffiche di tentativi.','Il tasto PTZ "posizione iniziale" \xe8 disattivato se la camera non ne ha una impostata.']}},{version:'1.0.558',date:'2026-09-25',notes:{en:['Live quality now climbs on a good connection instead of staying stuck on low.','Rules for batteries and consumables have their own section.','System-event rules can exclude devices.','A new compact device picker, with search and groups.',"The alarm's non-blocking list offers every door, window and lock."],it:['La qualit\xe0 live ora sale con una buona connessione invece di restare su bassa.','Le regole per batterie e consumabili hanno una sezione dedicata.','Le regole sugli eventi di sistema possono escludere dispositivi.','Un nuovo selettore di dispositivi compatto, con ricerca e gruppi.',"La lista non bloccante dell'allarme propone ogni porta, finestra e serratura."]}},{version:'1.0.557',date:'2026-09-25',notes:{en:['Rules are edited per kind, on their own screens, like the admin UI.','Text fields offer the placeholders of that rule: tap to insert, with a live preview.','Timelapse and summary rules expose every field; admins can test a rule from the phone.','A device that no longer exists shows as "removed" and can be deselected.','Alarm: every mode, what is open when arming is refused, and Arm anyway for admins.','Disarm is always available, and admins can configure the alarm from the phone.'],it:['Le regole si modificano per tipo, su schermate dedicate, come nell\'admin UI.','I campi di testo propongono i segnaposto della regola: tocca per inserire, con anteprima.','Timelapse e riepiloghi hanno tutti i campi; gli admin possono provare una regola dal telefono.','Un dispositivo che non esiste pi\xf9 appare come "rimosso" e si pu\xf2 togliere.','Allarme: tutte le modalit\xe0, cosa \xe8 aperto quando \xe8 rifiutato, e Arma comunque per gli admin.','Disarma \xe8 sempre disponibile, e gli admin configurano l\'allarme dal telefono.']}},{version:'1.0.556',date:'2026-09-24',notes:{en:['A camera function with a warning now shows whether it is ON \u2014 the privacy mask could never look enabled.'],it:['Una funzione con un avviso ora mostra se \xe8 ACCESA: la privacy mask non poteva mai sembrarlo.']}},{version:'1.0.555',date:'2026-09-24',notes:{en:['A shutter on its way up or down makes the button you pressed pulse.'],it:['Una tapparella che sta salendo o scendendo fa pulsare il tasto che hai premuto.']}},{version:'1.0.554',date:'2026-09-24',notes:{en:['Closing clip mode returns to the recording at the moment the clip was at.','The privacy-mask switch no longer looks locked when the camera has no zone drawn.'],it:['Chiudendo la modalit\xe0 clip si torna alla registrazione nel punto in cui era la clip.',"L'interruttore della privacy mask non sembra pi\xf9 bloccato quando la camera non ha zone disegnate."]}},{version:'1.0.553',date:'2026-09-24',notes:{en:['Recordings read the source each camera is set to, and you can pick it per camera.','The camera reel says it is loading instead of looking like you own one camera.'],it:['Le registrazioni leggono la sorgente impostata per ogni camera, e la scegli tu camera per camera.','La striscia delle camere dice che sta caricando, invece di sembrare che ne hai una sola.']}},{version:'1.0.552',date:'2026-09-24',notes:{en:['A clip the camera cut short now says so, with how much arrived.'],it:['Una clip che la camera ha troncato ora lo dice, e quanto ne \xe8 arrivato.']}},{version:'1.0.551',date:'2026-09-24',notes:{en:['A clip silent because of the speed now says so, on the speaker.','Recorded playback reaches 8\xd7.'],it:['Una clip muta per via della velocit\xe0 ora lo dice, sull\u2019altoparlante.','La riproduzione delle registrazioni arriva a 8\xd7.']}},{version:'1.0.550',date:'2026-09-23',notes:{en:['Renaming a linked device is a field in the row now, and no longer hangs the app.'],it:['Rinominare un dispositivo collegato si fa nella riga, e non blocca pi\xf9 l\u2019app.']}},{version:'1.0.549',date:'2026-09-23',notes:{en:['Turning the sound back on now really turns it back on, clips included.'],it:['Riaccendere l\u2019audio ora lo riaccende davvero, clip comprese.']}},{version:'1.0.548',date:'2026-09-23',notes:{en:['In a linked device\u2019s edit mode, the name now looks tappable \u2014 it always was.'],it:['Nella modifica di un dispositivo collegato il nome ora si vede che si tocca.']}},{version:'1.0.547',date:'2026-09-23',notes:{en:['A clip now repeats when it ends. There is a loop switch beside the transport.','A clip that simply finished no longer looks like a fault.'],it:['Una clip ora si ripete alla fine. L\u2019interruttore \xe8 accanto ai comandi.','Una clip che \xe8 semplicemente finita non sembra pi\xf9 un errore.']}},{version:'1.0.546',date:'2026-09-23',notes:{en:['Tapping a clip brings it to the middle of the timeline.','Reolink clips play again \u2014 the camera was being asked with the wrong handle.'],it:['Toccare una clip la porta al centro della linea del tempo.','Le clip Reolink ripartono: chiedevamo alla camera con la maniglia sbagliata.']}},{version:'1.0.545',date:'2026-09-23',notes:{en:['The cursor moves as you drag away from live, not when you let go.','The speed menu lists only the speeds your camera has, with no note.','A camera recorded on events opens on its clips.'],it:['Il cursore si sposta mentre trascini via dal live, non quando lasci.','Il menu velocit\xe0 elenca solo quelle che la camera ha, senza scritte.','Una camera registrata a eventi si apre sulle sue clip.']}},{version:'1.0.544',date:'2026-09-23',notes:{en:['Tapping a clip sends one command to the camera instead of two.'],it:['Toccare una clip manda un comando solo alla camera invece di due.']}},{version:'1.0.543',date:'2026-09-23',notes:{en:['The cursor now slides between its two positions instead of jumping there.','Hikvision clips no longer stop after a few seconds.'],it:['Il cursore ora scivola fra le sue due posizioni invece di saltarci.','Le clip Hikvision non si fermano pi\xf9 dopo qualche secondo.']}},{version:'1.0.542',date:'2026-09-23',notes:{en:['Away from live the cursor sits mid-screen, so a cluster you tap fits on it.','Previous updates are tucked behind one panel, leaving the newest room to breathe.'],it:['Lontano dal live il cursore sta a met\xe0 schermo, cos\xec il cluster che tocchi ci sta tutto.','Gli aggiornamenti precedenti stanno dietro un pannello, e il pi\xf9 recente ha spazio.']}},{version:'1.0.541',date:'2026-09-23',notes:{en:['While a clip plays the timeline stays put: no cursor, and scrolling does nothing.','Scrolling to the top of a clip list no longer jumps you back to live.'],it:['Mentre una clip gira la linea del tempo sta ferma: niente cursore, e scorrere non fa nulla.','Scorrere in cima a una lista di clip non ti riporta pi\xf9 al live.']}},{version:'1.0.540',date:'2026-09-23',notes:{en:['The oldest clips can be scrolled under the cursor again.','The cursor reads the clip on the frame, not a time it is not at.','The timeline follows the clip that is playing; drag it and it lets go.'],it:['Le clip pi\xf9 vecchie si possono di nuovo portare sotto il cursore.','Il cursore legge la clip nel riquadro, non un orario che non le appartiene.','La linea del tempo segue la clip in riproduzione; se la trascini, si sgancia.']}},{version:'1.0.539',date:'2026-09-23',notes:{en:['The timeline follows the clip that is playing, and stops when you drag it.','Speeds a camera cannot really do are greyed out instead of pretending.','Download now asks which quality, and the file lands in your exports.','A clip you have not seen before gets a picture, taken from its middle.','Clips that would not start on the studio and laundry cameras now do.'],it:['La linea del tempo segue la clip in riproduzione e si ferma se la trascini.','Le velocit\xe0 che una telecamera non sa fare sono spente invece di fingere.','Il download ora chiede la qualit\xe0, e il file finisce nelle esportazioni.','Una clip mai vista prima ora ha una foto, presa dal suo centro.','Le clip che non partivano su studio e lavanderia adesso partono.']}},{version:'1.0.538',date:'2026-09-23',notes:{en:['A camera that just woke no longer shows its old sleeping snapshot.','The speed menu opens upward, so it no longer covers the clip track.','Clip controls now offer only what the camera can really do.','Tapping anywhere outside a grid panel closes it.'],it:['Una telecamera appena sveglia non mostra pi\xf9 la vecchia foto di quando dormiva.','Il menu della velocit\xe0 si apre verso l\u2019alto e non copre pi\xf9 la barra della clip.','I comandi delle clip offrono solo ci\xf2 che la telecamera sa fare davvero.','Toccando fuori da un pannello della griglia, il pannello si chiude.']}},{version:'1.0.537',date:'2026-09-22',notes:{en:['A clip tapped while the player is starting now plays, instead of the live view.'],it:['Una clip toccata mentre il player sta partendo adesso parte davvero, invece del live.']}},{version:'1.0.536',date:'2026-09-22',notes:{en:['One devices panel everywhere, with the camera functions under it.','Edit that panel: reorder, rename, re-icon, hide, and add your own devices.','Linked devices are now edited in the admin UI, not here.','The privacy-mask switch works with no zones drawn.','A clip\u2019s progress bar no longer snaps forward when dragged back.','157 icons to choose from, with search.'],it:['Un solo pannello dispositivi ovunque, con sotto le funzioni della telecamera.','Modifica quel pannello: riordina, rinomina, cambia icona, nascondi e aggiungi dispositivi tuoi.','I dispositivi collegati si modificano dall\u2019interfaccia admin, non pi\xf9 da qui.','L\u2019interruttore della maschera privacy funziona anche senza zone disegnate.','La barra di una clip non scatta pi\xf9 in avanti se la trascini indietro.','157 icone fra cui scegliere, con ricerca.']}},{version:'1.0.535',date:'2026-09-22',notes:{en:['Clips start faster. When a camera\u2019s list comes up, the hub now fetches its newest few clips in the background, so the first ones you open are already there \u2014 on a hub camera that was a 6\u20138 s wait per clip, now a fraction of a second. Never on a battery camera that would have to wake for it.','Opening a clip now shows that it is loading: the ring around the play button turns while the file is being fetched and stops when it plays. Before, the frame just sat there until the clip appeared.','The quality badge by the play button now works on the web too. It used to show only in the app.','A live recording in progress stops when you open a clip, and asks whether to keep what it captured. It used to keep recording the clip as if it were the live picture.','Tapping a clip plays the clip. It used to start the live view instead: the command was sent once, at the tap, and the player is created BY that tap \u2014 so it arrived before there was anything to receive it, and what came up was the live edge. Previous/next clip fell in the same hole, which is why they appeared to do nothing.'],it:['Le clip partono pi\xf9 in fretta. Quando compare la lista di una telecamera, l\u2019hub scarica in sottofondo le sue clip pi\xf9 recenti, cos\xec le prime che apri sono gi\xe0 pronte \u2014 su una telecamera dell\u2019hub erano 6\u20138 s di attesa a clip, ora una frazione di secondo. Mai su una telecamera a batteria che dovrebbe svegliarsi per farlo.','Aprire una clip adesso mostra che sta caricando: l\u2019anello attorno al tasto play gira mentre il file viene scaricato e si ferma quando parte. Prima il riquadro restava fermo finch\xe9 la clip non compariva.','Il badge della qualit\xe0 accanto al tasto play adesso funziona anche sul web. Prima compariva solo nell\u2019app.','Una registrazione live in corso si ferma quando apri una clip, e chiede se tenere quanto catturato. Prima continuava a registrare la clip come se fosse il live.','Toccare una clip riproduce la clip. Prima partiva il live: il comando veniva inviato una volta sola, al tocco, e il player nasce PROPRIO da quel tocco \u2014 quindi arrivava prima che ci fosse qualcosa ad ascoltarlo, e a schermo veniva il live. Clip precedente/successiva cadevano nello stesso buco, ed \xe8 per questo che sembravano non fare nulla.']}},{version:'1.0.534',date:'2026-09-22',notes:{en:['A clip in the frame now shows where you are inside it: a position track under the transport, with the file\u2019s real length once the hub has measured it, and a drag along it that seeks inside the clip. While the length is not known yet the track says so instead of pretending the file is empty.','Go live now really leaves the clip \u2014 the frame goes back to the live view (or the poster, on a battery camera). Previous/next still keep you in the list.','Play/pause on a clip is the clip\u2019s own pause. Opened from the live edge, it used to run the live pause instead, which took the player down and the clip with it.','Seeking inside a clip stays inside the clip. A release used to land on the recorder\u2019s footage at a nonsense moment and the file was gone.','A clip in the frame now keeps its controls. Play/pause, speed, frame-step, previous/next clip and Go live are all there \u2014 before, opening a clip took the whole bar away, because the bar was asking whether the picture was live and a clip leaves the session exactly where it was.','A camera whose current day is empty now looks back by itself, up to fourteen days, and says how far it has got. It used to show \u201cNo clips\u201d straight away and only reveal the earlier ones once you dragged the list by hand.','When a source cannot answer, the reason is now printed. The sentence used to arrive with the placeholder still in it.'],it:['Una clip nel riquadro adesso mostra a che punto sei: una traccia di posizione sotto i controlli, con la durata reale del file appena l\u2019hub l\u2019ha misurata, e un trascinamento lungo la traccia per cercare dentro la clip. Finch\xe9 la durata non \xe8 nota la traccia lo dice, invece di fingere che il file sia vuoto.','Vai al live adesso esce davvero dalla clip \u2014 il riquadro torna al live (o al poster, su una telecamera a batteria). Precedente/successiva restano nella lista.','Play/pausa su una clip \xe8 la pausa della clip. Aperta dal live, prima eseguiva la pausa del live, che smontava il player e con lui la clip.','Cercare dentro una clip resta dentro la clip. Prima il rilascio finiva sulle registrazioni in un istante senza senso e il file spariva.','Una clip nel riquadro adesso mantiene i suoi controlli. Play/pausa, velocit\xe0, avanzamento a fotogramma, clip precedente/successiva e Vai al live ci sono tutti \u2014 prima aprire una clip faceva sparire l\u2019intera barra, perch\xe9 la barra chiedeva se l\u2019immagine fosse il live e una clip lascia la sessione esattamente dov\u2019era.','Una telecamera il cui giorno corrente \xe8 vuoto adesso cerca da sola nei giorni precedenti, fino a quattordici, e dice a che punto \xe8 arrivata. Prima mostrava subito \u201cNessuna clip\u201d e le pi\xf9 vecchie comparivano solo trascinando la lista a mano.','Quando una sorgente non pu\xf2 rispondere, adesso il motivo viene scritto. Prima la frase arrivava con il segnaposto ancora dentro.']}},{version:'1.0.533',date:'2026-09-21',notes:{en:['While a clip is playing, the time around the picture is the clip\u2019s own. It used to keep showing wherever the timeline had been left, which made a card from the afternoon sit under a frame claiming the evening \u2014 and made the list look wrong when it was not.'],it:['Mentre una clip \xe8 in riproduzione, l\u2019ora attorno all\u2019immagine \xe8 quella della clip. Prima continuava a mostrare il punto in cui era rimasta la timeline, cos\xec una scheda del pomeriggio finiva sotto un riquadro che dichiarava la sera \u2014 e faceva sembrare sbagliata la lista, che non lo era.']}},{version:'1.0.532',date:'2026-09-21',notes:{en:['A camera that was asleep is no longer woken after a clip finishes. Playing a clip brings the player up, and until now nothing took that reason away again \u2014 so the player stayed up and the live stream started by itself.'],it:['Una camera che dormiva non viene pi\xf9 svegliata quando una clip finisce. Riprodurre una clip accende il player, e finora nulla toglieva pi\xf9 quel motivo \u2014 cos\xec il player restava acceso e la diretta partiva da sola.']}},{version:'1.0.531',date:'2026-09-21',notes:{en:['Clips from a camera\u2019s own storage play, instead of flashing for an instant and stopping. The hub was asking the wrong source for the file \u2014 CamStack\u2019s own recorder, which has no file behind a clip the camera wrote \u2014 because nothing said which source the clip came from.'],it:['Le clip dall\u2019archivio della camera si riproducono, invece di lampeggiare un istante e fermarsi. L\u2019hub chiedeva il file alla sorgente sbagliata \u2014 il registratore di CamStack, che dietro una clip scritta dalla camera non ha alcun file \u2014 perch\xe9 nessuno diceva da quale sorgente venisse la clip.']}},{version:'1.0.530',date:'2026-09-21',notes:{en:['Clips from a camera\u2019s own storage play. On a camera that is asleep the player is deliberately kept down so nothing wakes it, and the command to play a clip was dropped into that gap without a word. A clip now brings the player up and opens straight on the file \u2014 the camera is never dialled.'],it:['Le clip dall\u2019archivio della camera si riproducono. Su una camera che dorme il player resta spento apposta perch\xe9 nulla la svegli, e il comando per riprodurre una clip finiva in quel vuoto senza una parola. Ora una clip accende il player e apre direttamente sul file \u2014 la camera non viene mai contattata.']}},{version:'1.0.529',date:'2026-09-21',notes:{en:['The download button on a clip says it is working. It fetches a file of several megabytes, and until now a press looked exactly like a press that did nothing.'],it:['Il pulsante di scaricamento su una clip dice che sta lavorando. Scarica un file di diversi megabyte, e finora premerlo era identico a premere qualcosa che non fa niente.']}},{version:'1.0.528',date:'2026-09-21',notes:{en:['In the clips view the timeline no longer seeks while you scroll. Browsing the list moves the list and nothing else \u2014 the rule was written months ago and only one of its four parts was ever obeyed.'],it:['Nella vista clip la timeline non cerca pi\xf9 mentre scorri. Sfogliare la lista muove la lista e nient\u2019altro \u2014 la regola era scritta da mesi e di quattro sue parti ne veniva rispettata una.']}},{version:'1.0.527',date:'2026-09-21',notes:{en:['Clip thumbnails appear. They were being requested without the session\u2019s credentials, so the hub refused every one of them and the cards went black \u2014 a clip still now gets its credentials from the same single place as every other image on the timeline.'],it:['Le miniature delle clip compaiono. Venivano richieste senza le credenziali della sessione, quindi l\u2019hub le rifiutava tutte e le schede restavano nere \u2014 ora un\u2019immagine di clip prende le credenziali dallo stesso unico posto di ogni altra immagine della timeline.']}},{version:'1.0.526',date:'2026-09-21',notes:{en:['Clip thumbnails render, and the second look at a clip is instant. A still the camera already holds now goes straight to the image cache with the session\u2019s credentials, so it is kept on the device instead of being downloaded and re-encoded every time \u2014 and it no longer trips the limit that printed an error across every card.'],it:['Le miniature delle clip si vedono, e riaprire una clip \xe8 istantaneo. Un\u2019immagine che la camera ha gi\xe0 va ora direttamente alla cache immagini con le credenziali della sessione, quindi resta sul dispositivo invece di essere riscaricata e ricodificata ogni volta \u2014 e non incappa pi\xf9 nel limite che stampava un errore su ogni scheda.']}},{version:'1.0.525',date:'2026-09-21',notes:{en:['Clips from a camera\u2019s own storage get their thumbnails back. Those rows carry a still the camera already holds, and the card was only ever passed the OTHER kind of address \u2014 so no thumbnail was ever requested, on any of them.'],it:['Le clip dall\u2019archivio della camera ritrovano le loro miniature. Quelle righe portano un\u2019immagine che la camera ha gi\xe0, e alla scheda veniva passato solo l\u2019ALTRO tipo di indirizzo \u2014 quindi nessuna miniatura veniva mai richiesta, su nessuna di esse.']}},{version:'1.0.524',date:'2026-09-21',notes:{en:['While a clip is playing in the camera\u2019s picture, the timeline no longer drives the player. Scrolling used to re-arm a seek into the live session behind the clip, which left the picture loading on cameras that record only on events.','The clip surface now reports what it did \u2014 how many rows a list returned, how many stills were served, queued or refused, and what playback resolved to \u2014 so a camera whose clips do not appear can be diagnosed from the logs instead of guessed at.'],it:['Mentre una clip \xe8 in riproduzione nell\u2019immagine della camera, la timeline non pilota pi\xf9 il player. Prima lo scorrimento riarmava una ricerca sulla sessione dal vivo dietro la clip, e l\u2019immagine restava in caricamento sulle camere che registrano solo a eventi.','La superficie clip ora riferisce quel che ha fatto \u2014 quante righe ha restituito un elenco, quante miniature sono state servite, messe in coda o rifiutate, e a cosa si \xe8 risolta la riproduzione \u2014 cos\xec una camera le cui clip non compaiono si diagnostica dai log invece che a intuito.']}},{version:'1.0.523',date:'2026-09-21',notes:{en:['The camera dot no longer claims a camera is not recording when it simply could not be asked. A recording state that failed to load now shows as unknown, in grey, instead of the green of a camera that is idle \u2014 and the timeline says the same about a footage band it could not read.','A finger bouncing off the glass at the end of a pinch no longer advances the zoom a step.','Zooming into a camera no longer follows you out of it: the zoom resets when you open a camera, instead of surviving until the app is killed.'],it:['Il pallino della camera non afferma pi\xf9 che una camera non registra quando semplicemente non \xe8 riuscito a chiederlo. Uno stato di registrazione che non si \xe8 caricato ora appare come sconosciuto, in grigio, invece del verde di una camera ferma \u2014 e la timeline dice lo stesso di una fascia di filmato che non ha potuto leggere.','Un dito che rimbalza sul vetro alla fine di una pizzicata non fa pi\xf9 avanzare lo zoom di un gradino.','Lo zoom su una camera non ti segue pi\xf9 fuori: si azzera all\u2019apertura di una camera, invece di sopravvivere finch\xe9 l\u2019app non viene chiusa.']}},{version:'1.0.522',date:'2026-09-21',notes:{en:['Previous and next clip are on the playback controls. While a clip is playing in the camera\u2019s picture, the two skip buttons step between clips instead of jumping ten seconds \u2014 inside a clip, what comes before and after is another clip.'],it:['Clip precedente e successiva sono nei comandi di riproduzione. Mentre una clip \xe8 in riproduzione nell\u2019immagine della camera, i due pulsanti laterali passano da una clip all\u2019altra invece di saltare dieci secondi \u2014 dentro una clip, ci\xf2 che viene prima e dopo \xe8 un\u2019altra clip.']}},{version:'1.0.521',date:'2026-09-21',notes:{en:['The side navigation is icons only. Beside the picture there was never room for the words, so they were being cut off mid-name; the bar along the bottom, which has the whole width, keeps its labels.','The playback controls now fit the panel they are in. They were sized against the whole window rather than the box around them, so on a narrow panel the rightmost controls ran off the edge instead of stepping aside.'],it:['La navigazione laterale \xe8 a sole icone. Di fianco all\u2019immagine lo spazio per le parole non c\u2019\xe8 mai stato, e i nomi venivano tagliati a met\xe0; la barra in basso, che ha tutta la larghezza, mantiene le sue etichette.','I comandi di riproduzione ora stanno nel pannello che li contiene. Erano dimensionati sull\u2019intera finestra invece che sul riquadro attorno a loro, quindi su un pannello stretto quelli a destra uscivano dal bordo invece di farsi da parte.']}},{version:'1.0.520',date:'2026-09-21',notes:{en:['Settings templates now keep themselves up to date. Save one from the device you set up the way you like, mark that device as the one that keeps it current, and any other device can follow it \u2014 it takes the newest version on its own, including a template someone else in the house made. A following device is read-only on the shared settings: the template wins.','The rows that only mean something on a phone or tablet \u2014 build number, runtime, running bundle \u2014 are no longer shown in the desktop app, where there is no native build behind them.'],it:['I template delle impostazioni ora si mantengono aggiornati da soli. Salvane uno dal dispositivo che hai configurato come vuoi, segna quel dispositivo come quello che lo tiene aggiornato, e qualunque altro pu\xf2 seguirlo \u2014 prende l\u2019ultima versione da solo, anche un template fatto da un\u2019altra persona di casa. Un dispositivo che segue \xe8 in sola lettura sulle impostazioni condivise: vince il template.','Le righe che hanno senso solo su telefono o tablet \u2014 numero di build, runtime, bundle in esecuzione \u2014 non compaiono pi\xf9 nell\u2019app desktop, dove non c\u2019\xe8 una build nativa dietro.']}},{version:'1.0.518',date:'2026-09-21',notes:{en:['A camera that simply has no clips of a kind no longer looks broken. HomeKit clips were showing as a failure with a retry button on cameras HomeKit has never recorded \u2014 which retrying could never fix. The source already explains itself, and the app now shows that explanation instead of an error. A real fault still shows as a fault.'],it:['Una camera che semplicemente non ha clip di un certo tipo non sembra pi\xf9 rotta. Le clip HomeKit comparivano come errore con un pulsante Riprova su camere che HomeKit non ha mai registrato \u2014 e riprovare non poteva cambiarlo. La sorgente si spiega gi\xe0 da s\xe9, e ora l\u2019app mostra quella spiegazione invece di un errore. Un guasto vero continua a comparire come guasto.']}},{version:'1.0.517',date:'2026-09-21',notes:{en:['A clip from the camera now plays in the camera\u2019s own picture, not in a panel on top of it. It is the same player and the same connection the live view and the recorded timeline already use \u2014 so the controls under it are its controls, and going live leaves the clip. A clip that is only ever a link still opens in its own panel, because there is nothing for the player to fetch.'],it:['Una clip della camera ora si riproduce nell\u2019immagine della camera stessa, non in un pannello sopra. \xc8 lo stesso player e la stessa connessione che gi\xe0 usano la diretta e la timeline registrata \u2014 quindi i comandi sotto sono i suoi comandi, e tornare in diretta esce dalla clip. Una clip che \xe8 solo un collegamento continua ad aprirsi nel suo pannello, perch\xe9 non c\u2019\xe8 nulla che il player possa scaricare.']}},{version:'1.0.516',date:'2026-09-21',notes:{en:['The clip list no longer disappears while it is loading. Scrolling could take the list off the screen and leave a loading message in its place \u2014 the rows were being dropped whenever anything upstream flickered, not only when a new window was being read. What is on screen now stays on screen until there is an answer to replace it, and a list that is genuinely empty still says so.'],it:['L\u2019elenco delle clip non sparisce pi\xf9 mentre carica. Scorrendo poteva togliere la lista dallo schermo lasciando al suo posto un messaggio di caricamento \u2014 le righe venivano buttate a ogni sfarfallio a monte, non solo quando si leggeva una finestra nuova. Ora ci\xf2 che \xe8 a schermo ci resta finch\xe9 non arriva una risposta che lo sostituisca, e un elenco davvero vuoto continua a dirlo.']}},{version:'1.0.515',date:'2026-09-21',notes:{en:['Clip thumbnails appear straight away. The hub already held a finished picture for almost every clip \u2014 275 of 300 on one camera \u2014 and the app ignored it, asking the camera to cut a fresh one out of the video file instead, one at a time, in a queue. It now uses the picture that already exists and only asks for one to be made when there genuinely is none.'],it:['Le miniature delle clip compaiono subito. L\u2019hub aveva gi\xe0 pronta l\u2019immagine per quasi ogni clip \u2014 275 su 300 di una camera \u2014 e l\u2019app la ignorava, chiedendo invece alla camera di ritagliarne una nuova dal file video, una alla volta, in coda. Ora usa l\u2019immagine che esiste gi\xe0 e ne fa produrre una solo quando davvero non c\u2019\xe8.']}},{version:'1.0.514',date:'2026-09-21',notes:{en:['Scrolling the clip list no longer sticks on loading. Reaching the oldest end buys another day of history, and the list was buying one from a scroll it had caused itself: a wider window has no cards yet, an empty body collapses, and collapsing snaps the position \u2014 which counted as reaching the end again. Measured at twenty-nine days bought with no finger on the screen. A day of history is now bought by a touch.','A clip\u2019s still stays once it has arrived. The list only keeps the tiles near what you are looking at, so an ordinary scroll was throwing away pictures the camera had already been asked for, and asking again put them back at the end of the queue \u2014 the camera makes one at a time. They are now kept across scrolling, leaving the list and coming back.'],it:['Scorrendo l\u2019elenco delle clip non resta pi\xf9 bloccato sul caricamento. Arrivare in fondo compra un altro giorno di storia, e l\u2019elenco se lo comprava da uno scorrimento causato da s\xe9: una finestra pi\xf9 larga non ha ancora schede, un corpo vuoto si accorcia, e accorciandosi fa scattare la posizione \u2014 che contava come essere di nuovo in fondo. Misurati ventinove giorni comprati senza un dito sullo schermo. Ora un giorno di storia si compra con un tocco.','La miniatura di una clip resta, una volta arrivata. L\u2019elenco tiene montate solo le schede vicine a ci\xf2 che guardi, quindi un normale scorrimento buttava via immagini gi\xe0 chieste alla camera, e richiederle le rimetteva in fondo alla coda \u2014 la camera ne produce una alla volta. Ora si conservano scorrendo, uscendo dall\u2019elenco e tornandoci.']}},{version:'1.0.513',date:'2026-09-20',notes:{en:['Fixes a camera becoming unusable after opening a clip \u2014 continuous vibration and a frozen timeline. Two separate loops caused it. The timeline asks to return to live whenever its list sits at the newest end, and it stops asking once it gets there; the clip mode added yesterday could not be left that way, so the request repeated for ever and each repeat buzzed. It showed up on a sleeping battery camera with few clips, whose short list sits at that end permanently, and never on a mains camera with hundreds. The clip no longer takes over the camera\u2019s frame at all, which removes the cause rather than muting it.','A clip tile\u2019s still now arrives instead of staying blank. The camera mints one still at a time, so on a page of sixty most requests are told to come back \u2014 and the app was treating that like a refusal. It now waits and asks again, spread out so the tiles do not collide, and gives up with a reason rather than silently.'],it:['Corregge una camera che diventava inutilizzabile dopo l\u2019apertura di una clip \u2014 vibrazione continua e timeline bloccata. Le cause erano due cicli distinti. La timeline chiede di tornare al live ogni volta che la sua lista \xe8 sull\u2019estremo pi\xf9 recente, e smette di chiederlo una volta arrivata; la modalit\xe0 clip introdotta ieri non poteva essere abbandonata in quel modo, quindi la richiesta si ripeteva all\u2019infinito e ogni ripetizione vibrava. Si vedeva su una camera a batteria addormentata con poche clip, la cui lista corta sta sempre su quell\u2019estremo, e mai su una camera a rete con centinaia. La clip non occupa pi\xf9 il riquadro della camera, il che elimina la causa invece di zittirla.','La miniatura di una clip ora arriva invece di restare vuota. La camera ne produce una alla volta, quindi su una pagina da sessanta la maggior parte delle richieste riceve un \u201ctorna fra poco\u201d \u2014 e l\u2019app lo trattava come un rifiuto. Ora aspetta e richiede, distanziando i tentativi perch\xe9 non si scontrino, e si arrende dicendo il motivo invece che in silenzio.']}},{version:'1.0.512',date:'2026-09-20',notes:{en:['A camera\u2019s own clip now plays in the camera\u2019s own frame instead of a separate window, and repeats. While it does, the timeline\u2019s transport, heatmap and position line are gone \u2014 there is nothing for them to point at, and an empty scrubber still takes a drag that seeks the wrong footage. Arrows step to the previous and next clip, skipping any the camera cannot serve, and closing puts the frame back on exactly what it was showing rather than jumping to live \u2014 which on a battery camera would be a wake nobody asked for. A clip still being recorded plays once and says why it does not repeat: its end time is a guess the camera has not updated yet.','Each clip tile has a save control where the cluster magnifier normally sits. It asks for the full-size copy, because that is the one worth keeping \u2014 the opposite of what the frame plays, which is deliberately the small one. A clip the camera cannot serve shows the control disabled with the camera\u2019s own reason rather than hiding it.'],it:['Una clip della camera ora si riproduce nel riquadro della camera stessa invece che in una finestra separata, e si ripete. Mentre gira, il trasporto della timeline, la mappa di densit\xe0 e la linea di posizione spariscono: non hanno niente da indicare, e una barra vuota accetta comunque un trascinamento che cerca nel materiale sbagliato. Le frecce passano alla clip precedente e successiva saltando quelle che la camera non riesce a servire, e chiudendo il riquadro torna esattamente a ci\xf2 che mostrava invece di saltare al live \u2014 che su una camera a batteria sarebbe un risveglio che nessuno ha chiesto. Una clip ancora in registrazione si riproduce una volta e dice perch\xe9 non si ripete: la sua fine \xe8 una stima che la camera non ha ancora aggiornato.','Ogni riquadro di clip ha un comando di salvataggio dove di solito sta la lente del gruppo. Chiede la copia a piena dimensione, perch\xe9 \xe8 quella che vale la pena tenere \u2014 il contrario di quella che il riquadro riproduce, che \xe8 deliberatamente la piccola. Una clip che la camera non riesce a servire mostra il comando disattivato con il motivo della camera, invece di nasconderlo.']}},{version:'1.0.511',date:'2026-09-20',notes:{en:['Cameras that keep their own recordings \u2014 on an SD card, or on a Reolink hub \u2014 now show those clips in the app. Pick the source under Timeline \u2192 Clip source; the row only appears on a camera that actually has more than one. Tapping a clip plays the camera\u2019s own file, at the small copy rather than the one thirty times its size, in the same player a saved export opens in. Leaving the setting on CamStack recordings keeps the timeline exactly as it was.'],it:['Le camere che conservano registrazioni proprie \u2014 su scheda SD, o su un hub Reolink \u2014 ora mostrano quelle clip nell\u2019app. La sorgente si sceglie in Timeline \u2192 Sorgente clip, e la riga compare solo su una camera che ne ha davvero pi\xf9 di una. Toccando una clip si riproduce il file della camera stessa, nella copia piccola invece di quella trenta volte pi\xf9 pesante, nello stesso player con cui si apre un export salvato. Lasciando l\u2019impostazione su Registrazioni CamStack la timeline resta esattamente com\u2019era.']}},{version:'1.0.510',date:'2026-09-20',notes:{en:['A single camera\u2019s live view now recovers from a freeze on its own. A stream whose picture stops is not an errored stream \u2014 the connection stays up and the player still reports that it is playing \u2014 so every recovery path in the app slept through it, and pressing pause and then play was the only way out. That gesture worked because the session could always be rebuilt; what was missing was anything that decided to. The grid already healed itself this way; the single-camera view never did.','Animal, vehicle and audio labels on the Events page are translated. The translations were never missing: the app asked each camera which classes it advertises and printed the raw English id whenever that list did not carry one \u2014 which happens whenever a camera has its animal or vehicle group switched off while older events still mention a dog, whenever that per-camera list is still loading, and for every raw label the audio classifier produces. A label now falls back to its family and, in the last resort, shows the original word rather than a blank.'],it:['La vista dal vivo di una singola camera ora riparte da sola quando si blocca. Uno stream la cui immagine si ferma non \xe8 uno stream in errore \u2014 la connessione resta su e il player continua a dire che sta riproducendo \u2014 quindi tutti i percorsi di recupero dell\u2019app ci dormivano sopra, e premere pausa e poi play era l\u2019unico modo per uscirne. Quel gesto funzionava perch\xe9 la sessione si poteva sempre ricostruire; mancava solo qualcuno che decidesse di farlo. La griglia si curava gi\xe0 cos\xec, la vista a camera singola no.','Le etichette di animali, veicoli e audio nella pagina Eventi sono tradotte. Le traduzioni non erano mai mancate: l\u2019app chiedeva a ogni camera quali classi dichiara e stampava l\u2019identificativo inglese grezzo ogni volta che quella lista non ne conteneva una \u2014 cosa che succede quando una camera ha il gruppo animali o veicoli spento mentre lo storico parla ancora di un cane, quando quella lista sta ancora caricando, e per ogni etichetta grezza prodotta dal classificatore audio. Ora un\u2019etichetta ripiega sulla sua famiglia e, in ultima istanza, mostra la parola originale invece del vuoto.']}},{version:'1.0.509',date:'2026-09-19',notes:{en:['The timeline column on a tablet is wider, because its toolbar had stopped fitting: the row had wrapped onto a second line and the menu that opens from it was clipped by the column\u2019s edge. The second line was eating the space the timeline itself needs.'],it:['La colonna della timeline su tablet \xe8 pi\xf9 larga, perch\xe9 la sua barra non ci stava pi\xf9: la riga era andata a capo su due righe e il menu che si apre da l\xec veniva tagliato dal bordo della colonna. La seconda riga si mangiava lo spazio che serve alla timeline stessa.']}},{version:'1.0.508',date:'2026-09-19',notes:{en:['The stream numbers on the camera card now actually arrive. They were being measured once a second and thrown away on the way in: the app checks incoming messages for a stats reply, and it was matching any message that merely mentioned stats \u2014 which every sample does. So the card said "no measurement yet" on every camera, permanently, while the data was arriving the whole time.'],it:['I numeri dello stream sulla scheda della telecamera adesso arrivano davvero. Venivano misurati una volta al secondo e buttati via all\u2019ingresso: l\u2019app controlla nei messaggi in arrivo se \xe8 una risposta di statistiche, e accettava qualunque messaggio che nominasse le statistiche \u2014 cosa che ogni campione fa. Cos\xec la scheda diceva \u201cnessuna misura ancora\u201d su ogni telecamera, per sempre, mentre i dati arrivavano da subito.']}},{version:'1.0.507',date:'2026-09-19',notes:{en:['A camera that reports neither a battery nor a link now gets a chart glyph of its own, which opens the same card and its stream numbers. Those cameras had no badge at all, so the card could not be opened on them \u2014 the permanently-powered, wired ones, which are exactly the cameras you are most likely to be investigating.'],it:['Una telecamera che non riporta n\xe9 batteria n\xe9 collegamento adesso ha un\u2019icona a grafico tutta sua, che apre la stessa scheda e i suoi numeri dello stream. Su quelle telecamere non c\u2019era nessuna icona, quindi la scheda non si poteva aprire \u2014 e sono le telecamere fisse alimentate, cio\xe8 proprio quelle su cui \xe8 pi\xf9 probabile che tu stia indagando.']}},{version:'1.0.506',date:'2026-09-19',notes:{en:['The stream numbers moved to where you can reach them. Tap the battery or link glyph on a camera and the card now also carries the stream: the verdict first \u2014 is a frozen picture the network or the decoder? \u2014 then the evidence. Frames decoded and whether they are still advancing, freezes and how long they lasted, key-frame requests, loss, latency and the connection path; and from the hub, which profile you are actually being served, whether that stream is native or transcoded here, which node ingests it, and why the quality ladder last moved. The pill on the picture stays as it is: on a phone the panel behind it could never be opened, because the app owns the touches over the player.'],it:['I numeri dello stream si sono spostati dove puoi raggiungerli. Tocca l\u2019icona della batteria o del collegamento su una telecamera e la scheda adesso porta anche lo stream: prima il verdetto \u2014 un\u2019immagine bloccata \xe8 la rete o il decoder? \u2014 e poi le prove. Fotogrammi decodificati e se stanno ancora avanzando, blocchi e quanto sono durati, richieste di key frame, perdita, latenza e il percorso della connessione; e dall\u2019hub, quale profilo ti sta servendo davvero, se quello stream \xe8 nativo o transcodificato qui, quale nodo lo ingerisce e perch\xe9 la scala di qualit\xe0 si \xe8 mossa l\u2019ultima volta. La pastiglia sull\u2019immagine resta com\u2019\xe8: sul telefono il pannello dietro non si poteva aprire, perch\xe9 i tocchi sopra il player appartengono all\u2019app.']}},{version:'1.0.505',date:'2026-09-19',notes:{en:['The stream stats are a real debug tool now, and they stay out of your way. A small pill above the controls carries the verdict, the resolution, the frame rate and the bitrate; tap it for the full panel. The panel answers the question that mattered and could not be answered before: when a picture freezes, is it the network or the decoder? It shows frames decoded, freezes and their duration, key-frame requests, retransmissions, jitter, loss and the ICE path on the client side \u2014 and, from the hub, which rung you are actually being served, whether that stream is native or transcoded, which node is ingesting it, and why the quality ladder last moved.'],it:['Le statistiche dello stream sono diventate uno strumento di debug vero, e stanno fuori dai piedi. Una pastiglia sopra i controlli porta il verdetto, la risoluzione, i fotogrammi al secondo e il bitrate; toccala per il pannello completo. Il pannello risponde alla domanda che contava e a cui non si poteva rispondere: quando l\u2019immagine si blocca, \xe8 la rete o il decoder? Mostra i fotogrammi decodificati, i blocchi e quanto sono durati, le richieste di key frame, le ritrasmissioni, jitter, perdita e il percorso ICE lato client \u2014 e, dall\u2019hub, quale profilo ti sta servendo davvero, se quello stream \xe8 nativo o transcodificato, quale nodo lo sta ingerendo e perch\xe9 la scala di qualit\xe0 si \xe8 mossa l\u2019ultima volta.']}},{version:'1.0.504',date:'2026-09-17',notes:{en:['The Home button on a PTZ camera now tells you when it cannot do anything. It used to send the camera to whichever preset happened to sit in the first slot \u2014 on these cameras that was \u201cstanza\u201d, \u201cCredenza\u201d and \u201cPreset1\u201d, nobody\u2019s idea of home \u2014 and when that slot was empty it failed in silence. The hub now asks which preset you chose as home, refuses rather than guessing, and the app shows you the refusal instead of swallowing it. Pick one under PTZ settings.'],it:['Il pulsante Home su una telecamera PTZ ora ti dice quando non pu\xf2 fare niente. Prima mandava la telecamera al preset che si trovava nel primo posto \u2014 su queste telecamere erano \u201cstanza\u201d, \u201cCredenza\u201d e \u201cPreset1\u201d, che home non sono \u2014 e quando quel posto era vuoto falliva in silenzio. Adesso l\u2019hub chiede quale preset hai scelto come home, rifiuta invece di indovinare, e l\u2019app ti mostra il rifiuto invece di ingoiarlo. Scegline uno nelle impostazioni PTZ.']}},{version:'1.0.503',date:'2026-09-16',notes:{en:['Pages with camera tiles scroll again on a phone. A tile claimed every touch that landed on it \u2014 and on a phone a tile is most of the screen \u2014 then did nothing with it, because dragging only pans a tile you have already zoomed into. Now the gesture is yours until you zoom in; pinch and double-tap are unchanged.'],it:['Le pagine con i riquadri delle telecamere tornano a scorrere sul telefono. Un riquadro si prendeva ogni tocco che ci finiva sopra \u2014 e sul telefono un riquadro e\u2019 quasi tutto lo schermo \u2014 e poi non ne faceva niente, perche\u2019 trascinare sposta solo un riquadro in cui hai gia\u2019 zoomato. Ora il gesto resta tuo finche\u2019 non zoomi; pinch e doppio tocco invariati.']}},{version:'1.0.502',date:'2026-09-16',notes:{en:['Zones, above the places: a part of the home that holds several rooms \u2014 \u201cZona notte\u201d for the bedrooms. They come first in the filter strip, with their own icon, because it is the coarser question: asking for upstairs should not mean pressing four rooms. Create them on the hub, under Locations.','A camera still belongs to exactly one place, and a place to at most one zone. Nothing about your cameras changed to make this work.','The drawn zones in the rule editor are now called detection zones, which is what they are \u2014 so the word is free for the rooms of your home.'],it:['Le zone, sopra i luoghi: una parte della casa che tiene pi\xf9 stanze \u2014 \u201cZona notte\u201d per le camere da letto. Vengono per prime nella striscia dei filtri, con la loro icona, perch\xe9 sono la domanda pi\xf9 grossa: chiedere il piano di sopra non deve voler dire premere quattro stanze. Si creano sull\u2019hub, sotto Locations.','Una telecamera resta in un solo luogo, e un luogo in al massimo una zona. Non \xe8 cambiato nulla sulle tue telecamere perch\xe9 questo funzionasse.','Le zone disegnate nell\u2019editor delle regole ora si chiamano zone di rilevamento, che \xe8 quello che sono \u2014 cos\xec la parola resta libera per le stanze di casa.']}},{version:'1.0.501',date:'2026-09-16',notes:{en:['Choosing a place that has nothing in it no longer takes the page away. Pressing Favourites with nothing starred replaced the reel, the selector and the cameras with \u201cno cameras configured\u201d \u2014 and took away the control that would have undone it. The reel and the strip stay put; only the list below says it is empty.','The location chips are the size of chips again, and Favourites is in your language.'],it:['Scegliere un luogo vuoto non porta pi\xf9 via la pagina. Premere Preferite senza averne sostituiva reel, selettore e camere con \u201cnessuna camera configurata\u201d \u2014 e toglieva proprio il comando per tornare indietro. Reel e striscia restano al loro posto; \xe8 la lista sotto a dire che \xe8 vuota.','I chip dei luoghi sono tornati alti quanto un chip, e Preferite \xe8 nella tua lingua.']}},{version:'1.0.500',date:'2026-09-16',notes:{en:['The camera list has a location strip, between the reel and the cameras. Favourites first \u2014 with a count, because an empty shortlist is worth knowing before you press into it \u2014 then \u201cAll\u201d, then every place your cameras actually name. Pressing the place you are already in takes you back out, so a room whose cameras are all offline is never a dead end.','A heart on each camera, top left. Favourites live in your profile and travel with it: share the profile and they go too. They are yours alone otherwise.','A place can carry its own icon, chosen in the hub. A room nobody gave one to shows no icon at all rather than a default \u2014 \u201cnobody chose\u201d and \u201cthe pin was chosen\u201d are different things.'],it:['La lista camere ha una striscia dei luoghi, fra il reel e le camere. Prima le Preferite \u2014 col conteggio, perch\xe9 una lista corta vuota \xe8 meglio saperlo prima di entrarci \u2014 poi \u201cTutte\u201d, poi ogni luogo che le tue camere hanno davvero. Premere il luogo in cui sei gi\xe0 ti riporta indietro, cos\xec una stanza con tutte le camere offline non \xe8 mai un vicolo cieco.','Un cuore su ogni camera, in alto a sinistra. Le preferite stanno nel tuo profilo e viaggiano con lui: condividi il profilo e vanno con quello. Per il resto sono solo tue.','Un luogo pu\xf2 avere la sua icona, scelta sull\u2019hub. Una stanza a cui nessuno l\u2019ha data non disegna nessuna icona invece di una di default \u2014 \u201cnessuno ha scelto\u201d e \u201cha scelto il pin\u201d sono due cose diverse.']}},{version:'1.0.499',date:'2026-09-15',notes:{en:['The debug reasons are the ones you actually use. Nine of them, in your order \u2014 the old list had been inferred from a reading of eleven real notes; this one was dictated by the person who reviews with it. \u201cNo crop\u201d is gone: a crop that is WRONG and a crop that is ABSENT are two different findings, and one checkbox was blurring them.','A track\u2019s media strip can now show \u201cGate crop\u201d \u2014 the pixels the confirmation gate judged, kept when it refused to confirm a birth. It exists to be argued with: it is the only thing that can say whether the detector was right to drop a sighting.'],it:['Le reason di debug sono quelle che usi davvero. Nove, nel tuo ordine \u2014 la lista precedente era stata dedotta da una lettura di undici note reali; questa l\u2019ha dettata chi ci rivede. \xc8 sparito \u201cnessun ritaglio\u201d: un crop SBAGLIATO e un crop ASSENTE sono due reperti diversi, e una casella sola li confondeva.','La striscia media di una traccia pu\xf2 ora mostrare \u201cGate crop\u201d \u2014 i pixel su cui il confirmation gate ha deciso, tenuti quando ha rifiutato di confermare una nascita. Serve per poterlo contestare: \xe8 l\u2019unica cosa che dice se il detector avesse ragione a scartare un avvistamento.']}},{version:'1.0.498',date:'2026-09-15',notes:{en:['The \u201c?\u201d on an events card really does open the assignment now. It was made a button last time and still could not be tapped: it sits in the caption row, which is deliberately transparent to touches so the labels never swallow the card\u2019s own open \u2014 and the button inherited that.','Audio on open is no longer one answer for every camera. Alongside \u201calways on\u201d and \u201calways off\u201d there is now \u201cas you left it\u201d, which is the new default: each camera opens the way you last left it, and a camera you have never chosen on opens silent.'],it:['Il \u201c?\u201d su una card degli eventi ora apre davvero l\u2019assegnazione. L\u2019ultima volta era diventato un pulsante e restava comunque intoccabile: sta nella riga delle etichette, che \xe8 trasparente ai tocchi apposta perch\xe9 le etichette non si mangino l\u2019apertura della card \u2014 e il pulsante ereditava quella trasparenza.','L\u2019audio all\u2019apertura non \xe8 pi\xf9 una risposta sola per tutte le camere. Accanto a \u201csempre acceso\u201d e \u201csempre spento\u201d c\u2019\xe8 ora \u201ccome l\u2019hai lasciato\u201d, che \xe8 il nuovo default: ogni camera si apre com\u2019era l\u2019ultima volta, e una camera su cui non hai mai scelto si apre muta.']}},{version:'1.0.497',date:'2026-09-14',notes:{en:['You can add a linked device from the camera\u2019s own panel, not only from the cameras list. The panel showed you what was linked and gave you nowhere to add one, so the answer was to leave the camera you were looking at.','The keyboard no longer covers the device picker while you search it. And tapping outside now closes the keyboard first, so a search you were half way through is not thrown away with it.'],it:['Puoi aggiungere un dispositivo collegato dal pannello della camera stessa, non solo dalla lista camere. Il pannello ti mostrava cosa era collegato e non ti dava dove aggiungerne uno, quindi la risposta era uscire dalla camera che stavi guardando.','La tastiera non copre pi\xf9 il selettore dei dispositivi mentre lo cerchi. E il tocco fuori ora chiude prima la tastiera, cos\xec una ricerca lasciata a met\xe0 non se ne va con lei.']}},{version:'1.0.496',date:'2026-09-14',notes:{en:['The \u201c?\u201d on an events card now opens the assignment. It was a label that said a face was waiting for a name and did nothing when you tapped it \u2014 so you opened the card and looked for the assignment again, answering a question you had already asked.','A group now shows its PATH: what each of its subjects did, drawn on the picture they were in together, one colour each. Every member already had its own crop in the group; what was missing was where they went.'],it:['Il \u201c?\u201d su una card degli eventi ora apre l\u2019assegnazione. Era un\u2019etichetta che diceva che un volto aspettava un nome e non faceva niente al tocco \u2014 cos\xec aprivi la card e ricercavi l\u2019assegnazione, rispondendo a una domanda che avevi gi\xe0 fatto.','Un gruppo ora mostra il suo PERCORSO: cosa ha fatto ognuno dei suoi soggetti, disegnato sull\u2019immagine in cui erano insieme, un colore per ciascuno. Ogni membro aveva gi\xe0 il suo ritaglio nel gruppo; mancava dove sono andati.']}},{version:'1.0.495',date:'2026-09-13',notes:{en:['Groups with no camera filter now list every camera. Leaving the camera chip untouched means "all of them" here, and it meant "none of them" to the hub \u2014 so the gallery came back empty on a system full of groups.'],it:['I gruppi senza filtro camera ora elencano tutte le telecamere. Non toccare il chip delle camere qui significa \u201ctutte\u201d, e per l\u2019hub significava \u201cnessuna\u201d \u2014 cos\xec la galleria tornava vuota su un sistema pieno di gruppi.']}},{version:'1.0.494',date:'2026-09-13',notes:{en:['Administrators can link devices to a camera from the phone \u2014 a doorbell, a sensor, a light \u2014 in the same list the pencil arranges. The picker suggests the devices in that camera\u2019s own room first, and nothing is linked until you pick it.'],it:['Gli amministratori possono collegare device a una telecamera dal telefono \u2014 un campanello, un sensore, una luce \u2014 nella stessa lista che la matita riordina. Il selettore suggerisce per primi i device della stanza di quella telecamera, e niente viene collegato finch\xe9 non lo scegli tu.']}},{version:'1.0.493',date:'2026-09-13',notes:{en:['You can arrange the camera list by hand. A small pencil in the corner turns the list into edit mode, you drag the rows, and a tick saves. Nothing is draggable until you ask \u2014 no more reordering a camera by accident \u2014 and cancelling puts back exactly the order you started with, not the last one saved.','The arrangement is yours and stays on this device. A camera added on the hub appears at the end rather than somewhere unpredictable, and an order can move a camera but can never hide one.'],it:['Puoi sistemare la lista delle telecamere a mano. Una piccola matita nell\u2019angolo mette la lista in modifica, trascini le righe, e la spunta salva. Niente \xe8 trascinabile finch\xe9 non lo chiedi \u2014 niente pi\xf9 riordini per sbaglio \u2014 e annullare rimette esattamente l\u2019ordine da cui eri partito, non l\u2019ultimo salvato.','La disposizione \xe8 tua e resta su questo dispositivo. Una telecamera aggiunta sull\u2019hub compare in fondo invece che in un punto imprevedibile, e un ordine pu\xf2 spostare una telecamera ma non pu\xf2 mai nasconderla.']}},{version:'1.0.492',date:'2026-09-13',notes:{en:['Three pages can now list GROUPS instead of subjects: the camera timeline, the reel on the cameras page, and the Events gallery. A family walking in together is one entry with several pictures, not four cards. Each page has its OWN switch and each one starts on subjects \u2014 nothing changes until you ask it to, and you can always switch back from the page itself.','A group card shows what the group was made of \u2014 two people and a dog \u2014 and a Live chip while the session is still running. Opening it lists the members, each one linking to its own track.','The reel draws groups as their own strip, with several images per entry and no clustering: two sessions seconds apart are two things that happened, and the old grouping used to swallow one of them.','Filtering understands groups. Picking Dog now finds the arrivals that HAD a dog with them, including the group of four people \u2014 the filter asks about the members, and it runs on the hub rather than on your phone.'],it:['Tre pagine possono ora elencare i GRUPPI invece dei soggetti: la timeline della telecamera, il reel nella pagina telecamere e la galleria Eventi. Una famiglia che entra insieme \xe8 una voce sola con pi\xf9 immagini, non quattro schede. Ogni pagina ha il SUO interruttore e parte dai soggetti \u2014 non cambia nulla finch\xe9 non lo chiedi tu, e si torna indietro dalla pagina stessa.','La scheda di un gruppo dice di cosa era fatto \u2014 due persone e un cane \u2014 e porta la pastiglia Live finch\xe9 la sessione \xe8 in corso. Aprendola trovi i membri, ognuno con il link alla sua traccia.','Nel reel i gruppi hanno una striscia propria, con pi\xf9 immagini per voce e senza raggruppamento: due sessioni a pochi secondi di distanza sono due cose successe, e il vecchio accorpamento se ne mangiava una.','Il filtro capisce i gruppi. Scegliere Cane ora trova gli arrivi che AVEVANO un cane con loro, compreso il gruppo di quattro persone \u2014 il filtro chiede dei membri, e gira sull\u2019hub invece che sul telefono.']}},{version:'1.0.491',date:'2026-09-13',notes:{en:['The movable window now carries the stream\u2019s own controls: audio, talk-back, picture-in-picture, and a button that opens that camera full-screen. They are the same controls as the single-camera screen \u2014 the same code, so they cannot drift apart.','The resize corner wore the FULLSCREEN icon, so the grip was signing the wrong action. It now looks like every other control in the app.','The heatmap in that window only ever drew recordings. Motion and audio were never missing from the hub \u2014 the window was handing the bar an empty list. Both lanes are there now. Detections are deliberately still absent: loading them costs a few hundred kilobytes, which a floating panel over a live stream should not spend.','Exports and the hub\u2019s own files are ONE section, now called Media. An export finally has a detail view and plays in the app instead of only downloading, and the filter is the one from Events \u2014 a chip per facet that says what it is narrowing, instead of a pill that only counted.','You can delete what the hub produced. Until now a timelapse could only be waited out. A video takes its preview still with it, so one card frees both files.','The timeline can show GROUPS instead of subjects: a family arriving together is one card, not three. Off by default \u2014 turn it on in the timeline filters or in Settings. A session still in progress is listed with a Live chip rather than hidden.'],it:['La finestra mobile ora porta i comandi dello stream: audio, microfono, picture-in-picture e un pulsante che apre quella telecamera a schermo intero. Sono gli STESSI comandi della schermata singola \u2014 lo stesso codice, quindi non possono divergere.','L\u2019angolo di ridimensionamento portava l\u2019icona dello SCHERMO INTERO: la presa firmava l\u2019azione sbagliata. Ora ha l\u2019aspetto di ogni altro comando dell\u2019app.','La heatmap in quella finestra disegnava solo le registrazioni. Movimento e audio non sono mai mancati dall\u2019hub \u2014 era la finestra a passare alla barra una lista vuota. Ora ci sono entrambi. Le rilevazioni restano fuori di proposito: caricarle costa qualche centinaio di kilobyte, che un pannello sopra uno stream dal vivo non deve spendere.','Gli export e i file prodotti dall\u2019hub sono UNA sezione sola, che ora si chiama Media. Un export ha finalmente una scheda e si riproduce dentro l\u2019app invece di poter solo essere scaricato, e il filtro \xe8 quello di Eventi \u2014 una pastiglia per faceta che dice cosa sta restringendo, invece di una che contava e basta.','Puoi cancellare quello che ha prodotto l\u2019hub. Fino a ora un timelapse si poteva solo aspettare. Un video porta via anche la sua anteprima, quindi una card libera due file.','La timeline pu\xf2 mostrare i GRUPPI invece dei soggetti: una famiglia che arriva insieme \xe8 una card, non tre. Spento di default \u2014 si accende dai filtri della timeline o dalle Impostazioni. Una sessione ancora in corso viene elencata con la pastiglia Live, non nascosta.']}},{version:'1.0.490',date:'2026-09-13',notes:{en:['The movable window resizes properly now. The handle always worked \u2014 the sizes behind it did not: all three snaps came out the same box on a phone, so dragging changed nothing. The grip is finger-sized and no longer shares its corner with the playback controls.','The playback bar inside that window fits the width it is given. It was drawing a full-width bar into a small window with nothing to wrap into, which is why LIVE broke onto two lines and buttons landed on top of each other.','Event thumbnails stop failing to warm. The list was pre-fetching them with the wrong kind of id \u2014 an event\u2019s, where a track\u2019s was needed \u2014 so every pre-fetch missed and the picture had to be fetched again when the card appeared.','Picture-in-picture on app close is gone. It was granted by the system and lost 176 ms later, every time: Apple only starts picture-in-picture in response to something you do, and an app closing is not that. The button on the player still works and survives closing the app.'],it:['La finestra mobile ora si ridimensiona davvero. La maniglia ha sempre funzionato \u2014 erano le misure dietro a non funzionare: su telefono tutte e tre le taglie davano la stessa identica finestra, quindi trascinare non cambiava nulla. L\u2019angolo di presa \xe8 dimensionato per un dito e non se lo contende pi\xf9 con i comandi di riproduzione.','La barra di riproduzione dentro quella finestra si adatta alla larghezza che ha. Prima disegnava una barra intera dentro una finestra piccola senza spazio in cui andare a capo: per questo LIVE finiva su due righe e i pulsanti si sovrapponevano.','Le miniature degli eventi smettono di fallire il precaricamento. La lista le chiedeva con il tipo di id sbagliato \u2014 quello dell\u2019evento invece che quello della traccia \u2014 quindi ogni precaricamento mancava e l\u2019immagine andava richiesta da capo quando la card compariva.','Il picture-in-picture alla chiusura dell\u2019app non c\u2019\xe8 pi\xf9. Il sistema lo concedeva e lo perdeva 176 ms dopo, ogni volta: Apple avvia il picture-in-picture solo in risposta a qualcosa che fai tu, e chiudere l\u2019app non lo \xe8. Il pulsante sul player continua a funzionare e sopravvive alla chiusura.']}},{version:'1.0.489',date:'2026-09-13',notes:{en:['Review: deleting a sample from a person now actually deletes it. The request was never leaving the app \u2014 it was looked up in a way that can never find it, so nothing happened and nothing said so.','Review: you can delete parked faces you do not want to keep, and create a new person without leaving the page. Picking a person is a searchable list instead of a row of chips that grew with your gallery.','Review: the similar-groups button kept going quiet after the first pass. It was comparing faces over a wide window and then only showing groups that fell inside a much narrower one, so the matches sitting just outside vanished. One window now \u2014 and the button no longer claims a number.','The movable player lost its padlock: it came along with the shared playback bar and did nothing there but swallow your taps.','Opening a camera full-screen now closes the movable window if it was showing that same camera, instead of leaving two pictures of it.'],it:['Review: cancellare un campione da una persona ora lo cancella davvero. La richiesta non usciva nemmeno dall\u2019app \u2014 veniva cercata in un modo che non pu\xf2 trovarla, quindi non succedeva nulla e nulla lo diceva.','Review: puoi cancellare le facce parcheggiate che non vuoi tenere, e creare una nuova persona senza uscire dalla pagina. Scegliere una persona ora \xe8 una lista con ricerca invece di una fila di pastiglie che cresceva con la tua galleria.','Review: il pulsante dei gruppi simili ammutoliva dopo il primo giro. Confrontava le facce su una finestra ampia e poi mostrava solo i gruppi che cadevano dentro una molto pi\xf9 stretta, quindi le somiglianze appena fuori sparivano. Ora la finestra \xe8 una sola \u2014 e il pulsante non promette pi\xf9 un numero.','Il player mobile ha perso il lucchetto: arrivava insieme alla barra di riproduzione condivisa e l\xec non faceva altro che ingoiare i tuoi tocchi.','Aprire una telecamera a schermo intero ora chiude la finestra mobile se mostrava quella stessa telecamera, invece di lasciarne due immagini.']}},{version:'1.0.488',date:'2026-09-13',notes:{en:['The movable player works on the phone now, not only on tablets and wide windows. A button on each camera card summons it without leaving the list, and its title is the CAMERA\u2019s name \u2014 it used to say "Playback", which cannot tell two open windows apart.','The downward swipe on a camera changed hands: one finger goes back, two fingers hand the camera to the movable player and go back. Picture-in-picture is no longer a gesture at all \u2014 it now happens by itself when you close the app on a single camera, because that is the moment your hands are busy pressing Home. There is a switch for it under Stream.','Audio is on when you open a camera. It used to open muted until you found the button.','Settings were reorganised: General (theme, language, press feedback) sits right under Server, the event-vibration switches are gone, and on a tablet or a desktop window the sections lay out in two or three columns instead of one long scroll.'],it:['Il player mobile ora funziona anche sul telefono, non solo su tablet e finestre larghe. Un pulsante su ogni scheda telecamera lo apre senza uscire dalla lista, e il titolo \xe8 il nome della TELECAMERA \u2014 prima diceva "Riproduzione", che non distingue due finestre aperte.','Lo scorrimento verso il basso su una telecamera cambia mano: un dito torna indietro, due dita passano la telecamera al player mobile e tornano indietro. Il picture-in-picture non \xe8 pi\xf9 un gesto \u2014 ora parte da solo quando chiudi l\u2019app su una singola telecamera, perch\xe9 quello \xe8 il momento in cui le mani sono occupate a premere Home. C\u2019\xe8 un interruttore sotto Streaming.','L\u2019audio \xe8 attivo quando apri una telecamera. Prima si apriva muta finch\xe9 non trovavi il pulsante.','Impostazioni riorganizzate: Generale (tema, lingua, vibrazione alla pressione) sta subito sotto Server, gli interruttori di vibrazione sugli eventi sono spariti, e su tablet o finestra desktop le sezioni si dispongono su due o tre colonne invece di una lista lunga.']}},{version:'1.0.487',date:'2026-09-13',notes:{en:['Thumbnails and track media are back. A media file used to be addressed by a composite key that embedded a foreign id, and once every event table got its own numbering those keys started naming the wrong row \u2014 a night shot could answer for a different camera. The hub now addresses a media file by its own id, and asks for "the best picture of this track" as its own question. The app had been left on the old address, so every thumbnail it asked for came back missing: the track detail opened empty and the timeline drew nothing.','Playback got a player you can move. Open a recording from anywhere and it keeps playing in a window you can drag and resize, and it survives you navigating elsewhere in the app.','The camera reel lights up when something happens \u2014 motion and audio, on by default, with a settings panel to choose what counts. Tapping a camera in the reel now swaps it in place instead of reloading the page, and if you are in playback the new camera opens at the same instant you were watching, not at its own live edge.'],it:['Le miniature e i media delle tracce sono tornati. Un file media veniva indirizzato con una chiave composta che conteneva un id altrui, e da quando ogni tabella di eventi ha una sua numerazione quelle chiavi hanno cominciato a nominare la riga sbagliata \u2014 uno scatto notturno poteva rispondere per un\u2019altra telecamera. L\u2019hub ora indirizza un media con il suo id, e chiede \u201cla foto migliore di questa traccia\u201d come domanda a s\xe9. L\u2019app era rimasta all\u2019indirizzo vecchio, quindi ogni miniatura che chiedeva tornava mancante: il dettaglio della traccia si apriva vuoto e la timeline non disegnava nulla.','La riproduzione ha un player che puoi spostare. Apri una registrazione da qualsiasi punto e continua in una finestra che puoi trascinare e ridimensionare, e resta l\xec anche se navighi altrove nell\u2019app.','Il carosello delle telecamere si illumina quando succede qualcosa \u2014 movimento e audio, attivi di default, con un pannello per scegliere cosa conta. Toccare una telecamera nel carosello ora la scambia sul posto invece di ricaricare la pagina, e se sei in riproduzione la nuova telecamera si apre allo stesso istante che stavi guardando, non al suo live.']}},{version:'1.0.486',date:'2026-09-11',notes:{en:['The camera timeline now opens on the last hour instead of the last three. Three hours was the density the timeline had always drawn, not a decision about what you want to see when you open a camera \u2014 it put whatever just happened in a third of the screen and made the rest yesterday\u2019s scrolling.','Event cards now sit ON the track they describe. The timeline runs newest at the top, so a track ends above and begins below \u2014 but the card was anchored by its top edge to the track\u2019s beginning, which hung it under the event, over the minutes before anything happened. Now the card\u2019s bottom edge is where the track starts, so the card covers the subject\u2019s own passage and reading upward follows it.'],it:['La timeline della telecamera si apre sull\u2019ultima ora invece che sulle ultime tre. Tre ore erano la densit\xe0 che la timeline aveva sempre disegnato, non una scelta su cosa serve vedere aprendo una telecamera: mettevano quello appena successo in un terzo di schermo e rendevano il resto lo scroll di ieri.','Le card degli eventi ora stanno SOPRA la traccia che descrivono. La timeline ha il pi\xf9 recente in alto, quindi una traccia finisce sopra e comincia sotto \u2014 ma la card era ancorata col bordo superiore all\u2019inizio della traccia, il che la appendeva sotto l\u2019evento, sui minuti in cui non era ancora successo nulla. Ora il bordo inferiore della card \xe8 dove la traccia comincia, cos\xec la card copre il passaggio del soggetto e leggere verso l\u2019alto lo segue.']}},{version:'1.0.485',date:'2026-09-11',notes:{en:['The app now hangs up when you leave it, and calls back when you return. In the background the phone freezes the app and stops reading, but the connection stayed open \u2014 so the hub kept piling up messages for a listener that was asleep. One evening of that was 88 MB held on the hub for a phone nobody was holding. The app now closes the connection as it leaves and opens a new one as it comes back.','Coming back is a normal thing, not a fault: no error, no "offline", nothing emptied. You see a brief "connecting" and the screen you left, and the app re-asks the hub for everything that can have changed while it was away \u2014 cameras, batteries, switches, who is in frame \u2014 so what you are looking at a second later is current rather than remembered.'],it:['L\u2019app ora chiude la linea quando la lasci, e richiama quando torni. In background il telefono congela l\u2019app e smette di leggere, ma la connessione restava aperta \u2014 cos\xec l\u2019hub continuava ad accumulare messaggi per un ascoltatore che dormiva. Una sera cos\xec erano 88 MB tenuti sull\u2019hub per un telefono che nessuno aveva in mano. Ora l\u2019app chiude la connessione mentre esce e ne apre una nuova quando rientra.','Il rientro \xe8 una cosa normale, non un guasto: nessun errore, nessun \u201coffline\u201d, niente che si svuota. Vedi un breve \u201cconnessione\u201d e la schermata che avevi lasciato, e l\u2019app richiede all\u2019hub tutto quello che pu\xf2 essere cambiato mentre era via \u2014 telecamere, batterie, interruttori, chi \xe8 inquadrato \u2014 cos\xec quello che guardi un secondo dopo \xe8 attuale e non ricordato.']}},{version:'1.0.484',date:'2026-09-11',notes:{en:['Pinch-to-zoom, the pan while zoomed and the PTZ joystick work again. The crash guard added in 1.0.479 wrapped every gesture handler, and the wrapped handlers were no longer compiled for the UI thread \u2014 so each gesture was caught and dropped on every frame instead of running. Nothing was lost on the hub: every dropped gesture was logged, which is how this was found.','The camera timeline filter now lists every detection class that actually appears in the loaded window, even when the hub does not advertise it for that camera. A class you could see on the timeline but not tick in the filter was the hub describing the camera from a momentary status; the viewer no longer hides what it is showing.'],it:['Il pinch-to-zoom, lo spostamento da zoomato e il joystick PTZ funzionano di nuovo. La protezione anti-crash aggiunta nella 1.0.479 avvolgeva ogni gestore dei gesti, e i gestori avvolti non venivano pi\xf9 compilati per il thread UI \u2014 quindi ogni gesto veniva intercettato e scartato a ogni frame invece di eseguire. Sull\u2019hub non \xe8 andato perso nulla: ogni gesto scartato \xe8 stato registrato, ed \xe8 cos\xec che \xe8 stato trovato.','Il filtro della timeline della telecamera ora elenca ogni classe di rilevamento che compare davvero nella finestra caricata, anche quando l\u2019hub non la dichiara per quella telecamera. Una classe che vedevi sulla timeline ma non potevi spuntare nel filtro era l\u2019hub che descriveva la telecamera da uno stato momentaneo; il viewer non nasconde pi\xf9 ci\xf2 che sta mostrando.']}},{version:'1.0.483',date:'2026-09-10',notes:{en:['On a tablet, turning from portrait to landscape puts the timeline back beside the picture. The app was reading its window size from a notification that sometimes arrived seconds late, or not at all, so it kept laying out for portrait inside a landscape screen until you killed it. It now reads the size of the view you are actually looking at.','The camera reel under the player refreshes in turns instead of all at once. Every card used to ask the hub for a new frame in the same second, every fifteen seconds \u2014 thirty captures in a burst, and the slow cameras never made it in time. Now a quarter of the reel takes its turn on each poll, so each card refreshes about every twenty seconds and the hub is never asked for thirty frames at once.'],it:['Su tablet, ruotando da verticale a orizzontale la timeline torna accanto all\u2019immagine. L\u2019app leggeva la dimensione della finestra da una notifica che a volte arrivava con secondi di ritardo, o mai, e continuava a impaginare in verticale dentro uno schermo orizzontale finch\xe9 non la chiudevi. Ora legge la dimensione della vista che stai davvero guardando.','Il nastro delle telecamere sotto il player si aggiorna a turni invece che tutto insieme. Ogni scheda chiedeva all\u2019hub un frame nuovo nello stesso secondo, ogni quindici secondi \u2014 trenta catture in raffica, e le telecamere lente non facevano mai in tempo. Ora a ogni giro tocca a un quarto del nastro, cos\xec ogni scheda si aggiorna circa ogni venti secondi e all\u2019hub non vengono mai chiesti trenta frame in una volta.']}},{version:'1.0.482',date:'2026-09-10',notes:{en:['When assigning a face fails, it now says why. The failure was caught and thrown away in eight different places \u2014 you saw "could not assign a face" and there was nothing, anywhere, to explain it. The reason is now recorded and reaches the hub, including the case where the server answers but assigns nothing.','The app also stopped narrating itself. Four routine messages \u2014 one per camera tile, several times each \u2014 were more than half of everything it sent to the hub. They are still there in debug mode; what stays are the lines that report something going wrong.'],it:['Quando assegnare una faccia fallisce, ora dice perch\xe9. L\u2019errore veniva catturato e buttato via in otto punti diversi \u2014 tu vedevi \u201cimpossibile assegnare una faccia\u201d e non c\u2019era nulla, da nessuna parte, che lo spiegasse. Ora il motivo viene registrato e arriva all\u2019hub, compreso il caso in cui il server risponde ma non assegna niente.','L\u2019app ha anche smesso di raccontarsi. Quattro messaggi di routine \u2014 uno per riquadro di telecamera, pi\xf9 volte ciascuno \u2014 erano pi\xf9 della met\xe0 di tutto ci\xf2 che spediva all\u2019hub. Restano in modalit\xe0 debug; quel che resta sempre sono le righe che segnalano qualcosa che non va.']}},{version:'1.0.481',date:'2026-09-10',notes:{en:['Assigning faces no longer freezes the page. "Apply suggestions" writes one group per person, and each group used to wait for the whole gallery to be re-read before the next one started \u2014 six people meant dozens of round trips before you got the screen back. The gallery is now re-read once, when the last group is written. Assigning one face at a time waits only for the card you are looking at.','Scrubbing the timeline had a pulse every 80 ms \u2014 twelve a second, which is a buzz and not detents. It is now paced to feel like clicks, and dragging is lighter for it.'],it:['Assegnare le facce non blocca pi\xf9 la pagina. "Applica suggerimenti" scrive un gruppo per persona, e ogni gruppo aspettava che l\u2019intera galleria fosse riletta prima che partisse il successivo \u2014 sei persone significavano decine di andate e ritorni prima di riavere lo schermo. Ora la galleria si rilegge una volta sola, quando l\u2019ultimo gruppo \xe8 scritto. Assegnando una faccia per volta si aspetta soltanto la scheda che stai guardando.','Lo scrub della timeline aveva una vibrazione ogni 80 ms \u2014 dodici al secondo, che \xe8 un ronzio e non degli scatti. Ora \xe8 cadenzata per sembrare clic, e trascinare \xe8 pi\xf9 leggero.']}},{version:'1.0.480',date:'2026-09-10',notes:{en:['The timeline\u2019s audio bar shows the LEVEL now. It was showing how MANY audio events fell in each slot, painted on the same six-rung meter the live view uses for decibels \u2014 so fifty short clicks in a quiet hour lit every rung, whatever their volume. The hub now works out the average loudness of each slot and the bar draws that: a busy quiet hour reads quiet, one door slam reads loud. A slot with no audio at all draws nothing, because \u201cnothing was heard\u201d and \u201cnothing was measured\u201d are not the same thing.','A gesture that fails no longer takes the app down with it. The joystick and the pinch-zoom ran code that, if it threw, closed the app outright \u2014 three crash reports came from exactly that. Now the gesture is simply dropped and the reason is sent back, so the next one can be fixed instead of guessed at.'],it:['La barra audio della timeline mostra finalmente il LIVELLO. Prima mostrava QUANTI eventi audio cadevano in ogni fascia, disegnati sullo stesso misuratore a sei tacche che la vista live usa per i decibel \u2014 cos\xec cinquanta clic brevi in un\u2019ora tranquilla accendevano tutte le tacche, qualunque fosse il volume. Ora l\u2019hub calcola la rumorosit\xe0 media di ogni fascia e la barra disegna quella: un\u2019ora tranquilla ma affollata resta bassa, una porta sbattuta si vede. Una fascia senza audio non disegna nulla, perch\xe9 \u201cnon si \xe8 sentito niente\u201d e \u201cnessuno ha misurato\u201d non sono la stessa cosa.','Un gesto che va in errore non porta pi\xf9 gi\xf9 l\u2019app. Il joystick e lo zoom a pinch eseguivano codice che, se falliva, chiudeva l\u2019app di netto \u2014 tre segnalazioni di crash venivano esattamente da l\xec. Ora il gesto viene semplicemente ignorato e il motivo viene rimandato indietro, cos\xec il prossimo si corregge invece di indovinarlo.']}},{version:'1.0.479',date:'2026-09-09',notes:{en:['Pinch-zoom, second attempt. Yesterday\u2019s fix stopped the box resizing under your fingers, and that turned out to be the wrong half: with the panel set to grow, the picture kept zooming and sliding for a third of a second AFTER you let go \u2014 worst at full zoom, where all of the growth was still pending. The panel now grows under your fingers again, but the player\u2019s own frame never moves: the growth is folded into the zoom itself. Turn on debug mode and a pinch now writes one trace line you can send back.','The app also says far less to the hub: two diagnostics were 72% of everything it shipped \u2014 one of them logged every camera tile twice more just for sitting still while its snapshot aged.'],it:['Zoom a pinch, secondo tentativo. La correzione di ieri ha tolto il riquadro che si ridimensionava sotto le dita, e si \xe8 rivelata la met\xe0 sbagliata: col pannello impostato per crescere, l\u2019immagine continuava a zoomare e scivolare per un terzo di secondo DOPO che avevi lasciato \u2014 peggio al massimo, dove restava pendente tutta la crescita. Ora il pannello cresce di nuovo sotto le dita, ma il frame del player non si muove mai: la crescita \xe8 piegata dentro lo zoom stesso. Con la modalit\xe0 debug accesa, una pinch scrive una riga di traccia da rimandare indietro.','L\u2019app dice anche molto meno all\u2019hub: due diagnostiche facevano il 72% di tutto ci\xf2 che spediva \u2014 una di queste rilogga ogni tessera due volte solo per essere rimasta ferma mentre lo snapshot invecchiava.']}},{version:'1.0.478',date:'2026-09-09',notes:{en:['Pinch-zoom on the live view is smooth again. The picture box no longer resizes under your fingers frame by frame \u2014 it settles once, after you let go \u2014 the pan no longer springs back at the end of a gesture, and the double tap now runs on the UI thread instead of queueing behind the screen. The gesture feels slightly different on purpose: the panel grows after the pinch, not during it.'],it:['Lo zoom a pinch sulla vista live \xe8 di nuovo fluido. Il riquadro dell\u2019immagine non si ridimensiona pi\xf9 sotto le dita frame per frame \u2014 si assesta una volta sola, dopo che hai lasciato \u2014 la panoramica non torna pi\xf9 indietro a fine gesto, e il doppio tap gira sul thread della UI invece di accodarsi dietro allo schermo. Il gesto si sente un po\u2019 diverso di proposito: il pannello cresce dopo la pinch, non durante.']}},{version:'1.0.477',date:'2026-09-08',notes:{en:['The debug note\u2019s preset reasons now come from the notes actually written, not from guesswork: \u201ctrack started late\u201d leads, the thumbnail entry is reworded as \u201ca better frame existed (face/plate)\u201d \u2014 which is what gets typed by hand every time \u2014 and three reasons that were being typed out are now checkboxes: last frame before the first, two subjects in one track, and a two-wheeler whose rider is outside the keyframe.'],it:['Le ragioni preset della nota di debug ora vengono dalle note davvero scritte, non da supposizioni: \u201ctraccia partita in ritardo\u201d \xe8 la prima, la voce sulla miniatura diventa \u201cc\u2019era un frame migliore (volto/targa)\u201d \u2014 che \xe8 quello che viene digitato ogni volta \u2014 e tre ragioni che venivano scritte a mano sono ora caselle: ultimo frame prima del primo, due soggetti nella stessa traccia, e il conducente di un due ruote fuori dal keyframe.']}},{version:'1.0.476',date:'2026-09-08',notes:{en:['Closing the keyboard in the note dialog is the keyboard\u2019s own button now: on iOS a Done bar sits docked to it, drawn by the system above the keys, instead of a button crowding the card.'],it:['Chiudere la tastiera nel dialogo della nota ora \xe8 un pulsante della tastiera stessa: su iOS una barra Fatto le sta agganciata, disegnata dal sistema sopra i tasti, invece di un pulsante che toglie spazio alla scheda.']}},{version:'1.0.475',date:'2026-09-08',notes:{en:['The note dialog was a trap with the keyboard up: its buttons sat behind it, a multiline field has no return key, and tapping outside threw the note away. The card now lifts above the keyboard, a tap outside closes the keyboard first, and there is a Close keyboard button while it is open.'],it:['Il dialogo della nota era una trappola con la tastiera aperta: i pulsanti restavano dietro, un campo multiriga non ha tasto invio, e toccare fuori buttava via la nota. Ora la scheda si solleva sopra la tastiera, un tocco fuori chiude prima la tastiera, e c\u2019\xe8 un pulsante Chiudi tastiera finch\xe9 \xe8 aperta.']}},{version:'1.0.474',date:'2026-09-08',notes:{en:['On a Mac the player still opened the embed page in a browser: the WebView declines that load without reporting an error, so the previous fallback had nothing to react to. The player now watches for silence \u2014 if the bundled page has not spoken within six seconds, it loads the same page from the hub.'],it:['Su Mac il player apriva ancora la pagina dell\u2019embed nel browser: la WebView rifiuta quel caricamento senza segnalare alcun errore, quindi il fallback precedente non aveva nulla a cui reagire. Ora il player sorveglia il silenzio \u2014 se la pagina inclusa non ha parlato entro sei secondi, carica la stessa pagina dall\u2019hub.']}},{version:'1.0.473',date:'2026-09-08',notes:{en:['A sample whose picture is gone now says so, instead of drawing an empty square. Most of the gallery is in that state today \u2014 the crops were lost before the panel existed \u2014 and the scores beside them are unaffected: they come from the stored vector, which is intact.'],it:['Un campione la cui immagine non c\u2019\xe8 pi\xf9 ora lo dice, invece di disegnare un quadrato vuoto. Oggi gran parte della galleria \xe8 in quello stato \u2014 i ritagli erano gi\xe0 andati persi prima che il pannello esistesse \u2014 e i punteggi accanto non ne risentono: vengono dal vettore memorizzato, che \xe8 intatto.']}},{version:'1.0.472',date:'2026-09-08',notes:{en:['Library \u2192 Review can re-analyse one person\u2019s enrolled samples. Worst first, each with its crop and the reason \u2014 \u201clooks like Matthias (61%) more than like this person (12%)\u201d \u2014 and a sample is flagged only when it could actually be auto-assigned to the other person. Remove is one tap, and nothing is removed for you.'],it:['Libreria \u2192 Revisione pu\xf2 rianalizzare i campioni di una persona. Peggiori in cima, ognuno col suo ritaglio e il motivo \u2014 \u201csomiglia a Matthias (61%) pi\xf9 che a questa persona (12%)\u201d \u2014 e un campione \xe8 segnalato solo se potrebbe davvero essere auto-assegnato all\u2019altra persona. Rimuovere \xe8 un tocco, e nessuno rimuove niente al posto tuo.']}},{version:'1.0.471',date:'2026-09-08',notes:{en:['Opening the Cameras page now refreshes every camera\u2019s thumbnail, two at a time, once \u2014 so the tiles below the fold are minutes old instead of hours. It stops when it has been round the list.','What\u2019s new is a panel now, not a one-line dialog: the build that just arrived is at the top, and every earlier update is listed under it by version and date, tap to open. Settings \u2192 Info opens the same panel.'],it:['Aprendo la pagina Telecamere ora si aggiorna la miniatura di ogni camera, due alla volta, una sola volta \u2014 cos\xec i riquadri sotto la piega sono vecchi di minuti e non di ore. Finito il giro, si ferma.','Le novit\xe0 sono un pannello, non pi\xf9 un avviso a una riga: in alto la build appena arrivata, sotto l\u2019elenco di tutti gli aggiornamenti precedenti per versione e data, che si aprono al tocco. Impostazioni \u2192 Info apre lo stesso pannello.']}},{version:'1.0.470',date:'2026-09-08',notes:{en:['The debug checkboxes changed with use: an edge crop that came back mirrored, and a box that does not match the path the track drew \u2014 which usually means two subjects ended up sharing one id. "Wrong class" and "audio-only" left; neither was what anyone was actually reporting.'],it:['Le caselle di debug sono cambiate con l\u2019uso: un ritaglio sul bordo tornato specchiato, e un box che non coincide col percorso disegnato dalla traccia \u2014 che di solito significa due soggetti finiti sullo stesso id. Sono uscite "classe sbagliata" e "solo audio": non era quello che si segnalava davvero.']}},{version:'1.0.469',date:'2026-09-08',notes:{en:['Marking an event for debug now offers the questions that keep coming back as checkboxes, so a mark carries a question without typing one. Ticking one writes its phrase into the note; the field below still takes anything the boxes cannot say.'],it:['Marcando un evento per il debug ora trovi come caselle le domande che ricorrono, cos\xec una marcatura porta con s\xe9 una domanda senza doverla scrivere. Spuntarne una scrive la sua frase nella nota; il campo sotto accetta ancora tutto ci\xf2 che le caselle non dicono.']}},{version:'1.0.468',date:'2026-09-08',notes:{en:['The privacy-mask switch now says what is actually missing: no privacy zone is drawn on the camera. It used to give the same general "nothing is set up yet" sentence as every other control, which left no next step \u2014 and the next step is on the camera, not in this app.'],it:["L'interruttore della maschera privacy ora dice cosa manca davvero: sulla telecamera non \xe8 disegnata nessuna zona di privacy. Prima dava la stessa frase generica di ogni altro controllo, che non indicava alcun passo successivo \u2014 e il passo successivo \xe8 sulla telecamera, non in questa app."]}},{version:'1.0.467',date:'2026-09-08',notes:{en:['Unticking every event kind used to leave invisible leftovers behind, so the list stayed empty and the counters disagreed with the boxes. The leftovers are cleared, and no ticks now means no constraint.','Ticking only Faces or Plates therefore works on its own, across every kind, while narrowing them with a kind still works as before.','A collapsed group now shows a partial mark when something inside it is ticked, so nothing can be on where you cannot see it.'],it:["Togliendo la spunta a tutti i tipi di evento restavano dietro dei residui invisibili, cos\xec la lista restava vuota e i contatori non coincidevano con le caselle. I residui vengono ripuliti, e nessuna spunta adesso vuol dire nessun vincolo.","Spuntare solo Volti o Targhe funziona quindi da solo, su tutti i tipi, mentre restringerli a un tipo continua a funzionare come prima.","Un gruppo chiuso mostra adesso un segno parziale quando qualcosa al suo interno \xe8 spuntato, cos\xec niente pu\xf2 essere attivo dove non lo vedi."]}},{version:'1.0.466',date:'2026-09-08',notes:{en:['A filter that matched nothing on the first page used to stop the list from loading any further, so a narrow choice looked empty even when matches existed further back. The list now keeps reading until it finds them.','Plates were the clearest case: they sat four pages deep and were never reached. Faces happened to match early, which is why the same defect looked intermittent.','An empty list now says which kind of empty it is, and offers to load older events instead of ending the road.'],it:["Un filtro che non trovava nulla nella prima pagina impediva alla lista di caricare oltre, cos\xec una scelta stretta sembrava vuota anche quando i risultati c'erano pi\xf9 indietro. Adesso la lista continua a leggere finch\xe9 li trova.","Le targhe erano il caso pi\xf9 evidente: stavano quattro pagine pi\xf9 in l\xe0 e non venivano mai raggiunte. I volti capitavano presto, ed \xe8 per questo che lo stesso difetto sembrava intermittente.","Una lista vuota adesso dice di che vuoto si tratta, e propone di caricare gli eventi pi\xf9 vecchi invece di finire l\xec."]}},{version:'1.0.465',date:'2026-09-08',notes:{en:['The event kinds you already had \u2014 Audio, Sensor, Control \u2014 now actually filter. Ticking one shows those events, unticking hides them; there is no second filter to find, because the tree you were already using is the one that works.','Audio events start unticked, so the list opens on what you look at. A Default button puts the preset back without re-ticking everything by hand.','The chip counts what you kept in the terms you picked it in, so a default that hides one thing reads as one thing hidden.'],it:["I tipi di evento che avevi gi\xe0 \u2014 Audio, Sensore, Controllo \u2014 adesso filtrano davvero. Spuntandone uno vedi quegli eventi, togliendo la spunta li nascondi, e non c'\xe8 un secondo filtro da cercare: quello che usavi \xe8 quello che funziona.","Gli eventi audio partono senza spunta, cos\xec la lista si apre su quello che guardi. Un pulsante Predefinito rimette il preset senza dover rispuntare tutto a mano.","Il contatore conta quello che hai tenuto nei termini in cui l'hai scelto, cos\xec un default che nasconde una cosa si legge come una cosa nascosta."]}},{version:'1.0.464',date:'2026-09-07',notes:{en:['The events page can now filter by where an event came from, and audio-only events start hidden. The filter sits in More with the others, and the chip counts it, so a shorter list always says why it is shorter.','Picking a class used to drag every sensor and audio event along with it, and picking a sensor selected nothing at all. Provenance is now its own axis, so both do what they say.','The Recent strip on the Cameras screen has its own filter, in the same fan menu, showing detections by default and remembering what you choose.'],it:["La pagina eventi ora filtra anche per provenienza, e gli eventi di solo audio partono nascosti. Il filtro sta in Altro insieme agli altri e il contatore lo conta, cos\xec una lista pi\xf9 corta dice sempre perch\xe9 lo \xe8.","Scegliere una classe si portava dietro ogni evento di sensore e di audio, e scegliere un sensore non selezionava nulla. La provenienza adesso \xe8 un asse suo, quindi entrambi fanno quello che dicono.","La striscia Recenti nella schermata Camere ha un filtro suo, nello stesso menu a ventaglio, che di default mostra le rilevazioni e ricorda quello che scegli."]}},{version:'1.0.463',date:'2026-09-07',notes:{en:['One record button, the same pair of buttons everywhere: press it, then Keep \u2014 with the duration on it \u2014 or Discard. On the live picture it records forward from now; on the recording it anchors a period you draw with the scrub, in either direction.','Pressing it during playback no longer reports that the live view cannot be recorded, and the period you draw stops at the live edge instead of losing itself there.','While you are drawing a period the timeline no longer buzzes at every step: the notch feedback belongs to looking for an event, not to choosing a moment.'],it:["Un solo pulsante di registrazione, e la stessa coppia di pulsanti ovunque: premi, poi Salva \u2014 con la durata sopra \u2014 oppure Scarta. Sull'immagine live registra da adesso in avanti; sul registrato fissa un periodo che disegni con lo scorrimento, in entrambe le direzioni.","Premendolo durante la riproduzione non dice pi\xf9 che non pu\xf2 registrare la vista live, e il periodo che stai disegnando si ferma al bordo live invece di perdersi.","Mentre disegni un periodo la timeline non vibra pi\xf9 a ogni passo: lo scatto delle tacche serve a cercare un evento, non a scegliere un momento."]}},{version:'1.0.462',date:'2026-09-07',notes:{en:['Save a stretch of the recording from the timeline: press the record button during playback to anchor the period, scrub to the other end, then Save or Discard. The selected period is highlighted on the strip.','While you are choosing, the recording does not play \u2014 you see the frame you scrubbed to. Nothing is created on the hub until you press Save, and a period that crosses a stretch with no recording says so before it is exported.'],it:["Salva un tratto di registrato dalla timeline: durante la riproduzione premi il pulsante di registrazione per fissare il periodo, scorri fino all'altro estremo, poi Salva o Scarta. Il periodo selezionato \xe8 evidenziato sulla striscia.","Mentre scegli la registrazione non parte: vedi il fotogramma su cui ti sei fermato. Sull'hub non viene creato nulla finch\xe9 non premi Salva, e un periodo che attraversa un tratto senza registrazione lo dice prima di esportare."]}},{version:'1.0.461',date:'2026-09-07',notes:{en:['A host with nowhere to show a tile\'s linked-devices and view-options panels can now say so, and the embed stops drawing two buttons that would do nothing.'],it:["Un ospite che non ha dove mostrare i pannelli dispositivi collegati e opzioni di vista pu\xf2 dirlo, e l'embed smette di disegnare due pulsanti che non farebbero nulla."]}},{version:'1.0.460',date:'2026-09-06',notes:{en:['Battery and signal icons are now buttons: tapping one opens the figures \u2014 charge, power source, sleeping, link type, signal and Wi-Fi network \u2014 on the stream and in the cameras list.','What the camera does not report is said in words, never as a fabricated 0%.'],it:["Le icone di batteria e segnale sono diventate pulsanti: toccandone una si aprono i numeri \u2014 carica, alimentazione, sospensione, tipo di collegamento, segnale e rete Wi-Fi \u2014 sullo stream e nella lista camere.","Ci\xf2 che la camera non riporta viene detto a parole, mai come uno 0% inventato."]}},{version:'1.0.459',date:'2026-09-06',notes:{en:['Home Assistant cards: the embed no longer needs a viewing token in the page \u2014 Home Assistant carries it, and the events card URL stops carrying a credential.'],it:["Card di Home Assistant: l'embed non ha pi\xf9 bisogno del token nella pagina, lo porta Home Assistant, e l'URL della card eventi smette di trasportare una credenziale."]}},{version:'1.0.458',date:'2026-09-06',notes:{en:['Robot camera in landscape: with the timeline open the drive buttons move onto the visible picture and shrink to fit; the "\u2026" is gone there, the timeline has its own.'],it:['Camera del robot in landscape: con la timeline aperta i pulsanti di guida passano sul video visibile e si rimpiccioliscono; l\xec sparisce il "\u2026", la timeline ha gi\xe0 il suo.']}},{version:'1.0.457',date:'2026-09-06',notes:{en:['A restart for an update waits for the snapshot downloads in flight \u2014 the crash right after an update on build 16.'],it:['Il riavvio per un aggiornamento aspetta i download degli snapshot in corso: il crash subito dopo un aggiornamento sulla build 16.']}},{version:'1.0.456',date:'2026-09-06',notes:{en:['An OTA update asks before restarting the app.','A newer TestFlight / store build is announced, with a button to open it.',"What's new: these notes, once per version and in Settings \u2192 Info."],it:["Un aggiornamento OTA chiede conferma prima di riavviare l'app.",'Una build TestFlight / Store pi\xf9 recente viene segnalata, con il pulsante per aprirla.','Novit\xe0: queste note, una volta per versione e in Impostazioni \u2192 Info.']}},{version:'1.0.455',date:'2026-09-06',notes:{en:['Robot camera: a drive joystick in landscape, with Stop, light, Follow me and Return to dock.','The controls button opens for robot cameras too.','Battery and signal are glyphs in the toolbar; the day arrows fold on a narrow row.','A sleeping camera shows the moon in its name chip.'],it:['Camera del robot: joystick di guida in landscape, con Stop, luce, Seguimi e Torna alla base.','Il pulsante dei controlli si apre anche per le camere del robot.','Batteria e segnale sono glifi nella toolbar; le frecce del giorno si ripiegano su riga stretta.','Una camera dormiente mostra la luna nel chip del nome.']}}];function o(o){return o?e.find(e=>e.version===o)??null:null}},2205,[]);
|
|
4106
4106
|
__d(function(g,r,i,a,m,_e,d){"use strict";function e(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(_e,'__esModule',{value:!0}),_e.WhatsNewModal=function(e){const o=(0,t.c)(48),{visible:h,latest:b,past:x,onClose:S}=e,{t:v,i18n:N}=(0,p.useTranslation)(),{colors:A}=(0,y.useTheme)(),w=N.language;let G,T,R,D,z,H,_,k,W,V,L,B,E,U,q,F;o[0]!==v?(G=v("v2.common.close"),o[0]=v,o[1]=G):G=o[1];o[2]!==S||o[3]!==G?(T=(0,C.jsx)(l.default,{style:u.default.absoluteFill,accessibilityRole:"button",accessibilityLabel:G,onPress:S}),o[2]=S,o[3]=G,o[4]=T):T=o[4];o[5]!==A.backgroundElevated||o[6]!==A.border?(R=[M.card,{backgroundColor:A.backgroundElevated,borderColor:A.border}],o[5]=A.backgroundElevated,o[6]=A.border,o[7]=R):R=o[7];o[8]!==A.foreground?(D=[M.title,{color:A.foreground}],o[8]=A.foreground,o[9]=D):D=o[9];o[10]!==v?(z=v("v2.updates.whatsNewHeading"),o[10]=v,o[11]=z):z=o[11];o[12]!==D||o[13]!==z?(H=(0,C.jsx)(c.default,{style:D,children:z}),o[12]=D,o[13]=z,o[14]=H):H=o[14];o[15]!==A.foregroundMuted||o[16]!==A.primary||o[17]!==w||o[18]!==b?(_=null!==b?(0,C.jsxs)(f.default,{style:[M.latest,{borderColor:A.primary}],children:[(0,C.jsxs)(f.default,{style:M.latestHeader,children:[(0,C.jsx)(c.default,{style:[M.latestVersion,{color:A.primary}],children:b.version}),(0,C.jsx)(c.default,{style:[M.pastDate,{color:A.foregroundMuted}],children:j(b.date,w)})]}),(0,C.jsx)(P,{entry:b,language:w})]}):null,o[15]=A.foregroundMuted,o[16]=A.primary,o[17]=w,o[18]=b,o[19]=_):_=o[19];o[20]!==w||o[21]!==x?(k=x.length>0?(0,C.jsx)(I,{past:x,language:w}):null,o[20]=w,o[21]=x,o[22]=k):k=o[22];o[23]!==_||o[24]!==k?(W=(0,C.jsxs)(s.default,{style:M.scroll,contentContainerStyle:M.scrollContent,children:[_,k]}),o[23]=_,o[24]=k,o[25]=W):W=o[25];o[26]!==A.primary?(V=[M.close,{backgroundColor:A.primary}],o[26]=A.primary,o[27]=V):V=o[27];o[28]!==v?(L=v("v2.common.ok"),o[28]=v,o[29]=L):L=o[29];o[30]!==L?(B=(0,C.jsx)(c.default,{style:M.closeLabel,children:L}),o[30]=L,o[31]=B):B=o[31];o[32]!==S||o[33]!==V||o[34]!==B?(E=(0,C.jsx)(l.default,{accessibilityRole:"button",onPress:S,style:V,children:B}),o[32]=S,o[33]=V,o[34]=B,o[35]=E):E=o[35];o[36]!==E||o[37]!==R||o[38]!==H||o[39]!==W?(U=(0,C.jsxs)(f.default,{style:R,children:[H,W,E]}),o[36]=E,o[37]=R,o[38]=H,o[39]=W,o[40]=U):U=o[40];o[41]!==U||o[42]!==T?(q=(0,C.jsxs)(f.default,{style:M.backdrop,children:[T,U]}),o[41]=U,o[42]=T,o[43]=q):q=o[43];o[44]!==S||o[45]!==q||o[46]!==h?(F=(0,C.jsx)(n.default,{visible:h,transparent:!0,animationType:"fade",onRequestClose:S,children:q}),o[44]=S,o[45]=q,o[46]=h,o[47]=F):F=o[47];return F};var t=r(d[0]),o=r(d[1]),n=e(r(d[2])),l=e(r(d[3])),s=e(r(d[4])),u=e(r(d[5])),c=e(r(d[6])),f=e(r(d[7])),p=r(d[8]),h=r(d[9]),b=r(d[10]),y=r(d[11]),x=r(d[12]),S=r(d[13]),C=r(d[14]);function j(e,t){const o=new Date(e);return Number.isNaN(o.getTime())?e:o.toLocaleDateString(t,{day:'numeric',month:'short',year:'numeric'})}function P(e){const o=(0,t.c)(8),{entry:n,language:l}=e,{colors:s}=(0,y.useTheme)();let u,p;if(o[0]!==s||o[1]!==n||o[2]!==l){let e;o[4]!==s?(e=e=>(0,C.jsxs)(f.default,{style:M.note,children:[(0,C.jsx)(c.default,{style:[M.bullet,{color:s.primary}],children:"\u2022"}),(0,C.jsx)(c.default,{style:[M.noteText,{color:s.foreground}],children:e})]},e),o[4]=s,o[5]=e):e=o[5],u=(0,S.whatsNewLines)(n,l).map(e),o[0]=s,o[1]=n,o[2]=l,o[3]=u}else u=o[3];return o[6]!==u?(p=(0,C.jsx)(f.default,{style:M.notes,children:u}),o[6]=u,o[7]=p):p=o[7],p}function v(e){const n=(0,t.c)(35),{entry:s,language:u}=e,{colors:p}=(0,y.useTheme)(),[x,S]=(0,o.useState)(!1),v=x?h.ChevronDown:h.ChevronRight;let I,A;n[0]!==p.border?(I=[M.pastRow,{borderColor:p.border}],n[0]=p.border,n[1]=I):I=n[1],n[2]!==x?(A={expanded:x},n[2]=x,n[3]=A):A=n[3];const w=s.version;let G,T,R,D,z,H,_,k,W,V;return n[4]===Symbol.for("react.memo_cache_sentinel")?(G=()=>{(0,b.hapticTap)(),S(N)},n[4]=G):G=n[4],n[5]!==v||n[6]!==p.foregroundMuted?(T=(0,C.jsx)(v,{size:14,color:p.foregroundMuted}),n[5]=v,n[6]=p.foregroundMuted,n[7]=T):T=n[7],n[8]!==p.foreground?(R=[M.pastVersion,{color:p.foreground}],n[8]=p.foreground,n[9]=R):R=n[9],n[10]!==s.version||n[11]!==R?(D=(0,C.jsx)(c.default,{style:R,children:s.version}),n[10]=s.version,n[11]=R,n[12]=D):D=n[12],n[13]!==p.foregroundMuted?(z=[M.pastDate,{color:p.foregroundMuted}],n[13]=p.foregroundMuted,n[14]=z):z=n[14],n[15]!==s.date||n[16]!==u?(H=j(s.date,u),n[15]=s.date,n[16]=u,n[17]=H):H=n[17],n[18]!==z||n[19]!==H?(_=(0,C.jsx)(c.default,{style:z,children:H}),n[18]=z,n[19]=H,n[20]=_):_=n[20],n[21]!==s.version||n[22]!==_||n[23]!==A||n[24]!==T||n[25]!==D?(k=(0,C.jsxs)(l.default,{accessibilityRole:"button",accessibilityState:A,accessibilityLabel:w,onPress:G,style:M.pastHeader,children:[T,D,_]}),n[21]=s.version,n[22]=_,n[23]=A,n[24]=T,n[25]=D,n[26]=k):k=n[26],n[27]!==s||n[28]!==u||n[29]!==x?(W=x?(0,C.jsx)(P,{entry:s,language:u}):null,n[27]=s,n[28]=u,n[29]=x,n[30]=W):W=n[30],n[31]!==I||n[32]!==k||n[33]!==W?(V=(0,C.jsxs)(f.default,{style:I,children:[k,W]}),n[31]=I,n[32]=k,n[33]=W,n[34]=V):V=n[34],V}function N(e){return!e}function I(e){const n=(0,t.c)(33),{past:s,language:u}=e,{t:x}=(0,p.useTranslation)(),{colors:S}=(0,y.useTheme)(),[j,P]=(0,o.useState)(!1),N=j?h.ChevronDown:h.ChevronRight;let I,w,G,T,R,D,z,H;n[0]!==j?(I={expanded:j},n[0]=j,n[1]=I):I=n[1],n[2]!==x?(w=x("v2.updates.whatsNewPrevious"),n[2]=x,n[3]=w):w=n[3],n[4]===Symbol.for("react.memo_cache_sentinel")?(G=()=>{(0,b.hapticTap)(),P(A)},n[4]=G):G=n[4],n[5]!==N||n[6]!==S.foregroundMuted?(T=(0,C.jsx)(N,{size:14,color:S.foregroundMuted}),n[5]=N,n[6]=S.foregroundMuted,n[7]=T):T=n[7],n[8]!==S.foregroundMuted?(R=[M.pastTitle,{color:S.foregroundMuted}],n[8]=S.foregroundMuted,n[9]=R):R=n[9],n[10]!==x?(D=x("v2.updates.whatsNewPrevious"),n[10]=x,n[11]=D):D=n[11],n[12]!==R||n[13]!==D?(z=(0,C.jsx)(c.default,{style:R,children:D}),n[12]=R,n[13]=D,n[14]=z):z=n[14],n[15]!==S.foregroundMuted?(H=[M.pastCount,{color:S.foregroundMuted}],n[15]=S.foregroundMuted,n[16]=H):H=n[16];const _=String(s.length);let k,W,V,L;return n[17]!==H||n[18]!==_?(k=(0,C.jsx)(c.default,{style:H,children:_}),n[17]=H,n[18]=_,n[19]=k):k=n[19],n[20]!==I||n[21]!==k||n[22]!==w||n[23]!==T||n[24]!==z?(W=(0,C.jsxs)(l.default,{accessibilityRole:"button",accessibilityState:I,accessibilityLabel:w,onPress:G,style:M.pastPanelHeader,children:[T,z,k]}),n[20]=I,n[21]=k,n[22]=w,n[23]=T,n[24]=z,n[25]=W):W=n[25],n[26]!==u||n[27]!==j||n[28]!==s?(V=j?s.map(e=>(0,C.jsx)(v,{entry:e,language:u},e.version)):null,n[26]=u,n[27]=j,n[28]=s,n[29]=V):V=n[29],n[30]!==W||n[31]!==V?(L=(0,C.jsxs)(f.default,{style:M.pastPanel,children:[W,V]}),n[30]=W,n[31]=V,n[32]=L):L=n[32],L}function A(e){return!e}const M=u.default.create({backdrop:{flex:1,alignItems:'center',justifyContent:'center',padding:x.SPACING.lg,backgroundColor:'rgba(0,0,0,0.5)'},card:{width:'100%',maxWidth:460,maxHeight:'80%',borderWidth:1,borderRadius:x.RADIUS.lg,padding:x.SPACING.lg},title:{fontSize:16,fontWeight:'600',marginBottom:x.SPACING.md},scroll:{flexGrow:0},scrollContent:{paddingBottom:x.SPACING.sm},latest:{borderWidth:1,borderRadius:x.RADIUS.md,padding:x.SPACING.md,marginBottom:x.SPACING.lg},latestHeader:{flexDirection:'row',alignItems:'baseline',gap:x.SPACING.sm},latestVersion:{fontSize:15,fontWeight:'700'},notes:{marginTop:x.SPACING.sm,gap:x.SPACING.xs},note:{flexDirection:'row',gap:x.SPACING.xs},bullet:{fontSize:13,lineHeight:19},noteText:{flex:1,fontSize:13,lineHeight:19},pastTitle:{flex:1,fontSize:11,textTransform:'uppercase',letterSpacing:.6},pastPanel:{marginTop:x.SPACING.sm},pastPanelHeader:{flexDirection:'row',alignItems:'center',gap:x.SPACING.sm,paddingVertical:x.SPACING.sm},pastCount:{fontSize:11,fontVariant:['tabular-nums']},pastRow:{borderTopWidth:1,paddingVertical:x.SPACING.sm},pastHeader:{flexDirection:'row',alignItems:'center',gap:x.SPACING.sm},pastVersion:{fontSize:13,fontWeight:'600'},pastDate:{fontSize:11},close:{marginTop:x.SPACING.md,alignSelf:'flex-end',paddingHorizontal:x.SPACING.lg,paddingVertical:x.SPACING.sm,borderRadius:x.RADIUS.md},closeLabel:{color:'#fff',fontSize:13,fontWeight:'600'}})},2206,[15,17,245,252,143,33,198,20,1072,796,1099,782,790,2205,10]);
|
|
4107
4107
|
__d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,'__esModule',{value:!0}),e.useNativeRelease=function(){const c=(0,t.c)(8),{server:o}=(0,s.useServer)(),v=o?.serverUrl??null;let f;c[0]!==v?(f=["v2","native-release",v],c[0]=v,c[1]=f):f=c[1];const y=!1;let _,h;c[2]!==v?(_=async()=>{if(null===v)return null;const t=await fetch((0,l.nativeReleasePath)(v),{cache:"no-store"});if(!t.ok)return null;const n=await t.json();return(0,l.isNativeRelease)(n)?n:null},c[2]=v,c[3]=_):_=c[3];c[4]!==f||c[5]!==y||c[6]!==_?(h={queryKey:f,enabled:y,staleTime:u,queryFn:_},c[4]=f,c[5]=y,c[6]=_,c[7]=h):h=c[7];return(0,n.useQuery)(h)};var t=r(d[0]),n=r(d[1]);r(d[2]);var s=r(d[3]),l=r(d[4]);const u=36e5},2207,[15,1594,131,1657,2200]);
|
|
4108
4108
|
__d(function(g,r,i,a,m,_e,_d){"use strict";Object.defineProperty(_e,'__esModule',{value:!0}),Object.defineProperty(_e,"RELOAD_DRAIN_TIMEOUT_MS",{enumerable:!0,get:function(){return u}}),_e.reloadRuntimeForUpdate=async function(c){o.runtimeQuiesce.requestQuiesce();const s=o.runtimeQuiesce.inflight(),d=await o.runtimeQuiesce.waitForIdle(u);n.log.info('crash','restarting the runtime to apply an OTA update',{reason:c,inflight:s,drained:d}),await(0,t.getExitMarkerRecorder)().record('ota-reload'),await e.reloadAsync()};var e=(function(e){if(e&&e.__esModule)return e;var t={};return e&&Object.keys(e).forEach(function(n){var o=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,o.get?o:{enumerable:!0,get:function(){return e[n]}})}),t.default=e,t})(r(_d[0])),t=r(_d[1]),n=r(_d[2]),o=r(_d[3]);const u=4e3},2208,[2190,2204,1194,1683]);
|
|
@@ -4464,11 +4464,11 @@ __d(function(g,r,i,a,m,_e,d){"use strict";function e(e){return e&&e.__esModule?e
|
|
|
4464
4464
|
__d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,'__esModule',{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return l}});var n=r(d[0]),t=r(d[1]),c=r(d[2]),u=r(d[3]),o=r(d[4]),s=r(d[5]);function l(){const l=(0,n.c)(4),{kind:f}=(0,t.useLocalSearchParams)();let j;l[0]!==f?(j=(0,c.parseKind)(f),l[0]=f,l[1]=j):j=l[1];const P=j;let S;return l[2]!==P?(S=void 0===P?(0,s.jsx)(u.KindPickerScreen,{}):(0,s.jsx)(o.RuleSummaryScreen,{id:"new",kind:P}),l[2]=P,l[3]=S):S=l[3],S}},2564,[15,743,2167,2565,2556,10]);
|
|
4465
4465
|
__d(function(g,r,i,a,m,_e,d){"use strict";function e(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(_e,'__esModule',{value:!0}),_e.KindPickerScreen=function(){const e=(0,o.c)(23),{t:P}=(0,u.useTranslation)(),{colors:v}=(0,f.useTheme)(),C=(0,s.useRouter)(),z=(0,S.useAdminVerdict)();let A,I,_,N,R,G,H;e[0]!==P?(A=P("v2.nc.rules.kindPicker.title"),e[0]=P,e[1]=A):A=e[1];e[2]!==C?(I=()=>C.back(),e[2]=C,e[3]=I):I=e[3];e[4]!==v.foregroundSubtle?(_={color:v.foregroundSubtle,fontSize:14,paddingHorizontal:b.SPACING.xs},e[4]=v.foregroundSubtle,e[5]=_):_=e[5];e[6]!==P?(N=P("v2.nc.rules.kindPicker.subtitle"),e[6]=P,e[7]=N):N=e[7];e[8]!==_||e[9]!==N?(R=(0,k.jsx)(t.default,{style:_,children:N}),e[8]=_,e[9]=N,e[10]=R):R=e[10];e[11]!==v.border||e[12]!==v.foreground||e[13]!==v.foregroundSubtle||e[14]!==C||e[15]!==P||e[16]!==z?(G="pending"===z?(0,k.jsx)(j.EditorNotice,{}):(0,k.jsx)(n.default,{style:{borderRadius:b.RADIUS.lg,borderWidth:1,borderColor:v.border,overflow:"hidden"},children:(0,h.creatableKinds)("admin"===z).map((e,o)=>{const u=P((0,x.kindBlurbKey)(e),{defaultValue:""});return(0,k.jsxs)(l.default,{accessibilityRole:"button",onPress:()=>C.replace((0,p.ruleHref)("new",e)),style:{flexDirection:"row",alignItems:"center",gap:b.SPACING.md,paddingHorizontal:b.SPACING.lg,paddingVertical:b.SPACING.md,borderTopWidth:0===o?0:1,borderTopColor:v.border},children:[(0,k.jsxs)(n.default,{style:{flex:1,gap:2},children:[(0,k.jsx)(t.default,{style:{color:v.foreground,fontSize:15,fontWeight:"600"},children:P((0,h.kindLabelKey)(e))}),u.length>0?(0,k.jsx)(t.default,{style:{color:v.foregroundSubtle,fontSize:12,lineHeight:17},children:u}):null]}),(0,k.jsx)(c.ChevronRight,{size:18,color:v.foregroundSubtle})]},e)})}),e[11]=v.border,e[12]=v.foreground,e[13]=v.foregroundSubtle,e[14]=C,e[15]=P,e[16]=z,e[17]=G):G=e[17];e[18]!==A||e[19]!==I||e[20]!==R||e[21]!==G?(H=(0,k.jsxs)(y.EditorScroll,{title:A,onBack:I,children:[R,G]}),e[18]=A,e[19]=I,e[20]=R,e[21]=G,e[22]=H):H=e[22];return H};var o=r(d[0]);r(d[1]);var l=e(r(d[2])),t=e(r(d[3])),n=e(r(d[4])),u=r(d[5]),s=r(d[6]),c=r(d[7]),f=r(d[8]),b=r(d[9]),S=r(d[10]),h=r(d[11]),x=r(d[12]),p=r(d[13]),j=r(d[14]),y=r(d[15]),k=r(d[16])},2565,[15,17,252,198,20,1072,743,796,782,790,1948,2167,2486,2175,2487,2488,10]);
|
|
4466
4466
|
__d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,'__esModule',{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return o}});var t=r(d[0]),n=r(d[1]),c=r(d[2]);function o(){const o=(0,t.c)(1);let u;return o[0]===Symbol.for("react.memo_cache_sentinel")?(u=(0,c.jsx)(n.AlarmSettingsScreen,{}),o[0]=u):u=o[0],u}},2566,[15,2567,10]);
|
|
4467
|
-
__d(function(g,_r,i,_a,m,_e,_d){"use strict";function e(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(_e,'__esModule',{value:!0}),_e.AlarmSettingsScreen=function(){const e=(0,t.c)(22),{t:n}=(0,s.useTranslation)(),r=(0,c.useRouter)(),o=(0,f.useAdminVerdict)(),a=(0,f.useMe)();let l;e[0]!==r?(l=()=>r.back(),e[0]=r,e[1]=l):l=e[1];const d=l;let u,v,y,S,p,h;e[2]!==n?(u=n("v2.nc.alarm.title"),e[2]=n,e[3]=u):u=e[3];e[4]!==o?(v="pending"===o?(0,T.jsx)(_.EditorNotice,{}):null,e[4]=o,e[5]=v):v=e[5];e[6]!==n||e[7]!==o?(y="not-admin"===o?(0,T.jsx)(_.EditorNotice,{message:n("v2.nc.alarm.notAdmin")}):null,e[6]=n,e[7]=o,e[8]=y):y=e[8];e[9]!==a||e[10]!==n||e[11]!==o?(S="unknown"===o?(0,T.jsx)(F.RetryNote,{text:n("v2.nc.alarm.verdictUnknown"),onRetry:()=>{a.refetch()}}):null,e[9]=a,e[10]=n,e[11]=o,e[12]=S):S=e[12];e[13]!==o?(p="admin"===o?(0,T.jsx)(R,{}):null,e[13]=o,e[14]=p):p=e[14];e[15]!==d||e[16]!==u||e[17]!==v||e[18]!==y||e[19]!==S||e[20]!==p?(h=(0,T.jsxs)(I.EditorScroll,{title:u,onBack:d,children:[v,y,S,p]}),e[15]=d,e[16]=u,e[17]=v,e[18]=y,e[19]=S,e[20]=p,e[21]=h):h=e[21];return h};var t=_r(_d[0]),n=_r(_d[1]),r=e(_r(_d[2])),o=e(_r(_d[3])),a=e(_r(_d[4])),l=e(_r(_d[5])),s=_r(_d[6]),c=_r(_d[7]),d=_r(_d[8]),u=_r(_d[9]),f=_r(_d[10]),v=_r(_d[11]),y=_r(_d[12]),S=_r(_d[13]),p=_r(_d[14]),h=_r(_d[15]),x=_r(_d[16]),w=_r(_d[17]),b=_r(_d[18]),D=_r(_d[19]),j=_r(_d[20]),A=_r(_d[21]),N=_r(_d[22]),I=_r(_d[23]),_=_r(_d[24]),F=_r(_d[25]),T=_r(_d[26]);function k(e){return void 0!==e.data?'answered':e.isError?'failed':'pending'}function R(){const e=(0,t.c)(16),{t:n}=(0,s.useTranslation)(),r=(0,D.useNcErrorText)(),o=(0,v.useNcAlarmConfig)();if(void 0===o.data){if(!o.isError){let t;return e[0]===Symbol.for("react.memo_cache_sentinel")?(t=(0,T.jsx)(_.EditorNotice,{}),e[0]=t):t=e[0],t}let t,a,l;return e[1]!==o.error||e[2]!==r||e[3]!==n?(t=n("v2.nc.alarm.loadFailed",{error:r(o.error)??""}),e[1]=o.error,e[2]=r,e[3]=n,e[4]=t):t=e[4],e[5]!==o?(a=()=>{o.refetch()},e[5]=o,e[6]=a):a=e[6],e[7]!==t||e[8]!==a?(l=(0,T.jsx)(F.RetryNote,{text:t,onRetry:a}),e[7]=t,e[8]=a,e[9]=l):l=e[9],l}if(null===o.data.deviceId){let t,r;return e[10]!==n?(t=n("v2.nc.alarm.noPanel"),e[10]=n,e[11]=t):t=e[11],e[12]!==t?(r=(0,T.jsx)(_.EditorNotice,{message:t}),e[12]=t,e[13]=r):r=e[13],r}let a;return e[14]!==o.data?(a=(0,T.jsx)(P,{config:o.data,panelId:o.data.deviceId}),e[14]=o.data,e[15]=a):a=e[15],a}const E=[];function C(e){const n=(0,t.c)(24),{notice:r}=e,{t:o}=(0,s.useTranslation)();let a;n[0]!==o?(a=e=>o(`v2.accessories.armMode.${e}`),n[0]=o,n[1]=a):a=n[1];const l=a;switch(r.kind){case"refused":{let e,t;return n[2]!==l||n[3]!==r.inFlight.mode||n[4]!==r.inFlight.name||n[5]!==o?(e=o("v2.nc.alarm.table.notice.refused",{name:r.inFlight.name,mode:l(r.inFlight.mode)}),n[2]=l,n[3]=r.inFlight.mode,n[4]=r.inFlight.name,n[5]=o,n[6]=e):e=n[6],n[7]!==e?(t=(0,T.jsx)(F.AlarmNote,{tone:"warning",testID:"alarm-switch-refused",text:e}),n[7]=e,n[8]=t):t=n[8],t}case"not-landed":{let e,t;return n[9]!==l||n[10]!==r.write.mode||n[11]!==r.write.name||n[12]!==o?(e=o("v2.nc.alarm.table.notice.notLanded",{name:r.write.name,mode:l(r.write.mode)}),n[9]=l,n[10]=r.write.mode,n[11]=r.write.name,n[12]=o,n[13]=e):e=n[13],n[14]!==e?(t=(0,T.jsx)(F.AlarmNote,{tone:"warning",testID:"alarm-switch-not-landed",text:e}),n[14]=e,n[15]=t):t=n[15],t}case"failed":{let e,t;return n[16]!==l||n[17]!==r.error||n[18]!==r.write.mode||n[19]!==r.write.name||n[20]!==o?(e=o("v2.nc.alarm.table.notice.failed",{name:r.write.name,mode:l(r.write.mode),error:r.error}),n[16]=l,n[17]=r.error,n[18]=r.write.mode,n[19]=r.write.name,n[20]=o,n[21]=e):e=n[21],n[22]!==e?(t=(0,T.jsx)(F.AlarmNote,{tone:"danger",testID:"alarm-switch-failed",text:e}),n[22]=e,n[23]=t):t=n[23],t}}}function M(e){const t=new Set;for(const n of e.coverage)for(const e of(0,b.alarmCoverageIds)(n))t.add(e);for(const n of e.settings.nonBlocking)for(const e of n.deviceIds)t.add(e);for(const n of e.live?.openings??[])for(const e of n.unknown)t.add(e);return[...t]}function P(e){const r=(0,t.c)(139),{config:o,panelId:a}=e,{t:f}=(0,s.useTranslation)(),A=(0,D.useNcErrorText)(),I=(0,c.useNavigation)(),_=(0,j.useConfirm)(),[R,P]=(0,n.useState)(b.EMPTY_ALARM_EDITS),[G,z]=(0,n.useState)(null),[H,U]=(0,n.useState)(!1),[W,Y]=(0,n.useState)(!1),[Z,$]=(0,n.useState)(null),[q,J]=(0,n.useState)(!1),K=(0,v.useFetchFreshAlarmConfig)(),Q=(0,n.useRef)(!1),X=(0,n.useRef)(!0);let ee,te;r[0]===Symbol.for("react.memo_cache_sentinel")?(ee=()=>(X.current=!0,()=>{X.current=!1}),te=[],r[0]=ee,r[1]=te):(ee=r[0],te=r[1]),(0,n.useEffect)(ee,te);const ne=(0,v.useNcSetAlarmConfig)(),re=(0,S.useAlarmTargets)();let oe;r[2]!==o?(oe=M(o),r[2]=o,r[3]=oe):oe=r[3];const ae=oe,le=(0,S.useHouseholdOpenings)();let se;r[4]!==le.ids.data?(se=void 0===le.ids.data?null:new Set(le.ids.data),r[4]=le.ids.data,r[5]=se):se=r[5];const ie=se;let ce;r[6]!==le.ids?(ce=k(le.ids),r[6]=le.ids,r[7]=ce):ce=r[7];const de=ce;let me;r[8]!==le.ids?(me=()=>{le.ids.refetch()},r[8]=le.ids,r[9]=me):me=r[9];const ue=me,ge=(0,x.useDevicesByIds)(ae),fe=(0,p.usePickerZonesRead)(!0),ve=(0,c.useIsFocused)();let ye;r[10]!==ge||r[11]!==ae?(ye=new Map((0,w.resolveSelectedDevices)(ae,ge.data,(0,w.deviceListStateOf)(ge)).map(O)),r[10]=ge,r[11]=ae,r[12]=ye):ye=r[12];const Se=ye;let pe,he;if(r[13]!==o.live?.openings){pe=new Map;for(const e of o.live?.openings??[])for(const t of e.devices)pe.set(t.deviceId,t.name);r[13]=o.live?.openings,r[14]=pe}else pe=r[14];r[15]!==pe||r[16]!==Se?(he=e=>(0,b.alarmDeviceLabel)(e,Se,pe),r[15]=pe,r[16]=Se,r[17]=he):he=r[17];const xe=he;let we,be,De;r[18]!==ge.data?(we=ge.data??[],r[18]=ge.data,r[19]=we):we=r[19],r[20]!==le.rows.data?(be=le.rows.data??[],r[20]=le.rows.data,r[21]=be):be=r[21],r[22]!==be||r[23]!==we?(De=new Map([...we,...be].map(L)),r[22]=be,r[23]=we,r[24]=De):De=r[24];const je=De;let Ae;r[25]!==je||r[26]!==xe||r[27]!==f?(Ae=e=>{const t=xe(e),n=je.get(e)?.name??"";return"named"!==t.kind&&""!==n?n:(0,F.labelText)(t,e,f)},r[25]=je,r[26]=xe,r[27]=f,r[28]=Ae):Ae=r[28];const Ne=Ae,Ie=o.settings;let Fe;if(r[29]!==o.coverage||r[30]!==o.live||r[31]!==Ie.nonBlocking||r[32]!==ie){let e;r[34]!==o.live||r[35]!==Ie.nonBlocking||r[36]!==ie?(e=e=>[e.mode,(0,b.nonBlockingOptions)({live:o.live,listed:(0,b.nonBlockingFor)(Ie.nonBlocking,e.mode),openingIds:ie})],r[34]=o.live,r[35]=Ie.nonBlocking,r[36]=ie,r[37]=e):e=r[37],Fe=new Map(o.coverage.map(e)),r[29]=o.coverage,r[30]=o.live,r[31]=Ie.nonBlocking,r[32]=ie,r[33]=Fe}else Fe=r[33];const Te=Fe;let ke;if(r[38]!==xe||r[39]!==Te){const e=new Set;for(const t of Te.values())for(const n of t.ids)"removed"!==xe(n).kind&&e.add(n);ke=[...e].sort(B),r[38]=xe,r[39]=Te,r[40]=ke}else ke=r[40];const Re=ke,Ee=o.live?.state;let Ce;r[41]!==Ee?(Ce=(0,y.ncAlarmPollMs)(Ee),r[41]=Ee,r[42]=Ce):Ce=r[42];const Me=Ce===y.NC_ALARM_FAST_POLL_MS,Pe="pending"!==de&&!ge.isLoading,Be=(0,v.useNcAlarmSensors)(Pe?Re:E,Me,ve),Le=Be.isError?{status:"failed",error:(Oe=Be.error,Oe instanceof Error?Oe.message:String(Oe))}:void 0!==Be.data?{status:"answered",sensors:Be.data.sensors}:{status:"pending"};var Oe;const Ve="failed"!==Le.status||(0,h.alarmSensorsHubTooOld)(Le.error)?null:()=>{Be.refetch()},Ge=(0,v.useNcAlarmSwitch)(),ze=(e,t)=>{const n=Te.get(e)?.ids??[];return(0,h.alarmSensorRows)({candidates:n.map(e=>{const t=je.get(e);return Object.assign({id:e,name:Ne(e)},void 0!==t?{type:t.type,location:t.location}:{})}),removedIds:new Set(n.filter(e=>"removed"===xe(e).kind)),coverage:t,nonBlocking:(0,b.nonBlockingFor)(Ie.nonBlocking,e),sensors:Le})};let He;r[43]!==R||r[44]!==Ie?(He=(0,b.effectiveAlarmSettings)(Ie,R),r[43]=R,r[44]=Ie,r[45]=He):He=r[45];const Ue=He;let We;r[46]!==R||r[47]!==Ie?(We=(0,b.alarmSettingsPatch)(Ie,R),r[46]=R,r[47]=Ie,r[48]=We):We=r[48];const Ye=We,Ze=null!==Ye;let $e;r[49]!==R||r[50]!==Ie||r[51]!==G?($e=null!==G&&!(0,b.alarmEditsEmpty)(R)&&(0,b.alarmSettingsChanged)(G,Ie),r[49]=R,r[50]=Ie,r[51]=G,r[52]=$e):$e=r[52];const qe=$e,Je=ne.isPending||W;let Ke,Qe;r[53]!==_||r[54]!==I||r[55]!==f?(Ke=e=>{const{data:t}=e;Q.current?I.dispatch(t.action):_({title:f("v2.nc.alarm.leave.title"),message:f("v2.nc.alarm.leave.body"),confirmLabel:f("v2.nc.alarm.leave.discard"),cancelLabel:f("v2.nc.alarm.leave.keep"),destructive:!0}).then(e=>{e&&(Q.current=!0,I.dispatch(t.action))})},r[53]=_,r[54]=I,r[55]=f,r[56]=Ke):Ke=r[56],(0,d.usePreventRemove)(Ze,Ke),r[57]!==Ie?(Qe=e=>{z(e=>e??Ie),U(!1),$(null),J(!1),P(e)},r[57]=Ie,r[58]=Qe):Qe=r[58];const Xe=Qe;let et;r[59]===Symbol.for("react.memo_cache_sentinel")?(et=()=>{P(b.EMPTY_ALARM_EDITS),z(null),U(!1)},r[59]=et):et=r[59];const tt=et;let nt;r[60]!==R||r[61]!==G||r[62]!==tt||r[63]!==ne?(nt=e=>{if(Q.current||!X.current)return;Y(!1),J(null!==G&&(0,b.alarmSettingsChanged)(G,e.settings));const t=(0,b.alarmSettingsPatch)(e.settings,R);null!==t?ne.mutate(t,{onSuccess:e=>(0,u.alarmPatchLanded)(t,e.settings)?tt():U(!0)}):tt()},r[60]=R,r[61]=G,r[62]=tt,r[63]=ne,r[64]=nt):nt=r[64];const rt=nt;let ot;r[65]!==Je||r[66]!==K||r[67]!==Ye||r[68]!==rt?(ot=()=>{null===Ye||Je||(Y(!0),$(null),U(!1),K().then(rt,e=>{X.current&&(Y(!1),$(e instanceof Error?e:new Error(String(e))))}))},r[65]=Je,r[66]=K,r[67]=Ye,r[68]=rt,r[69]=ot):ot=r[69];const at=ot,lt=A(Z),st=A(ne.error),it=l.default;let ct,dt,mt,ut,gt,ft;r[70]===Symbol.for("react.memo_cache_sentinel")?(ct={gap:N.SPACING.xl},r[70]=ct):ct=r[70],r[71]!==o.live||r[72]!==a?(dt=(0,T.jsx)(F.StateSection,{panelId:a,live:o.live}),r[71]=o.live,r[72]=a,r[73]=dt):dt=r[73],r[74]!==f?(mt=f("v2.nc.alarm.modesHint"),r[74]=f,r[75]=mt):mt=r[75],r[76]!==mt?(ut=(0,T.jsx)(F.AlarmNote,{text:mt}),r[76]=mt,r[77]=ut):ut=r[77],r[78]!==Ve?(gt=null!==Ve?(0,T.jsx)(F.SensorsFailedNote,{onRetry:Ve}):null,r[78]=Ve,r[79]=gt):gt=r[79],r[80]!==Ge.notice?(ft=null!==Ge.notice?(0,T.jsx)(C,{notice:Ge.notice}):null,r[80]=Ge.notice,r[81]=ft):ft=r[81];const vt=o.coverage.map(e=>(0,T.jsx)(F.ModeCard,{coverage:e,live:o.live,options:Te.get(e.mode)??{ids:[],unresolved:!0},openingsState:de,onRetryOpenings:ue,nameOf:xe,rows:ze(e.mode,e),inFlight:Ge.inFlight,onSwitch:(t,n)=>Ge.press(e.mode,t,n),zones:fe,delays:{exitDelaySec:(0,b.modeDelayView)(Ie,R,e.mode,"exitDelaySec"),entryDelaySec:(0,b.modeDelayView)(Ie,R,e.mode,"entryDelaySec"),triggeredDurationSec:(0,b.modeDelayView)(Ie,R,e.mode,"triggeredDurationSec")},onDelayType:(t,n)=>Xe(r=>(0,b.typeModeDelay)(r,e.mode,t,n)),onDelayCommit:t=>P(n=>(0,b.commitModeDelay)(n,e.mode,t)),onDelayDefault:t=>Xe(n=>(0,b.setModeDelayDefault)(n,e.mode,t)),disabled:Je},e.mode)),yt=re.data;let St,pt,ht,xt,wt,bt,Dt;r[82]!==re?(St=k(re),r[82]=re,r[83]=St):St=r[83],r[84]!==re?(pt=()=>{re.refetch()},r[84]=re,r[85]=pt):pt=r[85],r[86]!==Xe||r[87]!==Ie?(ht=e=>Xe(t=>(0,b.toggleTargetEdit)(t,Ie,e)),r[86]=Xe,r[87]=Ie,r[88]=ht):ht=r[88],r[89]!==Je||r[90]!==St||r[91]!==pt||r[92]!==ht||r[93]!==re.data||r[94]!==Ue.announceTargets?(xt=(0,T.jsx)(F.RecipientsSection,{targets:yt,targetsState:St,onRetryTargets:pt,selected:Ue.announceTargets,disabled:Je,onToggle:ht}),r[89]=Je,r[90]=St,r[91]=pt,r[92]=ht,r[93]=re.data,r[94]=Ue.announceTargets,r[95]=xt):xt=r[95],r[96]!==Xe?(wt=(e,t)=>Xe(n=>(0,b.typeDelay)(n,e,t)),r[96]=Xe,r[97]=wt):wt=r[97],r[98]===Symbol.for("react.memo_cache_sentinel")?(bt=e=>P(t=>(0,b.commitDelay)(t,e)),r[98]=bt):bt=r[98],r[99]!==Je||r[100]!==R.delays||r[101]!==wt||r[102]!==Ue?(Dt=(0,T.jsx)(F.DelaysSection,{values:Ue,raw:R.delays,disabled:Je,onType:wt,onCommit:bt}),r[99]=Je,r[100]=R.delays,r[101]=wt,r[102]=Ue,r[103]=Dt):Dt=r[103];const jt=null!==lt?(0,T.jsx)(F.AlarmNote,{text:f("v2.nc.alarm.refreshFailed",{error:lt}),tone:"danger",testID:"alarm-refresh-failed"}):null;let At;r[104]!==qe||r[105]!==q||r[106]!==f?(At=qe||q?(0,T.jsx)(F.AlarmNote,{text:f("v2.nc.alarm.changedElsewhere"),tone:"warning",testID:"alarm-changed-elsewhere"}):null,r[104]=qe,r[105]=q,r[106]=f,r[107]=At):At=r[107];const Nt=null!==st?(0,T.jsx)(F.AlarmNote,{text:f("v2.nc.alarm.saveFailed",{error:st}),tone:"danger"}):null;let It,_t,Ft,Tt,kt;return r[108]!==H||r[109]!==f?(It=H?(0,T.jsx)(F.AlarmNote,{text:f("v2.nc.alarm.saveNotLanded"),tone:"danger",testID:"alarm-save-not-landed"}):null,r[108]=H,r[109]=f,r[110]=It):It=r[110],r[111]!==Ze||r[112]!==f?(_t=Ze?(0,T.jsx)(F.AlarmNote,{text:f("v2.nc.alarm.unsaved"),tone:"warning"}):null,r[111]=Ze,r[112]=f,r[113]=_t):_t=r[113],r[114]!==R||r[115]!==Ie?(Ft=(0,b.draftVisiblyDiffers)(Ie,R),r[114]=R,r[115]=Ie,r[116]=Ft):Ft=r[116],r[117]!==Je||r[118]!==Ze||r[119]!==at||r[120]!==tt||r[121]!==Ft?(Tt=(0,T.jsx)(V,{dirty:Ze,discardable:Ft,busy:Je,onSave:at,onDiscard:tt}),r[117]=Je,r[118]=Ze,r[119]=at,r[120]=tt,r[121]=Ft,r[122]=Tt):Tt=r[122],r[123]!==it||r[124]!==ct||r[125]!==dt||r[126]!==ut||r[127]!==gt||r[128]!==ft||r[129]!==vt||r[130]!==xt||r[131]!==Dt||r[132]!==jt||r[133]!==At||r[134]!==Nt||r[135]!==It||r[136]!==_t||r[137]!==Tt?(kt=(0,T.jsxs)(it,{style:ct,children:[dt,ut,gt,ft,vt,xt,Dt,jt,At,Nt,It,_t,Tt]}),r[123]=it,r[124]=ct,r[125]=dt,r[126]=ut,r[127]=gt,r[128]=ft,r[129]=vt,r[130]=xt,r[131]=Dt,r[132]=jt,r[133]=At,r[134]=Nt,r[135]=It,r[136]=_t,r[137]=Tt,r[138]=kt):kt=r[138],kt}function B(e,t){return e-t}function L(e){return[e.id,e]}function O(e){return[e.id,e]}function V(e){const n=(0,t.c)(38),{dirty:c,discardable:d,busy:u,onSave:f,onDiscard:v}=e,{t:y}=(0,s.useTranslation)(),{colors:S}=(0,A.useTheme)(),p=!c||u;let h;n[0]===Symbol.for("react.memo_cache_sentinel")?(h={flexDirection:"row",gap:N.SPACING.md},n[0]=h):h=n[0];const x=!d||u,w=!d||u?.6:1;let b,D,j,I,_;n[1]!==S.border||n[2]!==w?(b={flex:1,alignItems:"center",paddingVertical:N.SPACING.lg,borderRadius:N.RADIUS.lg,borderWidth:1,borderColor:S.border,opacity:w},n[1]=S.border,n[2]=w,n[3]=b):b=n[3],n[4]!==S.foreground?(D={color:S.foreground,fontSize:15,fontWeight:"600"},n[4]=S.foreground,n[5]=D):D=n[5],n[6]!==y?(j=y("v2.nc.alarm.discard"),n[6]=y,n[7]=j):j=n[7],n[8]!==D||n[9]!==j?(I=(0,T.jsx)(a.default,{style:D,children:j}),n[8]=D,n[9]=j,n[10]=I):I=n[10],n[11]!==v||n[12]!==x||n[13]!==b||n[14]!==I?(_=(0,T.jsx)(o.default,{accessibilityRole:"button",disabled:x,onPress:v,style:b,children:I}),n[11]=v,n[12]=x,n[13]=b,n[14]=I,n[15]=_):_=n[15];const F=p?.6:1;let k,R,E,C,M,P,B;return n[16]!==S.primary||n[17]!==F?(k={flex:1,flexDirection:"row",justifyContent:"center",alignItems:"center",gap:N.SPACING.sm,paddingVertical:N.SPACING.lg,borderRadius:N.RADIUS.lg,backgroundColor:S.primary,opacity:F},n[16]=S.primary,n[17]=F,n[18]=k):k=n[18],n[19]!==u||n[20]!==S.primaryForeground?(R=u?(0,T.jsx)(r.default,{size:"small",color:S.primaryForeground}):null,n[19]=u,n[20]=S.primaryForeground,n[21]=R):R=n[21],n[22]!==S.primaryForeground?(E={color:S.primaryForeground,fontSize:15,fontWeight:"600"},n[22]=S.primaryForeground,n[23]=E):E=n[23],n[24]!==y?(C=y("v2.nc.alarm.save"),n[24]=y,n[25]=C):C=n[25],n[26]!==E||n[27]!==C?(M=(0,T.jsx)(a.default,{style:E,children:C}),n[26]=E,n[27]=C,n[28]=M):M=n[28],n[29]!==f||n[30]!==p||n[31]!==k||n[32]!==R||n[33]!==M?(P=(0,T.jsxs)(o.default,{accessibilityRole:"button",disabled:p,onPress:f,style:k,children:[R,M]}),n[29]=f,n[30]=p,n[31]=k,n[32]=R,n[33]=M,n[34]=P):P=n[34],n[35]!==P||n[36]!==_?(B=(0,T.jsxs)(l.default,{style:h,children:[_,P]}),n[35]=P,n[36]=_,n[37]=B):B=n[37],B}},2567,[15,17,237,252,198,20,1072,743,2557,1104,1948,2028,2030,2568,2056,2029,2513,2505,2569,2020,1912,782,790,2488,2487,2570,10]);
|
|
4467
|
+
__d(function(g,_r,i,_a,m,_e,_d){"use strict";function e(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(_e,'__esModule',{value:!0}),_e.AlarmSettingsScreen=function(){const e=(0,t.c)(22),{t:n}=(0,s.useTranslation)(),o=(0,c.useRouter)(),r=(0,f.useAdminVerdict)(),a=(0,f.useMe)();let l;e[0]!==o?(l=()=>o.back(),e[0]=o,e[1]=l):l=e[1];const d=l;let u,v,y,S,h,p;e[2]!==n?(u=n("v2.nc.alarm.title"),e[2]=n,e[3]=u):u=e[3];e[4]!==r?(v="pending"===r?(0,k.jsx)(_.EditorNotice,{}):null,e[4]=r,e[5]=v):v=e[5];e[6]!==n||e[7]!==r?(y="not-admin"===r?(0,k.jsx)(_.EditorNotice,{message:n("v2.nc.alarm.notAdmin")}):null,e[6]=n,e[7]=r,e[8]=y):y=e[8];e[9]!==a||e[10]!==n||e[11]!==r?(S="unknown"===r?(0,k.jsx)(T.RetryNote,{text:n("v2.nc.alarm.verdictUnknown"),onRetry:()=>{a.refetch()}}):null,e[9]=a,e[10]=n,e[11]=r,e[12]=S):S=e[12];e[13]!==r?(h="admin"===r?(0,k.jsx)(E,{}):null,e[13]=r,e[14]=h):h=e[14];e[15]!==d||e[16]!==u||e[17]!==v||e[18]!==y||e[19]!==S||e[20]!==h?(p=(0,k.jsxs)(N.EditorScroll,{title:u,onBack:d,children:[v,y,S,h]}),e[15]=d,e[16]=u,e[17]=v,e[18]=y,e[19]=S,e[20]=h,e[21]=p):p=e[21];return p};var t=_r(_d[0]),n=_r(_d[1]),o=e(_r(_d[2])),r=e(_r(_d[3])),a=e(_r(_d[4])),l=e(_r(_d[5])),s=_r(_d[6]),c=_r(_d[7]),d=_r(_d[8]),u=_r(_d[9]),f=_r(_d[10]),v=_r(_d[11]),y=_r(_d[12]),S=_r(_d[13]),h=_r(_d[14]),p=_r(_d[15]),x=_r(_d[16]),w=_r(_d[17]),b=_r(_d[18]),D=_r(_d[19]),j=_r(_d[20]),A=_r(_d[21]),I=_r(_d[22]),N=_r(_d[23]),_=_r(_d[24]),F=_r(_d[25]),T=_r(_d[26]),k=_r(_d[27]);function R(e){return void 0!==e.data?'answered':e.isError?'failed':'pending'}function E(){const e=(0,t.c)(16),{t:n}=(0,s.useTranslation)(),o=(0,D.useNcErrorText)(),r=(0,v.useNcAlarmConfig)();if(void 0===r.data){if(!r.isError){let t;return e[0]===Symbol.for("react.memo_cache_sentinel")?(t=(0,k.jsx)(_.EditorNotice,{}),e[0]=t):t=e[0],t}let t,a,l;return e[1]!==r.error||e[2]!==o||e[3]!==n?(t=n("v2.nc.alarm.loadFailed",{error:o(r.error)??""}),e[1]=r.error,e[2]=o,e[3]=n,e[4]=t):t=e[4],e[5]!==r?(a=()=>{r.refetch()},e[5]=r,e[6]=a):a=e[6],e[7]!==t||e[8]!==a?(l=(0,k.jsx)(T.RetryNote,{text:t,onRetry:a}),e[7]=t,e[8]=a,e[9]=l):l=e[9],l}if(null===r.data.deviceId){let t,o;return e[10]!==n?(t=n("v2.nc.alarm.noPanel"),e[10]=n,e[11]=t):t=e[11],e[12]!==t?(o=(0,k.jsx)(_.EditorNotice,{message:t}),e[12]=t,e[13]=o):o=e[13],o}let a;return e[14]!==r.data?(a=(0,k.jsx)(B,{config:r.data,panelId:r.data.deviceId}),e[14]=r.data,e[15]=a):a=e[15],a}const C=[];function M(e){const n=(0,t.c)(24),{notice:o}=e,{t:r}=(0,s.useTranslation)();let a;n[0]!==r?(a=e=>r(`v2.accessories.armMode.${e}`),n[0]=r,n[1]=a):a=n[1];const l=a;switch(o.kind){case"refused":{let e,t;return n[2]!==l||n[3]!==o.inFlight.mode||n[4]!==o.inFlight.name||n[5]!==r?(e=r("v2.nc.alarm.table.notice.refused",{name:o.inFlight.name,mode:l(o.inFlight.mode)}),n[2]=l,n[3]=o.inFlight.mode,n[4]=o.inFlight.name,n[5]=r,n[6]=e):e=n[6],n[7]!==e?(t=(0,k.jsx)(T.AlarmNote,{tone:"warning",testID:"alarm-switch-refused",text:e}),n[7]=e,n[8]=t):t=n[8],t}case"not-landed":{let e,t;return n[9]!==l||n[10]!==o.write.mode||n[11]!==o.write.name||n[12]!==r?(e=r("v2.nc.alarm.table.notice.notLanded",{name:o.write.name,mode:l(o.write.mode)}),n[9]=l,n[10]=o.write.mode,n[11]=o.write.name,n[12]=r,n[13]=e):e=n[13],n[14]!==e?(t=(0,k.jsx)(T.AlarmNote,{tone:"warning",testID:"alarm-switch-not-landed",text:e}),n[14]=e,n[15]=t):t=n[15],t}case"failed":{let e,t;return n[16]!==l||n[17]!==o.error||n[18]!==o.write.mode||n[19]!==o.write.name||n[20]!==r?(e=r("v2.nc.alarm.table.notice.failed",{name:o.write.name,mode:l(o.write.mode),error:o.error}),n[16]=l,n[17]=o.error,n[18]=o.write.mode,n[19]=o.write.name,n[20]=r,n[21]=e):e=n[21],n[22]!==e?(t=(0,k.jsx)(T.AlarmNote,{tone:"danger",testID:"alarm-switch-failed",text:e}),n[22]=e,n[23]=t):t=n[23],t}}}function P(e){const t=new Set;for(const n of e.coverage)for(const e of(0,b.alarmCoverageIds)(n))t.add(e);for(const n of e.settings.nonBlocking)for(const e of n.deviceIds)t.add(e);for(const n of e.live?.openings??[])for(const e of n.unknown)t.add(e);return[...t]}function B(e){const o=(0,t.c)(138),{config:r,panelId:a}=e,[f,A]=(0,n.useState)(null),{t:N}=(0,s.useTranslation)(),_=(0,D.useNcErrorText)(),E=(0,c.useNavigation)(),B=(0,j.useConfirm)(),[z,$]=(0,n.useState)(b.EMPTY_ALARM_EDITS),[U,W]=(0,n.useState)(null),[H,Y]=(0,n.useState)(!1),[Z,q]=(0,n.useState)(!1),[J,K]=(0,n.useState)(null),[Q,X]=(0,n.useState)(!1),ee=(0,v.useFetchFreshAlarmConfig)(),te=(0,n.useRef)(!1),ne=(0,n.useRef)(!0);let oe,re;o[0]===Symbol.for("react.memo_cache_sentinel")?(oe=()=>(ne.current=!0,()=>{ne.current=!1}),re=[],o[0]=oe,o[1]=re):(oe=o[0],re=o[1]),(0,n.useEffect)(oe,re);const ae=(0,v.useNcSetAlarmConfig)(),le=(0,S.useAlarmTargets)();let se;o[2]!==r?(se=P(r),o[2]=r,o[3]=se):se=o[3];const ie=se,ce=(0,S.useHouseholdOpenings)();let de;o[4]!==ce.ids.data?(de=void 0===ce.ids.data?null:new Set(ce.ids.data),o[4]=ce.ids.data,o[5]=de):de=o[5];const me=de;let ue;o[6]!==ce.ids?(ue=R(ce.ids),o[6]=ce.ids,o[7]=ue):ue=o[7];const ge=ue;let fe;o[8]!==ce.ids?(fe=()=>{ce.ids.refetch()},o[8]=ce.ids,o[9]=fe):fe=o[9];const ve=fe,ye=(0,x.useDevicesByIds)(ie),Se=(0,h.usePickerZonesRead)(!0),he=(0,c.useIsFocused)();let pe;o[10]!==ye||o[11]!==ie?(pe=new Map((0,w.resolveSelectedDevices)(ie,ye.data,(0,w.deviceListStateOf)(ye)).map(V)),o[10]=ye,o[11]=ie,o[12]=pe):pe=o[12];const xe=pe;let we,be;if(o[13]!==r.live?.openings){we=new Map;for(const e of r.live?.openings??[])for(const t of e.devices)we.set(t.deviceId,t.name);o[13]=r.live?.openings,o[14]=we}else we=o[14];o[15]!==we||o[16]!==xe?(be=e=>(0,b.alarmDeviceLabel)(e,xe,we),o[15]=we,o[16]=xe,o[17]=be):be=o[17];const De=be;let je,Ae,Ie;o[18]!==ye.data?(je=ye.data??[],o[18]=ye.data,o[19]=je):je=o[19],o[20]!==ce.rows.data?(Ae=ce.rows.data??[],o[20]=ce.rows.data,o[21]=Ae):Ae=o[21],o[22]!==Ae||o[23]!==je?(Ie=new Map([...je,...Ae].map(O)),o[22]=Ae,o[23]=je,o[24]=Ie):Ie=o[24];const Ne=Ie;let Fe;o[25]!==Ne||o[26]!==De||o[27]!==N?(Fe=e=>{const t=De(e),n=Ne.get(e)?.name??"";return"named"!==t.kind&&""!==n?n:(0,T.labelText)(t,e,N)},o[25]=Ne,o[26]=De,o[27]=N,o[28]=Fe):Fe=o[28];const Te=Fe,ke=r.settings;let Re;if(o[29]!==r.coverage||o[30]!==r.live||o[31]!==ke.nonBlocking||o[32]!==me){let e;o[34]!==r.live||o[35]!==ke.nonBlocking||o[36]!==me?(e=e=>[e.mode,(0,b.nonBlockingOptions)({live:r.live,listed:(0,b.nonBlockingFor)(ke.nonBlocking,e.mode),openingIds:me})],o[34]=r.live,o[35]=ke.nonBlocking,o[36]=me,o[37]=e):e=o[37],Re=new Map(r.coverage.map(e)),o[29]=r.coverage,o[30]=r.live,o[31]=ke.nonBlocking,o[32]=me,o[33]=Re}else Re=o[33];const Ee=Re;let Ce;if(o[38]!==De||o[39]!==Ee){const e=new Set;for(const t of Ee.values())for(const n of t.ids)"removed"!==De(n).kind&&e.add(n);Ce=[...e].sort(L),o[38]=De,o[39]=Ee,o[40]=Ce}else Ce=o[40];const Me=Ce,Pe=r.live?.state;let Be;o[41]!==Pe?(Be=(0,y.ncAlarmPollMs)(Pe),o[41]=Pe,o[42]=Be):Be=o[42];const Le=Be===y.NC_ALARM_FAST_POLL_MS,Oe="pending"!==ge&&!ye.isLoading,Ve=(0,v.useNcAlarmSensors)(Oe?Me:C,Le,he),Ge=Ve.isError?{status:"failed",error:(ze=Ve.error,ze instanceof Error?ze.message:String(ze))}:void 0!==Ve.data?{status:"answered",sensors:Ve.data.sensors}:{status:"pending"};var ze;const $e="failed"!==Ge.status||(0,p.alarmSensorsHubTooOld)(Ge.error)?null:()=>{Ve.refetch()},Ue=(0,v.useNcAlarmSwitch)(),We=(e,t)=>{const n=Ee.get(e)?.ids??[];return(0,p.alarmSensorRows)({candidates:n.map(e=>{const t=Ne.get(e);return Object.assign({id:e,name:Te(e)},void 0!==t?{type:t.type,location:t.location}:{})}),removedIds:new Set(n.filter(e=>"removed"===De(e).kind)),coverage:t,nonBlocking:(0,b.nonBlockingFor)(ke.nonBlocking,e),sensors:Ge})};let He;o[43]!==z||o[44]!==ke?(He=(0,b.effectiveAlarmSettings)(ke,z),o[43]=z,o[44]=ke,o[45]=He):He=o[45];const Ye=He;let Ze;o[46]!==z||o[47]!==ke?(Ze=(0,b.alarmSettingsPatch)(ke,z),o[46]=z,o[47]=ke,o[48]=Ze):Ze=o[48];const qe=Ze,Je=null!==qe;let Ke;o[49]!==z||o[50]!==ke||o[51]!==U?(Ke=null!==U&&!(0,b.alarmEditsEmpty)(z)&&(0,b.alarmSettingsChanged)(U,ke),o[49]=z,o[50]=ke,o[51]=U,o[52]=Ke):Ke=o[52];const Qe=Ke,Xe=ae.isPending||Z;let et,tt;o[53]!==B||o[54]!==E||o[55]!==N?(et=e=>{const{data:t}=e;te.current?E.dispatch(t.action):B({title:N("v2.nc.alarm.leave.title"),message:N("v2.nc.alarm.leave.body"),confirmLabel:N("v2.nc.alarm.leave.discard"),cancelLabel:N("v2.nc.alarm.leave.keep"),destructive:!0}).then(e=>{e&&(te.current=!0,E.dispatch(t.action))})},o[53]=B,o[54]=E,o[55]=N,o[56]=et):et=o[56],(0,d.usePreventRemove)(Je,et),o[57]!==ke?(tt=e=>{W(e=>e??ke),Y(!1),K(null),X(!1),$(e)},o[57]=ke,o[58]=tt):tt=o[58];const nt=tt;let ot;o[59]===Symbol.for("react.memo_cache_sentinel")?(ot=()=>{$(b.EMPTY_ALARM_EDITS),W(null),Y(!1)},o[59]=ot):ot=o[59];const rt=ot;let at;o[60]!==z||o[61]!==U||o[62]!==rt||o[63]!==ae?(at=e=>{if(te.current||!ne.current)return;q(!1),X(null!==U&&(0,b.alarmSettingsChanged)(U,e.settings));const t=(0,b.alarmSettingsPatch)(e.settings,z);null!==t?ae.mutate(t,{onSuccess:e=>(0,u.alarmPatchLanded)(t,e.settings)?rt():Y(!0)}):rt()},o[60]=z,o[61]=U,o[62]=rt,o[63]=ae,o[64]=at):at=o[64];const lt=at;let st;o[65]!==Xe||o[66]!==ee||o[67]!==qe||o[68]!==lt?(st=()=>{null===qe||Xe||(q(!0),K(null),Y(!1),ee().then(lt,e=>{ne.current&&(q(!1),K(e instanceof Error?e:new Error(String(e))))}))},o[65]=Xe,o[66]=ee,o[67]=qe,o[68]=lt,o[69]=st):st=o[69];const it=st,ct=_(J),dt=_(ae.error);let mt;o[70]!==r.coverage||o[71]!==f?(mt=r.coverage.find(e=>e.mode===f)??r.coverage[0],o[70]=r.coverage,o[71]=f,o[72]=mt):mt=o[72];const ut=mt,gt=l.default;let ft,vt;o[73]===Symbol.for("react.memo_cache_sentinel")?(ft={gap:I.SPACING.xl},o[73]=ft):ft=o[73],o[74]!==r.live||o[75]!==a?(vt=(0,k.jsx)(T.StateSection,{panelId:a,live:r.live}),o[74]=r.live,o[75]=a,o[76]=vt):vt=o[76];const yt=void 0!==ut?(0,k.jsx)(F.SegmentedControl,{options:r.coverage.map(e=>({value:e.mode,label:`${N(`v2.accessories.armMode.${e.mode}`)} ${We(e.mode,e).length}`})),value:ut.mode,onChange:A}):null;let St,ht;o[77]!==$e?(St=null!==$e?(0,k.jsx)(T.SensorsFailedNote,{onRetry:$e}):null,o[77]=$e,o[78]=St):St=o[78],o[79]!==Ue.notice?(ht=null!==Ue.notice?(0,k.jsx)(M,{notice:Ue.notice}):null,o[79]=Ue.notice,o[80]=ht):ht=o[80];const pt=void 0===ut?null:(0,k.jsx)(T.ModeCard,{coverage:ut,live:r.live,options:Ee.get(ut.mode)??{ids:[],unresolved:!0},openingsState:ge,onRetryOpenings:ve,nameOf:De,rows:We(ut.mode,ut),inFlight:Ue.inFlight,onSwitch:(e,t)=>Ue.press(ut.mode,e,t),zones:Se,delays:{exitDelaySec:(0,b.modeDelayView)(ke,z,ut.mode,"exitDelaySec"),entryDelaySec:(0,b.modeDelayView)(ke,z,ut.mode,"entryDelaySec"),triggeredDurationSec:(0,b.modeDelayView)(ke,z,ut.mode,"triggeredDurationSec")},onDelayType:(e,t)=>nt(n=>(0,b.typeModeDelay)(n,ut.mode,e,t)),onDelayCommit:e=>$(t=>(0,b.commitModeDelay)(t,ut.mode,e)),onDelayDefault:e=>nt(t=>(0,b.setModeDelayDefault)(t,ut.mode,e)),disabled:Xe},ut.mode),xt=le.data;let wt,bt,Dt,jt,At,It,Nt;o[81]!==le?(wt=R(le),o[81]=le,o[82]=wt):wt=o[82],o[83]!==le?(bt=()=>{le.refetch()},o[83]=le,o[84]=bt):bt=o[84],o[85]!==nt||o[86]!==ke?(Dt=e=>nt(t=>(0,b.toggleTargetEdit)(t,ke,e)),o[85]=nt,o[86]=ke,o[87]=Dt):Dt=o[87],o[88]!==Xe||o[89]!==wt||o[90]!==bt||o[91]!==Dt||o[92]!==le.data||o[93]!==Ye.announceTargets?(jt=(0,k.jsx)(T.RecipientsSection,{targets:xt,targetsState:wt,onRetryTargets:bt,selected:Ye.announceTargets,disabled:Xe,onToggle:Dt}),o[88]=Xe,o[89]=wt,o[90]=bt,o[91]=Dt,o[92]=le.data,o[93]=Ye.announceTargets,o[94]=jt):jt=o[94],o[95]!==nt?(At=(e,t)=>nt(n=>(0,b.typeDelay)(n,e,t)),o[95]=nt,o[96]=At):At=o[96],o[97]===Symbol.for("react.memo_cache_sentinel")?(It=e=>$(t=>(0,b.commitDelay)(t,e)),o[97]=It):It=o[97],o[98]!==Xe||o[99]!==z.delays||o[100]!==At||o[101]!==Ye?(Nt=(0,k.jsx)(T.DelaysSection,{values:Ye,raw:z.delays,disabled:Xe,onType:At,onCommit:It}),o[98]=Xe,o[99]=z.delays,o[100]=At,o[101]=Ye,o[102]=Nt):Nt=o[102];const _t=null!==ct?(0,k.jsx)(T.AlarmNote,{text:N("v2.nc.alarm.refreshFailed",{error:ct}),tone:"danger",testID:"alarm-refresh-failed"}):null;let Ft;o[103]!==Qe||o[104]!==Q||o[105]!==N?(Ft=Qe||Q?(0,k.jsx)(T.AlarmNote,{text:N("v2.nc.alarm.changedElsewhere"),tone:"warning",testID:"alarm-changed-elsewhere"}):null,o[103]=Qe,o[104]=Q,o[105]=N,o[106]=Ft):Ft=o[106];const Tt=null!==dt?(0,k.jsx)(T.AlarmNote,{text:N("v2.nc.alarm.saveFailed",{error:dt}),tone:"danger"}):null;let kt,Rt,Et,Ct,Mt;return o[107]!==H||o[108]!==N?(kt=H?(0,k.jsx)(T.AlarmNote,{text:N("v2.nc.alarm.saveNotLanded"),tone:"danger",testID:"alarm-save-not-landed"}):null,o[107]=H,o[108]=N,o[109]=kt):kt=o[109],o[110]!==Je||o[111]!==N?(Rt=Je?(0,k.jsx)(T.AlarmNote,{text:N("v2.nc.alarm.unsaved"),tone:"warning"}):null,o[110]=Je,o[111]=N,o[112]=Rt):Rt=o[112],o[113]!==z||o[114]!==ke?(Et=(0,b.draftVisiblyDiffers)(ke,z),o[113]=z,o[114]=ke,o[115]=Et):Et=o[115],o[116]!==Xe||o[117]!==Je||o[118]!==it||o[119]!==rt||o[120]!==Et?(Ct=(0,k.jsx)(G,{dirty:Je,discardable:Et,busy:Xe,onSave:it,onDiscard:rt}),o[116]=Xe,o[117]=Je,o[118]=it,o[119]=rt,o[120]=Et,o[121]=Ct):Ct=o[121],o[122]!==gt||o[123]!==ft||o[124]!==vt||o[125]!==yt||o[126]!==St||o[127]!==ht||o[128]!==pt||o[129]!==jt||o[130]!==Nt||o[131]!==_t||o[132]!==Ft||o[133]!==Tt||o[134]!==kt||o[135]!==Rt||o[136]!==Ct?(Mt=(0,k.jsxs)(gt,{style:ft,children:[vt,yt,St,ht,pt,jt,Nt,_t,Ft,Tt,kt,Rt,Ct]}),o[122]=gt,o[123]=ft,o[124]=vt,o[125]=yt,o[126]=St,o[127]=ht,o[128]=pt,o[129]=jt,o[130]=Nt,o[131]=_t,o[132]=Ft,o[133]=Tt,o[134]=kt,o[135]=Rt,o[136]=Ct,o[137]=Mt):Mt=o[137],Mt}function L(e,t){return e-t}function O(e){return[e.id,e]}function V(e){return[e.id,e]}function G(e){const n=(0,t.c)(38),{dirty:c,discardable:d,busy:u,onSave:f,onDiscard:v}=e,{t:y}=(0,s.useTranslation)(),{colors:S}=(0,A.useTheme)(),h=!c||u;let p;n[0]===Symbol.for("react.memo_cache_sentinel")?(p={flexDirection:"row",gap:I.SPACING.md},n[0]=p):p=n[0];const x=!d||u,w=!d||u?.6:1;let b,D,j,N,_;n[1]!==S.border||n[2]!==w?(b={flex:1,alignItems:"center",paddingVertical:I.SPACING.lg,borderRadius:I.RADIUS.lg,borderWidth:1,borderColor:S.border,opacity:w},n[1]=S.border,n[2]=w,n[3]=b):b=n[3],n[4]!==S.foreground?(D={color:S.foreground,fontSize:15,fontWeight:"600"},n[4]=S.foreground,n[5]=D):D=n[5],n[6]!==y?(j=y("v2.nc.alarm.discard"),n[6]=y,n[7]=j):j=n[7],n[8]!==D||n[9]!==j?(N=(0,k.jsx)(a.default,{style:D,children:j}),n[8]=D,n[9]=j,n[10]=N):N=n[10],n[11]!==v||n[12]!==x||n[13]!==b||n[14]!==N?(_=(0,k.jsx)(r.default,{accessibilityRole:"button",disabled:x,onPress:v,style:b,children:N}),n[11]=v,n[12]=x,n[13]=b,n[14]=N,n[15]=_):_=n[15];const F=h?.6:1;let T,R,E,C,M,P,B;return n[16]!==S.primary||n[17]!==F?(T={flex:1,flexDirection:"row",justifyContent:"center",alignItems:"center",gap:I.SPACING.sm,paddingVertical:I.SPACING.lg,borderRadius:I.RADIUS.lg,backgroundColor:S.primary,opacity:F},n[16]=S.primary,n[17]=F,n[18]=T):T=n[18],n[19]!==u||n[20]!==S.primaryForeground?(R=u?(0,k.jsx)(o.default,{size:"small",color:S.primaryForeground}):null,n[19]=u,n[20]=S.primaryForeground,n[21]=R):R=n[21],n[22]!==S.primaryForeground?(E={color:S.primaryForeground,fontSize:15,fontWeight:"600"},n[22]=S.primaryForeground,n[23]=E):E=n[23],n[24]!==y?(C=y("v2.nc.alarm.save"),n[24]=y,n[25]=C):C=n[25],n[26]!==E||n[27]!==C?(M=(0,k.jsx)(a.default,{style:E,children:C}),n[26]=E,n[27]=C,n[28]=M):M=n[28],n[29]!==f||n[30]!==h||n[31]!==T||n[32]!==R||n[33]!==M?(P=(0,k.jsxs)(r.default,{accessibilityRole:"button",disabled:h,onPress:f,style:T,children:[R,M]}),n[29]=f,n[30]=h,n[31]=T,n[32]=R,n[33]=M,n[34]=P):P=n[34],n[35]!==P||n[36]!==_?(B=(0,k.jsxs)(l.default,{style:p,children:[_,P]}),n[35]=P,n[36]=_,n[37]=B):B=n[37],B}},2567,[15,17,237,252,198,20,1072,743,2557,1104,1948,2028,2030,2568,2056,2029,2513,2505,2569,2020,1912,782,790,2488,2487,1978,2570,10]);
|
|
4468
4468
|
__d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,'__esModule',{value:!0}),Object.defineProperty(e,"AlarmTargetRowSchema",{enumerable:!0,get:function(){return b}}),e.parseAlarmTargets=w,e.useHouseholdOpenings=function(){const n=(0,t.c)(5),s=(0,A.useAdminVerdict)(),c=(0,l.useDeviceIdsByCaps)(u.ALARM_OPENING_CAP_NAMES,"admin"===s);let o;n[0]!==c.data?(o=c.data??[],n[0]=c.data,n[1]=o):o=n[1];const y=(0,f.useDevicesByIds)(o);let p;n[2]!==c||n[3]!==y?(p={ids:c,rows:y},n[2]=c,n[3]=y,n[4]=p):p=n[4];return p},e.useAlarmTargets=function(){const s=(0,t.c)(6),{controller:c,state:u}=(0,o.useConnection)(),l=(0,A.useAdminVerdict)();let f;s[0]===Symbol.for("react.memo_cache_sentinel")?(f=["v2","alarm-targets"],s[0]=f):f=s[0];const b="connected"===u&&"admin"===l;let h,T;s[1]!==c?(h=async()=>{const t=c.getSystem();if(!t)throw(0,p.ncNotConnectedError)();const n=w(await(0,y.capQuery)(t.trpcClient,"notificationOutput","listTargets",{},{rethrow:!0}));if(null===n)throw new Error("notification targets unreadable");return n},s[1]=c,s[2]=h):h=s[2];s[3]!==b||s[4]!==h?(T={queryKey:f,enabled:b,staleTime:_,queryFn:h},s[3]=b,s[4]=h,s[5]=T):T=s[5];return(0,n.useQuery)(T)};var t=r(d[0]),n=r(d[1]),s=r(d[2]),c=r(d[3]),o=r(d[4]),u=r(d[5]),l=r(d[6]),f=r(d[7]),y=r(d[8]),p=r(d[9]),A=r(d[10]);const _=6e4,b=s.TargetSchema.pick({id:!0,name:!0,kind:!0,enabled:!0}),h=c.z.array(b);function w(t){const n=h.safeParse(t);return n.success?n.data:null}},2568,[15,1594,1104,1109,1210,2569,2514,2513,1654,2019,1948]);
|
|
4469
|
-
__d(function(g,r,i,_a,m,e,_d){"use strict";Object.defineProperty(e,'__esModule',{value:!0}),Object.defineProperty(e,"EMPTY_ALARM_EDITS",{enumerable:!0,get:function(){return o}}),Object.defineProperty(e,"ALARM_MAX_RECIPIENTS",{enumerable:!0,get:function(){return c}}),Object.defineProperty(e,"ALARM_DELAY_MAX",{enumerable:!0,get:function(){return s}}),Object.defineProperty(e,"ALARM_OPENING_CAP_NAMES",{enumerable:!0,get:function(){return
|
|
4470
|
-
__d(function(g,r,i,a,m,_e,_d){"use strict";function e(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(_e,'__esModule',{value:!0}),_e.labelText=S,_e.AlarmNote=I,_e.RetryNote=w,_e.SensorsFailedNote=function(e){const t=(0,n.c)(24),{onRetry:c}=e,{t:u}=(0,d.useTranslation)(),{colors:f}=(0,p.useTheme)();let v,y,x,b,S,D,I,w,C,T;t[0]===Symbol.for("react.memo_cache_sentinel")?(v={gap:h.SPACING.sm,alignItems:"flex-start"},t[0]=v):v=t[0];t[1]!==f.warning?(y={color:f.warning,fontSize:13},t[1]=f.warning,t[2]=y):y=t[2];t[3]!==u?(x=u("v2.nc.alarm.table.sensorsFailed"),t[3]=u,t[4]=x):x=t[4];t[5]!==y||t[6]!==x?(b=(0,j.jsx)(l.default,{style:y,children:x}),t[5]=y,t[6]=x,t[7]=b):b=t[7];t[8]!==f.border?(S={paddingHorizontal:h.SPACING.lg,paddingVertical:h.SPACING.sm,borderRadius:h.RADIUS.md,borderWidth:1,borderColor:f.border},t[8]=f.border,t[9]=S):S=t[9];t[10]!==f.foreground?(D={color:f.foreground,fontSize:14,fontWeight:"600"},t[10]=f.foreground,t[11]=D):D=t[11];t[12]!==u?(I=u("v2.nc.alarm.retry"),t[12]=u,t[13]=I):I=t[13];t[14]!==D||t[15]!==I?(w=(0,j.jsx)(l.default,{style:D,children:I}),t[14]=D,t[15]=I,t[16]=w):w=t[16];t[17]!==c||t[18]!==S||t[19]!==w?(C=(0,j.jsx)(o.default,{accessibilityRole:"button",onPress:c,style:S,children:w}),t[17]=c,t[18]=S,t[19]=w,t[20]=C):C=t[20];t[21]!==b||t[22]!==C?(T=(0,j.jsxs)(s.default,{testID:"alarm-sensors-failed",style:v,children:[b,C]}),t[21]=b,t[22]=C,t[23]=T):T=t[23];return T},_e.StateSection=function(e){const t=(0,n.c)(22),{panelId:o,live:s}=e,{t:u}=(0,d.useTranslation)(),{colors:v}=(0,p.useTheme)();let y,x,h,b,S,D,w;t[0]!==u?(y=u("v2.nc.alarm.sections.state"),t[0]=u,t[1]=y):y=t[1];t[2]!==v||t[3]!==s||t[4]!==u?(x=void 0===s?(0,j.jsx)(I,{text:u("v2.nc.alarm.liveUnknown"),tone:"warning"}):(0,j.jsx)(l.default,{testID:"alarm-state",style:{color:v.foreground,fontSize:16,fontWeight:"600"},children:T(s,u)}),t[2]=v,t[3]=s,t[4]=u,t[5]=x):x=t[5];t[6]!==s?.exclusions?(h=s?.exclusions??[],t[6]=s?.exclusions,t[7]=h):h=t[7];if(t[8]!==u||t[9]!==h){let e;t[11]!==u?(e=e=>(0,j.jsx)(I,{text:u("open"===e.phase?"v2.nc.alarm.exclusionOpen":"v2.nc.alarm.exclusionClosed",{name:""!==e.name?e.name:u("v2.nc.rules.editor.deviceUnknown",{id:e.deviceId})})},e.deviceId),t[11]=u,t[12]=e):e=t[12],b=h.map(e),t[8]=u,t[9]=h,t[10]=b}else b=t[10];t[13]!==o?(S=(0,j.jsx)(f.AlarmControl,{deviceId:o,online:!0}),t[13]=o,t[14]=S):S=t[14];t[15]!==x||t[16]!==b||t[17]!==S?(D=(0,j.jsxs)(C,{children:[x,b,S]}),t[15]=x,t[16]=b,t[17]=S,t[18]=D):D=t[18];t[19]!==y||t[20]!==D?(w=(0,j.jsx)(c.Section,{title:y,children:D}),t[19]=y,t[20]=D,t[21]=w):w=t[21];return w},_e.ModeCard=function(e){const t=(0,n.c)(96),{coverage:o,live:s,options:u,openingsState:f,nameOf:x,disabled:T}=e,{t:A}=(0,d.useTranslation)(),{colors:_}=(0,p.useTheme)();let z;t[0]!==u?(z=(0,y.nonBlockingEmptyLine)(u),t[0]=u,t[1]=z):z=t[1];const N=z,$=!u.unresolved;let K;t[2]!==e.rows.length||t[3]!==$?(K=(0,v.alarmSensorTableState)({rowCount:e.rows.length,candidatesComplete:$}),t[2]=e.rows.length,t[3]=$,t[4]=K):K=t[4];const G=K;let M,W,U,O,F,H,E,L,B,V,Z,X,Y,q,J;if(t[5]!==_.foreground||t[6]!==o||t[7]!==T||t[8]!==s||t[9]!==x||t[10]!==e.delays||t[11]!==e.onDelayCommit||t[12]!==e.onDelayDefault||t[13]!==e.onDelayType||t[14]!==A){const n=D(o.mode,A);let d;t[23]!==x||t[24]!==A?(d=e=>`${S(x(e.deviceId),e.deviceId,A)} (${A(`v2.nc.alarm.skipReason.${e.reason}`)})`,t[23]=x,t[24]=A,t[25]=d):d=t[25];const u=o.skippedDevices.map(d).join(", ");let f;U=c.Section,H=n,t[26]!==o||t[27]!==x||t[28]!==A?(f=R(o,x,A),t[26]=o,t[27]=x,t[28]=A,t[29]=f):f=t[29];const v=0===o.ruleCount?"warning":"muted",y=`alarm-coverage-${o.mode}`;let p;t[30]!==v||t[31]!==y||t[32]!==f?(p=(0,j.jsx)(I,{text:f,tone:v,testID:y}),t[30]=v,t[31]=y,t[32]=f,t[33]=p):p=t[33];const b=""!==u?(0,j.jsx)(I,{text:A("v2.nc.alarm.skipped",{devices:u}),tone:"warning"}):null;let w,z,N;t[34]!==o.mode||t[35]!==s||t[36]!==x?(w=(0,j.jsx)(k,{live:s,mode:o.mode,nameOf:x}),t[34]=o.mode,t[35]=s,t[36]=x,t[37]=w):w=t[37],t[38]!==p||t[39]!==b||t[40]!==w?(E=(0,j.jsxs)(C,{children:[p,b,w]}),t[38]=p,t[39]=b,t[40]=w,t[41]=E):E=t[41],t[42]!==o.mode||t[43]!==T||t[44]!==e.delays||t[45]!==e.onDelayCommit||t[46]!==e.onDelayDefault||t[47]!==e.onDelayType?(L=(0,j.jsx)(P,{mode:o.mode,views:e.delays,disabled:T,onType:e.onDelayType,onCommit:e.onDelayCommit,onUseDefault:e.onDelayDefault}),t[42]=o.mode,t[43]=T,t[44]=e.delays,t[45]=e.onDelayCommit,t[46]=e.onDelayDefault,t[47]=e.onDelayType,t[48]=L):L=t[48],W=C,t[49]!==_.foreground?(z={color:_.foreground,fontSize:14,fontWeight:"600",marginTop:h.SPACING.sm},t[49]=_.foreground,t[50]=z):z=t[50],t[51]!==A?(N=A("v2.nc.alarm.table.title"),t[51]=A,t[52]=N):N=t[52],t[53]!==z||t[54]!==N?(F=(0,j.jsx)(l.default,{style:z,children:N}),t[53]=z,t[54]=N,t[55]=F):F=t[55],M=I,O=A("v2.nc.alarm.table.hint",{mode:n}),t[5]=_.foreground,t[6]=o,t[7]=T,t[8]=s,t[9]=x,t[10]=e.delays,t[11]=e.onDelayCommit,t[12]=e.onDelayDefault,t[13]=e.onDelayType,t[14]=A,t[15]=M,t[16]=W,t[17]=U,t[18]=O,t[19]=F,t[20]=H,t[21]=E,t[22]=L}else M=t[15],W=t[16],U=t[17],O=t[18],F=t[19],H=t[20],E=t[21],L=t[22];t[56]!==M||t[57]!==O?(B=(0,j.jsx)(M,{text:O}),t[56]=M,t[57]=O,t[58]=B):B=t[58];t[59]!==f||t[60]!==u.unresolved||t[61]!==A?(V=u.unresolved&&"pending"===f?(0,j.jsx)(I,{text:A("v2.nc.alarm.openingsChecking")}):null,t[59]=f,t[60]=u.unresolved,t[61]=A,t[62]=V):V=t[62];t[63]!==f||t[64]!==u.unresolved||t[65]!==e.onRetryOpenings||t[66]!==A?(Z=u.unresolved&&"failed"===f?(0,j.jsx)(w,{text:A("v2.nc.alarm.openingsCheckFailed"),onRetry:e.onRetryOpenings}):null,t[63]=f,t[64]=u.unresolved,t[65]=e.onRetryOpenings,t[66]=A,t[67]=Z):Z=t[67];t[68]!==o.mode||t[69]!==N||t[70]!==A||t[71]!==G?(X=null!==N?(0,j.jsx)(I,{testID:`alarm-nonblocking-empty-${o.mode}`,text:A("v2.nc.alarm.nonBlockingEmpty")}):"none"===G?(0,j.jsx)(I,{testID:`alarm-sensors-none-${o.mode}`,text:A("v2.nc.alarm.table.none")}):null,t[68]=o.mode,t[69]=N,t[70]=A,t[71]=G,t[72]=X):X=t[72];t[73]!==W||t[74]!==Z||t[75]!==X||t[76]!==F||t[77]!==B||t[78]!==V?(Y=(0,j.jsxs)(W,{children:[F,B,V,Z,X]}),t[73]=W,t[74]=Z,t[75]=X,t[76]=F,t[77]=B,t[78]=V,t[79]=Y):Y=t[79];t[80]!==o.mode||t[81]!==T||t[82]!==N||t[83]!==e.inFlight||t[84]!==e.onSwitch||t[85]!==e.rows||t[86]!==e.zones||t[87]!==G?(q=null===N&&"rows"===G?(0,j.jsx)(b.AlarmSensorTable,{mode:o.mode,rows:e.rows,inFlight:e.inFlight,onSwitch:e.onSwitch,zones:e.zones,disabled:T}):null,t[80]=o.mode,t[81]=T,t[82]=N,t[83]=e.inFlight,t[84]=e.onSwitch,t[85]=e.rows,t[86]=e.zones,t[87]=G,t[88]=q):q=t[88];t[89]!==U||t[90]!==Y||t[91]!==q||t[92]!==H||t[93]!==E||t[94]!==L?(J=(0,j.jsxs)(U,{title:H,children:[E,L,Y,q]}),t[89]=U,t[90]=Y,t[91]=q,t[92]=H,t[93]=E,t[94]=L,t[95]=J):J=t[95];return J},_e.RecipientsSection=function(e){const o=(0,n.c)(41),{targets:l,targetsState:s,selected:f,disabled:v,onToggle:x}=e,{t:h}=(0,d.useTranslation)(),{colors:b}=(0,p.useTheme)();let S;o[0]!==l?(S=new Set((l??[]).map(A)),o[0]=l,o[1]=S):S=o[1];const D=S;let T;o[2]!==f?(T=(0,y.recipientsAtLimit)(f),o[2]=f,o[3]=T):T=o[3];const R=T;let k;if(o[4]!==R||o[5]!==b||o[6]!==v||o[7]!==D||o[8]!==x||o[9]!==e.onRetryTargets||o[10]!==f||o[11]!==h||o[12]!==l||o[13]!==s){const n="answered"===s?f.filter(e=>!D.has(e)):[],d=[...(l??[]).map(e=>({id:e.id,label:e.name,description:e.enabled?void 0:h("v2.nc.alarm.targetDisabled")})),...n.map(e=>({id:e,label:h("v2.nc.alarm.targetUnlisted",{id:e}),description:void 0}))];let p,S,T,A,_;o[15]!==h?(p=h("v2.nc.alarm.sections.recipients"),o[15]=h,o[16]=p):p=o[16],o[17]!==h?(S=h("v2.nc.alarm.recipientsHint"),o[17]=h,o[18]=S):S=o[18],o[19]!==S?(T=(0,j.jsx)(I,{text:S}),o[19]=S,o[20]=T):T=o[20],o[21]!==b||o[22]!==s?(A="pending"===s?(0,j.jsx)(t.default,{size:"small",color:b.foregroundSubtle}):null,o[21]=b,o[22]=s,o[23]=A):A=o[23],o[24]!==e.onRetryTargets||o[25]!==h||o[26]!==s?(_="failed"===s?(0,j.jsx)(w,{text:h("v2.nc.alarm.targetsFailed"),onRetry:e.onRetryTargets}):null,o[24]=e.onRetryTargets,o[25]=h,o[26]=s,o[27]=_):_=o[27];const z="answered"===s&&0===d.length?(0,j.jsx)(I,{text:h("v2.nc.alarm.targetsEmpty")}):null;let N,P,$;o[28]!==R||o[29]!==h?(N=R?(0,j.jsx)(I,{text:h("v2.nc.alarm.recipientsLimit",{max:y.ALARM_MAX_RECIPIENTS}),testID:"alarm-recipients-limit"}):null,o[28]=R,o[29]=h,o[30]=N):N=o[30],o[31]!==f||o[32]!==h?(P=(0,y.recipientsWarning)(f)?(0,j.jsx)(I,{text:h("v2.nc.alarm.recipientsNone"),tone:"warning",testID:"alarm-no-recipient"}):null,o[31]=f,o[32]=h,o[33]=P):P=o[33],o[34]!==P||o[35]!==T||o[36]!==A||o[37]!==_||o[38]!==z||o[39]!==N?($=(0,j.jsxs)(C,{children:[T,A,_,z,N,P]}),o[34]=P,o[35]=T,o[36]=A,o[37]=_,o[38]=z,o[39]=N,o[40]=$):$=o[40],k=(0,j.jsxs)(c.Section,{title:p,children:[$,d.map((e,n)=>(0,j.jsx)(u.ToggleRow,{label:e.label,description:e.description,value:f.includes(e.id),disabled:v||R&&!f.includes(e.id),last:n===d.length-1,onValueChange:()=>x(e.id)},e.id))]}),o[4]=R,o[5]=b,o[6]=v,o[7]=D,o[8]=x,o[9]=e.onRetryTargets,o[10]=f,o[11]=h,o[12]=l,o[13]=s,o[14]=k}else k=o[14];return k},_e.ModeDelays=P,_e.DelaysSection=function(e){const t=(0,n.c)(11),{values:o,raw:l,disabled:s,onType:u,onCommit:f}=e,{t:v}=(0,d.useTranslation)();let y,x,p;t[0]!==v?(y=v("v2.nc.alarm.sections.delays"),t[0]=v,t[1]=y):y=t[1];t[2]!==s||t[3]!==f||t[4]!==u||t[5]!==l||t[6]!==o?(x=N.map((e,n)=>(0,j.jsx)(z,Object.assign({},e,{value:o[e.field],raw:l[e.field],disabled:s,onType:u,onCommit:f,last:n===N.length-1}),e.field)),t[2]=s,t[3]=f,t[4]=u,t[5]=l,t[6]=o,t[7]=x):x=t[7];t[8]!==y||t[9]!==x?(p=(0,j.jsx)(c.Section,{title:y,children:x}),t[8]=y,t[9]=x,t[10]=p):p=t[10];return p};var n=r(_d[0]);r(_d[1]);var t=e(r(_d[2])),o=e(r(_d[3])),l=e(r(_d[4])),s=e(r(_d[5])),d=r(_d[6]),c=r(_d[7]),u=r(_d[8]),f=r(_d[9]),v=r(_d[10]),y=r(_d[11]),x=r(_d[12]),p=r(_d[13]),h=r(_d[14]),b=r(_d[15]),j=r(_d[16]);function S(e,n,t){return'named'===e.kind?e.name:'removed'===e.kind?t('v2.nc.rules.editor.deviceRemoved',{id:n}):t('v2.nc.rules.editor.deviceUnknown',{id:n})}function D(e,n){return n(`v2.accessories.armMode.${e}`)}function I(e){const t=(0,n.c)(6),{text:o,tone:s,testID:d}=e,c=void 0===s?"muted":s,{colors:u}=(0,p.useTheme)(),f="warning"===c?u.warning:"danger"===c?u.danger:u.foregroundSubtle;let v,y;return t[0]!==f?(v={color:f,fontSize:13,lineHeight:18},t[0]=f,t[1]=v):v=t[1],t[2]!==v||t[3]!==d||t[4]!==o?(y=(0,j.jsx)(l.default,{testID:d,style:v,children:o}),t[2]=v,t[3]=d,t[4]=o,t[5]=y):y=t[5],y}function w(e){const t=(0,n.c)(19),{text:c,onRetry:u}=e,{t:f}=(0,d.useTranslation)(),{colors:v}=(0,p.useTheme)();let y,x,b,S,D,w,C,T;return t[0]===Symbol.for("react.memo_cache_sentinel")?(y={gap:h.SPACING.sm,alignItems:"flex-start"},t[0]=y):y=t[0],t[1]!==c?(x=(0,j.jsx)(I,{text:c,tone:"danger"}),t[1]=c,t[2]=x):x=t[2],t[3]!==v.border?(b={paddingHorizontal:h.SPACING.lg,paddingVertical:h.SPACING.sm,borderRadius:h.RADIUS.md,borderWidth:1,borderColor:v.border},t[3]=v.border,t[4]=b):b=t[4],t[5]!==v.foreground?(S={color:v.foreground,fontSize:14,fontWeight:"600"},t[5]=v.foreground,t[6]=S):S=t[6],t[7]!==f?(D=f("v2.nc.alarm.retry"),t[7]=f,t[8]=D):D=t[8],t[9]!==S||t[10]!==D?(w=(0,j.jsx)(l.default,{style:S,children:D}),t[9]=S,t[10]=D,t[11]=w):w=t[11],t[12]!==u||t[13]!==b||t[14]!==w?(C=(0,j.jsx)(o.default,{accessibilityRole:"button",onPress:u,style:b,children:w}),t[12]=u,t[13]=b,t[14]=w,t[15]=C):C=t[15],t[16]!==x||t[17]!==C?(T=(0,j.jsxs)(s.default,{style:y,children:[x,C]}),t[16]=x,t[17]=C,t[18]=T):T=t[18],T}function C(e){const t=(0,n.c)(3),{children:o}=e;let l,d;return t[0]===Symbol.for("react.memo_cache_sentinel")?(l={padding:h.SPACING.xl,gap:h.SPACING.sm},t[0]=l):l=t[0],t[1]!==o?(d=(0,j.jsx)(s.default,{style:l,children:o}),t[1]=o,t[2]=d):d=t[2],d}function T(e,n){const t=n(`v2.nc.alarm.stateWord.${e.state.startsWith('armed_')?'armed':e.state}`);return'disarmed'===e.state||null===e.targetMode?t:n('v2.nc.alarm.stateWithMode',{state:t,mode:D(e.targetMode,n)})}function R(e,n,t){const o=(0,y.alarmCoverageLine)(e);switch(o.kind){case'none':return t('v2.nc.alarm.coverageNone');case'allExcept':{const e=o.ids.map(e=>S(n(e),e,t));return t('v2.nc.alarm.coverageAllExcept',{count:o.ids.length,devices:e.join(', ')})}case'all':return t('v2.nc.alarm.coverageAll',{count:o.ruleCount});case'rules':return t('v2.nc.alarm.coverageRules',{count:o.ruleCount});case'devices':return t('v2.nc.alarm.coverageDevices',{devices:o.ids.map(e=>S(n(e),e,t)).join(', ')})}}function k(e){const t=(0,n.c)(22),{live:o,mode:l,nameOf:c}=e,{t:u}=(0,d.useTranslation)();let f,v;if(t[0]!==o||t[1]!==l||t[2]!==c||t[3]!==u){v=Symbol.for("react.early_return_sentinel");e:{const e=(0,y.openingsSummary)(o,l),n=o?.openings.find(e=>e.mode===l);if(null===e||void 0===n){let e,n;t[6]!==u?(e=u("v2.nc.alarm.openingsUnknown"),t[6]=u,t[7]=e):e=t[7],t[8]!==e?(n=(0,j.jsx)(I,{text:e}),t[8]=e,t[9]=n):n=t[9],v=n;break e}if(0===n.devices.length&&0===n.unknown.length){let e,n;t[10]!==u?(e=u("v2.nc.alarm.openingsNone"),t[10]=u,t[11]=e):e=t[11],t[12]!==e?(n=(0,j.jsx)(I,{text:e}),t[12]=e,t[13]=n):n=t[13],v=n;break e}let d;t[14]===Symbol.for("react.memo_cache_sentinel")?(d={gap:2},t[14]=d):d=t[14];const x=u("v2.nc.alarm.openingsCount",{blocking:e.blocking,nonBlocking:e.nonBlocking,unknown:e.unknown});let p,h,b;t[15]!==x?(p=(0,j.jsx)(I,{text:x}),t[15]=x,t[16]=p):p=t[16],t[17]!==u?(h=e=>(0,j.jsx)(I,{tone:e.blocking?"warning":"muted",text:u(e.blocking?"v2.nc.alarm.openingBlocking":"v2.nc.alarm.openingNonBlocking",{name:""!==e.name?e.name:u("v2.nc.rules.editor.deviceUnknown",{id:e.deviceId}),state:e.state})},e.deviceId),t[17]=u,t[18]=h):h=t[18],t[19]!==c||t[20]!==u?(b=e=>(0,j.jsx)(I,{text:u("v2.nc.alarm.openingUnreadable",{name:S(c(e),e,u)})},`u${e}`),t[19]=c,t[20]=u,t[21]=b):b=t[21],f=(0,j.jsxs)(s.default,{style:d,testID:`alarm-openings-${l}`,children:[p,n.devices.map(h),n.unknown.map(b)]})}t[0]=o,t[1]=l,t[2]=c,t[3]=u,t[4]=f,t[5]=v}else f=t[4],v=t[5];return v!==Symbol.for("react.early_return_sentinel")?v:f}function A(e){return e.id}function _(e,n,t){if(e<=0)return t(n);if(e<60)return t('v2.nc.alarm.seconds',{seconds:e});const o=Math.floor(e/60),l=e%60;return 0===l?t('v2.nc.alarm.minutes',{minutes:o}):t('v2.nc.alarm.minutesSeconds',{minutes:o,seconds:l})}function z(e){const t=(0,n.c)(35),{field:o,labelKey:l,hintKey:c,zeroKey:u,value:f,raw:v,disabled:p,onType:b,onCommit:S,testIdPrefix:D,footer:w,last:C}=e,T=void 0===D?"alarm-delay":D,R=void 0!==C&&C,{t:k}=(0,d.useTranslation)();let A,z;t[0]!==l||t[1]!==k?(A=k(l),t[0]=l,t[1]=k,t[2]=A):A=t[2],t[3]!==c||t[4]!==k?(z=void 0!==c?{description:k(c)}:{},t[3]=c,t[4]=k,t[5]=z):z=t[5];const N=`${T}-${o}`,P=v??String(f);let $,K;t[6]!==o||t[7]!==b?($=e=>b(o,e),t[6]=o,t[7]=b,t[8]=$):$=t[8],t[9]!==o||t[10]!==S?(K=()=>S(o),t[9]=o,t[10]=S,t[11]=K):K=t[11];const G=!p;let M,W;t[12]===Symbol.for("react.memo_cache_sentinel")?(M={gap:h.SPACING.xs},t[12]=M):M=t[12],t[13]!==k||t[14]!==f||t[15]!==u?(W=_(f,u,k),t[13]=k,t[14]=f,t[15]=u,t[16]=W):W=t[16];const U=y.ALARM_DELAY_MAX[o];let O;t[17]!==k||t[18]!==U?(O=k("v2.nc.alarm.delayRange",{max:U}),t[17]=k,t[18]=U,t[19]=O):O=t[19];const F=`${W} \xb7 ${O}`;let H,E,L;return t[20]!==F?(H=(0,j.jsx)(I,{text:F}),t[20]=F,t[21]=H):H=t[21],t[22]!==w||t[23]!==H?(E=(0,j.jsxs)(s.default,{style:M,children:[H,w]}),t[22]=w,t[23]=H,t[24]=E):E=t[24],t[25]!==R||t[26]!==E||t[27]!==A||t[28]!==z||t[29]!==N||t[30]!==P||t[31]!==$||t[32]!==K||t[33]!==G?(L=(0,j.jsx)(x.LabeledInput,Object.assign({label:A},z,{testID:N,value:P,onChangeText:$,onBlur:K,editable:G,numeric:!0,returnKeyType:"done",last:R,footer:E})),t[25]=R,t[26]=E,t[27]=A,t[28]=z,t[29]=N,t[30]=P,t[31]=$,t[32]=K,t[33]=G,t[34]=L):L=t[34],L}const N=[{field:'exitDelaySec',labelKey:'v2.nc.alarm.exitDelay',hintKey:'v2.nc.alarm.exitHint',zeroKey:'v2.nc.alarm.exitZero'},{field:'entryDelaySec',labelKey:'v2.nc.alarm.entryDelay',hintKey:'v2.nc.alarm.entryHint',zeroKey:'v2.nc.alarm.entryZero'},{field:'triggeredDurationSec',labelKey:'v2.nc.alarm.triggeredFor',hintKey:'v2.nc.alarm.triggeredHint',zeroKey:'v2.nc.alarm.triggeredZero'}];function P(e){const t=(0,n.c)(22),{mode:c,views:u,disabled:f,onType:v,onCommit:y,onUseDefault:x}=e,{t:b}=(0,d.useTranslation)(),{colors:S}=(0,p.useTheme)(),w=`alarm-delays-${c}`;let C,T,R,k,A;return t[0]!==S.foreground?(C={color:S.foreground,fontSize:14,fontWeight:"600",paddingHorizontal:h.SPACING.xl,paddingTop:h.SPACING.md},t[0]=S.foreground,t[1]=C):C=t[1],t[2]!==c||t[3]!==b?(T=b("v2.nc.alarm.modeDelays.title",{mode:D(c,b)}),t[2]=c,t[3]=b,t[4]=T):T=t[4],t[5]!==C||t[6]!==T?(R=(0,j.jsx)(l.default,{style:C,children:T}),t[5]=C,t[6]=T,t[7]=R):R=t[7],t[8]!==S.border||t[9]!==S.foreground||t[10]!==f||t[11]!==c||t[12]!==y||t[13]!==v||t[14]!==x||t[15]!==b||t[16]!==u?(k=N.map(e=>{const n=u[e.field];return(0,j.jsx)(z,{field:e.field,labelKey:e.labelKey,zeroKey:e.zeroKey,value:n.value,raw:n.raw,disabled:f,onType:v,onCommit:y,testIdPrefix:`alarm-delay-${c}`,footer:n.inherited?(0,j.jsx)(I,{testID:`alarm-delay-${c}-${e.field}-inherited`,text:b("v2.nc.alarm.modeDelays.inherited",{seconds:n.defaultValue})}):(0,j.jsx)(o.default,{accessibilityRole:"button",testID:`alarm-delay-${c}-${e.field}-default`,disabled:f,onPress:()=>x(e.field),style:{alignSelf:"flex-start",paddingHorizontal:h.SPACING.lg,paddingVertical:h.SPACING.xs,borderRadius:h.RADIUS.md,borderWidth:1,borderColor:S.border},children:(0,j.jsx)(l.default,{style:{color:S.foreground,fontSize:13,fontWeight:"600"},children:b("v2.nc.alarm.modeDelays.useDefault")})})},e.field)}),t[8]=S.border,t[9]=S.foreground,t[10]=f,t[11]=c,t[12]=y,t[13]=v,t[14]=x,t[15]=b,t[16]=u,t[17]=k):k=t[17],t[18]!==w||t[19]!==R||t[20]!==k?(A=(0,j.jsxs)(s.default,{testID:w,children:[R,k]}),t[18]=w,t[19]=R,t[20]=k,t[21]=A):A=t[21],A}},2570,[15,17,237,252,198,20,1072,1975,1976,2027,2029,2569,2495,782,790,2571,10]);
|
|
4471
|
-
__d(function(g,_r,i,a,m,_e,d){"use strict";function e(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(_e,'__esModule',{value:!0}),_e.zoneLocationLabel=
|
|
4469
|
+
__d(function(g,r,i,_a,m,e,_d){"use strict";Object.defineProperty(e,'__esModule',{value:!0}),Object.defineProperty(e,"EMPTY_ALARM_EDITS",{enumerable:!0,get:function(){return o}}),Object.defineProperty(e,"ALARM_MAX_RECIPIENTS",{enumerable:!0,get:function(){return c}}),Object.defineProperty(e,"ALARM_DELAY_MAX",{enumerable:!0,get:function(){return s}}),Object.defineProperty(e,"ALARM_OPENING_CAP_NAMES",{enumerable:!0,get:function(){return a}}),e.clampDelay=u,e.parseDelayDraft=l,e.nonBlockingFor=function(n,t){return n.find(n=>n.mode===t)?.deviceIds??[]},e.nonBlockingOptions=function(n){const t=new Set;for(const o of n.live?.openings??[]){for(const n of o.devices)t.add(n.deviceId);for(const n of o.unknown)t.add(n)}for(const o of n.openingIds??[])t.add(o);for(const o of n.listed)t.add(o);return{ids:[...t].sort((n,t)=>n-t),unresolved:null===n.openingIds}},e.nonBlockingEmptyLine=function(n){return n.ids.length>0||n.unresolved?null:'no-opening'},e.alarmCoverageIds=function(n){return[...n.deviceIds,...n.allDevicesExcept,...n.skippedDevices.map(n=>n.deviceId)]},e.openingsSummary=function(n,t){const o=n?.openings.find(n=>n.mode===t);if(void 0===o)return null;const c=o.devices.filter(n=>n.blocking).length;return{blocking:c,nonBlocking:o.devices.length-c,unknown:o.unknown.length}},e.recipientsWarning=function(n){return 0===n.length},e.typeDelay=function(n,t,o){const c=Number(o.trim()),a=''!==o.trim()&&Number.isFinite(c)&&c>s[t]?String(s[t]):o;return Object.assign({},n,{delays:Object.assign({},n.delays,{[t]:a})})},e.commitDelay=function(n,t){const o=n.delays[t];if(void 0===o)return n;const c=l(t,o),s=Object.fromEntries(Object.entries(n.delays).filter(([n])=>n!==t));return Object.assign({},n,{delays:null===c?s:Object.assign({},s,{[t]:String(c)})})},e.draftVisiblyDiffers=function(t,o){if(null!==O(t,o))return!0;return!!d.some(n=>{const c=o.delays[n];return void 0!==c&&c!==String(t[n])})||h(o).some(({mode:o,field:c,edit:s})=>{if(null===s)return!1;const a=(0,n.resolveModeDelays)(t,o)[c];return s!==String(a)})},e.recipientsAtLimit=D,e.toggleTargetEdit=function(n,t,o){const c=y(t.announceTargets,n.targets),s=c.includes(o);return!s&&D(c)?n:Object.assign({},n,{targets:v(n.targets,o,s)})},e.effectiveAlarmSettings=b,e.alarmEditsEmpty=function(n){return 0===Object.keys(n.delays).length&&Object.values(n.modeDelays).every(n=>0===Object.keys(n??{}).length)&&0===n.targets.added.length&&0===n.targets.removed.length},e.alarmSettingsPatch=O,e.alarmSettingsChanged=function(n,t){return d.some(o=>n[o]!==t[o])||!S(n.announceTargets,t.announceTargets)||j.some(o=>d.some(c=>A(n,o,c)!==A(t,o,c)))},e.modeDelayView=function(n,t,o,c){const s=f(n,t,c),a=t.modeDelays[o]?.[c],u=A(n,o,c);if(null===a)return{value:s,raw:void 0,inherited:!0,defaultValue:s};if(void 0!==a){const n=l(c,a);return null!==n?{value:n,raw:a,inherited:!1,defaultValue:s}:{value:u??s,raw:a,inherited:void 0===u,defaultValue:s}}return{value:u??s,raw:void 0,inherited:void 0===u,defaultValue:s}},e.typeModeDelay=function(n,t,o,c){const a=Number(c.trim()),u=''!==c.trim()&&Number.isFinite(a)&&a>s[o]?String(s[o]):c;return M(n,t,o,u)},e.commitModeDelay=function(n,t,o){const c=n.modeDelays[t]?.[o];if('string'!=typeof c)return n;const s=l(o,c);return M(n,t,o,null===s?void 0:String(s))},e.setModeDelayDefault=function(n,t,o){return M(n,t,o,null)},e.alarmDeviceLabel=function(n,t,o){const c=o.get(n);if(void 0!==c&&''!==c)return{kind:'named',name:c};const s=t.get(n);return!0===s?.removed?{kind:'removed'}:void 0!==s?.name?{kind:'named',name:s.name}:{kind:'unnamed'}};var n=r(_d[0]),t=r(_d[1]);const o={delays:{},modeDelays:{},targets:{added:[],removed:[]}},c=16,s={exitDelaySec:n.NC_ALARM_DELAY_MAX_SEC,entryDelaySec:n.NC_ALARM_DELAY_MAX_SEC,triggeredDurationSec:n.NC_ALARM_TRIGGERED_MAX_SEC},a=['contact','cover','lock-control'];function u(n,t){const o=Math.round(t);return Math.min(s[n],Math.max(0,o))}function l(n,t){const o=t.trim();if(''===o)return null;const c=Number(o);return Number.isFinite(c)?u(n,c):null}const d=['exitDelaySec','entryDelaySec','triggeredDurationSec'];function f(n,t,o){const c=t.delays[o];return(void 0===c?null:l(o,c))??n[o]}function y(n,t){if(void 0===t)return[...n];const o=new Set(t.removed),c=n.filter(n=>!o.has(n));return[...c,...t.added.filter(n=>!c.includes(n))]}function v(n,t,o){const c=n.added.filter(n=>n!==t),s=n.removed.filter(n=>n!==t);return o?{added:c,removed:[...s,t]}:{added:[...c,t],removed:s}}function D(n){return n.length>=c}function b(n,t){return{exitDelaySec:f(n,t,'exitDelaySec'),entryDelaySec:f(n,t,'entryDelaySec'),triggeredDurationSec:f(n,t,'triggeredDurationSec'),announceTargets:y(n.announceTargets,t.targets)}}function S(n,t){const o=new Set(n),c=new Set(t);return o.size===c.size&&[...o].every(n=>c.has(n))}function O(n,t){const o=b(n,t),c={};for(const t of d)o[t]!==n[t]&&Object.assign(c,p(t,o[t]));const s=_(n,t),a=Object.assign({},c,S(o.announceTargets,n.announceTargets)?{}:{announceTargets:o.announceTargets},s.length>0?{modeDelays:s}:{});return 0===Object.keys(a).length?null:a}function p(n,t){return'exitDelaySec'===n?{exitDelaySec:t}:'entryDelaySec'===n?{entryDelaySec:t}:{triggeredDurationSec:t}}const j=t.AlarmArmModeSchema.options;function A(n,t,o){return(n.modeDelays??[]).find(n=>n.mode===t)?.[o]}function h(n){return j.flatMap(t=>d.flatMap(o=>{const c=n.modeDelays[t]?.[o];return void 0===c?[]:[{mode:t,field:o,edit:c}]}))}function M(n,t,o,c){const s=Object.fromEntries(Object.entries(n.modeDelays[t]??{}).filter(([n])=>n!==o)),a=void 0===c?s:Object.assign({},s,{[o]:c}),u=Object.fromEntries(Object.entries(n.modeDelays).filter(([n])=>n!==t));return Object.assign({},n,{modeDelays:0===Object.keys(a).length?u:Object.assign({},u,{[t]:a})})}function _(n,t){const o=[];for(const c of j){const s={};for(const o of d){const a=t.modeDelays[c]?.[o];if(void 0===a)continue;const u=A(n,c,o);if(null===a){void 0!==u&&(s[o]=null);continue}const d=l(o,a);null!==d&&(void 0!==u&&u===d||(s[o]=d))}Object.keys(s).length>0&&o.push(Object.assign({mode:c},s))}return o}},2569,[1104,2030]);
|
|
4470
|
+
__d(function(g,_r,i,a,m,_e,d){"use strict";function e(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(_e,'__esModule',{value:!0}),_e.labelText=j,_e.AlarmNote=I,_e.RetryNote=w,_e.SensorsFailedNote=function(e){const t=(0,n.c)(24),{onRetry:c}=e,{t:u}=(0,s.useTranslation)(),{colors:f}=(0,p.useTheme)();let y,v,x,b,j,D,I,w,C,T;t[0]===Symbol.for("react.memo_cache_sentinel")?(y={gap:h.SPACING.sm,alignItems:"flex-start"},t[0]=y):y=t[0];t[1]!==f.warning?(v={color:f.warning,fontSize:13},t[1]=f.warning,t[2]=v):v=t[2];t[3]!==u?(x=u("v2.nc.alarm.table.sensorsFailed"),t[3]=u,t[4]=x):x=t[4];t[5]!==v||t[6]!==x?(b=(0,S.jsx)(o.default,{style:v,children:x}),t[5]=v,t[6]=x,t[7]=b):b=t[7];t[8]!==f.border?(j={paddingHorizontal:h.SPACING.lg,paddingVertical:h.SPACING.sm,borderRadius:h.RADIUS.md,borderWidth:1,borderColor:f.border},t[8]=f.border,t[9]=j):j=t[9];t[10]!==f.foreground?(D={color:f.foreground,fontSize:14,fontWeight:"600"},t[10]=f.foreground,t[11]=D):D=t[11];t[12]!==u?(I=u("v2.nc.alarm.retry"),t[12]=u,t[13]=I):I=t[13];t[14]!==D||t[15]!==I?(w=(0,S.jsx)(o.default,{style:D,children:I}),t[14]=D,t[15]=I,t[16]=w):w=t[16];t[17]!==c||t[18]!==j||t[19]!==w?(C=(0,S.jsx)(l.default,{accessibilityRole:"button",onPress:c,style:j,children:w}),t[17]=c,t[18]=j,t[19]=w,t[20]=C):C=t[20];t[21]!==b||t[22]!==C?(T=(0,S.jsxs)(r.default,{testID:"alarm-sensors-failed",style:y,children:[b,C]}),t[21]=b,t[22]=C,t[23]=T):T=t[23];return T},_e.StateSection=function(e){const t=(0,n.c)(22),{panelId:l,live:r}=e,{t:u}=(0,s.useTranslation)(),{colors:y}=(0,p.useTheme)();let v,x,h,b,j,D,w;t[0]!==u?(v=u("v2.nc.alarm.sections.state"),t[0]=u,t[1]=v):v=t[1];t[2]!==y||t[3]!==r||t[4]!==u?(x=void 0===r?(0,S.jsx)(I,{text:u("v2.nc.alarm.liveUnknown"),tone:"warning"}):(0,S.jsx)(o.default,{testID:"alarm-state",style:{color:y.foreground,fontSize:16,fontWeight:"600"},children:T(r,u)}),t[2]=y,t[3]=r,t[4]=u,t[5]=x):x=t[5];t[6]!==r?.exclusions?(h=r?.exclusions??[],t[6]=r?.exclusions,t[7]=h):h=t[7];if(t[8]!==u||t[9]!==h){let e;t[11]!==u?(e=e=>(0,S.jsx)(I,{text:u("open"===e.phase?"v2.nc.alarm.exclusionOpen":"v2.nc.alarm.exclusionClosed",{name:""!==e.name?e.name:u("v2.nc.rules.editor.deviceUnknown",{id:e.deviceId})})},e.deviceId),t[11]=u,t[12]=e):e=t[12],b=h.map(e),t[8]=u,t[9]=h,t[10]=b}else b=t[10];t[13]!==l?(j=(0,S.jsx)(f.AlarmControl,{deviceId:l,online:!0}),t[13]=l,t[14]=j):j=t[14];t[15]!==x||t[16]!==b||t[17]!==j?(D=(0,S.jsxs)(C,{children:[x,b,j]}),t[15]=x,t[16]=b,t[17]=j,t[18]=D):D=t[18];t[19]!==v||t[20]!==D?(w=(0,S.jsx)(c.Section,{title:v,children:D}),t[19]=v,t[20]=D,t[21]=w):w=t[21];return w},_e.ModeCard=function(e){const t=(0,n.c)(74),{coverage:l,live:o,options:r,openingsState:u,nameOf:f,disabled:x}=e,{t:p}=(0,s.useTranslation)();let h;t[0]!==r?(h=(0,v.nonBlockingEmptyLine)(r),t[0]=r,t[1]=h):h=t[1];const T=h,k=!r.unresolved;let _;t[2]!==e.rows.length||t[3]!==k?(_=(0,y.alarmSensorTableState)({rowCount:e.rows.length,candidatesComplete:k}),t[2]=e.rows.length,t[3]=k,t[4]=_):_=t[4];const z=_;let P;t[5]!==l.mode||t[6]!==p?(P=D(l.mode,p),t[5]=l.mode,t[6]=p,t[7]=P):P=t[7];const $=P;let K;if(t[8]!==l.skippedDevices||t[9]!==f||t[10]!==p){let e;t[12]!==f||t[13]!==p?(e=e=>`${j(f(e.deviceId),e.deviceId,p)} (${p(`v2.nc.alarm.skipReason.${e.reason}`)})`,t[12]=f,t[13]=p,t[14]=e):e=t[14],K=l.skippedDevices.map(e).join(", "),t[8]=l.skippedDevices,t[9]=f,t[10]=p,t[11]=K}else K=t[11];const G=K;let M;t[15]!==l.ruleCount||t[16]!==e.rows||t[17]!==p?(M=0===l.ruleCount?p("v2.nc.alarm.coverageNone"):p("v2.nc.alarm.checks",{count:e.rows.filter(A).length}),t[15]=l.ruleCount,t[16]=e.rows,t[17]=p,t[18]=M):M=t[18];const W=0===l.ruleCount?"warning":"muted",U=`alarm-coverage-${l.mode}`;let F,H,O,L,E,V,B,Z,X,Y,q;t[19]!==M||t[20]!==W||t[21]!==U?(F=(0,S.jsx)(I,{text:M,tone:W,testID:U}),t[19]=M,t[20]=W,t[21]=U,t[22]=F):F=t[22];t[23]!==l.skippedDevices.length||t[24]!==G||t[25]!==p?(H=""!==G?(0,S.jsx)(I,{text:p("v2.nc.alarm.skippedCount",{count:l.skippedDevices.length}),tone:"warning"}):null,t[23]=l.skippedDevices.length,t[24]=G,t[25]=p,t[26]=H):H=t[26];t[27]!==l.mode||t[28]!==o?(O=(0,S.jsx)(R,{live:o,mode:l.mode}),t[27]=l.mode,t[28]=o,t[29]=O):O=t[29];t[30]!==O||t[31]!==F||t[32]!==H?(L=(0,S.jsxs)(C,{children:[F,H,O]}),t[30]=O,t[31]=F,t[32]=H,t[33]=L):L=t[33];t[34]!==l.mode||t[35]!==x||t[36]!==e.delays||t[37]!==e.onDelayCommit||t[38]!==e.onDelayDefault||t[39]!==e.onDelayType?(E=(0,S.jsx)(N,{mode:l.mode,views:e.delays,disabled:x,onType:e.onDelayType,onCommit:e.onDelayCommit,onUseDefault:e.onDelayDefault}),t[34]=l.mode,t[35]=x,t[36]=e.delays,t[37]=e.onDelayCommit,t[38]=e.onDelayDefault,t[39]=e.onDelayType,t[40]=E):E=t[40];t[41]!==u||t[42]!==r.unresolved||t[43]!==p?(V=r.unresolved&&"pending"===u?(0,S.jsx)(I,{text:p("v2.nc.alarm.openingsChecking")}):null,t[41]=u,t[42]=r.unresolved,t[43]=p,t[44]=V):V=t[44];t[45]!==u||t[46]!==r.unresolved||t[47]!==e.onRetryOpenings||t[48]!==p?(B=r.unresolved&&"failed"===u?(0,S.jsx)(w,{text:p("v2.nc.alarm.openingsCheckFailed"),onRetry:e.onRetryOpenings}):null,t[45]=u,t[46]=r.unresolved,t[47]=e.onRetryOpenings,t[48]=p,t[49]=B):B=t[49];t[50]!==l.mode||t[51]!==T||t[52]!==p||t[53]!==z?(Z=null!==T?(0,S.jsx)(I,{testID:`alarm-nonblocking-empty-${l.mode}`,text:p("v2.nc.alarm.nonBlockingEmpty")}):"none"===z?(0,S.jsx)(I,{testID:`alarm-sensors-none-${l.mode}`,text:p("v2.nc.alarm.table.none")}):null,t[50]=l.mode,t[51]=T,t[52]=p,t[53]=z,t[54]=Z):Z=t[54];t[55]!==V||t[56]!==B||t[57]!==Z?(X=(0,S.jsxs)(C,{children:[V,B,Z]}),t[55]=V,t[56]=B,t[57]=Z,t[58]=X):X=t[58];t[59]!==l.mode||t[60]!==x||t[61]!==T||t[62]!==e.inFlight||t[63]!==e.onSwitch||t[64]!==e.rows||t[65]!==e.zones||t[66]!==z?(Y=null===T&&"rows"===z?(0,S.jsx)(b.AlarmSensorTable,{mode:l.mode,rows:e.rows,inFlight:e.inFlight,onSwitch:e.onSwitch,zones:e.zones,disabled:x}):null,t[59]=l.mode,t[60]=x,t[61]=T,t[62]=e.inFlight,t[63]=e.onSwitch,t[64]=e.rows,t[65]=e.zones,t[66]=z,t[67]=Y):Y=t[67];t[68]!==$||t[69]!==L||t[70]!==E||t[71]!==X||t[72]!==Y?(q=(0,S.jsxs)(c.Section,{title:$,children:[L,E,X,Y]}),t[68]=$,t[69]=L,t[70]=E,t[71]=X,t[72]=Y,t[73]=q):q=t[73];return q},_e.RecipientsSection=function(e){const l=(0,n.c)(41),{targets:o,targetsState:r,selected:f,disabled:y,onToggle:x}=e,{t:h}=(0,s.useTranslation)(),{colors:b}=(0,p.useTheme)();let j;l[0]!==o?(j=new Set((o??[]).map(k)),l[0]=o,l[1]=j):j=l[1];const D=j;let T;l[2]!==f?(T=(0,v.recipientsAtLimit)(f),l[2]=f,l[3]=T):T=l[3];const R=T;let A;if(l[4]!==R||l[5]!==b||l[6]!==y||l[7]!==D||l[8]!==x||l[9]!==e.onRetryTargets||l[10]!==f||l[11]!==h||l[12]!==o||l[13]!==r){const n="answered"===r?f.filter(e=>!D.has(e)):[],s=[...(o??[]).map(e=>({id:e.id,label:e.name,description:e.enabled?void 0:h("v2.nc.alarm.targetDisabled")})),...n.map(e=>({id:e,label:h("v2.nc.alarm.targetUnlisted",{id:e}),description:void 0}))];let p,j,T,k,_;l[15]!==h?(p=h("v2.nc.alarm.sections.recipients"),l[15]=h,l[16]=p):p=l[16],l[17]!==h?(j=h("v2.nc.alarm.recipientsHint"),l[17]=h,l[18]=j):j=l[18],l[19]!==j?(T=(0,S.jsx)(I,{text:j}),l[19]=j,l[20]=T):T=l[20],l[21]!==b||l[22]!==r?(k="pending"===r?(0,S.jsx)(t.default,{size:"small",color:b.foregroundSubtle}):null,l[21]=b,l[22]=r,l[23]=k):k=l[23],l[24]!==e.onRetryTargets||l[25]!==h||l[26]!==r?(_="failed"===r?(0,S.jsx)(w,{text:h("v2.nc.alarm.targetsFailed"),onRetry:e.onRetryTargets}):null,l[24]=e.onRetryTargets,l[25]=h,l[26]=r,l[27]=_):_=l[27];const z="answered"===r&&0===s.length?(0,S.jsx)(I,{text:h("v2.nc.alarm.targetsEmpty")}):null;let P,N,$;l[28]!==R||l[29]!==h?(P=R?(0,S.jsx)(I,{text:h("v2.nc.alarm.recipientsLimit",{max:v.ALARM_MAX_RECIPIENTS}),testID:"alarm-recipients-limit"}):null,l[28]=R,l[29]=h,l[30]=P):P=l[30],l[31]!==f||l[32]!==h?(N=(0,v.recipientsWarning)(f)?(0,S.jsx)(I,{text:h("v2.nc.alarm.recipientsNone"),tone:"warning",testID:"alarm-no-recipient"}):null,l[31]=f,l[32]=h,l[33]=N):N=l[33],l[34]!==N||l[35]!==T||l[36]!==k||l[37]!==_||l[38]!==z||l[39]!==P?($=(0,S.jsxs)(C,{children:[T,k,_,z,P,N]}),l[34]=N,l[35]=T,l[36]=k,l[37]=_,l[38]=z,l[39]=P,l[40]=$):$=l[40],A=(0,S.jsxs)(c.Section,{title:p,children:[$,s.map((e,n)=>(0,S.jsx)(u.ToggleRow,{label:e.label,description:e.description,value:f.includes(e.id),disabled:y||R&&!f.includes(e.id),last:n===s.length-1,onValueChange:()=>x(e.id)},e.id))]}),l[4]=R,l[5]=b,l[6]=y,l[7]=D,l[8]=x,l[9]=e.onRetryTargets,l[10]=f,l[11]=h,l[12]=o,l[13]=r,l[14]=A}else A=l[14];return A},_e.ModeDelays=N,_e.DelaysSection=function(e){const t=(0,n.c)(11),{values:l,raw:o,disabled:r,onType:u,onCommit:f}=e,{t:y}=(0,s.useTranslation)();let v,x,p;t[0]!==y?(v=y("v2.nc.alarm.sections.delays"),t[0]=y,t[1]=v):v=t[1];t[2]!==r||t[3]!==f||t[4]!==u||t[5]!==o||t[6]!==l?(x=P.map((e,n)=>(0,S.jsx)(z,Object.assign({},e,{value:l[e.field],raw:o[e.field],disabled:r,onType:u,onCommit:f,last:n===P.length-1}),e.field)),t[2]=r,t[3]=f,t[4]=u,t[5]=o,t[6]=l,t[7]=x):x=t[7];t[8]!==v||t[9]!==x?(p=(0,S.jsx)(c.Section,{title:v,children:x}),t[8]=v,t[9]=x,t[10]=p):p=t[10];return p};var n=_r(d[0]);_r(d[1]);var t=e(_r(d[2])),l=e(_r(d[3])),o=e(_r(d[4])),r=e(_r(d[5])),s=_r(d[6]),c=_r(d[7]),u=_r(d[8]),f=_r(d[9]),y=_r(d[10]),v=_r(d[11]),x=_r(d[12]),p=_r(d[13]),h=_r(d[14]),b=_r(d[15]),S=_r(d[16]);function j(e,n,t){return'named'===e.kind?e.name:'removed'===e.kind?t('v2.nc.rules.editor.deviceRemoved',{id:n}):t('v2.nc.rules.editor.deviceUnknown',{id:n})}function D(e,n){return n(`v2.accessories.armMode.${e}`)}function I(e){const t=(0,n.c)(6),{text:l,tone:r,testID:s}=e,c=void 0===r?"muted":r,{colors:u}=(0,p.useTheme)(),f="warning"===c?u.warning:"danger"===c?u.danger:u.foregroundSubtle;let y,v;return t[0]!==f?(y={color:f,fontSize:13,lineHeight:18},t[0]=f,t[1]=y):y=t[1],t[2]!==y||t[3]!==s||t[4]!==l?(v=(0,S.jsx)(o.default,{testID:s,style:y,children:l}),t[2]=y,t[3]=s,t[4]=l,t[5]=v):v=t[5],v}function w(e){const t=(0,n.c)(19),{text:c,onRetry:u}=e,{t:f}=(0,s.useTranslation)(),{colors:y}=(0,p.useTheme)();let v,x,b,j,D,w,C,T;return t[0]===Symbol.for("react.memo_cache_sentinel")?(v={gap:h.SPACING.sm,alignItems:"flex-start"},t[0]=v):v=t[0],t[1]!==c?(x=(0,S.jsx)(I,{text:c,tone:"danger"}),t[1]=c,t[2]=x):x=t[2],t[3]!==y.border?(b={paddingHorizontal:h.SPACING.lg,paddingVertical:h.SPACING.sm,borderRadius:h.RADIUS.md,borderWidth:1,borderColor:y.border},t[3]=y.border,t[4]=b):b=t[4],t[5]!==y.foreground?(j={color:y.foreground,fontSize:14,fontWeight:"600"},t[5]=y.foreground,t[6]=j):j=t[6],t[7]!==f?(D=f("v2.nc.alarm.retry"),t[7]=f,t[8]=D):D=t[8],t[9]!==j||t[10]!==D?(w=(0,S.jsx)(o.default,{style:j,children:D}),t[9]=j,t[10]=D,t[11]=w):w=t[11],t[12]!==u||t[13]!==b||t[14]!==w?(C=(0,S.jsx)(l.default,{accessibilityRole:"button",onPress:u,style:b,children:w}),t[12]=u,t[13]=b,t[14]=w,t[15]=C):C=t[15],t[16]!==x||t[17]!==C?(T=(0,S.jsxs)(r.default,{style:v,children:[x,C]}),t[16]=x,t[17]=C,t[18]=T):T=t[18],T}function C(e){const t=(0,n.c)(3),{children:l}=e;let o,s;return t[0]===Symbol.for("react.memo_cache_sentinel")?(o={padding:h.SPACING.xl,gap:h.SPACING.sm},t[0]=o):o=t[0],t[1]!==l?(s=(0,S.jsx)(r.default,{style:o,children:l}),t[1]=l,t[2]=s):s=t[2],s}function T(e,n){const t=n(`v2.nc.alarm.stateWord.${e.state.startsWith('armed_')?'armed':e.state}`);return'disarmed'===e.state||null===e.targetMode?t:n('v2.nc.alarm.stateWithMode',{state:t,mode:D(e.targetMode,n)})}function R(e){const t=(0,n.c)(21),{live:l,mode:o}=e,{t:c}=(0,s.useTranslation)();let u,f,y,x,p,h,b,j;if(t[0]!==l||t[1]!==o||t[2]!==c){h=Symbol.for("react.early_return_sentinel");e:{const e=(0,v.openingsSummary)(l,o);if(null===e){let e,n;t[9]!==c?(e=c("v2.nc.alarm.openingsUnknown"),t[9]=c,t[10]=e):e=t[10],t[11]!==e?(n=(0,S.jsx)(I,{text:e}),t[11]=e,t[12]=n):n=t[12],h=n;break e}0!==e.blocking?(f=r.default,p=`alarm-openings-${o}`,u=I,y="warning",x=c("v2.nc.alarm.openRefuse",{count:e.blocking})):h=null}t[0]=l,t[1]=o,t[2]=c,t[3]=u,t[4]=f,t[5]=y,t[6]=x,t[7]=p,t[8]=h}else u=t[3],f=t[4],y=t[5],x=t[6],p=t[7],h=t[8];return h!==Symbol.for("react.early_return_sentinel")?h:(t[13]!==u||t[14]!==y||t[15]!==x?(b=(0,S.jsx)(u,{tone:y,text:x}),t[13]=u,t[14]=y,t[15]=x,t[16]=b):b=t[16],t[17]!==f||t[18]!==p||t[19]!==b?(j=(0,S.jsx)(f,{testID:p,children:b}),t[17]=f,t[18]=p,t[19]=b,t[20]=j):j=t[20],j)}function A(e){return"not-covered"!==e.coverage.kind&&"unscoped"!==e.coverage.kind}function k(e){return e.id}function _(e,n,t){if(e<=0)return t(n);if(e<60)return t('v2.nc.alarm.seconds',{seconds:e});const l=Math.floor(e/60),o=e%60;return 0===o?t('v2.nc.alarm.minutes',{minutes:l}):t('v2.nc.alarm.minutesSeconds',{minutes:l,seconds:o})}function z(e){const t=(0,n.c)(35),{field:l,labelKey:o,hintKey:c,zeroKey:u,value:f,raw:y,disabled:p,onType:b,onCommit:j,testIdPrefix:D,footer:w,last:C}=e,T=void 0===D?"alarm-delay":D,R=void 0!==C&&C,{t:A}=(0,s.useTranslation)();let k,z;t[0]!==o||t[1]!==A?(k=A(o),t[0]=o,t[1]=A,t[2]=k):k=t[2],t[3]!==c||t[4]!==A?(z=void 0!==c?{description:A(c)}:{},t[3]=c,t[4]=A,t[5]=z):z=t[5];const P=`${T}-${l}`,N=y??String(f);let $,K;t[6]!==l||t[7]!==b?($=e=>b(l,e),t[6]=l,t[7]=b,t[8]=$):$=t[8],t[9]!==l||t[10]!==j?(K=()=>j(l),t[9]=l,t[10]=j,t[11]=K):K=t[11];const G=!p;let M,W;t[12]===Symbol.for("react.memo_cache_sentinel")?(M={gap:h.SPACING.xs},t[12]=M):M=t[12],t[13]!==A||t[14]!==f||t[15]!==u?(W=_(f,u,A),t[13]=A,t[14]=f,t[15]=u,t[16]=W):W=t[16];const U=v.ALARM_DELAY_MAX[l];let F;t[17]!==A||t[18]!==U?(F=A("v2.nc.alarm.delayRange",{max:U}),t[17]=A,t[18]=U,t[19]=F):F=t[19];const H=`${W} \xb7 ${F}`;let O,L,E;return t[20]!==H?(O=(0,S.jsx)(I,{text:H}),t[20]=H,t[21]=O):O=t[21],t[22]!==w||t[23]!==O?(L=(0,S.jsxs)(r.default,{style:M,children:[O,w]}),t[22]=w,t[23]=O,t[24]=L):L=t[24],t[25]!==R||t[26]!==L||t[27]!==k||t[28]!==z||t[29]!==P||t[30]!==N||t[31]!==$||t[32]!==K||t[33]!==G?(E=(0,S.jsx)(x.LabeledInput,Object.assign({label:k},z,{testID:P,value:N,onChangeText:$,onBlur:K,editable:G,numeric:!0,returnKeyType:"done",last:R,footer:L})),t[25]=R,t[26]=L,t[27]=k,t[28]=z,t[29]=P,t[30]=N,t[31]=$,t[32]=K,t[33]=G,t[34]=E):E=t[34],E}const P=[{field:'exitDelaySec',labelKey:'v2.nc.alarm.exitDelay',hintKey:'v2.nc.alarm.exitHint',zeroKey:'v2.nc.alarm.exitZero'},{field:'entryDelaySec',labelKey:'v2.nc.alarm.entryDelay',hintKey:'v2.nc.alarm.entryHint',zeroKey:'v2.nc.alarm.entryZero'},{field:'triggeredDurationSec',labelKey:'v2.nc.alarm.triggeredFor',hintKey:'v2.nc.alarm.triggeredHint',zeroKey:'v2.nc.alarm.triggeredZero'}];function N(e){const t=(0,n.c)(22),{mode:c,views:u,disabled:f,onType:y,onCommit:v,onUseDefault:x}=e,{t:b}=(0,s.useTranslation)(),{colors:j}=(0,p.useTheme)(),w=`alarm-delays-${c}`;let C,T,R,A,k;return t[0]!==j.foreground?(C={color:j.foreground,fontSize:14,fontWeight:"600",paddingHorizontal:h.SPACING.xl,paddingTop:h.SPACING.md},t[0]=j.foreground,t[1]=C):C=t[1],t[2]!==c||t[3]!==b?(T=b("v2.nc.alarm.modeDelays.title",{mode:D(c,b)}),t[2]=c,t[3]=b,t[4]=T):T=t[4],t[5]!==C||t[6]!==T?(R=(0,S.jsx)(o.default,{style:C,children:T}),t[5]=C,t[6]=T,t[7]=R):R=t[7],t[8]!==j.border||t[9]!==j.foreground||t[10]!==f||t[11]!==c||t[12]!==v||t[13]!==y||t[14]!==x||t[15]!==b||t[16]!==u?(A=P.map(e=>{const n=u[e.field];return(0,S.jsx)(z,{field:e.field,labelKey:e.labelKey,zeroKey:e.zeroKey,value:n.value,raw:n.raw,disabled:f,onType:y,onCommit:v,testIdPrefix:`alarm-delay-${c}`,footer:n.inherited?(0,S.jsx)(I,{testID:`alarm-delay-${c}-${e.field}-inherited`,text:b("v2.nc.alarm.modeDelays.inherited",{seconds:n.defaultValue})}):(0,S.jsx)(l.default,{accessibilityRole:"button",testID:`alarm-delay-${c}-${e.field}-default`,disabled:f,onPress:()=>x(e.field),style:{alignSelf:"flex-start",paddingHorizontal:h.SPACING.lg,paddingVertical:h.SPACING.xs,borderRadius:h.RADIUS.md,borderWidth:1,borderColor:j.border},children:(0,S.jsx)(o.default,{style:{color:j.foreground,fontSize:13,fontWeight:"600"},children:b("v2.nc.alarm.modeDelays.useDefault")})})},e.field)}),t[8]=j.border,t[9]=j.foreground,t[10]=f,t[11]=c,t[12]=v,t[13]=y,t[14]=x,t[15]=b,t[16]=u,t[17]=A):A=t[17],t[18]!==w||t[19]!==R||t[20]!==A?(k=(0,S.jsxs)(r.default,{testID:w,children:[R,A]}),t[18]=w,t[19]=R,t[20]=A,t[21]=k):k=t[21],k}},2570,[15,17,237,252,198,20,1072,1975,1976,2027,2029,2569,2495,782,790,2571,10]);
|
|
4471
|
+
__d(function(g,_r,i,a,m,_e,d){"use strict";function e(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(_e,'__esModule',{value:!0}),_e.zoneLocationLabel=S,_e.AlarmSensorTable=function(e){const o=(0,n.c)(60),{t:u}=(0,s.useTranslation)(),{colors:b}=(0,f.useTheme)(),{mode:S,rows:k,zones:$,disabled:I}=e,[z,j]=(0,t.useState)(v.PICKER_NO_FILTERS),[E,G]=(0,t.useState)(v.PICKER_PAGE_SIZE);let R;o[0]!==k?(R=k.map(A),o[0]=k,o[1]=R):R=o[1];const T=R;let D;o[2]!==T||o[3]!==z||o[4]!==$?(D=(0,v.applyPickerFilters)(T,z,$),o[2]=T,o[3]=z,o[4]=$,o[5]=D):D=o[5];const F=D;let O;o[6]!==F||o[7]!==$?(O=(0,v.groupPickerDevicesBy)(F,[],"none",$),o[6]=F,o[7]=$,o[8]=O):O=o[8];const M=O;let N;o[9]!==M?(N=(0,v.flattenPickerGrouping)(M,[],new Map,!0),o[9]=M,o[10]=N):N=o[10];const L=N;let K;o[11]!==k?(K=new Map(k.map(C)),o[11]=k,o[12]=K):K=o[12];const B=K;let Z;o[13]!==T||o[14]!==z.types||o[15]!==$?(Z=(0,v.pickerFacetOptions)(T,"type",z.types,$),o[13]=T,o[14]=z.types,o[15]=$,o[16]=Z):Z=o[16];const U=Z;let V;o[17]!==T||o[18]!==z.zones||o[19]!==$?(V=(0,v.pickerFacetOptions)(T,"zone",z.zones,$),o[17]=T,o[18]=z.zones,o[19]=$,o[20]=V):V=o[20];const W=V;let H;o[21]!==T||o[22]!==z.locations||o[23]!==$?(H=(0,v.pickerFacetOptions)(T,"location",z.locations,$),o[21]=T,o[22]=z.locations,o[23]=$,o[24]=H):H=o[24];const q=H;let J;if(o[25]!==b||o[26]!==I||o[27]!==z||o[28]!==L||o[29]!==q||o[30]!==F.length||o[31]!==S||o[32]!==e||o[33]!==B||o[34]!==k.length||o[35]!==E||o[36]!==u||o[37]!==U||o[38]!==W||o[39]!==$){const n=(0,v.pageRows)(L,E),t=k.length-F.length,s=n.rows.at(-1)?.key,f=t>0||n.remaining>0;let C,A,R,T,D,O;o[41]===Symbol.for("react.memo_cache_sentinel")?(C={gap:h.SPACING.sm,paddingHorizontal:h.SPACING.xl,paddingBottom:h.SPACING.md},o[41]=C):C=o[41],o[42]===Symbol.for("react.memo_cache_sentinel")?(A=e=>{j(e),G(v.PICKER_PAGE_SIZE)},o[42]=A):A=o[42],o[43]!==u?(R=u(`${y}.searchPlaceholder`),o[43]=u,o[44]=R):R=o[44],o[45]!==I||o[46]!==z||o[47]!==q||o[48]!==R||o[49]!==U||o[50]!==W||o[51]!==$?(T=(0,w.jsx)(p.DeviceFilterBar,{filters:z,onFiltersChange:A,typeOptions:U,zoneOptions:W,locationOptions:q,zones:$,searchPlaceholder:R,disabled:I}),o[45]=I,o[46]=z,o[47]=q,o[48]=R,o[49]=U,o[50]=W,o[51]=$,o[52]=T):T=o[52],o[53]!==b||o[54]!==L.length||o[55]!==u?(D=0===L.length?(0,w.jsx)(l.default,{style:{color:b.foregroundSubtle,fontSize:13,fontStyle:"italic"},children:u(`${y}.noMatches`)}):null,o[53]=b,o[54]=L.length,o[55]=u,o[56]=D):D=o[56],o[57]!==T||o[58]!==D?(O=(0,w.jsxs)(c.default,{style:C,children:[T,D]}),o[57]=T,o[58]=D,o[59]=O):O=o[59],J=(0,w.jsxs)(c.default,{testID:`alarm-sensors-${S}`,children:[O,n.rows.map(n=>{if("header"===n.kind){const e=n.group.heading;return(0,w.jsx)(l.default,{testID:"alarm-group-header",style:{color:b.foregroundSubtle,fontSize:12,fontWeight:"600",paddingHorizontal:h.SPACING.xl,paddingVertical:h.SPACING.sm},children:void 0===e?n.group.key:P(e,u)},n.key)}const t=B.get(n.device.id);return void 0===t?null:(0,w.jsx)(_,{props:e,row:t,last:n.key===s&&!f},n.key)}),f?(0,w.jsxs)(c.default,{style:{gap:h.SPACING.sm,padding:h.SPACING.xl},children:[t>0?(0,w.jsx)(l.default,{testID:"alarm-rows-hidden",style:{color:b.foregroundSubtle,fontSize:12},children:u(`${y}.hidden`,{count:t})}):null,n.remaining>0?(0,w.jsx)(r.default,{accessibilityRole:"button",onPress:()=>G(x),style:{alignItems:"center",paddingVertical:h.SPACING.sm,borderRadius:h.RADIUS.md,borderWidth:1,borderColor:b.border},children:(0,w.jsx)(l.default,{style:{color:b.foregroundSubtle,fontSize:13},children:u(`${y}.showMore`,{count:Math.min(n.remaining,v.PICKER_PAGE_SIZE),left:n.remaining})})}):null]}):null]}),o[25]=b,o[26]=I,o[27]=z,o[28]=L,o[29]=q,o[30]=F.length,o[31]=S,o[32]=e,o[33]=B,o[34]=k.length,o[35]=E,o[36]=u,o[37]=U,o[38]=W,o[39]=$,o[40]=J}else J=o[40];return J};var n=_r(d[0]),t=_r(d[1]),o=e(_r(d[2])),r=e(_r(d[3])),l=e(_r(d[4])),c=e(_r(d[5])),s=_r(d[6]),u=_r(d[7]),f=_r(d[8]),h=_r(d[9]),p=_r(d[10]),v=_r(d[11]),b=_r(d[12]),w=_r(d[13]);const y='v2.nc.alarm.table';function S(e,n){const t=e?.trim()??'';if(''===t)return null;if('answered'===n.state){const e=(0,v.pickerLocationKey)(t),o=n.zones.find(n=>n.locationKeys.includes(e));if(void 0!==o)return`${o.label} \xb7 ${t}`}return t}function k(e,n){switch(e.kind){case'checking':return n(`${y}.state.checking`);case'hub-too-old':return n(`${y}.state.hubTooOld`);case'read-failed':return n(`${y}.state.readFailed`,{error:e.error});case'open':case'closed':return e.offline?n(`${y}.state.offline`,{word:e.word}):e.word;case'unknown':return'not-answered'===e.why?n(`${y}.state.unknownNotAnswered`):'read-failed'===e.why?n(`${y}.state.unknownReadFailed`):n(`${y}.state.unknownWord`);case'not-opening':return n(`${y}.state.notOpening`);case'removed':return n(`${y}.state.removed`)}}function $(e,n){return e.listedUncovered?n(`${y}.coverage.listedUncovered`):I(e.coverage,n)}function I(e,n){switch(e.kind){case'arm-checked':return n(`${y}.coverage.armChecked`);case'arm-checked-skipped':return n(`${y}.coverage.armCheckedSkipped`,{reason:n(`v2.nc.alarm.skipReason.${e.reason}`)});case'unscoped':return n(`${y}.coverage.unscoped`);case'not-covered':return n(`${y}.coverage.notCovered`)}}function P(e,n){switch(e.kind){case'zone':case'location':return e.label;case'no-zone':return n('v2.nc.devicePicker.groupBy.noZone');case'no-location':return n('v2.nc.devicePicker.groupBy.noLocation')}}function z(e){switch(e.kind){case'open':case'read-failed':case'hub-too-old':case'removed':return'warning';case'closed':case'checking':case'unknown':case'not-opening':return'muted'}}function _(e){const t=(0,n.c)(64),{props:r,row:h,last:p}=e,{t:v}=(0,s.useTranslation)(),{colors:I}=(0,f.useTheme)(),{mode:P,inFlight:_,onSwitch:x,zones:C,disabled:A}=r,E=h.device.id,G=h.listedUncovered,R=null!==_&&_.mode===P&&_.deviceId===E,T=null!==_&&!R,D=h.device.type;let F,O,M;t[0]!==h.device.location||t[1]!==C?(F=S(h.device.location,C),t[0]=h.device.location,t[1]=C,t[2]=F):F=t[2],t[3]!==v||t[4]!==D?(O=void 0!==D&&""!==D?v((0,b.deviceTypeLabelKey)(D),{defaultValue:(0,b.deviceTypeLabel)(D)}):null,t[3]=v,t[4]=D,t[5]=O):O=t[5],t[6]!==F||t[7]!==O?(M=[F,O].filter(j),t[6]=F,t[7]=O,t[8]=M):M=t[8];const N=M.join(" \xb7 "),L=`${P}-${String(E)}`,K=`alarm-row-${L}`,B=h.device.name;let Z;t[9]!==L||t[10]!==N?(Z=""!==N?{description:N,descriptionTestID:`alarm-cell-place-${L}`}:{},t[9]=L,t[10]=N,t[11]=Z):Z=t[11];const U=h.blocks;let V;t[12]!==G||t[13]!==T?(V=G||T?{opacity:G?.6:.5}:{},t[12]=G,t[13]=T,t[14]=V):V=t[14];const W=`alarm-switch-${L}`;let H,q,J;t[15]!==h.device.name||t[16]!==v?(H=v(`${y}.switchLabel`,{name:h.device.name}),t[15]=h.device.name,t[16]=v,t[17]=H):H=t[17],t[18]!==R||t[19]!==I.foregroundSubtle?(q=R?(0,w.jsx)(o.default,{size:"small",color:I.foregroundSubtle}):void 0,t[18]=R,t[19]=I.foregroundSubtle,t[20]=q):q=t[20],t[21]!==x||t[22]!==h?(J=e=>x(h,e),t[21]=x,t[22]=h,t[23]=J):J=t[23];const Q=`alarm-cell-state-${L}`;let X,Y,ee,ne;t[24]!==I.foregroundMuted||t[25]!==I.warning||t[26]!==h.cell?(X="warning"===z(h.cell)?I.warning:I.foregroundMuted,t[24]=I.foregroundMuted,t[25]=I.warning,t[26]=h.cell,t[27]=X):X=t[27],t[28]!==X?(Y={color:X,fontSize:13},t[28]=X,t[29]=Y):Y=t[29],t[30]!==h.cell||t[31]!==v?(ee=k(h.cell,v),t[30]=h.cell,t[31]=v,t[32]=ee):ee=t[32],t[33]!==Q||t[34]!==Y||t[35]!==ee?(ne=(0,w.jsx)(l.default,{testID:Q,style:Y,children:ee}),t[33]=Q,t[34]=Y,t[35]=ee,t[36]=ne):ne=t[36];const te=`alarm-cell-coverage-${L}`;let oe,re,le,ce,ae,se;return t[37]!==I.foregroundSubtle?(oe={color:I.foregroundSubtle,fontSize:12},t[37]=I.foregroundSubtle,t[38]=oe):oe=t[38],t[39]!==h||t[40]!==v?(re=$(h,v),t[39]=h,t[40]=v,t[41]=re):re=t[41],t[42]!==te||t[43]!==oe||t[44]!==re?(le=(0,w.jsx)(l.default,{testID:te,style:oe,children:re}),t[42]=te,t[43]=oe,t[44]=re,t[45]=le):le=t[45],t[46]!==ne||t[47]!==le?(ce=(0,w.jsxs)(w.Fragment,{children:[ne,le]}),t[46]=ne,t[47]=le,t[48]=ce):ce=t[48],t[49]!==A||t[50]!==p||t[51]!==h.blocks||t[52]!==h.device.name||t[53]!==H||t[54]!==q||t[55]!==J||t[56]!==ce||t[57]!==Z||t[58]!==V||t[59]!==W?(ae=(0,w.jsx)(u.ToggleRow,Object.assign({label:B},Z,{value:U,disabled:A},V,{haptic:"action",last:p,switchTestID:W,switchAccessibilityLabel:H,accessory:q,onValueChange:J,detail:ce})),t[49]=A,t[50]=p,t[51]=h.blocks,t[52]=h.device.name,t[53]=H,t[54]=q,t[55]=J,t[56]=ce,t[57]=Z,t[58]=V,t[59]=W,t[60]=ae):ae=t[60],t[61]!==ae||t[62]!==K?(se=(0,w.jsx)(c.default,{testID:K,children:ae}),t[61]=ae,t[62]=K,t[63]=se):se=t[63],se}function j(e){return null!==e}function x(e){return e+v.PICKER_PAGE_SIZE}function C(e){return[e.device.id,e]}function A(e){return e.device}},2571,[15,17,237,252,198,20,1072,1976,782,790,2519,2516,2156,10]);
|
|
4472
4472
|
__d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,'__esModule',{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return o}});var t=r(d[0]),n=r(d[1]),c=r(d[2]);function o(){const o=(0,t.c)(1);let u;return o[0]===Symbol.for("react.memo_cache_sentinel")?(u=(0,c.jsx)(n.CamerasManageScreen,{}),o[0]=u):u=o[0],u}},2572,[15,2573,10]);
|
|
4473
4473
|
__d(function(g,r,i,a,m,_e,d){"use strict";function e(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(_e,'__esModule',{value:!0}),_e.CamerasManageScreen=function(){const e=(0,n.c)(57),{t:s}=(0,b.useTranslation)(),{colors:u}=(0,C.useTheme)(),c=(0,y.useRouter)(),f=(0,A.useSafeAreaInsets)(),{data:p,isLoading:j}=(0,N.useAllCameras)();let z;e[0]!==p?(z=void 0===p?[]:p,e[0]=p,e[1]=z):z=e[1];const w=z,{setLocalName:O,setHidden:B,setOrder:F}=(0,I.useCameraPrefs)(),[V,W]=(0,o.useState)(w),[K,U]=(0,o.useState)(null),X=null!==K;let Y,q,J;e[2]!==X||e[3]!==w?(Y=()=>{X||W(w)},q=[w,X],e[2]=X,e[3]=w,e[4]=Y,e[5]=q):(Y=e[4],q=e[5]);(0,o.useEffect)(Y,q),e[6]!==V?(J=()=>{(0,v.hapticTap)(),U((0,k.beginArrange)(V.map(_)))},e[6]=V,e[7]=J):J=e[7];const Q=J;let Z;e[8]===Symbol.for("react.memo_cache_sentinel")?(Z=e=>{const{data:n}=e;W(n),U(e=>null===e?e:(0,k.applyArrangeDrag)(e,n.map(E)))},e[8]=Z):Z=e[8];const $=Z;let ee;e[9]!==V||e[10]!==K?(ee=()=>{null!==K&&((0,v.hapticTap)(),W((0,P.applySavedOrder)(V,K.baseline)),U(null))},e[9]=V,e[10]=K,e[11]=ee):ee=e[11];const re=ee;let ne;e[12]!==K||e[13]!==F?(ne=()=>{null!==K&&((0,v.hapticTap)(),(0,k.arrangeIsDirty)(K)&&F(K.draft),U(null))},e[12]=K,e[13]=F,e[14]=ne):ne=e[14];const oe=ne;let te;e[15]!==X||e[16]!==u||e[17]!==B||e[18]!==O?(te=e=>{const{item:n,drag:o,isActive:t}=e;return(0,R.jsx)(H,{camera:n,drag:X?o:null,isActive:t,colors:u,onRename:e=>O(n.id,e),onToggleHidden:e=>B(n.id,e)})},e[15]=X,e[16]=u,e[17]=B,e[18]=O,e[19]=te):te=e[19];const ae=te;let le;e[20]!==X||e[21]!==re||e[22]!==u.foregroundMuted||e[23]!==u.primary||e[24]!==u.primaryForeground||e[25]!==u.surface||e[26]!==oe||e[27]!==Q||e[28]!==s?(le=X?(0,R.jsxs)(t.default,{style:L.headerActions,children:[(0,R.jsx)(D,{label:s("v2.cameras.arrangeCancel"),onPress:re,colors:{surface:u.surface,foreground:u.foregroundMuted},children:(0,R.jsx)(x.X,{size:18,color:u.foregroundMuted})}),(0,R.jsx)(D,{label:s("v2.cameras.arrangeConfirm"),onPress:oe,colors:{surface:u.primary,foreground:u.primaryForeground},children:(0,R.jsx)(x.Check,{size:18,color:u.primaryForeground})})]}):(0,R.jsx)(D,{label:s("v2.cameras.arrangeStart"),onPress:Q,colors:{surface:u.surface,foreground:u.foregroundMuted},children:(0,R.jsx)(x.Pencil,{size:16,color:u.foregroundMuted})}),e[20]=X,e[21]=re,e[22]=u.foregroundMuted,e[23]=u.primary,e[24]=u.primaryForeground,e[25]=u.surface,e[26]=oe,e[27]=Q,e[28]=s,e[29]=le):le=e[29];const de=le;let ie,se,ue;e[30]!==u.background?(ie={flex:1,backgroundColor:u.background},e[30]=u.background,e[31]=ie):ie=e[31];e[32]!==s?(se=s("v2.cameras.manage"),e[32]=s,e[33]=se):se=e[33];e[34]!==X||e[35]!==re||e[36]!==c?(ue=X?re:()=>c.back(),e[34]=X,e[35]=re,e[36]=c,e[37]=ue):ue=e[37];const ce=w.length>0?de:void 0;let ge,fe,me;e[38]!==se||e[39]!==ue||e[40]!==ce?(ge=(0,R.jsx)(M.ScreenHeader,{title:se,onBack:ue,right:ce,bordered:!0}),e[38]=se,e[39]=ue,e[40]=ce,e[41]=ge):ge=e[41];e[42]!==X||e[43]!==w.length||e[44]!==u.foregroundMuted||e[45]!==u.foregroundSubtle||e[46]!==u.primary||e[47]!==V||e[48]!==f||e[49]!==j||e[50]!==ae||e[51]!==s?(fe=j?(0,R.jsx)(t.default,{style:L.centered,children:(0,R.jsx)(h.default,{color:u.primary})}):0===w.length?(0,R.jsx)(t.default,{style:L.centered,children:(0,R.jsx)(l.default,{style:{color:u.foregroundMuted,fontSize:15},children:s("v2.cameras.empty")})}):(0,R.jsx)(S.default,{data:V,keyExtractor:T,onDragEnd:$,renderItem:ae,containerStyle:G.CAMERAS_MANAGE_CONTAINER_STYLE,contentContainerStyle:(0,G.camerasManageListContentStyle)(f.bottom),activationDistance:12,automaticallyAdjustKeyboardInsets:!1,keyboardShouldPersistTaps:"handled",keyboardDismissMode:"interactive",ListHeaderComponent:(0,R.jsx)(l.default,{style:[L.hint,{color:u.foregroundSubtle}],children:s(X?"v2.cameras.arrangeHint":"v2.cameras.manageHint")})}),e[42]=X,e[43]=w.length,e[44]=u.foregroundMuted,e[45]=u.foregroundSubtle,e[46]=u.primary,e[47]=V,e[48]=f,e[49]=j,e[50]=ae,e[51]=s,e[52]=fe):fe=e[52];e[53]!==ie||e[54]!==ge||e[55]!==fe?(me=(0,R.jsxs)(t.default,{style:ie,children:[ge,fe]}),e[53]=ie,e[54]=ge,e[55]=fe,e[56]=me):me=e[56];return me};var n=r(d[0]),o=r(d[1]),t=e(r(d[2])),l=e(r(d[3])),s=e(r(d[4])),u=e(r(d[5])),c=e(r(d[6])),f=e(r(d[7])),h=e(r(d[8]));r(d[9]);var b=r(d[10]),y=r(d[11]),p=r(d[12]),S=e(p),x=r(d[13]),C=r(d[14]),j=r(d[15]),A=r(d[16]),v=r(d[17]),M=r(d[18]),N=r(d[19]),P=r(d[20]),I=r(d[21]),k=r(d[22]),G=r(d[23]),R=r(d[24]);function T(e){return String(e.id)}function E(e){return e.id}function _(e){return e.id}function D(e){const o=(0,n.c)(7),{label:t,onPress:l,colors:s,children:u}=e;let f,h;return o[0]!==s.surface?(f=[L.cornerButton,{backgroundColor:s.surface}],o[0]=s.surface,o[1]=f):f=o[1],o[2]!==u||o[3]!==t||o[4]!==l||o[5]!==f?(h=(0,R.jsx)(c.default,{onPress:l,accessibilityRole:"button",accessibilityLabel:t,hitSlop:8,style:f,children:u}),o[2]=u,o[3]=t,o[4]=l,o[5]=f,o[6]=h):h=o[6],h}function H(e){const f=(0,n.c)(51),{camera:h,drag:y,isActive:S,colors:C,onRename:j,onToggleHidden:A}=e,{t:v}=(0,b.useTranslation)(),[M,N]=(0,o.useState)(h.name);let P,I,k;f[0]!==h.name?(P=()=>{N(h.name)},I=[h.name],f[0]=h.name,f[1]=P,f[2]=I):(P=f[1],I=f[2]),(0,o.useEffect)(P,I),f[3]!==h.name||f[4]!==M||f[5]!==j?(k=()=>{M!==h.name&&j(M)},f[3]=h.name,f[4]=M,f[5]=j,f[6]=k):k=f[6];const T=k,E=h.name!==h.originalName,_=null!==y,D=S?C.surfaceHover:C.surface,H=S?C.primary:C.border,z=h.hidden?.55:1;let w,O;f[7]!==D||f[8]!==H||f[9]!==z?(w=[L.row,{backgroundColor:D,borderColor:H,opacity:z,marginBottom:G.CAMERAS_MANAGE_ROW_GAP}],f[7]=D,f[8]=H,f[9]=z,f[10]=w):w=f[10],f[11]!==C.foregroundMuted||f[12]!==y||f[13]!==v?(O=y?(0,R.jsx)(c.default,{accessibilityRole:"button",accessibilityLabel:v("v2.cameras.reorderHandle"),onLongPress:y,delayLongPress:150,style:L.handle,children:(0,R.jsx)(x.GripVertical,{size:20,color:C.foregroundMuted})}):null,f[11]=C.foregroundMuted,f[12]=y,f[13]=v,f[14]=O):O=f[14];const B=h.online?C.success:C.foregroundDisabled;let F,V,W,K,U,X,Y,q;return f[15]!==B?(F=(0,R.jsx)(t.default,{style:[L.statusDot,{backgroundColor:B}]}),f[15]=B,f[16]=F):F=f[16],f[17]!==_||f[18]!==h.name||f[19]!==h.originalName||f[20]!==C.foreground||f[21]!==C.foregroundSubtle||f[22]!==T||f[23]!==M?(V=_?(0,R.jsx)(l.default,{style:[L.input,{color:C.foreground}],numberOfLines:1,children:h.name}):(0,R.jsx)(s.default,{value:M,onChangeText:N,onBlur:T,onSubmitEditing:T,returnKeyType:"done",placeholder:h.originalName,placeholderTextColor:C.foregroundSubtle,selectTextOnFocus:!0,style:[L.input,{color:C.foreground}]}),f[17]=_,f[18]=h.name,f[19]=h.originalName,f[20]=C.foreground,f[21]=C.foregroundSubtle,f[22]=T,f[23]=M,f[24]=V):V=f[24],f[25]!==F||f[26]!==V?(W=(0,R.jsxs)(t.default,{style:L.nameRow,children:[F,V]}),f[25]=F,f[26]=V,f[27]=W):W=f[27],f[28]!==h.originalName||f[29]!==C.foregroundSubtle||f[30]!==E?(K=E?(0,R.jsx)(l.default,{style:[L.original,{color:C.foregroundSubtle}],numberOfLines:1,children:h.originalName}):null,f[28]=h.originalName,f[29]=C.foregroundSubtle,f[30]=E,f[31]=K):K=f[31],f[32]!==W||f[33]!==K?(U=(0,R.jsxs)(t.default,{style:L.body,children:[W,K]}),f[32]=W,f[33]=K,f[34]=U):U=f[34],f[35]!==h.hidden||f[36]!==C.foregroundMuted?(X=h.hidden?(0,R.jsx)(x.EyeOff,{size:16,color:C.foregroundMuted}):null,f[35]=h.hidden,f[36]=C.foregroundMuted,f[37]=X):X=f[37],f[38]!==_||f[39]!==h.hidden||f[40]!==C.backgroundElevated||f[41]!==C.border||f[42]!==C.primary||f[43]!==A?(Y=_?null:(0,R.jsx)(u.default,{value:!h.hidden,onValueChange:e=>A(!e),trackColor:{false:C.border,true:C.primary},thumbColor:C.backgroundElevated,ios_backgroundColor:C.border}),f[38]=_,f[39]=h.hidden,f[40]=C.backgroundElevated,f[41]=C.border,f[42]=C.primary,f[43]=A,f[44]=Y):Y=f[44],f[45]!==U||f[46]!==X||f[47]!==Y||f[48]!==w||f[49]!==O?(q=(0,R.jsx)(p.ScaleDecorator,{children:(0,R.jsxs)(t.default,{style:w,children:[O,U,X,Y]})}),f[45]=U,f[46]=X,f[47]=Y,f[48]=w,f[49]=O,f[50]=q):q=f[50],q}const L=f.default.create({centered:{flex:1,alignItems:'center',justifyContent:'center',padding:j.SPACING['2xl']},headerActions:{flexDirection:'row',alignItems:'center',gap:j.SPACING.sm},cornerButton:{width:34,height:34,borderRadius:17,alignItems:'center',justifyContent:'center'},hint:{fontSize:13,lineHeight:18,paddingHorizontal:j.SPACING.sm,paddingTop:j.SPACING.sm,paddingBottom:j.SPACING.md},row:{flexDirection:'row',alignItems:'center',gap:j.SPACING.lg,borderWidth:1,borderRadius:j.RADIUS.md,paddingVertical:j.SPACING.md,paddingHorizontal:j.SPACING.lg},handle:{paddingVertical:j.SPACING.sm,paddingRight:j.SPACING.xs},body:{flex:1,gap:2},nameRow:{flexDirection:'row',alignItems:'center',gap:j.SPACING.md},statusDot:{width:8,height:8,borderRadius:4},input:{flex:1,fontSize:16,fontWeight:'600',paddingVertical:0},original:{fontSize:12,marginLeft:8+j.SPACING.md}})},2573,[15,17,20,198,262,260,252,33,237,131,1072,743,2574,796,782,790,466,1099,1590,1593,1650,1643,2597,2598,10]);
|
|
4474
4474
|
__d(function(g,r,i,a,m,_e,d){"use strict";Object.defineProperty(_e,'__esModule',{value:!0}),Object.defineProperty(_e,"default",{enumerable:!0,get:function(){return l}});var e,t=r(d[0]),n=(e=t)&&e.__esModule?e:{default:e},o=r(d[1]);Object.keys(o).forEach(function(e){'default'===e||Object.prototype.hasOwnProperty.call(_e,e)||Object.defineProperty(_e,e,{enumerable:!0,get:function(){return o[e]}})});var c=r(d[2]);Object.keys(c).forEach(function(e){'default'===e||Object.prototype.hasOwnProperty.call(_e,e)||Object.defineProperty(_e,e,{enumerable:!0,get:function(){return c[e]}})});var u=r(d[3]);Object.keys(u).forEach(function(e){'default'===e||Object.prototype.hasOwnProperty.call(_e,e)||Object.defineProperty(_e,e,{enumerable:!0,get:function(){return u[e]}})});var f=r(d[4]);Object.keys(f).forEach(function(e){'default'===e||Object.prototype.hasOwnProperty.call(_e,e)||Object.defineProperty(_e,e,{enumerable:!0,get:function(){return f[e]}})});var l=n.default},2574,[2575,2590,2592,2595,2596]);
|
|
@@ -4512,8 +4512,8 @@ __d(function(g,r,i,a,m,_e,d){"use strict";Object.defineProperty(_e,'__esModule',
|
|
|
4512
4512
|
__d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,'__esModule',{value:!0}),Object.defineProperty(e,"NEW_TIMELAPSE_ID",{enumerable:!0,get:function(){return n}}),e.resolveTimelapseSource=function(s,u,l){if(s===n)return{status:'ready',rule:null,readOnly:!1,seed:(0,t.emptyTimelapseForm)()};if(void 0===u)return l?{status:'failed'}:{status:'loading'};const o=u.find(t=>t.id===s);return void 0===o?{status:'missing'}:{status:'ready',rule:o,readOnly:o.readOnly,seed:(0,t.timelapseRuleToForm)(o)}},e.timelapseSaveRequest=function(n,s,u){if(null===s)return{mode:'create',rule:(0,t.timelapseFormToInput)(n,u)};const l=(0,t.timelapseFormToPatch)(n,s,u),o=(0,t.timelapseClearsFor)(n,s);return 0===Object.keys(l).length&&0===o.length?{mode:'unchanged'}:{mode:'update',ruleId:s.id,patch:l,clear:o}},e.isTimelapseFormDirty=function(t,n){return JSON.stringify(t)!==JSON.stringify(n)};var t=r(d[0]);const n='new'},2612,[2610]);
|
|
4513
4513
|
__d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,'__esModule',{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return s}});var t=r(d[0]);r(d[1]),r(d[2]),r(d[3]);var n=r(d[4]),o=r(d[5]),c=r(d[6]);function s(){const s=(0,t.c)(1);let u;return s[0]===Symbol.for("react.memo_cache_sentinel")?(u=(0,c.jsx)(o.RootProviders,{children:(0,c.jsx)(n.Stack,{screenOptions:{headerShown:!1}})}),s[0]=u):u=s[0],u}},2613,[15,2614,2617,2618,743,2619,10]);
|
|
4514
4514
|
__d(function(g,r,i,a,m,_e,_d){"use strict";function e(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(_e,'__esModule',{value:!0}),Object.defineProperty(_e,"default",{enumerable:!0,get:function(){return b}});var t=e(r(_d[0])),n=r(_d[1]),u=(function(e){if(e&&e.__esModule)return e;var t={};return e&&Object.keys(e).forEach(function(n){var u=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,u.get?u:{enumerable:!0,get:function(){return e[n]}})}),t.default=e,t})(r(_d[2])),l=e(r(_d[3])),o=e(r(_d[4])),c=e(r(_d[5]));const f={en:{translation:o.default},it:{translation:c.default}},s=u.getLocales()[0]?.languageCode?.slice(0,2)??"en",d=Object.keys(f).includes(s)?s:"en";t.default.use(n.initReactI18next).init({resources:f,lng:d,fallbackLng:"en",showSupportNotice:!1,interpolation:{escapeValue:!1}}),l.default.getItem("v2.language").then(e=>{"it"!==e&&"en"!==e||t.default.changeLanguage(e)});var b=t.default},2614,[1075,1072,2211,783,2615,2616]);
|
|
4515
|
-
__d(function(e,t,a,o,n,i,s){n.exports={devices:{editDevice:"Edit device",originalName:"Original name",customName:"Custom name",customNamePlaceholder:"Leave empty to use original",icon:"Icon",typeLight:"Light",typeSwitch:"Switch",typeCover:"Cover",typeLock:"Lock",typeAlarm:"Alarm",typeButton:"Button",typeSelect:"Select",typeSiren:"Siren",typeSensor:"Sensor",typeEntry:"Entry",typeMediaPlayer:"Media Player",typeScript:"Script",run:"Run",sourceHA:"Home Assistant",sourceScrypted:"Scrypted",off:"Off",on:"On",mute:"Mute",unmute:"Unmute",stop:"Stop",locked:"Locked",unlocked:"Unlocked",open:"Open",closed:"Closed",disarmed:"Disarmed",disarm:"Disarm"},common:{error:"Error",save:"Save",cancel:"Cancel",loading:"Loading...",comingSoon:"Coming soon",back:"Back",fullscreen:"Fullscreen",exitFullscreen:"Exit fullscreen",reset:"Reset",selectAll:"Select all",deselectAll:"Deselect all",delete:"Delete",retry:"Retry"},grids:{newGrid:"New grid",deleteConfirm:"Delete this grid?",noGrids:"No grids yet. Create one to arrange cameras in a mosaic view.",createGrid:"Create grid",cameras:"cameras",notFound:"Grid not found.",noCameras:"No cameras in this grid. Edit the grid to add some.",edit:"Edit",addCamera:"Add camera",presets:"Presets",auto:"Auto",manual:"Manual",gridName:"Grid name",view:"View",addCameraHint:"Add at least one camera from the button above.",allCamerasAdded:"All cameras already in grid",cameraUnavailable:"Camera unavailable",camerasInGrid:"Cameras in grid",addAll:"Add all",addCameras:"Add Cameras",backToGrid:"Back to Grid",timelineNotSupported:"Timeline not supported"},nav:{cameras:"Cameras",grids:"Grids",library:"Library",notifications:"Notifications",events:"Events",videoclips:"Videoclips",list:"List",settings:"Settings"},cameras:{addCamera:"Add camera",pipActive:"PiP active",reorderEnable:"Reorder",reorderDisable:"Unlock",live:"Live",noCameras:"No cameras configured",noIntegrations:"No integrations configured. Add a system to get started.",createSystem:"Create system",importFrom:"Import cameras from",importSuccess:"Import complete",importCount:"{{count}} cameras imported",selectCamerasToImport:"Select cameras to import",selectAll:"Select all",deselectAll:"Deselect all",importSelected:"Import {{count}} selected",noCamerasFound:"No cameras found",play:"\u25b6 Play",paused:"Paused",noDataForDate:"No data for this date",recordingNotAvailable:"Recording not available",noEventsReel:"No recent events",settings:"Settings",highlightMotion:"Motion Highlight",highlightOnMotion:"Highlight on motion",highlightAudio:"Audio Highlight",audioMode:"Mode",audioModeOff:"Off",audioModeSensor:"Sensor",audioModeLevel:"Level",audioPreset:"Audio Preset",audioPresetCustom:"Custom",audioPresetCrying:"Crying / baby",audioPresetAlarm:"Alarm / siren",audioPresetDog:"Dog barking",audioPresetDoorbell:"Doorbell / knock",audioPresetGlass:"Glass break",audioWindow:"Window (s)",audioThreshold:"Threshold (dB)",audioHitPercentage:"Hit (%)",audioHoldSeconds:"Hold (s)",highlightDetection:"Object Detection Highlight",highlightOnDetection:"Highlight on detection",detectionClasses:"Classes",holdSeconds:"Hold (s)",rtspNotSupportedWeb:"RTSP streams are not supported on web. Use the mobile app.",liveDetections:"Live detections",filterTimeline:"Filter timeline",filterClasses:"Filter classes...",filterBySeverity:"Filter by severity",severityAlert:"Alert",severityDetection:"Detection",statusPosition:"Status Indicators Position",today:"Today",yesterday:"Yesterday",timeline:"Timeline",timelineEventsClusterEvents:"Events",selectDate:"Select a date",videoclipsNotSupported:"Videoclips not supported for this camera",noVideoclipsForDate:"No videoclips for this date",endOfList:"End of list",backToLive:"Back to live",goLive:"Go live",loadingClip:"Loading clip...",clusterDetailShowBbox:"Show bounding box on image",clusterDetailOpenVideoclip:"Open videoclip",clusterDetailLoadingEvents:"Loading events...",devices:"Devices",noAssociatedDevices:"No devices linked. Configure in Settings > Cameras.",timelineData:"Timeline data",timelineDataHint:"What to show on the timeline.",timelineDataVideoclips:"Videoclips",timelineDataAdvancedNotifier:"Advanced Notifier",timelineDataEvents:"Events",timelineEvents:"Timeline events",timelineEventsHint:"Which event types to show on the timeline, by severity.",timelinePresetAll:"All",timelinePresetImportant:"Important",timelinePresetCritical:"Critical",timelinePresetCustom:"Custom",statusBlock:"Status Block",sensorsBlock:"Sensors Block",position:"Position",indicators:"Indicators",downloadSnapshot:"Download Snapshot",exportDownloadClip:"Download Clip",exportRecordingWebOnly:"Recording export (web only)",exportSnapshot:"Export Snapshot",intercomError:"Intercom error",multiCam:"Multi-Camera",ptzNotSupported:"PTZ not supported",ptzSelectPreset:"Select PTZ Preset",snapshotFailed:"Snapshot failed"},events:{loading:"Loading events...",filterByLabel:"Filter by label",filterByLabelPlaceholder:"e.g. person, doorbell",filterByCamera:"Filter by camera",date:"Date",source:"Source",cameras:"Cameras",groupingRange:"Grouping",groupingPresetMinutes:"{{m}} min",groupingCustom:"Custom",groupingCustomMinutes:"Minutes",groupingCustomApply:"Apply",today:"Today",noCamerasFromConfig:"Cameras loaded from EventsApp config",all:"All",typesCount:"{{count}} types",camerasCount:"{{count}} cameras",cols:"cols",sourceAuto:"Auto",sourceNVR:"NVR",sourceFrigate:"Frigate",sourceVideoClips:"VideoClips API",sourceRawDetection:"Raw",sourceAdvancedNotifier:"Advanced Notifier",noScryptedIntegration:"Add a Scrypted integration in Settings to view events.",frigateNoEvents:"Events are only available for Scrypted. Select a Scrypted instance in Settings.",noSource:"Add a Scrypted or Frigate integration in Settings, then select it as the Events/Videoclips source.",loadError:"Error loading events",noEvents:"No events for this date. Try changing the date or filters.",clearCacheTitle:"Clear cache",clearCacheMessage:"Clear all cached events and videoclips data? This will force a fresh fetch on next load.",clearCacheConfirm:"Clear",columnsPerRow:"Columns per row",onlyWithClips:"Only with clips",relatedClip:"Related Clip"},settings:{integrations:"Integrations",camstackProxy:"CamStack Proxy",scrypted:"Scrypted",frigate:"Frigate",rtsp:"RTSP",homeAssistant:"Home Assistant",name:"Name",baseUrl:"Base URL",urlLocal:"Local URL",urlPublic:"Public URL",username:"Username",password:"Password",token:"Token (optional)",frigateTokenHint:"Token (optional): JWT from browser",tokenRequired:"Token",testConnection:"Test connection",testLocal:"Test Local",testPublic:"Test Public",testMqtt:"Test MQTT",connectionOk:"Connection successful",connectionError:"Connection failed",scryptedCredentialsPromptTitle:"Scrypted login",scryptedCredentialsPromptSubtitle:"Enter your Scrypted username and password to connect.",scryptedCredentialsPromptSkip:"Skip for now",usernamePlaceholder:"admin",save:"Save",tabStream:"Stream & playback",tabGeneral:"General",data:"Data",clearCacheEventsClips:"Clear events & videoclips cache",eventsClipsSourceHint:"Source for Events and Videoclips tabs.",hubReelTitle:"Hub & Reel",reelIntegrationsHint:"Choose which integrations to use for the reel.",reelScryptedSourceHint:"When using Scrypted: event source for reel.",eventsClipsAuto:"Auto",eventsClipsNoInstance:"Add a Scrypted or Frigate integration first.",exportBackup:"Export backup",exportError:"Export failed",importBackup:"Import backup",importConfirm:"This will replace all cameras, integrations and settings with the backup data. Continue?",importSuccess:"Backup restored successfully",importError:"Import failed",uiPrototypes:"UI Prototypes",uiPrototypesHint:"Explore experimental timeline designs",versions:"Versions",appVersion:"App",nativeVersion:"Native",updateNow:"Update now",updateError:"Update failed",updateAvailableTitle:"Update Available",updateAvailableMessage:"A new version of CamStack has been downloaded and is ready to install. The app will restart to apply the update.",updateInstall:"Install & Restart",updateLater:"Later",tabIntegrations:"Integrations",tabCameras:"Camera settings",theme:"Theme",themeSystem:"System",themeLight:"Light",themeDark:"Dark",language:"Language",languageSystem:"System",languageEn:"English",languageIt:"Italiano",timelineMode:"Timeline Mode",timelineModeClassic:"Classic",timelineModeTheater:"Theater",timeline:"Timeline",timelineVisible:"Show detection timeline",timelineVisibleDescription:"Display the detection timeline panel in the camera view.",clusterSize:"Cluster card size",snapshotInterval:"Snapshot refresh interval",clusterSizeXS:"XS",clusterSizeS:"S",clusterSizeM:"M",clusterSizeL:"L",clusterSizeXL:"XL",highlightAppearance:"Highlight appearance",highlightAppearanceHint:"Color and border thickness for motion, audio, and detection highlights on camera streams.",highlightMotion:"Motion",highlightAudio:"Audio",highlightDetection:"Detection",highlightColor:"Color",highlightThickness:"Thickness",selectSection:"Select section",addSystem:"Add system",selectPlatform:"Select platform",deleteInstance:"Delete instance",deleteInstanceConfirm:"Are you sure you want to delete this instance?",delete:"Delete",mqttEvents:"MQTT - Real-time events",mqttBrokerUrl:"MQTT broker URL",mqttUsername:"MQTT username",mqttPassword:"MQTT password",mqttTopicPrefix:"Topic prefix (default: frigate)",mqttOptional:"Optional",scryptedAddressAlreadyUsed:"This Scrypted address is already configured. Only one instance per address is allowed.",scryptedAdvancedNotifierRequired:"The Advanced Notifier plugin is required for the connection.",scryptedCorsTitle:"CORS configuration required (Web)",scryptedCorsBody:"In Scrypted, open the Cloud plugin settings and add your domain ({{domain}}) to the CORS Allowed Origins list. Without this, the browser will block requests to your Scrypted server.",scryptedUrlHint:"Local URL is tried first (e.g. on LAN), then public URL. At least one required.",gridLayout:"Grid layout",gridLayoutHint:"Display options for the cameras grid.",gridColumns:"Grid columns",gridColumnsHint:"Number of cameras per row. Auto = 1 on mobile, 4 on tablet.",gridShowName:"Show camera name",gridShowState:"Show state (battery, recording, sleeping)",reorderCameras:"Reorder cameras",reorderCamerasHint:"Drag to reorder cameras",reorderDone:"Done",manageCameras:"Manage cameras",manageCamerasHint:"Remove cameras from the app.",downloadSnapshot:"Download snapshot",snapshotFailed:"Could not fetch snapshot",exportSnapshot:"Snapshot",exportDownloadClip:"Download clip",exportStartRecording:"Start recording",exportStopRecording:"Stop recording",exportRecordingWebOnly:"Recording available on web",intercomError:"Intercom unavailable. Check camera credentials in Scrypted.",deleteCamera:"Remove camera",deleteCameraConfirm:"Remove {{name}} from the app?",streamPlayback:"Stream & playback",playOnOpen:"Start stream when opening camera",playOnOpenHint:"Automatically load the live stream when you open a camera.",audioOnOpen:"Unmute audio when opening",audioOnOpenHint:"Play audio when opening a camera (if supported).",streamWatchdog:"Stream watchdog",streamWatchdogHint:"Restart stream when no data received (helps with stalled connections).",cameraPlayer:"Camera player",webViewCameraDetail:"Use WebView player",webViewCameraDetailHint:"Use WebView for Scrypted cameras (faster first frame, more stable). PiP, fullscreen and intercom work. Default: native player.",streamQuality:"Stream quality",streamQualitySingle:"Single camera quality",streamQualityGrid:"Grid quality",qualityAuto:"Auto",qualityHigh:"High",qualityMedium:"Mid",qualityLow:"Sub",auto:"Auto",associatedDevices:"Associated devices",associatedDevicesHint:"Add actuators (lights, switches, covers, etc.) to control from the camera view.",linkedDevices:"Linked",reorderHint:"Use arrows to reorder",addDevice:"Add device",noEligibleDevices:"No Scrypted or Home Assistant configured. Add an integration first.",configureDevices:"Configure devices",cameraSettingsHint:"Choose a camera to configure its specific options.",noCamerasConfigured:"No cameras configured.",searchDevices:"Search devices...",source:"Source",type:"Type",all:"All",noMatchingDevices:"No devices match the filters.",frigateStream:"Frigate Stream",frigateStreamSourceHint:"Stream source: WebRTC (default), RTSP, or MJPEG.",frigateStreamMapping:"Stream mapping (go2rtc names from config)",frigateStreamMappingHint:"Select from available go2rtc streams. Order: Main, Sub, Low.",frigateSelectStream:"Select stream",frigateAddStream:"Add stream",frigateInfo:"Camera info",frigateShowConfig:"Show config",frigateShowGo2rtc:"Show go2rtc",frigateMissingConfig:"Missing baseUrl or cameraName in camera config.",tabLogs:"Logs",logsCount:"{{count}} entries",logsDownload:"Download",logsClear:"Clear",logsEmpty:"No logs yet. Console output will appear here.",logsExportError:"Export failed",logsExportTitle:"Export logs",logsClearConfirmTitle:"Clear logs",logsClearConfirmMessage:"Remove all log entries?",hubAppearanceTitle:"Appearance",hubAppearanceDesc:"Theme, language, timeline and highlights",hubCamerasTitle:"Cameras",hubCamerasDesc:"Grid layout, stream quality and camera management",hubIntegrationsTitle:"Integrations",hubIntegrationsDesc:"Manage Scrypted, Frigate and other systems",hubAdvancedTitle:"Advanced",hubAdvancedDesc:"Data backup and cache management",hubLogsTitle:"Logs",hubLogsDesc:"View and export application logs",hubCacheTitle:"Cache",frigateAutoSnap:"Auto Snapshot",frigateSegmentNav:"Segment Navigation",frigateShowGo:"Show Go2RTC",frigateTimeline:"Timeline",reelCameras:"Reel Cameras",reelCamerasHint:"Select which cameras appear in the events reel",reelDeselectAll:"Deselect All",reelDetectionClasses:"Detection Classes",reelDetectionClassesHint:"Filter events by detection class",reelIncludeRuleArtifacts:"Include Rule Artifacts",reelIncludeRuleArtifactsHint:"Show rule-based events in the reel",reelRuleArtifacts:"Rule Artifacts",reelSelectAll:"Select All",reelBadgeContent:"Badge content",reelBadgePosition:"Badge position",reelBadgeSize:"Badge size",reelBadgeBoth:"Time + Class",reelBadgeTime:"Time only",reelBadgeClass:"Class only",reelBadgeNone:"Hidden",reelBadgeSmall:"Small",reelBadgeMedium:"Medium",reelBadgeLarge:"Large"},reel:{filterMotion:"Motion",filterOnlyRules:"Only rules",filterOnlySensors:"Only sensors",goToMostRecent:"Go to most recent"},v2:{common:{connecting:"Connecting\u2026",online:"Online",offline:"Offline",loadError:"Loading error",create:"Create",back:"Back",on:"On",off:"Off",confirm:"Confirm",cancel:"Cancel",ok:"OK",done:"Done"},cameras:{empty:"No cameras",hubNotAnswering:"The hub isn't answering. Some cameras may belong to a node that is currently offline \u2014 pull to retry.",statusOnline:" \xb7 online",statusOffline:" \xb7 offline",motion:"Motion",doorbell:"Doorbell",doorbellRinging:"Ringing",doorbellLastRing:"Ring {{time}} ago",snapshotLoading:"Loading\u2026",refreshing:"Updating\u2026",stationaryFor:"stationary {{min}}m",manage:"Manage cameras",manageHint:"Drag to reorder. Rename inline. Toggle to show or hide a camera from the list.",arrangeStart:"Reorder the list",arrangeConfirm:"Save this order",arrangeCancel:"Discard these changes",arrangeHint:"Drag the cameras into the order you want, then tap the tick to save it. The tick saves; the cross puts the list back the way you found it. This order is kept on this device only.",reorderHandle:"Drag to reorder",appearance:"Appearance",editList:"Edit list",listOptions:"Camera list options",controlsA11y:"Camera controls",disabledTitle:"Out of service",disabledHint:"Disabled by an administrator",emptyOutOfScope:"No cameras in your access profile",emptyOutOfScopeHint:"Your account has no cameras assigned to it yet. Ask whoever administers this hub to grant you access.",snapshotStale:"Snapshot {{age}} old",hubNotProvisioning:"Hub not answering",reelFilter:"Recent events",reelFilterAll:"Showing every event",reelFilterDefaultHint:"Showing detection events only \u2014 audio and sensor events are hidden",reelFilterCount:"{{count}} event types shown",reelFilterUseDefault:"Default",reelFilterShowAll:"Everything",reelFilterDefaultTag:"Detections",reelFilterCountTag:"{{count}} types",overlayA11y:"Play in the movable window",favourites:"Favourites",locationFilter:"Filter by location",bucketEmpty:"Nothing here yet. Star a camera with the heart, or pick another place above."},cameraDetail:{fallbackName:"Camera #{{id}}",mute:"Mute",unmute:"Unmute",snapshot:"Snapshot",snapshotFailed:"Could not capture a snapshot.",ptz:"PTZ controls",talk:"Talk",fullscreen:"Fullscreen",talkFailed:"Could not start talk-back. Check microphone access.",pip:"Picture in Picture",exitFullscreen:"Exit fullscreen",devices:"Devices",devicesEmpty:"No connected devices.",linkedModeAuto:"Link: Auto (same location)",linkedModeManual:"Link: Manual",close:"Close",deviceOnline:"Online",deviceOffline:"Offline"},grids:{createA11y:"Create grid",empty:"No grids",emptyHint:"Tap + to create your first grid",countNone:"No cameras",countOne:"1 camera",countOther:"{{count}} cameras",defaultName:"New grid",deleteTitle:"Delete grid",deleteConfirm:"Delete \"{{name}}\"? This cannot be undone.",export:"Export",exportAllA11y:"Export all grids",shareA11y:"Share grid",editA11y:"Edit grid",deleteA11y:"Delete grid",linkCopied:"Grid link copied to clipboard",layoutAuto:"Auto",layoutColumns:"{{count}} cols",camerasUnknown:"Cameras not loaded yet",highlightOff:"Highlight off",hiddenCount_one:"{{count}} hidden",hiddenCount_other:"{{count}} hidden",offlineCount_one:"{{count}} offline",offlineCount_other:"{{count}} offline",disabledCount_one:"{{count}} switched off",disabledCount_other:"{{count}} switched off",missingCount_one:"{{count}} unavailable",missingCount_other:"{{count}} unavailable"},gridView:{editA11y:"Edit grid",fallbackTitle:"Grid",notFound:"Grid not found",emptyGrid:"This grid is empty",addCameras:"Add cameras",reorderTitle:"Reorder cameras",reorderA11y:"Reorder cameras",reorderDoneA11y:"Done reordering",allHidden:"All cameras are hidden. Use reorder mode to show some.",dragA11y:"Drag to reorder",hideA11y:"Hide from grid",showA11y:"Show in grid",removeA11y:"Remove from grid",adhocTitle:"Quick grid",cellActions:"Camera actions",cellActionsA11y:"More actions for this camera",cellDevicesA11y:"Linked devices",cellMenuA11y:"View options"},gridBuilder:{title:"Edit grid",nameLabel:"Name",namePlaceholder:"Grid name",camerasSelected:"Cameras ({{count}} selected)",optionsTitle:"Options",showName:"Show camera name",export:"Export grid",orderSection:"In the grid",orderHint:"Drag to reorder",emptyOrder:"No cameras yet \u2014 add some below.",addSection:"Add cameras",removeA11y:"Remove from grid",addA11y:"Add to grid",highlightMotion:"On motion",highlightAudio:"On audio",highlightAudioLow:"Low",highlightAudioMid:"Mid",highlightAudioHigh:"High",highlightAudioSensor:"Presence",highlightAudioLevel:"Level",highlightThreshold:"Threshold",highlightHold:"Hold",highlightDetection:"On detection",clusterLabel:"Cluster label",clusterLabelIcon:"Icon",clusterLabelText:"Text"},gridBar:{back:"Back",pauseAll:"Pause all",playAll:"Play all",audio:"Audio",quality:"Stream quality",layout:"Layout",timeline:"Timeline",highlightMenu:"Highlight & overlays",activeOnly:"Active only",share:"Share grid",edit:"Edit grid",hide:"Hide controls",show:"Show controls",muteAll:"Mute all",unmuteAll:"Unmute all"},gridMenu:{highlightMaster:"Highlight borders"},gridShare:{title:"Share \"{{name}}\"",quality:"Stream quality",layout:"Layout",showNames:"Show camera names",activeOnly:"Active cameras only",boxes:"Bounding boxes",highlightEnable:"Highlight",audioSummary:"Audio starts on for {{count}} camera(s)",ttlTitle:"Link expires",ttl_1d:"1 day",ttl_7d:"7 days",ttl_30d:"30 days",ttl_never:"Forever",tokenNotice:"The link includes a view-only access token limited to these cameras. Anyone with the link can watch until it expires or is revoked.",copyLink:"Copy link",creating:"Creating link\u2026",copiedExpires:"Link copied \u2014 expires {{date}}",copiedNever:"Link copied \u2014 never expires",error:"Could not create the share link. Check the connection and try again.",optionAuto:"Auto"},gridControls:{play:"Play",pause:"Pause",mute:"Mute",unmute:"Unmute",quality:"Quality",layout:"Layout",layoutAuto:"Auto"},events:{comingSoon:"Events \u2014 coming soon",searchLabel:"Search label\u2026",searchSubmit:"Search",searchClear:"Clear search",empty:"No events",today:"Today",yesterday:"Yesterday",weekdayShort:{sun:"Sun",mon:"Mon",tue:"Tue",wed:"Wed",thu:"Thu",fri:"Fri",sat:"Sat"},filteredEmpty:"No matches in the loaded range",loadOlder:"Load older",selectPrompt:"Select an event to see its detail",filters:"Filters",more:"More",all:"All",day:"Day",sort:"Sort",sortTime:"Newest",sortImportance:"Importance",flaggedOnly:"Flagged",flaggedOnlyHint:"Favourited, debug, or marked for training",parked:"Parked",showStationary:"Show stationary",showStationaryHint:"Off = hide parked promotions",cameras:"Cameras",classes:"Classes",attributes:"Detected",attrFaces:"Faces",attrPlates:"Plates",attributesHint:"None = all",search:"Search",searchCameras:"Search cameras\u2026",searchClasses:"Search classes\u2026",allCamerasHint:"None = all",allClassesHint:"None = all",done:"Done",density:"Density",selectHint:"Select an event",unrecognizedFace:"Face detected, not recognised",eventKinds:"Event types",displayOptions:"Display",displayTitle:"Display options",useDefaultClasses:"Default"},settings:{themeSystem:"System",themeDark:"Dark",themeLight:"Light",server:"Server",account:"Signed in as",accountUnknown:"Loading\u2026",roleAdmin:"Admin",roleViewer:"Viewer",hubActive:"Active hub",changeServer:"Change server",signOut:"Sign out",network:"Network",networkNone:"No routes probed yet",endpointUnlikely:"Unlikely usable",activeRoute:"Route in use",routeChannelLan:"LAN (direct)",routeChannelPublic:"Public tunnel",routeChannelLoopback:"Local (loopback)",routeChannelUnknown:"Unrecognised",routeReasonInitial:"configured, not yet raced",routeReasonRaceWon:"fastest in the route race",routeReasonNoWinner:"fallback \u2014 no candidate answered",routeReasonUnchanged:"unchanged since the last probe",routeReasonDisposed:"no transport",reprobe:"Re-probe routes",reprobing:"Probing\u2026",diagnoseNetwork:"Diagnose LAN routes",diagnosingNetwork:"Diagnosing\u2026",diagnoseNetworkDone:"{{ok}}/{{total}} answered /health. Open Logs and share them \u2014 look for ipv4/ipv6 http FAIL.",preferredRoute:"Preferred route",routeAuto:"Automatic",routeReasonPinned:"forced in Settings",appearance:"Appearance",theme:"Theme",info:"Info",app:"App",version:"Version",noServer:"No server",footerNote:"CamStack Viewer connects to a single camstack hub. Cameras, grids and events are managed by the server.",language:"Language",langSystem:"System",gridDefaults:"Grid defaults",showName:"Show camera name",showNameHint:"Overlay the camera name on each tile",showState:"Show status badge",showStateHint:"Show online / recording state on each tile",columns:"Columns",cameraOrder:"Camera order",orderName:"By name",orderCustom:"Custom",motionHold:"Motion highlight linger",motionHoldHint:"Keep a tile's motion highlight lit this long after motion stops.",motionHoldOff:"Off",streamQuality:"Stream quality",streamDefaults:"Stream defaults",playOnOpen:"Play on open",playOnOpenHint:"Start the live stream when a camera opens",audioOnOpen:"Audio on open",audioOnOpenMode:{"last-selected":"As you left it",on:"Always on",off:"Always off"},audioOnOpenModeHint:{"last-selected":"Each camera opens the way you last left it. A camera you have never chosen on opens silent.",on:"Every camera opens with sound.",off:"Every camera opens silent."},snapshotInterval:"Snapshot refresh",highlightAppearance:"Highlight appearance",highlightMotionColor:"Motion color",highlightAudioColor:"Audio color",highlightDetectionColor:"Detection color",highlightThickness:"Border thickness",qualityAuto:"Auto",qualityHigh:"High",qualityMid:"Medium",qualityLow:"Low",secondsValue:"{{count}}s",advanced:"Advanced",clearCache:"Clear cache",clearCacheHint:"Free up snapshots and cached data (keeps your server and settings)",clearCacheConfirmTitle:"Clear cache?",clearCacheConfirmBody:"This removes cached images and query data. Your server, sign-in and settings are kept.",clearCacheDone:"Cache cleared",exportSettings:"Export settings",exportSettingsHint:"Copy your settings as JSON",exportSettingsDone:"Settings copied as JSON",shareTitle:"Share settings",shareHint:"Save a named snapshot of this device's settings, grids and camera prefs on the hub. Anyone signed in can import it \u2014 it replaces what is on this device.",shareNamePlaceholder:"Snapshot name",shareSave:"Save",shareEmpty:"No snapshots yet",shareImportTitle:"Import this snapshot?",shareImportBody:"\"{{name}}\" will replace settings, grids and camera prefs on this device.",shareDeleteTitle:"Delete this snapshot?",shareDeleteBody:"\"{{name}}\" will be removed from the hub.",shareFailed:"Could not share settings",shareInvalid:"That snapshot is not a valid settings document.",shareMissing:"That snapshot is no longer on the hub.",viewLogs:"View logs",viewLogsHint:"Recent in-app log messages",logsEmpty:"No logs recorded yet",keepLogs:"Keep logs",keepLogsHint:"Record a rolling buffer of in-app log messages",debugMode:"Debug mode",debugModeHint:"Verbose logs across live, playback and scrub \u2014 sent to the server",logsClear:"Clear",resetSettings:"Reset settings",resetSettingsHint:"Restore all defaults",resetConfirmTitle:"Reset settings?",resetConfirmBody:"This restores all settings to their defaults.",cancel:"Cancel",confirm:"Confirm",timeline:"Timeline",reel:"Event reel",reelThumbSize:"Reel thumbnail size",reelThumbSizeHint:"Size of the tiles in the Recent events reel.",reelSizeSmall:"Small",reelSizeMedium:"Medium",reelSizeLarge:"Large",reelShowLabels:"Show labels",reelShowLabelsHint:"Show the class/identity label on reel items.",reelLabelStyle:"Class display",reelLabelStyleHint:"Show the detection class as an icon or as text on reel items.",reelShowImportance:"Show importance",reelShowImportanceHint:"Show the importance badge on reel items.",events:"Events",eventsPage:"Events page",minImportance:"Minimum importance",minImportanceHint:"Hide events scored below this across the events page and the camera timeline.",minImportanceOff:"Off",tileShowLabels:"Show labels",tileShowLabelsHint:"Show the class / identity / audio labels on event cards.",tileShowImportance:"Show importance",tileShowImportanceHint:"Show the importance badge on event cards (when scored).",tileShowCameraName:"Show camera name",tileShowCameraNameHint:"Show the camera name in the event card footer.",tileLabelStyle:"Class display",tileLabelStyleHint:"Show the detection class as an icon or as text.",tileLabelStyleIcon:"Icon",tileLabelStyleText:"Text",comingSoon:"Coming soon",cameras:"Cameras",manageCameras:"Manage cameras",manageCamerasHint:"Rename, hide, reorder",notifications:"Notifications",notificationsManage:"Manage notifications",pinchExpandsHeight:"Pinch enlarges the view",pinchExpandsHeightHint:"Pinching to zoom also grows the video taller (crops the side edges on 16:9 cameras).",navBarOnStream:"Navigation bar on a single camera",navBarOnStreamHint:"Keep the main navigation visible while watching one camera. On wide windows the side navigation is already there.",reopenLastCamera:"Reopen the last camera",reopenLastCameraHint:"Start on the camera you were watching. Only if watching it was the last thing you did \u2014 going to another page clears it.","timeline.gapPercent":"Cluster gap (%)","timeline.sizePercent":"Cluster size (%)","timeline.indicatorPositionPct":"Indicator position (%)","timeline.showImportance":"Show importance on items","timeline.showClass":"Show detection class on items","timeline.cardWidthPct":"Card width (%)",hapticsUiFeedback:"Vibrate on press",hapticsUiFeedbackHint:"A short buzz confirms buttons, switches, PTZ and player controls. Native only (iOS/Android).",buildNumber:"Build",runtimeVersion:"Runtime",runningBundle:"Running bundle",checkUpdates:"Check for updates",checkingUpdates:"Checking\u2026",updateUpToDate:"You're on the latest version.",updatesDisabled:"Updates are disabled in this build.",updateReadyTitle:"Update downloaded",updateReadyBody:"Restart the app now to apply it?",updateCheckFailed:"Could not check for updates",listOverlays:"Camera cards",listMotionBorder:"Motion ring",listMotionBorderHint:"Pulse a ring around a card while the camera sees motion.",listMotionBadge:"Motion badge position",listOccupancy:"Occupancy position",useNativeRenderer:"Use the built-in renderer",useNativeRendererHint:"Render Recent and Events inside the app instead of loading the hub-hosted embed.",toolbarDensity:"Toolbar height","toolbarDensity.small":"Small","toolbarDensity.medium":"Medium","toolbarDensity.large":"Large",general:"General",templateFollowTitle:"Follow this template?",templateFollowBody:"This device will take the latest version of \u201c{{name}}\u201d automatically. Its shared settings will be replaced, now and every time the template changes.",templateFollowing:"Following this template",templateProducing:"This device keeps it updated"},nc:{title:"Notifications",tabs:{rules:"Rules",targets:"Targets",snooze:"Snooze"},rulesPlaceholder:"Notification rules will appear here.",targetsPlaceholder:"Delivery targets will appear here.",rules:{add:"New rule",empty:"No rules yet.",loadError:"Couldn't load rules. Pull to retry.",mine:"My rules",admin:"Admin rules",system:"System events",personalBadge:"Personal",adminBadge:"Admin",edit:"Edit",delete:"Delete",cancel:"Cancel",deleteConfirmTitle:"Delete rule?",deleteConfirmMessage:"Delete \"{{name}}\"? This can't be undone.",receiveOn:"Receive on {{name}}",noOwnedTargets:"This rule doesn't deliver to any of your targets.",section:{empty:{timelapse:"No timelapses yet. A timelapse turns a night of recorded footage into a short video and sends it when the window closes \u2014 pick the cameras and the hours.",summary:"No summaries yet. A summary collects the best shot of everything that passed in front of several cameras and sends one image."},create:{timelapse:"New timelapse",summary:"New summary"},timelapse:"Timelapse",summary:"Summary"},mediaBadge:{attach:{"best-matching":"Matching image",keyFrame:"Key frame",none:"No image"},frame:{full:"Whole scene",boxed:"Boxed scene"},zoneCrop:"Zone crop",gif:"GIF",clip:"Clip",profile:"{{profile}} quality"},editor:{createTitle:"New rule",editTitle:"Edit \"{{name}}\"",basics:"Basics",nameLabel:"Name",namePlaceholder:"e.g. Front door people",triggerLabel:"Trigger",priorityLabel:"Priority",targetsLabel:"Deliver to",noTargets:"You have no targets yet. Add one under the Targets tab first.",pickTarget:"Pick at least one target.",conditionsLabel:"Conditions",section:{rule:"Rule",devices:"Cameras",conditions:"Conditions",notification:"Notification",actions:"Actions",advanced:"Advanced"},kindSection:{detection:"Conditions",sensor:"Conditions",sound:"Sound",occupancy:"Occupancy","device-events":"Device events",system:"Events",alarm:"Alarm events",mixed:"Events"},kindBlurb:{detection:"A person, vehicle or animal the camera saw. Narrow it by class, zone, face or plate; everything else is optional.",sensor:"A doorbell press or a linked sensor changing state. The picture comes from the camera the sensor is attributed to.",sound:"Fires on a confirmed window of audio, never on a picture. Name the sounds and/or keep a level threshold \u2014 with neither it can never match.",occupancy:"Fires when the count in a camera frame or a zone crosses your threshold and holds. Pick the camera first \u2014 the zone list is that camera's.","device-events":"A device or its stream going away or coming back, switched off or on, a battery or consumable running low, a camera detecting nothing. There is no frame to attach.",system:"The installation itself: a node leaving, an addon crash-looping, an update available or installed, a backup or an export finishing.",alarm:"The alarm panel: refused, arming, armed, entry delay, triggered, re-armed, sensor bypass, disarmed.",mixed:"This rule mixes events from more than one family (device events, system, alarm). It keeps firing as it is, but it can no longer be edited: create one rule per family, then delete this one."},dropTitle:"These will be removed when you save",dropHint:"This kind of rule can't use them, so keeping them would leave the rule silent.",condition:{systemEvent:"System event",sensorKinds:"Sensor kinds",eventTypeTokens:"Event-type tokens",source:"Detection source",classes:"Object classes",classesExclude:"Excluded classes",minConfidence:"Minimum confidence",zones:"Detection zones",zonesExclude:"Excluded detection zones",customZones:"Custom zones",crossing:"Zone crossing",labelEquals:"Label equals",identities:"Known faces",identitiesExclude:"Excluded faces",plates:"Known plates",devices:"Cameras",minLabelConfidence:"Minimum label confidence",minImportance:"Minimum importance",minDwellSeconds:"Minimum dwell (seconds)",deviceState:"Device state",scene:"Scene state",packagePhase:"Package phase",occupancy:"Occupancy",audio:"Sound",schedule:"Schedule",sensorTransition:"Notify when",devicesExclude:"Excluded devices"},noConditions:"No conditions available.",notForTrigger:"Not for this trigger",notForTriggerHint:"Not evaluated for the selected trigger \u2014 switch the trigger to use it.",mediaLabel:"Media",attachLabel:"Attachment",frameLabel:"Picture shows",frame:{cropped:"The subject",full:"The whole scene",boxed:"The scene, with boxes"},zoneCropLabel:"Crop to the zone",zoneCropHint:"Crop the picture to the rule's zone instead of the subject or the whole scene.",gifLabel:"Attach a GIF",gifHint:"A short animation cut from the live buffer around the moment \u2014 the camera does not have to be recording.",clipLabel:"Attach a video clip",clipHint:"An MP4 of the same cut. Destinations that take no video still get the picture.",preRollLabel:"Seconds before",postRollLabel:"Seconds after",profileLabel:"Footage quality",profile:{auto:"Automatic",high:"High",mid:"Medium",low:"Low"},templateLabel:"Message (optional)",templateTitleLabel:"Title",templateBodyLabel:"Body",templateHint:"Leave both blank for the hub's own wording.",save:"Save changes",create:"Create rule",addValue:"Add value\u2026",removeTag:"Remove {{value}}",clear:"Clear",noCameras:"No cameras available \u2014 the rule applies to all devices.",noCamerasRequired:"No cameras available.",devicesLoading:"Loading cameras\u2026",devicesUnavailable:"The hub did not return its cameras \u2014 selected ones are listed by id so they can still be removed.",deviceRemoved:"Device #{{id}} \u2014 removed",deviceUnknown:"Device #{{id}}",devicesEmptyWidens:"No camera selected: the rule will apply to ALL cameras.",plateText:"Plate text\u2026",maxDistance:"Max distance",waitForEnhancementLabel:"Wait for recognition",waitForEnhancementHint:"On: one notification at the end of the track, with the name. Off: one straight away without the name, plus a second one if the name arrives before the track ends.",recognition:{plates:{off:"Any vehicle",anyKnown:"Any plate",specific:"These plates",offHint:"The rule does not care about the plate \u2014 a vehicle whose plate could not be read matches too.",anyKnownHint:"Only vehicles whose plate was actually read, whatever it said.",specificHint:"Only these plates, matched tolerantly \u2014 plate reading is never perfect."}},customZones:{empty:"No custom zones yet. Pick a camera and draw one.",pickCamera:"Camera to draw over",noCameras:"No online cameras to draw over.",draw:"Draw zone",zoneLabel:"Zone {{index}} ({{count}} pts)",remove:"Remove zone {{index}}",title:"Draw zone \u2014 {{name}}",hint:"Tap to add points, drag a point to move. Tap the first point to close.",loading:"Loading frame\u2026",cancel:"Cancel",clear:"Clear",close:"Close",confirm:"Confirm"},addWindow:"Add window",scheduleAlways:"Always active \u2014 add a window to restrict when the rule fires.",scheduleInvert:"Active outside the windows",delivery:{immediate:"Immediate",trackEnd:"Track end",deviceEvent:"Device event",packageEvent:"Package event",systemEvent:"System event"},systemKinds:{"device-online":"Device online","device-offline":"Device offline","device-disabled":"Device switched off","device-enabled":"Device switched on","camera-online":"Camera online","camera-offline":"Camera offline","camera-disabled":"Camera switched off","camera-enabled":"Camera switched on","stream-online":"Stream online","stream-offline":"Stream offline","node-online":"Node online","node-offline":"Node offline","node-inference-unavailable":"Node has no usable inference device","detection-blind":"Camera detecting nothing","addon-crash-loop":"Addon crash loop (runner gave up)","alarm-arm-refused":"Alarm arming refused","alarm-arming":"Alarm arming","alarm-triggered":"Alarm triggered","alarm-armed":"Alarm armed","alarm-disarmed":"Alarm disarmed","addon-update-available":"Addon update available","server-update-available":"Server update available","addon-updated":"Addons updated","server-updated":"Server updated","export-completed":"Export completed","device-battery-low":"Battery low","device-battery-normal":"Battery recovered","device-consumable-low":"Consumable running low","device-consumable-normal":"Consumable replaced","device-tank-low":"Tank low (water, detergent)","device-tank-full":"Tank full (dirty water, dust)","device-tank-normal":"Tank back to normal","alarm-check-failed":"Alarm armed without checking openings","alarm-pending":"Alarm entry delay started","alarm-rearmed":"Alarm re-armed","alarm-sensor-bypass":"Alarm sensor bypassed or restored","wrapper-update-available":"Container image update available","backup-completed":"Backup completed"},systemGroups:{"device-state":"Device state",streams:"Streams",battery:"Battery",consumables:"Consumables",tanks:"Tanks","detection-blind":"Detecting nothing",nodes:"Nodes",addons:"Addons",updates:"Server & container updates","backups-exports":"Backups & exports",alarm:"Alarm"},systemFilters:{cameras:"Only when triggered by these cameras (optional)",deviceTypes:"Only these device types (optional)",nodes:"Only these nodes (optional)",packages:"Only these packages (optional)",devices:"Only these devices (optional)",excludeDevices:"Never these devices (optional)",excludeHint:"Applied after the list above: a device here is never reported, whatever else matches.",noExcluded:"No device excluded",batteryTypesWarning:"Battery and consumable alerts are narrowed by device type here. Batteries and consumables belong to sensors, containers, vacuums and mowers \u2014 rarely to a camera \u2014 so a type filter meant for liveness silences them. Leave the types empty, or put these kinds in a device rule of their own.",thresholdsHint:"The battery threshold and reminders are cluster settings (admin UI \u2192 post-analysis settings). A consumable\u2019s threshold is this rule\u2019s own.",consumableThreshold:"Consumable low at (%)",consumableThresholdHint:"This rule is told when a consumable\u2019s remaining life reaches this percentage (empty = {{defaultPercent}}%). Another rule may use its own number \u2014 each is told at its own threshold. A device that reports \u201creplace\u201d is announced whatever this says.",consumableThresholdInvalid:"A whole number from {{min}} to {{max}} \u2014 this value is not saved.",alarmSettings:"Alarm settings",alarmTriggeredMedia:"When a rule sets the alarm off, this notification carries that rule's pictures.",mixedNone:"No event selected"},media:{best:"Best image",bestMatching:"Best matching",keyFrame:"Key frame",none:"No attachment"},source:{any:"Any",pipeline:"Pipeline",onboard:"Onboard",sensor:"Sensor",audio:"Audio"},phase:{delivered:"Delivered","picked-up":"Picked up",both:"Both"},group:{scope:"Scope",class:"Detections",zones:"Detection zones",quality:"Quality",label:"Identity & plates",device:"Device event",package:"Package",system:"System events",schedule:"Schedule",occupancy:"Occupancy",audio:"Sound"},taxonomy:{person:"People",vehicle:"Vehicles",animal:"Animals",audio:"Audio",sensor:"Sensors",control:"Controls",custom:"Custom values",addCustom:"Add a custom value\u2026"},weekday:{mon:"Mon",tue:"Tue",wed:"Wed",thu:"Thu",fri:"Fri",sat:"Sat",sun:"Sun"},crossing:{exit:"Leaving",any:"Either",enter:"Entering",enterHint:"Entries and ordinary movement; never an exit.",exitHint:"Only an exit from a zone.",anyHint:"Entries, exits and ordinary movement."},deviceStateNone:"Not set \u2014 this rule is never gated on another device.",deviceStateSet:"Only while device {{deviceId}} is: {{states}}. Change it from the admin UI \u2014 this app cannot list every device.",sceneGateNone:"Not set.",sceneGateSet:"Only while scene {{sceneId}} is {{state}}.",occupancy:{zoneLabel:"Detection zone",wholeFrame:"\u2014 whole frame \u2014",zonesLoading:"Loading zones\u2026",zonesNeedCamera:"Pick the cameras above to choose one of their zones.",zonesNone:"These cameras have no zones \u2014 the count covers the whole frame.",zoneMissing:"Zone \"{{id}}\" no longer exists on these cameras. The rule still stores it and will never fire until you pick another scope.",classLabel:"Class",anyClass:"\u2014 any class \u2014",classesNone:"The hub sent no class vocabulary \u2014 the count covers every class.",classMissing:"\"{{name}}\" is not a class these cameras report. The rule still stores it and will never fire until you pick another one.",opLabel:"Fires when",op:{"became-occupied":"Became occupied","became-free":"Became free",">=":"Count \u2265","<=":"Count \u2264"},thresholdLabel:"Threshold",countLabel:"Count",sustainLabel:"Hold for (seconds)",sustainInstantHint:"A 0-second hold fires on the very first frame that crosses \u2014 expect repeat notifications from a subject that walks the edge of the zone. 15 seconds is the usual choice.",hint:"Counts confirmed tracked objects from zone analytics. The change must hold for the whole window before it fires; with no snapshot for the camera or zone the rule never fires.",classesDropped:"The class filter ({{classes}}) is dropped on save: an occupancy edge carries one class, so it would only stop this rule from ever firing. Scope the class above instead."},audio:{modeLabel:"How it fires",modeLabelOption:"\ud83d\udd0e Sounds",modeLevelOption:"\ud83d\udcc8 Volume",modeLabelHint:"Fires when enough labelled frames land inside a short window (default 2 in 5 seconds). A single-frame false positive never reaches 2; a real episode usually labels two or three frames. The rule's cooldown is the other throttle.",modeLevelHint:"Fires when the sound stays loud enough for long enough: the window below is the whole condition.",labelsLabel:"Sounds",labelsHint:"Pick at least one. The classifier labels only a frame or two per episode, so a percentage of a window could never confirm them \u2014 this mode counts those frames instead.",confirmHitsLabel:"Confirm after (frames)",confirmHitsHint:"How many labelled frames must land inside the window before a notification is sent. Default 2 \u2014 a single-frame false positive never reaches it.",confirmWindowLabel:"within (seconds)",confirmWindowHint:"The window those frames must share. Default 5 s. Two frames six seconds apart do not confirm.",labelsUnknown:"This rule stores {{labels}}, which this hub does not classify. It is kept as-is; tap it to drop it.",dbLabel:"Louder than (dBFS)",dbHint:"dBFS is negative-going: 0 is full scale, \u221296 is silence \u2014 so a HIGHER number is a NARROWER filter. Measured on this hub, a baby crying reads \u221255 to \u221226 dBFS, so a floor above \u221255 excludes most of it.",hitPercentLabel:"Hits in the window (%)",hitPercentHint:"How much of the window must match before it fires. Default 60%.",samplingLabel:"Window (seconds)",samplingHint:"The window must be FULL before it can match \u2014 a half-open window never fires. Default 10s.",failClosedHint:"Pick at least one sound or set a level floor. With neither, every sample is a hit and the hub refuses the rule rather than notifying on silence.",hint:"Fires on sustained SOUND, not on a picture: a rule with this condition is evaluated only on a confirmed audio window, never on a detection or a track. The cameras it covers need audio analysis enabled."},zonePicker:{needCamera:"Select a camera first \u2014 zones belong to a camera.",loading:"Loading zones\u2026",none:"The selected cameras have no zones.",missing:"Zone {{id}} no longer exists on the selected cameras"},dropReason:{occupancy:{sensorKinds:"An occupancy edge is not a sensor event: it carries no sensor kind, so this condition can never match one.",eventTypeTokens:"An occupancy edge carries no device event-type token \u2014 that comes from an event emitter, which a count crossing has none of.",source:"An occupancy edge is always produced by the pipeline, so any other source can never match and \u201cpipeline\u201d narrows nothing.",sensorTransition:"An occupancy edge is a count crossing, not a sensor reading: it has no raise or clear, so this choice could never narrow it."},sound:{classes:"A sound rule fires on what the camera HEARD. Its subject carries no detection, so this condition can never match one \u2014 name the sounds in the Sound condition instead.",classesExclude:"A sound rule fires on what the camera HEARD. Its subject carries no detection, so there is nothing here to exclude \u2014 name the sounds in the Sound condition instead.",minConfidence:"A sound window\u2019s evidence is a percentage of samples, not a detector score, so a confidence threshold can never be satisfied.",zones:"A sound has no position in the frame, so a zone can never match it.",zonesExclude:"A sound has no position in the frame, so a zone can never exclude it.",customZones:"A sound has no position in the frame, so a drawn area can never match it.",crossing:"A sound has no position in the frame, so it can never cross a zone boundary.",labelEquals:"A sound rule fires on what the camera HEARD. Its subject carries no detection and therefore no label \u2014 name the sounds in the Sound condition instead.",identities:"A sound rule fires on what the camera HEARD. Its subject carries no detection, so there is no face to recognise.",identitiesExclude:"A sound rule fires on what the camera HEARD. Its subject carries no detection, so there is no face to exclude.",plates:"A sound rule fires on what the camera HEARD. Its subject carries no detection, so there is no plate to read.",source:"A confirmed sound window is always stamped as an audio subject, so any other source can never match."},sensor:{sensorTransition:"Only a sensor that raises and clears (water, smoke, gas, CO, vibration, tamper, motion, contact) can fire on one edge. Pick only such sensor kinds, or the rule fires on every change."},detection:{audio:"A detection rule fires on what the camera saw. Sounds are a Sound rule of their own."}},ai:{sectionLabel:"AI description",enabledLabel:"Describe with AI",enabledHint:"Adds one sentence written by a vision model to this notification. It never withholds the notification \u2014 if the model is cold or unreachable, the alert is delivered without the sentence.",blurb:{occupancy:"The model is shown the still and told the count this rule claims, and answers whether that count holds. Your question guides what it looks at; the verdict sentence is written by the hub, so a disagreement always says so.","detection-immediate":"The model is shown the still taken at the moment this rule fired and answers your question about it.","detection-track":"The model is shown the beginning, the best moment and the end of the passage, and answers your question about what happened across them."},profileLabel:"Model",profileAuto:"Automatic",noProfiles:"No vision-capable model is configured on this hub. Add one from the admin Settings before switching this on.",profilesUnavailable:"This hub cannot list its vision models. The section still saves; the hub picks its own default model.",languageLabel:"Answer language",languageAuto:"Hub default",language:{en:"English",it:"Italian"},maxWordsLabel:"Length",maxWordsHint:"About how many words to ask for. It is an instruction to the model, not a cut \u2014 expect roughly this length, occasionally a word or two over. Unset, this rule's targets give {{words}}.",maxWordsVaries:"About how many words to ask for. It is an instruction to the model, not a cut. Your targets do not agree on a default; the strictest of them gives {{words}}, and unset each target gets its own.",promptLabel:"Your question",occupancyContract:"The answer stays a verdict: the hub asks for the count, compares it with this rule's, and writes the confirmation or the refutation itself. Your question guides the model \u2014 it cannot change the answer's format."},unsaved:{title:"Discard changes?",body:"This rule has changes that are not saved.",keep:"Keep editing",discard:"Discard"},unknownSection:"This section does not exist.",missing:"This rule no longer exists. It may have been deleted.",fixedTrigger:"Trigger: {{trigger}} \u2014 a sensor rule fires on the device event itself.",actions:{securityNote:"These actions run on your devices when the rule fires, or when someone taps one of its buttons. Check every step before saving.",problemsTitle:"Not saved until fixed:",sequencesTitle:"Sequences",sequencesEmpty:"No sequence. A sequence is a list of steps run on your devices.",addSequence:"Add sequence",removeSequence:"Remove sequence",sequenceNameLabel:"Name",sequenceNameBase:"sequence",enabledLabel:"Run when the rule fires",enabledOn:"Runs on every match (and from its buttons).",enabledOff:"Runs only when a notification button is tapped.",minDelayLabel:"Minimum delay",minDelayNone:"None",minDelayHint:"The sequence runs at most once in this time, whatever the rule's cooldown.",stepTitle:"Step {{n}}",addStep:"Add step",removeStep:"Remove step",stepKind:{wait:"Wait",cap:"Do"},waitSecondsLabel:"Seconds",deviceLabel:"Device",deviceNone:"Choose a device",deviceChange:"Change",deviceSearchPlaceholder:"Search by name, room or id",deviceMore:"{{count}} more \u2014 narrow the search",deviceNoMatch:"No device matches.",deviceLoading:"Loading devices\u2026",deviceUnavailable:"The hub did not return its devices \u2014 the list cannot be shown right now.",capLabel:"Capability",capNone:"Choose\u2026",capLoading:"Reading the device's capabilities\u2026",capUnavailable:"The device's capabilities could not be read. Type the capability name.",capEmpty:"This device exposes no capability.",capPickDeviceFirst:"Choose a device first.",methodLabel:"Method",methodHint:"The capability method to call, e.g. setState or trigger.",argsLabel:"Arguments",argsHint:"Each argument is checked when you save. JSON takes objects and lists.",addArg:"Add argument",removeArg:"Remove argument",argKeyPlaceholder:"name",argValuePlaceholder:"value",argType:{string:"Text",number:"Number",boolean:"Yes/no",json:"JSON"},buttonsTitle:"Notification buttons",buttonsEmpty:"No button.",buttonsHint:"A button on the notification that runs one of the sequences above.",addButton:"Add button",removeButton:"Remove button",buttonLabelLabel:"Label",buttonDefaultLabel:"Action",buttonSequenceLabel:"Runs",buttonSequenceNone:"Choose a sequence",buttonSequenceMissing:"{{name}} (missing)",buttonIconLabel:"Icon",iconNone:"None",icon:{acknowledge:"Acknowledge",dismiss:"Dismiss",silence:"Silence",snooze:"Snooze",view:"View",play:"Play",open:"Open",close:"Close",lock:"Lock",unlock:"Unlock",arm:"Arm","arm-home":"Arm \u2014 home","arm-away":"Arm \u2014 away","arm-night":"Arm \u2014 night",disarm:"Disarm",light:"Light",alert:"Alert",camera:"Camera"},destructiveLabel:"Destructive style",destructiveHint:"Draws the button in red. It changes how it looks, not who may press it."},readOnly:"This rule is managed by an admin. You can read it here, not change it.",problem:{title:"Not saved yet:",name:"the rule needs a name (Rule)",targets:"pick at least one target (Rule)",actions:"fix the actions (Actions)",summaryFamily:"only device and system rules can be a scheduled summary \u2014 the alarm stays instant (Conditions)",summaryActions:"a summary never matches an event, so its actions would never run \u2014 remove them (Actions)",summaryNoSendTime:"a summary needs at least one send time (Conditions)",summaryDegenerateWindow:"a send time has no day, or its window starts and ends on the same minute \u2014 it would never be sent (Conditions)",summaryActionsByAdmin:"this rule has actions an administrator added; a summary never runs them, so an administrator must remove them before it can be a summary"},mediaBlurb:{sound:"A sound owns no frame, so the picture is a photograph of the camera taken at the moment of the match \u2014 the whole scene, never a crop. The GIF and the clip are cut around the same instant, from the camera.",alarm:"An alarm set off by a rule arrives with THAT rule's pictures, combined into one notification. This rule adds none of its own."},enabledLabel:"Active",enabledHint:"Off keeps the rule and everything it says, but it notifies nobody until it is switched back on.",usersLabel:"Notify users",usersHint:"People who receive this rule on their own devices, besides the targets above. A rule needs at least one target or one user.",usersLoading:"Loading users\u2026",usersUnavailable:"The hub did not return its users \u2014 the list cannot be shown right now.",usersEmpty:"No users on this hub.",throttleLabel:"Frequency",cooldownLabel:"Cooldown (s)",cooldownHint:"After a notification, the same rule stays quiet for this many seconds. 0 = no pause.",groupIdleLabel:"Group bursts (s)",groupIdleHint:"Events arriving within this many seconds of each other are grouped into one notification. 0 = off, each event notifies on its own.",snoozeButtonsLabel:"Snooze buttons",snoozeDefaultsHint:"Not set \u2014 the notification offers the hub defaults ({{defaults}}).",snoozeNoneHint:"No snooze buttons: the notification cannot be silenced from the lock screen.",snoozeChosenHint:"Four at most. Every snooze button takes space from the rule\u2019s action buttons.",snoozeResetDefaults:"Back to hub defaults",snoozeAllowGlobalLabel:"Anyone may snooze for everyone",snoozeAllowGlobalHint:"A snooze is personal by default. On: anyone who receives this rule can snooze it for everyone, not only for themselves.",confirm:{title:"AI confirmation",enabledLabel:"Confirm with AI before notifying",enabledHint:"A vision model looks at the picture about to be sent; the notification goes out only if it agrees.",profileLabel:"Model",profileDefault:"Cluster default",profilesUnavailable:"This hub cannot list its vision profiles \u2014 the cluster default is used.",promptLabel:"Question",promptPlaceholder:"Blank: derived from the rule",expectLabel:"Count must be",expectNone:"Model decides (yes/no)",countLabel:"Count",timeoutLabel:"Timeout (s)",onTimeoutLabel:"If the model does not answer",onTimeout:{fire:"Notify anyway",suppress:"Stay silent"},onTimeoutHint:"Notify anyway is the safe choice: a slow or offline model never swallows a notification."},oneSnapshotOnlyHint:"A sensor rule attaches one snapshot of the camera automatically \u2014 there is no detection to choose a crop, a GIF or a clip around.",linkedCamerasLabel:"Linked cameras",linkedCamerasHint:"Every linked camera is photographed the moment the sensor fires; cameras that are offline or asleep are left out. Mosaic: one image composed from every linked camera. Each: one image per camera where the notifier accepts several, otherwise the first.",linkedCameras:{mosaic:"Mosaic",each:"One per camera"},clipSpeedLabel:"Playback speed",clipSpeedValue:"{{speed}}\xd7",clipSpeedHint:"A notification GIF or clip is glanced at: at 2\xd7 the whole passage takes half the time. 1\xd7 is real time.",timezone:{label:"Time zone",pickerLabel:"Schedule time zone",hub:"Hub time zone",hint:"The clock the schedule windows are read on. Unset = the hub\u2019s own time zone.",placeholder:"e.g. Europe/Rome",invalid:"Not a known time zone \u2014 it is not saved until it is valid."},snoozeExemptHint:"Alarm rule: this rule concerns \u2014 or triggers \u2014 the alarm panel, and no snooze can silence it. Snooze buttons are not offered.",snoozeMaxReached:"At most {{max}} snooze buttons \u2014 remove one first.",unlistedTargetsKept:"Targets not in your list, kept on this rule: {{count}} (another user's, or deleted since). Saving never removes them.",unlistedTargetsRemoved:"Targets no longer available to you, removed when you save: {{count}}.",saveBlocked:{rolePending:"Checking your account before saving\u2026",roleUnknown:"Couldn't confirm your account's role, so this rule can't be saved safely. Go back and open it again.",targetsPending:"Loading your targets before saving\u2026",targetsFailed:"Couldn't load your targets, so this rule can't be saved yet. Go back and open it again."},notConnected:"Not connected to the hub. Reconnect and try again.",hubTooOldToClear:"This hub is too old to clear that field, so the change was not saved. Update CamStack on the hub, then save again.",loadError:"Couldn't load this rule. Go back and open it again.",targetsUnavailable:"Couldn't load your targets. Go back and open this again.",sensorTransition:{both:"It triggers and when it clears",raised:"Only when it triggers",cleared:"Only when it clears",neverFires:"This rule belongs to the alarm, and an alarm rule fires only when an opening OPENS. Set to \u201conly when it clears\u201d, it can never fire.",hint:{both:"Every change: water detected, and back to dry.",raised:"Water detected, smoke, a contact opening \u2014 never the return to normal.",cleared:"Back to dry, smoke gone, a contact closing \u2014 never the alert itself."}},sensorsEmptyWidens:"No sensor selected: the rule will apply to ALL sensors.",sensorsUnavailable:"The hub did not return its sensors \u2014 selected ones are listed by id so they can still be removed.",systemDelivery:{label:"Delivery",instant:"Instant",summary:"Summary",instantHint:"A notification for each event, as it happens.",summaryHint:"Nothing is sent per event. At each time below, one notification lists what is still true for the kinds and filters of this rule \u2014 low batteries, consumables, devices or streams offline, updates available. Nothing to report sends nothing.",customSchedule:"Custom schedule: the summary is sent when each window below ENDS.",addTime:"Add a send time",removeTime:"Remove send time",sendAt:"Send at",bodyWarning:"This body names none of the summary ({{token}} or a section variable) \u2014 the hub appends {{token}} to it when it sends.",splitRule:"One message",splitSection:"One per category",splitHint:"One per category sends a separate notification for each category with something to report \u2014 batteries, consumables, devices offline\u2026 Needs an updated hub; an older one sends one message.",splitBodyWarning:"Sent one per category: this body names no {{token}}, so on every other category\u2019s notification the hub appends {{token}} (that category\u2019s lines)."},summaryNotKept:"This hub does not keep scheduled summaries yet, so the rule was saved as Instant. Update the server, then set the summary again.",advancedConditionsTitle:"Detection"},kind:{all:"All",detection:"Detection",sensor:"Sensor",sound:"Sound",occupancy:"Occupancy","device-events":"Devices",system:"System",alarm:"Alarm",mixed:"To recreate"},kindCreate:{all:"New rule",detection:"New detection rule",sensor:"New sensor rule",sound:"New sound rule",occupancy:"New occupancy rule","device-events":"New device rule",system:"New system rule",alarm:"New alarm rule",mixed:"New rule"},kindEmpty:{all:"No rules yet. Create one to be told what your cameras and sensors see.",detection:"No detection rules yet. Create one to be told what your cameras see.",sensor:"No sensor rules yet. A sensor rule fires on a device event \u2014 a door opening, a switch changing.",sound:"No sound rules yet. A new one opens with a level threshold already set, so you only have to name the sounds and the targets.",occupancy:"No occupancy rules yet. A new one opens on the occupancy condition \u2014 pick the camera first, then the zone and the count.","device-events":"No device rules. One tells you when a device or its stream goes away or comes back, a battery runs low, or a filter, brush or mop pad needs replacing \u2014 on any device, not only cameras.",system:"No system rules. A system rule tells you about the installation itself \u2014 a node going offline, an addon crash-looping, an update, a backup finishing.",alarm:"No alarm rules. One tells you what the alarm panel does \u2014 arming, armed, triggered, disarmed.",mixed:"No rules to recreate."},mustRecreate:"This rule mixes events from more than one family (device events, system, alarm). It still fires, but it can no longer be edited: create one rule per family, then delete this one.",mustRecreateByAdmin:"This rule mixes events from more than one family (device events, system, alarm). It still fires, but it is read-only: an admin must recreate it.",kindPicker:{title:"New rule",subtitle:"What should this rule watch?"},summary:{rule:{targets:"Sends to {{names}}",noTargets:"No target yet"},devices:{all:"Every camera",some:"Cameras selected: {{count}}",except:"Every camera except {{count}}",someExcept:"Cameras selected: {{count}}, minus {{excluded}} excluded",sensorsAll:"Every sensor",sensorsSome:"Sensors selected: {{count}}",sensorsExcept:"Every sensor except {{count}}",sensorsSomeExcept:"Sensors selected: {{count}}, minus {{excluded}} excluded"},conditions:{count:"Conditions set: {{count}}",none:"No condition \u2014 matches everything",classesExcept:"Every class except {{classes}}",classesExceptMore:"Every class except {{classes}} \xb7 conditions set: {{count}}"},notification:{custom:"Custom message \xb7 priority {{priority}}",default:"Hub default message \xb7 priority {{priority}}"},actions:{count:"Sequences: {{sequences}} \xb7 buttons: {{buttons}}",invalid:"Problems to fix: {{count}}",none:"No action"},advanced:{cooldown:"Cooldown {{seconds}} s",wait:"Waits for recognition",none:"Defaults",cooldownWait:"Cooldown {{seconds}} s \xb7 waits for recognition"},deviceList:{all:"All devices",only:"Only these devices ({{count}})",except:"All devices except {{count}}",excludedTitle:"Excluded"}},ai:{defaultPrompt:{occupancy:"Does the claimed count hold?","detection-immediate":"What is in this picture?","detection-track":"What happened during this passage?"}},actions:{args:{invalidJson:"Not valid JSON",invalidNumber:"Not a number",invalidBoolean:"Must be true or false",emptyKey:"The argument needs a name",duplicateKey:"Two arguments share this name"},stepMissingDevice:"A step has no device",stepMissingMethod:"A step has no capability or method",sequenceMissingName:"A sequence has no name",emptySequence:"A sequence has no steps",duplicateSequence:"Two sequences share a name",buttonMissingLabel:"A button has no label",duplicateButton:"Two buttons share an id",buttonMissingSequence:"A button points at a sequence that does not exist",waitOutOfRange:"A wait must be 0\u2013300 seconds",tooManyButtons:"At most 8 buttons",nameTooLong:"A sequence name is longer than 120 characters",labelTooLong:"A button label is longer than 40 characters",idTooLong:"A button id is longer than 64 characters",minDelayOutOfRange:"The minimum delay must be a whole number of seconds, up to 86400"},test:{title:"Test this rule",wouldFire:"Would fire",failed:"Did not match \u2014 the \u201c{{condition}}\u201d condition refused it",notMatched:"Did not match",firingCount:"{{firing}} of {{total}} evaluated records would fire",noRecords:"No records in the last 60 minutes \u2014 nothing to evaluate.",deviceEventUnsupported:"Sensor rules cannot be dry-run: there is no store of past sensor events to replay. The rule still fires live on a matching press or change.",note:"{{condition}}: {{note}}",detail:"\xb7 {{note}}",unavailable:"The test could not be run: {{message}}",dryRun:{button:"Dry-run (last 60 min)",hint:"Evaluates the CURRENT, unsaved rule against records from the last 60 minutes. Nothing is sent.",incomplete:"Give the rule a name and a target before a dry-run.",more:"Showing {{shown}} of {{total}} records.",targetsFailed:"Couldn't load your targets, so the dry-run can't build this rule. Go back and open it again."},now:{button:"Test now",hint:"Builds the event this rule is about, runs the real evaluation and SENDS the notification to every target, marked [TEST]. Cooldown and mute are bypassed; the rule's actions never run. Tests the SAVED rule: save first to test an edit.",confirmTitle:"Send a test notification?",confirmBody:"This really delivers \u201c{{name}}\u201d to every target it addresses, marked [TEST].",confirm:"Send test",queued:"Matched \u2014 notifications queued: {{count}}, targets: {{targets}}. Marked [TEST] in the body.",noneQueued:"Matched, but nothing was queued: every target is opted out of this rule, or it addresses none.",notCandidate:"This rule was not a candidate for a {{trigger}} event \u2014 check its trigger, and that it is enabled.",dropped:"Nothing was evaluated ({{reason}}) \u2014 the event was dropped before any rule was consulted.",still:{live:"With a live snapshot.",unavailable:"The camera returned no snapshot, so it ships text-only.",unattachable:"This kind of rule carries no picture in production either."},title:"Test this rule for real",summary:{queued:"Summary built now \u2014 notifications queued: {{count}}, targets: {{targets}}. Marked [TEST] in the body.",queuedPerCategory:"Summary built now \u2014 notifications queued: {{count}}, one per category ({{sections}}), targets: {{targets}}. Marked [TEST] in the body.",noneQueued:"The summary was built, but nothing was queued: the rule reaches no target (its users are not admins, or every target is opted out).",nothing:"Nothing to report right now \u2014 nothing was sent, exactly as the scheduled summary would send nothing.",sectionRead:"{{section}}: {{items}} open",sectionUnavailable:"{{section}}: unavailable \u2014 the state could not be read"}}},ownTargetsUnavailable:"Couldn't load your targets, so your opt-outs for this rule can't be shown.",offNotice:"Off \u2014 it will not run.",enabledSwitch:"Enabled",enableFailed:"Couldn't switch this rule {{state}}: {{error}}",enableStateOn:"on",enableStateOff:"off",enableNotApplied:"the hub kept its previous state",scope:{all:"All",only:"Only these",except:"All except these",clearedOnSave:"Saving in this mode clears {{items}} from the rule.",legacyExclusions:"This rule also excludes {{items}} \u2014 kept when you save.",removeExclusions:"Remove exclusions",everyDevice:"Every camera \u2014 no restriction.",everyClass:"Every class \u2014 no restriction.",classNotListed:"{{name}} \u2014 not in the class list",classTitle:"Classes",classSearch:"Search classes",classNoMatches:"No class matches",classesEmptyWidens:"No class left: saving applies the rule to every class.",classesUnavailable:"The class list could not be read.",everySensor:"Every sensor \u2014 no restriction.",everyZone:"Every zone \u2014 no restriction.",zoneTitle:"Zones",zonesEmptyWidens:"No zone left: saving applies the rule to every zone.",zonesUnavailable:"The zone list could not be read.",zoneSearch:"Search zones",zoneNoMatches:"No zone matches",zoneNotListed:"{{name}} \u2014 no longer on these cameras",everyPerson:"Anyone \u2014 no restriction.",anyKnownFace:"Any known face",noFaceExcluded:"Nobody excluded",faceTitle:"Faces",facesUnavailable:"The face gallery could not be read.",faceSearch:"Search people",faceNoMatches:"No person matches",faceNotListed:"{{name}} \u2014 not in the gallery",everyLabel:"Any label \u2014 no restriction."},lastRun:{label:"Last run",notInDays_one:"Not in the last day",notInDays_other:"Not in the last {{count}} days",notInHours_one:"Not in the last hour",notInHours_other:"Not in the last {{count}} hours",notInMinutes_one:"Not in the last minute",notInMinutes_other:"Not in the last {{count}} minutes",notInWindow:"Not in the window read",never:"No delivery on record",unavailable:"Last run could not be read",status:{sent:"Sent",pending:"Pending",dead:"Failed"}},history:{action:"History",title:"Deliveries of {{name}}",titleFallback:"Rule deliveries",empty:"No deliveries for this rule",error:"History could not be loaded",deviceById:"Device #{{id}}",noImage:"No image right now",target:"Target",adminOnly:"Only an administrator can see a rule\u2019s deliveries",verdictUnknown:"Could not check your access to this rule\u2019s deliveries",stateSummary:"State summary"},summaryDelivery:{label:"Summary \xb7 {{when}}",custom:"Summary \xb7 custom schedule",daily:"daily",weekdays:"weekdays",weekends:"weekends"},snoozeSwitch:"Snooze 30 min",snoozeFailed:"Couldn't change this rule's snooze: {{error}}"},targets:{add:"Add target",empty:"No targets yet. Add one to start receiving notifications.",loadError:"Couldn't load your targets. Pull to retry.",pickKind:"Choose a notification kind",noKinds:"No notification kinds are available.",kindUnavailable:"unavailable",test:"Send test",testing:"Sending\u2026",testOk:"Test delivered",testFail:"Test failed",edit:"Edit",delete:"Delete",cancel:"Cancel",save:"Save changes",create:"Create target",addTitle:"Add {{kind}} target",editTitle:"Edit {{name}}",deleteConfirmTitle:"Delete target",deleteConfirmMessage:"Delete \"{{name}}\"? This can't be undone.",form:{details:"Details",config:"Configuration",nameLabel:"Name",nameHint:"A label to recognize this target.",secretHint:"Leave blank to keep the saved value."}},snooze:{title:"Snooze",intro:"A snooze silences YOU, not the household \u2014 unless a rule says otherwise. It ends by itself.",activeNone:"Nothing is snoozed.",active:"Silenced now",past:"Recently ended",openTitle:"Silence for",scopeLabel:"What to silence",everything:"Everything",aRule:"One rule",aCamera:"One camera",chooseRule:"Choose a rule",chooseCamera:"Choose a camera",camerasLoading:"Loading your cameras\u2026",noCameras:"No cameras to silence.",globalLabel:"Silence it for everyone",globalHelp:"Other people stop being notified too.",globalNotAllowed:"This rule can only be silenced for you.",summaryLabel:"Tell me what I missed",summaryHelp:"A summary arrives when the window ends.",endNow:"End now",endsIn:"ends in {{label}}",everyone:"for everyone",loadError:"Couldn't load your snoozes.",createError:"Couldn't start that snooze.",classesTitle:"Only these",classesHelp:"Leave this alone and the window covers everything. Pick classes to silence only those \u2014 the rest still reaches you.",everyClass:"Everything",durations:{m10:"10 min",m30:"30 min",h1:"1 hour"},scope:{rule:"One rule",device:"One camera",all:"Everything"},remaining:{ended:"over",minutes:"{{minutes}} min",hours:"{{hours}}h",hoursMinutes:"{{hours}}h {{minutes}}m"},viewOnly:"Your account can see snoozes but not open one."},timelapse:{createTitle:"New timelapse",editTitle:"Edit \u201c{{name}}\u201d",namePlaceholder:"Driveway overnight",enabledLabel:"Active",camerasHint:"One video per camera. A camera that is not recording cannot produce a timelapse \u2014 the hub refuses the save and says which one.",windowLabel:"Window",windowHint:"The hours this covers. The window is the rule: it starts collecting when the window opens and sends the video when it closes.",samplingLabel:"Sampling",cadenceLabel:"One frame every (s)",framerateLabel:"Playback (fps)",previewHint:"What the notification shows before you open the video.",preview:{image:"Still",gif:"GIF"},problem:{devices:"Pick at least one camera.",schedule:"Add at least one window \u2014 a timelapse with no hours never runs.",denseCadence:"The rate near detections must be at least 0.1 s and shorter than the cadence above.",minDwell:"The minimum time must be between 0 and 60 s.",template:"The title can be up to 500 characters, the body up to 2000.",previewText:"The caption can be up to 200 characters.",reportClasses:"Up to 20 classes, each up to 40 characters."},denseCadenceLabel:"Near detections, one frame every (s)",denseCadenceHint:"Around a detection the video samples faster, so a person walking by is more than two frames. Empty means automatic: a thirtieth of the cadence above, at least 1 s. If you set it, it must be shorter than the cadence above.",minDwellLabel:"Minimum time per detection (s)",minDwellHint:"The least amount of video each detection gets; the hub samples faster to reach it. Empty means no minimum.",messageLabel:"Message",messageHint:"Title and body of the notification. Left empty, the hub writes its own.",previewTextLabel:"Preview caption",previewTextHint:"Written over the preview frame. Empty means the default caption: \u201cTimelapse\u201d and the camera name.",reportClassesLabel:"Counted classes",reportClassesHint:"Which detections the notification counts. None selected means every class the window contained.",loadError:"Couldn't load the timelapse rules.",previewTextNoneHint:"This rule is set to show no caption at all (chosen in the web admin). Leave the box empty to keep it that way; type a caption to add one.",captionPreviewLabel:"Caption preview",editorTitle:"Timelapse"},summary:{createTitle:"New summary",editTitle:"Edit \u201c{{name}}\u201d",namePlaceholder:"Overnight round-up",enabledLabel:"Active",camerasHint:"One image covering all of them \u2014 the best shot of everything that passed.",windowLabel:"Window",window:{motion:"On motion",schedule:"On a schedule"},motionHint:"Opens on the first movement at any of these cameras and stays open while more keeps arriving.",scheduleHint:"Fixed hours. The summary is sent when the window closes.",quietLabel:"Close after quiet (s)",maxWindowLabel:"Never longer than (s)",hubTooOld:"This hub only lets an administrator create summaries. You can see them here; update the hub to edit them from the app.",problem:{devices:"Pick at least one camera.",window:"Check the window \u2014 a scheduled summary needs hours, and \u201cnever longer than\u201d has to be greater than the quiet period.",barrier:"The wait for tracks is between 0 and 3600 seconds.",budget:"The AI can look at no more pictures than the mosaic holds (1\u201324 tiles, 1\u20138 for the AI).",filters:"Check what goes in \u2014 no class can be both included and excluded for all, and importance is 0\u20131.",caption:"The caption is at most 200 characters.",template:"The title is at most 500 characters and the text at most 2000.",ai:"Check the AI settings \u2014 question up to 2000 characters, picture 64\u20132048 px, time limit 10\u2013600 s."},editorTitle:"Summary",loadError:"Couldn't load this summary. Check the connection and try again.",section:{content:"What goes in",mosaic:"Mosaic",ai:"AI",delivery:"Delivery"},barrierLabel:"Wait for tracks to close (s)",barrierHint:"A subject's best shot is saved when its track ends. The summary waits up to this long so the ones still moving get a picture.",classesLabel:"Classes",classesHint:"Empty = every class.",classesExcludeLabel:"Excluded classes",classesExcludeHint:"Never in the summary, even when included above.",zonesLabel:"Zones",zonesHint:"Zones apply per camera: picking a zone on one camera does not mute the others.",minImportanceLabel:"Minimum importance",minImportanceHint:"A score from 0 to 1. Empty = no minimum.",minDwellLabel:"Minimum stay (s)",minDwellHint:"Empty = no minimum.",includeStationaryLabel:"Include parked objects",includeStationaryHint:"Off by default: a summary is a record of passages, and a parked car would take every tile.",rankLabel:"When there are too many, keep",rank:{importance:"Most important",recency:"Most recent",dwell:"Longest stay"},maxTilesLabel:"Pictures in the mosaic",captionsLabel:"Text on the mosaic",captions:{none:"None",tiles:"Under each tile",all:"Tiles and caption"},captionsHint:"Text is burnt into the picture for good. \u201cNone\u201d keeps it images only.",captionTextLabel:"Caption",captionTextHint:"Drawn across the top only with \u201cTiles and caption\u201d. Empty means the default caption (the rule name and the window's hours).",captionTextNoneHint:"This summary is set to show no caption at all. Type one to add it; leave it empty to keep none.",aiEnabledLabel:"Describe with AI",aiEnabledHint:"A vision model looks at the window's pictures together and writes what happened into the message.",aiProfileLabel:"Model",aiProfileDefault:"Hub default",aiProfilesUnavailable:"This hub couldn't list its AI models. The one already set is kept.",aiPromptLabel:"Question",aiPromptPlaceholder:"The standard question",aiLanguageLabel:"Answer language",aiLanguage:{default:"Model default",en:"English",it:"Italian"},aiMaxImagePxLabel:"Picture size for the model (px)",aiMaxImagePxHint:"Empty = the hub default.",aiTimeoutLabel:"Time limit (s)",aiTimeoutHint:"Empty = the hub default.",aiOnFailureLabel:"If the AI fails",aiOnFailure:{"deliver-without-text":"Send without the text",skip:"Hold the summary"},aiSkipWarning:"With \u201cHold the summary\u201d, a window whose AI pass fails is not delivered at all \u2014 no mosaic, no counts \u2014 and it does not come back.",maxAiImagesLabel:"Pictures the AI looks at",maxAiImagesHint:"At most as many as the mosaic holds.",deliverEmptyLabel:"Send an empty summary",deliverEmptyHint:"Off: a window where nothing matched sends nothing.",messageHint:"Empty = the standard title and text."},family:{cameras_one:"{{count}} camera",cameras_other:"{{count}} cameras",never:"Nothing sent yet.",last:"Last sent {{when}}.",off:"Switched off \u2014 it will not run.",readOnly:"Created by an administrator. You can see it here but not change it."},templateVars:{camera:"Camera",class:"Detected class",label:"Name or plate",subject:"Subject sentence",confidence:"Confidence",count:"Count",detectionSummary:"Detection summary",zones:"Zones",zone:"Zone",inZones:"\"in <zones>\" fragment",scope:"Occupancy scope",time:"Time",rule:"Rule name",from:"Window start",to:"Window end",capacity:"Capacity",op:"Occupied / free",sounds:"Sounds heard",hitPercent:"Share of the window",db:"Peak level (dBFS)",eventType:"Event type",ai:"AI sentence",eventKind:"Event kind",deviceName:"Device",deviceId:"Device id",percentage:"Percentage",item:"Consumable",tank:"Tank",profile:"Stream profile",node:"Node",nodeId:"Node id",devices:"Devices",addons:"Addons",minutes:"Minutes",package:"Package",packageName:"Package name",nodes:"Nodes",currentVersion:"Current version",latestVersion:"Latest version",list:"Updated packages",fromVersion:"From version",toVersion:"To version",destinationsOk:"Destinations ok",destinationsTotal:"Destinations",destinationsFailed:"Destinations failed",sizeMB:"Size (MB)",backupId:"Backup id",title:"Export title",exportId:"Export id",bytes:"Export size (bytes)",mode:"Alarm mode",seconds:"Seconds",rules:"Covering rules",names:"Device names",skippedNames:"Skipped devices",bypassedNames:"Bypassed sensors",coverage:"Coverage %",events:"Events",detections:"Detections",count_person:"Count of one class",cameras:"Cameras",matched:"Matched events",shown:"Events shown",total:"Events total",summaryText:"Summary: every section",summaryCount:"Summary: items reported",summarySection:"Summary: this category",summaryDevices:"Summary: devices offline / switched off",summaryStreams:"Summary: streams offline",summaryBattery:"Summary: low batteries",summaryConsumables:"Summary: consumables",summaryTanks:"Summary: tanks",summaryDetection:"Summary: cameras detecting nothing",summaryNodes:"Summary: nodes",summaryAddons:"Summary: addons",summaryUpdates:"Summary: server & container updates"},templateField:{groups:{subject:"Subject",place:"Place",time:"Time",rule:"Rule",occupancy:"Occupancy",sound:"Sound",sensor:"Sensor",system:"System",digest:"Digest",ai:"AI"},noVars:"No variables for this field.",unknown:"These placeholders will be empty in this notification: {{names}}",preview:"Preview (example values)"},deviceType:{camera:"Camera",hub:"Hub",light:"Light",siren:"Siren",switch:"Switch",sensor:"Sensor",thermostat:"Thermostat",climate:"Climate",button:"Button","event-emitter":"Event emitter",update:"Update",generic:"Generic",notifier:"Notifier",script:"Script",automation:"Automation",lock:"Lock",cover:"Cover",valve:"Valve",humidifier:"Humidifier","water-heater":"Water heater",fan:"Fan","media-player":"Media player","alarm-panel":"Alarm panel",control:"Control",presence:"Presence",weather:"Weather",vacuum:"Vacuum","lawn-mower":"Lawn mower",container:"Container",image:"Image","pet-feeder":"Pet feeder"},prune:{device:"Disabled on {{date}}: its last device (#{{id}}) was deleted.",target:"Disabled on {{date}}: its last delivery target ({{id}}) was deleted."},alarm:{title:"Alarm",navLabel:"Alarm",navHint:"Panel, modes, recipients and delays",entryHint:"Time between a trigger and the alarm firing \u2014 long enough to reach the keypad.",notAdmin:"Only an administrator can configure the alarm. The hub does not let this account change it.",verdictUnknown:"Couldn't confirm your role with the hub, so the alarm settings are not shown.",retry:"Try again",loadFailed:"Couldn't load the alarm settings: {{error}}",noPanel:"This installation has no alarm panel. The Notification Center creates it on the hub \u2014 if this is the hub, its creation failed and the server log says why.",sections:{state:"State",modes:"Modes",recipients:"Recipients",delays:"Default delays"},stateWord:{disarmed:"Disarmed",armed:"Armed",arming:"Arming",disarming:"Disarming",pending:"Entry delay",triggered:"Triggered"},stateWithMode:"{{state}} \u2014 {{mode}}",liveUnknown:"The hub did not report the panel's state.",exclusionOpen:"{{name}} \u2014 ignored until it closes",exclusionClosed:"{{name}} \u2014 closed, watched again at its next opening",modeDelays:{title:"Delays for {{mode}}",inherited:"Default ({{seconds}} s)",useDefault:"Use default"},modesHint:"What each mode arms comes from the enabled rules gated on it. Nothing here is stored \u2014 change a rule and this changes with it.",coverageNone:"Arms nothing \u2014 no enabled rule is gated on this mode.",coverageAll_one:"Every device \u2014 {{count}} rule with no device scope.",coverageAll_other:"Every device \u2014 {{count}} rules with no device scope.",coverageRules_one:"{{count}} rule, no device restriction.",coverageRules_other:"{{count}} rules, no device restriction.",coverageDevices:"Covers: {{devices}}",skipped:"Named but not armed: {{devices}}",skipReason:{muted:"notifications muted","detection-off":"detection off",offline:"offline"},openingsUnknown:"Open devices: not reported by the hub.",openingsNone:"Nothing this mode covers is open now.",openingsCount:"Open now: {{blocking}} blocking, {{nonBlocking}} non-blocking, {{unknown}} unreadable",openingBlocking:"{{name}} ({{state}}) \u2014 refuses the arm",openingNonBlocking:"{{name}} ({{state}}) \u2014 non-blocking",openingUnreadable:"{{name}} \u2014 state unreadable, does not block",nonBlockingEmpty:"This household has no opening \u2014 no contact, cover or lock \u2014 to list here.",openingsChecking:"Checking which devices are openings\u2026",openingsCheckFailed:"Couldn't check which devices are openings \u2014 only those the hub read now, and those already listed, are shown.",recipientsHint:"Every alarm change is sent here: arming, armed, intrusion, siren, re-armed, disarmed, refused, excluded sensors.",recipientsNone:"No recipient selected \u2014 alarm changes are not sent to anyone.",targetsFailed:"Couldn't load the notification targets.",targetsEmpty:"No notification targets are configured \u2014 nothing can be sent.",targetDisabled:"Disabled",targetUnlisted:"Target {{id}} \u2014 no longer available",exitDelay:"Exit delay",exitHint:"Time between arming and the mode taking effect \u2014 long enough to leave.",exitZero:"arms immediately",entryDelay:"Entry delay",entryZero:"fires immediately",triggeredFor:"Triggered for",triggeredHint:"How long the alarm stays triggered before re-arming itself.",triggeredZero:"until disarmed",seconds:"{{seconds}} s",minutes:"{{minutes}} min",minutesSeconds:"{{minutes}} min {{seconds}} s",delayRange:"0\u2013{{max}} s",unsaved:"Unsaved changes",save:"Save",discard:"Discard",saveFailed:"Couldn't save: {{error}}",changedElsewhere:"The configuration changed elsewhere \u2014 your edits were applied on top.",saveNotLanded:"The hub answered but did not keep every change \u2014 it is probably too old for this setting. Your edits are kept.",recipientsLimit:"At most {{max}} recipients \u2014 untick one to add another.",leave:{title:"Discard alarm changes?",body:"The alarm settings have changes that are not saved.",keep:"Keep editing",discard:"Discard"},refreshFailed:"Couldn't re-read the alarm settings before saving: {{error}}. Nothing was saved; your edits are kept.",coverageAllExcept_one:"All devices except {{count}}: {{devices}}",coverageAllExcept_other:"All devices except {{count}}: {{devices}}",table:{title:"Blocks arming",hint:"Switch ON: {{mode}} is refused while this opening is open. Switch it off to let it stay open. Only sensors a rule of this mode names are listed; the arm check reads no others.",switchLabel:"Blocks arming: {{name}}",searchPlaceholder:"Search by name, room or type",none:"No sensor is covered by a rule of this mode.",noMatches:"No device matches.",hidden_one:"{{count}} row hidden by filters",hidden_other:"{{count}} rows hidden by filters",showMore:"Show {{count}} more ({{left}} left)",sensorsFailed:"Could not read the sensor states.",state:{checking:"Checking\u2026",hubTooOld:"This hub does not report sensor states \u2014 update the hub",readFailed:"State unknown \u2014 {{error}}",offline:"{{word}} \u2014 offline, last known",unknownNotAnswered:"Unknown (not answered)",unknownReadFailed:"Unknown (could not read)",unknownWord:"Unknown (no state reported)",notOpening:"Not an opening \u2014 never blocks",removed:"Removed"},coverage:{armChecked:"Yes",armCheckedSkipped:"Yes \u2014 blocks arming (notifications skipped: {{reason}})",unscoped:"Covered by an all-devices rule \u2014 the arm check does not read it; never blocks this mode",notCovered:"No \u2014 never blocks this mode",listedUncovered:"Not checked by any rule of this mode \u2014 listed as non-blocking; switch it on to remove the entry"},notice:{refused:"Saving {{name}} ({{mode}}) \u2014 wait for it to finish.",notLanded:"The hub did not apply this change \u2014 another editor may have changed it, or the hub needs an update ({{name}}, {{mode}}).",failed:"Could not change {{name}} for {{mode}}: {{error}}"}}},devicePicker:{title:"Choose devices",add:"Add",edit:"Edit",done:"Done",search:"Search by name, room or type",shown:"{{shown}} of {{total}} \xb7 {{selected}} selected",selectAll:"All",clear:"Clear",noType:"No type",noRoom:"No room",noMatches:"No device matches.",everyDevice:"Every device \u2014 no restriction",none:"None selected",remove:"Remove {{name}}",groupBy:{label:"Group by",zone:"Zone",location:"Location",none:"None",noZone:"No zone",noLocation:"No location",zonesPending:"Loading zones \u2014 grouped by location for now",zonesUnavailable:"Zones unavailable \u2014 grouped by location"},filter:{type:"Type",zone:"Zone",location:"Location",all:"All",selected:"{{count}} selected",noType:"No type",noLocation:"No location",noZone:"No zone",zonesLoading:"Loading zones\u2026",zonesUnavailable:"Zones unavailable",zonePaused:"Zone filter paused \u2014 zones not loaded"},resetFilters:"Reset filters",hiddenSelected:"{{count}} selected hidden by filters",nodeTitle:"Choose nodes",packageTitle:"Choose packages",everyNode:"Every node \u2014 no restriction",everyPackage:"Every package \u2014 no restriction",nodeRemoved:"Node {{id}} \u2014 removed",packageNotInstalled:"{{name}} \u2014 not installed",nodesEmptyWidens:"No node selected: the rule will apply to ALL nodes.",packagesEmptyWidens:"No package selected: the rule will apply to ALL packages.",nodesUnavailable:"The hub did not return its nodes \u2014 selected ones are listed by id so they can still be removed.",packagesUnavailable:"The hub did not return its packages \u2014 selected ones are listed by name so they can still be removed.",nodeDirectoryIncomplete:"The node history could not be read \u2014 offline nodes may be missing from this list.",nodeGroup:{hub:"Hub",agent:"Agents",other:"Nodes",offline:"{{role}} \xb7 offline"},packageGroup:{server:"Server",framework:"Framework",wrapper:"Wrapper",addon:"Addons",other:"Packages"},nodeSearch:"Search by node name or id",packageSearch:"Search by package name",nodeNoMatches:"No node matches.",packageNoMatches:"No package matches."}},login:{loginFailed:"Login failed",verifyFailed:"Verification failed",serverUrl:"Server URL",username:"Username",password:"Password",showPassword:"Show password",hidePassword:"Hide password",signIn:"Sign in",signingIn:"Signing in\u2026",twoFactor:"Two-factor authentication",totpHint:"Enter the 6-digit code from your authenticator app to sign in as ",verificationCode:"Verification code",verifyAndSignIn:"Verify and sign in",verifying:"Verifying\u2026",back:"Back",or:"or",signInWithCamStack:"Sign in with CamStack",hubSignInHint:"Opens your hub\u2019s login page and links this app without typing your password here.",handoffFailed:"Sign-in with CamStack failed \u2014 try again or use username and password",invalidServerUrl:"Enter a valid server URL (https://\u2026) first"},live:{webUnsupported:"Live view is not available on the web version yet.",connecting:"Connecting to live stream\u2026",error:"Unable to load the live stream.",retry:"Retry",noConnection:"No connection to the server",failed:"Connection failed",errorPageLoad:"The player page failed to load."},ptz:{title:"PTZ",notAvailable:"PTZ controls are not available for this camera.",zoom:"Zoom",home:"Home position",presets:"Presets",noPresets:"No presets saved.",noHome:"No home position set for this camera \u2014 set one in the PTZ settings of the admin UI."},navigation:{title:"Navigation",notAvailable:"Navigation controls are not available for this device.",drive:"Drive",forward:"Forward",left:"Turn left",right:"Turn right",turnAround:"Turn around",stop:"Stop",actions:"Actions",sounds:"Sounds",light:"Fill light",lightOn:"Light on",lightOff:"Light off",auto:"Auto",manual:"Manual",levelUp:"Brighter",levelDown:"Dimmer",following:"following",joystick:"Drive joystick",joystickHint:"Drag to drive the robot; release to stop.",followMe:"Follow me",returnToDock:"Return to dock",moreControls:"More controls",mode:{idle:"Idle",cleaning:"Cleaning",spot:"Spot cleaning",following:"Following",goto:"Going to point",returning:"Returning to dock",paused:"Paused",unknown:"Unknown"}},timeline:{activityTitle:"Activity",last24h:"Last 24h",loading:"Loading activity\u2026",noActivity:"No activity in the last 24 hours.",legendRecording:"Recorded",legendMotion:"Motion",legendAudio:"Audio",showTimeline:"Show timeline",hideTimeline:"Hide timeline",faultStream:"The video stream is unavailable.",clipShortTitle:"The camera cut this clip short.",clipEmptyTitle:"The camera sent no video for this clip.",faultRecordings:"Couldn't load the recordings for this day.",faultEvents:"Couldn't load this day's events.",faultDismiss:"Dismiss",loadRetry:"Retry",loadRetrying:"Retrying\u2026",moreHistory:"There is older history not shown yet.",scopeUnreadable_one:"One camera in this view could not be read \u2014 its events and footage are missing here.",scopeUnreadable_other:"{{count}} cameras in this view could not be read \u2014 their events and footage are missing here.",scopeOverflow_one:"This view has one camera more than the timeline can read at once.",scopeOverflow_other:"This view has {{count}} cameras more than the timeline can read at once.",scopeUnreadableAndOverflow:"{{unreadable}} cameras could not be read and {{overflow}} more than the timeline can read at once are not shown.",loadMoreHistory:"Load more",loadingMoreHistory:"Loading\u2026"},theater:{back:"Back",today:"Today",yesterday:"Yesterday",prevDay:"Previous day",nextDay:"Next day",selectDate:"Pick a date",live:"LIVE",now:"NOW",auto:"Auto",quality:"Stream quality",filterAll:"All",filter_motion:"Motion",filter_audio:"Audio",goToLive:"Go to live",liveLockOn:"Live lock on \u2014 browsing keeps the picture live",liveLockOff:"Live lock off \u2014 browsing plays the recording",recordLive:"Record live",keepClip:"Keep the recording",keepClipTitle:"Keep this clip?",discardClip:"Discard",saveToGallery:"Save to Photos",shareClip:"Share",recordFailed:"Could not record the live view",noRecording:"No recording",noRecordingHint:"No footage at this time",detailCount:"{{frames}} frames \xb7 {{count}} detections",detailTracks:"{{tracks}} tracks \xb7 {{count}} detections",detailEmpty:"No detail images for this moment",detailSeek:"Go to this moment",zoneHint:"Drag a rectangle over the video to filter events by zone",zoneConfirm:"Confirm",zoneCancel:"Cancel",playbackBar:"Playback controls",footerBar:"Timeline tools",filterTitle:"Filters",zoomRange:"Time range",zoomSpanMinutes:"{{count}}m",zoomSpanHours:"{{count}}h",zoneFilter:"Zone filter",detailSubjects_one:"{{count}} subject",detailSubjects_other:"{{count}} subjects",zoneModeRect:"Rectangle",zoneModePolygon:"Polygon",zoneClearPoints:"Clear",zoneHintPolygon:"Tap to add points \u2014 3 or more",selectTime:"Time",goSameTime:"Go \u2014 same time of day",recordingDaysFailed:"Couldn't read which days have recordings.",recordingDaysPartial:"Some cameras in this view could not be read \u2014 days without a dot may still have footage on them.",clusterOpenDetail:"Open event detail",clusterCarouselShow:"Open the cluster carousel",clusterCarouselHide:"Close the cluster carousel",clusterPrevImage:"Previous image",clusterNextImage:"Next image",clusterCameras_one:"{{count}} camera",clusterCameras_other:"{{count}} cameras",clipStartsAtSubjectAt:"Clip starts at {{start}}, subject at {{subject}}",clipEndsAt:"Clip ends at {{end}}",legend:{open:"Heatmap and timeline legend",title:"Legend",heatmapTitle:"24-hour heatmap",heatmapRecordingTitle:"Recording",heatmapRecordingBody:"Red hairline along the top of the tape \u2014 coverage for that stretch of the day.",heatmapAudioTitle:"Audio",heatmapAudioBody:"Peaks hanging from the top. Quiet is green, loud is red \u2014 the same six rungs as the live meter.",heatmapBottomTitle:"Motion and detections",heatmapBottomBody:"The bottom of each slot fills with green motion, or with the prominent object class when a detection is in that slot.",timelineTitle:"Activity column",timelineRecordingTitle:"Recording",timelineRecordingBody:"Continuous red line on the far right.",timelineMotionTitle:"Motion",timelineMotionBody:"Green line down the centre.",timelineDetectionTitle:"Object detection",timelineDetectionBody:"Dot sitting on the motion line, coloured as the prominent class at that moment.",timelineAudioTitle:"Audio level",timelineAudioBody:"Line on the far left. Same green-to-red scale as the heatmap and the live meter.",classesTitle:"Detection classes",classPerson:"Person",classPersonBody:"People and faces.",classVehicle:"Vehicle",classVehicleBody:"Cars, trucks, bikes and the rest of the vehicle family.",classAnimal:"Animal",classAnimalBody:"Dogs, cats, birds and other animals."}},mediaKind:{crop:"Object crop",thumbnail:"Best shot",faceCrop:"Face",plateCrop:"Plate",fullFrame:"Frame",fullFrameBoxed:"Boxed",keyFrame:"Key frame",firstFrame:"First",lastFrame:"Last",snapshot:"Snapshot"},tracks:{crop:"Crop",fullFrame:"Full frame",bestShot:"Best shot",media:"Media",noMedia:"No media stored for this track",mediaLoadError:"Media could not be loaded",mediaEntryLoading:"Loading this media\u2026",mediaEntryError:"This media is indexed but could not be read",mediaEntryAbsent:"Not stored for this track",path:"Path",pathSummary:"{{count}} points \xb7 {{seconds}}s",pathNoLocalization:"no precise position",share:"Share",copyLink:"Copy link",linkCopied:"Link copied",shareImage:"Share image",viewFullRes:"Full resolution",fullResBadge:"Full",zones:"Zones",audio:"Audio",prevTrack:"Previous event",nextTrack:"Next event",reason:"Why notable",empty:"No tracks",recent:"Recent",searchPlaceholder:"Search events (e.g. \"person in red\")",searchSubmit:"Search",searchClear:"Clear search",noMatches:"No matching events",person:"Person",assignPerson:"Assign to person",changePerson:"Change",notAssigned:"Not assigned",matchConfidence:"Match confidence",suggested:"Suggested",suggestedUnknown:"Suggested person",suggestedConfirm:"Confirm",suggestedDismiss:"Dismiss",assignFaceTitle:"Assign face",newPersonPlaceholder:"New person name\u2026",createAndAssign:"Create & assign",assignFailed:"Couldn't assign the face",removePerson:"Remove person",removePersonConfirmTitle:"Remove person?",removePersonConfirmBody:"This unlinks the person from this face. The face returns to the unassigned buffer and can be reassigned later.",disassociateFailed:"Couldn't remove the person",removePersonAll:"Remove from all events",removePersonAllConfirmTitle:"Remove from all events?",removePersonAllConfirmBody:"This unlinks this person from EVERY event. All faces currently recognized as this person return to the unassigned buffer and can be reassigned later. The person is kept.",disassociateAllFailed:"Couldn't remove the person from all events",existingPersons:"People",noPersons:"No people yet",metadata:"Metadata",markForTraining:"Mark for training",markForTrainingHint:"Keeps this track and its media past retention",debugFlag:"Debug",debugFlagHint:"Flag this track for diagnostic attention. Hold to edit what should be checked.",debugNotePromptTitle:"What should we check?",debugNotePromptBody:"Describe what looks wrong on this event, in your own words. It stays on the track, so whoever reviews the debug set reads the question with it.",debugNotePlaceholder:"e.g. the box jumps to the fence when the car passes",debugPreset:{stationaryObject:"Stationary object",lateStart:"Started late",earlyEnd:"Ended early",targetSwapped:"Target swapped mid-track",edgeCropMirror:"Best shot on the edge, mirrored",betterShotExisted:"A better best shot was available",missingMedia:"Missing media",cropOffTarget:"Crop shot off target",riderNotInKeyframe:"Two-wheeler shot without the rider"},debugReviewed:"Analyzed",debugReviewedHint:"Mark this debug track as analyzed so it drops out of the debug filter and export",favourited:"Favourited",favouritedHint:"Keeps this track and its media past retention",copy:"Copy",copied:"Copied","meta.trackId":"Track ID","meta.eventId":"Best event ID","meta.deviceId":"Device ID","meta.camera":"Camera","meta.className":"Class","meta.label":"Label","meta.firstSeen":"First seen","meta.lastSeen":"Last seen","meta.state":"State","meta.importance":"Importance","meta.confidence":"Confidence","meta.mediaKeys":"Media IDs",rescore:{button:"Recompute matches",failed:"Couldn't recompute the matches",params:"Threshold {{threshold}} \xb7 margin {{margin}}",needsSamples:"{{count}} samples \u2014 needs {{min}}",reembed:"Re-embed this face and retry",reembedFailed:"Re-embed failed: {{reason}}",verdict:{"auto-assignable":"Would be assigned to {{name}}",ambiguous:"Two people score too close to call \u2014 the margin blocks it",suggestion:"Plausible, but below the auto-assign threshold","below-threshold":"No match in the gallery as it stands","no-eligible-identity":"No person has enough samples yet ({{min}} needed)","empty-gallery":"Nothing in the gallery is comparable to this face","model-mismatch":"This face was embedded with an older model \u2014 its scores cannot be compared"}}},accessories:{on:"On",off:"Off",dimUp:"Brighter",dimDown:"Dimmer",lock:"Lock",unlock:"Unlock",open:"Open",close:"Close",stop:"Stop",disarm:"Disarm",onMotion:"On motion",openPercent:"Open {{percent}}",warmer:"Warmer",cooler:"Cooler",speedUp:"Faster",speedDown:"Slower",oscillate:"Oscillate",press:"Press",play:"Play",pause:"Pause",previous:"Previous",next:"Next",start:"Start",dock:"Dock",locate:"Locate",feed:"Feed",feeding:"Feeding\u2026",install:"Install",installing:"Installing\u2026",upToDate:"Up to date",increase:"Increase",decrease:"Decrease",select:"Select",noEvent:"No events yet",buttonIndex:"Button {{index}}",mode:"Mode",fanMode:"Fan mode",preset:"Preset",direction:"Direction",forward:"Forward",reverse:"Reverse",away:"Away",humidityUp:"Increase humidity",humidityDown:"Decrease humidity",swingVertical:"Vertical swing",swingHorizontal:"Horizontal swing",setTemperature:"Set temperature",currentTemperature:"Current temperature",climateModes:{off:"Off",heat:"Heat",cool:"Cool",auto:"Auto",heat_cool:"Heat/Cool",fan_only:"Fan",dry:"Dry"},unsupported:"This hub cannot do that. Update it and try again.",armMode:{home:"Home",away:"Away",night:"Night",vacation:"Vacation",custom_bypass:"Custom"},alarmRefused:"Not armed \u2014 open: {{devices}}",armAnyway:"Arm anyway",armAnywayRejected:{"unknown-refusal":"Arm anyway was not accepted: the hub no longer knows that refusal. Arm again.",stale:"Arm anyway was not accepted: the panel changed since it refused. Arm again.",expired:"Arm anyway was not accepted: the refusal expired. Arm again.",used:"Arm anyway was not accepted: that refusal was already used."},alarmState:{arming:"Arming\u2026",pending:"Intrusion \u2014 disarm now",triggered:"Alarm triggered"},alarmRefusedCap:"Not armed \u2014 open: {{devices}}. Arm anyway is on the alarm notification.",alarmLookupUnknown:"Alarm state unknown \u2014 retrying",alarmStateUnknown:"Panel state unknown",alarmExcluded:"Armed \u2014 excluded: {{devices}}",deviceFallback:"Device #{{id}}",alarmRefusedNone:"Not armed \u2014 the hub refused without naming an open device. Try again."},updates:{otaReadyTitle:"Update downloaded",otaReadyBody:"Restart the app now to apply it? Later applies it at the next start.",install:"Restart now",later:"Later",whatsNewTitle:"What's new in {{version}}",whatsNewHeading:"What's new",whatsNewPrevious:"Previous updates",whatsNewRow:"What's new",whatsNewNone:"No notes for this version.",nativeRow:"App build",nativeUpToDate:"Up to date",nativeUnknown:"\u2014",nativeNewer:"{{version}} ({{build}}) available",nativeNewerTitle:"A newer app build is available",nativeNewerBody:"Version {{version}} (build {{build}}) is available. Updates from now on need it.",openTestFlight:"Open TestFlight",openStore:"Open the store"},cameraMenu:{title:"View options",gridCommonHint:"Overlays shared by the whole wall \u2014 boxes, highlight border and its triggers, cluster labels \u2014 are set once for the grid, in the grid bar.",streamStats:"Stream stats",audioLevel:"Audio level",densityTitle:"Timeline density",density_compact:"Compact",density_medium:"Medium",density_wide:"Wide",densityCustom:"Custom",showImportance:"Show importance",showClass:"Show detection class",timelineSection:"Timeline",managementTitle:"Management"},viewOptions:{groupDetection:"Detection overlays"},cameraShelf:{goTo:"Go to this camera",addToView:"Add to view",closeView:"Close view",loading:"Loading cameras\u2026",loadingA11y:"Loading the other cameras"},cameraSwitches:{title:"Camera functions",loading:"Reading camera functions\u2026",readFailed:"Camera functions could not be read. Nothing has changed \u2014 they are not shown rather than shown with a guessed state.",writeFailed:"That change was refused and has been undone. {{reason}}",offBadge:"OFF",badgeLabel_one:"{{count}} function switched off",badgeLabel_other:"{{count}} functions switched off",unavailableNoProvider:"Not available \u2014 nothing in this installation provides it.",unavailableUnreachable:"Unknown \u2014 the service that owns this did not answer.",unavailableNotConfigured:"Not offered \u2014 nothing is set up for it to act on yet.",unavailableNoPrivacyZones:"Not offered \u2014 no privacy zone is drawn on the camera yet. Draw one in the camera\u2019s own app, then this switch appears.",warnUnknown:"This control carries a note from the hub that this app version does not recognise yet.",warnNoPrivacyZones:"No privacy zone is drawn on the camera yet, so the mask has nothing to blank. Draw one in the camera\u2019s own app; the switch is offered so the feature can be started from here.",unavailableDeviceDisabled:"Not offered while the camera is switched off.",unavailableUnknown:"Not available on this camera."},stats:{title:"Stream stats",resolution:"Resolution",fps:"FPS",bitrate:"Bitrate",packetLoss:"Packet loss",jitter:"Jitter",codec:"Codec",frames:"Frames (dropped/total)",waiting:"Measuring\u2026",playbackHint:"Full WebRTC stats need the native player."},exportActions:{title:"Capture",recordingExport:"Recording export"},exportSelection:{start:"Select a period to export",discard:"Discard the selection",save:"Save the selected period",savePartial:"Save the selected period \u2014 part of it was not recorded",title:"Export",queued:"The export was queued. You will find it under Exports when it is ready.",failed:"The export could not be queued.",gapTitle:"Part of this period was not recorded",gapMessage:"The selected {{duration}} crosses a stretch with no recording. The export will contain only the recorded parts.",gapConfirm:"Export anyway"},exports:{title:"Exports",range:"Range",createAction:"New export",withAudio:"with audio",variantRegular:"1\xd7",variantAccelerated:"Accelerated {{speed}}\xd7",variantSlow:"Slow {{speed}}\xd7",variantTimelapse:"Timelapse",expired:"Expired",expiresInDays:"Expires in {{count}}d",expiresInHours:"Expires in {{count}}h",expiresInMinutes:"Expires in {{count}}m",downloadAction:"Download",downloadUnavailable:"Download not available.",downloadFailed:"Download failed.",cancelAction:"Cancel",cancelConfirmTitle:"Cancel export?",cancelConfirmBody:"This stops rendering and discards the partial file.",deleteAction:"Delete",deleteConfirmTitle:"Delete export?",deleteConfirmBody:"This removes the file. The history entry is kept.",dismiss:"Dismiss",state:{queued:"Queued",rendering:"Rendering",ready:"Ready",failed:"Failed",expired:"Expired",deleted:"Deleted"},createHint:"Pick a camera: the export is drawn on its recording timeline, where the footage that exists is visible.",stillRendering:"Still rendering \u2014 the file is not ready to play yet.",noFile:"There is no file to play for this export.",stateLabel:"State",variant:"Render"},library:{title:"Library",sections:{events:"Events",artifacts:"Media",review:"Review"}},artifacts:{title:"Media",empty:"No media yet.",emptyFiltered:"No media matches these filters.",loadError:"Could not load the media.",gone:"This file is no longer on the hub.",expired:"Expired",expiredBody:"The retention window closed and the file was removed.",expiresInDays:"Expires in {{count}}d",expiresInHours:"Expires in {{count}}h",expiresInMinutes:"Expires in {{count}}m",retentionHint:"Kept for up to 14 days. Files may be removed sooner when the hub reaches its storage limits.",byRule:"Rule: {{name}}",allCameras:"All cameras",cameraPlus:"{{name}} +{{count}}",close:"Close",downloadAction:"Download",downloadUnavailable:"Download not available.",downloadFailed:"Download failed.",deleteAction:"Delete",deleteConfirmTitle:"Delete this file?",deleteConfirmBody:"This removes it from the hub for good.",deleteRefused:"The hub did not remove this file. It may already be gone, or it may belong to the whole household \u2014 only an administrator can remove those.",deleteFailed:"Could not delete the file.",kind:{timelapse:"Timelapse","timelapse-preview":"Timelapse preview","summary-mosaic":"Summary mosaic","event-gif":"GIF","event-clip":"MP4","event-still":"Still",export:"Export"},time:{now:"Just now",minutesAgo:"{{count}}m ago",hoursAgo:"{{count}}h ago",daysAgo:"{{count}}d ago"},range:{all:"All",day:"24h",week:"7d",month:"30d"},filters:{toggle:"Filters",kind:"Type",camera:"Camera",range:"Period",clear:"Clear filters"},detail:{kind:"Type",cameras:"Cameras",rule:"Rule",captured:"Captured",created:"Produced",size:"Size",format:"Format",expiry:"Expires"}},streamBar:{play:"Play",pause:"Pause",scrubForward:"Scrubbing forward",scrubBackward:"Scrubbing backward",mute:"Mute",unmute:"Unmute",silentBySpeed:"No sound at {{rate}} \u2014 the speed silences it",talkStart:"Start talking",talkStop:"Stop talking",quality:"Stream quality",menu:"View options",snapshot:"Snapshot",pip:"Picture in picture",fullscreen:"Fullscreen",exitFullscreen:"Exit fullscreen"},playback:{servedTier:"Playing {{tier}}",servedTierDegraded:"{{requested}} not available here \u2014 playing {{served}}",tier:{high:"High",mid:"Mid",low:"Low"},prevFrame:"Previous frame",nextFrame:"Next frame",speed:"Playback speed",rateUnavailable:"Not available for this camera's clips",stepBackUnavailable:"This camera's clips cannot step backward \u2014 the frames behind the picture were never kept"},cameraSwitcher:{title:"Switch camera",empty:"No cameras available",openGrid:"Open grid ({{n}})",selectA11y:"Select {{name}}",buildView_one:"Show this camera",buildView_other:"Show these {{count}} cameras"},storage:{title:"Storage",usageTitle:"Usage",nodeTotal:"Node total",defaultLocation:"Default location",locationFree:"{{free}} free",retentionTitle:"Retention",pruneAction:"Apply retention now",pruneConfirmTitle:"Apply retention?",pruneConfirmBody:"Delete footage on {{name}} that exceeds its retention policy.",pruneResult:"Reclaimed {{bytes}} ({{buckets}} segments).",deleteTitle:"Delete footage",deleteAction:"Delete",deleteConfirmTitle:"Delete footage?",deleteConfirmBody:"Permanently delete {{range}} of footage on {{name}}. This cannot be undone.",deleteResult:"Reclaimed {{bytes}} ({{buckets}} segments).",cancel:"Cancel",window24h:"Last 24h",window7d:"Last 7 days",window30d:"Last 30 days",windowAll:"Everything"},eventsMgmt:{title:"Events",footprintTitle:"Footprint",rowsBytes:"{{rows}} events \xb7 {{bytes}}",clusterTotal:"Cluster total",pruneTitle:"Prune older than",pruneHint:"Applies to all cameras.",pruneAction:"Prune",pruneConfirmTitle:"Prune old events?",pruneConfirmBody:"Delete events older than {{range}} across ALL cameras. This cannot be undone.",pruneResult:"Deleted {{count}} events.",deleteTitle:"Delete camera events",deleteAction:"Delete all events for this camera",deleteConfirmTitle:"Delete all events?",deleteConfirmBody:"Permanently delete every event for {{name}}. This cannot be undone.",deleteResult:"Deleted {{count}} events.",cancel:"Cancel",older24h:"24 hours",older7d:"7 days",older30d:"30 days"},overlay:{title:"Overlay",liveSection:"Live indicators",readoutsSection:"Sensors & values",layersLabel:"Boxes on the picture",layerMotion:"Motion",layerObjects:"Objects",layerDiscarded:"Discarded",layerStationary:"Stationary",layerDiscardedHint:"Also draws, as dashed outlines, the near-miss and out-of-zone detections of the classes you enabled \u2014 subjects that fell just under the confidence threshold, or stood outside a zone rule. Use it when boxes flicker on a moving subject. The count pill compares what the model saw with what was kept.",layerStationaryHint:"Draws objects that have stopped and are no longer tracked \u2014 a parked car, a bin left out. The hub suppresses their detections, so they can never appear under Objects or Discarded.",diagCounts:"model {{saw}} \xb7 kept {{kept}}",diagHidden:"{{hidden}} hidden",diagOffTopic:"{{offTopic}} off-topic",diagShed:"frame shed \xb7 {{reason}}",reasonThreshold:"below threshold",reasonFullFrame:"full-frame guard",reasonNms:"suppressed by NMS",reasonClassFilter:"class filter",reasonZoneGate:"zone rule",motionBadge:"Motion badge",highlightBorder:"Highlight border",occupancy:"Occupancy",addReadout:"Add a readout",removeReadout:"Remove readout",readoutsHint:"Pin a live value over the picture \u2014 the audio level, or any sensor linked to this camera.",noFields:"This device publishes no live values.",thisCamera:"This camera",audioDbfs:"Audio level",liveOnlyHint:"These draw on the live picture only \u2014 not during playback or while paused.",positions:{off:"Off","top-left":"Top left","top-center":"Top center","top-right":"Top right","left-center":"Left center","right-center":"Right center","bottom-left":"Bottom left","bottom-center":"Bottom center","bottom-right":"Bottom right"}},clips:{title:"Clips",lengthUnknown:"length unknown",progressLabel:"Clip position {{position}} of {{duration}}",loading:"Loading clips\u2026",empty:"No clips for this camera in the loaded window.",searching:"Looking back through earlier days\u2026 ({{days}}/{{max}})",emptySearched:"No clips in the last {{days}} days.",summary_one:"{{count}} clip",summary_other:"{{count}} clips",collapsedHint:"{{duration}} skipped",hiddenHint_one:"{{count}} hidden by source",hiddenHint_other:"{{count}} hidden by source",segmentLabel:"Clip at {{time}}, {{duration}} long",gapLabel:"Gap of {{duration}}",notPlayable:"not playable yet",kind_motion:"Motion",kind_object:"Object",kind_audio:"Audio",kind_native:"Camera",sourceAnalytics:"Recording",sourceOnboard:"Camera ({{vendor}})",sourceHksv:"HomeKit",sourceUnknown:"{{vendor}}",unitDay:"d",unitHour:"h",unitMinute:"m",unitSecond:"s",sourceSilent:"{{source}} could not answer for this window.",sourceMissing:"This camera no longer offers {{source}}. Showing {{fallback}} instead.",sourceSetting:"Clip source",recordingSourceSetting:"Recording source",recordingSourceOurs:"CamStack",sourceStateSleeping:"the camera is asleep",sourceStateUnreachable:"the camera could not be reached",sourceStateNoStorage:"the camera has no storage fitted",sourceStateIndexEmpty:"the camera lists no files",sourceStateUnknown:"the reason is not known to this app",catalogAsOf:"Catalogue read {{ago}} ago",thumbQueued:"Still queued\u2026",thumbNone:"No still",playFailed:"This clip could not be opened.",servedInstead:"Asked for {{asked}}, served {{served}}.",closeClip:"Close clip",nextClip:"Next clip",previousClip:"Previous clip",saveClip:"Save clip",saveUnavailable:"This clip cannot be served",stillRecordingNoLoop:"Still recording \u2014 plays once",still:{waiting:"Asking the camera for a still\u2026",queueFull:"Waiting for the camera \u2014 its still queue is full",cameraBackoff:"The camera is resting after refusing \u2014 trying again shortly",gaveUp:"The camera is still busy \u2014 refresh to ask again",sleeping:"The camera is asleep \u2014 a still would cost a wake",cameraRefused:"The camera refused to cut a still",noKeyframe:"No decodable frame inside this window",unsupported:"This source cannot produce stills",noCatalogRow:"This clip is no longer in the camera's catalog",unknownDevice:"This camera is not served here",uidMissing:"The camera's id is not known yet"},export:{title:"Save clip",close:"Close",pickHint:"Pick the copy to keep. The hub renders it and it lands in the Library.",profile:{high:"High quality",low:"Low quality"},sizeUnknown:"size not stated",tooLarge:"Too large to transfer",working:"Preparing the export\u2026",workingHint:"You can close this \u2014 the job keeps running.",ready:"Ready",readyHint:"Collect it from the Library.",failed:"The export failed",failure:{"catalog-miss":"The camera no longer lists this clip","catalog-unreachable":"The camera's catalog could not be read","no-file-for-window":"There is no file behind this clip","clip-in-progress":"This clip is still being written","unsupported-option":"The export asked for something a clip cannot do",sleeping:"The camera is asleep","camera-refused":"The camera refused","fetch-failed":"The clip could not be fetched","too-large-to-transfer":"Too large to transfer","wake-expired":"The camera went back to sleep before the job ran"}},scrubUnavailable:"This camera's clips cannot be scrubbed \u2014 only forward from where the picture is",loopOn:"Loop this clip, on",loopOff:"Loop this clip, off"},eventsEmbed:{section:"Hub embed (preview)",title:"Events embed",count:"{{count}} shown",openPreview:"Embed preview",openPreviewHint:"Open the hub-hosted events surface next to this page. Nothing is replaced.",view_reel:"Reel",view_gallery:"Gallery",error:"Couldn't load events",retry:"Retry",empty:"No events",emptyFiltered:"No events match this filter",end:"\xb7 end \xb7"},eventsShare:{title:"Events embed link",openBuilder:"Create embed link",openBuilderHint:"Build a standalone URL for a dashboard or an iframe.",view:"View",viewReel:"Reel",viewGallery:"Gallery",columns:"Columns",rows:"Rows",auto:"Auto",thumb:"Thumbnail size",thumbSmall:"Small",thumbMedium:"Medium",thumbLarge:"Large",theme:"Theme",themeAuto:"Auto",themeDark:"Dark",themeLight:"Light",fields:"Card text",field_label:"Title",field_sublabel:"Class",field_camera:"Camera",field_time:"Time",field_badges:"Badges",cameras:"Cameras",camerasAll:"All cameras the link can see",camerasCount:"{{count}} selected",preview:"Link preview",shareMediaNotice:"A share link cannot load thumbnails. Share tokens have no access to the media endpoint at all \u2014 the shared page lists its events, without their images.",copyLink:"Create link",chip:"Embed link",semanticScopeNotice:"Semantic search runs across every camera and is trimmed to this link afterwards, so a link with few cameras can return sparse results on a large cluster."},eventsCard:{unassignedFace:"unassigned face",reviewed:"reviewed",debug:"debug",train:"train",favourite:"favourite",active:"active",loadingMore:"Loading more events"},gridTile:{play:"Play",pause:"Pause",listen:"Listen",mute:"Mute",talk:"Talk",stopTalk:"Stop talk",ptz:"PTZ",linkedDevices:"Linked devices",viewOptions:"View options",moreActions:"More actions",open:"Open",removeFromView:"Remove from view",resizeWidth:"Resize width",resizeHeight:"Resize height",noActiveCameras:"No active cameras",camera:"Camera"},battery:{holdHint:"This camera runs on battery \u2014 press play to start the stream and wake it.",startStreamA11y:"Start the stream and wake the battery camera"},faceReview:{loading:"Loading faces\u2026",loadError:"Could not load faces.",empty:"No faces to review right now.",previewClose:"Close",pickIdentityTitle:"Assign to\u2026",assignFailed:"Could not assign this face.",assign:"Assign",assignedSuccess:"Assigned to {{name}}.",confirmAssignTitle:"Assign faces",confidence:"Confidence",groupSize:"{{count}} faces in this group",filterAssigned:"Assigned",filterSuggested:"Suggested",filterUnassigned:"Unassigned",certaintyCertain:"near-certain",certaintyProbable:"probable",certaintyUncertain:"uncertain",analyzeButton:"Similar groups",analyzeModalTitle:"Look-alike groups",analyzeLoading:"Looking for look-alike groups\u2026",analyzeEmpty:"No look-alike groups found.",analyzeConfirmBody:"Assign {{count}} face(s) across {{groups}} group(s)?",analyzeResult:"Assigned {{assigned}} of {{count}} face(s).",analyzeAssignFailed:"Some faces were refused and are still unassigned.",recomputeButton:"Recompute suggestions",recomputeProgress:"Recomputing {{done}}/{{total}}\u2026",recomputeDone:"Recomputed {{count}} face(s).",analyzeCoverage:"{{grouped}} of the {{pool}} unassigned faces analysed fall into {{groups}} look-alike group(s). The rest have no look-alike here.",groupExcludeFace:"Exclude this face from the group",groupIncludeFace:"Put this face back in the group",groupPickPerson:"Assign this group to",groupShowDetail:"Show this face larger",groupDetailExclude:"Exclude from group",groupDetailInclude:"Put back in the group",assignedManySuccess:"Assigned {{count}} face(s) to {{name}}.",detailTitleMany:"Assign {{count}} selected face(s) to\u2026",knownPeople:"Known people",filtersButton:"Filters",filtersButtonActive:"Filters ({{count}})",sortLabel:"Sort by",sortByCertainty:"Certainty",sortByDate:"Date",sortAscending:"Sorting ascending \u2014 tap for descending",sortDescending:"Sorting descending \u2014 tap for ascending",dateLabel:"Date range",rangeAll:"All",rangeToday:"Today",rangeYesterday:"Yesterday",rangeLast7:"7 days",rangeLast30:"30 days",cameraLabel:"Camera",cameraNone:"No cameras in the loaded faces yet.",selectButton:"Select",selectDone:"Done",selectionCount:"{{count}} selected",applySuggestions:"Apply {{count}} suggestion(s)",applySuggestionsBlocked:"{{count}} of the selected face(s) have no suggestion \u2014 deselect them, or use Assign.",applySuggestionsResult:"Applied {{count}} of {{total}} suggestion(s) across {{groups}} person(s).",emptyFiltered:"No faces match these filters.",partialWindowHint:"Filtering the {{count}} faces loaded so far \u2014 scroll down to load older ones.",auditTitle:"Re-analyse {{name}}\u2019s samples",auditSummary:"{{flagged}} of {{total}} samples worth a look",auditLooksLike:"Looks like {{name}} ({{foreign}}) more than like this person ({{self}})",auditSelfOnly:"Agrees with this person\u2019s other samples: {{self}}",auditNotComparable:"Enrolled with a different face model \u2014 it cannot be compared, not even to say it is fine.",auditFromPhoto:"photo",auditRemoveTitle:"Remove this sample",auditRemoveBody:"The sample stops teaching recognition. Nothing else changes, and the face it came from stays where it is.",auditUnavailable:"This hub cannot re-analyse a gallery yet.",auditRemoveFailed:"Could not remove this sample:",pickPersonSearch:"Search people",pickPersonClear:"Clear the search",pickPersonSamples:"{{count}} sample(s)",pickPersonNoMatch:"No person matches \u201c{{query}}\u201d.",pickPersonCreate:"Create \u201c{{name}}\u201d",auditOpenButton:"Re-analyse a person\u2019s samples",auditPickTitle:"Whose samples?",groupPickNone:"Choose a person",newPersonButton:"New person",newPersonTitle:"Add a person",newPersonCreated:"Added {{name}}.",newPersonFailed:"Could not add this person.",deleteSelected:"Delete",deleteBlocked:"{{count}} of the selected face(s) belong to a person \u2014 deselect them, or detach them first.",deleteConfirmTitle:"Delete {{count}} face(s)",deleteConfirmBody:"The crop and its row leave the review buffer for good. The event they came from is untouched.",deleteResult:"Deleted {{count}} of {{total}} face(s).",deleteFailed:"Could not delete these faces."},statusDetail:{batteryTitle:"Battery",linkTitle:"Connection",openBatteryA11y:"Battery details",openLinkA11y:"Connection details",close:"Close",label:{charge:"Charge",charging:"Power",state:"State",linkType:"Link",signal:"Signal",ssid:"Network",verdict:"Verdict",picture:"Picture",bitrate:"Bitrate",decoded:"Frames decoded",freezes:"Freezes",keyframeRequests:"Key-frame requests",loss:"Loss",latency:"Latency \xb7 jitter",path:"Path",servedRung:"Served rung",source:"Source",ingest:"Ingest node",egress:"Egress leg",ladder:"Quality ladder",ladderWhy:"Why it holds"},value:{unknown:"Not known",notApplicable:"Not applicable",binary:"Low / ok only, no percentage",sleeping:"Sleeping",chargingDc:"Charging (mains)",chargingSolar:"Charging (solar)",chargingNone:"Not charging",wifi:"Wi-Fi",ethernet:"Wired (Ethernet)",cellular:"Cellular",linkUnknown:"Not known",decoding:"Decoding",decoderStall:"Decoder stall \u2014 bytes arriving, no frames out",transportStall:"Transport stall \u2014 nothing arriving",frozenUnknown:"Frames stopped, byte rate unknown",noWindow:"No window yet",native:"Native stream",derived:"Derived (transcoded here)",copyLeg:"Copy \u2014 no re-encode",transcodeLeg:"Transcode",ladderNeverMoved:"Never moved",ladderHeld:"Held",ladderHeldStallBuilding:"Held: picture not arriving",ladderHeldDelivery:"Held: current quality not landing whole",ladderHeldNoEvidence:"Held: no feedback from the player yet",ladderHeldWarming:"Stable, about to climb",ladderHeldCooldown:"Held: just changed",ladderHeldCapacity:"Held: not enough bandwidth for the next level",ladderHeldTryUnclean:"Held: connection not steady enough to try a higher level",ladderHeldTryBackoff:"Held: a higher level was tried and did not hold; retrying later",ladderHeldTrial:"Trying a higher level",ladderHeldSuspended:"Paused during recorded playback",serverNotWired:"Not available from this player",serverWaiting:"Waiting for the server",sessionGone:"Session not found on the server",noSample:"No measurement yet"},streamTitle:"Stream"},onDemandPlayer:{openA11y:"Open in the on-demand player",title:"On-demand player",close:"Close player",resize:"Resize player",move:"Move player",openCamera:"Open the camera screen",goLive:"Live"},reelHighlight:{title:"Reel highlights",section:"Light a card up on",close:"Close",reset:"Back to motion + audio",openA11y:"Reel highlight settings"},accessoryPanel:{edit:"Customise the devices",done:"Done customising",emptyHint:"Tap the pencil to add devices from the hub \u2014 they stay in this app\u2019s profile.",addAction:"Add devices",addTitle:"Add devices",addHint:"Devices added here appear only in this app\u2019s profile, under this camera. The hub\u2019s own links are not changed. Devices in the same room are suggested first.",picked:"Added here",pickedNone:"Nothing added yet",suggested:"Suggested \xb7 {{location}}",suggestedNone:"None",allDevices:"All devices",searchToSee:"Search to see the rest",noMatches:"No matches",searchPlaceholder:"Search by name, room or id",truncated_one:"{{count}} more match is not shown \u2014 narrow the search.",truncated_other:"{{count}} more matches are not shown \u2014 narrow the search.",save:"Keep these additions",cancel:"Discard these changes",loadFailed:"The hub did not answer with its device list. Close and try again.",localBadge:"Added here",hiddenBadge:"Hidden",rename:"Rename {{device}}",renameHint:"Shown only in this app. Leave it empty to use the hub\u2019s name.",icon:"Change the icon of {{device}}",iconTitle:"Icon for {{device}}",iconDefault:"Default icon",iconSearchPlaceholder:"Search icons",iconGroups:{devices:"Devices",lighting:"Lights, climate, appliances",sensors:"Sensors and weather",places:"Rooms and places",life:"Vehicles, animals, people"},hide:"Hide {{device}}",show:"Show {{device}}",moveUp:"Move {{device}} up",moveDown:"Move {{device}} down",remove:"Remove {{device}} from this list"}},prototype:{today:"Today",yesterday:"Yesterday",now:"NOW",endOfDay:"END OF DAY",loading:"Loading...",timeline:"Timeline",events:"Events",playClip:"Play clip",goToNow:"NOW",noEvents:"No events"},eventKind:{motion:"Motion",audio:"Audio",person:"Person",vehicle:"Vehicle",animal:"Animal",package:"Package",sensor:"Sensor",control:"Control",car:"Car",truck:"Truck",bus:"Bus",motorcycle:"Motorcycle",bicycle:"Bicycle",airplane:"Airplane",boat:"Boat",train:"Train",bird:"Bird",cat:"Cat",dog:"Dog",horse:"Horse",sheep:"Sheep",cow:"Cow",elephant:"Elephant",bear:"Bear",zebra:"Zebra",giraffe:"Giraffe",contact:"Contact","motion-sensor":"Motion sensor",smoke:"Smoke",flood:"Water leak",gas:"Gas","carbon-monoxide":"Carbon monoxide",vibration:"Vibration",tamper:"Tamper",presence:"Presence","enum-sensor":"Sensor state","device-event":"Device event",lock:"Lock",cover:"Cover",switch:"Switch",siren:"Siren",button:"Button",doorbell:"Doorbell","package-delivered":"Package delivered","package-picked-up":"Package picked up","audio-speech":"Speech","audio-music":"Music","audio-dog":"Dog","audio-doorbell":"Doorbell","audio-siren":"Siren","audio-alarm":"Alarm","audio-animal":"Animal (other)","audio-bird":"Bird","audio-cat":"Cat","audio-crowd":"Crowd / Chatter","audio-crying":"Crying / Baby","audio-door":"Door","audio-engine":"Engine / Motor","audio-fire":"Fire / Smoke","audio-footsteps":"Footsteps","audio-glass_breaking":"Glass Breaking","audio-gunshot":"Gunshot / Explosion","audio-laughter":"Laughter","audio-scream":"Scream / Shout","audio-silence":"Silence","audio-telephone":"Telephone","audio-tools":"Tools / Construction","audio-vehicle":"Vehicle","audio-water":"Water","audio-wind":"Wind / Weather"}}},2615,[]);
|
|
4516
|
-
__d(function(e,i,a,o,n,t,l){n.exports={devices:{editDevice:"Modifica dispositivo",originalName:"Nome originale",customName:"Nome personalizzato",customNamePlaceholder:"Lascia vuoto per usare l'originale",icon:"Icona",typeLight:"Luce",typeSwitch:"Interruttore",typeCover:"Tapparella",typeLock:"Serratura",typeAlarm:"Allarme",typeButton:"Pulsante",typeSelect:"Selezione",typeSiren:"Sirena",typeSensor:"Sensore",typeEntry:"Ingresso",typeMediaPlayer:"Media Player",typeScript:"Script",run:"Esegui",sourceHA:"Home Assistant",sourceScrypted:"Scrypted",off:"Off",on:"On",mute:"Muto",unmute:"Audio",stop:"Stop",locked:"Chiusa",unlocked:"Aperta",open:"Aperta",closed:"Chiusa",disarmed:"Disinserito",disarm:"Disinserisci"},common:{error:"Errore",save:"Salva",cancel:"Annulla",loading:"Caricamento...",comingSoon:"In arrivo",back:"Indietro",fullscreen:"Schermo intero",exitFullscreen:"Esci da schermo intero",reset:"Reimposta",selectAll:"Seleziona tutte",deselectAll:"Deseleziona tutte",delete:"Elimina",retry:"Riprova"},grids:{newGrid:"Nuova griglia",deleteConfirm:"Eliminare questa griglia?",noGrids:"Nessuna griglia. Creane una per disporre le telecamere in vista mosaico.",createGrid:"Crea griglia",cameras:"telecamere",notFound:"Griglia non trovata.",noCameras:"Nessuna telecamera in questa griglia. Modifica per aggiungerne.",edit:"Modifica",addCamera:"Aggiungi telecamera",presets:"Preset",auto:"Auto",manual:"Manuale",gridName:"Nome griglia",view:"Visualizza",addCameraHint:"Aggiungi almeno una telecamera dal pulsante sopra.",allCamerasAdded:"Tutte le telecamere sono gi\xe0 in griglia",cameraUnavailable:"Telecamera non disponibile",camerasInGrid:"Telecamere nella griglia",addAll:"Aggiungi tutte",addCameras:"Aggiungi Telecamere",backToGrid:"Torna alla Griglia",timelineNotSupported:"Timeline non supportata"},nav:{cameras:"Telecamere",grids:"Griglie",library:"Libreria",notifications:"Notifiche",events:"Eventi",videoclips:"Videoclip",list:"Lista",settings:"Impostazioni"},cameras:{addCamera:"Aggiungi telecamera",pipActive:"PiP attivo",reorderEnable:"Riordina",reorderDisable:"Sblocca",live:"Live",noCameras:"Nessuna telecamera configurata",noIntegrations:"Nessuna integrazione configurata. Aggiungi un sistema per iniziare.",createSystem:"Crea sistema",importFrom:"Importa telecamere da",importSuccess:"Importazione completata",importCount:"{{count}} telecamere importate",selectCamerasToImport:"Seleziona telecamere da importare",selectAll:"Seleziona tutte",deselectAll:"Deseleziona tutte",importSelected:"Importa {{count}} selezionate",noCamerasFound:"Nessuna telecamera trovata",play:"\u25b6 Riproduci",paused:"In pausa",noDataForDate:"Nessun dato per questa data",recordingNotAvailable:"Registrazione non disponibile",noEventsReel:"Nessun evento recente",settings:"Impostazioni",highlightMotion:"Evidenza movimento",highlightOnMotion:"Evidenzia al movimento",highlightAudio:"Evidenza audio",audioMode:"Modalit\xe0",audioModeOff:"Off",audioModeSensor:"Sensore",audioModeLevel:"Livello",audioPreset:"Preset audio",audioPresetCustom:"Personalizzato",audioPresetCrying:"Pianto / neonato",audioPresetAlarm:"Allarme / sirena",audioPresetDog:"Abbaio cane",audioPresetDoorbell:"Campanello / bussata",audioPresetGlass:"Rottura vetro",audioWindow:"Finestra (s)",audioThreshold:"Soglia (dB)",audioHitPercentage:"Percentuale (%)",audioHoldSeconds:"Mantenimento (s)",highlightDetection:"Evidenza rilevamento oggetti",highlightOnDetection:"Evidenzia al rilevamento",detectionClasses:"Classi",holdSeconds:"Mantenimento (s)",rtspNotSupportedWeb:"Gli stream RTSP non sono supportati sul web. Usa l'app mobile.",liveDetections:"Detections live",filterTimeline:"Filtra timeline",filterClasses:"Filtra classi...",filterBySeverity:"Filtra per severit\xe0",severityAlert:"Allarme",severityDetection:"Rilevamento",statusPosition:"Posizione indicatori di stato",today:"Oggi",yesterday:"Ieri",timeline:"Timeline",timelineEventsClusterEvents:"Eventi",selectDate:"Seleziona una data",videoclipsNotSupported:"Videoclip non supportati per questa telecamera",noVideoclipsForDate:"Nessun videoclip per questa data",endOfList:"Fine elenco",backToLive:"Torna al live",goLive:"Vai al live",loadingClip:"Caricamento clip...",clusterDetailShowBbox:"Mostra bounding box sull'immagine",clusterDetailOpenVideoclip:"Apri videoclip",clusterDetailLoadingEvents:"Caricamento eventi...",devices:"Dispositivi",noAssociatedDevices:"Nessun dispositivo collegato. Configura in Impostazioni > Telecamere.",timelineData:"Dati timeline",timelineDataHint:"Cosa mostrare sulla timeline.",timelineDataVideoclips:"Videoclip",timelineDataAdvancedNotifier:"Advanced Notifier",timelineDataEvents:"Eventi",timelineEvents:"Eventi timeline",timelineEventsHint:"Quali tipi di eventi mostrare sulla timeline, in base alla severit\xe0.",timelinePresetAll:"Tutti",timelinePresetImportant:"Importanti",timelinePresetCritical:"Critici",timelinePresetCustom:"Personalizzato",statusBlock:"Blocco stato",sensorsBlock:"Blocco sensori",position:"Posizione",indicators:"Indicatori",downloadSnapshot:"Scarica Istantanea",exportDownloadClip:"Scarica Clip",exportRecordingWebOnly:"Esporta registrazione (solo web)",exportSnapshot:"Esporta Istantanea",intercomError:"Errore interfono",multiCam:"Multi-Camera",ptzNotSupported:"PTZ non supportato",ptzSelectPreset:"Seleziona Preset PTZ",snapshotFailed:"Istantanea fallita"},events:{loading:"Caricamento eventi...",filterByLabel:"Filtra per etichetta",filterByLabelPlaceholder:"es. person, doorbell",filterByCamera:"Filtra per telecamera",date:"Data",source:"Sorgente",cameras:"Telecamere",groupingRange:"Raggruppamento",groupingPresetMinutes:"{{m}} min",groupingCustom:"Personalizzato",groupingCustomMinutes:"Minuti",groupingCustomApply:"Applica",today:"Oggi",noCamerasFromConfig:"Telecamere caricate dalla config EventsApp",all:"Tutti",typesCount:"{{count}} tipi",camerasCount:"{{count}} telecamere",cols:"col",sourceAuto:"Auto",sourceNVR:"NVR",sourceFrigate:"Frigate",sourceVideoClips:"API VideoClips",sourceRawDetection:"Raw",sourceAdvancedNotifier:"Advanced Notifier",noScryptedIntegration:"Aggiungi un'integrazione Scrypted in Impostazioni per vedere gli eventi.",frigateNoEvents:"Gli eventi sono disponibili solo per Scrypted. Seleziona un'istanza Scrypted in Impostazioni.",noSource:"Aggiungi un'integrazione Scrypted o Frigate in Impostazioni, poi selezionala come sorgente per Eventi e Videoclip.",loadError:"Errore nel caricamento degli eventi",noEvents:"Nessun evento per questa data. Prova a cambiare data o filtri.",clearCacheTitle:"Svuota cache",clearCacheMessage:"Svuotare tutti i dati in cache di eventi e videoclip? Verr\xe0 effettuato un nuovo caricamento al prossimo accesso.",clearCacheConfirm:"Svuota",columnsPerRow:"Colonne per riga",onlyWithClips:"Solo con clip",relatedClip:"Clip Correlata"},settings:{integrations:"Integrazioni",camstackProxy:"CamStack Proxy",scrypted:"Scrypted",frigate:"Frigate",rtsp:"RTSP",homeAssistant:"Home Assistant",name:"Nome",baseUrl:"URL base",urlLocal:"URL locale",urlPublic:"URL pubblico",username:"Username",password:"Password",token:"Token (opzionale)",frigateTokenHint:"Token (opzionale): JWT dal browser",tokenRequired:"Token",testConnection:"Test connessione",testLocal:"Test Local",testPublic:"Test Public",testMqtt:"Test MQTT",connectionOk:"Connessione riuscita",connectionError:"Connessione fallita",scryptedCredentialsPromptTitle:"Accesso Scrypted",scryptedCredentialsPromptSubtitle:"Inserisci username e password Scrypted per connettere.",scryptedCredentialsPromptSkip:"Salta per ora",usernamePlaceholder:"admin",save:"Salva",tabStream:"Stream e riproduzione",tabGeneral:"Generale",data:"Dati",clearCacheEventsClips:"Svuota cache eventi e videoclip",eventsClipsSourceHint:"Sorgente per le schede Eventi e Videoclip.",hubReelTitle:"Hub & Reel",reelIntegrationsHint:"Scegli quali integrazioni usare per il reel.",reelScryptedSourceHint:"Con Scrypted: sorgente eventi per il reel.",eventsClipsAuto:"Auto",eventsClipsNoInstance:"Aggiungi prima un'integrazione Scrypted o Frigate.",exportBackup:"Esporta backup",exportError:"Esportazione fallita",importBackup:"Importa backup",importConfirm:"Questo sostituir\xe0 tutte le telecamere, integrazioni e impostazioni con i dati del backup. Continuare?",importSuccess:"Backup ripristinato con successo",importError:"Importazione fallita",uiPrototypes:"Prototipi UI",uiPrototypesHint:"Esplora design sperimentali della timeline",versions:"Versioni",appVersion:"App",nativeVersion:"Nativa",updateNow:"Aggiorna ora",updateError:"Aggiornamento fallito",updateAvailableTitle:"Aggiornamento disponibile",updateAvailableMessage:"Una nuova versione di CamStack \xe8 stata scaricata ed \xe8 pronta per l'installazione. L'app verr\xe0 riavviata per applicare l'aggiornamento.",updateInstall:"Installa e riavvia",updateLater:"Pi\xf9 tardi",tabIntegrations:"Integrazioni",tabCameras:"Telecamere",theme:"Tema",themeSystem:"Sistema",themeLight:"Chiaro",themeDark:"Scuro",language:"Lingua",languageSystem:"Sistema",languageEn:"English",languageIt:"Italiano",timelineMode:"Modalit\xe0 timeline",timelineModeClassic:"Classica",timelineModeTheater:"Theater",timeline:"Timeline",timelineVisible:"Mostra timeline rilevamenti",timelineVisibleDescription:"Visualizza il pannello della timeline nella vista telecamera.",clusterSize:"Dimensione cluster",snapshotInterval:"Intervallo aggiornamento snapshot",clusterSizeXS:"Molto piccola",clusterSizeS:"Piccola",clusterSizeM:"Normale",clusterSizeL:"Grande",clusterSizeXL:"Molto grande",highlightAppearance:"Aspetto evidenze",highlightAppearanceHint:"Colore e spessore del bordo per evidenze movimento, audio e rilevamento sugli stream delle telecamere.",highlightMotion:"Movimento",highlightAudio:"Audio",highlightDetection:"Rilevamento",highlightColor:"Colore",highlightThickness:"Spessore",selectSection:"Seleziona sezione",addSystem:"Aggiungi sistema",selectPlatform:"Seleziona piattaforma",deleteInstance:"Elimina istanza",deleteInstanceConfirm:"Vuoi eliminare questa istanza?",delete:"Elimina",mqttEvents:"MQTT - Eventi in tempo reale",mqttBrokerUrl:"URL broker MQTT",mqttUsername:"Username MQTT",mqttPassword:"Password MQTT",mqttTopicPrefix:"Prefisso topic (default: frigate)",mqttOptional:"Opzionale",scryptedAddressAlreadyUsed:"Questo indirizzo Scrypted \xe8 gi\xe0 configurato. \xc8 consentita una sola istanza per indirizzo.",scryptedAdvancedNotifierRequired:"Il plugin Advanced Notifier \xe8 richiesto per la connessione.",scryptedCorsTitle:"Configurazione CORS richiesta (Web)",scryptedCorsBody:"In Scrypted, apri le impostazioni del plugin Cloud e aggiungi il tuo dominio ({{domain}}) alla lista CORS Allowed Origins. Senza questa configurazione, il browser bloccher\xe0 le richieste verso il server Scrypted.",scryptedUrlHint:"L'URL locale viene provato per primo (es. in LAN), poi quello pubblico. Ne serve almeno uno.",gridLayout:"Layout griglia",gridLayoutHint:"Opzioni di visualizzazione per la griglia telecamere.",gridColumns:"Colonne griglia",gridColumnsHint:"Numero di telecamere per riga. Auto = 1 su mobile, 4 su tablet.",gridShowName:"Mostra nome telecamera",gridShowState:"Mostra stato (batteria, registrazione, sleep)",reorderCameras:"Riordina telecamere",reorderCamerasHint:"Trascina per riordinare le telecamere",reorderDone:"Fatto",manageCameras:"Gestisci telecamere",manageCamerasHint:"Rimuovi telecamere dall'app.",downloadSnapshot:"Scarica snapshot",snapshotFailed:"Impossibile recuperare lo snapshot",exportSnapshot:"Snapshot",exportDownloadClip:"Scarica clip",exportStartRecording:"Avvia registrazione",exportStopRecording:"Ferma registrazione",exportRecordingWebOnly:"Registrazione disponibile su web",intercomError:"Intercom non disponibile. Verifica le credenziali della telecamera su Scrypted.",deleteCamera:"Rimuovi telecamera",deleteCameraConfirm:"Rimuovere {{name}} dall'app?",streamPlayback:"Stream e riproduzione",playOnOpen:"Avvia stream all'apertura telecamera",playOnOpenHint:"Carica automaticamente lo stream live quando apri una telecamera.",audioOnOpen:"Audio attivo all'apertura",audioOnOpenHint:"Riproduci audio quando apri una telecamera (se supportato).",streamWatchdog:"Stream watchdog",streamWatchdogHint:"Riavvia lo stream quando non arrivano dati (aiuta con connessioni bloccate).",cameraPlayer:"Player telecamera",webViewCameraDetail:"Usa player WebView",webViewCameraDetailHint:"Usa WebView per le telecamere Scrypted (primo frame pi\xf9 veloce, pi\xf9 stabile). PiP, fullscreen e intercom funzionano. Default: player nativo.",streamQuality:"Qualit\xe0 stream",streamQualitySingle:"Qualit\xe0 singola telecamera",streamQualityGrid:"Qualit\xe0 griglia",qualityAuto:"Auto",qualityHigh:"High",qualityMedium:"Mid",qualityLow:"Sub",auto:"Auto",associatedDevices:"Dispositivi associati",associatedDevicesHint:"Aggiungi attuatori (luci, interruttori, tapparelle, ecc.) per controllarli dalla vista telecamera.",linkedDevices:"Collegati",reorderHint:"Usa le frecce per riordinare",addDevice:"Aggiungi dispositivo",noEligibleDevices:"Nessun Scrypted o Home Assistant configurato. Aggiungi prima un'integrazione.",configureDevices:"Configura dispositivi",cameraSettingsHint:"Scegli una telecamera per configurarne le opzioni.",noCamerasConfigured:"Nessuna telecamera configurata.",searchDevices:"Cerca dispositivi...",source:"Sorgente",type:"Tipo",all:"Tutti",noMatchingDevices:"Nessun dispositivo corrisponde ai filtri.",frigateStream:"Stream Frigate",frigateStreamSourceHint:"Sorgente stream: WebRTC (default), RTSP o MJPEG.",frigateStreamMapping:"Mappatura stream (nomi go2rtc da config)",frigateStreamMappingHint:"Seleziona dagli stream go2rtc disponibili. Ordine: High, Mid, Sub.",frigateSelectStream:"Seleziona stream",frigateAddStream:"Aggiungi stream",frigateInfo:"Info telecamera",frigateShowConfig:"Mostra config",frigateShowGo2rtc:"Mostra go2rtc",frigateMissingConfig:"Mancano baseUrl o cameraName nella config della telecamera.",tabLogs:"Log",logsCount:"{{count}} voci",logsDownload:"Scarica",logsClear:"Svuota",logsEmpty:"Nessun log. L'output della console apparir\xe0 qui.",logsExportError:"Esportazione fallita",logsExportTitle:"Esporta log",logsClearConfirmTitle:"Svuota log",logsClearConfirmMessage:"Rimuovere tutte le voci di log?",hubAppearanceTitle:"Aspetto",hubAppearanceDesc:"Tema, lingua, timeline e evidenze",hubCamerasTitle:"Telecamere",hubCamerasDesc:"Layout griglia, qualit\xe0 stream e gestione telecamere",hubIntegrationsTitle:"Integrazioni",hubIntegrationsDesc:"Gestisci Scrypted, Frigate e altri sistemi",hubAdvancedTitle:"Avanzato",hubAdvancedDesc:"Backup dati e gestione cache",hubLogsTitle:"Log",hubLogsDesc:"Visualizza ed esporta i log dell'applicazione",hubCacheTitle:"Cache",frigateAutoSnap:"Istantanea Automatica",frigateSegmentNav:"Navigazione Segmenti",frigateShowGo:"Mostra Go2RTC",frigateTimeline:"Timeline",reelCameras:"Telecamere Reel",reelCamerasHint:"Seleziona quali telecamere appaiono nel reel eventi",reelDeselectAll:"Deseleziona Tutto",reelDetectionClasses:"Classi di Rilevamento",reelDetectionClassesHint:"Filtra gli eventi per classe di rilevamento",reelIncludeRuleArtifacts:"Includi Artefatti Regole",reelIncludeRuleArtifactsHint:"Mostra gli eventi basati su regole nel reel",reelRuleArtifacts:"Artefatti Regole",reelSelectAll:"Seleziona Tutto",reelBadgeContent:"Contenuto badge",reelBadgePosition:"Posizione badge",reelBadgeSize:"Dimensione badge",reelBadgeBoth:"Ora + Classe",reelBadgeTime:"Solo ora",reelBadgeClass:"Solo classe",reelBadgeNone:"Nascosto",reelBadgeSmall:"Piccolo",reelBadgeMedium:"Medio",reelBadgeLarge:"Grande"},reel:{filterMotion:"Motion",filterOnlyRules:"Solo rule",filterOnlySensors:"Solo sensori",goToMostRecent:"Vai al pi\xf9 recente"},v2:{common:{connecting:"Connessione\u2026",online:"Online",offline:"Offline",loadError:"Errore di caricamento",create:"Crea",back:"Indietro",on:"On",off:"Off",confirm:"Conferma",cancel:"Annulla",ok:"OK",done:"Fatto"},cameras:{empty:"Nessuna telecamera",hubNotAnswering:"L'hub non risponde. Alcune telecamere potrebbero appartenere a un nodo attualmente offline \u2014 trascina per riprovare.",statusOnline:" \xb7 online",statusOffline:" \xb7 offline",motion:"Movimento",doorbell:"Campanello",doorbellRinging:"Sta suonando",doorbellLastRing:"Suonato {{time}} fa",snapshotLoading:"Caricamento\u2026",refreshing:"Aggiornamento\u2026",stationaryFor:"stazionario {{min}}m",manage:"Gestisci telecamere",manageHint:"Trascina per riordinare. Rinomina al volo. Usa lo switch per mostrare o nascondere una telecamera dall\u2019elenco.",arrangeStart:"Riordina l\u2019elenco",arrangeConfirm:"Salva questo ordine",arrangeCancel:"Annulla le modifiche",arrangeHint:"Trascina le telecamere nell\u2019ordine che vuoi, poi tocca la spunta per salvarlo. La spunta salva; la croce rimette l\u2019elenco com\u2019era. Quest\u2019ordine resta solo su questo dispositivo.",reorderHandle:"Trascina per riordinare",appearance:"Aspetto",editList:"Modifica elenco",listOptions:"Opzioni elenco telecamere",controlsA11y:"Controlli telecamera",disabledTitle:"Fuori servizio",disabledHint:"Disattivata da un amministratore",emptyOutOfScope:"Nessuna telecamera nel tuo profilo di accesso",emptyOutOfScopeHint:"Al tuo account non \xe8 ancora assegnata nessuna telecamera. Chiedi a chi amministra questo hub di darti accesso.",snapshotStale:"Snapshot di {{age}} fa",hubNotProvisioning:"L'hub non risponde",reelFilter:"Eventi recenti",reelFilterAll:"Mostra tutti gli eventi",reelFilterDefaultHint:"Solo eventi di rilevamento \u2014 audio e sensori sono nascosti",reelFilterCount:"{{count}} tipi di evento mostrati",reelFilterUseDefault:"Predefinito",reelFilterShowAll:"Tutto",reelFilterDefaultTag:"Rilevamenti",reelFilterCountTag:"{{count}} tipi",overlayA11y:"Apri nella finestra mobile",favourites:"Preferite",locationFilter:"Filtra per luogo",bucketEmpty:"Qui non c\u2019\xe8 niente. Aggiungi una camera col cuore, o scegli un altro luogo qui sopra."},cameraDetail:{fallbackName:"Camera #{{id}}",mute:"Disattiva audio",unmute:"Attiva audio",snapshot:"Istantanea",snapshotFailed:"Impossibile acquisire l'istantanea.",ptz:"Controlli PTZ",talk:"Parla",fullscreen:"Schermo intero",talkFailed:"Impossibile avviare la comunicazione. Verifica l'accesso al microfono.",pip:"Picture in Picture",exitFullscreen:"Esci da schermo intero",devices:"Dispositivi",devicesEmpty:"Nessun dispositivo collegato.",linkedModeAuto:"Collegamento: Auto (posizione)",linkedModeManual:"Collegamento: Manuale",close:"Chiudi",deviceOnline:"Online",deviceOffline:"Offline"},grids:{createA11y:"Crea griglia",empty:"Nessuna griglia",emptyHint:"Tocca + per creare la tua prima griglia",countNone:"Nessuna telecamera",countOne:"1 telecamera",countOther:"{{count}} telecamere",defaultName:"Nuova griglia",deleteTitle:"Elimina griglia",deleteConfirm:"Eliminare \"{{name}}\"? L'operazione non \xe8 reversibile.",export:"Esporta",exportAllA11y:"Esporta tutte le griglie",shareA11y:"Condividi griglia",editA11y:"Modifica griglia",deleteA11y:"Elimina griglia",linkCopied:"Link della griglia copiato negli appunti",layoutAuto:"Auto",layoutColumns:"{{count}} col",camerasUnknown:"Telecamere non ancora caricate",highlightOff:"Evidenziazione off",hiddenCount_one:"{{count}} nascosta",hiddenCount_other:"{{count}} nascoste",offlineCount_one:"{{count}} offline",offlineCount_other:"{{count}} offline",disabledCount_one:"{{count}} spenta",disabledCount_other:"{{count}} spente",missingCount_one:"{{count}} non disponibile",missingCount_other:"{{count}} non disponibili"},gridView:{editA11y:"Modifica griglia",fallbackTitle:"Griglia",notFound:"Griglia non trovata",emptyGrid:"Questa griglia \xe8 vuota",addCameras:"Aggiungi telecamere",reorderTitle:"Riordina telecamere",reorderA11y:"Riordina telecamere",reorderDoneA11y:"Fine riordino",allHidden:"Tutte le telecamere sono nascoste. Usa la modalit\xe0 riordino per mostrarne alcune.",dragA11y:"Trascina per riordinare",hideA11y:"Nascondi dalla griglia",showA11y:"Mostra nella griglia",removeA11y:"Rimuovi dalla griglia",adhocTitle:"Griglia rapida",cellActions:"Azioni telecamera",cellActionsA11y:"Altre azioni per questa telecamera",cellDevicesA11y:"Dispositivi collegati",cellMenuA11y:"Opzioni di visualizzazione"},gridBuilder:{title:"Modifica griglia",nameLabel:"Nome",namePlaceholder:"Nome griglia",camerasSelected:"Telecamere ({{count}} selezionate)",optionsTitle:"Opzioni",showName:"Mostra nome telecamera",export:"Esporta griglia",orderSection:"Nella griglia",orderHint:"Trascina per riordinare",emptyOrder:"Nessuna telecamera \u2014 aggiungine qui sotto.",addSection:"Aggiungi telecamere",removeA11y:"Rimuovi dalla griglia",addA11y:"Aggiungi alla griglia",highlightMotion:"Su movimento",highlightAudio:"Su audio",highlightAudioLow:"Basso",highlightAudioMid:"Medio",highlightAudioHigh:"Alto",highlightAudioLevel:"Livello",highlightThreshold:"Soglia",highlightHold:"Mantieni",highlightDetection:"Su rilevamento",clusterLabel:"Etichetta cluster",clusterLabelIcon:"Icona",clusterLabelText:"Testo"},gridBar:{back:"Indietro",pauseAll:"Metti tutto in pausa",playAll:"Riproduci tutto",audio:"Audio",quality:"Qualit\xe0 stream",layout:"Layout",timeline:"Timeline",highlightMenu:"Evidenziazione e overlay",activeOnly:"Solo attive",share:"Condividi griglia",edit:"Modifica griglia",hide:"Nascondi controlli",show:"Mostra controlli",muteAll:"Silenzia tutte",unmuteAll:"Riattiva audio"},gridMenu:{highlightMaster:"Bordi di evidenziazione"},gridShare:{title:"Condividi \"{{name}}\"",quality:"Qualit\xe0 stream",layout:"Layout",showNames:"Mostra nomi delle camere",activeOnly:"Solo camere attive",boxes:"Bounding box",highlightEnable:"Evidenziazione",audioSummary:"Audio attivo all\u2019apertura per {{count}} camera/e",ttlTitle:"Scadenza del link",ttl_1d:"1 giorno",ttl_7d:"7 giorni",ttl_30d:"30 giorni",ttl_never:"Per sempre",tokenNotice:"Il link include un token di sola visualizzazione limitato a queste camere. Chiunque abbia il link pu\xf2 guardare finch\xe9 non scade o viene revocato.",copyLink:"Copia link",creating:"Creazione link\u2026",copiedExpires:"Link copiato \u2014 scade il {{date}}",copiedNever:"Link copiato \u2014 non scade mai",error:"Impossibile creare il link di condivisione. Controlla la connessione e riprova.",optionAuto:"Auto"},gridControls:{play:"Riproduci",pause:"Pausa",mute:"Muto",unmute:"Riattiva audio",quality:"Qualit\xe0",layout:"Layout",layoutAuto:"Auto"},events:{comingSoon:"Eventi \u2014 in arrivo",searchLabel:"Cerca etichetta\u2026",searchSubmit:"Cerca",searchClear:"Cancella ricerca",empty:"Nessun evento",today:"Oggi",yesterday:"Ieri",weekdayShort:{sun:"Dom",mon:"Lun",tue:"Mar",wed:"Mer",thu:"Gio",fri:"Ven",sat:"Sab"},filteredEmpty:"Nessuna corrispondenza nell'intervallo caricato",loadOlder:"Carica meno recenti",selectPrompt:"Seleziona un evento per vederne i dettagli",filters:"Filtri",more:"Altro",all:"Tutte",day:"Giorno",sort:"Ordina",sortTime:"Recenti",sortImportance:"Importanza",flaggedOnly:"Contrassegnate",flaggedOnlyHint:"Preferite, debug o da addestrare",parked:"Stazionari",showStationary:"Mostra stazionari",showStationaryHint:"Spento = nascondi le promozioni parcheggiate",cameras:"Telecamere",classes:"Classi",attributes:"Rilevati",attrFaces:"Volti",attrPlates:"Targhe",attributesHint:"Nessuno = tutti",search:"Cerca",searchCameras:"Cerca telecamere\u2026",searchClasses:"Cerca classi\u2026",allCamerasHint:"Nessuna = tutte",allClassesHint:"Nessuna = tutte",done:"Fatto",density:"Densit\xe0",selectHint:"Seleziona un evento",unrecognizedFace:"Volto rilevato, non riconosciuto",eventKinds:"Tipi di evento",displayOptions:"Aspetto",displayTitle:"Opzioni di visualizzazione",useDefaultClasses:"Predefinito"},settings:{themeSystem:"Sistema",themeDark:"Scuro",themeLight:"Chiaro",server:"Server",account:"Accesso come",accountUnknown:"Caricamento\u2026",roleAdmin:"Admin",roleViewer:"Viewer",hubActive:"Hub attivo",changeServer:"Cambia server",signOut:"Esci",network:"Rete",networkNone:"Nessuna rotta ancora rilevata",endpointUnlikely:"Probabilmente non utilizzabile",activeRoute:"Rotta in uso",routeChannelLan:"LAN (diretta)",routeChannelPublic:"Tunnel pubblico",routeChannelLoopback:"Locale (loopback)",routeChannelUnknown:"Non riconosciuta",routeReasonInitial:"configurata, gara non ancora conclusa",routeReasonRaceWon:"la pi\xf9 veloce nella gara delle rotte",routeReasonNoWinner:"ripiego \u2014 nessun candidato ha risposto",routeReasonUnchanged:"invariata dall'ultimo rilevamento",routeReasonDisposed:"nessun trasporto",reprobe:"Ri-rileva rotte",reprobing:"Rilevamento\u2026",diagnoseNetwork:"Diagnostica rotte LAN",diagnosingNetwork:"Diagnostica in corso\u2026",diagnoseNetworkDone:"{{ok}}/{{total}} hanno risposto a /health. Apri i log e condividili \u2014 cerca ipv4/ipv6 http FAIL.",preferredRoute:"Rotta preferita",routeAuto:"Automatica",routeReasonPinned:"forzata dalle Impostazioni",appearance:"Aspetto",theme:"Tema",info:"Info",app:"App",version:"Versione",noServer:"Nessun server",footerNote:"CamStack Viewer si connette a un singolo hub camstack. Telecamere, griglie ed eventi sono gestiti dal server.",language:"Lingua",langSystem:"Sistema",gridDefaults:"Impostazioni griglia",showName:"Mostra nome telecamera",showNameHint:"Sovrapponi il nome della telecamera su ogni riquadro",showState:"Mostra stato",showStateHint:"Mostra lo stato online / registrazione su ogni riquadro",columns:"Colonne",cameraOrder:"Ordine telecamere",orderName:"Per nome",orderCustom:"Personalizzato",motionHold:"Persistenza evidenziazione movimento",motionHoldHint:"Mantieni accesa l'evidenziazione del movimento su una tile per questo tempo dopo che il movimento si ferma.",motionHoldOff:"Off",streamQuality:"Qualit\xe0 stream",streamDefaults:"Impostazioni stream",playOnOpen:"Riproduci all'apertura",playOnOpenHint:"Avvia lo stream live quando apri una telecamera",audioOnOpen:"Audio all'apertura",audioOnOpenMode:{"last-selected":"Come l'hai lasciato",on:"Sempre acceso",off:"Sempre spento"},audioOnOpenModeHint:{"last-selected":"Ogni camera si apre com'era l'ultima volta. Una camera su cui non hai mai scelto si apre muta.",on:"Ogni camera si apre con l'audio.",off:"Ogni camera si apre muta."},snapshotInterval:"Aggiornamento snapshot",highlightAppearance:"Aspetto evidenziazione",highlightMotionColor:"Colore movimento",highlightAudioColor:"Colore audio",highlightDetectionColor:"Colore rilevamento",highlightThickness:"Spessore bordo",qualityAuto:"Auto",qualityHigh:"Alta",qualityMid:"Media",qualityLow:"Bassa",secondsValue:"{{count}}s",advanced:"Avanzate",clearCache:"Svuota cache",clearCacheHint:"Libera snapshot e dati in cache (mantiene server e impostazioni)",clearCacheConfirmTitle:"Svuotare la cache?",clearCacheConfirmBody:"Rimuove immagini e dati in cache. Server, accesso e impostazioni vengono mantenuti.",clearCacheDone:"Cache svuotata",exportSettings:"Esporta impostazioni",exportSettingsHint:"Copia le impostazioni in formato JSON",exportSettingsDone:"Impostazioni copiate in JSON",shareTitle:"Condividi impostazioni",shareHint:"Salva uno snapshot nominato di impostazioni, griglie e preferenze telecamere sul hub. Chiunque sia connesso pu\xf2 importarlo \u2014 sostituisce quanto c'\xe8 su questo dispositivo.",shareNamePlaceholder:"Nome snapshot",shareSave:"Salva",shareEmpty:"Nessuno snapshot",shareImportTitle:"Importare questo snapshot?",shareImportBody:"\"{{name}}\" sostituir\xe0 impostazioni, griglie e preferenze telecamere su questo dispositivo.",shareDeleteTitle:"Eliminare questo snapshot?",shareDeleteBody:"\"{{name}}\" verr\xe0 rimosso dal hub.",shareFailed:"Impossibile condividere le impostazioni",shareInvalid:"Questo snapshot non \xe8 un documento di impostazioni valido.",shareMissing:"Questo snapshot non \xe8 pi\xf9 sul hub.",viewLogs:"Visualizza log",viewLogsHint:"Messaggi di log recenti dell'app",logsEmpty:"Nessun log registrato",keepLogs:"Mantieni log",keepLogsHint:"Registra un buffer dei messaggi di log dell'app",debugMode:"Modalit\xe0 debug",debugModeHint:"Log verbosi su live, playback e scrub \u2014 inviati al server",logsClear:"Pulisci",resetSettings:"Ripristina impostazioni",resetSettingsHint:"Ripristina tutti i valori predefiniti",resetConfirmTitle:"Ripristinare le impostazioni?",resetConfirmBody:"Ripristina tutte le impostazioni ai valori predefiniti.",cancel:"Annulla",confirm:"Conferma",timeline:"Timeline",reel:"Sequenza eventi",reelThumbSize:"Dimensione miniature",reelThumbSizeHint:"Dimensione delle miniature nella sequenza eventi recenti.",reelSizeSmall:"Piccola",reelSizeMedium:"Media",reelSizeLarge:"Grande",reelShowLabels:"Mostra etichette",reelShowLabelsHint:"Mostra l'etichetta classe/identit\xe0 sugli elementi della sequenza.",reelLabelStyle:"Visualizzazione classe",reelLabelStyleHint:"Mostra la classe di rilevamento come icona o come testo negli elementi della sequenza.",reelShowImportance:"Mostra importanza",reelShowImportanceHint:"Mostra il badge di importanza sugli elementi della sequenza.",events:"Eventi",eventsPage:"Pagina eventi",minImportance:"Importanza minima",minImportanceHint:"Nascondi gli eventi con punteggio inferiore, nella pagina eventi e nella timeline della telecamera.",minImportanceOff:"Off",tileShowLabels:"Mostra etichette",tileShowLabelsHint:"Mostra le etichette classe / identit\xe0 / audio sulle schede evento.",tileShowImportance:"Mostra importanza",tileShowImportanceHint:"Mostra il badge di importanza sulle schede evento (se valutato).",tileShowCameraName:"Mostra nome telecamera",tileShowCameraNameHint:"Mostra il nome della telecamera nel pi\xe8 di pagina della scheda evento.",tileLabelStyle:"Visualizzazione classe",tileLabelStyleHint:"Mostra la classe di rilevamento come icona o come testo.",tileLabelStyleIcon:"Icona",tileLabelStyleText:"Testo",comingSoon:"Prossimamente",cameras:"Telecamere",manageCameras:"Gestisci telecamere",manageCamerasHint:"Rinomina, nascondi, riordina",notifications:"Notifiche",notificationsManage:"Gestisci notifiche",pinchExpandsHeight:"Il pizzico ingrandisce la vista",pinchExpandsHeightHint:"Pizzicando per lo zoom il video cresce in altezza (ritaglia i bordi laterali sulle camere 16:9).",navBarOnStream:"Barra di navigazione sulla singola camera",navBarOnStreamHint:"Mantiene visibile la navigazione principale mentre guardi una camera. Sulle finestre larghe la navigazione laterale c'\xe8 gi\xe0.",reopenLastCamera:"Riapri l'ultima camera",reopenLastCameraHint:"All'avvio riapre la camera che stavi guardando. Solo se guardarla \xe8 stata l'ultima cosa che hai fatto \u2014 cambiare pagina la dimentica.","timeline.gapPercent":"Gap cluster (%)","timeline.sizePercent":"Dimensione cluster (%)","timeline.indicatorPositionPct":"Posizione indicatore (%)","timeline.showImportance":"Mostra importanza sugli elementi","timeline.showClass":"Mostra classe di rilevamento sugli elementi","timeline.cardWidthPct":"Larghezza card (%)",hapticsUiFeedback:"Vibra alla pressione",hapticsUiFeedbackHint:"Una breve vibrazione conferma pulsanti, interruttori, PTZ e comandi del player. Solo su dispositivo (iOS/Android).",buildNumber:"Build",runtimeVersion:"Runtime",runningBundle:"Bundle in esecuzione",checkUpdates:"Controlla aggiornamenti",checkingUpdates:"Controllo\u2026",updateUpToDate:"Sei gi\xe0 all'ultima versione.",updatesDisabled:"Gli aggiornamenti sono disattivati in questa build.",updateReadyTitle:"Aggiornamento scaricato",updateReadyBody:"Riavviare l'app ora per applicarlo?",updateCheckFailed:"Impossibile controllare gli aggiornamenti",listOverlays:"Schede videocamere",listMotionBorder:"Anello movimento",listMotionBorderHint:"Pulsa un anello attorno alla scheda mentre la videocamera vede movimento.",listMotionBadge:"Posizione badge movimento",listOccupancy:"Posizione occupazione",useNativeRenderer:"Usa il renderer integrato",useNativeRendererHint:"Disegna Recenti ed Eventi dentro l\u2019app invece di caricare l\u2019embed ospitato dall\u2019hub.",toolbarDensity:"Altezza barra strumenti","toolbarDensity.small":"Piccola","toolbarDensity.medium":"Media","toolbarDensity.large":"Grande",general:"Generale",templateFollowTitle:"Seguire questo template?",templateFollowBody:"Questo dispositivo prender\xe0 automaticamente l\u2019ultima versione di \xab{{name}}\xbb. Le impostazioni condivise di questo dispositivo verranno sostituite, ora e a ogni aggiornamento del template.",templateFollowing:"Segue questo template",templateProducing:"Questo dispositivo lo aggiorna"},nc:{title:"Notifiche",tabs:{rules:"Regole",targets:"Targets",snooze:"Silenzia"},rulesPlaceholder:"Le regole di notifica appariranno qui.",targetsPlaceholder:"Le destinazioni di consegna appariranno qui.",rules:{add:"Nuova regola",empty:"Nessuna regola.",loadError:"Impossibile caricare le regole. Riprova.",mine:"Le mie regole",admin:"Regole admin",system:"Eventi di sistema",personalBadge:"Personale",adminBadge:"Admin",edit:"Modifica",delete:"Elimina",cancel:"Annulla",deleteConfirmTitle:"Eliminare la regola?",deleteConfirmMessage:"Eliminare \"{{name}}\"? L'operazione non \xe8 reversibile.",receiveOn:"Ricevi su {{name}}",noOwnedTargets:"Questa regola non invia ad alcuna delle tue destinazioni.",section:{empty:{timelapse:"Nessun timelapse. Un timelapse trasforma una notte di registrazioni in un video breve e lo invia alla chiusura della finestra \u2014 scegli le telecamere e le ore.",summary:"Nessun riepilogo. Un riepilogo raccoglie lo scatto migliore di tutto ci\xf2 che \xe8 passato davanti a pi\xf9 telecamere e invia una sola immagine."},create:{timelapse:"Nuovo timelapse",summary:"Nuovo riepilogo"},timelapse:"Timelapse",summary:"Riepilogo"},mediaBadge:{attach:{"best-matching":"Immagine pertinente",keyFrame:"Fotogramma chiave",none:"Nessuna immagine"},frame:{full:"Tutta la scena",boxed:"Scena con riquadri"},zoneCrop:"Ritaglio zona",gif:"GIF",clip:"Video",profile:"Qualit\xe0 {{profile}}"},editor:{createTitle:"Nuova regola",editTitle:"Modifica \"{{name}}\"",basics:"Generali",nameLabel:"Nome",namePlaceholder:"es. Persone al portone",triggerLabel:"Attivazione",priorityLabel:"Priorit\xe0",targetsLabel:"Invia a",noTargets:"Non hai ancora destinazioni. Aggiungine una nella scheda Destinazioni.",pickTarget:"Seleziona almeno una destinazione.",conditionsLabel:"Condizioni",section:{rule:"Regola",devices:"Telecamere",conditions:"Condizioni",notification:"Notifica",actions:"Azioni",advanced:"Avanzate"},kindSection:{detection:"Condizioni",sensor:"Condizioni",sound:"Suono",occupancy:"Occupazione","device-events":"Eventi dispositivi",system:"Eventi",alarm:"Eventi allarme",mixed:"Eventi"},kindBlurb:{detection:"Una persona, un veicolo o un animale visto dalla telecamera. Restringi per classe, zona, volto o targa; il resto \xe8 facoltativo.",sensor:"Un campanello premuto o un sensore collegato che cambia stato. L'immagine arriva dalla telecamera a cui il sensore \xe8 attribuito.",sound:"Scatta su una finestra audio confermata, mai su un'immagine. Indica i suoni e/o mantieni una soglia di livello: senza nessuno dei due non pu\xf2 mai scattare.",occupancy:"Scatta quando il conteggio nell'inquadratura o in una zona supera la tua soglia e la mantiene. Scegli prima la telecamera: l'elenco delle zone \xe8 quello di quella telecamera.","device-events":"Un dispositivo o il suo stream che cade o torna, spento o riacceso, una batteria o un consumabile in esaurimento, una telecamera che non rileva nulla. Non c'\xe8 un fotogramma da allegare.",system:"L'impianto stesso: un nodo che esce, un addon in crash continuo, un aggiornamento disponibile o installato, un backup o un'esportazione completati.",alarm:"La centrale d'allarme: inserimento rifiutato, in inserimento, inserita, ritardo d'ingresso, scattata, reinserita, sensore escluso, disinserita.",mixed:"Questa regola mescola eventi di pi\xf9 famiglie (dispositivi, sistema, allarme). Continua a funzionare cos\xec com'\xe8, ma non \xe8 pi\xf9 modificabile: crea una regola per famiglia, poi elimina questa."},dropTitle:"Verranno rimossi al salvataggio",dropHint:"Questo tipo di regola non pu\xf2 usarli, e tenerli la lascerebbe silenziosa.",condition:{systemEvent:"Evento di sistema",sensorKinds:"Tipi di sensore",eventTypeTokens:"Token del tipo di evento",source:"Origine del rilevamento",classes:"Classi di oggetti",classesExclude:"Classi escluse",minConfidence:"Affidabilit\xe0 minima",zones:"Zone di rilevamento",zonesExclude:"Zone di rilevamento escluse",customZones:"Zone personalizzate",crossing:"Attraversamento zona",labelEquals:"Etichetta uguale a",identities:"Volti noti",identitiesExclude:"Volti esclusi",plates:"Targhe note",devices:"Telecamere",minLabelConfidence:"Affidabilit\xe0 minima dell'etichetta",minImportance:"Importanza minima",minDwellSeconds:"Permanenza minima (secondi)",deviceState:"Stato del dispositivo",scene:"Stato della scena",packagePhase:"Fase del pacco",occupancy:"Occupazione",audio:"Suono",schedule:"Programmazione",sensorTransition:"Notifica quando",devicesExclude:"Dispositivi esclusi"},noConditions:"Nessuna condizione disponibile.",notForTrigger:"Non per questa attivazione",notForTriggerHint:"Non valutata per l'attivazione scelta \u2014 cambia attivazione per usarla.",mediaLabel:"Media",attachLabel:"Allegato",frameLabel:"L'immagine mostra",frame:{cropped:"Il soggetto",full:"Tutta la scena",boxed:"La scena, con i riquadri"},zoneCropLabel:"Ritaglia sulla zona",zoneCropHint:"Ritaglia l'immagine sulla zona della regola invece che sul soggetto o sull'intera scena.",gifLabel:"Allega una GIF",gifHint:"Una breve animazione ritagliata dal buffer live attorno al momento \u2014 la telecamera non deve essere in registrazione.",clipLabel:"Allega un video",clipHint:"Un MP4 dello stesso spezzone. Le destinazioni che non accettano video ricevono comunque l'immagine.",preRollLabel:"Secondi prima",postRollLabel:"Secondi dopo",profileLabel:"Qualit\xe0 del video",profile:{auto:"Automatica",high:"Alta",mid:"Media",low:"Bassa"},templateLabel:"Messaggio (facoltativo)",templateTitleLabel:"Titolo",templateBodyLabel:"Testo",templateHint:"Lascia vuoti entrambi i campi per usare il testo dell'hub.",save:"Salva modifiche",create:"Crea regola",addValue:"Aggiungi valore\u2026",removeTag:"Rimuovi {{value}}",clear:"Azzera",noCameras:"Nessuna telecamera disponibile \u2014 la regola vale per tutti i dispositivi.",noCamerasRequired:"Nessuna telecamera disponibile.",devicesLoading:"Caricamento telecamere\u2026",devicesUnavailable:"L'hub non ha restituito le telecamere \u2014 quelle selezionate sono elencate per id e si possono comunque rimuovere.",deviceRemoved:"Dispositivo #{{id}} \u2014 rimosso",deviceUnknown:"Dispositivo #{{id}}",devicesEmptyWidens:"Nessuna telecamera selezionata: la regola varr\xe0 per TUTTE le telecamere.",plateText:"Testo targa\u2026",maxDistance:"Distanza massima",waitForEnhancementLabel:"Attendi il riconoscimento",waitForEnhancementHint:"Attivo: una sola notifica a fine traccia, con il nome. Disattivo: una subito senza nome, pi\xf9 una seconda se il nome arriva prima che la traccia si chiuda.",recognition:{plates:{off:"Qualsiasi veicolo",anyKnown:"Targa letta",specific:"Queste targhe",offHint:"Alla regola non importa la targa: corrisponde anche un veicolo di cui non \xe8 stata letta.",anyKnownHint:"Solo i veicoli di cui la targa \xe8 stata effettivamente letta, qualunque essa sia.",specificHint:"Solo queste targhe, con corrispondenza tollerante \u2014 la lettura della targa non \xe8 mai perfetta."}},customZones:{empty:"Nessuna zona personalizzata. Scegli una camera e disegnane una.",pickCamera:"Camera su cui disegnare",noCameras:"Nessuna camera online su cui disegnare.",draw:"Disegna zona",zoneLabel:"Zona {{index}} ({{count}} punti)",remove:"Rimuovi zona {{index}}",title:"Disegna zona \u2014 {{name}}",hint:"Tocca per aggiungere punti, trascina un punto per spostarlo. Tocca il primo punto per chiudere.",loading:"Caricamento frame\u2026",cancel:"Annulla",clear:"Cancella",close:"Chiudi",confirm:"Conferma"},addWindow:"Aggiungi finestra",scheduleAlways:"Sempre attiva \u2014 aggiungi una finestra per limitare quando scatta.",scheduleInvert:"Attiva fuori dalle finestre",delivery:{immediate:"Immediata",trackEnd:"Fine traccia",deviceEvent:"Evento dispositivo",packageEvent:"Evento pacco",systemEvent:"Evento di sistema"},systemKinds:{"device-online":"Dispositivo online","device-offline":"Dispositivo offline","device-disabled":"Dispositivo spento","device-enabled":"Dispositivo acceso","camera-online":"Videocamera online","camera-offline":"Videocamera offline","camera-disabled":"Videocamera spenta","camera-enabled":"Videocamera accesa","stream-online":"Flusso online","stream-offline":"Flusso offline","node-online":"Nodo online","node-offline":"Nodo offline","node-inference-unavailable":"Nodo senza dispositivi di inferenza utilizzabili","detection-blind":"Telecamera che non rileva nulla","addon-crash-loop":"Crash loop addon (runner arreso)","alarm-arm-refused":"Inserimento allarme rifiutato","alarm-arming":"Allarme in inserimento","alarm-triggered":"Allarme scattato","alarm-armed":"Allarme inserito","alarm-disarmed":"Allarme disinserito","addon-update-available":"Aggiornamento addon disponibile","server-update-available":"Aggiornamento server disponibile","addon-updated":"Addon aggiornati","server-updated":"Server aggiornato","export-completed":"Export completato","device-battery-low":"Batteria scarica","device-battery-normal":"Batteria ripristinata","device-consumable-low":"Consumabile in esaurimento","device-consumable-normal":"Consumabile sostituito","device-tank-low":"Serbatoio basso (acqua, detergente)","device-tank-full":"Serbatoio pieno (acqua sporca, polvere)","device-tank-normal":"Serbatoio tornato normale","alarm-check-failed":"Allarme inserito senza verifica aperture","alarm-pending":"Ritardo di ingresso allarme avviato","alarm-rearmed":"Allarme reinserito","alarm-sensor-bypass":"Sensore allarme escluso o ripristinato","wrapper-update-available":"Aggiornamento immagine container disponibile","backup-completed":"Backup completato"},systemGroups:{"device-state":"Stato dei dispositivi",streams:"Stream",battery:"Batteria",consumables:"Consumabili",tanks:"Serbatoi","detection-blind":"Nessun rilevamento",nodes:"Nodi",addons:"Addon",updates:"Aggiornamenti di server e container","backups-exports":"Backup ed esportazioni",alarm:"Allarme"},systemFilters:{cameras:"Solo quando fatto scattare da queste videocamere (facoltativo)",deviceTypes:"Solo questi tipi di dispositivo (facoltativo)",nodes:"Solo questi nodi (facoltativo)",packages:"Solo questi pacchetti (facoltativo)",devices:"Solo questi dispositivi (facoltativo)",excludeDevices:"Mai questi dispositivi (facoltativo)",excludeHint:"Applicato dopo l'elenco sopra: un dispositivo qui non viene mai segnalato, qualunque altra cosa corrisponda.",noExcluded:"Nessun dispositivo escluso",batteryTypesWarning:"Gli avvisi di batteria e consumabili sono filtrati per tipo di dispositivo. Batterie e consumabili appartengono a sensori, contenitori, robot e tosaerba \u2014 quasi mai a una videocamera \u2014 quindi un filtro per tipo pensato per la connettivit\xe0 li zittisce. Lascia vuoti i tipi, o sposta questi eventi in una regola dispositivi a parte.",thresholdsHint:"La soglia della batteria e i promemoria sono impostazioni del cluster (interfaccia admin \u2192 impostazioni di post-analisi). La soglia di un consumabile \xe8 propria di questa regola.",consumableThreshold:"Consumabile in esaurimento al (%)",consumableThresholdHint:"Questa regola viene avvisata quando la vita residua di un consumabile scende a questa percentuale (vuoto = {{defaultPercent}}%). Un'altra regola pu\xf2 usare il proprio numero: ognuna viene avvisata alla propria soglia. Un dispositivo che segnala \u201cda sostituire\u201d viene annunciato qualunque cosa dica questo campo.",consumableThresholdInvalid:"Un numero intero da {{min}} a {{max}}: questo valore non viene salvato.",alarmSettings:"Impostazioni allarme",alarmTriggeredMedia:"Quando una regola fa scattare l'allarme, questa notifica porta le immagini di quella regola.",mixedNone:"Nessun evento selezionato"},media:{best:"Immagine migliore",bestMatching:"Migliore corrispondente",keyFrame:"Fotogramma chiave",none:"Nessun allegato"},source:{any:"Qualsiasi",pipeline:"Pipeline",onboard:"A bordo",sensor:"Sensore",audio:"Audio"},phase:{delivered:"Consegnato","picked-up":"Ritirato",both:"Entrambi"},group:{scope:"Ambito",class:"Rilevamenti",zones:"Zone di rilevamento",quality:"Qualit\xe0",label:"Identit\xe0 e targhe",device:"Evento dispositivo",package:"Pacco",system:"Eventi di sistema",schedule:"Programmazione",occupancy:"Occupazione",audio:"Suono"},taxonomy:{person:"Persone",vehicle:"Veicoli",animal:"Animali",audio:"Audio",sensor:"Sensori",control:"Comandi",custom:"Valori personalizzati",addCustom:"Aggiungi un valore\u2026"},weekday:{mon:"Lun",tue:"Mar",wed:"Mer",thu:"Gio",fri:"Ven",sat:"Sab",sun:"Dom"},crossing:{exit:"In uscita",any:"Entrambe",enter:"In entrata",enterHint:"Ingressi e movimento normale; mai un\u2019uscita.",exitHint:"Solo l\u2019uscita da una zona.",anyHint:"Ingressi, uscite e movimento normale."},deviceStateNone:"Non impostato \u2014 questa regola non dipende da nessun altro dispositivo.",deviceStateSet:"Solo mentre il dispositivo {{deviceId}} \xe8: {{states}}. Si modifica dall'admin \u2014 questa app non pu\xf2 elencare tutti i dispositivi.",sceneGateNone:"Non impostato.",sceneGateSet:"Solo mentre la scena {{sceneId}} \xe8 {{state}}.",occupancy:{zoneLabel:"Zona di rilevamento",wholeFrame:"\u2014 intero fotogramma \u2014",zonesLoading:"Caricamento zone\u2026",zonesNeedCamera:"Scegli le telecamere qui sopra per selezionare una delle loro zone.",zonesNone:"Queste telecamere non hanno zone \u2014 il conteggio copre l\u2019intero fotogramma.",zoneMissing:"La zona \"{{id}}\" non esiste pi\xf9 su queste telecamere. La regola la conserva e non scatter\xe0 finch\xe9 non scegli un altro ambito.",classLabel:"Classe",anyClass:"\u2014 qualsiasi classe \u2014",classesNone:"L\u2019hub non ha inviato un vocabolario di classi \u2014 il conteggio copre ogni classe.",classMissing:"\"{{name}}\" non \xe8 una classe segnalata da queste telecamere. La regola la conserva e non scatter\xe0 finch\xe9 non ne scegli un\u2019altra.",opLabel:"Scatta quando",op:{"became-occupied":"Diventa occupata","became-free":"Diventa libera",">=":"Conteggio \u2265","<=":"Conteggio \u2264"},thresholdLabel:"Soglia",countLabel:"Conteggio",sustainLabel:"Mantieni per (secondi)",sustainInstantHint:"Con 0 secondi scatta al primo fotogramma che supera la soglia \u2014 aspettati notifiche ripetute da un soggetto che cammina sul bordo della zona. Di solito si usano 15 secondi.",hint:"Conta gli oggetti tracciati confermati dall\u2019analisi delle zone. Il cambiamento deve durare per tutta la finestra prima di scattare; senza uno snapshot per la telecamera o la zona la regola non scatta mai.",classesDropped:"Il filtro classi ({{classes}}) viene rimosso al salvataggio: un evento di occupazione porta una sola classe, quindi impedirebbe soltanto alla regola di scattare. Imposta invece la classe qui sopra."},audio:{modeLabel:"Come scatta",modeLabelOption:"\ud83d\udd0e Suoni",modeLevelOption:"\ud83d\udcc8 Volume",modeLabelHint:"Scatta quando abbastanza fotogrammi etichettati cadono in una finestra breve (predefinito 2 in 5 secondi). Un falso positivo di un solo fotogramma non arriva a 2; un episodio vero di solito ne etichetta due o tre. L\u2019altro freno \xe8 la pausa della regola.",modeLevelHint:"Scatta quando il suono resta abbastanza forte abbastanza a lungo: la finestra qui sotto \xe8 tutta la condizione.",labelsLabel:"Suoni",labelsHint:"Scegline almeno uno. Il classificatore etichetta solo uno o due fotogrammi per episodio, quindi una percentuale su una finestra non potrebbe mai confermarli \u2014 questo modo conta quei fotogrammi.",confirmHitsLabel:"Conferma dopo (fotogrammi)",confirmHitsHint:"Quanti fotogrammi etichettati devono cadere nella finestra prima di notificare. Predefinito 2 \u2014 un falso positivo di un solo fotogramma non ci arriva.",confirmWindowLabel:"entro (secondi)",confirmWindowHint:"La finestra che quei fotogrammi devono condividere. Predefinito 5 s. Due fotogrammi a sei secondi di distanza non confermano.",labelsUnknown:"Questa regola conserva {{labels}}, che questo hub non classifica. Resta com\u2019\xe8; toccalo per rimuoverlo.",dbLabel:"Pi\xf9 forte di (dBFS)",dbHint:"I dBFS sono negativi: 0 \xe8 il fondo scala, \u221296 \xe8 il silenzio \u2014 quindi un numero PI\xd9 ALTO \xe8 un filtro PI\xd9 STRETTO. Misurato su questo hub, un bambino che piange sta fra \u221255 e \u221226 dBFS: una soglia sopra \u221255 ne esclude la maggior parte.",hitPercentLabel:"Rilevamenti nella finestra (%)",hitPercentHint:"Quanta parte della finestra deve corrispondere prima di scattare. Predefinito 60%.",samplingLabel:"Finestra (secondi)",samplingHint:"La finestra deve essere PIENA prima di poter corrispondere \u2014 una finestra a met\xe0 non scatta mai. Predefinito 10s.",failClosedHint:"Scegli almeno un suono oppure imposta una soglia di livello. Senza nessuno dei due ogni campione conta come rilevamento e l\u2019hub rifiuta la regola invece di notificare sul silenzio.",hint:"Scatta sul SUONO prolungato, non su un\u2019immagine: una regola con questa condizione viene valutata solo su una finestra audio confermata, mai su un rilevamento o una traccia. Le telecamere coinvolte devono avere l\u2019analisi audio attiva."},zonePicker:{needCamera:"Seleziona prima una camera \u2014 le zone appartengono a una camera.",loading:"Caricamento zone\u2026",none:"Le camere selezionate non hanno zone.",missing:"La zona {{id}} non esiste pi\xf9 sulle camere selezionate"},dropReason:{occupancy:{sensorKinds:"Un cambio di occupazione non \xe8 un evento di un sensore: non porta con s\xe9 alcun tipo di sensore, quindi questa condizione non potr\xe0 mai corrispondere.",eventTypeTokens:"Un cambio di occupazione non porta con s\xe9 alcun token di evento del dispositivo \u2014 quello arriva da un emettitore di eventi, che il superamento di una soglia di conteggio non ha.",source:"Un cambio di occupazione \xe8 sempre prodotto dalla pipeline, quindi qualsiasi altra origine non potr\xe0 mai corrispondere e \xabpipeline\xbb non restringe nulla.",sensorTransition:"Un cambio di occupazione \xe8 il superamento di un conteggio, non la lettura di un sensore: non scatta n\xe9 rientra, quindi questa scelta non potrebbe mai restringerlo."},sound:{classes:"Una regola audio scatta su ci\xf2 che la telecamera ha SENTITO. Il suo soggetto non contiene alcun rilevamento, quindi questa condizione non potr\xe0 mai corrispondere \u2014 indica invece i suoni nella condizione Suono.",classesExclude:"Una regola audio scatta su ci\xf2 che la telecamera ha SENTITO. Il suo soggetto non contiene alcun rilevamento, quindi qui non c'\xe8 nulla da escludere \u2014 indica invece i suoni nella condizione Suono.",minConfidence:"La prova di una finestra audio \xe8 una percentuale di campioni, non il punteggio di un rilevatore: una soglia di affidabilit\xe0 non potr\xe0 mai essere soddisfatta.",zones:"Un suono non ha una posizione nell'inquadratura, quindi una zona non potr\xe0 mai corrispondere.",zonesExclude:"Un suono non ha una posizione nell'inquadratura, quindi una zona non potr\xe0 mai escluderlo.",customZones:"Un suono non ha una posizione nell'inquadratura, quindi un'area disegnata non potr\xe0 mai corrispondere.",crossing:"Un suono non ha una posizione nell'inquadratura, quindi non potr\xe0 mai attraversare il bordo di una zona.",labelEquals:"Una regola audio scatta su ci\xf2 che la telecamera ha SENTITO. Il suo soggetto non contiene alcun rilevamento e quindi nessuna etichetta \u2014 indica invece i suoni nella condizione Suono.",identities:"Una regola audio scatta su ci\xf2 che la telecamera ha SENTITO. Il suo soggetto non contiene alcun rilevamento, quindi non c'\xe8 alcun volto da riconoscere.",identitiesExclude:"Una regola audio scatta su ci\xf2 che la telecamera ha SENTITO. Il suo soggetto non contiene alcun rilevamento, quindi non c'\xe8 alcun volto da escludere.",plates:"Una regola audio scatta su ci\xf2 che la telecamera ha SENTITO. Il suo soggetto non contiene alcun rilevamento, quindi non c'\xe8 alcuna targa da leggere.",source:"Una finestra audio confermata \xe8 sempre marcata come soggetto audio, quindi qualsiasi altra origine non potr\xe0 mai corrispondere."},sensor:{sensorTransition:"Solo un sensore che scatta e rientra (acqua, fumo, gas, CO, vibrazione, manomissione, movimento, contatto) pu\xf2 notificare su un solo fronte. Scegli solo tipi di sensore di questo genere, o la regola notificher\xe0 a ogni cambiamento."},detection:{audio:"Una regola di rilevamento scatta su ci\xf2 che la camera ha visto. I suoni sono una regola Suono a parte."}},ai:{sectionLabel:"Descrizione AI",enabledLabel:"Descrivi con l'AI",enabledHint:"Aggiunge a questa notifica una frase scritta da un modello di visione. Non trattiene mai la notifica: se il modello \xe8 freddo o irraggiungibile, l'avviso arriva senza la frase.",blurb:{occupancy:"Al modello vengono mostrati il fermo immagine e il conteggio che questa regola dichiara, e risponde se quel conteggio regge. La tua domanda guida ci\xf2 che guarda; la frase del verdetto la scrive l'hub, cos\xec un disaccordo lo dice sempre.","detection-immediate":"Al modello viene mostrato il fermo immagine preso nell'istante in cui la regola \xe8 scattata, e risponde alla tua domanda su di esso.","detection-track":"Al modello vengono mostrati l'inizio, il momento migliore e la fine del passaggio, e risponde alla tua domanda su cosa \xe8 successo."},profileLabel:"Modello",profileAuto:"Automatico",noProfiles:"Su questo hub non \xe8 configurato nessun modello con visione. Aggiungine uno dalle impostazioni admin prima di attivare questa sezione.",profilesUnavailable:"Questo hub non riesce a elencare i suoi modelli di visione. La sezione si salva lo stesso; l'hub sceglie il proprio modello predefinito.",languageLabel:"Lingua della risposta",languageAuto:"Predefinita dell'hub",language:{en:"Inglese",it:"Italiano"},maxWordsLabel:"Lunghezza",maxWordsHint:"Quante parole chiedere, all'incirca. \xc8 un'istruzione al modello, non un taglio: aspettati pi\xf9 o meno questa lunghezza, ogni tanto una parola in pi\xf9. Senza impostarla, i destinatari di questa regola danno {{words}}.",maxWordsVaries:"Quante parole chiedere, all'incirca. \xc8 un'istruzione al modello, non un taglio. I tuoi destinatari non concordano su un valore predefinito; il pi\xf9 stretto d\xe0 {{words}}, e senza impostarla ognuno usa il proprio.",promptLabel:"La tua domanda",occupancyContract:"La risposta resta un verdetto: l'hub chiede il conteggio, lo confronta con quello della regola e scrive da s\xe9 la conferma o la smentita. La tua domanda guida il modello, non pu\xf2 cambiare il formato della risposta."},unsaved:{title:"Scartare le modifiche?",body:"Questa regola ha modifiche non salvate.",keep:"Continua a modificare",discard:"Scarta"},unknownSection:"Questa sezione non esiste.",missing:"Questa regola non esiste pi\xf9. Potrebbe essere stata eliminata.",fixedTrigger:"Attivazione: {{trigger}} \u2014 una regola sensore scatta sull'evento del dispositivo stesso.",actions:{securityNote:"Queste azioni agiscono sui tuoi dispositivi quando la regola scatta, o quando qualcuno tocca uno dei suoi pulsanti. Controlla ogni passo prima di salvare.",problemsTitle:"Non si salva finch\xe9 non \xe8 corretto:",sequencesTitle:"Sequenze",sequencesEmpty:"Nessuna sequenza. Una sequenza \xe8 un elenco di passi eseguiti sui tuoi dispositivi.",addSequence:"Aggiungi sequenza",removeSequence:"Rimuovi sequenza",sequenceNameLabel:"Nome",sequenceNameBase:"sequenza",enabledLabel:"Esegui quando la regola scatta",enabledOn:"Parte a ogni corrispondenza (e dai suoi pulsanti).",enabledOff:"Parte solo quando si tocca un pulsante della notifica.",minDelayLabel:"Intervallo minimo",minDelayNone:"Nessuno",minDelayHint:"La sequenza parte al massimo una volta in questo tempo, qualunque sia il cooldown della regola.",stepTitle:"Passo {{n}}",addStep:"Aggiungi passo",removeStep:"Rimuovi passo",stepKind:{wait:"Attendi",cap:"Esegui"},waitSecondsLabel:"Secondi",deviceLabel:"Dispositivo",deviceNone:"Scegli un dispositivo",deviceChange:"Cambia",deviceSearchPlaceholder:"Cerca per nome, stanza o id",deviceMore:"Altri {{count}} \u2014 restringi la ricerca",deviceNoMatch:"Nessun dispositivo corrisponde.",deviceLoading:"Caricamento dispositivi\u2026",deviceUnavailable:"L'hub non ha restituito i dispositivi: l'elenco ora non si pu\xf2 mostrare.",capLabel:"Capability",capNone:"Scegli\u2026",capLoading:"Lettura delle capability del dispositivo\u2026",capUnavailable:"Non \xe8 stato possibile leggere le capability del dispositivo. Scrivi il nome della capability.",capEmpty:"Questo dispositivo non espone capability.",capPickDeviceFirst:"Scegli prima un dispositivo.",methodLabel:"Metodo",methodHint:"Il metodo della capability da chiamare, es. setState o trigger.",argsLabel:"Argomenti",argsHint:"Ogni argomento viene controllato al salvataggio. JSON accetta oggetti e liste.",addArg:"Aggiungi argomento",removeArg:"Rimuovi argomento",argKeyPlaceholder:"nome",argValuePlaceholder:"valore",argType:{string:"Testo",number:"Numero",boolean:"S\xec/no",json:"JSON"},buttonsTitle:"Pulsanti della notifica",buttonsEmpty:"Nessun pulsante.",buttonsHint:"Un pulsante sulla notifica che esegue una delle sequenze qui sopra.",addButton:"Aggiungi pulsante",removeButton:"Rimuovi pulsante",buttonLabelLabel:"Etichetta",buttonDefaultLabel:"Azione",buttonSequenceLabel:"Esegue",buttonSequenceNone:"Scegli una sequenza",buttonSequenceMissing:"{{name}} (mancante)",buttonIconLabel:"Icona",iconNone:"Nessuna",icon:{acknowledge:"Conferma",dismiss:"Ignora",silence:"Silenzia",snooze:"Posticipa",view:"Guarda",play:"Riproduci",open:"Apri",close:"Chiudi",lock:"Blocca",unlock:"Sblocca",arm:"Inserisci","arm-home":"Inserisci \u2014 in casa","arm-away":"Inserisci \u2014 fuori casa","arm-night":"Inserisci \u2014 notte",disarm:"Disinserisci",light:"Luce",alert:"Allarme",camera:"Telecamera"},destructiveLabel:"Stile distruttivo",destructiveHint:"Disegna il pulsante in rosso. Cambia come appare, non chi pu\xf2 premerlo."},readOnly:"Questa regola \xe8 gestita da un amministratore. Puoi leggerla qui, non modificarla.",problem:{title:"Non ancora salvata:",name:"la regola ha bisogno di un nome (Regola)",targets:"scegli almeno una destinazione (Regola)",actions:"correggi le azioni (Azioni)",summaryFamily:"solo le regole dispositivi e sistema possono essere un riepilogo pianificato \u2014 l\u2019allarme resta immediato (Condizioni)",summaryActions:"un riepilogo non corrisponde mai a un evento, quindi le sue azioni non verrebbero mai eseguite \u2014 rimuovile (Azioni)",summaryNoSendTime:"un riepilogo richiede almeno un orario di invio (Condizioni)",summaryDegenerateWindow:"un orario di invio non ha giorni, oppure la sua finestra inizia e finisce nello stesso minuto \u2014 non verrebbe mai inviato (Condizioni)",summaryActionsByAdmin:"questa regola ha azioni aggiunte da un amministratore; un riepilogo non le esegue mai, quindi un amministratore deve rimuoverle prima che possa diventare un riepilogo"},mediaBlurb:{sound:"Un suono non ha un fotogramma: l'immagine \xe8 una foto della telecamera scattata nel momento della corrispondenza \u2014 tutta la scena, mai un ritaglio. La GIF e la clip sono tagliate attorno allo stesso istante, dalla telecamera.",alarm:"Un allarme fatto scattare da una regola arriva con le immagini di QUELLA regola, unite in una sola notifica. Questa regola non ne aggiunge di sue."},enabledLabel:"Attiva",enabledHint:"Spenta, la regola resta com'\xe8 ma non avvisa nessuno finch\xe9 non viene riaccesa.",usersLabel:"Avvisa utenti",usersHint:"Persone che ricevono questa regola sui propri dispositivi, oltre alle destinazioni qui sopra. Serve almeno una destinazione o un utente.",usersLoading:"Caricamento utenti\u2026",usersUnavailable:"L'hub non ha restituito i suoi utenti \u2014 la lista ora non si pu\xf2 mostrare.",usersEmpty:"Nessun utente su questo hub.",throttleLabel:"Frequenza",cooldownLabel:"Pausa (s)",cooldownHint:"Dopo un avviso, la stessa regola tace per questi secondi. 0 = nessuna pausa.",groupIdleLabel:"Raggruppa raffiche (s)",groupIdleHint:"Gli eventi che arrivano entro questi secondi l'uno dall'altro diventano un solo avviso. 0 = spento, ogni evento avvisa da s\xe9.",snoozeButtonsLabel:"Pulsanti silenzia",snoozeDefaultsHint:"Non impostati \u2014 l'avviso offre i predefiniti dell'hub ({{defaults}}).",snoozeNoneHint:"Nessun pulsante silenzia: l'avviso non si pu\xf2 silenziare dalla schermata di blocco.",snoozeChosenHint:"Al massimo quattro. Ogni pulsante silenzia toglie spazio ai pulsanti azione della regola.",snoozeResetDefaults:"Torna ai predefiniti dell'hub",snoozeAllowGlobalLabel:"Chiunque pu\xf2 silenziare per tutti",snoozeAllowGlobalHint:"Di norma il silenzia \xe8 personale. Accesa: chi riceve questa regola pu\xf2 silenziarla per tutti, non solo per s\xe9.",confirm:{title:"Conferma AI",enabledLabel:"Conferma con l'AI prima di avvisare",enabledHint:"Un modello di visione guarda l'immagine in partenza; l'avviso esce solo se \xe8 d'accordo.",profileLabel:"Modello",profileDefault:"Predefinito del cluster",profilesUnavailable:"Questo hub non sa elencare i profili di visione \u2014 si usa il predefinito del cluster.",promptLabel:"Domanda",promptPlaceholder:"Vuota: ricavata dalla regola",expectLabel:"Il conteggio deve essere",expectNone:"Decide il modello (s\xec/no)",countLabel:"Conteggio",timeoutLabel:"Timeout (s)",onTimeoutLabel:"Se il modello non risponde",onTimeout:{fire:"Avvisa comunque",suppress:"Resta in silenzio"},onTimeoutHint:"Avvisa comunque \xe8 la scelta sicura: un modello lento o spento non inghiotte mai un avviso."},oneSnapshotOnlyHint:"Una regola su sensore allega automaticamente uno scatto della telecamera \u2014 non c'\xe8 un rilevamento da cui scegliere un ritaglio, una GIF o una clip.",linkedCamerasLabel:"Telecamere collegate",linkedCamerasHint:"Tutte le telecamere collegate vengono fotografate nell'istante in cui il sensore scatta; quelle offline o in sospensione restano fuori. Mosaico: un'immagine composta da tutte le telecamere collegate. Una per telecamera: un'immagine ciascuna dove il notificatore ne accetta pi\xf9 d'una, altrimenti la prima.",linkedCameras:{mosaic:"Mosaico",each:"Una per telecamera"},clipSpeedLabel:"Velocit\xe0 di riproduzione",clipSpeedValue:"{{speed}}\xd7",clipSpeedHint:"Una GIF o una clip di notifica si guarda di sfuggita: a 2\xd7 il passaggio intero dura la met\xe0. 1\xd7 \xe8 tempo reale.",timezone:{label:"Fuso orario",pickerLabel:"Fuso della programmazione",hub:"Fuso dell'hub",hint:"L'orologio su cui si leggono le fasce della programmazione. Non impostato = il fuso dell'hub.",placeholder:"es. Europe/Rome",invalid:"Fuso sconosciuto \u2014 non viene salvato finch\xe9 non \xe8 valido."},snoozeExemptHint:"Regola d'allarme: questa regola riguarda \u2014 o aziona \u2014 la centrale d'allarme, e nessun silenzia pu\xf2 zittirla. I pulsanti silenzia non vengono offerti.",snoozeMaxReached:"Al massimo {{max}} pulsanti silenzia \u2014 togline prima uno.",unlistedTargetsKept:"Destinazioni non presenti nel tuo elenco, mantenute su questa regola: {{count}} (di un altro utente, o eliminate nel frattempo). Salvando non vengono mai rimosse.",unlistedTargetsRemoved:"Destinazioni non pi\xf9 disponibili, rimosse al salvataggio: {{count}}.",saveBlocked:{rolePending:"Verifica del tuo account prima del salvataggio\u2026",roleUnknown:"Impossibile confermare il ruolo del tuo account, quindi questa regola non si pu\xf2 salvare in sicurezza. Torna indietro e riaprila.",targetsPending:"Caricamento delle tue destinazioni prima del salvataggio\u2026",targetsFailed:"Impossibile caricare le tue destinazioni, quindi questa regola non si pu\xf2 ancora salvare. Torna indietro e riaprila."},notConnected:"Non connesso all'hub. Riconnettiti e riprova.",hubTooOldToClear:"Questo hub \xe8 troppo vecchio per svuotare quel campo, quindi la modifica non \xe8 stata salvata. Aggiorna CamStack sull'hub, poi salva di nuovo.",loadError:"Impossibile caricare questa regola. Torna indietro e riaprila.",targetsUnavailable:"Impossibile caricare le tue destinazioni. Torna indietro e riapri.",sensorTransition:{both:"Quando scatta e quando rientra",raised:"Solo quando scatta",cleared:"Solo quando rientra",neverFires:"Questa regola appartiene all\u2019allarme, e una regola d\u2019allarme scatta solo quando un\u2019apertura si APRE. Impostata su \u201csolo quando rientra\u201d, non potr\xe0 mai scattare.",hint:{both:"Ogni cambiamento: acqua rilevata, e di nuovo asciutto.",raised:"Acqua rilevata, fumo, un contatto che si apre \u2014 mai il ritorno alla normalit\xe0.",cleared:"Di nuovo asciutto, fumo sparito, un contatto che si chiude \u2014 mai l\u2019allarme stesso."}},sensorsEmptyWidens:"Nessun sensore selezionato: la regola varr\xe0 per TUTTI i sensori.",sensorsUnavailable:"L'hub non ha restituito i suoi sensori \u2014 quelli selezionati sono elencati per id, cos\xec puoi ancora rimuoverli.",systemDelivery:{label:"Invio",instant:"Immediato",summary:"Riepilogo",instantHint:"Una notifica per ogni evento, nel momento in cui accade.",summaryHint:"Nessun invio per singolo evento. A ogni orario qui sotto arriva una sola notifica con ci\xf2 che \xe8 ancora vero per i tipi e i filtri di questa regola \u2014 batterie scariche, consumabili, dispositivi o stream offline, aggiornamenti disponibili. Se non c\u2019\xe8 nulla da segnalare, non viene inviato nulla.",customSchedule:"Pianificazione personalizzata: il riepilogo viene inviato quando FINISCE ciascuna finestra qui sotto.",addTime:"Aggiungi un orario di invio",removeTime:"Rimuovi orario di invio",sendAt:"Invia alle",bodyWarning:"Questo testo non contiene il riepilogo ({{token}} o una variabile di sezione) \u2014 l\u2019hub vi aggiunge {{token}} al momento dell\u2019invio.",splitRule:"Un solo messaggio",splitSection:"Uno per categoria",splitHint:"Uno per categoria invia una notifica separata per ogni categoria con qualcosa da segnalare \u2014 batterie, consumabili, dispositivi offline\u2026 Richiede un hub aggiornato; uno pi\xf9 vecchio invia un solo messaggio.",splitBodyWarning:"Inviato uno per categoria: questo testo non contiene {{token}}, quindi nelle notifiche delle altre categorie l\u2019hub aggiunge {{token}} (le righe di quella categoria)."},summaryNotKept:"Questo hub non supporta ancora i riepiloghi pianificati, quindi la regola \xe8 stata salvata come Immediata. Aggiorna il server, poi reimposta il riepilogo.",advancedConditionsTitle:"Rilevamento"},kind:{all:"Tutte",detection:"Rilevamento",sensor:"Sensore",sound:"Suono",occupancy:"Occupazione","device-events":"Dispositivi",system:"Sistema",alarm:"Allarme",mixed:"Da ricreare"},kindCreate:{all:"Nuova regola",detection:"Nuova regola di rilevamento",sensor:"Nuova regola sensore",sound:"Nuova regola suono",occupancy:"Nuova regola di occupazione","device-events":"Nuova regola dispositivi",system:"Nuova regola di sistema",alarm:"Nuova regola allarme",mixed:"Nuova regola"},kindEmpty:{all:"Nessuna regola. Creane una per sapere cosa vedono telecamere e sensori.",detection:"Nessuna regola di rilevamento. Creane una per sapere cosa vedono le telecamere.",sensor:"Nessuna regola sensore. Una regola sensore scatta su un evento di un dispositivo \u2014 una porta che si apre, un interruttore che cambia.",sound:"Nessuna regola suono. Una nuova si apre con una soglia di livello gi\xe0 impostata: basta indicare i suoni e le destinazioni.",occupancy:"Nessuna regola di occupazione. Una nuova si apre sulla condizione di occupazione \u2014 scegli prima la telecamera, poi la zona e il conteggio.","device-events":"Nessuna regola dispositivi. Una regola cos\xec ti avvisa quando un dispositivo o il suo stream cade o torna, una batteria \xe8 scarica, o un filtro, una spazzola o un panno vanno sostituiti \u2014 su qualsiasi dispositivo, non solo sulle videocamere.",system:"Nessuna regola di sistema. Una regola di sistema ti avvisa sull'impianto stesso \u2014 un nodo offline, un addon in crash continuo, un aggiornamento, un backup completato.",alarm:"Nessuna regola allarme. Una regola cos\xec ti avvisa di cosa fa la centrale d'allarme \u2014 inserimento, inserito, scattato, disinserito.",mixed:"Nessuna regola da ricreare."},mustRecreate:"Questa regola mescola eventi di pi\xf9 famiglie (dispositivi, sistema, allarme). Continua a funzionare ma non \xe8 pi\xf9 modificabile: crea una regola per famiglia, poi elimina questa.",mustRecreateByAdmin:"Questa regola mescola eventi di pi\xf9 famiglie (dispositivi, sistema, allarme). Continua a funzionare, ma \xe8 in sola lettura: un amministratore deve ricrearla.",kindPicker:{title:"Nuova regola",subtitle:"Cosa deve osservare questa regola?"},summary:{rule:{targets:"Invia a {{names}}",noTargets:"Nessuna destinazione"},devices:{all:"Tutte le camere",some:"Camere selezionate: {{count}}",except:"Tutte le camere tranne {{count}}",someExcept:"Camere selezionate: {{count}}, meno {{excluded}} escluse",sensorsAll:"Ogni sensore",sensorsSome:"Sensori selezionati: {{count}}",sensorsExcept:"Ogni sensore tranne {{count}}",sensorsSomeExcept:"Sensori selezionati: {{count}}, meno {{excluded}} esclusi"},conditions:{count:"Condizioni impostate: {{count}}",none:"Nessuna condizione \u2014 vale per tutto",classesExcept:"Tutte le classi tranne {{classes}}",classesExceptMore:"Tutte le classi tranne {{classes}} \xb7 condizioni impostate: {{count}}"},notification:{custom:"Messaggio personalizzato \xb7 priorit\xe0 {{priority}}",default:"Messaggio predefinito dell'hub \xb7 priorit\xe0 {{priority}}"},actions:{count:"Sequenze: {{sequences}} \xb7 pulsanti: {{buttons}}",invalid:"Problemi da correggere: {{count}}",none:"Nessuna azione"},advanced:{cooldown:"Pausa {{seconds}} s",wait:"Attende il riconoscimento",none:"Predefinite",cooldownWait:"Pausa {{seconds}} s \xb7 attende il riconoscimento"},deviceList:{all:"Tutti i dispositivi",only:"Solo questi dispositivi ({{count}})",except:"Tutti i dispositivi tranne {{count}}",excludedTitle:"Esclusi"}},ai:{defaultPrompt:{occupancy:"Il conteggio dichiarato \xe8 corretto?","detection-immediate":"Cosa c'\xe8 in questa immagine?","detection-track":"Cosa \xe8 successo durante questo passaggio?"}},actions:{args:{invalidJson:"JSON non valido",invalidNumber:"Non \xe8 un numero",invalidBoolean:"Deve essere true o false",emptyKey:"L'argomento ha bisogno di un nome",duplicateKey:"Due argomenti hanno lo stesso nome"},stepMissingDevice:"Un passo non ha un dispositivo",stepMissingMethod:"Un passo non ha capability o metodo",sequenceMissingName:"Una sequenza non ha nome",emptySequence:"Una sequenza non ha passi",duplicateSequence:"Due sequenze hanno lo stesso nome",buttonMissingLabel:"Un pulsante non ha etichetta",duplicateButton:"Due pulsanti hanno lo stesso id",buttonMissingSequence:"Un pulsante punta a una sequenza che non esiste",waitOutOfRange:"Un'attesa deve essere di 0\u2013300 secondi",tooManyButtons:"Al massimo 8 pulsanti",nameTooLong:"Il nome di una sequenza supera i 120 caratteri",labelTooLong:"L'etichetta di un pulsante supera i 40 caratteri",idTooLong:"L'id di un pulsante supera i 64 caratteri",minDelayOutOfRange:"Il ritardo minimo deve essere un numero intero di secondi, fino a 86400"},test:{title:"Prova questa regola",wouldFire:"Scatterebbe",failed:"Non corrisponde \u2014 la condizione \u201c{{condition}}\u201d l'ha respinta",notMatched:"Non corrisponde",firingCount:"{{firing}} di {{total}} record valutati farebbero scattare la regola",noRecords:"Nessun record negli ultimi 60 minuti \u2014 niente da valutare.",deviceEventUnsupported:"Le regole dei sensori non si possono simulare: non esiste un archivio di eventi sensore passati da rigiocare. La regola scatta comunque dal vivo alla pressione o al cambio corrispondente.",note:"{{condition}}: {{note}}",detail:"\xb7 {{note}}",unavailable:"Impossibile eseguire la prova: {{message}}",dryRun:{button:"Simula (ultimi 60 min)",hint:"Valuta la regola ATTUALE, non ancora salvata, sui record degli ultimi 60 minuti. Non viene inviato nulla.",incomplete:"Dai alla regola un nome e una destinazione prima di simularla.",more:"Mostrati {{shown}} di {{total}} record.",targetsFailed:"Impossibile caricare le tue destinazioni, quindi la simulazione non pu\xf2 costruire questa regola. Torna indietro e riaprila."},now:{button:"Prova ora",hint:"Costruisce l'evento di cui parla la regola, esegue la valutazione reale e INVIA la notifica a ogni destinazione, marcata [TEST]. Cooldown e silenziamento vengono ignorati; le azioni della regola non vengono mai eseguite. Prova la regola SALVATA: salva prima per provare una modifica.",confirmTitle:"Inviare una notifica di prova?",confirmBody:"Consegna davvero \u201c{{name}}\u201d a tutte le sue destinazioni, marcata [TEST].",confirm:"Invia prova",queued:"Corrisponde \u2014 notifiche in coda: {{count}}, destinazioni: {{targets}}. Marcate [TEST] nel testo.",noneQueued:"Corrisponde, ma nulla \xe8 stato messo in coda: ogni destinazione ha escluso questa regola, oppure non ne ha nessuna.",notCandidate:"Questa regola non era candidata per un evento {{trigger}} \u2014 controlla l'attivazione e che sia abilitata.",dropped:"Nulla \xe8 stato valutato ({{reason}}) \u2014 l'evento \xe8 stato scartato prima di consultare le regole.",still:{live:"Con un'istantanea dal vivo.",unavailable:"La telecamera non ha restituito un'istantanea, quindi parte solo testo.",unattachable:"Questo tipo di regola non porta immagini nemmeno in produzione."},title:"Prova la regola sul serio",summary:{queued:"Riepilogo creato ora \u2014 notifiche in coda: {{count}}, destinazioni: {{targets}}. Segnate [TEST] nel testo.",queuedPerCategory:"Riepilogo creato ora \u2014 notifiche in coda: {{count}}, una per categoria ({{sections}}), destinazioni: {{targets}}. Segnate [TEST] nel testo.",noneQueued:"Il riepilogo \xe8 stato creato, ma nulla \xe8 in coda: la regola non raggiunge alcuna destinazione (i suoi utenti non sono admin, o ogni destinazione ne \xe8 esclusa).",nothing:"Nulla da segnalare ora \u2014 non \xe8 stato inviato nulla, esattamente come non invierebbe nulla il riepilogo programmato.",sectionRead:"{{section}}: {{items}} aperti",sectionUnavailable:"{{section}}: non disponibile \u2014 lo stato non \xe8 leggibile"}}},ownTargetsUnavailable:"Impossibile caricare le tue destinazioni, quindi le tue esclusioni per questa regola non si possono mostrare.",offNotice:"Disattivata \u2014 non verr\xe0 eseguita.",enabledSwitch:"Abilitata",enableFailed:"Impossibile {{state}} la regola: {{error}}",enableStateOn:"attivare",enableStateOff:"disattivare",enableNotApplied:"l'hub ha mantenuto lo stato precedente",scope:{all:"Tutti",only:"Solo i selezionati",except:"Tutti tranne i selezionati",clearedOnSave:"Salvando in questa modalit\xe0, {{items}} viene tolto dalla regola.",legacyExclusions:"Questa regola esclude anche {{items}} \u2014 mantenuti al salvataggio.",removeExclusions:"Rimuovi esclusioni",everyDevice:"Tutte le camere \u2014 nessuna restrizione.",everyClass:"Tutte le classi \u2014 nessuna restrizione.",classNotListed:"{{name}} \u2014 non \xe8 nell\u2019elenco delle classi",classTitle:"Classi",classSearch:"Cerca classi",classNoMatches:"Nessuna classe corrisponde",classesEmptyWidens:"Nessuna classe rimasta: salvando, la regola vale per tutte le classi.",classesUnavailable:"Impossibile leggere l\u2019elenco delle classi.",everySensor:"Ogni sensore \u2014 nessuna restrizione.",everyZone:"Tutte le zone \u2014 nessuna restrizione.",zoneTitle:"Zone",zonesEmptyWidens:"Nessuna zona rimasta: salvando, la regola vale per tutte le zone.",zonesUnavailable:"Impossibile leggere l\u2019elenco delle zone.",zoneSearch:"Cerca zone",zoneNoMatches:"Nessuna zona corrisponde",zoneNotListed:"{{name}} \u2014 non pi\xf9 presente su queste camere",everyPerson:"Chiunque \u2014 nessuna restrizione.",anyKnownFace:"Qualsiasi volto conosciuto",noFaceExcluded:"Nessuno escluso",faceTitle:"Volti",facesUnavailable:"Impossibile leggere la galleria dei volti.",faceSearch:"Cerca persone",faceNoMatches:"Nessuna persona corrisponde",faceNotListed:"{{name}} \u2014 non \xe8 in galleria",everyLabel:"Qualsiasi etichetta \u2014 nessuna restrizione."},lastRun:{label:"Ultima esecuzione",notInDays_one:"Non nell'ultimo giorno",notInDays_other:"Non negli ultimi {{count}} giorni",notInHours_one:"Non nell'ultima ora",notInHours_other:"Non nelle ultime {{count}} ore",notInMinutes_one:"Non nell'ultimo minuto",notInMinutes_other:"Non negli ultimi {{count}} minuti",notInWindow:"Non nella finestra letta",never:"Nessun invio registrato",unavailable:"Impossibile leggere l'ultima esecuzione",status:{sent:"Inviata",pending:"In attesa",dead:"Fallita"}},history:{action:"Storico",title:"Invii di {{name}}",titleFallback:"Invii della regola",empty:"Nessun invio per questa regola",error:"Impossibile caricare lo storico",deviceById:"Dispositivo #{{id}}",noImage:"Nessuna immagine al momento",target:"Destinazione",adminOnly:"Solo un amministratore pu\xf2 vedere gli invii di una regola",verdictUnknown:"Impossibile verificare il tuo accesso agli invii di questa regola",stateSummary:"Riepilogo di stato"},summaryDelivery:{label:"Riepilogo \xb7 {{when}}",custom:"Riepilogo \xb7 pianificazione personalizzata",daily:"ogni giorno",weekdays:"feriali",weekends:"weekend"},snoozeSwitch:"Silenzia 30 min",snoozeFailed:"Impossibile cambiare il silenziamento della regola: {{error}}"},targets:{add:"Aggiungi destinazione",empty:"Nessuna destinazione. Aggiungine una per ricevere notifiche.",loadError:"Impossibile caricare le destinazioni. Riprova.",pickKind:"Scegli un tipo di notifica",noKinds:"Nessun tipo di notifica disponibile.",kindUnavailable:"non disponibile",test:"Invia test",testing:"Invio\u2026",testOk:"Test consegnato",testFail:"Test fallito",edit:"Modifica",delete:"Elimina",cancel:"Annulla",save:"Salva modifiche",create:"Crea destinazione",addTitle:"Aggiungi destinazione {{kind}}",editTitle:"Modifica {{name}}",deleteConfirmTitle:"Elimina destinazione",deleteConfirmMessage:"Eliminare \"{{name}}\"? L'operazione non \xe8 reversibile.",form:{details:"Dettagli",config:"Configurazione",nameLabel:"Nome",nameHint:"Un'etichetta per riconoscere questa destinazione.",secretHint:"Lascia vuoto per mantenere il valore salvato."}},snooze:{title:"Silenzia",intro:"Silenzia TE, non tutta la casa \u2014 a meno che una regola non dica il contrario. Finisce da sola.",activeNone:"Non c'\xe8 niente in silenzio.",active:"In silenzio ora",past:"Finiti da poco",openTitle:"Silenzia per",scopeLabel:"Cosa silenziare",everything:"Tutto",aRule:"Una regola",aCamera:"Una telecamera",chooseRule:"Scegli una regola",chooseCamera:"Scegli una telecamera",camerasLoading:"Sto caricando le telecamere\u2026",noCameras:"Nessuna telecamera da silenziare.",globalLabel:"Silenzia per tutti",globalHelp:"Anche le altre persone smettono di ricevere le notifiche.",globalNotAllowed:"Questa regola si pu\xf2 silenziare solo per te.",summaryLabel:"Dimmi cosa ho perso",summaryHelp:"Alla fine della finestra arriva un riepilogo.",endNow:"Termina ora",endsIn:"finisce tra {{label}}",everyone:"per tutti",loadError:"Non riesco a caricare i silenzi.",createError:"Non riesco ad avviare il silenzio.",classesTitle:"Solo questi",classesHelp:"Se non tocchi nulla la finestra copre tutto. Scegli delle classi per silenziare solo quelle \u2014 il resto continua ad arrivarti.",everyClass:"Tutto",durations:{m10:"10 min",m30:"30 min",h1:"1 ora"},scope:{rule:"Una regola",device:"Una telecamera",all:"Tutto"},remaining:{ended:"finito",minutes:"{{minutes}} min",hours:"{{hours}}h",hoursMinutes:"{{hours}}h {{minutes}}m"},viewOnly:"Il tuo account pu\xf2 vedere le pause ma non aprirne una."},timelapse:{createTitle:"Nuovo timelapse",editTitle:"Modifica \xab{{name}}\xbb",namePlaceholder:"Vialetto di notte",enabledLabel:"Attivo",camerasHint:"Un video per telecamera. Una telecamera che non registra non pu\xf2 produrre un timelapse \u2014 l\u2019hub rifiuta il salvataggio e indica quale.",windowLabel:"Finestra",windowHint:"Le ore coperte. La finestra \xe8 la regola: inizia a raccogliere quando si apre e invia il video quando si chiude.",samplingLabel:"Campionamento",cadenceLabel:"Un fotogramma ogni (s)",framerateLabel:"Riproduzione (fps)",previewHint:"Cosa mostra la notifica prima che tu apra il video.",preview:{image:"Immagine",gif:"GIF"},problem:{devices:"Scegli almeno una telecamera.",schedule:"Aggiungi almeno una finestra \u2014 un timelapse senza ore non parte mai.",denseCadence:"Il ritmo vicino ai rilevamenti deve essere almeno 0,1 s e pi\xf9 breve della cadenza sopra.",minDwell:"La durata minima deve essere tra 0 e 60 s.",template:"Il titolo pu\xf2 avere al massimo 500 caratteri, il testo 2000.",previewText:"La didascalia pu\xf2 avere al massimo 200 caratteri.",reportClasses:"Al massimo 20 classi, ognuna di al massimo 40 caratteri."},denseCadenceLabel:"Vicino ai rilevamenti, un fotogramma ogni (s)",denseCadenceHint:"Attorno a un rilevamento il video campiona pi\xf9 fitto, cos\xec una persona che passa non si riduce a due fotogrammi. Vuoto significa automatico: un trentesimo della cadenza sopra, almeno 1 s. Se lo imposti, deve essere pi\xf9 breve della cadenza sopra.",minDwellLabel:"Durata minima per rilevamento (s)",minDwellHint:"Il minimo di video che ogni rilevamento ottiene; l\u2019hub campiona pi\xf9 fitto per raggiungerlo. Vuoto significa nessun minimo.",messageLabel:"Messaggio",messageHint:"Titolo e testo della notifica. Se li lasci vuoti, li scrive l\u2019hub.",previewTextLabel:"Didascalia dell\u2019anteprima",previewTextHint:"Scritta sopra il fotogramma di anteprima. Vuota significa la didascalia predefinita: \xabTimelapse\xbb e il nome della telecamera.",reportClassesLabel:"Classi conteggiate",reportClassesHint:"Quali rilevamenti conta la notifica. Nessuna selezionata significa tutte le classi presenti nella finestra.",loadError:"Impossibile caricare le regole timelapse.",previewTextNoneHint:"Questa regola \xe8 impostata per non mostrare alcuna didascalia (scelta nell\u2019amministrazione web). Lascia il campo vuoto per mantenerla cos\xec; scrivi una didascalia per aggiungerla.",captionPreviewLabel:"Anteprima della didascalia",editorTitle:"Timelapse"},summary:{createTitle:"Nuovo riepilogo",editTitle:"Modifica \xab{{name}}\xbb",namePlaceholder:"Riepilogo della notte",enabledLabel:"Attivo",camerasHint:"Una sola immagine per tutte \u2014 lo scatto migliore di tutto ci\xf2 che \xe8 passato.",windowLabel:"Finestra",window:{motion:"Al movimento",schedule:"A orario"},motionHint:"Si apre al primo movimento su una qualsiasi di queste telecamere e resta aperta finch\xe9 ne arriva altro.",scheduleHint:"Orari fissi. Il riepilogo viene inviato alla chiusura della finestra.",quietLabel:"Chiudi dopo quiete (s)",maxWindowLabel:"Mai pi\xf9 lunga di (s)",hubTooOld:"Su questo hub solo un amministratore pu\xf2 creare riepiloghi. Qui puoi vederli; aggiorna l\u2019hub per modificarli dall\u2019app.",problem:{devices:"Scegli almeno una telecamera.",window:"Controlla la finestra \u2014 un riepilogo a orario richiede delle ore e \xabmai pi\xf9 lunga di\xbb deve superare il periodo di quiete.",barrier:"L'attesa delle tracce \xe8 tra 0 e 3600 secondi.",budget:"L'AI non pu\xf2 guardare pi\xf9 immagini di quante ne contenga il mosaico (1\u201324 caselle, 1\u20138 per l'AI).",filters:"Controlla cosa entra \u2014 nessuna classe pu\xf2 essere inclusa ed esclusa per tutte, e l'importanza va da 0 a 1.",caption:"La didascalia \xe8 di al massimo 200 caratteri.",template:"Il titolo \xe8 di al massimo 500 caratteri e il testo di al massimo 2000.",ai:"Controlla l'AI \u2014 domanda fino a 2000 caratteri, immagine 64\u20132048 px, tempo 10\u2013600 s."},editorTitle:"Riepilogo",loadError:"Impossibile caricare questo riepilogo. Controlla la connessione e riprova.",section:{content:"Cosa entra",mosaic:"Mosaico",ai:"AI",delivery:"Consegna"},barrierLabel:"Attendi la chiusura delle tracce (s)",barrierHint:"Lo scatto migliore di un soggetto si salva quando la sua traccia finisce. Il riepilogo attende fino a questo tempo, cos\xec anche chi si muove ancora ha un'immagine.",classesLabel:"Classi",classesHint:"Vuoto = tutte le classi.",classesExcludeLabel:"Classi escluse",classesExcludeHint:"Mai nel riepilogo, anche se incluse sopra.",zonesLabel:"Zone",zonesHint:"Le zone valgono per telecamera: scegliere una zona su una telecamera non silenzia le altre.",minImportanceLabel:"Importanza minima",minImportanceHint:"Un punteggio da 0 a 1. Vuoto = nessun minimo.",minDwellLabel:"Permanenza minima (s)",minDwellHint:"Vuoto = nessun minimo.",includeStationaryLabel:"Includi gli oggetti fermi",includeStationaryHint:"Spento di default: un riepilogo racconta i passaggi, e un'auto parcheggiata prenderebbe tutte le caselle.",rankLabel:"Se sono troppi, tieni",rank:{importance:"I pi\xf9 importanti",recency:"I pi\xf9 recenti",dwell:"La permanenza pi\xf9 lunga"},maxTilesLabel:"Immagini nel mosaico",captionsLabel:"Testo sul mosaico",captions:{none:"Nessuno",tiles:"Sotto ogni casella",all:"Caselle e didascalia"},captionsHint:"Il testo resta impresso nell'immagine per sempre. \xabNessuno\xbb la lascia solo immagini.",captionTextLabel:"Didascalia",captionTextHint:"Scritta in alto solo con \xabCaselle e didascalia\xbb. Vuota = la didascalia predefinita (il nome della regola e gli orari della finestra).",captionTextNoneHint:"Questo riepilogo \xe8 impostato senza alcuna didascalia. Scrivine una per aggiungerla; lascia vuoto per non averne.",aiEnabledLabel:"Descrivi con l'AI",aiEnabledHint:"Un modello di visione guarda insieme le immagini della finestra e scrive nel messaggio cosa \xe8 successo.",aiProfileLabel:"Modello",aiProfileDefault:"Predefinito dell'hub",aiProfilesUnavailable:"L'hub non \xe8 riuscito a elencare i modelli AI. Quello gi\xe0 impostato resta.",aiPromptLabel:"Domanda",aiPromptPlaceholder:"La domanda standard",aiLanguageLabel:"Lingua della risposta",aiLanguage:{default:"Predefinita del modello",en:"Inglese",it:"Italiano"},aiMaxImagePxLabel:"Dimensione immagine per il modello (px)",aiMaxImagePxHint:"Vuoto = il predefinito dell'hub.",aiTimeoutLabel:"Tempo massimo (s)",aiTimeoutHint:"Vuoto = il predefinito dell'hub.",aiOnFailureLabel:"Se l'AI fallisce",aiOnFailure:{"deliver-without-text":"Invia senza il testo",skip:"Trattieni il riepilogo"},aiSkipWarning:"Con \xabTrattieni il riepilogo\xbb, una finestra la cui analisi AI fallisce non viene consegnata affatto \u2014 n\xe9 mosaico n\xe9 conteggi \u2014 e non torna pi\xf9.",maxAiImagesLabel:"Immagini guardate dall'AI",maxAiImagesHint:"Al massimo quante ne contiene il mosaico.",deliverEmptyLabel:"Invia un riepilogo vuoto",deliverEmptyHint:"Spento: una finestra in cui non \xe8 entrato nulla non invia niente.",messageHint:"Vuoto = titolo e testo standard."},family:{cameras_one:"{{count}} telecamera",cameras_other:"{{count}} telecamere",never:"Non ha ancora inviato nulla.",last:"Ultimo invio {{when}}.",off:"Disattivato \u2014 non verr\xe0 eseguito.",readOnly:"Creato da un amministratore. Qui puoi vederlo ma non modificarlo."},templateVars:{camera:"Telecamera",class:"Classe rilevata",label:"Nome o targa",subject:"Frase del soggetto",confidence:"Affidabilit\xe0",count:"Conteggio",detectionSummary:"Riepilogo rilevamenti",zones:"Zone",zone:"Zona",inZones:"Frammento \"in <zone>\"",scope:"Ambito occupazione",time:"Ora",rule:"Nome regola",from:"Inizio finestra",to:"Fine finestra",capacity:"Capienza",op:"Occupato / libero",sounds:"Suoni rilevati",hitPercent:"Percentuale della finestra",db:"Livello di picco (dBFS)",eventType:"Tipo di evento",ai:"Frase AI",eventKind:"Tipo di evento di sistema",deviceName:"Dispositivo",deviceId:"ID dispositivo",percentage:"Percentuale",item:"Materiale di consumo",tank:"Serbatoio",profile:"Profilo stream",node:"Nodo",nodeId:"ID nodo",devices:"Dispositivi",addons:"Addon",minutes:"Minuti",package:"Pacchetto",packageName:"Nome pacchetto",nodes:"Nodi",currentVersion:"Versione attuale",latestVersion:"Ultima versione",list:"Pacchetti aggiornati",fromVersion:"Dalla versione",toVersion:"Alla versione",destinationsOk:"Destinazioni riuscite",destinationsTotal:"Destinazioni",destinationsFailed:"Destinazioni fallite",sizeMB:"Dimensione (MB)",backupId:"ID backup",title:"Titolo esportazione",exportId:"ID esportazione",bytes:"Dimensione esportazione (byte)",mode:"Modalit\xe0 allarme",seconds:"Secondi",rules:"Regole attive",names:"Nomi dispositivi",skippedNames:"Dispositivi saltati",bypassedNames:"Sensori esclusi",coverage:"Copertura %",events:"Eventi",detections:"Rilevamenti",count_person:"Conteggio di una classe",cameras:"Telecamere",matched:"Eventi corrispondenti",shown:"Eventi mostrati",total:"Eventi totali",summaryText:"Riepilogo: tutte le sezioni",summaryCount:"Riepilogo: elementi segnalati",summarySection:"Riepilogo: questa categoria",summaryDevices:"Riepilogo: dispositivi offline / spenti",summaryStreams:"Riepilogo: stream offline",summaryBattery:"Riepilogo: batterie scariche",summaryConsumables:"Riepilogo: consumabili",summaryTanks:"Riepilogo: serbatoi",summaryDetection:"Riepilogo: telecamere senza rilevamenti",summaryNodes:"Riepilogo: nodi",summaryAddons:"Riepilogo: addon",summaryUpdates:"Riepilogo: aggiornamenti server e container"},templateField:{groups:{subject:"Soggetto",place:"Luogo",time:"Orario",rule:"Regola",occupancy:"Occupazione",sound:"Suono",sensor:"Sensore",system:"Sistema",digest:"Riepilogo",ai:"AI"},noVars:"Nessuna variabile per questo campo.",unknown:"Questi segnaposto saranno vuoti in questa notifica: {{names}}",preview:"Anteprima (valori di esempio)"},deviceType:{camera:"Telecamera",hub:"Hub",light:"Luce",siren:"Sirena",switch:"Interruttore",sensor:"Sensore",thermostat:"Termostato",climate:"Clima",button:"Pulsante","event-emitter":"Emettitore di eventi",update:"Aggiornamento",generic:"Generico",notifier:"Notificatore",script:"Script",automation:"Automazione",lock:"Serratura",cover:"Tapparella",valve:"Valvola",humidifier:"Umidificatore","water-heater":"Scaldabagno",fan:"Ventilatore","media-player":"Lettore multimediale","alarm-panel":"Centrale d'allarme",control:"Controllo",presence:"Presenza",weather:"Meteo",vacuum:"Aspirapolvere","lawn-mower":"Tosaerba",container:"Contenitore",image:"Immagine","pet-feeder":"Distributore di cibo per animali"},prune:{device:"Disattivata il {{date}}: il suo ultimo dispositivo (#{{id}}) \xe8 stato eliminato.",target:"Disattivata il {{date}}: la sua ultima destinazione ({{id}}) \xe8 stata eliminata."},alarm:{title:"Allarme",navLabel:"Allarme",navHint:"Pannello, modalit\xe0, destinatari e ritardi",entryHint:"Tempo tra un'intrusione e lo scatto dell'allarme \u2014 abbastanza per raggiungere il tastierino.",notAdmin:"Solo un amministratore pu\xf2 configurare l'allarme. L'hub non consente a questo account di modificarlo.",verdictUnknown:"Impossibile confermare il tuo ruolo con l'hub, quindi le impostazioni dell'allarme non sono mostrate.",retry:"Riprova",loadFailed:"Impossibile caricare le impostazioni dell'allarme: {{error}}",noPanel:"Questa installazione non ha un pannello d'allarme. Lo crea il Centro notifiche sull'hub \u2014 se questo \xe8 l'hub, la creazione \xe8 fallita e il log del server spiega perch\xe9.",sections:{state:"Stato",modes:"Modalit\xe0",recipients:"Destinatari",delays:"Ritardi predefiniti"},stateWord:{disarmed:"Disattivato",armed:"Attivo",arming:"In attivazione",disarming:"In disattivazione",pending:"Ritardo d'ingresso",triggered:"Scattato"},stateWithMode:"{{state}} \u2014 {{mode}}",liveUnknown:"L'hub non ha riportato lo stato del pannello.",exclusionOpen:"{{name}} \u2014 ignorato finch\xe9 non si chiude",exclusionClosed:"{{name}} \u2014 chiuso, di nuovo sorvegliato alla prossima apertura",modeDelays:{title:"Ritardi per {{mode}}",inherited:"Predefinito ({{seconds}} s)",useDefault:"Usa il predefinito"},modesHint:"Cosa attiva ogni modalit\xe0 deriva dalle regole abilitate legate a essa. Qui non si salva nulla \u2014 cambia una regola e questo cambia con lei.",coverageNone:"Non attiva nulla \u2014 nessuna regola abilitata \xe8 legata a questa modalit\xe0.",coverageAll_one:"Tutti i dispositivi \u2014 {{count}} regola senza limiti di dispositivo.",coverageAll_other:"Tutti i dispositivi \u2014 {{count}} regole senza limiti di dispositivo.",coverageRules_one:"{{count}} regola, nessuna restrizione di dispositivo.",coverageRules_other:"{{count}} regole, nessuna restrizione di dispositivo.",coverageDevices:"Copre: {{devices}}",skipped:"Nominati ma non attivati: {{devices}}",skipReason:{muted:"notifiche silenziate","detection-off":"rilevamento spento",offline:"offline"},openingsUnknown:"Dispositivi aperti: non riportati dall'hub.",openingsNone:"Niente di ci\xf2 che questa modalit\xe0 copre \xe8 aperto ora.",openingsCount:"Aperti ora: {{blocking}} bloccanti, {{nonBlocking}} non bloccanti, {{unknown}} illeggibili",openingBlocking:"{{name}} ({{state}}) \u2014 impedisce l'attivazione",openingNonBlocking:"{{name}} ({{state}}) \u2014 non bloccante",openingUnreadable:"{{name}} \u2014 stato illeggibile, non blocca",nonBlockingEmpty:"In casa non c'\xe8 nessuna apertura \u2014 nessun contatto, tapparella o serratura \u2014 da elencare qui.",openingsChecking:"Verifico quali dispositivi sono aperture\u2026",openingsCheckFailed:"Non \xe8 stato possibile verificare quali dispositivi sono aperture \u2014 sono mostrate solo quelle lette ora dall'hub e quelle gi\xe0 elencate.",recipientsHint:"Ogni cambio dell'allarme viene inviato qui: attivazione, attivo, intrusione, sirena, riattivato, disattivato, rifiutato, sensori esclusi.",recipientsNone:"Nessun destinatario selezionato \u2014 i cambi dell'allarme non vengono inviati a nessuno.",targetsFailed:"Impossibile caricare le destinazioni delle notifiche.",targetsEmpty:"Nessuna destinazione di notifica configurata \u2014 non si pu\xf2 inviare nulla.",targetDisabled:"Disattivata",targetUnlisted:"Destinazione {{id}} \u2014 non pi\xf9 disponibile",exitDelay:"Ritardo di uscita",exitHint:"Tempo tra l'attivazione e l'entrata in vigore della modalit\xe0 \u2014 abbastanza per uscire.",exitZero:"si attiva subito",entryDelay:"Ritardo d'ingresso",entryZero:"scatta subito",triggeredFor:"Scattato per",triggeredHint:"Quanto resta scattato l'allarme prima di riattivarsi da solo.",triggeredZero:"fino alla disattivazione",seconds:"{{seconds}} s",minutes:"{{minutes}} min",minutesSeconds:"{{minutes}} min {{seconds}} s",delayRange:"0\u2013{{max}} s",unsaved:"Modifiche non salvate",save:"Salva",discard:"Annulla",saveFailed:"Impossibile salvare: {{error}}",changedElsewhere:"La configurazione \xe8 cambiata altrove \u2014 le tue modifiche sono state applicate sopra.",saveNotLanded:"L'hub ha risposto ma non ha mantenuto ogni modifica \u2014 probabilmente \xe8 troppo vecchio per questa impostazione. Le tue modifiche restano.",recipientsLimit:"Al massimo {{max}} destinatari \u2014 togline uno per aggiungerne un altro.",leave:{title:"Scartare le modifiche all'allarme?",body:"Le impostazioni dell'allarme hanno modifiche non salvate.",keep:"Continua a modificare",discard:"Scarta"},refreshFailed:"Impossibile rileggere le impostazioni dell'allarme prima di salvare: {{error}}. Non \xe8 stato salvato nulla; le tue modifiche restano.",coverageAllExcept_one:"Tutti i dispositivi tranne {{count}}: {{devices}}",coverageAllExcept_other:"Tutti i dispositivi tranne {{count}}: {{devices}}",table:{title:"Blocca l'inserimento",hint:"Interruttore acceso: {{mode}} viene rifiutata finch\xe9 questa apertura \xe8 aperta. Spegnilo per lasciarla aperta. Sono elencati solo i sensori che una regola di questa modalit\xe0 nomina; il controllo all'inserimento non ne legge altri.",switchLabel:"Blocca l'inserimento: {{name}}",searchPlaceholder:"Cerca per nome, stanza o tipo",none:"Nessun sensore \xe8 coperto da una regola di questa modalit\xe0.",noMatches:"Nessun dispositivo corrisponde.",hidden_one:"{{count}} riga nascosta dai filtri",hidden_other:"{{count}} righe nascoste dai filtri",showMore:"Mostra altri {{count}} ({{left}} rimasti)",sensorsFailed:"Impossibile leggere lo stato dei sensori.",state:{checking:"Verifico\u2026",hubTooOld:"Questo hub non riporta lo stato dei sensori \u2014 aggiorna l'hub",readFailed:"Stato sconosciuto \u2014 {{error}}",offline:"{{word}} \u2014 offline, ultimo stato noto",unknownNotAnswered:"Sconosciuto (nessuna risposta)",unknownReadFailed:"Sconosciuto (lettura non riuscita)",unknownWord:"Sconosciuto (nessuno stato riportato)",notOpening:"Non \xe8 un'apertura \u2014 non blocca mai",removed:"Rimosso"},coverage:{armChecked:"S\xec",armCheckedSkipped:"S\xec \u2014 blocca l'inserimento (notifiche saltate: {{reason}})",unscoped:"Coperto da una regola per tutti i dispositivi \u2014 il controllo all'inserimento non lo legge; non blocca mai questa modalit\xe0",notCovered:"No \u2014 non blocca mai questa modalit\xe0",listedUncovered:"Non controllato da nessuna regola di questa modalit\xe0 \u2014 in elenco come non bloccante; accendilo per togliere la voce"},notice:{refused:"Salvataggio di {{name}} ({{mode}}) in corso \u2014 attendi che finisca.",notLanded:"L'hub non ha applicato questa modifica \u2014 un altro editor potrebbe averla cambiata, oppure l'hub va aggiornato ({{name}}, {{mode}}).",failed:"Impossibile modificare {{name}} per {{mode}}: {{error}}"}}},devicePicker:{title:"Scegli dispositivi",add:"Aggiungi",edit:"Modifica",done:"Fatto",search:"Cerca per nome, stanza o tipo",shown:"{{shown}} di {{total}} \xb7 {{selected}} selezionati",selectAll:"Tutti",clear:"Nessuno",noType:"Senza tipo",noRoom:"Senza stanza",noMatches:"Nessun dispositivo corrisponde.",everyDevice:"Tutti i dispositivi \u2014 nessuna restrizione",none:"Nessuno selezionato",remove:"Rimuovi {{name}}",groupBy:{label:"Raggruppa per",zone:"Zona",location:"Luogo",none:"Nessuno",noZone:"Senza zona",noLocation:"Senza luogo",zonesPending:"Caricamento zone \u2014 raggruppati per luogo",zonesUnavailable:"Zone non disponibili \u2014 raggruppati per luogo"},filter:{type:"Tipo",zone:"Zona",location:"Luogo",all:"Tutti",selected:"{{count}} selezionati",noType:"Nessun tipo",noLocation:"Senza luogo",noZone:"Senza zona",zonesLoading:"Caricamento zone\u2026",zonesUnavailable:"Zone non disponibili",zonePaused:"Filtro zona in pausa \u2014 zone non caricate"},resetFilters:"Azzera filtri",hiddenSelected:"{{count}} selezionati nascosti dai filtri",nodeTitle:"Scegli i nodi",packageTitle:"Scegli i pacchetti",everyNode:"Tutti i nodi \u2014 nessuna restrizione",everyPackage:"Tutti i pacchetti \u2014 nessuna restrizione",nodeRemoved:"Nodo {{id}} \u2014 rimosso",packageNotInstalled:"{{name}} \u2014 non installato",nodesEmptyWidens:"Nessun nodo selezionato: la regola si applicher\xe0 a TUTTI i nodi.",packagesEmptyWidens:"Nessun pacchetto selezionato: la regola si applicher\xe0 a TUTTI i pacchetti.",nodesUnavailable:"L'hub non ha restituito i suoi nodi \u2014 quelli selezionati sono elencati per id, cos\xec puoi comunque rimuoverli.",packagesUnavailable:"L'hub non ha restituito i suoi pacchetti \u2014 quelli selezionati sono elencati per nome, cos\xec puoi comunque rimuoverli.",nodeDirectoryIncomplete:"Non \xe8 stato possibile leggere lo storico dei nodi \u2014 i nodi offline potrebbero mancare da questo elenco.",nodeGroup:{hub:"Hub",agent:"Agent",other:"Nodi",offline:"{{role}} \xb7 offline"},packageGroup:{server:"Server",framework:"Framework",wrapper:"Wrapper",addon:"Addon",other:"Pacchetti"},nodeSearch:"Cerca per nome o id del nodo",packageSearch:"Cerca per nome del pacchetto",nodeNoMatches:"Nessun nodo corrisponde.",packageNoMatches:"Nessun pacchetto corrisponde."}},login:{loginFailed:"Accesso fallito",verifyFailed:"Verifica fallita",serverUrl:"Server URL",username:"Username",password:"Password",showPassword:"Mostra password",hidePassword:"Nascondi password",signIn:"Accedi",signingIn:"Accesso\u2026",twoFactor:"Autenticazione a due fattori",totpHint:"Inserisci il codice a 6 cifre dall'app di autenticazione per accedere come ",verificationCode:"Codice di verifica",verifyAndSignIn:"Verifica e accedi",verifying:"Verifica\u2026",back:"Indietro",or:"oppure",signInWithCamStack:"Accedi con CamStack",hubSignInHint:"Apre la pagina di accesso del tuo hub e collega questa app senza digitare qui la password.",handoffFailed:"Accesso con CamStack non riuscito \u2014 riprova oppure usa nome utente e password",invalidServerUrl:"Inserisci prima un URL server valido (https://\u2026)"},live:{webUnsupported:"La vista live non \xe8 ancora disponibile nella versione web.",connecting:"Connessione allo stream live\u2026",error:"Impossibile caricare lo stream live.",retry:"Riprova",noConnection:"Nessuna connessione al server",failed:"Connessione fallita",errorPageLoad:"Caricamento della pagina del player fallito."},ptz:{title:"PTZ",notAvailable:"I controlli PTZ non sono disponibili per questa telecamera.",zoom:"Zoom",home:"Posizione iniziale",presets:"Preset",noPresets:"Nessun preset salvato.",noHome:"Nessuna posizione iniziale impostata per questa telecamera \u2014 impostala nelle impostazioni PTZ dell'interfaccia di amministrazione."},navigation:{title:"Navigazione",notAvailable:"I comandi di navigazione non sono disponibili per questo dispositivo.",drive:"Guida",forward:"Avanti",left:"Gira a sinistra",right:"Gira a destra",turnAround:"Inverti",stop:"Stop",actions:"Azioni",sounds:"Suoni",light:"Luce",lightOn:"Luce accesa",lightOff:"Luce spenta",auto:"Auto",manual:"Manuale",levelUp:"Pi\xf9 luminosa",levelDown:"Meno luminosa",following:"sta seguendo",joystick:"Joystick di guida",joystickHint:"Trascina per guidare il robot; rilascia per fermarlo.",followMe:"Seguimi",returnToDock:"Torna alla base",moreControls:"Altri comandi",mode:{idle:"Fermo",cleaning:"Pulizia",spot:"Pulizia puntuale",following:"Sta seguendo",goto:"Verso il punto",returning:"Rientro alla base",paused:"In pausa",unknown:"Sconosciuto"}},timeline:{activityTitle:"Attivit\xe0",last24h:"Ultime 24h",loading:"Caricamento attivit\xe0\u2026",noActivity:"Nessuna attivit\xe0 nelle ultime 24 ore.",legendRecording:"Registrato",legendMotion:"Movimento",legendAudio:"Audio",showTimeline:"Mostra timeline",hideTimeline:"Nascondi timeline",faultStream:"Lo stream video non \xe8 disponibile.",clipShortTitle:"La telecamera ha interrotto questa clip in anticipo.",clipEmptyTitle:"La telecamera non ha inviato alcun video per questa clip.",faultRecordings:"Non \xe8 stato possibile caricare le registrazioni di questo giorno.",faultEvents:"Non \xe8 stato possibile caricare gli eventi di questo giorno.",faultDismiss:"Ignora",loadRetry:"Riprova",loadRetrying:"Riprovo\u2026",moreHistory:"C'\xe8 cronologia pi\xf9 vecchia non ancora mostrata.",scopeUnreadable_one:"Una videocamera di questa vista non \xe8 stata letta: qui mancano i suoi eventi e le sue registrazioni.",scopeUnreadable_other:"{{count}} videocamere di questa vista non sono state lette: qui mancano i loro eventi e le loro registrazioni.",scopeOverflow_one:"Questa vista ha una videocamera in pi\xf9 di quante la timeline riesca a leggerne insieme.",scopeOverflow_other:"Questa vista ha {{count}} videocamere in pi\xf9 di quante la timeline riesca a leggerne insieme.",scopeUnreadableAndOverflow:"{{unreadable}} videocamere non sono state lette e altre {{overflow}}, oltre il limite della timeline, non sono mostrate.",loadMoreHistory:"Carica altro",loadingMoreHistory:"Caricamento\u2026"},theater:{back:"Indietro",today:"Oggi",yesterday:"Ieri",prevDay:"Giorno precedente",nextDay:"Giorno successivo",selectDate:"Seleziona una data",live:"LIVE",now:"ORA",auto:"Auto",quality:"Qualit\xe0 stream",filterAll:"Tutti",filter_motion:"Movimento",filter_audio:"Audio",goToLive:"Vai al live",liveLockOn:"Blocco live attivo \u2014 navigando l'immagine resta in diretta",liveLockOff:"Blocco live disattivo \u2014 navigando parte la registrazione",recordLive:"Registra live",keepClip:"Salva la registrazione",keepClipTitle:"Tenere questo clip?",discardClip:"Scarta",saveToGallery:"Salva in Foto",shareClip:"Condividi",recordFailed:"Impossibile registrare la vista live",noRecording:"Nessuna registrazione",noRecordingHint:"Nessun filmato per questo momento",detailCount:"{{frames}} frame \xb7 {{count}} rilevamenti",detailTracks:"{{tracks}} tracce \xb7 {{count}} rilevamenti",detailEmpty:"Nessuna immagine di dettaglio per questo istante",detailSeek:"Vai a questo momento",zoneHint:"Trascina un rettangolo sul video per filtrare gli eventi per zona",zoneConfirm:"Conferma",zoneCancel:"Annulla",playbackBar:"Controlli di riproduzione",footerBar:"Strumenti timeline",filterTitle:"Filtri",zoomRange:"Intervallo di tempo",zoomSpanMinutes:"{{count}}m",zoomSpanHours:"{{count}}h",zoneFilter:"Filtro zona",detailSubjects_one:"{{count}} soggetto",detailSubjects_other:"{{count}} soggetti",zoneModeRect:"Rettangolo",zoneModePolygon:"Poligono",zoneClearPoints:"Pulisci",zoneHintPolygon:"Tocca per aggiungere punti \u2014 3 o pi\xf9",selectTime:"Ora",goSameTime:"Vai \u2014 stessa ora del giorno",recordingDaysFailed:"Non \xe8 stato possibile leggere i giorni con registrazioni.",recordingDaysPartial:"Alcune videocamere di questa vista non sono state lette: i giorni senza pallino potrebbero comunque avere registrazioni.",clusterOpenDetail:"Apri il dettaglio evento",clusterCarouselShow:"Apri il carosello del cluster",clusterCarouselHide:"Chiudi il carosello del cluster",clusterPrevImage:"Immagine precedente",clusterNextImage:"Immagine successiva",clusterCameras_one:"{{count}} telecamera",clusterCameras_other:"{{count}} telecamere",clipStartsAtSubjectAt:"La clip parte alle {{start}}, soggetto alle {{subject}}",clipEndsAt:"La clip termina alle {{end}}",legend:{open:"Legenda heatmap e timeline",title:"Legenda",heatmapTitle:"Heatmap delle 24 ore",heatmapRecordingTitle:"Registrazione",heatmapRecordingBody:"Linea rossa in alto sul nastro \u2014 copertura di quel tratto di giornata.",heatmapAudioTitle:"Audio",heatmapAudioBody:"Picchi dall'alto. Verde = basso, rosso = alto: la stessa scala a sei gradini del misuratore live.",heatmapBottomTitle:"Motion e detection",heatmapBottomBody:"La parte bassa di ogni slot \xe8 motion verde, oppure la classe prominente quando c'\xe8 object detection.",timelineTitle:"Colonna attivit\xe0",timelineRecordingTitle:"Registrazione",timelineRecordingBody:"Linea rossa continua all'estrema destra.",timelineMotionTitle:"Motion",timelineMotionBody:"Linea verde al centro.",timelineDetectionTitle:"Object detection",timelineDetectionBody:"Pallino sulla linea motion, del colore della classe prominente in quel momento.",timelineAudioTitle:"Livello audio",timelineAudioBody:"Linea all'estrema sinistra. Stessa scala verde\u2192rosso della heatmap e del misuratore live.",classesTitle:"Classi di detection",classPerson:"Persona",classPersonBody:"Persone e volti.",classVehicle:"Veicolo",classVehicleBody:"Auto, camion, bici e il resto della famiglia veicolo.",classAnimal:"Animale",classAnimalBody:"Cani, gatti, uccelli e altri animali."}},mediaKind:{crop:"Ritaglio oggetto",thumbnail:"Best shot",faceCrop:"Volto",plateCrop:"Targa",fullFrame:"Frame",fullFrameBoxed:"Riquadrato",keyFrame:"Frame chiave",firstFrame:"Primo",lastFrame:"Ultimo",snapshot:"Istantanea"},tracks:{crop:"Ritaglio",fullFrame:"Frame completo",bestShot:"Scatto migliore",media:"Media",noMedia:"Nessun media per questa traccia",mediaLoadError:"Impossibile caricare i media",mediaEntryLoading:"Caricamento del media\u2026",mediaEntryError:"Media presente in indice ma non leggibile",mediaEntryAbsent:"Non archiviato per questa traccia",path:"Percorso",pathSummary:"{{count}} punti \xb7 {{seconds}}s",pathNoLocalization:"nessuna posizione precisa",share:"Condividi",copyLink:"Copia link",linkCopied:"Link copiato",shareImage:"Condividi immagine",viewFullRes:"Risoluzione piena",fullResBadge:"Piena",zones:"Zone",audio:"Audio",prevTrack:"Evento precedente",nextTrack:"Evento successivo",reason:"Perch\xe9 rilevante",empty:"Nessuna traccia",recent:"Recenti",searchPlaceholder:"Cerca eventi (es. \"persona in rosso\")",searchSubmit:"Cerca",searchClear:"Cancella ricerca",noMatches:"Nessun evento corrispondente",person:"Persona",assignPerson:"Associa a persona",changePerson:"Cambia",notAssigned:"Non associata",matchConfidence:"Affidabilit\xe0 match",suggested:"Suggerito",suggestedUnknown:"Persona suggerita",suggestedConfirm:"Conferma",suggestedDismiss:"Ignora",assignFaceTitle:"Associa volto",newPersonPlaceholder:"Nome nuova persona\u2026",createAndAssign:"Crea e associa",assignFailed:"Associazione del volto non riuscita",removePerson:"Rimuovi persona",removePersonConfirmTitle:"Rimuovere la persona?",removePersonConfirmBody:"Questo scollega la persona da questo volto. Il volto torna tra quelli non associati e potr\xe0 essere riassociato in seguito.",disassociateFailed:"Rimozione della persona non riuscita",removePersonAll:"Rimuovi da tutti gli eventi",removePersonAllConfirmTitle:"Rimuovere da tutti gli eventi?",removePersonAllConfirmBody:"Questo scollega la persona da OGNI evento. Tutti i volti attualmente riconosciuti come questa persona tornano tra quelli non associati e potranno essere riassociati in seguito. La persona viene mantenuta.",disassociateAllFailed:"Rimozione della persona da tutti gli eventi non riuscita",existingPersons:"Persone",noPersons:"Ancora nessuna persona",metadata:"Metadati",markForTraining:"Segna per addestramento",markForTrainingHint:"Mantiene questa traccia e i suoi media oltre la conservazione",debugFlag:"Debug",debugFlagHint:"Segna questa traccia per un controllo diagnostico. Tieni premuto per modificare cosa controllare.",debugNotePromptTitle:"Cosa dobbiamo controllare?",debugNotePromptBody:"Descrivi cosa non torna in questo evento, con parole tue. Resta sulla traccia, cos\xec chi rivede il set di debug legge la domanda insieme ad essa.",debugNotePlaceholder:"es. il box salta sul cancello quando passa l\u2019auto",debugPreset:{stationaryObject:"Oggetto stazionario",lateStart:"Iniziata in ritardo",earlyEnd:"Terminata presto",targetSwapped:"Target scambiato durante la traccia",edgeCropMirror:"Best shot sul bordo con mirror",betterShotExisted:"Un miglior best shot disponibile",missingMedia:"Media mancanti",cropOffTarget:"Crop shot non in target",riderNotInKeyframe:"Due ruote shot senza conducente"},debugReviewed:"Analizzata",debugReviewedHint:"Segna questa traccia debug come analizzata cos\xec esce dal filtro e dall'export",favourited:"Preferito",favouritedHint:"Mantiene questa traccia e i suoi media oltre la conservazione",copy:"Copia",copied:"Copiato","meta.trackId":"ID traccia","meta.eventId":"ID evento migliore","meta.deviceId":"ID dispositivo","meta.camera":"Telecamera","meta.className":"Classe","meta.label":"Etichetta","meta.firstSeen":"Prima apparizione","meta.lastSeen":"Ultima apparizione","meta.state":"Stato","meta.importance":"Importanza","meta.confidence":"Confidenza","meta.mediaKeys":"ID media",rescore:{button:"Ricalcola le corrispondenze",failed:"Impossibile ricalcolare le corrispondenze",params:"Soglia {{threshold}} \xb7 margine {{margin}}",needsSamples:"{{count}} campioni \u2014 ne servono {{min}}",reembed:"Ricalcola l'embedding e riprova",reembedFailed:"Ricalcolo embedding fallito: {{reason}}",verdict:{"auto-assignable":"Verrebbe assegnata a {{name}}",ambiguous:"Due persone hanno punteggi troppo vicini \u2014 il margine lo impedisce",suggestion:"Plausibile, ma sotto la soglia di assegnazione automatica","below-threshold":"Nessuna corrispondenza nella galleria attuale","no-eligible-identity":"Nessuna persona ha ancora abbastanza campioni (ne servono {{min}})","empty-gallery":"Nella galleria non c'\xe8 nulla di confrontabile con questo volto","model-mismatch":"Questo volto \xe8 stato calcolato con un modello precedente \u2014 i punteggi non sono confrontabili"}}},accessories:{on:"Acceso",off:"Spento",dimUp:"Pi\xf9 luminoso",dimDown:"Meno luminoso",lock:"Blocca",unlock:"Sblocca",open:"Apri",close:"Chiudi",stop:"Ferma",disarm:"Disattiva",onMotion:"Su movimento",openPercent:"Apertura {{percent}}",warmer:"Pi\xf9 caldo",cooler:"Pi\xf9 freddo",speedUp:"Pi\xf9 veloce",speedDown:"Pi\xf9 lento",oscillate:"Oscillazione",press:"Premi",play:"Riproduci",pause:"Pausa",previous:"Precedente",next:"Successivo",start:"Avvia",dock:"Rientra",locate:"Localizza",feed:"Eroga",feeding:"Erogazione\u2026",install:"Installa",installing:"Installazione\u2026",upToDate:"Aggiornato",increase:"Aumenta",decrease:"Diminuisci",select:"Seleziona",noEvent:"Nessun evento",buttonIndex:"Tasto {{index}}",mode:"Modalit\xe0",fanMode:"Modalit\xe0 ventola",preset:"Preset",direction:"Direzione",forward:"Avanti",reverse:"Indietro",away:"Assente",humidityUp:"Aumenta umidit\xe0",humidityDown:"Riduci umidit\xe0",swingVertical:"Oscillazione verticale",swingHorizontal:"Oscillazione orizzontale",setTemperature:"Temperatura impostata",currentTemperature:"Temperatura attuale",climateModes:{off:"Spento",heat:"Riscaldamento",cool:"Raffreddamento",auto:"Auto",heat_cool:"Caldo/Freddo",fan_only:"Ventola",dry:"Deumidificazione"},unsupported:"Questo hub non supporta l'operazione. Aggiornalo e riprova.",armMode:{home:"Casa",away:"Fuori",night:"Notte",vacation:"Vacanza",custom_bypass:"Personalizzato"},alarmRefused:"Non attivato \u2014 aperti: {{devices}}",armAnyway:"Attiva comunque",armAnywayRejected:{"unknown-refusal":"Attiva comunque non accettato: l'hub non conosce pi\xf9 quel rifiuto. Riprova ad attivare.",stale:"Attiva comunque non accettato: il pannello \xe8 cambiato dal rifiuto. Riprova ad attivare.",expired:"Attiva comunque non accettato: il rifiuto \xe8 scaduto. Riprova ad attivare.",used:"Attiva comunque non accettato: quel rifiuto \xe8 gi\xe0 stato usato."},alarmState:{arming:"Attivazione in corso\u2026",pending:"Intrusione \u2014 disattiva ora",triggered:"Allarme scattato"},alarmRefusedCap:"Non attivato \u2014 aperti: {{devices}}. \"Attiva comunque\" \xe8 nella notifica dell'allarme.",alarmLookupUnknown:"Stato dell'allarme sconosciuto \u2014 nuovo tentativo in corso",alarmStateUnknown:"Stato del pannello sconosciuto",alarmExcluded:"Attivato \u2014 esclusi: {{devices}}",deviceFallback:"Dispositivo #{{id}}",alarmRefusedNone:"Non attivato \u2014 l'hub ha rifiutato senza indicare un dispositivo aperto. Riprova."},updates:{otaReadyTitle:"Aggiornamento scaricato",otaReadyBody:"Riavviare l'app adesso per applicarlo? Con \"Pi\xf9 tardi\" si applica al prossimo avvio.",install:"Riavvia ora",later:"Pi\xf9 tardi",whatsNewTitle:"Novit\xe0 nella {{version}}",whatsNewHeading:"Novit\xe0",whatsNewPrevious:"Aggiornamenti precedenti",whatsNewRow:"Novit\xe0",whatsNewNone:"Nessuna nota per questa versione.",nativeRow:"Build dell'app",nativeUpToDate:"Aggiornata",nativeUnknown:"\u2014",nativeNewer:"Disponibile {{version}} ({{build}})",nativeNewerTitle:"\xc8 disponibile una nuova build dell'app",nativeNewerBody:"La versione {{version}} (build {{build}}) \xe8 disponibile. Da ora gli aggiornamenti la richiedono.",openTestFlight:"Apri TestFlight",openStore:"Apri lo store"},cameraMenu:{title:"Opzioni vista",gridCommonHint:"Gli overlay comuni a tutta la griglia \u2014 riquadri, bordo di evidenziazione e i suoi trigger, etichette dei cluster \u2014 si impostano una volta sola per la griglia, nella barra della griglia.",streamStats:"Statistiche stream",audioLevel:"Livello audio",densityTitle:"Densit\xe0 timeline",density_compact:"Compatta",density_medium:"Media",density_wide:"Ampia",densityCustom:"Personalizzata",showImportance:"Mostra importanza",showClass:"Mostra classe rilevata",timelineSection:"Timeline",managementTitle:"Gestione"},viewOptions:{groupDetection:"Overlay di rilevamento"},cameraShelf:{goTo:"Vai a questa telecamera",addToView:"Aggiungi alla vista",closeView:"Chiudi la vista",loading:"Caricamento telecamere\u2026",loadingA11y:"Caricamento delle altre telecamere"},cameraSwitches:{title:"Funzioni telecamera",loading:"Lettura delle funzioni\u2026",readFailed:"Impossibile leggere le funzioni della telecamera. Nulla \xe8 cambiato \u2014 non vengono mostrate anzich\xe9 mostrarle con uno stato ipotizzato.",writeFailed:"Modifica rifiutata e annullata. {{reason}}",offBadge:"OFF",badgeLabel_one:"{{count}} funzione disattivata",badgeLabel_other:"{{count}} funzioni disattivate",unavailableNoProvider:"Non disponibile \u2014 nessun componente di questa installazione la fornisce.",unavailableUnreachable:"Sconosciuto \u2014 il servizio che la gestisce non ha risposto.",unavailableNotConfigured:"Non offerta \u2014 non \xe8 ancora configurato nulla su cui agire.",unavailableNoPrivacyZones:"Non offerta \u2014 sulla telecamera non \xe8 disegnata nessuna zona di privacy. Disegnane una nell\u2019app della telecamera e l\u2019interruttore comparir\xe0.",warnUnknown:"Questo controllo riporta una nota dall\u2019hub che questa versione dell\u2019app non riconosce ancora.",warnNoPrivacyZones:"Sulla telecamera non \xe8 ancora disegnata nessuna zona di privacy, quindi la maschera non ha nulla da oscurare. Disegnane una nell\u2019app della telecamera; l\u2019interruttore resta offerto per poter avviare la funzione da qui.",unavailableDeviceDisabled:"Non offerta finch\xe9 la telecamera \xe8 spenta.",unavailableUnknown:"Non disponibile su questa telecamera."},stats:{title:"Statistiche stream",resolution:"Risoluzione",fps:"FPS",bitrate:"Bitrate",packetLoss:"Pacchetti persi",jitter:"Jitter",codec:"Codec",frames:"Frame (persi/totali)",waiting:"Misurazione\u2026",playbackHint:"Le statistiche WebRTC complete richiedono il player nativo."},exportActions:{title:"Cattura",recordingExport:"Esporta registrazione"},exportSelection:{start:"Seleziona un periodo da esportare",discard:"Scarta la selezione",save:"Salva il periodo selezionato",savePartial:"Salva il periodo selezionato \u2014 una parte non \xe8 registrata",title:"Esportazione",queued:"Esportazione in coda. La troverai in Esportazioni quando \xe8 pronta.",failed:"Non \xe8 stato possibile mettere in coda l'esportazione.",gapTitle:"Una parte di questo periodo non \xe8 registrata",gapMessage:"I {{duration}} selezionati attraversano un tratto senza registrazione. L'esportazione conterr\xe0 solo le parti registrate.",gapConfirm:"Esporta comunque"},exports:{title:"Esportazioni",range:"Intervallo",createAction:"Nuova esportazione",withAudio:"con audio",variantRegular:"1\xd7",variantAccelerated:"Accelerato {{speed}}\xd7",variantSlow:"Rallentato {{speed}}\xd7",variantTimelapse:"Timelapse",expired:"Scaduto",expiresInDays:"Scade tra {{count}}g",expiresInHours:"Scade tra {{count}}h",expiresInMinutes:"Scade tra {{count}}m",downloadAction:"Scarica",downloadUnavailable:"Download non disponibile.",downloadFailed:"Download non riuscito.",cancelAction:"Annulla",cancelConfirmTitle:"Annullare l'esportazione?",cancelConfirmBody:"Interrompe il rendering ed elimina il file parziale.",deleteAction:"Elimina",deleteConfirmTitle:"Eliminare l'esportazione?",deleteConfirmBody:"Rimuove il file. La voce nella cronologia viene mantenuta.",dismiss:"Chiudi",state:{queued:"In coda",rendering:"Rendering",ready:"Pronto",failed:"Non riuscito",expired:"Scaduto",deleted:"Eliminato"},createHint:"Scegli una camera: l'esportazione si traccia sulla sua timeline di registrazione, dove si vede il filmato che esiste davvero.",stillRendering:"Ancora in elaborazione: il file non \xe8 pronto per la riproduzione.",noFile:"Non c\u2019\xe8 nessun file da riprodurre per questa esportazione.",stateLabel:"Stato",variant:"Resa"},library:{title:"Libreria",sections:{events:"Eventi",artifacts:"Media",review:"Revisione"}},artifacts:{title:"Media",empty:"Nessun file.",emptyFiltered:"Nessun file corrisponde a questi filtri.",loadError:"Impossibile caricare i media.",gone:"Questo file non \xe8 pi\xf9 sull'hub.",expired:"Scaduto",expiredBody:"La finestra di conservazione \xe8 terminata e il file \xe8 stato rimosso.",expiresInDays:"Scade tra {{count}}g",expiresInHours:"Scade tra {{count}}h",expiresInMinutes:"Scade tra {{count}}m",retentionHint:"Conservato fino a 14 giorni. I file possono essere rimossi prima se l'hub raggiunge i limiti di spazio.",byRule:"Regola: {{name}}",allCameras:"Tutte le telecamere",cameraPlus:"{{name}} +{{count}}",close:"Chiudi",downloadAction:"Scarica",downloadUnavailable:"Download non disponibile.",downloadFailed:"Download non riuscito.",deleteAction:"Elimina",deleteConfirmTitle:"Eliminare questo file?",deleteConfirmBody:"Viene rimosso definitivamente dall'hub.",deleteRefused:"L'hub non ha rimosso questo file. Potrebbe non esserci pi\xf9, oppure appartenere a tutta la casa: in quel caso solo un amministratore pu\xf2 eliminarlo.",deleteFailed:"Impossibile eliminare il file.",kind:{timelapse:"Timelapse","timelapse-preview":"Anteprima timelapse","summary-mosaic":"Mosaico riepilogo","event-gif":"GIF","event-clip":"MP4","event-still":"Foto",export:"Esportazione"},time:{now:"Adesso",minutesAgo:"{{count}}m fa",hoursAgo:"{{count}}h fa",daysAgo:"{{count}}g fa"},range:{all:"Tutto",day:"24h",week:"7g",month:"30g"},filters:{toggle:"Filtri",kind:"Tipo",camera:"Telecamera",range:"Periodo",clear:"Azzera filtri"},detail:{kind:"Tipo",cameras:"Telecamere",rule:"Regola",captured:"Ripreso il",created:"Prodotto il",size:"Dimensione",format:"Formato",expiry:"Scadenza"}},streamBar:{play:"Riproduci",pause:"Pausa",scrubForward:"Avanzamento veloce",scrubBackward:"Riavvolgimento",mute:"Silenzia",unmute:"Riattiva audio",silentBySpeed:"Nessun audio a {{rate}} \u2014 la velocit\xe0 lo silenzia",talkStart:"Inizia a parlare",talkStop:"Smetti di parlare",quality:"Qualit\xe0 stream",menu:"Opzioni vista",snapshot:"Istantanea",pip:"Picture in picture",fullscreen:"Schermo intero",exitFullscreen:"Esci da schermo intero"},playback:{servedTier:"In riproduzione {{tier}}",servedTierDegraded:"{{requested}} non disponibile qui \u2014 riproduco {{served}}",tier:{high:"Alta",mid:"Media",low:"Bassa"},prevFrame:"Frame precedente",nextFrame:"Frame successivo",speed:"Velocit\xe0 riproduzione",rateUnavailable:"Non disponibile per le clip di questa camera",stepBackUnavailable:"Le clip di questa camera non tornano indietro di un fotogramma: i frame prima dell'immagine non sono stati conservati"},cameraSwitcher:{title:"Cambia videocamera",empty:"Nessuna videocamera disponibile",openGrid:"Apri griglia ({{n}})",selectA11y:"Seleziona {{name}}",buildView_one:"Mostra questa videocamera",buildView_other:"Mostra queste {{count}} videocamere"},storage:{title:"Archiviazione",usageTitle:"Utilizzo",nodeTotal:"Totale nodo",defaultLocation:"Posizione predefinita",locationFree:"{{free}} liberi",retentionTitle:"Conservazione",pruneAction:"Applica conservazione ora",pruneConfirmTitle:"Applicare la conservazione?",pruneConfirmBody:"Elimina le registrazioni su {{name}} che superano la policy di conservazione.",pruneResult:"Recuperati {{bytes}} ({{buckets}} segmenti).",deleteTitle:"Elimina registrazioni",deleteAction:"Elimina",deleteConfirmTitle:"Eliminare le registrazioni?",deleteConfirmBody:"Elimina definitivamente {{range}} di registrazioni su {{name}}. Operazione irreversibile.",deleteResult:"Recuperati {{bytes}} ({{buckets}} segmenti).",cancel:"Annulla",window24h:"Ultime 24h",window7d:"Ultimi 7 giorni",window30d:"Ultimi 30 giorni",windowAll:"Tutto"},eventsMgmt:{title:"Eventi",footprintTitle:"Ingombro",rowsBytes:"{{rows}} eventi \xb7 {{bytes}}",clusterTotal:"Totale cluster",pruneTitle:"Elimina pi\xf9 vecchi di",pruneHint:"Si applica a tutte le telecamere.",pruneAction:"Elimina",pruneConfirmTitle:"Eliminare gli eventi vecchi?",pruneConfirmBody:"Elimina gli eventi pi\xf9 vecchi di {{range}} su TUTTE le telecamere. Operazione irreversibile.",pruneResult:"Eliminati {{count}} eventi.",deleteTitle:"Elimina eventi telecamera",deleteAction:"Elimina tutti gli eventi di questa telecamera",deleteConfirmTitle:"Eliminare tutti gli eventi?",deleteConfirmBody:"Elimina definitivamente ogni evento di {{name}}. Operazione irreversibile.",deleteResult:"Eliminati {{count}} eventi.",cancel:"Annulla",older24h:"24 ore",older7d:"7 giorni",older30d:"30 giorni"},overlay:{title:"Overlay",liveSection:"Indicatori live",readoutsSection:"Sensori e valori",layersLabel:"Riquadri sull'immagine",layerMotion:"Movimento",layerObjects:"Oggetti",layerDiscarded:"Scartate",layerStationary:"Stazionarie",layerDiscardedHint:"Disegna anche, con tratteggio, le rilevazioni quasi accettate e quelle fuori zona delle classi che hai abilitato \u2014 soggetti rimasti appena sotto la soglia di confidenza, o fuori da una regola di zona. Utile quando i riquadri lampeggiano su un soggetto in movimento. La pillola confronta ci\xf2 che il modello ha visto con ci\xf2 che \xe8 stato tenuto.",layerStationaryHint:"Disegna gli oggetti che si sono fermati e non sono pi\xf9 tracciati \u2014 un'auto parcheggiata, un bidone lasciato fuori. L'hub sopprime le loro rilevazioni, quindi non possono mai comparire sotto Oggetti o Scartate.",diagCounts:"modello {{saw}} \xb7 tenuti {{kept}}",diagHidden:"{{hidden}} nascosti",diagOffTopic:"{{offTopic}} non pertinenti",diagShed:"frame saltato \xb7 {{reason}}",reasonThreshold:"sotto soglia",reasonFullFrame:"guardia full-frame",reasonNms:"soppresso da NMS",reasonClassFilter:"filtro classe",reasonZoneGate:"regola di zona",motionBadge:"Badge movimento",highlightBorder:"Bordo evidenziazione",occupancy:"Occupazione",addReadout:"Aggiungi un valore",removeReadout:"Rimuovi valore",readoutsHint:"Fissa un valore live sull'immagine: il livello audio, o un sensore collegato a questa telecamera.",noFields:"Questo dispositivo non pubblica valori live.",thisCamera:"Questa telecamera",audioDbfs:"Livello audio",liveOnlyHint:"Si disegnano solo sull'immagine live \u2014 non in riproduzione n\xe9 in pausa.",positions:{off:"Off","top-left":"In alto a sinistra","top-center":"In alto al centro","top-right":"In alto a destra","left-center":"Al centro a sinistra","right-center":"Al centro a destra","bottom-left":"In basso a sinistra","bottom-center":"In basso al centro","bottom-right":"In basso a destra"}},clips:{title:"Clip",lengthUnknown:"durata sconosciuta",progressLabel:"Posizione nella clip {{position}} di {{duration}}",loading:"Caricamento clip\u2026",empty:"Nessuna clip per questa telecamera nell'intervallo caricato.",searching:"Cerco nei giorni precedenti\u2026 ({{days}}/{{max}})",emptySearched:"Nessuna clip negli ultimi {{days}} giorni.",summary_one:"{{count}} clip",summary_other:"{{count}} clip",collapsedHint:"{{duration}} saltati",hiddenHint_one:"{{count}} nascosta dal filtro sorgenti",hiddenHint_other:"{{count}} nascoste dal filtro sorgenti",segmentLabel:"Clip delle {{time}}, durata {{duration}}",gapLabel:"Salto di {{duration}}",notPlayable:"non ancora riproducibile",kind_motion:"Movimento",kind_object:"Oggetto",kind_audio:"Audio",kind_native:"Telecamera",sourceAnalytics:"Registrazione",sourceOnboard:"Telecamera ({{vendor}})",sourceHksv:"HomeKit",sourceUnknown:"{{vendor}}",unitDay:"g",unitHour:"o",unitMinute:"m",unitSecond:"s",sourceSilent:"{{source}} non ha potuto rispondere per questo intervallo.",sourceMissing:"Questa telecamera non offre pi\xf9 {{source}}. Mostro {{fallback}}.",sourceSetting:"Sorgente clip",recordingSourceSetting:"Sorgente registrazioni",recordingSourceOurs:"CamStack",sourceStateSleeping:"la telecamera sta dormendo",sourceStateUnreachable:"la telecamera non \xe8 raggiungibile",sourceStateNoStorage:"la telecamera non ha memoria installata",sourceStateIndexEmpty:"la telecamera non elenca alcun file",sourceStateUnknown:"il motivo non \xe8 noto a questa app",catalogAsOf:"Catalogo letto {{ago}} fa",thumbQueued:"Anteprima in coda\u2026",thumbNone:"Nessuna anteprima",playFailed:"Impossibile aprire questa clip.",servedInstead:"Richiesto {{asked}}, ricevuto {{served}}.",closeClip:"Chiudi clip",nextClip:"Clip successiva",previousClip:"Clip precedente",saveClip:"Salva clip",saveUnavailable:"Questa clip non pu\xf2 essere fornita",stillRecordingNoLoop:"Registrazione in corso \u2014 riprodotta una volta",still:{waiting:"Sto chiedendo un fermo immagine alla telecamera\u2026",queueFull:"In attesa della telecamera \u2014 la coda dei fermi immagine \xe8 piena",cameraBackoff:"La telecamera si sta riposando dopo un rifiuto \u2014 riprovo a breve",gaveUp:"La telecamera \xe8 ancora occupata \u2014 aggiorna per richiedere",sleeping:"La telecamera dorme \u2014 un fermo immagine costerebbe un risveglio",cameraRefused:"La telecamera ha rifiutato di estrarre un fermo immagine",noKeyframe:"Nessun fotogramma decodificabile in questa finestra",unsupported:"Questa sorgente non pu\xf2 produrre fermi immagine",noCatalogRow:"Questa clip non \xe8 pi\xf9 nel catalogo della telecamera",unknownDevice:"Questa telecamera non \xe8 servita qui",uidMissing:"L'id della telecamera non \xe8 ancora noto"},export:{title:"Salva clip",close:"Chiudi",pickHint:"Scegli la copia da tenere. L'hub la prepara e finisce nella Libreria.",profile:{high:"Qualit\xe0 alta",low:"Qualit\xe0 bassa"},sizeUnknown:"dimensione non indicata",tooLarge:"Troppo grande da trasferire",working:"Preparazione dell'export\u2026",workingHint:"Puoi chiudere \u2014 il lavoro continua.",ready:"Pronto",readyHint:"Lo trovi nella Libreria.",failed:"Export fallito",failure:{"catalog-miss":"La telecamera non elenca pi\xf9 questa clip","catalog-unreachable":"Impossibile leggere il catalogo della telecamera","no-file-for-window":"Non c'\xe8 nessun file dietro questa clip","clip-in-progress":"Questa clip \xe8 ancora in scrittura","unsupported-option":"L'export ha chiesto qualcosa che una clip non pu\xf2 fare",sleeping:"La telecamera sta dormendo","camera-refused":"La telecamera ha rifiutato","fetch-failed":"Impossibile scaricare la clip","too-large-to-transfer":"Troppo grande da trasferire","wake-expired":"La telecamera si \xe8 riaddormentata prima che il lavoro partisse"}},scrubUnavailable:"Le clip di questa camera non si possono scorrere: solo in avanti dal punto in cui \xe8 l'immagine",loopOn:"Riproduci la clip in loop, attivo",loopOff:"Riproduci la clip in loop, disattivo"},eventsEmbed:{section:"Embed dell'hub (anteprima)",title:"Embed eventi",count:"{{count}} mostrati",openPreview:"Anteprima embed",openPreviewHint:"Apre la superficie eventi ospitata dall'hub accanto a questa pagina. Non sostituisce nulla.",view_reel:"Striscia",view_gallery:"Galleria",error:"Impossibile caricare gli eventi",retry:"Riprova",empty:"Nessun evento",emptyFiltered:"Nessun evento corrisponde a questo filtro",end:"\xb7 fine \xb7"},eventsShare:{title:"Link embed eventi",openBuilder:"Crea link embed",openBuilderHint:"Costruisci un URL autonomo per una dashboard o un iframe.",view:"Vista",viewReel:"Striscia",viewGallery:"Galleria",columns:"Colonne",rows:"Righe",auto:"Auto",thumb:"Dimensione miniature",thumbSmall:"Piccola",thumbMedium:"Media",thumbLarge:"Grande",theme:"Tema",themeAuto:"Auto",themeDark:"Scuro",themeLight:"Chiaro",fields:"Testo della card",field_label:"Titolo",field_sublabel:"Classe",field_camera:"Telecamera",field_time:"Ora",field_badges:"Badge",cameras:"Telecamere",camerasAll:"Tutte le telecamere visibili al link",camerasCount:"{{count}} selezionate",preview:"Anteprima del link",shareMediaNotice:"Un link di condivisione non riesce a caricare le miniature. I token di condivisione non hanno alcun accesso all'endpoint dei media: la pagina elenca gli eventi, senza le immagini.",copyLink:"Crea link",chip:"Link embed",semanticScopeNotice:"La ricerca semantica gira su tutte le telecamere e viene poi ristretta a questo link: un link con poche telecamere pu\xf2 quindi restituire pochi risultati su un cluster grande."},eventsCard:{unassignedFace:"volto non assegnato",reviewed:"analizzata",debug:"debug",train:"addestramento",favourite:"preferito",active:"attivo",loadingMore:"Caricamento altri eventi"},gridTile:{play:"Riproduci",pause:"Pausa",listen:"Ascolta",mute:"Silenzia",talk:"Parla",stopTalk:"Termina",ptz:"PTZ",linkedDevices:"Dispositivi collegati",viewOptions:"Opzioni di visualizzazione",moreActions:"Altre azioni",open:"Apri",removeFromView:"Togli dalla vista",resizeWidth:"Ridimensiona larghezza",resizeHeight:"Ridimensiona altezza",noActiveCameras:"Nessuna videocamera attiva",camera:"Videocamera"},battery:{holdHint:"La camera \xe8 a batteria: premi play per avviare lo stream e svegliarla.",startStreamA11y:"Avvia lo stream e sveglia la camera a batteria"},faceReview:{loading:"Caricamento volti\u2026",loadError:"Impossibile caricare i volti.",empty:"Nessun volto da rivedere al momento.",previewClose:"Chiudi",pickIdentityTitle:"Assegna a\u2026",assignFailed:"Impossibile assegnare questo volto.",assign:"Assegna",assignedSuccess:"Assegnato a {{name}}.",confirmAssignTitle:"Assegna volti",confidence:"Affidabilit\xe0",groupSize:"{{count}} volti in questo gruppo",filterAssigned:"Assegnate",filterSuggested:"Suggerite",filterUnassigned:"Non assegnate",certaintyCertain:"quasi certo",certaintyProbable:"probabile",certaintyUncertain:"incerto",analyzeButton:"Gruppi simili",analyzeModalTitle:"Gruppi simili",analyzeLoading:"Ricerca gruppi simili\u2026",analyzeEmpty:"Nessun gruppo simile trovato.",analyzeConfirmBody:"Assegnare {{count}} volti in {{groups}} gruppi?",analyzeResult:"Assegnati {{assigned}} di {{count}} volti.",analyzeAssignFailed:"Alcuni volti sono stati rifiutati e restano non assegnati.",recomputeButton:"Ricalcola i suggerimenti",recomputeProgress:"Ricalcolo {{done}}/{{total}}\u2026",recomputeDone:"Ricalcolati {{count}} volti.",analyzeCoverage:"{{grouped}} dei {{pool}} volti non assegnati analizzati ricadono in {{groups}} gruppo/i di somiglianza. Gli altri qui non hanno somiglianze.",groupExcludeFace:"Escludi questo volto dal gruppo",groupIncludeFace:"Rimetti questo volto nel gruppo",groupPickPerson:"Assegna questo gruppo a",groupShowDetail:"Mostra questo volto ingrandito",groupDetailExclude:"Escludi dal gruppo",groupDetailInclude:"Rimetti nel gruppo",assignedManySuccess:"Assegnati {{count}} volti a {{name}}.",detailTitleMany:"Assegna {{count}} volti selezionati a\u2026",knownPeople:"Persone conosciute",filtersButton:"Filtri",filtersButtonActive:"Filtri ({{count}})",sortLabel:"Ordina per",sortByCertainty:"Certezza",sortByDate:"Data",sortAscending:"Ordine crescente \u2014 tocca per decrescente",sortDescending:"Ordine decrescente \u2014 tocca per crescente",dateLabel:"Intervallo di date",rangeAll:"Tutte",rangeToday:"Oggi",rangeYesterday:"Ieri",rangeLast7:"7 giorni",rangeLast30:"30 giorni",cameraLabel:"Telecamera",cameraNone:"Nessuna telecamera nei volti caricati.",selectButton:"Seleziona",selectDone:"Fatto",selectionCount:"{{count}} selezionati",applySuggestions:"Applica {{count}} suggerimenti",applySuggestionsBlocked:"{{count}} dei volti selezionati non ha un suggerimento \u2014 deselezionali, oppure usa Assegna.",applySuggestionsResult:"Applicati {{count}} suggerimenti su {{total}}, per {{groups}} persone.",emptyFiltered:"Nessun volto corrisponde a questi filtri.",partialWindowHint:"Stai filtrando i {{count}} volti caricati finora \u2014 scorri in basso per caricarne di pi\xf9 vecchi.",auditTitle:"Rianalizza i campioni di {{name}}",auditSummary:"{{flagged}} campioni su {{total}} da guardare",auditLooksLike:"Somiglia a {{name}} ({{foreign}}) pi\xf9 che a questa persona ({{self}})",auditSelfOnly:"Concorda con gli altri campioni di questa persona: {{self}}",auditNotComparable:"Arruolato con un altro modello di volto \u2014 non \xe8 confrontabile, nemmeno per dire che va bene.",auditFromPhoto:"foto",auditRemoveTitle:"Rimuovi questo campione",auditRemoveBody:"Il campione smette di insegnare al riconoscimento. Non cambia nient\u2019altro, e la faccia da cui proviene resta dov\u2019\xe8.",auditUnavailable:"Questo hub non sa ancora rianalizzare una galleria.",auditRemoveFailed:"Impossibile rimuovere questo campione:",pickPersonSearch:"Cerca persone",pickPersonClear:"Cancella la ricerca",pickPersonSamples:"{{count}} campione/i",pickPersonNoMatch:"Nessuna persona corrisponde a \xab{{query}}\xbb.",pickPersonCreate:"Crea \xab{{name}}\xbb",auditOpenButton:"Rianalizza i campioni di una persona",auditPickTitle:"Campioni di chi?",groupPickNone:"Scegli una persona",newPersonButton:"Nuova persona",newPersonTitle:"Aggiungi una persona",newPersonCreated:"Aggiunta {{name}}.",newPersonFailed:"Impossibile aggiungere questa persona.",deleteSelected:"Elimina",deleteBlocked:"{{count}} dei volti selezionati appartengono a una persona: deselezionali, oppure scollegali prima.",deleteConfirmTitle:"Elimina {{count}} volti",deleteConfirmBody:"Il ritaglio e la sua riga escono definitivamente dal buffer di revisione. L\u2019evento da cui provengono non viene toccato.",deleteResult:"Eliminati {{count}} di {{total}} volti.",deleteFailed:"Impossibile eliminare questi volti."},statusDetail:{batteryTitle:"Batteria",linkTitle:"Collegamento",openBatteryA11y:"Dettagli batteria",openLinkA11y:"Dettagli collegamento",close:"Chiudi",label:{charge:"Carica",charging:"Alimentazione",state:"Stato",linkType:"Collegamento",signal:"Segnale",ssid:"Rete",verdict:"Verdetto",picture:"Immagine",bitrate:"Bitrate",decoded:"Fotogrammi decodificati",freezes:"Blocchi",keyframeRequests:"Richieste key frame",loss:"Perdita",latency:"Latenza \xb7 jitter",path:"Percorso",servedRung:"Profilo servito",source:"Sorgente",ingest:"Nodo di ingest",egress:"Leg di uscita",ladder:"Scala qualit\xe0",ladderWhy:"Perch\xe9 \xe8 ferma"},value:{unknown:"Non noto",notApplicable:"Non applicabile",binary:"Solo scarica / ok, senza percentuale",sleeping:"In sospensione",chargingDc:"In carica (rete)",chargingSolar:"In carica (solare)",chargingNone:"Non in carica",wifi:"Wi-Fi",ethernet:"Cavo (Ethernet)",cellular:"Cellulare",linkUnknown:"Non noto",decoding:"Decodifica in corso",decoderStall:"Stallo del decoder \u2014 i byte arrivano, i fotogrammi no",transportStall:"Stallo del trasporto \u2014 non arriva niente",frozenUnknown:"Fotogrammi fermi, byte sconosciuti",noWindow:"Nessuna finestra ancora",native:"Stream nativo",derived:"Derivato (transcodificato qui)",copyLeg:"Copy \u2014 nessuna ricodifica",transcodeLeg:"Transcodifica",ladderNeverMoved:"Mai mossa",ladderHeld:"Ferma",ladderHeldStallBuilding:"Ferma: l'immagine non arriva",ladderHeldDelivery:"Ferma: la qualit\xe0 attuale non arriva intera",ladderHeldNoEvidence:"Ferma: ancora nessun riscontro dal player",ladderHeldWarming:"Stabile, sta per salire",ladderHeldCooldown:"Ferma: appena cambiata",ladderHeldCapacity:"Ferma: banda insufficiente per il livello successivo",ladderHeldTryUnclean:"Ferma: connessione non abbastanza stabile per provare un livello superiore",ladderHeldTryBackoff:"Ferma: il livello superiore \xe8 stato provato e non ha tenuto; nuovo tentativo pi\xf9 tardi",ladderHeldTrial:"Sta provando un livello superiore",ladderHeldSuspended:"In pausa durante la riproduzione registrata",serverNotWired:"Non disponibile da questo player",serverWaiting:"In attesa del server",sessionGone:"Sessione non trovata sul server",noSample:"Nessuna misura ancora"},streamTitle:"Stream"},onDemandPlayer:{openA11y:"Apri nel player on-demand",title:"Player on-demand",close:"Chiudi il player",resize:"Ridimensiona il player",move:"Sposta il player",openCamera:"Apri la schermata della camera",goLive:"Diretta"},reelHighlight:{title:"Highlight del reel",section:"Illumina una card su",close:"Chiudi",reset:"Torna a motion + audio",openA11y:"Impostazioni highlight del reel"},accessoryPanel:{edit:"Personalizza i dispositivi",done:"Fine personalizzazione",emptyHint:"Tocca la matita per aggiungere dispositivi dall\u2019hub \u2014 restano nel profilo di questa app.",addAction:"Aggiungi dispositivi",addTitle:"Aggiungi dispositivi",addHint:"I dispositivi aggiunti qui compaiono solo nel profilo di questa app, sotto questa telecamera. I collegamenti dell\u2019hub non cambiano. Quelli nella stessa stanza sono suggeriti per primi.",picked:"Aggiunti qui",pickedNone:"Nessuno aggiunto",suggested:"Suggeriti \xb7 {{location}}",suggestedNone:"Nessuno",allDevices:"Tutti i dispositivi",searchToSee:"Cerca per vedere gli altri",noMatches:"Nessun risultato",searchPlaceholder:"Cerca per nome, stanza o id",truncated_one:"{{count}} altro risultato non \xe8 mostrato \u2014 restringi la ricerca.",truncated_other:"Altri {{count}} risultati non sono mostrati \u2014 restringi la ricerca.",save:"Conferma le aggiunte",cancel:"Annulla le modifiche",loadFailed:"L\u2019hub non ha risposto con la lista dei dispositivi. Chiudi e riprova.",localBadge:"Aggiunto qui",hiddenBadge:"Nascosto",rename:"Rinomina {{device}}",renameHint:"Visibile solo in questa app. Lascia vuoto per usare il nome dell\u2019hub.",icon:"Cambia l\u2019icona di {{device}}",iconTitle:"Icona per {{device}}",iconDefault:"Icona predefinita",iconSearchPlaceholder:"Cerca icone",iconGroups:{devices:"Dispositivi",lighting:"Luci, clima, elettrodomestici",sensors:"Sensori e meteo",places:"Stanze e luoghi",life:"Veicoli, animali, persone"},hide:"Nascondi {{device}}",show:"Mostra {{device}}",moveUp:"Sposta {{device}} in su",moveDown:"Sposta {{device}} in gi\xf9",remove:"Togli {{device}} da questa lista"}},prototype:{today:"Oggi",yesterday:"Ieri",now:"ORA",endOfDay:"FINE GIORNATA",loading:"Caricamento...",timeline:"Timeline",events:"Eventi",playClip:"Riproduci clip",goToNow:"ORA",noEvents:"Nessun evento"},eventKind:{motion:"Movimento",audio:"Audio",person:"Persona",vehicle:"Veicolo",animal:"Animale",package:"Pacco",sensor:"Sensore",control:"Controllo",car:"Auto",truck:"Camion",bus:"Autobus",motorcycle:"Motocicletta",bicycle:"Bicicletta",airplane:"Aereo",boat:"Barca",train:"Treno",bird:"Uccello",cat:"Gatto",dog:"Cane",horse:"Cavallo",sheep:"Pecora",cow:"Mucca",elephant:"Elefante",bear:"Orso",zebra:"Zebra",giraffe:"Giraffa",contact:"Contatto","motion-sensor":"Sensore movimento",smoke:"Fumo",flood:"Allagamento",gas:"Gas","carbon-monoxide":"Monossido di carbonio",vibration:"Vibrazione",tamper:"Manomissione",presence:"Presenza","enum-sensor":"Stato sensore","device-event":"Evento dispositivo",lock:"Serratura",cover:"Tapparella",switch:"Interruttore",siren:"Sirena",button:"Pulsante",doorbell:"Campanello","package-delivered":"Pacco consegnato","package-picked-up":"Pacco ritirato","audio-speech":"Voce","audio-music":"Musica","audio-dog":"Cane","audio-doorbell":"Campanello","audio-siren":"Sirena","audio-alarm":"Allarme","audio-animal":"Animale (altro)","audio-bird":"Uccello","audio-cat":"Gatto","audio-crowd":"Folla / Chiacchiericcio","audio-crying":"Pianto / Neonato","audio-door":"Porta","audio-engine":"Motore","audio-fire":"Fuoco / Fumo","audio-footsteps":"Passi","audio-glass_breaking":"Vetro rotto","audio-gunshot":"Sparo / Esplosione","audio-laughter":"Risata","audio-scream":"Urlo","audio-silence":"Silenzio","audio-telephone":"Telefono","audio-tools":"Utensili / Lavori","audio-vehicle":"Veicolo","audio-water":"Acqua","audio-wind":"Vento / Maltempo"}}},2616,[]);
|
|
4515
|
+
__d(function(e,t,a,o,n,i,s){n.exports={devices:{editDevice:"Edit device",originalName:"Original name",customName:"Custom name",customNamePlaceholder:"Leave empty to use original",icon:"Icon",typeLight:"Light",typeSwitch:"Switch",typeCover:"Cover",typeLock:"Lock",typeAlarm:"Alarm",typeButton:"Button",typeSelect:"Select",typeSiren:"Siren",typeSensor:"Sensor",typeEntry:"Entry",typeMediaPlayer:"Media Player",typeScript:"Script",run:"Run",sourceHA:"Home Assistant",sourceScrypted:"Scrypted",off:"Off",on:"On",mute:"Mute",unmute:"Unmute",stop:"Stop",locked:"Locked",unlocked:"Unlocked",open:"Open",closed:"Closed",disarmed:"Disarmed",disarm:"Disarm"},common:{error:"Error",save:"Save",cancel:"Cancel",loading:"Loading...",comingSoon:"Coming soon",back:"Back",fullscreen:"Fullscreen",exitFullscreen:"Exit fullscreen",reset:"Reset",selectAll:"Select all",deselectAll:"Deselect all",delete:"Delete",retry:"Retry"},grids:{newGrid:"New grid",deleteConfirm:"Delete this grid?",noGrids:"No grids yet. Create one to arrange cameras in a mosaic view.",createGrid:"Create grid",cameras:"cameras",notFound:"Grid not found.",noCameras:"No cameras in this grid. Edit the grid to add some.",edit:"Edit",addCamera:"Add camera",presets:"Presets",auto:"Auto",manual:"Manual",gridName:"Grid name",view:"View",addCameraHint:"Add at least one camera from the button above.",allCamerasAdded:"All cameras already in grid",cameraUnavailable:"Camera unavailable",camerasInGrid:"Cameras in grid",addAll:"Add all",addCameras:"Add Cameras",backToGrid:"Back to Grid",timelineNotSupported:"Timeline not supported"},nav:{cameras:"Cameras",grids:"Grids",library:"Library",notifications:"Notifications",events:"Events",videoclips:"Videoclips",list:"List",settings:"Settings"},cameras:{addCamera:"Add camera",pipActive:"PiP active",reorderEnable:"Reorder",reorderDisable:"Unlock",live:"Live",noCameras:"No cameras configured",noIntegrations:"No integrations configured. Add a system to get started.",createSystem:"Create system",importFrom:"Import cameras from",importSuccess:"Import complete",importCount:"{{count}} cameras imported",selectCamerasToImport:"Select cameras to import",selectAll:"Select all",deselectAll:"Deselect all",importSelected:"Import {{count}} selected",noCamerasFound:"No cameras found",play:"\u25b6 Play",paused:"Paused",noDataForDate:"No data for this date",recordingNotAvailable:"Recording not available",noEventsReel:"No recent events",settings:"Settings",highlightMotion:"Motion Highlight",highlightOnMotion:"Highlight on motion",highlightAudio:"Audio Highlight",audioMode:"Mode",audioModeOff:"Off",audioModeSensor:"Sensor",audioModeLevel:"Level",audioPreset:"Audio Preset",audioPresetCustom:"Custom",audioPresetCrying:"Crying / baby",audioPresetAlarm:"Alarm / siren",audioPresetDog:"Dog barking",audioPresetDoorbell:"Doorbell / knock",audioPresetGlass:"Glass break",audioWindow:"Window (s)",audioThreshold:"Threshold (dB)",audioHitPercentage:"Hit (%)",audioHoldSeconds:"Hold (s)",highlightDetection:"Object Detection Highlight",highlightOnDetection:"Highlight on detection",detectionClasses:"Classes",holdSeconds:"Hold (s)",rtspNotSupportedWeb:"RTSP streams are not supported on web. Use the mobile app.",liveDetections:"Live detections",filterTimeline:"Filter timeline",filterClasses:"Filter classes...",filterBySeverity:"Filter by severity",severityAlert:"Alert",severityDetection:"Detection",statusPosition:"Status Indicators Position",today:"Today",yesterday:"Yesterday",timeline:"Timeline",timelineEventsClusterEvents:"Events",selectDate:"Select a date",videoclipsNotSupported:"Videoclips not supported for this camera",noVideoclipsForDate:"No videoclips for this date",endOfList:"End of list",backToLive:"Back to live",goLive:"Go live",loadingClip:"Loading clip...",clusterDetailShowBbox:"Show bounding box on image",clusterDetailOpenVideoclip:"Open videoclip",clusterDetailLoadingEvents:"Loading events...",devices:"Devices",noAssociatedDevices:"No devices linked. Configure in Settings > Cameras.",timelineData:"Timeline data",timelineDataHint:"What to show on the timeline.",timelineDataVideoclips:"Videoclips",timelineDataAdvancedNotifier:"Advanced Notifier",timelineDataEvents:"Events",timelineEvents:"Timeline events",timelineEventsHint:"Which event types to show on the timeline, by severity.",timelinePresetAll:"All",timelinePresetImportant:"Important",timelinePresetCritical:"Critical",timelinePresetCustom:"Custom",statusBlock:"Status Block",sensorsBlock:"Sensors Block",position:"Position",indicators:"Indicators",downloadSnapshot:"Download Snapshot",exportDownloadClip:"Download Clip",exportRecordingWebOnly:"Recording export (web only)",exportSnapshot:"Export Snapshot",intercomError:"Intercom error",multiCam:"Multi-Camera",ptzNotSupported:"PTZ not supported",ptzSelectPreset:"Select PTZ Preset",snapshotFailed:"Snapshot failed"},events:{loading:"Loading events...",filterByLabel:"Filter by label",filterByLabelPlaceholder:"e.g. person, doorbell",filterByCamera:"Filter by camera",date:"Date",source:"Source",cameras:"Cameras",groupingRange:"Grouping",groupingPresetMinutes:"{{m}} min",groupingCustom:"Custom",groupingCustomMinutes:"Minutes",groupingCustomApply:"Apply",today:"Today",noCamerasFromConfig:"Cameras loaded from EventsApp config",all:"All",typesCount:"{{count}} types",camerasCount:"{{count}} cameras",cols:"cols",sourceAuto:"Auto",sourceNVR:"NVR",sourceFrigate:"Frigate",sourceVideoClips:"VideoClips API",sourceRawDetection:"Raw",sourceAdvancedNotifier:"Advanced Notifier",noScryptedIntegration:"Add a Scrypted integration in Settings to view events.",frigateNoEvents:"Events are only available for Scrypted. Select a Scrypted instance in Settings.",noSource:"Add a Scrypted or Frigate integration in Settings, then select it as the Events/Videoclips source.",loadError:"Error loading events",noEvents:"No events for this date. Try changing the date or filters.",clearCacheTitle:"Clear cache",clearCacheMessage:"Clear all cached events and videoclips data? This will force a fresh fetch on next load.",clearCacheConfirm:"Clear",columnsPerRow:"Columns per row",onlyWithClips:"Only with clips",relatedClip:"Related Clip"},settings:{integrations:"Integrations",camstackProxy:"CamStack Proxy",scrypted:"Scrypted",frigate:"Frigate",rtsp:"RTSP",homeAssistant:"Home Assistant",name:"Name",baseUrl:"Base URL",urlLocal:"Local URL",urlPublic:"Public URL",username:"Username",password:"Password",token:"Token (optional)",frigateTokenHint:"Token (optional): JWT from browser",tokenRequired:"Token",testConnection:"Test connection",testLocal:"Test Local",testPublic:"Test Public",testMqtt:"Test MQTT",connectionOk:"Connection successful",connectionError:"Connection failed",scryptedCredentialsPromptTitle:"Scrypted login",scryptedCredentialsPromptSubtitle:"Enter your Scrypted username and password to connect.",scryptedCredentialsPromptSkip:"Skip for now",usernamePlaceholder:"admin",save:"Save",tabStream:"Stream & playback",tabGeneral:"General",data:"Data",clearCacheEventsClips:"Clear events & videoclips cache",eventsClipsSourceHint:"Source for Events and Videoclips tabs.",hubReelTitle:"Hub & Reel",reelIntegrationsHint:"Choose which integrations to use for the reel.",reelScryptedSourceHint:"When using Scrypted: event source for reel.",eventsClipsAuto:"Auto",eventsClipsNoInstance:"Add a Scrypted or Frigate integration first.",exportBackup:"Export backup",exportError:"Export failed",importBackup:"Import backup",importConfirm:"This will replace all cameras, integrations and settings with the backup data. Continue?",importSuccess:"Backup restored successfully",importError:"Import failed",uiPrototypes:"UI Prototypes",uiPrototypesHint:"Explore experimental timeline designs",versions:"Versions",appVersion:"App",nativeVersion:"Native",updateNow:"Update now",updateError:"Update failed",updateAvailableTitle:"Update Available",updateAvailableMessage:"A new version of CamStack has been downloaded and is ready to install. The app will restart to apply the update.",updateInstall:"Install & Restart",updateLater:"Later",tabIntegrations:"Integrations",tabCameras:"Camera settings",theme:"Theme",themeSystem:"System",themeLight:"Light",themeDark:"Dark",language:"Language",languageSystem:"System",languageEn:"English",languageIt:"Italiano",timelineMode:"Timeline Mode",timelineModeClassic:"Classic",timelineModeTheater:"Theater",timeline:"Timeline",timelineVisible:"Show detection timeline",timelineVisibleDescription:"Display the detection timeline panel in the camera view.",clusterSize:"Cluster card size",snapshotInterval:"Snapshot refresh interval",clusterSizeXS:"XS",clusterSizeS:"S",clusterSizeM:"M",clusterSizeL:"L",clusterSizeXL:"XL",highlightAppearance:"Highlight appearance",highlightAppearanceHint:"Color and border thickness for motion, audio, and detection highlights on camera streams.",highlightMotion:"Motion",highlightAudio:"Audio",highlightDetection:"Detection",highlightColor:"Color",highlightThickness:"Thickness",selectSection:"Select section",addSystem:"Add system",selectPlatform:"Select platform",deleteInstance:"Delete instance",deleteInstanceConfirm:"Are you sure you want to delete this instance?",delete:"Delete",mqttEvents:"MQTT - Real-time events",mqttBrokerUrl:"MQTT broker URL",mqttUsername:"MQTT username",mqttPassword:"MQTT password",mqttTopicPrefix:"Topic prefix (default: frigate)",mqttOptional:"Optional",scryptedAddressAlreadyUsed:"This Scrypted address is already configured. Only one instance per address is allowed.",scryptedAdvancedNotifierRequired:"The Advanced Notifier plugin is required for the connection.",scryptedCorsTitle:"CORS configuration required (Web)",scryptedCorsBody:"In Scrypted, open the Cloud plugin settings and add your domain ({{domain}}) to the CORS Allowed Origins list. Without this, the browser will block requests to your Scrypted server.",scryptedUrlHint:"Local URL is tried first (e.g. on LAN), then public URL. At least one required.",gridLayout:"Grid layout",gridLayoutHint:"Display options for the cameras grid.",gridColumns:"Grid columns",gridColumnsHint:"Number of cameras per row. Auto = 1 on mobile, 4 on tablet.",gridShowName:"Show camera name",gridShowState:"Show state (battery, recording, sleeping)",reorderCameras:"Reorder cameras",reorderCamerasHint:"Drag to reorder cameras",reorderDone:"Done",manageCameras:"Manage cameras",manageCamerasHint:"Remove cameras from the app.",downloadSnapshot:"Download snapshot",snapshotFailed:"Could not fetch snapshot",exportSnapshot:"Snapshot",exportDownloadClip:"Download clip",exportStartRecording:"Start recording",exportStopRecording:"Stop recording",exportRecordingWebOnly:"Recording available on web",intercomError:"Intercom unavailable. Check camera credentials in Scrypted.",deleteCamera:"Remove camera",deleteCameraConfirm:"Remove {{name}} from the app?",streamPlayback:"Stream & playback",playOnOpen:"Start stream when opening camera",playOnOpenHint:"Automatically load the live stream when you open a camera.",audioOnOpen:"Unmute audio when opening",audioOnOpenHint:"Play audio when opening a camera (if supported).",streamWatchdog:"Stream watchdog",streamWatchdogHint:"Restart stream when no data received (helps with stalled connections).",cameraPlayer:"Camera player",webViewCameraDetail:"Use WebView player",webViewCameraDetailHint:"Use WebView for Scrypted cameras (faster first frame, more stable). PiP, fullscreen and intercom work. Default: native player.",streamQuality:"Stream quality",streamQualitySingle:"Single camera quality",streamQualityGrid:"Grid quality",qualityAuto:"Auto",qualityHigh:"High",qualityMedium:"Mid",qualityLow:"Sub",auto:"Auto",associatedDevices:"Associated devices",associatedDevicesHint:"Add actuators (lights, switches, covers, etc.) to control from the camera view.",linkedDevices:"Linked",reorderHint:"Use arrows to reorder",addDevice:"Add device",noEligibleDevices:"No Scrypted or Home Assistant configured. Add an integration first.",configureDevices:"Configure devices",cameraSettingsHint:"Choose a camera to configure its specific options.",noCamerasConfigured:"No cameras configured.",searchDevices:"Search devices...",source:"Source",type:"Type",all:"All",noMatchingDevices:"No devices match the filters.",frigateStream:"Frigate Stream",frigateStreamSourceHint:"Stream source: WebRTC (default), RTSP, or MJPEG.",frigateStreamMapping:"Stream mapping (go2rtc names from config)",frigateStreamMappingHint:"Select from available go2rtc streams. Order: Main, Sub, Low.",frigateSelectStream:"Select stream",frigateAddStream:"Add stream",frigateInfo:"Camera info",frigateShowConfig:"Show config",frigateShowGo2rtc:"Show go2rtc",frigateMissingConfig:"Missing baseUrl or cameraName in camera config.",tabLogs:"Logs",logsCount:"{{count}} entries",logsDownload:"Download",logsClear:"Clear",logsEmpty:"No logs yet. Console output will appear here.",logsExportError:"Export failed",logsExportTitle:"Export logs",logsClearConfirmTitle:"Clear logs",logsClearConfirmMessage:"Remove all log entries?",hubAppearanceTitle:"Appearance",hubAppearanceDesc:"Theme, language, timeline and highlights",hubCamerasTitle:"Cameras",hubCamerasDesc:"Grid layout, stream quality and camera management",hubIntegrationsTitle:"Integrations",hubIntegrationsDesc:"Manage Scrypted, Frigate and other systems",hubAdvancedTitle:"Advanced",hubAdvancedDesc:"Data backup and cache management",hubLogsTitle:"Logs",hubLogsDesc:"View and export application logs",hubCacheTitle:"Cache",frigateAutoSnap:"Auto Snapshot",frigateSegmentNav:"Segment Navigation",frigateShowGo:"Show Go2RTC",frigateTimeline:"Timeline",reelCameras:"Reel Cameras",reelCamerasHint:"Select which cameras appear in the events reel",reelDeselectAll:"Deselect All",reelDetectionClasses:"Detection Classes",reelDetectionClassesHint:"Filter events by detection class",reelIncludeRuleArtifacts:"Include Rule Artifacts",reelIncludeRuleArtifactsHint:"Show rule-based events in the reel",reelRuleArtifacts:"Rule Artifacts",reelSelectAll:"Select All",reelBadgeContent:"Badge content",reelBadgePosition:"Badge position",reelBadgeSize:"Badge size",reelBadgeBoth:"Time + Class",reelBadgeTime:"Time only",reelBadgeClass:"Class only",reelBadgeNone:"Hidden",reelBadgeSmall:"Small",reelBadgeMedium:"Medium",reelBadgeLarge:"Large"},reel:{filterMotion:"Motion",filterOnlyRules:"Only rules",filterOnlySensors:"Only sensors",goToMostRecent:"Go to most recent"},v2:{common:{connecting:"Connecting\u2026",online:"Online",offline:"Offline",loadError:"Loading error",create:"Create",back:"Back",on:"On",off:"Off",confirm:"Confirm",cancel:"Cancel",ok:"OK",done:"Done"},cameras:{empty:"No cameras",hubNotAnswering:"The hub isn't answering. Some cameras may belong to a node that is currently offline \u2014 pull to retry.",statusOnline:" \xb7 online",statusOffline:" \xb7 offline",motion:"Motion",doorbell:"Doorbell",doorbellRinging:"Ringing",doorbellLastRing:"Ring {{time}} ago",snapshotLoading:"Loading\u2026",refreshing:"Updating\u2026",stationaryFor:"stationary {{min}}m",manage:"Manage cameras",manageHint:"Drag to reorder. Rename inline. Toggle to show or hide a camera from the list.",arrangeStart:"Reorder the list",arrangeConfirm:"Save this order",arrangeCancel:"Discard these changes",arrangeHint:"Drag the cameras into the order you want, then tap the tick to save it. The tick saves; the cross puts the list back the way you found it. This order is kept on this device only.",reorderHandle:"Drag to reorder",appearance:"Appearance",editList:"Edit list",listOptions:"Camera list options",controlsA11y:"Camera controls",disabledTitle:"Out of service",disabledHint:"Disabled by an administrator",emptyOutOfScope:"No cameras in your access profile",emptyOutOfScopeHint:"Your account has no cameras assigned to it yet. Ask whoever administers this hub to grant you access.",snapshotStale:"Snapshot {{age}} old",hubNotProvisioning:"Hub not answering",reelFilter:"Recent events",reelFilterAll:"Showing every event",reelFilterDefaultHint:"Showing detection events only \u2014 audio and sensor events are hidden",reelFilterCount:"{{count}} event types shown",reelFilterUseDefault:"Default",reelFilterShowAll:"Everything",reelFilterDefaultTag:"Detections",reelFilterCountTag:"{{count}} types",overlayA11y:"Play in the movable window",favourites:"Favourites",locationFilter:"Filter by location",bucketEmpty:"Nothing here yet. Star a camera with the heart, or pick another place above."},cameraDetail:{fallbackName:"Camera #{{id}}",mute:"Mute",unmute:"Unmute",snapshot:"Snapshot",snapshotFailed:"Could not capture a snapshot.",ptz:"PTZ controls",talk:"Talk",fullscreen:"Fullscreen",talkFailed:"Could not start talk-back. Check microphone access.",pip:"Picture in Picture",exitFullscreen:"Exit fullscreen",devices:"Devices",devicesEmpty:"No connected devices.",linkedModeAuto:"Link: Auto (same location)",linkedModeManual:"Link: Manual",close:"Close",deviceOnline:"Online",deviceOffline:"Offline"},grids:{createA11y:"Create grid",empty:"No grids",emptyHint:"Tap + to create your first grid",countNone:"No cameras",countOne:"1 camera",countOther:"{{count}} cameras",defaultName:"New grid",deleteTitle:"Delete grid",deleteConfirm:"Delete \"{{name}}\"? This cannot be undone.",export:"Export",exportAllA11y:"Export all grids",shareA11y:"Share grid",editA11y:"Edit grid",deleteA11y:"Delete grid",linkCopied:"Grid link copied to clipboard",layoutAuto:"Auto",layoutColumns:"{{count}} cols",camerasUnknown:"Cameras not loaded yet",highlightOff:"Highlight off",hiddenCount_one:"{{count}} hidden",hiddenCount_other:"{{count}} hidden",offlineCount_one:"{{count}} offline",offlineCount_other:"{{count}} offline",disabledCount_one:"{{count}} switched off",disabledCount_other:"{{count}} switched off",missingCount_one:"{{count}} unavailable",missingCount_other:"{{count}} unavailable"},gridView:{editA11y:"Edit grid",fallbackTitle:"Grid",notFound:"Grid not found",emptyGrid:"This grid is empty",addCameras:"Add cameras",reorderTitle:"Reorder cameras",reorderA11y:"Reorder cameras",reorderDoneA11y:"Done reordering",allHidden:"All cameras are hidden. Use reorder mode to show some.",dragA11y:"Drag to reorder",hideA11y:"Hide from grid",showA11y:"Show in grid",removeA11y:"Remove from grid",adhocTitle:"Quick grid",cellActions:"Camera actions",cellActionsA11y:"More actions for this camera",cellDevicesA11y:"Linked devices",cellMenuA11y:"View options"},gridBuilder:{title:"Edit grid",nameLabel:"Name",namePlaceholder:"Grid name",camerasSelected:"Cameras ({{count}} selected)",optionsTitle:"Options",showName:"Show camera name",export:"Export grid",orderSection:"In the grid",orderHint:"Drag to reorder",emptyOrder:"No cameras yet \u2014 add some below.",addSection:"Add cameras",removeA11y:"Remove from grid",addA11y:"Add to grid",highlightMotion:"On motion",highlightAudio:"On audio",highlightAudioLow:"Low",highlightAudioMid:"Mid",highlightAudioHigh:"High",highlightAudioSensor:"Presence",highlightAudioLevel:"Level",highlightThreshold:"Threshold",highlightHold:"Hold",highlightDetection:"On detection",clusterLabel:"Cluster label",clusterLabelIcon:"Icon",clusterLabelText:"Text"},gridBar:{back:"Back",pauseAll:"Pause all",playAll:"Play all",audio:"Audio",quality:"Stream quality",layout:"Layout",timeline:"Timeline",highlightMenu:"Highlight & overlays",activeOnly:"Active only",share:"Share grid",edit:"Edit grid",hide:"Hide controls",show:"Show controls",muteAll:"Mute all",unmuteAll:"Unmute all"},gridMenu:{highlightMaster:"Highlight borders"},gridShare:{title:"Share \"{{name}}\"",quality:"Stream quality",layout:"Layout",showNames:"Show camera names",activeOnly:"Active cameras only",boxes:"Bounding boxes",highlightEnable:"Highlight",audioSummary:"Audio starts on for {{count}} camera(s)",ttlTitle:"Link expires",ttl_1d:"1 day",ttl_7d:"7 days",ttl_30d:"30 days",ttl_never:"Forever",tokenNotice:"The link includes a view-only access token limited to these cameras. Anyone with the link can watch until it expires or is revoked.",copyLink:"Copy link",creating:"Creating link\u2026",copiedExpires:"Link copied \u2014 expires {{date}}",copiedNever:"Link copied \u2014 never expires",error:"Could not create the share link. Check the connection and try again.",optionAuto:"Auto"},gridControls:{play:"Play",pause:"Pause",mute:"Mute",unmute:"Unmute",quality:"Quality",layout:"Layout",layoutAuto:"Auto"},events:{comingSoon:"Events \u2014 coming soon",searchLabel:"Search label\u2026",searchSubmit:"Search",searchClear:"Clear search",empty:"No events",today:"Today",yesterday:"Yesterday",weekdayShort:{sun:"Sun",mon:"Mon",tue:"Tue",wed:"Wed",thu:"Thu",fri:"Fri",sat:"Sat"},filteredEmpty:"No matches in the loaded range",loadOlder:"Load older",selectPrompt:"Select an event to see its detail",filters:"Filters",more:"More",all:"All",day:"Day",sort:"Sort",sortTime:"Newest",sortImportance:"Importance",flaggedOnly:"Flagged",flaggedOnlyHint:"Favourited, debug, or marked for training",parked:"Parked",showStationary:"Show stationary",showStationaryHint:"Off = hide parked promotions",cameras:"Cameras",classes:"Classes",attributes:"Detected",attrFaces:"Faces",attrPlates:"Plates",attributesHint:"None = all",search:"Search",searchCameras:"Search cameras\u2026",searchClasses:"Search classes\u2026",allCamerasHint:"None = all",allClassesHint:"None = all",done:"Done",density:"Density",selectHint:"Select an event",unrecognizedFace:"Face detected, not recognised",eventKinds:"Event types",displayOptions:"Display",displayTitle:"Display options",useDefaultClasses:"Default"},settings:{themeSystem:"System",themeDark:"Dark",themeLight:"Light",server:"Server",account:"Signed in as",accountUnknown:"Loading\u2026",roleAdmin:"Admin",roleViewer:"Viewer",hubActive:"Active hub",changeServer:"Change server",signOut:"Sign out",network:"Network",networkNone:"No routes probed yet",endpointUnlikely:"Unlikely usable",activeRoute:"Route in use",routeChannelLan:"LAN (direct)",routeChannelPublic:"Public tunnel",routeChannelLoopback:"Local (loopback)",routeChannelUnknown:"Unrecognised",routeReasonInitial:"configured, not yet raced",routeReasonRaceWon:"fastest in the route race",routeReasonNoWinner:"fallback \u2014 no candidate answered",routeReasonUnchanged:"unchanged since the last probe",routeReasonDisposed:"no transport",reprobe:"Re-probe routes",reprobing:"Probing\u2026",diagnoseNetwork:"Diagnose LAN routes",diagnosingNetwork:"Diagnosing\u2026",diagnoseNetworkDone:"{{ok}}/{{total}} answered /health. Open Logs and share them \u2014 look for ipv4/ipv6 http FAIL.",preferredRoute:"Preferred route",routeAuto:"Automatic",routeReasonPinned:"forced in Settings",appearance:"Appearance",theme:"Theme",info:"Info",app:"App",version:"Version",noServer:"No server",footerNote:"CamStack Viewer connects to a single camstack hub. Cameras, grids and events are managed by the server.",language:"Language",langSystem:"System",gridDefaults:"Grid defaults",showName:"Show camera name",showNameHint:"Overlay the camera name on each tile",showState:"Show status badge",showStateHint:"Show online / recording state on each tile",columns:"Columns",cameraOrder:"Camera order",orderName:"By name",orderCustom:"Custom",motionHold:"Motion highlight linger",motionHoldHint:"Keep a tile's motion highlight lit this long after motion stops.",motionHoldOff:"Off",streamQuality:"Stream quality",streamDefaults:"Stream defaults",playOnOpen:"Play on open",playOnOpenHint:"Start the live stream when a camera opens",audioOnOpen:"Audio on open",audioOnOpenMode:{"last-selected":"As you left it",on:"Always on",off:"Always off"},audioOnOpenModeHint:{"last-selected":"Each camera opens the way you last left it. A camera you have never chosen on opens silent.",on:"Every camera opens with sound.",off:"Every camera opens silent."},snapshotInterval:"Snapshot refresh",highlightAppearance:"Highlight appearance",highlightMotionColor:"Motion color",highlightAudioColor:"Audio color",highlightDetectionColor:"Detection color",highlightThickness:"Border thickness",qualityAuto:"Auto",qualityHigh:"High",qualityMid:"Medium",qualityLow:"Low",secondsValue:"{{count}}s",advanced:"Advanced",clearCache:"Clear cache",clearCacheHint:"Free up snapshots and cached data (keeps your server and settings)",clearCacheConfirmTitle:"Clear cache?",clearCacheConfirmBody:"This removes cached images and query data. Your server, sign-in and settings are kept.",clearCacheDone:"Cache cleared",exportSettings:"Export settings",exportSettingsHint:"Copy your settings as JSON",exportSettingsDone:"Settings copied as JSON",shareTitle:"Share settings",shareHint:"Save a named snapshot of this device's settings, grids and camera prefs on the hub. Anyone signed in can import it \u2014 it replaces what is on this device.",shareNamePlaceholder:"Snapshot name",shareSave:"Save",shareEmpty:"No snapshots yet",shareImportTitle:"Import this snapshot?",shareImportBody:"\"{{name}}\" will replace settings, grids and camera prefs on this device.",shareDeleteTitle:"Delete this snapshot?",shareDeleteBody:"\"{{name}}\" will be removed from the hub.",shareFailed:"Could not share settings",shareInvalid:"That snapshot is not a valid settings document.",shareMissing:"That snapshot is no longer on the hub.",viewLogs:"View logs",viewLogsHint:"Recent in-app log messages",logsEmpty:"No logs recorded yet",keepLogs:"Keep logs",keepLogsHint:"Record a rolling buffer of in-app log messages",debugMode:"Debug mode",debugModeHint:"Verbose logs across live, playback and scrub \u2014 sent to the server",logsClear:"Clear",resetSettings:"Reset settings",resetSettingsHint:"Restore all defaults",resetConfirmTitle:"Reset settings?",resetConfirmBody:"This restores all settings to their defaults.",cancel:"Cancel",confirm:"Confirm",timeline:"Timeline",reel:"Event reel",reelThumbSize:"Reel thumbnail size",reelThumbSizeHint:"Size of the tiles in the Recent events reel.",reelSizeSmall:"Small",reelSizeMedium:"Medium",reelSizeLarge:"Large",reelShowLabels:"Show labels",reelShowLabelsHint:"Show the class/identity label on reel items.",reelLabelStyle:"Class display",reelLabelStyleHint:"Show the detection class as an icon or as text on reel items.",reelShowImportance:"Show importance",reelShowImportanceHint:"Show the importance badge on reel items.",events:"Events",eventsPage:"Events page",minImportance:"Minimum importance",minImportanceHint:"Hide events scored below this across the events page and the camera timeline.",minImportanceOff:"Off",tileShowLabels:"Show labels",tileShowLabelsHint:"Show the class / identity / audio labels on event cards.",tileShowImportance:"Show importance",tileShowImportanceHint:"Show the importance badge on event cards (when scored).",tileShowCameraName:"Show camera name",tileShowCameraNameHint:"Show the camera name in the event card footer.",tileLabelStyle:"Class display",tileLabelStyleHint:"Show the detection class as an icon or as text.",tileLabelStyleIcon:"Icon",tileLabelStyleText:"Text",comingSoon:"Coming soon",cameras:"Cameras",manageCameras:"Manage cameras",manageCamerasHint:"Rename, hide, reorder",notifications:"Notifications",notificationsManage:"Manage notifications",pinchExpandsHeight:"Pinch enlarges the view",pinchExpandsHeightHint:"Pinching to zoom also grows the video taller (crops the side edges on 16:9 cameras).",navBarOnStream:"Navigation bar on a single camera",navBarOnStreamHint:"Keep the main navigation visible while watching one camera. On wide windows the side navigation is already there.",reopenLastCamera:"Reopen the last camera",reopenLastCameraHint:"Start on the camera you were watching. Only if watching it was the last thing you did \u2014 going to another page clears it.","timeline.gapPercent":"Cluster gap (%)","timeline.sizePercent":"Cluster size (%)","timeline.indicatorPositionPct":"Indicator position (%)","timeline.showImportance":"Show importance on items","timeline.showClass":"Show detection class on items","timeline.cardWidthPct":"Card width (%)",hapticsUiFeedback:"Vibrate on press",hapticsUiFeedbackHint:"A short buzz confirms buttons, switches, PTZ and player controls. Native only (iOS/Android).",buildNumber:"Build",runtimeVersion:"Runtime",runningBundle:"Running bundle",checkUpdates:"Check for updates",checkingUpdates:"Checking\u2026",updateUpToDate:"You're on the latest version.",updatesDisabled:"Updates are disabled in this build.",updateReadyTitle:"Update downloaded",updateReadyBody:"Restart the app now to apply it?",updateCheckFailed:"Could not check for updates",listOverlays:"Camera cards",listMotionBorder:"Motion ring",listMotionBorderHint:"Pulse a ring around a card while the camera sees motion.",listMotionBadge:"Motion badge position",listOccupancy:"Occupancy position",useNativeRenderer:"Use the built-in renderer",useNativeRendererHint:"Render Recent and Events inside the app instead of loading the hub-hosted embed.",toolbarDensity:"Toolbar height","toolbarDensity.small":"Small","toolbarDensity.medium":"Medium","toolbarDensity.large":"Large",general:"General",templateFollowTitle:"Follow this template?",templateFollowBody:"This device will take the latest version of \u201c{{name}}\u201d automatically. Its shared settings will be replaced, now and every time the template changes.",templateFollowing:"Following this template",templateProducing:"This device keeps it updated"},nc:{title:"Notifications",tabs:{rules:"Rules",targets:"Targets",snooze:"Snooze"},rulesPlaceholder:"Notification rules will appear here.",targetsPlaceholder:"Delivery targets will appear here.",rules:{add:"New rule",empty:"No rules yet.",loadError:"Couldn't load rules. Pull to retry.",mine:"My rules",admin:"Admin rules",system:"System events",personalBadge:"Personal",adminBadge:"Admin",edit:"Edit",delete:"Delete",cancel:"Cancel",deleteConfirmTitle:"Delete rule?",deleteConfirmMessage:"Delete \"{{name}}\"? This can't be undone.",receiveOn:"Receive on {{name}}",noOwnedTargets:"This rule doesn't deliver to any of your targets.",section:{empty:{timelapse:"No timelapses yet. A timelapse turns a night of recorded footage into a short video and sends it when the window closes \u2014 pick the cameras and the hours.",summary:"No summaries yet. A summary collects the best shot of everything that passed in front of several cameras and sends one image."},create:{timelapse:"New timelapse",summary:"New summary"},timelapse:"Timelapse",summary:"Summary"},mediaBadge:{attach:{"best-matching":"Matching image",keyFrame:"Key frame",none:"No image"},frame:{full:"Whole scene",boxed:"Boxed scene"},zoneCrop:"Zone crop",gif:"GIF",clip:"Clip",profile:"{{profile}} quality"},editor:{createTitle:"New rule",editTitle:"Edit \"{{name}}\"",basics:"Basics",nameLabel:"Name",namePlaceholder:"e.g. Front door people",triggerLabel:"Trigger",priorityLabel:"Priority",targetsLabel:"Deliver to",noTargets:"You have no targets yet. Add one under the Targets tab first.",pickTarget:"Pick at least one target.",conditionsLabel:"Conditions",section:{rule:"Rule",devices:"Cameras",conditions:"Conditions",notification:"Notification",actions:"Actions",advanced:"Advanced"},kindSection:{detection:"Conditions",sensor:"Conditions",sound:"Sound",occupancy:"Occupancy","device-events":"Device events",system:"Events",alarm:"Alarm events",mixed:"Events"},kindBlurb:{detection:"A person, vehicle or animal the camera saw. Narrow it by class, zone, face or plate; everything else is optional.",sensor:"A doorbell press or a linked sensor changing state. The picture comes from the camera the sensor is attributed to.",sound:"Fires on a confirmed window of audio, never on a picture. Name the sounds and/or keep a level threshold \u2014 with neither it can never match.",occupancy:"Fires when the count in a camera frame or a zone crosses your threshold and holds. Pick the camera first \u2014 the zone list is that camera's.","device-events":"A device or its stream going away or coming back, switched off or on, a battery or consumable running low, a camera detecting nothing. There is no frame to attach.",system:"The installation itself: a node leaving, an addon crash-looping, an update available or installed, a backup or an export finishing.",alarm:"The alarm panel: refused, arming, armed, entry delay, triggered, re-armed, sensor bypass, disarmed.",mixed:"This rule mixes events from more than one family (device events, system, alarm). It keeps firing as it is, but it can no longer be edited: create one rule per family, then delete this one."},dropTitle:"These will be removed when you save",dropHint:"This kind of rule can't use them, so keeping them would leave the rule silent.",condition:{systemEvent:"System event",sensorKinds:"Sensor kinds",eventTypeTokens:"Event-type tokens",source:"Detection source",classes:"Object classes",classesExclude:"Excluded classes",minConfidence:"Minimum confidence",zones:"Detection zones",zonesExclude:"Excluded detection zones",customZones:"Custom zones",crossing:"Zone crossing",labelEquals:"Label equals",identities:"Known faces",identitiesExclude:"Excluded faces",plates:"Known plates",devices:"Cameras",minLabelConfidence:"Minimum label confidence",minImportance:"Minimum importance",minDwellSeconds:"Minimum dwell (seconds)",deviceState:"Device state",scene:"Scene state",packagePhase:"Package phase",occupancy:"Occupancy",audio:"Sound",schedule:"Schedule",sensorTransition:"Notify when",devicesExclude:"Excluded devices"},noConditions:"No conditions available.",notForTrigger:"Not for this trigger",notForTriggerHint:"Not evaluated for the selected trigger \u2014 switch the trigger to use it.",mediaLabel:"Media",attachLabel:"Attachment",frameLabel:"Picture shows",frame:{cropped:"The subject",full:"The whole scene",boxed:"The scene, with boxes"},zoneCropLabel:"Crop to the zone",zoneCropHint:"Crop the picture to the rule's zone instead of the subject or the whole scene.",gifLabel:"Attach a GIF",gifHint:"A short animation cut from the live buffer around the moment \u2014 the camera does not have to be recording.",clipLabel:"Attach a video clip",clipHint:"An MP4 of the same cut. Destinations that take no video still get the picture.",preRollLabel:"Seconds before",postRollLabel:"Seconds after",profileLabel:"Footage quality",profile:{auto:"Automatic",high:"High",mid:"Medium",low:"Low"},templateLabel:"Message (optional)",templateTitleLabel:"Title",templateBodyLabel:"Body",templateHint:"Leave both blank for the hub's own wording.",save:"Save changes",create:"Create rule",addValue:"Add value\u2026",removeTag:"Remove {{value}}",clear:"Clear",noCameras:"No cameras available \u2014 the rule applies to all devices.",noCamerasRequired:"No cameras available.",devicesLoading:"Loading cameras\u2026",devicesUnavailable:"The hub did not return its cameras \u2014 selected ones are listed by id so they can still be removed.",deviceRemoved:"Device #{{id}} \u2014 removed",deviceUnknown:"Device #{{id}}",devicesEmptyWidens:"No camera selected: the rule will apply to ALL cameras.",plateText:"Plate text\u2026",maxDistance:"Max distance",waitForEnhancementLabel:"Wait for recognition",waitForEnhancementHint:"On: one notification at the end of the track, with the name. Off: one straight away without the name, plus a second one if the name arrives before the track ends.",recognition:{plates:{off:"Any vehicle",anyKnown:"Any plate",specific:"These plates",offHint:"The rule does not care about the plate \u2014 a vehicle whose plate could not be read matches too.",anyKnownHint:"Only vehicles whose plate was actually read, whatever it said.",specificHint:"Only these plates, matched tolerantly \u2014 plate reading is never perfect."}},customZones:{empty:"No custom zones yet. Pick a camera and draw one.",pickCamera:"Camera to draw over",noCameras:"No online cameras to draw over.",draw:"Draw zone",zoneLabel:"Zone {{index}} ({{count}} pts)",remove:"Remove zone {{index}}",title:"Draw zone \u2014 {{name}}",hint:"Tap to add points, drag a point to move. Tap the first point to close.",loading:"Loading frame\u2026",cancel:"Cancel",clear:"Clear",close:"Close",confirm:"Confirm"},addWindow:"Add window",scheduleAlways:"Always active \u2014 add a window to restrict when the rule fires.",scheduleInvert:"Active outside the windows",delivery:{immediate:"Immediate",trackEnd:"Track end",deviceEvent:"Device event",packageEvent:"Package event",systemEvent:"System event"},systemKinds:{"device-online":"Device online","device-offline":"Device offline","device-disabled":"Device switched off","device-enabled":"Device switched on","camera-online":"Camera online","camera-offline":"Camera offline","camera-disabled":"Camera switched off","camera-enabled":"Camera switched on","stream-online":"Stream online","stream-offline":"Stream offline","node-online":"Node online","node-offline":"Node offline","node-inference-unavailable":"Node has no usable inference device","detection-blind":"Camera detecting nothing","addon-crash-loop":"Addon crash loop (runner gave up)","alarm-arm-refused":"Alarm arming refused","alarm-arming":"Alarm arming","alarm-triggered":"Alarm triggered","alarm-armed":"Alarm armed","alarm-disarmed":"Alarm disarmed","addon-update-available":"Addon update available","server-update-available":"Server update available","addon-updated":"Addons updated","server-updated":"Server updated","export-completed":"Export completed","device-battery-low":"Battery low","device-battery-normal":"Battery recovered","device-consumable-low":"Consumable running low","device-consumable-normal":"Consumable replaced","device-tank-low":"Tank low (water, detergent)","device-tank-full":"Tank full (dirty water, dust)","device-tank-normal":"Tank back to normal","alarm-check-failed":"Alarm armed without checking openings","alarm-pending":"Alarm entry delay started","alarm-rearmed":"Alarm re-armed","alarm-sensor-bypass":"Alarm sensor bypassed or restored","wrapper-update-available":"Container image update available","backup-completed":"Backup completed"},systemGroups:{"device-state":"Device state",streams:"Streams",battery:"Battery",consumables:"Consumables",tanks:"Tanks","detection-blind":"Detecting nothing",nodes:"Nodes",addons:"Addons",updates:"Server & container updates","backups-exports":"Backups & exports",alarm:"Alarm"},systemFilters:{cameras:"Only when triggered by these cameras (optional)",deviceTypes:"Only these device types (optional)",nodes:"Only these nodes (optional)",packages:"Only these packages (optional)",devices:"Only these devices (optional)",excludeDevices:"Never these devices (optional)",excludeHint:"Applied after the list above: a device here is never reported, whatever else matches.",noExcluded:"No device excluded",batteryTypesWarning:"Battery and consumable alerts are narrowed by device type here. Batteries and consumables belong to sensors, containers, vacuums and mowers \u2014 rarely to a camera \u2014 so a type filter meant for liveness silences them. Leave the types empty, or put these kinds in a device rule of their own.",thresholdsHint:"The battery threshold and reminders are cluster settings (admin UI \u2192 post-analysis settings). A consumable\u2019s threshold is this rule\u2019s own.",consumableThreshold:"Consumable low at (%)",consumableThresholdHint:"This rule is told when a consumable\u2019s remaining life reaches this percentage (empty = {{defaultPercent}}%). Another rule may use its own number \u2014 each is told at its own threshold. A device that reports \u201creplace\u201d is announced whatever this says.",consumableThresholdInvalid:"A whole number from {{min}} to {{max}} \u2014 this value is not saved.",alarmSettings:"Alarm settings",alarmTriggeredMedia:"When a rule sets the alarm off, this notification carries that rule's pictures.",mixedNone:"No event selected"},media:{best:"Best image",bestMatching:"Best matching",keyFrame:"Key frame",none:"No attachment"},source:{any:"Any",pipeline:"Pipeline",onboard:"Onboard",sensor:"Sensor",audio:"Audio"},phase:{delivered:"Delivered","picked-up":"Picked up",both:"Both"},group:{scope:"Scope",class:"Detections",zones:"Detection zones",quality:"Quality",label:"Identity & plates",device:"Device event",package:"Package",system:"System events",schedule:"Schedule",occupancy:"Occupancy",audio:"Sound"},taxonomy:{person:"People",vehicle:"Vehicles",animal:"Animals",audio:"Audio",sensor:"Sensors",control:"Controls",custom:"Custom values",addCustom:"Add a custom value\u2026"},weekday:{mon:"Mon",tue:"Tue",wed:"Wed",thu:"Thu",fri:"Fri",sat:"Sat",sun:"Sun"},crossing:{exit:"Leaving",any:"Either",enter:"Entering",enterHint:"Entries and ordinary movement; never an exit.",exitHint:"Only an exit from a zone.",anyHint:"Entries, exits and ordinary movement."},deviceStateNone:"Not set \u2014 this rule is never gated on another device.",deviceStateSet:"Only while device {{deviceId}} is: {{states}}. Change it from the admin UI \u2014 this app cannot list every device.",sceneGateNone:"Not set.",sceneGateSet:"Only while scene {{sceneId}} is {{state}}.",occupancy:{zoneLabel:"Detection zone",wholeFrame:"\u2014 whole frame \u2014",zonesLoading:"Loading zones\u2026",zonesNeedCamera:"Pick the cameras above to choose one of their zones.",zonesNone:"These cameras have no zones \u2014 the count covers the whole frame.",zoneMissing:"Zone \"{{id}}\" no longer exists on these cameras. The rule still stores it and will never fire until you pick another scope.",classLabel:"Class",anyClass:"\u2014 any class \u2014",classesNone:"The hub sent no class vocabulary \u2014 the count covers every class.",classMissing:"\"{{name}}\" is not a class these cameras report. The rule still stores it and will never fire until you pick another one.",opLabel:"Fires when",op:{"became-occupied":"Became occupied","became-free":"Became free",">=":"Count \u2265","<=":"Count \u2264"},thresholdLabel:"Threshold",countLabel:"Count",sustainLabel:"Hold for (seconds)",sustainInstantHint:"A 0-second hold fires on the very first frame that crosses \u2014 expect repeat notifications from a subject that walks the edge of the zone. 15 seconds is the usual choice.",hint:"Counts confirmed tracked objects from zone analytics. The change must hold for the whole window before it fires; with no snapshot for the camera or zone the rule never fires.",classesDropped:"The class filter ({{classes}}) is dropped on save: an occupancy edge carries one class, so it would only stop this rule from ever firing. Scope the class above instead."},audio:{modeLabel:"How it fires",modeLabelOption:"\ud83d\udd0e Sounds",modeLevelOption:"\ud83d\udcc8 Volume",modeLabelHint:"Fires when enough labelled frames land inside a short window (default 2 in 5 seconds). A single-frame false positive never reaches 2; a real episode usually labels two or three frames. The rule's cooldown is the other throttle.",modeLevelHint:"Fires when the sound stays loud enough for long enough: the window below is the whole condition.",labelsLabel:"Sounds",labelsHint:"Pick at least one. The classifier labels only a frame or two per episode, so a percentage of a window could never confirm them \u2014 this mode counts those frames instead.",confirmHitsLabel:"Confirm after (frames)",confirmHitsHint:"How many labelled frames must land inside the window before a notification is sent. Default 2 \u2014 a single-frame false positive never reaches it.",confirmWindowLabel:"within (seconds)",confirmWindowHint:"The window those frames must share. Default 5 s. Two frames six seconds apart do not confirm.",labelsUnknown:"This rule stores {{labels}}, which this hub does not classify. It is kept as-is; tap it to drop it.",dbLabel:"Louder than (dBFS)",dbHint:"dBFS is negative-going: 0 is full scale, \u221296 is silence \u2014 so a HIGHER number is a NARROWER filter. Measured on this hub, a baby crying reads \u221255 to \u221226 dBFS, so a floor above \u221255 excludes most of it.",hitPercentLabel:"Hits in the window (%)",hitPercentHint:"How much of the window must match before it fires. Default 60%.",samplingLabel:"Window (seconds)",samplingHint:"The window must be FULL before it can match \u2014 a half-open window never fires. Default 10s.",failClosedHint:"Pick at least one sound or set a level floor. With neither, every sample is a hit and the hub refuses the rule rather than notifying on silence.",hint:"Fires on sustained SOUND, not on a picture: a rule with this condition is evaluated only on a confirmed audio window, never on a detection or a track. The cameras it covers need audio analysis enabled."},zonePicker:{needCamera:"Select a camera first \u2014 zones belong to a camera.",loading:"Loading zones\u2026",none:"The selected cameras have no zones.",missing:"Zone {{id}} no longer exists on the selected cameras"},dropReason:{occupancy:{sensorKinds:"An occupancy edge is not a sensor event: it carries no sensor kind, so this condition can never match one.",eventTypeTokens:"An occupancy edge carries no device event-type token \u2014 that comes from an event emitter, which a count crossing has none of.",source:"An occupancy edge is always produced by the pipeline, so any other source can never match and \u201cpipeline\u201d narrows nothing.",sensorTransition:"An occupancy edge is a count crossing, not a sensor reading: it has no raise or clear, so this choice could never narrow it."},sound:{classes:"A sound rule fires on what the camera HEARD. Its subject carries no detection, so this condition can never match one \u2014 name the sounds in the Sound condition instead.",classesExclude:"A sound rule fires on what the camera HEARD. Its subject carries no detection, so there is nothing here to exclude \u2014 name the sounds in the Sound condition instead.",minConfidence:"A sound window\u2019s evidence is a percentage of samples, not a detector score, so a confidence threshold can never be satisfied.",zones:"A sound has no position in the frame, so a zone can never match it.",zonesExclude:"A sound has no position in the frame, so a zone can never exclude it.",customZones:"A sound has no position in the frame, so a drawn area can never match it.",crossing:"A sound has no position in the frame, so it can never cross a zone boundary.",labelEquals:"A sound rule fires on what the camera HEARD. Its subject carries no detection and therefore no label \u2014 name the sounds in the Sound condition instead.",identities:"A sound rule fires on what the camera HEARD. Its subject carries no detection, so there is no face to recognise.",identitiesExclude:"A sound rule fires on what the camera HEARD. Its subject carries no detection, so there is no face to exclude.",plates:"A sound rule fires on what the camera HEARD. Its subject carries no detection, so there is no plate to read.",source:"A confirmed sound window is always stamped as an audio subject, so any other source can never match."},sensor:{sensorTransition:"Only a sensor that raises and clears (water, smoke, gas, CO, vibration, tamper, motion, contact) can fire on one edge. Pick only such sensor kinds, or the rule fires on every change."},detection:{audio:"A detection rule fires on what the camera saw. Sounds are a Sound rule of their own."}},ai:{sectionLabel:"AI description",enabledLabel:"Describe with AI",enabledHint:"Adds one sentence written by a vision model to this notification. It never withholds the notification \u2014 if the model is cold or unreachable, the alert is delivered without the sentence.",blurb:{occupancy:"The model is shown the still and told the count this rule claims, and answers whether that count holds. Your question guides what it looks at; the verdict sentence is written by the hub, so a disagreement always says so.","detection-immediate":"The model is shown the still taken at the moment this rule fired and answers your question about it.","detection-track":"The model is shown the beginning, the best moment and the end of the passage, and answers your question about what happened across them."},profileLabel:"Model",profileAuto:"Automatic",noProfiles:"No vision-capable model is configured on this hub. Add one from the admin Settings before switching this on.",profilesUnavailable:"This hub cannot list its vision models. The section still saves; the hub picks its own default model.",languageLabel:"Answer language",languageAuto:"Hub default",language:{en:"English",it:"Italian"},maxWordsLabel:"Length",maxWordsHint:"About how many words to ask for. It is an instruction to the model, not a cut \u2014 expect roughly this length, occasionally a word or two over. Unset, this rule's targets give {{words}}.",maxWordsVaries:"About how many words to ask for. It is an instruction to the model, not a cut. Your targets do not agree on a default; the strictest of them gives {{words}}, and unset each target gets its own.",promptLabel:"Your question",occupancyContract:"The answer stays a verdict: the hub asks for the count, compares it with this rule's, and writes the confirmation or the refutation itself. Your question guides the model \u2014 it cannot change the answer's format."},unsaved:{title:"Discard changes?",body:"This rule has changes that are not saved.",keep:"Keep editing",discard:"Discard"},unknownSection:"This section does not exist.",missing:"This rule no longer exists. It may have been deleted.",fixedTrigger:"Trigger: {{trigger}} \u2014 a sensor rule fires on the device event itself.",actions:{securityNote:"These actions run on your devices when the rule fires, or when someone taps one of its buttons. Check every step before saving.",problemsTitle:"Not saved until fixed:",sequencesTitle:"Sequences",sequencesEmpty:"No sequence. A sequence is a list of steps run on your devices.",addSequence:"Add sequence",removeSequence:"Remove sequence",sequenceNameLabel:"Name",sequenceNameBase:"sequence",enabledLabel:"Run when the rule fires",enabledOn:"Runs on every match (and from its buttons).",enabledOff:"Runs only when a notification button is tapped.",minDelayLabel:"Minimum delay",minDelayNone:"None",minDelayHint:"The sequence runs at most once in this time, whatever the rule's cooldown.",stepTitle:"Step {{n}}",addStep:"Add step",removeStep:"Remove step",stepKind:{wait:"Wait",cap:"Do"},waitSecondsLabel:"Seconds",deviceLabel:"Device",deviceNone:"Choose a device",deviceChange:"Change",deviceSearchPlaceholder:"Search by name, room or id",deviceMore:"{{count}} more \u2014 narrow the search",deviceNoMatch:"No device matches.",deviceLoading:"Loading devices\u2026",deviceUnavailable:"The hub did not return its devices \u2014 the list cannot be shown right now.",capLabel:"Capability",capNone:"Choose\u2026",capLoading:"Reading the device's capabilities\u2026",capUnavailable:"The device's capabilities could not be read. Type the capability name.",capEmpty:"This device exposes no capability.",capPickDeviceFirst:"Choose a device first.",methodLabel:"Method",methodHint:"The capability method to call, e.g. setState or trigger.",argsLabel:"Arguments",argsHint:"Each argument is checked when you save. JSON takes objects and lists.",addArg:"Add argument",removeArg:"Remove argument",argKeyPlaceholder:"name",argValuePlaceholder:"value",argType:{string:"Text",number:"Number",boolean:"Yes/no",json:"JSON"},buttonsTitle:"Notification buttons",buttonsEmpty:"No button.",buttonsHint:"A button on the notification that runs one of the sequences above.",addButton:"Add button",removeButton:"Remove button",buttonLabelLabel:"Label",buttonDefaultLabel:"Action",buttonSequenceLabel:"Runs",buttonSequenceNone:"Choose a sequence",buttonSequenceMissing:"{{name}} (missing)",buttonIconLabel:"Icon",iconNone:"None",icon:{acknowledge:"Acknowledge",dismiss:"Dismiss",silence:"Silence",snooze:"Snooze",view:"View",play:"Play",open:"Open",close:"Close",lock:"Lock",unlock:"Unlock",arm:"Arm","arm-home":"Arm \u2014 home","arm-away":"Arm \u2014 away","arm-night":"Arm \u2014 night",disarm:"Disarm",light:"Light",alert:"Alert",camera:"Camera"},destructiveLabel:"Destructive style",destructiveHint:"Draws the button in red. It changes how it looks, not who may press it."},readOnly:"This rule is managed by an admin. You can read it here, not change it.",problem:{title:"Not saved yet:",name:"the rule needs a name (Rule)",targets:"pick at least one target (Rule)",actions:"fix the actions (Actions)",summaryFamily:"only device and system rules can be a scheduled summary \u2014 the alarm stays instant (Conditions)",summaryActions:"a summary never matches an event, so its actions would never run \u2014 remove them (Actions)",summaryNoSendTime:"a summary needs at least one send time (Conditions)",summaryDegenerateWindow:"a send time has no day, or its window starts and ends on the same minute \u2014 it would never be sent (Conditions)",summaryActionsByAdmin:"this rule has actions an administrator added; a summary never runs them, so an administrator must remove them before it can be a summary"},mediaBlurb:{sound:"A sound owns no frame, so the picture is a photograph of the camera taken at the moment of the match \u2014 the whole scene, never a crop. The GIF and the clip are cut around the same instant, from the camera.",alarm:"An alarm set off by a rule arrives with THAT rule's pictures, combined into one notification. This rule adds none of its own."},enabledLabel:"Active",enabledHint:"Off keeps the rule and everything it says, but it notifies nobody until it is switched back on.",usersLabel:"Notify users",usersHint:"People who receive this rule on their own devices, besides the targets above. A rule needs at least one target or one user.",usersLoading:"Loading users\u2026",usersUnavailable:"The hub did not return its users \u2014 the list cannot be shown right now.",usersEmpty:"No users on this hub.",throttleLabel:"Frequency",cooldownLabel:"Cooldown (s)",cooldownHint:"After a notification, the same rule stays quiet for this many seconds. 0 = no pause.",groupIdleLabel:"Group bursts (s)",groupIdleHint:"Events arriving within this many seconds of each other are grouped into one notification. 0 = off, each event notifies on its own.",snoozeButtonsLabel:"Snooze buttons",snoozeDefaultsHint:"Not set \u2014 the notification offers the hub defaults ({{defaults}}).",snoozeNoneHint:"No snooze buttons: the notification cannot be silenced from the lock screen.",snoozeChosenHint:"Four at most. Every snooze button takes space from the rule\u2019s action buttons.",snoozeResetDefaults:"Back to hub defaults",snoozeAllowGlobalLabel:"Anyone may snooze for everyone",snoozeAllowGlobalHint:"A snooze is personal by default. On: anyone who receives this rule can snooze it for everyone, not only for themselves.",confirm:{title:"AI confirmation",enabledLabel:"Confirm with AI before notifying",enabledHint:"A vision model looks at the picture about to be sent; the notification goes out only if it agrees.",profileLabel:"Model",profileDefault:"Cluster default",profilesUnavailable:"This hub cannot list its vision profiles \u2014 the cluster default is used.",promptLabel:"Question",promptPlaceholder:"Blank: derived from the rule",expectLabel:"Count must be",expectNone:"Model decides (yes/no)",countLabel:"Count",timeoutLabel:"Timeout (s)",onTimeoutLabel:"If the model does not answer",onTimeout:{fire:"Notify anyway",suppress:"Stay silent"},onTimeoutHint:"Notify anyway is the safe choice: a slow or offline model never swallows a notification."},oneSnapshotOnlyHint:"A sensor rule attaches one snapshot of the camera automatically \u2014 there is no detection to choose a crop, a GIF or a clip around.",linkedCamerasLabel:"Linked cameras",linkedCamerasHint:"Every linked camera is photographed the moment the sensor fires; cameras that are offline or asleep are left out. Mosaic: one image composed from every linked camera. Each: one image per camera where the notifier accepts several, otherwise the first.",linkedCameras:{mosaic:"Mosaic",each:"One per camera"},clipSpeedLabel:"Playback speed",clipSpeedValue:"{{speed}}\xd7",clipSpeedHint:"A notification GIF or clip is glanced at: at 2\xd7 the whole passage takes half the time. 1\xd7 is real time.",timezone:{label:"Time zone",pickerLabel:"Schedule time zone",hub:"Hub time zone",hint:"The clock the schedule windows are read on. Unset = the hub\u2019s own time zone.",placeholder:"e.g. Europe/Rome",invalid:"Not a known time zone \u2014 it is not saved until it is valid."},snoozeExemptHint:"Alarm rule: this rule concerns \u2014 or triggers \u2014 the alarm panel, and no snooze can silence it. Snooze buttons are not offered.",snoozeMaxReached:"At most {{max}} snooze buttons \u2014 remove one first.",unlistedTargetsKept:"Targets not in your list, kept on this rule: {{count}} (another user's, or deleted since). Saving never removes them.",unlistedTargetsRemoved:"Targets no longer available to you, removed when you save: {{count}}.",saveBlocked:{rolePending:"Checking your account before saving\u2026",roleUnknown:"Couldn't confirm your account's role, so this rule can't be saved safely. Go back and open it again.",targetsPending:"Loading your targets before saving\u2026",targetsFailed:"Couldn't load your targets, so this rule can't be saved yet. Go back and open it again."},notConnected:"Not connected to the hub. Reconnect and try again.",hubTooOldToClear:"This hub is too old to clear that field, so the change was not saved. Update CamStack on the hub, then save again.",loadError:"Couldn't load this rule. Go back and open it again.",targetsUnavailable:"Couldn't load your targets. Go back and open this again.",sensorTransition:{both:"It triggers and when it clears",raised:"Only when it triggers",cleared:"Only when it clears",neverFires:"This rule belongs to the alarm, and an alarm rule fires only when an opening OPENS. Set to \u201conly when it clears\u201d, it can never fire.",hint:{both:"Every change: water detected, and back to dry.",raised:"Water detected, smoke, a contact opening \u2014 never the return to normal.",cleared:"Back to dry, smoke gone, a contact closing \u2014 never the alert itself."}},sensorsEmptyWidens:"No sensor selected: the rule will apply to ALL sensors.",sensorsUnavailable:"The hub did not return its sensors \u2014 selected ones are listed by id so they can still be removed.",systemDelivery:{label:"Delivery",instant:"Instant",summary:"Summary",instantHint:"A notification for each event, as it happens.",summaryHint:"Nothing is sent per event. At each time below, one notification lists what is still true for the kinds and filters of this rule \u2014 low batteries, consumables, devices or streams offline, updates available. Nothing to report sends nothing.",customSchedule:"Custom schedule: the summary is sent when each window below ENDS.",addTime:"Add a send time",removeTime:"Remove send time",sendAt:"Send at",bodyWarning:"This body names none of the summary ({{token}} or a section variable) \u2014 the hub appends {{token}} to it when it sends.",splitRule:"One message",splitSection:"One per category",splitHint:"One per category sends a separate notification for each category with something to report \u2014 batteries, consumables, devices offline\u2026 Needs an updated hub; an older one sends one message.",splitBodyWarning:"Sent one per category: this body names no {{token}}, so on every other category\u2019s notification the hub appends {{token}} (that category\u2019s lines)."},summaryNotKept:"This hub does not keep scheduled summaries yet, so the rule was saved as Instant. Update the server, then set the summary again.",advancedConditionsTitle:"Detection"},kind:{all:"All",detection:"Detection",sensor:"Sensor",sound:"Sound",occupancy:"Occupancy","device-events":"Devices",system:"System",alarm:"Alarm",mixed:"To recreate"},kindCreate:{all:"New rule",detection:"New detection rule",sensor:"New sensor rule",sound:"New sound rule",occupancy:"New occupancy rule","device-events":"New device rule",system:"New system rule",alarm:"New alarm rule",mixed:"New rule"},kindEmpty:{all:"No rules yet. Create one to be told what your cameras and sensors see.",detection:"No detection rules yet. Create one to be told what your cameras see.",sensor:"No sensor rules yet. A sensor rule fires on a device event \u2014 a door opening, a switch changing.",sound:"No sound rules yet. A new one opens with a level threshold already set, so you only have to name the sounds and the targets.",occupancy:"No occupancy rules yet. A new one opens on the occupancy condition \u2014 pick the camera first, then the zone and the count.","device-events":"No device rules. One tells you when a device or its stream goes away or comes back, a battery runs low, or a filter, brush or mop pad needs replacing \u2014 on any device, not only cameras.",system:"No system rules. A system rule tells you about the installation itself \u2014 a node going offline, an addon crash-looping, an update, a backup finishing.",alarm:"No alarm rules. One tells you what the alarm panel does \u2014 arming, armed, triggered, disarmed.",mixed:"No rules to recreate."},mustRecreate:"This rule mixes events from more than one family (device events, system, alarm). It still fires, but it can no longer be edited: create one rule per family, then delete this one.",mustRecreateByAdmin:"This rule mixes events from more than one family (device events, system, alarm). It still fires, but it is read-only: an admin must recreate it.",kindPicker:{title:"New rule",subtitle:"What should this rule watch?"},summary:{rule:{targets:"Sends to {{names}}",noTargets:"No target yet"},devices:{all:"Every camera",some:"Cameras selected: {{count}}",except:"Every camera except {{count}}",someExcept:"Cameras selected: {{count}}, minus {{excluded}} excluded",sensorsAll:"Every sensor",sensorsSome:"Sensors selected: {{count}}",sensorsExcept:"Every sensor except {{count}}",sensorsSomeExcept:"Sensors selected: {{count}}, minus {{excluded}} excluded"},conditions:{count:"Conditions set: {{count}}",none:"No condition \u2014 matches everything",classesExcept:"Every class except {{classes}}",classesExceptMore:"Every class except {{classes}} \xb7 conditions set: {{count}}"},notification:{custom:"Custom message \xb7 priority {{priority}}",default:"Hub default message \xb7 priority {{priority}}"},actions:{count:"Sequences: {{sequences}} \xb7 buttons: {{buttons}}",invalid:"Problems to fix: {{count}}",none:"No action"},advanced:{cooldown:"Cooldown {{seconds}} s",wait:"Waits for recognition",none:"Defaults",cooldownWait:"Cooldown {{seconds}} s \xb7 waits for recognition"},deviceList:{all:"All devices",only:"Only these devices ({{count}})",except:"All devices except {{count}}",excludedTitle:"Excluded"}},ai:{defaultPrompt:{occupancy:"Does the claimed count hold?","detection-immediate":"What is in this picture?","detection-track":"What happened during this passage?"}},actions:{args:{invalidJson:"Not valid JSON",invalidNumber:"Not a number",invalidBoolean:"Must be true or false",emptyKey:"The argument needs a name",duplicateKey:"Two arguments share this name"},stepMissingDevice:"A step has no device",stepMissingMethod:"A step has no capability or method",sequenceMissingName:"A sequence has no name",emptySequence:"A sequence has no steps",duplicateSequence:"Two sequences share a name",buttonMissingLabel:"A button has no label",duplicateButton:"Two buttons share an id",buttonMissingSequence:"A button points at a sequence that does not exist",waitOutOfRange:"A wait must be 0\u2013300 seconds",tooManyButtons:"At most 8 buttons",nameTooLong:"A sequence name is longer than 120 characters",labelTooLong:"A button label is longer than 40 characters",idTooLong:"A button id is longer than 64 characters",minDelayOutOfRange:"The minimum delay must be a whole number of seconds, up to 86400"},test:{title:"Test this rule",wouldFire:"Would fire",failed:"Did not match \u2014 the \u201c{{condition}}\u201d condition refused it",notMatched:"Did not match",firingCount:"{{firing}} of {{total}} evaluated records would fire",noRecords:"No records in the last 60 minutes \u2014 nothing to evaluate.",deviceEventUnsupported:"Sensor rules cannot be dry-run: there is no store of past sensor events to replay. The rule still fires live on a matching press or change.",note:"{{condition}}: {{note}}",detail:"\xb7 {{note}}",unavailable:"The test could not be run: {{message}}",dryRun:{button:"Dry-run (last 60 min)",hint:"Evaluates the CURRENT, unsaved rule against records from the last 60 minutes. Nothing is sent.",incomplete:"Give the rule a name and a target before a dry-run.",more:"Showing {{shown}} of {{total}} records.",targetsFailed:"Couldn't load your targets, so the dry-run can't build this rule. Go back and open it again."},now:{button:"Test now",hint:"Builds the event this rule is about, runs the real evaluation and SENDS the notification to every target, marked [TEST]. Cooldown and mute are bypassed; the rule's actions never run. Tests the SAVED rule: save first to test an edit.",confirmTitle:"Send a test notification?",confirmBody:"This really delivers \u201c{{name}}\u201d to every target it addresses, marked [TEST].",confirm:"Send test",queued:"Matched \u2014 notifications queued: {{count}}, targets: {{targets}}. Marked [TEST] in the body.",noneQueued:"Matched, but nothing was queued: every target is opted out of this rule, or it addresses none.",notCandidate:"This rule was not a candidate for a {{trigger}} event \u2014 check its trigger, and that it is enabled.",dropped:"Nothing was evaluated ({{reason}}) \u2014 the event was dropped before any rule was consulted.",still:{live:"With a live snapshot.",unavailable:"The camera returned no snapshot, so it ships text-only.",unattachable:"This kind of rule carries no picture in production either."},title:"Test this rule for real",summary:{queued:"Summary built now \u2014 notifications queued: {{count}}, targets: {{targets}}. Marked [TEST] in the body.",queuedPerCategory:"Summary built now \u2014 notifications queued: {{count}}, one per category ({{sections}}), targets: {{targets}}. Marked [TEST] in the body.",noneQueued:"The summary was built, but nothing was queued: the rule reaches no target (its users are not admins, or every target is opted out).",nothing:"Nothing to report right now \u2014 nothing was sent, exactly as the scheduled summary would send nothing.",sectionRead:"{{section}}: {{items}} open",sectionUnavailable:"{{section}}: unavailable \u2014 the state could not be read"}}},ownTargetsUnavailable:"Couldn't load your targets, so your opt-outs for this rule can't be shown.",offNotice:"Off \u2014 it will not run.",enabledSwitch:"Enabled",enableFailed:"Couldn't switch this rule {{state}}: {{error}}",enableStateOn:"on",enableStateOff:"off",enableNotApplied:"the hub kept its previous state",scope:{all:"All",only:"Only these",except:"All except these",clearedOnSave:"Saving in this mode clears {{items}} from the rule.",legacyExclusions:"This rule also excludes {{items}} \u2014 kept when you save.",removeExclusions:"Remove exclusions",everyDevice:"Every camera \u2014 no restriction.",everyClass:"Every class \u2014 no restriction.",classNotListed:"{{name}} \u2014 not in the class list",classTitle:"Classes",classSearch:"Search classes",classNoMatches:"No class matches",classesEmptyWidens:"No class left: saving applies the rule to every class.",classesUnavailable:"The class list could not be read.",everySensor:"Every sensor \u2014 no restriction.",everyZone:"Every zone \u2014 no restriction.",zoneTitle:"Zones",zonesEmptyWidens:"No zone left: saving applies the rule to every zone.",zonesUnavailable:"The zone list could not be read.",zoneSearch:"Search zones",zoneNoMatches:"No zone matches",zoneNotListed:"{{name}} \u2014 no longer on these cameras",everyPerson:"Anyone \u2014 no restriction.",anyKnownFace:"Any known face",noFaceExcluded:"Nobody excluded",faceTitle:"Faces",facesUnavailable:"The face gallery could not be read.",faceSearch:"Search people",faceNoMatches:"No person matches",faceNotListed:"{{name}} \u2014 not in the gallery",everyLabel:"Any label \u2014 no restriction."},lastRun:{label:"Last run",notInDays_one:"Not in the last day",notInDays_other:"Not in the last {{count}} days",notInHours_one:"Not in the last hour",notInHours_other:"Not in the last {{count}} hours",notInMinutes_one:"Not in the last minute",notInMinutes_other:"Not in the last {{count}} minutes",notInWindow:"Not in the window read",never:"No delivery on record",unavailable:"Last run could not be read",status:{sent:"Sent",pending:"Pending",dead:"Failed"}},history:{action:"History",title:"Deliveries of {{name}}",titleFallback:"Rule deliveries",empty:"No deliveries for this rule",error:"History could not be loaded",deviceById:"Device #{{id}}",noImage:"No image right now",target:"Target",adminOnly:"Only an administrator can see a rule\u2019s deliveries",verdictUnknown:"Could not check your access to this rule\u2019s deliveries",stateSummary:"State summary"},summaryDelivery:{label:"Summary \xb7 {{when}}",custom:"Summary \xb7 custom schedule",daily:"daily",weekdays:"weekdays",weekends:"weekends"},snoozeSwitch:"Snooze 30 min",snoozeFailed:"Couldn't change this rule's snooze: {{error}}"},targets:{add:"Add target",empty:"No targets yet. Add one to start receiving notifications.",loadError:"Couldn't load your targets. Pull to retry.",pickKind:"Choose a notification kind",noKinds:"No notification kinds are available.",kindUnavailable:"unavailable",test:"Send test",testing:"Sending\u2026",testOk:"Test delivered",testFail:"Test failed",edit:"Edit",delete:"Delete",cancel:"Cancel",save:"Save changes",create:"Create target",addTitle:"Add {{kind}} target",editTitle:"Edit {{name}}",deleteConfirmTitle:"Delete target",deleteConfirmMessage:"Delete \"{{name}}\"? This can't be undone.",form:{details:"Details",config:"Configuration",nameLabel:"Name",nameHint:"A label to recognize this target.",secretHint:"Leave blank to keep the saved value."}},snooze:{title:"Snooze",intro:"A snooze silences YOU, not the household \u2014 unless a rule says otherwise. It ends by itself.",activeNone:"Nothing is snoozed.",active:"Silenced now",past:"Recently ended",openTitle:"Silence for",scopeLabel:"What to silence",everything:"Everything",aRule:"One rule",aCamera:"One camera",chooseRule:"Choose a rule",chooseCamera:"Choose a camera",camerasLoading:"Loading your cameras\u2026",noCameras:"No cameras to silence.",globalLabel:"Silence it for everyone",globalHelp:"Other people stop being notified too.",globalNotAllowed:"This rule can only be silenced for you.",summaryLabel:"Tell me what I missed",summaryHelp:"A summary arrives when the window ends.",endNow:"End now",endsIn:"ends in {{label}}",everyone:"for everyone",loadError:"Couldn't load your snoozes.",createError:"Couldn't start that snooze.",classesTitle:"Only these",classesHelp:"Leave this alone and the window covers everything. Pick classes to silence only those \u2014 the rest still reaches you.",everyClass:"Everything",durations:{m10:"10 min",m30:"30 min",h1:"1 hour"},scope:{rule:"One rule",device:"One camera",all:"Everything"},remaining:{ended:"over",minutes:"{{minutes}} min",hours:"{{hours}}h",hoursMinutes:"{{hours}}h {{minutes}}m"},viewOnly:"Your account can see snoozes but not open one."},timelapse:{createTitle:"New timelapse",editTitle:"Edit \u201c{{name}}\u201d",namePlaceholder:"Driveway overnight",enabledLabel:"Active",camerasHint:"One video per camera. A camera that is not recording cannot produce a timelapse \u2014 the hub refuses the save and says which one.",windowLabel:"Window",windowHint:"The hours this covers. The window is the rule: it starts collecting when the window opens and sends the video when it closes.",samplingLabel:"Sampling",cadenceLabel:"One frame every (s)",framerateLabel:"Playback (fps)",previewHint:"What the notification shows before you open the video.",preview:{image:"Still",gif:"GIF"},problem:{devices:"Pick at least one camera.",schedule:"Add at least one window \u2014 a timelapse with no hours never runs.",denseCadence:"The rate near detections must be at least 0.1 s and shorter than the cadence above.",minDwell:"The minimum time must be between 0 and 60 s.",template:"The title can be up to 500 characters, the body up to 2000.",previewText:"The caption can be up to 200 characters.",reportClasses:"Up to 20 classes, each up to 40 characters."},denseCadenceLabel:"Near detections, one frame every (s)",denseCadenceHint:"Around a detection the video samples faster, so a person walking by is more than two frames. Empty means automatic: a thirtieth of the cadence above, at least 1 s. If you set it, it must be shorter than the cadence above.",minDwellLabel:"Minimum time per detection (s)",minDwellHint:"The least amount of video each detection gets; the hub samples faster to reach it. Empty means no minimum.",messageLabel:"Message",messageHint:"Title and body of the notification. Left empty, the hub writes its own.",previewTextLabel:"Preview caption",previewTextHint:"Written over the preview frame. Empty means the default caption: \u201cTimelapse\u201d and the camera name.",reportClassesLabel:"Counted classes",reportClassesHint:"Which detections the notification counts. None selected means every class the window contained.",loadError:"Couldn't load the timelapse rules.",previewTextNoneHint:"This rule is set to show no caption at all (chosen in the web admin). Leave the box empty to keep it that way; type a caption to add one.",captionPreviewLabel:"Caption preview",editorTitle:"Timelapse"},summary:{createTitle:"New summary",editTitle:"Edit \u201c{{name}}\u201d",namePlaceholder:"Overnight round-up",enabledLabel:"Active",camerasHint:"One image covering all of them \u2014 the best shot of everything that passed.",windowLabel:"Window",window:{motion:"On motion",schedule:"On a schedule"},motionHint:"Opens on the first movement at any of these cameras and stays open while more keeps arriving.",scheduleHint:"Fixed hours. The summary is sent when the window closes.",quietLabel:"Close after quiet (s)",maxWindowLabel:"Never longer than (s)",hubTooOld:"This hub only lets an administrator create summaries. You can see them here; update the hub to edit them from the app.",problem:{devices:"Pick at least one camera.",window:"Check the window \u2014 a scheduled summary needs hours, and \u201cnever longer than\u201d has to be greater than the quiet period.",barrier:"The wait for tracks is between 0 and 3600 seconds.",budget:"The AI can look at no more pictures than the mosaic holds (1\u201324 tiles, 1\u20138 for the AI).",filters:"Check what goes in \u2014 no class can be both included and excluded for all, and importance is 0\u20131.",caption:"The caption is at most 200 characters.",template:"The title is at most 500 characters and the text at most 2000.",ai:"Check the AI settings \u2014 question up to 2000 characters, picture 64\u20132048 px, time limit 10\u2013600 s."},editorTitle:"Summary",loadError:"Couldn't load this summary. Check the connection and try again.",section:{content:"What goes in",mosaic:"Mosaic",ai:"AI",delivery:"Delivery"},barrierLabel:"Wait for tracks to close (s)",barrierHint:"A subject's best shot is saved when its track ends. The summary waits up to this long so the ones still moving get a picture.",classesLabel:"Classes",classesHint:"Empty = every class.",classesExcludeLabel:"Excluded classes",classesExcludeHint:"Never in the summary, even when included above.",zonesLabel:"Zones",zonesHint:"Zones apply per camera: picking a zone on one camera does not mute the others.",minImportanceLabel:"Minimum importance",minImportanceHint:"A score from 0 to 1. Empty = no minimum.",minDwellLabel:"Minimum stay (s)",minDwellHint:"Empty = no minimum.",includeStationaryLabel:"Include parked objects",includeStationaryHint:"Off by default: a summary is a record of passages, and a parked car would take every tile.",rankLabel:"When there are too many, keep",rank:{importance:"Most important",recency:"Most recent",dwell:"Longest stay"},maxTilesLabel:"Pictures in the mosaic",captionsLabel:"Text on the mosaic",captions:{none:"None",tiles:"Under each tile",all:"Tiles and caption"},captionsHint:"Text is burnt into the picture for good. \u201cNone\u201d keeps it images only.",captionTextLabel:"Caption",captionTextHint:"Drawn across the top only with \u201cTiles and caption\u201d. Empty means the default caption (the rule name and the window's hours).",captionTextNoneHint:"This summary is set to show no caption at all. Type one to add it; leave it empty to keep none.",aiEnabledLabel:"Describe with AI",aiEnabledHint:"A vision model looks at the window's pictures together and writes what happened into the message.",aiProfileLabel:"Model",aiProfileDefault:"Hub default",aiProfilesUnavailable:"This hub couldn't list its AI models. The one already set is kept.",aiPromptLabel:"Question",aiPromptPlaceholder:"The standard question",aiLanguageLabel:"Answer language",aiLanguage:{default:"Model default",en:"English",it:"Italian"},aiMaxImagePxLabel:"Picture size for the model (px)",aiMaxImagePxHint:"Empty = the hub default.",aiTimeoutLabel:"Time limit (s)",aiTimeoutHint:"Empty = the hub default.",aiOnFailureLabel:"If the AI fails",aiOnFailure:{"deliver-without-text":"Send without the text",skip:"Hold the summary"},aiSkipWarning:"With \u201cHold the summary\u201d, a window whose AI pass fails is not delivered at all \u2014 no mosaic, no counts \u2014 and it does not come back.",maxAiImagesLabel:"Pictures the AI looks at",maxAiImagesHint:"At most as many as the mosaic holds.",deliverEmptyLabel:"Send an empty summary",deliverEmptyHint:"Off: a window where nothing matched sends nothing.",messageHint:"Empty = the standard title and text."},family:{cameras_one:"{{count}} camera",cameras_other:"{{count}} cameras",never:"Nothing sent yet.",last:"Last sent {{when}}.",off:"Switched off \u2014 it will not run.",readOnly:"Created by an administrator. You can see it here but not change it."},templateVars:{camera:"Camera",class:"Detected class",label:"Name or plate",subject:"Subject sentence",confidence:"Confidence",count:"Count",detectionSummary:"Detection summary",zones:"Zones",zone:"Zone",inZones:"\"in <zones>\" fragment",scope:"Occupancy scope",time:"Time",rule:"Rule name",from:"Window start",to:"Window end",capacity:"Capacity",op:"Occupied / free",sounds:"Sounds heard",hitPercent:"Share of the window",db:"Peak level (dBFS)",eventType:"Event type",ai:"AI sentence",eventKind:"Event kind",deviceName:"Device",deviceId:"Device id",percentage:"Percentage",item:"Consumable",tank:"Tank",profile:"Stream profile",node:"Node",nodeId:"Node id",devices:"Devices",addons:"Addons",minutes:"Minutes",package:"Package",packageName:"Package name",nodes:"Nodes",currentVersion:"Current version",latestVersion:"Latest version",list:"Updated packages",fromVersion:"From version",toVersion:"To version",destinationsOk:"Destinations ok",destinationsTotal:"Destinations",destinationsFailed:"Destinations failed",sizeMB:"Size (MB)",backupId:"Backup id",title:"Export title",exportId:"Export id",bytes:"Export size (bytes)",mode:"Alarm mode",seconds:"Seconds",rules:"Covering rules",names:"Device names",skippedNames:"Skipped devices",bypassedNames:"Bypassed sensors",coverage:"Coverage %",events:"Events",detections:"Detections",count_person:"Count of one class",cameras:"Cameras",matched:"Matched events",shown:"Events shown",total:"Events total",summaryText:"Summary: every section",summaryCount:"Summary: items reported",summarySection:"Summary: this category",summaryDevices:"Summary: devices offline / switched off",summaryStreams:"Summary: streams offline",summaryBattery:"Summary: low batteries",summaryConsumables:"Summary: consumables",summaryTanks:"Summary: tanks",summaryDetection:"Summary: cameras detecting nothing",summaryNodes:"Summary: nodes",summaryAddons:"Summary: addons",summaryUpdates:"Summary: server & container updates"},templateField:{groups:{subject:"Subject",place:"Place",time:"Time",rule:"Rule",occupancy:"Occupancy",sound:"Sound",sensor:"Sensor",system:"System",digest:"Digest",ai:"AI"},noVars:"No variables for this field.",unknown:"These placeholders will be empty in this notification: {{names}}",preview:"Preview (example values)"},deviceType:{camera:"Camera",hub:"Hub",light:"Light",siren:"Siren",switch:"Switch",sensor:"Sensor",thermostat:"Thermostat",climate:"Climate",button:"Button","event-emitter":"Event emitter",update:"Update",generic:"Generic",notifier:"Notifier",script:"Script",automation:"Automation",lock:"Lock",cover:"Cover",valve:"Valve",humidifier:"Humidifier","water-heater":"Water heater",fan:"Fan","media-player":"Media player","alarm-panel":"Alarm panel",control:"Control",presence:"Presence",weather:"Weather",vacuum:"Vacuum","lawn-mower":"Lawn mower",container:"Container",image:"Image","pet-feeder":"Pet feeder"},prune:{device:"Disabled on {{date}}: its last device (#{{id}}) was deleted.",target:"Disabled on {{date}}: its last delivery target ({{id}}) was deleted."},alarm:{title:"Alarm",navLabel:"Alarm",navHint:"Panel, modes, recipients and delays",entryHint:"Time between a trigger and the alarm firing \u2014 long enough to reach the keypad.",notAdmin:"Only an administrator can configure the alarm. The hub does not let this account change it.",verdictUnknown:"Couldn't confirm your role with the hub, so the alarm settings are not shown.",retry:"Try again",loadFailed:"Couldn't load the alarm settings: {{error}}",noPanel:"This installation has no alarm panel. The Notification Center creates it on the hub \u2014 if this is the hub, its creation failed and the server log says why.",sections:{state:"State",modes:"Modes",recipients:"Recipients",delays:"Default delays"},stateWord:{disarmed:"Disarmed",armed:"Armed",arming:"Arming",disarming:"Disarming",pending:"Entry delay",triggered:"Triggered"},stateWithMode:"{{state}} \u2014 {{mode}}",liveUnknown:"The hub did not report the panel's state.",exclusionOpen:"{{name}} \u2014 ignored until it closes",exclusionClosed:"{{name}} \u2014 closed, watched again at its next opening",modeDelays:{title:"Delays for {{mode}}",inherited:"Default ({{seconds}} s)",useDefault:"Use default"},modesHint:"What each mode arms comes from the enabled rules gated on it. Nothing here is stored \u2014 change a rule and this changes with it.",coverageNone:"Arms nothing \u2014 no enabled rule is gated on this mode.",coverageAll_one:"Every device \u2014 {{count}} rule with no device scope.",coverageAll_other:"Every device \u2014 {{count}} rules with no device scope.",coverageRules_one:"{{count}} rule, no device restriction.",coverageRules_other:"{{count}} rules, no device restriction.",coverageDevices:"Covers: {{devices}}",skipped:"Named but not armed: {{devices}}",skipReason:{muted:"notifications muted","detection-off":"detection off",offline:"offline"},openingsUnknown:"Open devices: not reported by the hub.",openingsNone:"Nothing this mode covers is open now.",openingsCount:"Open now: {{blocking}} blocking, {{nonBlocking}} non-blocking, {{unknown}} unreadable",openingBlocking:"{{name}} ({{state}}) \u2014 refuses the arm",openingNonBlocking:"{{name}} ({{state}}) \u2014 non-blocking",openingUnreadable:"{{name}} \u2014 state unreadable, does not block",nonBlockingEmpty:"This household has no opening \u2014 no contact, cover or lock \u2014 to list here.",openingsChecking:"Checking which devices are openings\u2026",openingsCheckFailed:"Couldn't check which devices are openings \u2014 only those the hub read now, and those already listed, are shown.",recipientsHint:"Every alarm change is sent here: arming, armed, intrusion, siren, re-armed, disarmed, refused, excluded sensors.",recipientsNone:"No recipient selected \u2014 alarm changes are not sent to anyone.",targetsFailed:"Couldn't load the notification targets.",targetsEmpty:"No notification targets are configured \u2014 nothing can be sent.",targetDisabled:"Disabled",targetUnlisted:"Target {{id}} \u2014 no longer available",exitDelay:"Exit delay",exitHint:"Time between arming and the mode taking effect \u2014 long enough to leave.",exitZero:"arms immediately",entryDelay:"Entry delay",entryZero:"fires immediately",triggeredFor:"Triggered for",triggeredHint:"How long the alarm stays triggered before re-arming itself.",triggeredZero:"until disarmed",seconds:"{{seconds}} s",minutes:"{{minutes}} min",minutesSeconds:"{{minutes}} min {{seconds}} s",delayRange:"0\u2013{{max}} s",unsaved:"Unsaved changes",save:"Save",discard:"Discard",saveFailed:"Couldn't save: {{error}}",changedElsewhere:"The configuration changed elsewhere \u2014 your edits were applied on top.",saveNotLanded:"The hub answered but did not keep every change \u2014 it is probably too old for this setting. Your edits are kept.",recipientsLimit:"At most {{max}} recipients \u2014 untick one to add another.",leave:{title:"Discard alarm changes?",body:"The alarm settings have changes that are not saved.",keep:"Keep editing",discard:"Discard"},refreshFailed:"Couldn't re-read the alarm settings before saving: {{error}}. Nothing was saved; your edits are kept.",coverageAllExcept_one:"All devices except {{count}}: {{devices}}",coverageAllExcept_other:"All devices except {{count}}: {{devices}}",table:{title:"Blocks arming",hint:"Switch ON: {{mode}} is refused while this opening is open. Switch it off to let it stay open. Only sensors a rule of this mode names are listed; the arm check reads no others.",switchLabel:"Blocks arming: {{name}}",searchPlaceholder:"Search by name, room or type",none:"No sensor is covered by a rule of this mode.",noMatches:"No device matches.",hidden_one:"{{count}} row hidden by filters",hidden_other:"{{count}} rows hidden by filters",showMore:"Show {{count}} more ({{left}} left)",sensorsFailed:"Could not read the sensor states.",state:{checking:"Checking\u2026",hubTooOld:"This hub does not report sensor states \u2014 update the hub",readFailed:"State unknown \u2014 {{error}}",offline:"{{word}} \u2014 offline, last known",unknownNotAnswered:"Unknown (not answered)",unknownReadFailed:"Unknown (could not read)",unknownWord:"Unknown (no state reported)",notOpening:"Not an opening \u2014 never blocks",removed:"Removed"},coverage:{armChecked:"Yes",armCheckedSkipped:"Yes \u2014 blocks arming (notifications skipped: {{reason}})",unscoped:"Covered by an all-devices rule \u2014 the arm check does not read it; never blocks this mode",notCovered:"No \u2014 never blocks this mode",listedUncovered:"Not checked by any rule of this mode \u2014 listed as non-blocking; switch it on to remove the entry"},notice:{refused:"Saving {{name}} ({{mode}}) \u2014 wait for it to finish.",notLanded:"The hub did not apply this change \u2014 another editor may have changed it, or the hub needs an update ({{name}}, {{mode}}).",failed:"Could not change {{name}} for {{mode}}: {{error}}"}},checks_one:"Checks {{count}} sensor",checks_other:"Checks {{count}} sensors",openRefuse_one:"{{count}} open \u2014 refuses the arm",openRefuse_other:"{{count}} open \u2014 refuse the arm",skippedCount:"{{count}} not notified"},devicePicker:{title:"Choose devices",add:"Add",edit:"Edit",done:"Done",search:"Search by name, room or type",shown:"{{shown}} of {{total}} \xb7 {{selected}} selected",selectAll:"All",clear:"Clear",noType:"No type",noRoom:"No room",noMatches:"No device matches.",everyDevice:"Every device \u2014 no restriction",none:"None selected",remove:"Remove {{name}}",groupBy:{label:"Group by",zone:"Zone",location:"Location",none:"None",noZone:"No zone",noLocation:"No location",zonesPending:"Loading zones \u2014 grouped by location for now",zonesUnavailable:"Zones unavailable \u2014 grouped by location"},filter:{type:"Type",zone:"Zone",location:"Location",all:"All",selected:"{{count}} selected",noType:"No type",noLocation:"No location",noZone:"No zone",zonesLoading:"Loading zones\u2026",zonesUnavailable:"Zones unavailable",zonePaused:"Zone filter paused \u2014 zones not loaded"},resetFilters:"Reset filters",hiddenSelected:"{{count}} selected hidden by filters",nodeTitle:"Choose nodes",packageTitle:"Choose packages",everyNode:"Every node \u2014 no restriction",everyPackage:"Every package \u2014 no restriction",nodeRemoved:"Node {{id}} \u2014 removed",packageNotInstalled:"{{name}} \u2014 not installed",nodesEmptyWidens:"No node selected: the rule will apply to ALL nodes.",packagesEmptyWidens:"No package selected: the rule will apply to ALL packages.",nodesUnavailable:"The hub did not return its nodes \u2014 selected ones are listed by id so they can still be removed.",packagesUnavailable:"The hub did not return its packages \u2014 selected ones are listed by name so they can still be removed.",nodeDirectoryIncomplete:"The node history could not be read \u2014 offline nodes may be missing from this list.",nodeGroup:{hub:"Hub",agent:"Agents",other:"Nodes",offline:"{{role}} \xb7 offline"},packageGroup:{server:"Server",framework:"Framework",wrapper:"Wrapper",addon:"Addons",other:"Packages"},nodeSearch:"Search by node name or id",packageSearch:"Search by package name",nodeNoMatches:"No node matches.",packageNoMatches:"No package matches."}},login:{loginFailed:"Login failed",verifyFailed:"Verification failed",serverUrl:"Server URL",username:"Username",password:"Password",showPassword:"Show password",hidePassword:"Hide password",signIn:"Sign in",signingIn:"Signing in\u2026",twoFactor:"Two-factor authentication",totpHint:"Enter the 6-digit code from your authenticator app to sign in as ",verificationCode:"Verification code",verifyAndSignIn:"Verify and sign in",verifying:"Verifying\u2026",back:"Back",or:"or",signInWithCamStack:"Sign in with CamStack",hubSignInHint:"Opens your hub\u2019s login page and links this app without typing your password here.",handoffFailed:"Sign-in with CamStack failed \u2014 try again or use username and password",invalidServerUrl:"Enter a valid server URL (https://\u2026) first"},live:{webUnsupported:"Live view is not available on the web version yet.",connecting:"Connecting to live stream\u2026",error:"Unable to load the live stream.",retry:"Retry",noConnection:"No connection to the server",failed:"Connection failed",errorPageLoad:"The player page failed to load."},ptz:{title:"PTZ",notAvailable:"PTZ controls are not available for this camera.",zoom:"Zoom",home:"Home position",presets:"Presets",noPresets:"No presets saved.",noHome:"No home position set for this camera \u2014 set one in the PTZ settings of the admin UI."},navigation:{title:"Navigation",notAvailable:"Navigation controls are not available for this device.",drive:"Drive",forward:"Forward",left:"Turn left",right:"Turn right",turnAround:"Turn around",stop:"Stop",actions:"Actions",sounds:"Sounds",light:"Fill light",lightOn:"Light on",lightOff:"Light off",auto:"Auto",manual:"Manual",levelUp:"Brighter",levelDown:"Dimmer",following:"following",joystick:"Drive joystick",joystickHint:"Drag to drive the robot; release to stop.",followMe:"Follow me",returnToDock:"Return to dock",moreControls:"More controls",mode:{idle:"Idle",cleaning:"Cleaning",spot:"Spot cleaning",following:"Following",goto:"Going to point",returning:"Returning to dock",paused:"Paused",unknown:"Unknown"}},timeline:{activityTitle:"Activity",last24h:"Last 24h",loading:"Loading activity\u2026",noActivity:"No activity in the last 24 hours.",legendRecording:"Recorded",legendMotion:"Motion",legendAudio:"Audio",showTimeline:"Show timeline",hideTimeline:"Hide timeline",faultStream:"The video stream is unavailable.",clipShortTitle:"The camera cut this clip short.",clipEmptyTitle:"The camera sent no video for this clip.",faultRecordings:"Couldn't load the recordings for this day.",faultEvents:"Couldn't load this day's events.",faultDismiss:"Dismiss",loadRetry:"Retry",loadRetrying:"Retrying\u2026",moreHistory:"There is older history not shown yet.",scopeUnreadable_one:"One camera in this view could not be read \u2014 its events and footage are missing here.",scopeUnreadable_other:"{{count}} cameras in this view could not be read \u2014 their events and footage are missing here.",scopeOverflow_one:"This view has one camera more than the timeline can read at once.",scopeOverflow_other:"This view has {{count}} cameras more than the timeline can read at once.",scopeUnreadableAndOverflow:"{{unreadable}} cameras could not be read and {{overflow}} more than the timeline can read at once are not shown.",loadMoreHistory:"Load more",loadingMoreHistory:"Loading\u2026"},theater:{back:"Back",today:"Today",yesterday:"Yesterday",prevDay:"Previous day",nextDay:"Next day",selectDate:"Pick a date",live:"LIVE",now:"NOW",auto:"Auto",quality:"Stream quality",filterAll:"All",filter_motion:"Motion",filter_audio:"Audio",goToLive:"Go to live",liveLockOn:"Live lock on \u2014 browsing keeps the picture live",liveLockOff:"Live lock off \u2014 browsing plays the recording",recordLive:"Record live",keepClip:"Keep the recording",keepClipTitle:"Keep this clip?",discardClip:"Discard",saveToGallery:"Save to Photos",shareClip:"Share",recordFailed:"Could not record the live view",noRecording:"No recording",noRecordingHint:"No footage at this time",detailCount:"{{frames}} frames \xb7 {{count}} detections",detailTracks:"{{tracks}} tracks \xb7 {{count}} detections",detailEmpty:"No detail images for this moment",detailSeek:"Go to this moment",zoneHint:"Drag a rectangle over the video to filter events by zone",zoneConfirm:"Confirm",zoneCancel:"Cancel",playbackBar:"Playback controls",footerBar:"Timeline tools",filterTitle:"Filters",zoomRange:"Time range",zoomSpanMinutes:"{{count}}m",zoomSpanHours:"{{count}}h",zoneFilter:"Zone filter",detailSubjects_one:"{{count}} subject",detailSubjects_other:"{{count}} subjects",zoneModeRect:"Rectangle",zoneModePolygon:"Polygon",zoneClearPoints:"Clear",zoneHintPolygon:"Tap to add points \u2014 3 or more",selectTime:"Time",goSameTime:"Go \u2014 same time of day",recordingDaysFailed:"Couldn't read which days have recordings.",recordingDaysPartial:"Some cameras in this view could not be read \u2014 days without a dot may still have footage on them.",clusterOpenDetail:"Open event detail",clusterCarouselShow:"Open the cluster carousel",clusterCarouselHide:"Close the cluster carousel",clusterPrevImage:"Previous image",clusterNextImage:"Next image",clusterCameras_one:"{{count}} camera",clusterCameras_other:"{{count}} cameras",clipStartsAtSubjectAt:"Clip starts at {{start}}, subject at {{subject}}",clipEndsAt:"Clip ends at {{end}}",legend:{open:"Heatmap and timeline legend",title:"Legend",heatmapTitle:"24-hour heatmap",heatmapRecordingTitle:"Recording",heatmapRecordingBody:"Red hairline along the top of the tape \u2014 coverage for that stretch of the day.",heatmapAudioTitle:"Audio",heatmapAudioBody:"Peaks hanging from the top. Quiet is green, loud is red \u2014 the same six rungs as the live meter.",heatmapBottomTitle:"Motion and detections",heatmapBottomBody:"The bottom of each slot fills with green motion, or with the prominent object class when a detection is in that slot.",timelineTitle:"Activity column",timelineRecordingTitle:"Recording",timelineRecordingBody:"Continuous red line on the far right.",timelineMotionTitle:"Motion",timelineMotionBody:"Green line down the centre.",timelineDetectionTitle:"Object detection",timelineDetectionBody:"Dot sitting on the motion line, coloured as the prominent class at that moment.",timelineAudioTitle:"Audio level",timelineAudioBody:"Line on the far left. Same green-to-red scale as the heatmap and the live meter.",classesTitle:"Detection classes",classPerson:"Person",classPersonBody:"People and faces.",classVehicle:"Vehicle",classVehicleBody:"Cars, trucks, bikes and the rest of the vehicle family.",classAnimal:"Animal",classAnimalBody:"Dogs, cats, birds and other animals."}},mediaKind:{crop:"Object crop",thumbnail:"Best shot",faceCrop:"Face",plateCrop:"Plate",fullFrame:"Frame",fullFrameBoxed:"Boxed",keyFrame:"Key frame",firstFrame:"First",lastFrame:"Last",snapshot:"Snapshot"},tracks:{crop:"Crop",fullFrame:"Full frame",bestShot:"Best shot",media:"Media",noMedia:"No media stored for this track",mediaLoadError:"Media could not be loaded",mediaEntryLoading:"Loading this media\u2026",mediaEntryError:"This media is indexed but could not be read",mediaEntryAbsent:"Not stored for this track",path:"Path",pathSummary:"{{count}} points \xb7 {{seconds}}s",pathNoLocalization:"no precise position",share:"Share",copyLink:"Copy link",linkCopied:"Link copied",shareImage:"Share image",viewFullRes:"Full resolution",fullResBadge:"Full",zones:"Zones",audio:"Audio",prevTrack:"Previous event",nextTrack:"Next event",reason:"Why notable",empty:"No tracks",recent:"Recent",searchPlaceholder:"Search events (e.g. \"person in red\")",searchSubmit:"Search",searchClear:"Clear search",noMatches:"No matching events",person:"Person",assignPerson:"Assign to person",changePerson:"Change",notAssigned:"Not assigned",matchConfidence:"Match confidence",suggested:"Suggested",suggestedUnknown:"Suggested person",suggestedConfirm:"Confirm",suggestedDismiss:"Dismiss",assignFaceTitle:"Assign face",newPersonPlaceholder:"New person name\u2026",createAndAssign:"Create & assign",assignFailed:"Couldn't assign the face",removePerson:"Remove person",removePersonConfirmTitle:"Remove person?",removePersonConfirmBody:"This unlinks the person from this face. The face returns to the unassigned buffer and can be reassigned later.",disassociateFailed:"Couldn't remove the person",removePersonAll:"Remove from all events",removePersonAllConfirmTitle:"Remove from all events?",removePersonAllConfirmBody:"This unlinks this person from EVERY event. All faces currently recognized as this person return to the unassigned buffer and can be reassigned later. The person is kept.",disassociateAllFailed:"Couldn't remove the person from all events",existingPersons:"People",noPersons:"No people yet",metadata:"Metadata",markForTraining:"Mark for training",markForTrainingHint:"Keeps this track and its media past retention",debugFlag:"Debug",debugFlagHint:"Flag this track for diagnostic attention. Hold to edit what should be checked.",debugNotePromptTitle:"What should we check?",debugNotePromptBody:"Describe what looks wrong on this event, in your own words. It stays on the track, so whoever reviews the debug set reads the question with it.",debugNotePlaceholder:"e.g. the box jumps to the fence when the car passes",debugPreset:{stationaryObject:"Stationary object",lateStart:"Started late",earlyEnd:"Ended early",targetSwapped:"Target swapped mid-track",edgeCropMirror:"Best shot on the edge, mirrored",betterShotExisted:"A better best shot was available",missingMedia:"Missing media",cropOffTarget:"Crop shot off target",riderNotInKeyframe:"Two-wheeler shot without the rider"},debugReviewed:"Analyzed",debugReviewedHint:"Mark this debug track as analyzed so it drops out of the debug filter and export",favourited:"Favourited",favouritedHint:"Keeps this track and its media past retention",copy:"Copy",copied:"Copied","meta.trackId":"Track ID","meta.eventId":"Best event ID","meta.deviceId":"Device ID","meta.camera":"Camera","meta.className":"Class","meta.label":"Label","meta.firstSeen":"First seen","meta.lastSeen":"Last seen","meta.state":"State","meta.importance":"Importance","meta.confidence":"Confidence","meta.mediaKeys":"Media IDs",rescore:{button:"Recompute matches",failed:"Couldn't recompute the matches",params:"Threshold {{threshold}} \xb7 margin {{margin}}",needsSamples:"{{count}} samples \u2014 needs {{min}}",reembed:"Re-embed this face and retry",reembedFailed:"Re-embed failed: {{reason}}",verdict:{"auto-assignable":"Would be assigned to {{name}}",ambiguous:"Two people score too close to call \u2014 the margin blocks it",suggestion:"Plausible, but below the auto-assign threshold","below-threshold":"No match in the gallery as it stands","no-eligible-identity":"No person has enough samples yet ({{min}} needed)","empty-gallery":"Nothing in the gallery is comparable to this face","model-mismatch":"This face was embedded with an older model \u2014 its scores cannot be compared"}}},accessories:{on:"On",off:"Off",dimUp:"Brighter",dimDown:"Dimmer",lock:"Lock",unlock:"Unlock",open:"Open",close:"Close",stop:"Stop",disarm:"Disarm",onMotion:"On motion",openPercent:"Open {{percent}}",warmer:"Warmer",cooler:"Cooler",speedUp:"Faster",speedDown:"Slower",oscillate:"Oscillate",press:"Press",play:"Play",pause:"Pause",previous:"Previous",next:"Next",start:"Start",dock:"Dock",locate:"Locate",feed:"Feed",feeding:"Feeding\u2026",install:"Install",installing:"Installing\u2026",upToDate:"Up to date",increase:"Increase",decrease:"Decrease",select:"Select",noEvent:"No events yet",buttonIndex:"Button {{index}}",mode:"Mode",fanMode:"Fan mode",preset:"Preset",direction:"Direction",forward:"Forward",reverse:"Reverse",away:"Away",humidityUp:"Increase humidity",humidityDown:"Decrease humidity",swingVertical:"Vertical swing",swingHorizontal:"Horizontal swing",setTemperature:"Set temperature",currentTemperature:"Current temperature",climateModes:{off:"Off",heat:"Heat",cool:"Cool",auto:"Auto",heat_cool:"Heat/Cool",fan_only:"Fan",dry:"Dry"},unsupported:"This hub cannot do that. Update it and try again.",armMode:{home:"Home",away:"Away",night:"Night",vacation:"Vacation",custom_bypass:"Custom"},alarmRefused:"Not armed \u2014 open: {{devices}}",armAnyway:"Arm anyway",armAnywayRejected:{"unknown-refusal":"Arm anyway was not accepted: the hub no longer knows that refusal. Arm again.",stale:"Arm anyway was not accepted: the panel changed since it refused. Arm again.",expired:"Arm anyway was not accepted: the refusal expired. Arm again.",used:"Arm anyway was not accepted: that refusal was already used."},alarmState:{arming:"Arming\u2026",pending:"Intrusion \u2014 disarm now",triggered:"Alarm triggered"},alarmRefusedCap:"Not armed \u2014 open: {{devices}}. Arm anyway is on the alarm notification.",alarmLookupUnknown:"Alarm state unknown \u2014 retrying",alarmStateUnknown:"Panel state unknown",alarmExcluded:"Armed \u2014 excluded: {{devices}}",deviceFallback:"Device #{{id}}",alarmRefusedNone:"Not armed \u2014 the hub refused without naming an open device. Try again."},updates:{otaReadyTitle:"Update downloaded",otaReadyBody:"Restart the app now to apply it? Later applies it at the next start.",install:"Restart now",later:"Later",whatsNewTitle:"What's new in {{version}}",whatsNewHeading:"What's new",whatsNewPrevious:"Previous updates",whatsNewRow:"What's new",whatsNewNone:"No notes for this version.",nativeRow:"App build",nativeUpToDate:"Up to date",nativeUnknown:"\u2014",nativeNewer:"{{version}} ({{build}}) available",nativeNewerTitle:"A newer app build is available",nativeNewerBody:"Version {{version}} (build {{build}}) is available. Updates from now on need it.",openTestFlight:"Open TestFlight",openStore:"Open the store"},cameraMenu:{title:"View options",gridCommonHint:"Overlays shared by the whole wall \u2014 boxes, highlight border and its triggers, cluster labels \u2014 are set once for the grid, in the grid bar.",streamStats:"Stream stats",audioLevel:"Audio level",densityTitle:"Timeline density",density_compact:"Compact",density_medium:"Medium",density_wide:"Wide",densityCustom:"Custom",showImportance:"Show importance",showClass:"Show detection class",timelineSection:"Timeline",managementTitle:"Management"},viewOptions:{groupDetection:"Detection overlays"},cameraShelf:{goTo:"Go to this camera",addToView:"Add to view",closeView:"Close view",loading:"Loading cameras\u2026",loadingA11y:"Loading the other cameras"},cameraSwitches:{title:"Camera functions",loading:"Reading camera functions\u2026",readFailed:"Camera functions could not be read. Nothing has changed \u2014 they are not shown rather than shown with a guessed state.",writeFailed:"That change was refused and has been undone. {{reason}}",offBadge:"OFF",badgeLabel_one:"{{count}} function switched off",badgeLabel_other:"{{count}} functions switched off",unavailableNoProvider:"Not available \u2014 nothing in this installation provides it.",unavailableUnreachable:"Unknown \u2014 the service that owns this did not answer.",unavailableNotConfigured:"Not offered \u2014 nothing is set up for it to act on yet.",unavailableNoPrivacyZones:"Not offered \u2014 no privacy zone is drawn on the camera yet. Draw one in the camera\u2019s own app, then this switch appears.",warnUnknown:"This control carries a note from the hub that this app version does not recognise yet.",warnNoPrivacyZones:"No privacy zone is drawn on the camera yet, so the mask has nothing to blank. Draw one in the camera\u2019s own app; the switch is offered so the feature can be started from here.",unavailableDeviceDisabled:"Not offered while the camera is switched off.",unavailableUnknown:"Not available on this camera."},stats:{title:"Stream stats",resolution:"Resolution",fps:"FPS",bitrate:"Bitrate",packetLoss:"Packet loss",jitter:"Jitter",codec:"Codec",frames:"Frames (dropped/total)",waiting:"Measuring\u2026",playbackHint:"Full WebRTC stats need the native player."},exportActions:{title:"Capture",recordingExport:"Recording export"},exportSelection:{start:"Select a period to export",discard:"Discard the selection",save:"Save the selected period",savePartial:"Save the selected period \u2014 part of it was not recorded",title:"Export",queued:"The export was queued. You will find it under Exports when it is ready.",failed:"The export could not be queued.",gapTitle:"Part of this period was not recorded",gapMessage:"The selected {{duration}} crosses a stretch with no recording. The export will contain only the recorded parts.",gapConfirm:"Export anyway"},exports:{title:"Exports",range:"Range",createAction:"New export",withAudio:"with audio",variantRegular:"1\xd7",variantAccelerated:"Accelerated {{speed}}\xd7",variantSlow:"Slow {{speed}}\xd7",variantTimelapse:"Timelapse",expired:"Expired",expiresInDays:"Expires in {{count}}d",expiresInHours:"Expires in {{count}}h",expiresInMinutes:"Expires in {{count}}m",downloadAction:"Download",downloadUnavailable:"Download not available.",downloadFailed:"Download failed.",cancelAction:"Cancel",cancelConfirmTitle:"Cancel export?",cancelConfirmBody:"This stops rendering and discards the partial file.",deleteAction:"Delete",deleteConfirmTitle:"Delete export?",deleteConfirmBody:"This removes the file. The history entry is kept.",dismiss:"Dismiss",state:{queued:"Queued",rendering:"Rendering",ready:"Ready",failed:"Failed",expired:"Expired",deleted:"Deleted"},createHint:"Pick a camera: the export is drawn on its recording timeline, where the footage that exists is visible.",stillRendering:"Still rendering \u2014 the file is not ready to play yet.",noFile:"There is no file to play for this export.",stateLabel:"State",variant:"Render"},library:{title:"Library",sections:{events:"Events",artifacts:"Media",review:"Review"}},artifacts:{title:"Media",empty:"No media yet.",emptyFiltered:"No media matches these filters.",loadError:"Could not load the media.",gone:"This file is no longer on the hub.",expired:"Expired",expiredBody:"The retention window closed and the file was removed.",expiresInDays:"Expires in {{count}}d",expiresInHours:"Expires in {{count}}h",expiresInMinutes:"Expires in {{count}}m",retentionHint:"Kept for up to 14 days. Files may be removed sooner when the hub reaches its storage limits.",byRule:"Rule: {{name}}",allCameras:"All cameras",cameraPlus:"{{name}} +{{count}}",close:"Close",downloadAction:"Download",downloadUnavailable:"Download not available.",downloadFailed:"Download failed.",deleteAction:"Delete",deleteConfirmTitle:"Delete this file?",deleteConfirmBody:"This removes it from the hub for good.",deleteRefused:"The hub did not remove this file. It may already be gone, or it may belong to the whole household \u2014 only an administrator can remove those.",deleteFailed:"Could not delete the file.",kind:{timelapse:"Timelapse","timelapse-preview":"Timelapse preview","summary-mosaic":"Summary mosaic","event-gif":"GIF","event-clip":"MP4","event-still":"Still",export:"Export"},time:{now:"Just now",minutesAgo:"{{count}}m ago",hoursAgo:"{{count}}h ago",daysAgo:"{{count}}d ago"},range:{all:"All",day:"24h",week:"7d",month:"30d"},filters:{toggle:"Filters",kind:"Type",camera:"Camera",range:"Period",clear:"Clear filters"},detail:{kind:"Type",cameras:"Cameras",rule:"Rule",captured:"Captured",created:"Produced",size:"Size",format:"Format",expiry:"Expires"}},streamBar:{play:"Play",pause:"Pause",scrubForward:"Scrubbing forward",scrubBackward:"Scrubbing backward",mute:"Mute",unmute:"Unmute",silentBySpeed:"No sound at {{rate}} \u2014 the speed silences it",talkStart:"Start talking",talkStop:"Stop talking",quality:"Stream quality",menu:"View options",snapshot:"Snapshot",pip:"Picture in picture",fullscreen:"Fullscreen",exitFullscreen:"Exit fullscreen"},playback:{servedTier:"Playing {{tier}}",servedTierDegraded:"{{requested}} not available here \u2014 playing {{served}}",tier:{high:"High",mid:"Mid",low:"Low"},prevFrame:"Previous frame",nextFrame:"Next frame",speed:"Playback speed",rateUnavailable:"Not available for this camera's clips",stepBackUnavailable:"This camera's clips cannot step backward \u2014 the frames behind the picture were never kept"},cameraSwitcher:{title:"Switch camera",empty:"No cameras available",openGrid:"Open grid ({{n}})",selectA11y:"Select {{name}}",buildView_one:"Show this camera",buildView_other:"Show these {{count}} cameras"},storage:{title:"Storage",usageTitle:"Usage",nodeTotal:"Node total",defaultLocation:"Default location",locationFree:"{{free}} free",retentionTitle:"Retention",pruneAction:"Apply retention now",pruneConfirmTitle:"Apply retention?",pruneConfirmBody:"Delete footage on {{name}} that exceeds its retention policy.",pruneResult:"Reclaimed {{bytes}} ({{buckets}} segments).",deleteTitle:"Delete footage",deleteAction:"Delete",deleteConfirmTitle:"Delete footage?",deleteConfirmBody:"Permanently delete {{range}} of footage on {{name}}. This cannot be undone.",deleteResult:"Reclaimed {{bytes}} ({{buckets}} segments).",cancel:"Cancel",window24h:"Last 24h",window7d:"Last 7 days",window30d:"Last 30 days",windowAll:"Everything"},eventsMgmt:{title:"Events",footprintTitle:"Footprint",rowsBytes:"{{rows}} events \xb7 {{bytes}}",clusterTotal:"Cluster total",pruneTitle:"Prune older than",pruneHint:"Applies to all cameras.",pruneAction:"Prune",pruneConfirmTitle:"Prune old events?",pruneConfirmBody:"Delete events older than {{range}} across ALL cameras. This cannot be undone.",pruneResult:"Deleted {{count}} events.",deleteTitle:"Delete camera events",deleteAction:"Delete all events for this camera",deleteConfirmTitle:"Delete all events?",deleteConfirmBody:"Permanently delete every event for {{name}}. This cannot be undone.",deleteResult:"Deleted {{count}} events.",cancel:"Cancel",older24h:"24 hours",older7d:"7 days",older30d:"30 days"},overlay:{title:"Overlay",liveSection:"Live indicators",readoutsSection:"Sensors & values",layersLabel:"Boxes on the picture",layerMotion:"Motion",layerObjects:"Objects",layerDiscarded:"Discarded",layerStationary:"Stationary",layerDiscardedHint:"Also draws, as dashed outlines, the near-miss and out-of-zone detections of the classes you enabled \u2014 subjects that fell just under the confidence threshold, or stood outside a zone rule. Use it when boxes flicker on a moving subject. The count pill compares what the model saw with what was kept.",layerStationaryHint:"Draws objects that have stopped and are no longer tracked \u2014 a parked car, a bin left out. The hub suppresses their detections, so they can never appear under Objects or Discarded.",diagCounts:"model {{saw}} \xb7 kept {{kept}}",diagHidden:"{{hidden}} hidden",diagOffTopic:"{{offTopic}} off-topic",diagShed:"frame shed \xb7 {{reason}}",reasonThreshold:"below threshold",reasonFullFrame:"full-frame guard",reasonNms:"suppressed by NMS",reasonClassFilter:"class filter",reasonZoneGate:"zone rule",motionBadge:"Motion badge",highlightBorder:"Highlight border",occupancy:"Occupancy",addReadout:"Add a readout",removeReadout:"Remove readout",readoutsHint:"Pin a live value over the picture \u2014 the audio level, or any sensor linked to this camera.",noFields:"This device publishes no live values.",thisCamera:"This camera",audioDbfs:"Audio level",liveOnlyHint:"These draw on the live picture only \u2014 not during playback or while paused.",positions:{off:"Off","top-left":"Top left","top-center":"Top center","top-right":"Top right","left-center":"Left center","right-center":"Right center","bottom-left":"Bottom left","bottom-center":"Bottom center","bottom-right":"Bottom right"}},clips:{title:"Clips",lengthUnknown:"length unknown",progressLabel:"Clip position {{position}} of {{duration}}",loading:"Loading clips\u2026",empty:"No clips for this camera in the loaded window.",searching:"Looking back through earlier days\u2026 ({{days}}/{{max}})",emptySearched:"No clips in the last {{days}} days.",summary_one:"{{count}} clip",summary_other:"{{count}} clips",collapsedHint:"{{duration}} skipped",hiddenHint_one:"{{count}} hidden by source",hiddenHint_other:"{{count}} hidden by source",segmentLabel:"Clip at {{time}}, {{duration}} long",gapLabel:"Gap of {{duration}}",notPlayable:"not playable yet",kind_motion:"Motion",kind_object:"Object",kind_audio:"Audio",kind_native:"Camera",sourceAnalytics:"Recording",sourceOnboard:"Camera ({{vendor}})",sourceHksv:"HomeKit",sourceUnknown:"{{vendor}}",unitDay:"d",unitHour:"h",unitMinute:"m",unitSecond:"s",sourceSilent:"{{source}} could not answer for this window.",sourceMissing:"This camera no longer offers {{source}}. Showing {{fallback}} instead.",sourceSetting:"Clip source",recordingSourceSetting:"Recording source",recordingSourceOurs:"CamStack",sourceStateSleeping:"the camera is asleep",sourceStateUnreachable:"the camera could not be reached",sourceStateNoStorage:"the camera has no storage fitted",sourceStateIndexEmpty:"the camera lists no files",sourceStateUnknown:"the reason is not known to this app",catalogAsOf:"Catalogue read {{ago}} ago",thumbQueued:"Still queued\u2026",thumbNone:"No still",playFailed:"This clip could not be opened.",servedInstead:"Asked for {{asked}}, served {{served}}.",closeClip:"Close clip",nextClip:"Next clip",previousClip:"Previous clip",saveClip:"Save clip",saveUnavailable:"This clip cannot be served",stillRecordingNoLoop:"Still recording \u2014 plays once",still:{waiting:"Asking the camera for a still\u2026",queueFull:"Waiting for the camera \u2014 its still queue is full",cameraBackoff:"The camera is resting after refusing \u2014 trying again shortly",gaveUp:"The camera is still busy \u2014 refresh to ask again",sleeping:"The camera is asleep \u2014 a still would cost a wake",cameraRefused:"The camera refused to cut a still",noKeyframe:"No decodable frame inside this window",unsupported:"This source cannot produce stills",noCatalogRow:"This clip is no longer in the camera's catalog",unknownDevice:"This camera is not served here",uidMissing:"The camera's id is not known yet"},export:{title:"Save clip",close:"Close",pickHint:"Pick the copy to keep. The hub renders it and it lands in the Library.",profile:{high:"High quality",low:"Low quality"},sizeUnknown:"size not stated",tooLarge:"Too large to transfer",working:"Preparing the export\u2026",workingHint:"You can close this \u2014 the job keeps running.",ready:"Ready",readyHint:"Collect it from the Library.",failed:"The export failed",failure:{"catalog-miss":"The camera no longer lists this clip","catalog-unreachable":"The camera's catalog could not be read","no-file-for-window":"There is no file behind this clip","clip-in-progress":"This clip is still being written","unsupported-option":"The export asked for something a clip cannot do",sleeping:"The camera is asleep","camera-refused":"The camera refused","fetch-failed":"The clip could not be fetched","too-large-to-transfer":"Too large to transfer","wake-expired":"The camera went back to sleep before the job ran"}},scrubUnavailable:"This camera's clips cannot be scrubbed \u2014 only forward from where the picture is",loopOn:"Loop this clip, on",loopOff:"Loop this clip, off"},eventsEmbed:{section:"Hub embed (preview)",title:"Events embed",count:"{{count}} shown",openPreview:"Embed preview",openPreviewHint:"Open the hub-hosted events surface next to this page. Nothing is replaced.",view_reel:"Reel",view_gallery:"Gallery",error:"Couldn't load events",retry:"Retry",empty:"No events",emptyFiltered:"No events match this filter",end:"\xb7 end \xb7"},eventsShare:{title:"Events embed link",openBuilder:"Create embed link",openBuilderHint:"Build a standalone URL for a dashboard or an iframe.",view:"View",viewReel:"Reel",viewGallery:"Gallery",columns:"Columns",rows:"Rows",auto:"Auto",thumb:"Thumbnail size",thumbSmall:"Small",thumbMedium:"Medium",thumbLarge:"Large",theme:"Theme",themeAuto:"Auto",themeDark:"Dark",themeLight:"Light",fields:"Card text",field_label:"Title",field_sublabel:"Class",field_camera:"Camera",field_time:"Time",field_badges:"Badges",cameras:"Cameras",camerasAll:"All cameras the link can see",camerasCount:"{{count}} selected",preview:"Link preview",shareMediaNotice:"A share link cannot load thumbnails. Share tokens have no access to the media endpoint at all \u2014 the shared page lists its events, without their images.",copyLink:"Create link",chip:"Embed link",semanticScopeNotice:"Semantic search runs across every camera and is trimmed to this link afterwards, so a link with few cameras can return sparse results on a large cluster."},eventsCard:{unassignedFace:"unassigned face",reviewed:"reviewed",debug:"debug",train:"train",favourite:"favourite",active:"active",loadingMore:"Loading more events"},gridTile:{play:"Play",pause:"Pause",listen:"Listen",mute:"Mute",talk:"Talk",stopTalk:"Stop talk",ptz:"PTZ",linkedDevices:"Linked devices",viewOptions:"View options",moreActions:"More actions",open:"Open",removeFromView:"Remove from view",resizeWidth:"Resize width",resizeHeight:"Resize height",noActiveCameras:"No active cameras",camera:"Camera"},battery:{holdHint:"This camera runs on battery \u2014 press play to start the stream and wake it.",startStreamA11y:"Start the stream and wake the battery camera"},faceReview:{loading:"Loading faces\u2026",loadError:"Could not load faces.",empty:"No faces to review right now.",previewClose:"Close",pickIdentityTitle:"Assign to\u2026",assignFailed:"Could not assign this face.",assign:"Assign",assignedSuccess:"Assigned to {{name}}.",confirmAssignTitle:"Assign faces",confidence:"Confidence",groupSize:"{{count}} faces in this group",filterAssigned:"Assigned",filterSuggested:"Suggested",filterUnassigned:"Unassigned",certaintyCertain:"near-certain",certaintyProbable:"probable",certaintyUncertain:"uncertain",analyzeButton:"Similar groups",analyzeModalTitle:"Look-alike groups",analyzeLoading:"Looking for look-alike groups\u2026",analyzeEmpty:"No look-alike groups found.",analyzeConfirmBody:"Assign {{count}} face(s) across {{groups}} group(s)?",analyzeResult:"Assigned {{assigned}} of {{count}} face(s).",analyzeAssignFailed:"Some faces were refused and are still unassigned.",recomputeButton:"Recompute suggestions",recomputeProgress:"Recomputing {{done}}/{{total}}\u2026",recomputeDone:"Recomputed {{count}} face(s).",analyzeCoverage:"{{grouped}} of the {{pool}} unassigned faces analysed fall into {{groups}} look-alike group(s). The rest have no look-alike here.",groupExcludeFace:"Exclude this face from the group",groupIncludeFace:"Put this face back in the group",groupPickPerson:"Assign this group to",groupShowDetail:"Show this face larger",groupDetailExclude:"Exclude from group",groupDetailInclude:"Put back in the group",assignedManySuccess:"Assigned {{count}} face(s) to {{name}}.",detailTitleMany:"Assign {{count}} selected face(s) to\u2026",knownPeople:"Known people",filtersButton:"Filters",filtersButtonActive:"Filters ({{count}})",sortLabel:"Sort by",sortByCertainty:"Certainty",sortByDate:"Date",sortAscending:"Sorting ascending \u2014 tap for descending",sortDescending:"Sorting descending \u2014 tap for ascending",dateLabel:"Date range",rangeAll:"All",rangeToday:"Today",rangeYesterday:"Yesterday",rangeLast7:"7 days",rangeLast30:"30 days",cameraLabel:"Camera",cameraNone:"No cameras in the loaded faces yet.",selectButton:"Select",selectDone:"Done",selectionCount:"{{count}} selected",applySuggestions:"Apply {{count}} suggestion(s)",applySuggestionsBlocked:"{{count}} of the selected face(s) have no suggestion \u2014 deselect them, or use Assign.",applySuggestionsResult:"Applied {{count}} of {{total}} suggestion(s) across {{groups}} person(s).",emptyFiltered:"No faces match these filters.",partialWindowHint:"Filtering the {{count}} faces loaded so far \u2014 scroll down to load older ones.",auditTitle:"Re-analyse {{name}}\u2019s samples",auditSummary:"{{flagged}} of {{total}} samples worth a look",auditLooksLike:"Looks like {{name}} ({{foreign}}) more than like this person ({{self}})",auditSelfOnly:"Agrees with this person\u2019s other samples: {{self}}",auditNotComparable:"Enrolled with a different face model \u2014 it cannot be compared, not even to say it is fine.",auditFromPhoto:"photo",auditRemoveTitle:"Remove this sample",auditRemoveBody:"The sample stops teaching recognition. Nothing else changes, and the face it came from stays where it is.",auditUnavailable:"This hub cannot re-analyse a gallery yet.",auditRemoveFailed:"Could not remove this sample:",pickPersonSearch:"Search people",pickPersonClear:"Clear the search",pickPersonSamples:"{{count}} sample(s)",pickPersonNoMatch:"No person matches \u201c{{query}}\u201d.",pickPersonCreate:"Create \u201c{{name}}\u201d",auditOpenButton:"Re-analyse a person\u2019s samples",auditPickTitle:"Whose samples?",groupPickNone:"Choose a person",newPersonButton:"New person",newPersonTitle:"Add a person",newPersonCreated:"Added {{name}}.",newPersonFailed:"Could not add this person.",deleteSelected:"Delete",deleteBlocked:"{{count}} of the selected face(s) belong to a person \u2014 deselect them, or detach them first.",deleteConfirmTitle:"Delete {{count}} face(s)",deleteConfirmBody:"The crop and its row leave the review buffer for good. The event they came from is untouched.",deleteResult:"Deleted {{count}} of {{total}} face(s).",deleteFailed:"Could not delete these faces."},statusDetail:{batteryTitle:"Battery",linkTitle:"Connection",openBatteryA11y:"Battery details",openLinkA11y:"Connection details",close:"Close",label:{charge:"Charge",charging:"Power",state:"State",linkType:"Link",signal:"Signal",ssid:"Network",verdict:"Verdict",picture:"Picture",bitrate:"Bitrate",decoded:"Frames decoded",freezes:"Freezes",keyframeRequests:"Key-frame requests",loss:"Loss",latency:"Latency \xb7 jitter",path:"Path",servedRung:"Served rung",source:"Source",ingest:"Ingest node",egress:"Egress leg",ladder:"Quality ladder",ladderWhy:"Why it holds"},value:{unknown:"Not known",notApplicable:"Not applicable",binary:"Low / ok only, no percentage",sleeping:"Sleeping",chargingDc:"Charging (mains)",chargingSolar:"Charging (solar)",chargingNone:"Not charging",wifi:"Wi-Fi",ethernet:"Wired (Ethernet)",cellular:"Cellular",linkUnknown:"Not known",decoding:"Decoding",decoderStall:"Decoder stall \u2014 bytes arriving, no frames out",transportStall:"Transport stall \u2014 nothing arriving",frozenUnknown:"Frames stopped, byte rate unknown",noWindow:"No window yet",native:"Native stream",derived:"Derived (transcoded here)",copyLeg:"Copy \u2014 no re-encode",transcodeLeg:"Transcode",ladderNeverMoved:"Never moved",ladderHeld:"Held",ladderHeldStallBuilding:"Held: picture not arriving",ladderHeldDelivery:"Held: current quality not landing whole",ladderHeldNoEvidence:"Held: no feedback from the player yet",ladderHeldWarming:"Stable, about to climb",ladderHeldCooldown:"Held: just changed",ladderHeldCapacity:"Held: not enough bandwidth for the next level",ladderHeldTryUnclean:"Held: connection not steady enough to try a higher level",ladderHeldTryBackoff:"Held: a higher level was tried and did not hold; retrying later",ladderHeldTrial:"Trying a higher level",ladderHeldSuspended:"Paused during recorded playback",serverNotWired:"Not available from this player",serverWaiting:"Waiting for the server",sessionGone:"Session not found on the server",noSample:"No measurement yet"},streamTitle:"Stream"},onDemandPlayer:{openA11y:"Open in the on-demand player",title:"On-demand player",close:"Close player",resize:"Resize player",move:"Move player",openCamera:"Open the camera screen",goLive:"Live"},reelHighlight:{title:"Reel highlights",section:"Light a card up on",close:"Close",reset:"Back to motion + audio",openA11y:"Reel highlight settings"},accessoryPanel:{edit:"Customise the devices",done:"Done customising",emptyHint:"Tap the pencil to add devices from the hub \u2014 they stay in this app\u2019s profile.",addAction:"Add devices",addTitle:"Add devices",addHint:"Devices added here appear only in this app\u2019s profile, under this camera. The hub\u2019s own links are not changed. Devices in the same room are suggested first.",picked:"Added here",pickedNone:"Nothing added yet",suggested:"Suggested \xb7 {{location}}",suggestedNone:"None",allDevices:"All devices",searchToSee:"Search to see the rest",noMatches:"No matches",searchPlaceholder:"Search by name, room or id",truncated_one:"{{count}} more match is not shown \u2014 narrow the search.",truncated_other:"{{count}} more matches are not shown \u2014 narrow the search.",save:"Keep these additions",cancel:"Discard these changes",loadFailed:"The hub did not answer with its device list. Close and try again.",localBadge:"Added here",hiddenBadge:"Hidden",rename:"Rename {{device}}",renameHint:"Shown only in this app. Leave it empty to use the hub\u2019s name.",icon:"Change the icon of {{device}}",iconTitle:"Icon for {{device}}",iconDefault:"Default icon",iconSearchPlaceholder:"Search icons",iconGroups:{devices:"Devices",lighting:"Lights, climate, appliances",sensors:"Sensors and weather",places:"Rooms and places",life:"Vehicles, animals, people"},hide:"Hide {{device}}",show:"Show {{device}}",moveUp:"Move {{device}} up",moveDown:"Move {{device}} down",remove:"Remove {{device}} from this list"}},prototype:{today:"Today",yesterday:"Yesterday",now:"NOW",endOfDay:"END OF DAY",loading:"Loading...",timeline:"Timeline",events:"Events",playClip:"Play clip",goToNow:"NOW",noEvents:"No events"},eventKind:{motion:"Motion",audio:"Audio",person:"Person",vehicle:"Vehicle",animal:"Animal",package:"Package",sensor:"Sensor",control:"Control",car:"Car",truck:"Truck",bus:"Bus",motorcycle:"Motorcycle",bicycle:"Bicycle",airplane:"Airplane",boat:"Boat",train:"Train",bird:"Bird",cat:"Cat",dog:"Dog",horse:"Horse",sheep:"Sheep",cow:"Cow",elephant:"Elephant",bear:"Bear",zebra:"Zebra",giraffe:"Giraffe",contact:"Contact","motion-sensor":"Motion sensor",smoke:"Smoke",flood:"Water leak",gas:"Gas","carbon-monoxide":"Carbon monoxide",vibration:"Vibration",tamper:"Tamper",presence:"Presence","enum-sensor":"Sensor state","device-event":"Device event",lock:"Lock",cover:"Cover",switch:"Switch",siren:"Siren",button:"Button",doorbell:"Doorbell","package-delivered":"Package delivered","package-picked-up":"Package picked up","audio-speech":"Speech","audio-music":"Music","audio-dog":"Dog","audio-doorbell":"Doorbell","audio-siren":"Siren","audio-alarm":"Alarm","audio-animal":"Animal (other)","audio-bird":"Bird","audio-cat":"Cat","audio-crowd":"Crowd / Chatter","audio-crying":"Crying / Baby","audio-door":"Door","audio-engine":"Engine / Motor","audio-fire":"Fire / Smoke","audio-footsteps":"Footsteps","audio-glass_breaking":"Glass Breaking","audio-gunshot":"Gunshot / Explosion","audio-laughter":"Laughter","audio-scream":"Scream / Shout","audio-silence":"Silence","audio-telephone":"Telephone","audio-tools":"Tools / Construction","audio-vehicle":"Vehicle","audio-water":"Water","audio-wind":"Wind / Weather"}}},2615,[]);
|
|
4516
|
+
__d(function(e,i,a,o,n,t,l){n.exports={devices:{editDevice:"Modifica dispositivo",originalName:"Nome originale",customName:"Nome personalizzato",customNamePlaceholder:"Lascia vuoto per usare l'originale",icon:"Icona",typeLight:"Luce",typeSwitch:"Interruttore",typeCover:"Tapparella",typeLock:"Serratura",typeAlarm:"Allarme",typeButton:"Pulsante",typeSelect:"Selezione",typeSiren:"Sirena",typeSensor:"Sensore",typeEntry:"Ingresso",typeMediaPlayer:"Media Player",typeScript:"Script",run:"Esegui",sourceHA:"Home Assistant",sourceScrypted:"Scrypted",off:"Off",on:"On",mute:"Muto",unmute:"Audio",stop:"Stop",locked:"Chiusa",unlocked:"Aperta",open:"Aperta",closed:"Chiusa",disarmed:"Disinserito",disarm:"Disinserisci"},common:{error:"Errore",save:"Salva",cancel:"Annulla",loading:"Caricamento...",comingSoon:"In arrivo",back:"Indietro",fullscreen:"Schermo intero",exitFullscreen:"Esci da schermo intero",reset:"Reimposta",selectAll:"Seleziona tutte",deselectAll:"Deseleziona tutte",delete:"Elimina",retry:"Riprova"},grids:{newGrid:"Nuova griglia",deleteConfirm:"Eliminare questa griglia?",noGrids:"Nessuna griglia. Creane una per disporre le telecamere in vista mosaico.",createGrid:"Crea griglia",cameras:"telecamere",notFound:"Griglia non trovata.",noCameras:"Nessuna telecamera in questa griglia. Modifica per aggiungerne.",edit:"Modifica",addCamera:"Aggiungi telecamera",presets:"Preset",auto:"Auto",manual:"Manuale",gridName:"Nome griglia",view:"Visualizza",addCameraHint:"Aggiungi almeno una telecamera dal pulsante sopra.",allCamerasAdded:"Tutte le telecamere sono gi\xe0 in griglia",cameraUnavailable:"Telecamera non disponibile",camerasInGrid:"Telecamere nella griglia",addAll:"Aggiungi tutte",addCameras:"Aggiungi Telecamere",backToGrid:"Torna alla Griglia",timelineNotSupported:"Timeline non supportata"},nav:{cameras:"Telecamere",grids:"Griglie",library:"Libreria",notifications:"Notifiche",events:"Eventi",videoclips:"Videoclip",list:"Lista",settings:"Impostazioni"},cameras:{addCamera:"Aggiungi telecamera",pipActive:"PiP attivo",reorderEnable:"Riordina",reorderDisable:"Sblocca",live:"Live",noCameras:"Nessuna telecamera configurata",noIntegrations:"Nessuna integrazione configurata. Aggiungi un sistema per iniziare.",createSystem:"Crea sistema",importFrom:"Importa telecamere da",importSuccess:"Importazione completata",importCount:"{{count}} telecamere importate",selectCamerasToImport:"Seleziona telecamere da importare",selectAll:"Seleziona tutte",deselectAll:"Deseleziona tutte",importSelected:"Importa {{count}} selezionate",noCamerasFound:"Nessuna telecamera trovata",play:"\u25b6 Riproduci",paused:"In pausa",noDataForDate:"Nessun dato per questa data",recordingNotAvailable:"Registrazione non disponibile",noEventsReel:"Nessun evento recente",settings:"Impostazioni",highlightMotion:"Evidenza movimento",highlightOnMotion:"Evidenzia al movimento",highlightAudio:"Evidenza audio",audioMode:"Modalit\xe0",audioModeOff:"Off",audioModeSensor:"Sensore",audioModeLevel:"Livello",audioPreset:"Preset audio",audioPresetCustom:"Personalizzato",audioPresetCrying:"Pianto / neonato",audioPresetAlarm:"Allarme / sirena",audioPresetDog:"Abbaio cane",audioPresetDoorbell:"Campanello / bussata",audioPresetGlass:"Rottura vetro",audioWindow:"Finestra (s)",audioThreshold:"Soglia (dB)",audioHitPercentage:"Percentuale (%)",audioHoldSeconds:"Mantenimento (s)",highlightDetection:"Evidenza rilevamento oggetti",highlightOnDetection:"Evidenzia al rilevamento",detectionClasses:"Classi",holdSeconds:"Mantenimento (s)",rtspNotSupportedWeb:"Gli stream RTSP non sono supportati sul web. Usa l'app mobile.",liveDetections:"Detections live",filterTimeline:"Filtra timeline",filterClasses:"Filtra classi...",filterBySeverity:"Filtra per severit\xe0",severityAlert:"Allarme",severityDetection:"Rilevamento",statusPosition:"Posizione indicatori di stato",today:"Oggi",yesterday:"Ieri",timeline:"Timeline",timelineEventsClusterEvents:"Eventi",selectDate:"Seleziona una data",videoclipsNotSupported:"Videoclip non supportati per questa telecamera",noVideoclipsForDate:"Nessun videoclip per questa data",endOfList:"Fine elenco",backToLive:"Torna al live",goLive:"Vai al live",loadingClip:"Caricamento clip...",clusterDetailShowBbox:"Mostra bounding box sull'immagine",clusterDetailOpenVideoclip:"Apri videoclip",clusterDetailLoadingEvents:"Caricamento eventi...",devices:"Dispositivi",noAssociatedDevices:"Nessun dispositivo collegato. Configura in Impostazioni > Telecamere.",timelineData:"Dati timeline",timelineDataHint:"Cosa mostrare sulla timeline.",timelineDataVideoclips:"Videoclip",timelineDataAdvancedNotifier:"Advanced Notifier",timelineDataEvents:"Eventi",timelineEvents:"Eventi timeline",timelineEventsHint:"Quali tipi di eventi mostrare sulla timeline, in base alla severit\xe0.",timelinePresetAll:"Tutti",timelinePresetImportant:"Importanti",timelinePresetCritical:"Critici",timelinePresetCustom:"Personalizzato",statusBlock:"Blocco stato",sensorsBlock:"Blocco sensori",position:"Posizione",indicators:"Indicatori",downloadSnapshot:"Scarica Istantanea",exportDownloadClip:"Scarica Clip",exportRecordingWebOnly:"Esporta registrazione (solo web)",exportSnapshot:"Esporta Istantanea",intercomError:"Errore interfono",multiCam:"Multi-Camera",ptzNotSupported:"PTZ non supportato",ptzSelectPreset:"Seleziona Preset PTZ",snapshotFailed:"Istantanea fallita"},events:{loading:"Caricamento eventi...",filterByLabel:"Filtra per etichetta",filterByLabelPlaceholder:"es. person, doorbell",filterByCamera:"Filtra per telecamera",date:"Data",source:"Sorgente",cameras:"Telecamere",groupingRange:"Raggruppamento",groupingPresetMinutes:"{{m}} min",groupingCustom:"Personalizzato",groupingCustomMinutes:"Minuti",groupingCustomApply:"Applica",today:"Oggi",noCamerasFromConfig:"Telecamere caricate dalla config EventsApp",all:"Tutti",typesCount:"{{count}} tipi",camerasCount:"{{count}} telecamere",cols:"col",sourceAuto:"Auto",sourceNVR:"NVR",sourceFrigate:"Frigate",sourceVideoClips:"API VideoClips",sourceRawDetection:"Raw",sourceAdvancedNotifier:"Advanced Notifier",noScryptedIntegration:"Aggiungi un'integrazione Scrypted in Impostazioni per vedere gli eventi.",frigateNoEvents:"Gli eventi sono disponibili solo per Scrypted. Seleziona un'istanza Scrypted in Impostazioni.",noSource:"Aggiungi un'integrazione Scrypted o Frigate in Impostazioni, poi selezionala come sorgente per Eventi e Videoclip.",loadError:"Errore nel caricamento degli eventi",noEvents:"Nessun evento per questa data. Prova a cambiare data o filtri.",clearCacheTitle:"Svuota cache",clearCacheMessage:"Svuotare tutti i dati in cache di eventi e videoclip? Verr\xe0 effettuato un nuovo caricamento al prossimo accesso.",clearCacheConfirm:"Svuota",columnsPerRow:"Colonne per riga",onlyWithClips:"Solo con clip",relatedClip:"Clip Correlata"},settings:{integrations:"Integrazioni",camstackProxy:"CamStack Proxy",scrypted:"Scrypted",frigate:"Frigate",rtsp:"RTSP",homeAssistant:"Home Assistant",name:"Nome",baseUrl:"URL base",urlLocal:"URL locale",urlPublic:"URL pubblico",username:"Username",password:"Password",token:"Token (opzionale)",frigateTokenHint:"Token (opzionale): JWT dal browser",tokenRequired:"Token",testConnection:"Test connessione",testLocal:"Test Local",testPublic:"Test Public",testMqtt:"Test MQTT",connectionOk:"Connessione riuscita",connectionError:"Connessione fallita",scryptedCredentialsPromptTitle:"Accesso Scrypted",scryptedCredentialsPromptSubtitle:"Inserisci username e password Scrypted per connettere.",scryptedCredentialsPromptSkip:"Salta per ora",usernamePlaceholder:"admin",save:"Salva",tabStream:"Stream e riproduzione",tabGeneral:"Generale",data:"Dati",clearCacheEventsClips:"Svuota cache eventi e videoclip",eventsClipsSourceHint:"Sorgente per le schede Eventi e Videoclip.",hubReelTitle:"Hub & Reel",reelIntegrationsHint:"Scegli quali integrazioni usare per il reel.",reelScryptedSourceHint:"Con Scrypted: sorgente eventi per il reel.",eventsClipsAuto:"Auto",eventsClipsNoInstance:"Aggiungi prima un'integrazione Scrypted o Frigate.",exportBackup:"Esporta backup",exportError:"Esportazione fallita",importBackup:"Importa backup",importConfirm:"Questo sostituir\xe0 tutte le telecamere, integrazioni e impostazioni con i dati del backup. Continuare?",importSuccess:"Backup ripristinato con successo",importError:"Importazione fallita",uiPrototypes:"Prototipi UI",uiPrototypesHint:"Esplora design sperimentali della timeline",versions:"Versioni",appVersion:"App",nativeVersion:"Nativa",updateNow:"Aggiorna ora",updateError:"Aggiornamento fallito",updateAvailableTitle:"Aggiornamento disponibile",updateAvailableMessage:"Una nuova versione di CamStack \xe8 stata scaricata ed \xe8 pronta per l'installazione. L'app verr\xe0 riavviata per applicare l'aggiornamento.",updateInstall:"Installa e riavvia",updateLater:"Pi\xf9 tardi",tabIntegrations:"Integrazioni",tabCameras:"Telecamere",theme:"Tema",themeSystem:"Sistema",themeLight:"Chiaro",themeDark:"Scuro",language:"Lingua",languageSystem:"Sistema",languageEn:"English",languageIt:"Italiano",timelineMode:"Modalit\xe0 timeline",timelineModeClassic:"Classica",timelineModeTheater:"Theater",timeline:"Timeline",timelineVisible:"Mostra timeline rilevamenti",timelineVisibleDescription:"Visualizza il pannello della timeline nella vista telecamera.",clusterSize:"Dimensione cluster",snapshotInterval:"Intervallo aggiornamento snapshot",clusterSizeXS:"Molto piccola",clusterSizeS:"Piccola",clusterSizeM:"Normale",clusterSizeL:"Grande",clusterSizeXL:"Molto grande",highlightAppearance:"Aspetto evidenze",highlightAppearanceHint:"Colore e spessore del bordo per evidenze movimento, audio e rilevamento sugli stream delle telecamere.",highlightMotion:"Movimento",highlightAudio:"Audio",highlightDetection:"Rilevamento",highlightColor:"Colore",highlightThickness:"Spessore",selectSection:"Seleziona sezione",addSystem:"Aggiungi sistema",selectPlatform:"Seleziona piattaforma",deleteInstance:"Elimina istanza",deleteInstanceConfirm:"Vuoi eliminare questa istanza?",delete:"Elimina",mqttEvents:"MQTT - Eventi in tempo reale",mqttBrokerUrl:"URL broker MQTT",mqttUsername:"Username MQTT",mqttPassword:"Password MQTT",mqttTopicPrefix:"Prefisso topic (default: frigate)",mqttOptional:"Opzionale",scryptedAddressAlreadyUsed:"Questo indirizzo Scrypted \xe8 gi\xe0 configurato. \xc8 consentita una sola istanza per indirizzo.",scryptedAdvancedNotifierRequired:"Il plugin Advanced Notifier \xe8 richiesto per la connessione.",scryptedCorsTitle:"Configurazione CORS richiesta (Web)",scryptedCorsBody:"In Scrypted, apri le impostazioni del plugin Cloud e aggiungi il tuo dominio ({{domain}}) alla lista CORS Allowed Origins. Senza questa configurazione, il browser bloccher\xe0 le richieste verso il server Scrypted.",scryptedUrlHint:"L'URL locale viene provato per primo (es. in LAN), poi quello pubblico. Ne serve almeno uno.",gridLayout:"Layout griglia",gridLayoutHint:"Opzioni di visualizzazione per la griglia telecamere.",gridColumns:"Colonne griglia",gridColumnsHint:"Numero di telecamere per riga. Auto = 1 su mobile, 4 su tablet.",gridShowName:"Mostra nome telecamera",gridShowState:"Mostra stato (batteria, registrazione, sleep)",reorderCameras:"Riordina telecamere",reorderCamerasHint:"Trascina per riordinare le telecamere",reorderDone:"Fatto",manageCameras:"Gestisci telecamere",manageCamerasHint:"Rimuovi telecamere dall'app.",downloadSnapshot:"Scarica snapshot",snapshotFailed:"Impossibile recuperare lo snapshot",exportSnapshot:"Snapshot",exportDownloadClip:"Scarica clip",exportStartRecording:"Avvia registrazione",exportStopRecording:"Ferma registrazione",exportRecordingWebOnly:"Registrazione disponibile su web",intercomError:"Intercom non disponibile. Verifica le credenziali della telecamera su Scrypted.",deleteCamera:"Rimuovi telecamera",deleteCameraConfirm:"Rimuovere {{name}} dall'app?",streamPlayback:"Stream e riproduzione",playOnOpen:"Avvia stream all'apertura telecamera",playOnOpenHint:"Carica automaticamente lo stream live quando apri una telecamera.",audioOnOpen:"Audio attivo all'apertura",audioOnOpenHint:"Riproduci audio quando apri una telecamera (se supportato).",streamWatchdog:"Stream watchdog",streamWatchdogHint:"Riavvia lo stream quando non arrivano dati (aiuta con connessioni bloccate).",cameraPlayer:"Player telecamera",webViewCameraDetail:"Usa player WebView",webViewCameraDetailHint:"Usa WebView per le telecamere Scrypted (primo frame pi\xf9 veloce, pi\xf9 stabile). PiP, fullscreen e intercom funzionano. Default: player nativo.",streamQuality:"Qualit\xe0 stream",streamQualitySingle:"Qualit\xe0 singola telecamera",streamQualityGrid:"Qualit\xe0 griglia",qualityAuto:"Auto",qualityHigh:"High",qualityMedium:"Mid",qualityLow:"Sub",auto:"Auto",associatedDevices:"Dispositivi associati",associatedDevicesHint:"Aggiungi attuatori (luci, interruttori, tapparelle, ecc.) per controllarli dalla vista telecamera.",linkedDevices:"Collegati",reorderHint:"Usa le frecce per riordinare",addDevice:"Aggiungi dispositivo",noEligibleDevices:"Nessun Scrypted o Home Assistant configurato. Aggiungi prima un'integrazione.",configureDevices:"Configura dispositivi",cameraSettingsHint:"Scegli una telecamera per configurarne le opzioni.",noCamerasConfigured:"Nessuna telecamera configurata.",searchDevices:"Cerca dispositivi...",source:"Sorgente",type:"Tipo",all:"Tutti",noMatchingDevices:"Nessun dispositivo corrisponde ai filtri.",frigateStream:"Stream Frigate",frigateStreamSourceHint:"Sorgente stream: WebRTC (default), RTSP o MJPEG.",frigateStreamMapping:"Mappatura stream (nomi go2rtc da config)",frigateStreamMappingHint:"Seleziona dagli stream go2rtc disponibili. Ordine: High, Mid, Sub.",frigateSelectStream:"Seleziona stream",frigateAddStream:"Aggiungi stream",frigateInfo:"Info telecamera",frigateShowConfig:"Mostra config",frigateShowGo2rtc:"Mostra go2rtc",frigateMissingConfig:"Mancano baseUrl o cameraName nella config della telecamera.",tabLogs:"Log",logsCount:"{{count}} voci",logsDownload:"Scarica",logsClear:"Svuota",logsEmpty:"Nessun log. L'output della console apparir\xe0 qui.",logsExportError:"Esportazione fallita",logsExportTitle:"Esporta log",logsClearConfirmTitle:"Svuota log",logsClearConfirmMessage:"Rimuovere tutte le voci di log?",hubAppearanceTitle:"Aspetto",hubAppearanceDesc:"Tema, lingua, timeline e evidenze",hubCamerasTitle:"Telecamere",hubCamerasDesc:"Layout griglia, qualit\xe0 stream e gestione telecamere",hubIntegrationsTitle:"Integrazioni",hubIntegrationsDesc:"Gestisci Scrypted, Frigate e altri sistemi",hubAdvancedTitle:"Avanzato",hubAdvancedDesc:"Backup dati e gestione cache",hubLogsTitle:"Log",hubLogsDesc:"Visualizza ed esporta i log dell'applicazione",hubCacheTitle:"Cache",frigateAutoSnap:"Istantanea Automatica",frigateSegmentNav:"Navigazione Segmenti",frigateShowGo:"Mostra Go2RTC",frigateTimeline:"Timeline",reelCameras:"Telecamere Reel",reelCamerasHint:"Seleziona quali telecamere appaiono nel reel eventi",reelDeselectAll:"Deseleziona Tutto",reelDetectionClasses:"Classi di Rilevamento",reelDetectionClassesHint:"Filtra gli eventi per classe di rilevamento",reelIncludeRuleArtifacts:"Includi Artefatti Regole",reelIncludeRuleArtifactsHint:"Mostra gli eventi basati su regole nel reel",reelRuleArtifacts:"Artefatti Regole",reelSelectAll:"Seleziona Tutto",reelBadgeContent:"Contenuto badge",reelBadgePosition:"Posizione badge",reelBadgeSize:"Dimensione badge",reelBadgeBoth:"Ora + Classe",reelBadgeTime:"Solo ora",reelBadgeClass:"Solo classe",reelBadgeNone:"Nascosto",reelBadgeSmall:"Piccolo",reelBadgeMedium:"Medio",reelBadgeLarge:"Grande"},reel:{filterMotion:"Motion",filterOnlyRules:"Solo rule",filterOnlySensors:"Solo sensori",goToMostRecent:"Vai al pi\xf9 recente"},v2:{common:{connecting:"Connessione\u2026",online:"Online",offline:"Offline",loadError:"Errore di caricamento",create:"Crea",back:"Indietro",on:"On",off:"Off",confirm:"Conferma",cancel:"Annulla",ok:"OK",done:"Fatto"},cameras:{empty:"Nessuna telecamera",hubNotAnswering:"L'hub non risponde. Alcune telecamere potrebbero appartenere a un nodo attualmente offline \u2014 trascina per riprovare.",statusOnline:" \xb7 online",statusOffline:" \xb7 offline",motion:"Movimento",doorbell:"Campanello",doorbellRinging:"Sta suonando",doorbellLastRing:"Suonato {{time}} fa",snapshotLoading:"Caricamento\u2026",refreshing:"Aggiornamento\u2026",stationaryFor:"stazionario {{min}}m",manage:"Gestisci telecamere",manageHint:"Trascina per riordinare. Rinomina al volo. Usa lo switch per mostrare o nascondere una telecamera dall\u2019elenco.",arrangeStart:"Riordina l\u2019elenco",arrangeConfirm:"Salva questo ordine",arrangeCancel:"Annulla le modifiche",arrangeHint:"Trascina le telecamere nell\u2019ordine che vuoi, poi tocca la spunta per salvarlo. La spunta salva; la croce rimette l\u2019elenco com\u2019era. Quest\u2019ordine resta solo su questo dispositivo.",reorderHandle:"Trascina per riordinare",appearance:"Aspetto",editList:"Modifica elenco",listOptions:"Opzioni elenco telecamere",controlsA11y:"Controlli telecamera",disabledTitle:"Fuori servizio",disabledHint:"Disattivata da un amministratore",emptyOutOfScope:"Nessuna telecamera nel tuo profilo di accesso",emptyOutOfScopeHint:"Al tuo account non \xe8 ancora assegnata nessuna telecamera. Chiedi a chi amministra questo hub di darti accesso.",snapshotStale:"Snapshot di {{age}} fa",hubNotProvisioning:"L'hub non risponde",reelFilter:"Eventi recenti",reelFilterAll:"Mostra tutti gli eventi",reelFilterDefaultHint:"Solo eventi di rilevamento \u2014 audio e sensori sono nascosti",reelFilterCount:"{{count}} tipi di evento mostrati",reelFilterUseDefault:"Predefinito",reelFilterShowAll:"Tutto",reelFilterDefaultTag:"Rilevamenti",reelFilterCountTag:"{{count}} tipi",overlayA11y:"Apri nella finestra mobile",favourites:"Preferite",locationFilter:"Filtra per luogo",bucketEmpty:"Qui non c\u2019\xe8 niente. Aggiungi una camera col cuore, o scegli un altro luogo qui sopra."},cameraDetail:{fallbackName:"Camera #{{id}}",mute:"Disattiva audio",unmute:"Attiva audio",snapshot:"Istantanea",snapshotFailed:"Impossibile acquisire l'istantanea.",ptz:"Controlli PTZ",talk:"Parla",fullscreen:"Schermo intero",talkFailed:"Impossibile avviare la comunicazione. Verifica l'accesso al microfono.",pip:"Picture in Picture",exitFullscreen:"Esci da schermo intero",devices:"Dispositivi",devicesEmpty:"Nessun dispositivo collegato.",linkedModeAuto:"Collegamento: Auto (posizione)",linkedModeManual:"Collegamento: Manuale",close:"Chiudi",deviceOnline:"Online",deviceOffline:"Offline"},grids:{createA11y:"Crea griglia",empty:"Nessuna griglia",emptyHint:"Tocca + per creare la tua prima griglia",countNone:"Nessuna telecamera",countOne:"1 telecamera",countOther:"{{count}} telecamere",defaultName:"Nuova griglia",deleteTitle:"Elimina griglia",deleteConfirm:"Eliminare \"{{name}}\"? L'operazione non \xe8 reversibile.",export:"Esporta",exportAllA11y:"Esporta tutte le griglie",shareA11y:"Condividi griglia",editA11y:"Modifica griglia",deleteA11y:"Elimina griglia",linkCopied:"Link della griglia copiato negli appunti",layoutAuto:"Auto",layoutColumns:"{{count}} col",camerasUnknown:"Telecamere non ancora caricate",highlightOff:"Evidenziazione off",hiddenCount_one:"{{count}} nascosta",hiddenCount_other:"{{count}} nascoste",offlineCount_one:"{{count}} offline",offlineCount_other:"{{count}} offline",disabledCount_one:"{{count}} spenta",disabledCount_other:"{{count}} spente",missingCount_one:"{{count}} non disponibile",missingCount_other:"{{count}} non disponibili"},gridView:{editA11y:"Modifica griglia",fallbackTitle:"Griglia",notFound:"Griglia non trovata",emptyGrid:"Questa griglia \xe8 vuota",addCameras:"Aggiungi telecamere",reorderTitle:"Riordina telecamere",reorderA11y:"Riordina telecamere",reorderDoneA11y:"Fine riordino",allHidden:"Tutte le telecamere sono nascoste. Usa la modalit\xe0 riordino per mostrarne alcune.",dragA11y:"Trascina per riordinare",hideA11y:"Nascondi dalla griglia",showA11y:"Mostra nella griglia",removeA11y:"Rimuovi dalla griglia",adhocTitle:"Griglia rapida",cellActions:"Azioni telecamera",cellActionsA11y:"Altre azioni per questa telecamera",cellDevicesA11y:"Dispositivi collegati",cellMenuA11y:"Opzioni di visualizzazione"},gridBuilder:{title:"Modifica griglia",nameLabel:"Nome",namePlaceholder:"Nome griglia",camerasSelected:"Telecamere ({{count}} selezionate)",optionsTitle:"Opzioni",showName:"Mostra nome telecamera",export:"Esporta griglia",orderSection:"Nella griglia",orderHint:"Trascina per riordinare",emptyOrder:"Nessuna telecamera \u2014 aggiungine qui sotto.",addSection:"Aggiungi telecamere",removeA11y:"Rimuovi dalla griglia",addA11y:"Aggiungi alla griglia",highlightMotion:"Su movimento",highlightAudio:"Su audio",highlightAudioLow:"Basso",highlightAudioMid:"Medio",highlightAudioHigh:"Alto",highlightAudioLevel:"Livello",highlightThreshold:"Soglia",highlightHold:"Mantieni",highlightDetection:"Su rilevamento",clusterLabel:"Etichetta cluster",clusterLabelIcon:"Icona",clusterLabelText:"Testo"},gridBar:{back:"Indietro",pauseAll:"Metti tutto in pausa",playAll:"Riproduci tutto",audio:"Audio",quality:"Qualit\xe0 stream",layout:"Layout",timeline:"Timeline",highlightMenu:"Evidenziazione e overlay",activeOnly:"Solo attive",share:"Condividi griglia",edit:"Modifica griglia",hide:"Nascondi controlli",show:"Mostra controlli",muteAll:"Silenzia tutte",unmuteAll:"Riattiva audio"},gridMenu:{highlightMaster:"Bordi di evidenziazione"},gridShare:{title:"Condividi \"{{name}}\"",quality:"Qualit\xe0 stream",layout:"Layout",showNames:"Mostra nomi delle camere",activeOnly:"Solo camere attive",boxes:"Bounding box",highlightEnable:"Evidenziazione",audioSummary:"Audio attivo all\u2019apertura per {{count}} camera/e",ttlTitle:"Scadenza del link",ttl_1d:"1 giorno",ttl_7d:"7 giorni",ttl_30d:"30 giorni",ttl_never:"Per sempre",tokenNotice:"Il link include un token di sola visualizzazione limitato a queste camere. Chiunque abbia il link pu\xf2 guardare finch\xe9 non scade o viene revocato.",copyLink:"Copia link",creating:"Creazione link\u2026",copiedExpires:"Link copiato \u2014 scade il {{date}}",copiedNever:"Link copiato \u2014 non scade mai",error:"Impossibile creare il link di condivisione. Controlla la connessione e riprova.",optionAuto:"Auto"},gridControls:{play:"Riproduci",pause:"Pausa",mute:"Muto",unmute:"Riattiva audio",quality:"Qualit\xe0",layout:"Layout",layoutAuto:"Auto"},events:{comingSoon:"Eventi \u2014 in arrivo",searchLabel:"Cerca etichetta\u2026",searchSubmit:"Cerca",searchClear:"Cancella ricerca",empty:"Nessun evento",today:"Oggi",yesterday:"Ieri",weekdayShort:{sun:"Dom",mon:"Lun",tue:"Mar",wed:"Mer",thu:"Gio",fri:"Ven",sat:"Sab"},filteredEmpty:"Nessuna corrispondenza nell'intervallo caricato",loadOlder:"Carica meno recenti",selectPrompt:"Seleziona un evento per vederne i dettagli",filters:"Filtri",more:"Altro",all:"Tutte",day:"Giorno",sort:"Ordina",sortTime:"Recenti",sortImportance:"Importanza",flaggedOnly:"Contrassegnate",flaggedOnlyHint:"Preferite, debug o da addestrare",parked:"Stazionari",showStationary:"Mostra stazionari",showStationaryHint:"Spento = nascondi le promozioni parcheggiate",cameras:"Telecamere",classes:"Classi",attributes:"Rilevati",attrFaces:"Volti",attrPlates:"Targhe",attributesHint:"Nessuno = tutti",search:"Cerca",searchCameras:"Cerca telecamere\u2026",searchClasses:"Cerca classi\u2026",allCamerasHint:"Nessuna = tutte",allClassesHint:"Nessuna = tutte",done:"Fatto",density:"Densit\xe0",selectHint:"Seleziona un evento",unrecognizedFace:"Volto rilevato, non riconosciuto",eventKinds:"Tipi di evento",displayOptions:"Aspetto",displayTitle:"Opzioni di visualizzazione",useDefaultClasses:"Predefinito"},settings:{themeSystem:"Sistema",themeDark:"Scuro",themeLight:"Chiaro",server:"Server",account:"Accesso come",accountUnknown:"Caricamento\u2026",roleAdmin:"Admin",roleViewer:"Viewer",hubActive:"Hub attivo",changeServer:"Cambia server",signOut:"Esci",network:"Rete",networkNone:"Nessuna rotta ancora rilevata",endpointUnlikely:"Probabilmente non utilizzabile",activeRoute:"Rotta in uso",routeChannelLan:"LAN (diretta)",routeChannelPublic:"Tunnel pubblico",routeChannelLoopback:"Locale (loopback)",routeChannelUnknown:"Non riconosciuta",routeReasonInitial:"configurata, gara non ancora conclusa",routeReasonRaceWon:"la pi\xf9 veloce nella gara delle rotte",routeReasonNoWinner:"ripiego \u2014 nessun candidato ha risposto",routeReasonUnchanged:"invariata dall'ultimo rilevamento",routeReasonDisposed:"nessun trasporto",reprobe:"Ri-rileva rotte",reprobing:"Rilevamento\u2026",diagnoseNetwork:"Diagnostica rotte LAN",diagnosingNetwork:"Diagnostica in corso\u2026",diagnoseNetworkDone:"{{ok}}/{{total}} hanno risposto a /health. Apri i log e condividili \u2014 cerca ipv4/ipv6 http FAIL.",preferredRoute:"Rotta preferita",routeAuto:"Automatica",routeReasonPinned:"forzata dalle Impostazioni",appearance:"Aspetto",theme:"Tema",info:"Info",app:"App",version:"Versione",noServer:"Nessun server",footerNote:"CamStack Viewer si connette a un singolo hub camstack. Telecamere, griglie ed eventi sono gestiti dal server.",language:"Lingua",langSystem:"Sistema",gridDefaults:"Impostazioni griglia",showName:"Mostra nome telecamera",showNameHint:"Sovrapponi il nome della telecamera su ogni riquadro",showState:"Mostra stato",showStateHint:"Mostra lo stato online / registrazione su ogni riquadro",columns:"Colonne",cameraOrder:"Ordine telecamere",orderName:"Per nome",orderCustom:"Personalizzato",motionHold:"Persistenza evidenziazione movimento",motionHoldHint:"Mantieni accesa l'evidenziazione del movimento su una tile per questo tempo dopo che il movimento si ferma.",motionHoldOff:"Off",streamQuality:"Qualit\xe0 stream",streamDefaults:"Impostazioni stream",playOnOpen:"Riproduci all'apertura",playOnOpenHint:"Avvia lo stream live quando apri una telecamera",audioOnOpen:"Audio all'apertura",audioOnOpenMode:{"last-selected":"Come l'hai lasciato",on:"Sempre acceso",off:"Sempre spento"},audioOnOpenModeHint:{"last-selected":"Ogni camera si apre com'era l'ultima volta. Una camera su cui non hai mai scelto si apre muta.",on:"Ogni camera si apre con l'audio.",off:"Ogni camera si apre muta."},snapshotInterval:"Aggiornamento snapshot",highlightAppearance:"Aspetto evidenziazione",highlightMotionColor:"Colore movimento",highlightAudioColor:"Colore audio",highlightDetectionColor:"Colore rilevamento",highlightThickness:"Spessore bordo",qualityAuto:"Auto",qualityHigh:"Alta",qualityMid:"Media",qualityLow:"Bassa",secondsValue:"{{count}}s",advanced:"Avanzate",clearCache:"Svuota cache",clearCacheHint:"Libera snapshot e dati in cache (mantiene server e impostazioni)",clearCacheConfirmTitle:"Svuotare la cache?",clearCacheConfirmBody:"Rimuove immagini e dati in cache. Server, accesso e impostazioni vengono mantenuti.",clearCacheDone:"Cache svuotata",exportSettings:"Esporta impostazioni",exportSettingsHint:"Copia le impostazioni in formato JSON",exportSettingsDone:"Impostazioni copiate in JSON",shareTitle:"Condividi impostazioni",shareHint:"Salva uno snapshot nominato di impostazioni, griglie e preferenze telecamere sul hub. Chiunque sia connesso pu\xf2 importarlo \u2014 sostituisce quanto c'\xe8 su questo dispositivo.",shareNamePlaceholder:"Nome snapshot",shareSave:"Salva",shareEmpty:"Nessuno snapshot",shareImportTitle:"Importare questo snapshot?",shareImportBody:"\"{{name}}\" sostituir\xe0 impostazioni, griglie e preferenze telecamere su questo dispositivo.",shareDeleteTitle:"Eliminare questo snapshot?",shareDeleteBody:"\"{{name}}\" verr\xe0 rimosso dal hub.",shareFailed:"Impossibile condividere le impostazioni",shareInvalid:"Questo snapshot non \xe8 un documento di impostazioni valido.",shareMissing:"Questo snapshot non \xe8 pi\xf9 sul hub.",viewLogs:"Visualizza log",viewLogsHint:"Messaggi di log recenti dell'app",logsEmpty:"Nessun log registrato",keepLogs:"Mantieni log",keepLogsHint:"Registra un buffer dei messaggi di log dell'app",debugMode:"Modalit\xe0 debug",debugModeHint:"Log verbosi su live, playback e scrub \u2014 inviati al server",logsClear:"Pulisci",resetSettings:"Ripristina impostazioni",resetSettingsHint:"Ripristina tutti i valori predefiniti",resetConfirmTitle:"Ripristinare le impostazioni?",resetConfirmBody:"Ripristina tutte le impostazioni ai valori predefiniti.",cancel:"Annulla",confirm:"Conferma",timeline:"Timeline",reel:"Sequenza eventi",reelThumbSize:"Dimensione miniature",reelThumbSizeHint:"Dimensione delle miniature nella sequenza eventi recenti.",reelSizeSmall:"Piccola",reelSizeMedium:"Media",reelSizeLarge:"Grande",reelShowLabels:"Mostra etichette",reelShowLabelsHint:"Mostra l'etichetta classe/identit\xe0 sugli elementi della sequenza.",reelLabelStyle:"Visualizzazione classe",reelLabelStyleHint:"Mostra la classe di rilevamento come icona o come testo negli elementi della sequenza.",reelShowImportance:"Mostra importanza",reelShowImportanceHint:"Mostra il badge di importanza sugli elementi della sequenza.",events:"Eventi",eventsPage:"Pagina eventi",minImportance:"Importanza minima",minImportanceHint:"Nascondi gli eventi con punteggio inferiore, nella pagina eventi e nella timeline della telecamera.",minImportanceOff:"Off",tileShowLabels:"Mostra etichette",tileShowLabelsHint:"Mostra le etichette classe / identit\xe0 / audio sulle schede evento.",tileShowImportance:"Mostra importanza",tileShowImportanceHint:"Mostra il badge di importanza sulle schede evento (se valutato).",tileShowCameraName:"Mostra nome telecamera",tileShowCameraNameHint:"Mostra il nome della telecamera nel pi\xe8 di pagina della scheda evento.",tileLabelStyle:"Visualizzazione classe",tileLabelStyleHint:"Mostra la classe di rilevamento come icona o come testo.",tileLabelStyleIcon:"Icona",tileLabelStyleText:"Testo",comingSoon:"Prossimamente",cameras:"Telecamere",manageCameras:"Gestisci telecamere",manageCamerasHint:"Rinomina, nascondi, riordina",notifications:"Notifiche",notificationsManage:"Gestisci notifiche",pinchExpandsHeight:"Il pizzico ingrandisce la vista",pinchExpandsHeightHint:"Pizzicando per lo zoom il video cresce in altezza (ritaglia i bordi laterali sulle camere 16:9).",navBarOnStream:"Barra di navigazione sulla singola camera",navBarOnStreamHint:"Mantiene visibile la navigazione principale mentre guardi una camera. Sulle finestre larghe la navigazione laterale c'\xe8 gi\xe0.",reopenLastCamera:"Riapri l'ultima camera",reopenLastCameraHint:"All'avvio riapre la camera che stavi guardando. Solo se guardarla \xe8 stata l'ultima cosa che hai fatto \u2014 cambiare pagina la dimentica.","timeline.gapPercent":"Gap cluster (%)","timeline.sizePercent":"Dimensione cluster (%)","timeline.indicatorPositionPct":"Posizione indicatore (%)","timeline.showImportance":"Mostra importanza sugli elementi","timeline.showClass":"Mostra classe di rilevamento sugli elementi","timeline.cardWidthPct":"Larghezza card (%)",hapticsUiFeedback:"Vibra alla pressione",hapticsUiFeedbackHint:"Una breve vibrazione conferma pulsanti, interruttori, PTZ e comandi del player. Solo su dispositivo (iOS/Android).",buildNumber:"Build",runtimeVersion:"Runtime",runningBundle:"Bundle in esecuzione",checkUpdates:"Controlla aggiornamenti",checkingUpdates:"Controllo\u2026",updateUpToDate:"Sei gi\xe0 all'ultima versione.",updatesDisabled:"Gli aggiornamenti sono disattivati in questa build.",updateReadyTitle:"Aggiornamento scaricato",updateReadyBody:"Riavviare l'app ora per applicarlo?",updateCheckFailed:"Impossibile controllare gli aggiornamenti",listOverlays:"Schede videocamere",listMotionBorder:"Anello movimento",listMotionBorderHint:"Pulsa un anello attorno alla scheda mentre la videocamera vede movimento.",listMotionBadge:"Posizione badge movimento",listOccupancy:"Posizione occupazione",useNativeRenderer:"Usa il renderer integrato",useNativeRendererHint:"Disegna Recenti ed Eventi dentro l\u2019app invece di caricare l\u2019embed ospitato dall\u2019hub.",toolbarDensity:"Altezza barra strumenti","toolbarDensity.small":"Piccola","toolbarDensity.medium":"Media","toolbarDensity.large":"Grande",general:"Generale",templateFollowTitle:"Seguire questo template?",templateFollowBody:"Questo dispositivo prender\xe0 automaticamente l\u2019ultima versione di \xab{{name}}\xbb. Le impostazioni condivise di questo dispositivo verranno sostituite, ora e a ogni aggiornamento del template.",templateFollowing:"Segue questo template",templateProducing:"Questo dispositivo lo aggiorna"},nc:{title:"Notifiche",tabs:{rules:"Regole",targets:"Targets",snooze:"Silenzia"},rulesPlaceholder:"Le regole di notifica appariranno qui.",targetsPlaceholder:"Le destinazioni di consegna appariranno qui.",rules:{add:"Nuova regola",empty:"Nessuna regola.",loadError:"Impossibile caricare le regole. Riprova.",mine:"Le mie regole",admin:"Regole admin",system:"Eventi di sistema",personalBadge:"Personale",adminBadge:"Admin",edit:"Modifica",delete:"Elimina",cancel:"Annulla",deleteConfirmTitle:"Eliminare la regola?",deleteConfirmMessage:"Eliminare \"{{name}}\"? L'operazione non \xe8 reversibile.",receiveOn:"Ricevi su {{name}}",noOwnedTargets:"Questa regola non invia ad alcuna delle tue destinazioni.",section:{empty:{timelapse:"Nessun timelapse. Un timelapse trasforma una notte di registrazioni in un video breve e lo invia alla chiusura della finestra \u2014 scegli le telecamere e le ore.",summary:"Nessun riepilogo. Un riepilogo raccoglie lo scatto migliore di tutto ci\xf2 che \xe8 passato davanti a pi\xf9 telecamere e invia una sola immagine."},create:{timelapse:"Nuovo timelapse",summary:"Nuovo riepilogo"},timelapse:"Timelapse",summary:"Riepilogo"},mediaBadge:{attach:{"best-matching":"Immagine pertinente",keyFrame:"Fotogramma chiave",none:"Nessuna immagine"},frame:{full:"Tutta la scena",boxed:"Scena con riquadri"},zoneCrop:"Ritaglio zona",gif:"GIF",clip:"Video",profile:"Qualit\xe0 {{profile}}"},editor:{createTitle:"Nuova regola",editTitle:"Modifica \"{{name}}\"",basics:"Generali",nameLabel:"Nome",namePlaceholder:"es. Persone al portone",triggerLabel:"Attivazione",priorityLabel:"Priorit\xe0",targetsLabel:"Invia a",noTargets:"Non hai ancora destinazioni. Aggiungine una nella scheda Destinazioni.",pickTarget:"Seleziona almeno una destinazione.",conditionsLabel:"Condizioni",section:{rule:"Regola",devices:"Telecamere",conditions:"Condizioni",notification:"Notifica",actions:"Azioni",advanced:"Avanzate"},kindSection:{detection:"Condizioni",sensor:"Condizioni",sound:"Suono",occupancy:"Occupazione","device-events":"Eventi dispositivi",system:"Eventi",alarm:"Eventi allarme",mixed:"Eventi"},kindBlurb:{detection:"Una persona, un veicolo o un animale visto dalla telecamera. Restringi per classe, zona, volto o targa; il resto \xe8 facoltativo.",sensor:"Un campanello premuto o un sensore collegato che cambia stato. L'immagine arriva dalla telecamera a cui il sensore \xe8 attribuito.",sound:"Scatta su una finestra audio confermata, mai su un'immagine. Indica i suoni e/o mantieni una soglia di livello: senza nessuno dei due non pu\xf2 mai scattare.",occupancy:"Scatta quando il conteggio nell'inquadratura o in una zona supera la tua soglia e la mantiene. Scegli prima la telecamera: l'elenco delle zone \xe8 quello di quella telecamera.","device-events":"Un dispositivo o il suo stream che cade o torna, spento o riacceso, una batteria o un consumabile in esaurimento, una telecamera che non rileva nulla. Non c'\xe8 un fotogramma da allegare.",system:"L'impianto stesso: un nodo che esce, un addon in crash continuo, un aggiornamento disponibile o installato, un backup o un'esportazione completati.",alarm:"La centrale d'allarme: inserimento rifiutato, in inserimento, inserita, ritardo d'ingresso, scattata, reinserita, sensore escluso, disinserita.",mixed:"Questa regola mescola eventi di pi\xf9 famiglie (dispositivi, sistema, allarme). Continua a funzionare cos\xec com'\xe8, ma non \xe8 pi\xf9 modificabile: crea una regola per famiglia, poi elimina questa."},dropTitle:"Verranno rimossi al salvataggio",dropHint:"Questo tipo di regola non pu\xf2 usarli, e tenerli la lascerebbe silenziosa.",condition:{systemEvent:"Evento di sistema",sensorKinds:"Tipi di sensore",eventTypeTokens:"Token del tipo di evento",source:"Origine del rilevamento",classes:"Classi di oggetti",classesExclude:"Classi escluse",minConfidence:"Affidabilit\xe0 minima",zones:"Zone di rilevamento",zonesExclude:"Zone di rilevamento escluse",customZones:"Zone personalizzate",crossing:"Attraversamento zona",labelEquals:"Etichetta uguale a",identities:"Volti noti",identitiesExclude:"Volti esclusi",plates:"Targhe note",devices:"Telecamere",minLabelConfidence:"Affidabilit\xe0 minima dell'etichetta",minImportance:"Importanza minima",minDwellSeconds:"Permanenza minima (secondi)",deviceState:"Stato del dispositivo",scene:"Stato della scena",packagePhase:"Fase del pacco",occupancy:"Occupazione",audio:"Suono",schedule:"Programmazione",sensorTransition:"Notifica quando",devicesExclude:"Dispositivi esclusi"},noConditions:"Nessuna condizione disponibile.",notForTrigger:"Non per questa attivazione",notForTriggerHint:"Non valutata per l'attivazione scelta \u2014 cambia attivazione per usarla.",mediaLabel:"Media",attachLabel:"Allegato",frameLabel:"L'immagine mostra",frame:{cropped:"Il soggetto",full:"Tutta la scena",boxed:"La scena, con i riquadri"},zoneCropLabel:"Ritaglia sulla zona",zoneCropHint:"Ritaglia l'immagine sulla zona della regola invece che sul soggetto o sull'intera scena.",gifLabel:"Allega una GIF",gifHint:"Una breve animazione ritagliata dal buffer live attorno al momento \u2014 la telecamera non deve essere in registrazione.",clipLabel:"Allega un video",clipHint:"Un MP4 dello stesso spezzone. Le destinazioni che non accettano video ricevono comunque l'immagine.",preRollLabel:"Secondi prima",postRollLabel:"Secondi dopo",profileLabel:"Qualit\xe0 del video",profile:{auto:"Automatica",high:"Alta",mid:"Media",low:"Bassa"},templateLabel:"Messaggio (facoltativo)",templateTitleLabel:"Titolo",templateBodyLabel:"Testo",templateHint:"Lascia vuoti entrambi i campi per usare il testo dell'hub.",save:"Salva modifiche",create:"Crea regola",addValue:"Aggiungi valore\u2026",removeTag:"Rimuovi {{value}}",clear:"Azzera",noCameras:"Nessuna telecamera disponibile \u2014 la regola vale per tutti i dispositivi.",noCamerasRequired:"Nessuna telecamera disponibile.",devicesLoading:"Caricamento telecamere\u2026",devicesUnavailable:"L'hub non ha restituito le telecamere \u2014 quelle selezionate sono elencate per id e si possono comunque rimuovere.",deviceRemoved:"Dispositivo #{{id}} \u2014 rimosso",deviceUnknown:"Dispositivo #{{id}}",devicesEmptyWidens:"Nessuna telecamera selezionata: la regola varr\xe0 per TUTTE le telecamere.",plateText:"Testo targa\u2026",maxDistance:"Distanza massima",waitForEnhancementLabel:"Attendi il riconoscimento",waitForEnhancementHint:"Attivo: una sola notifica a fine traccia, con il nome. Disattivo: una subito senza nome, pi\xf9 una seconda se il nome arriva prima che la traccia si chiuda.",recognition:{plates:{off:"Qualsiasi veicolo",anyKnown:"Targa letta",specific:"Queste targhe",offHint:"Alla regola non importa la targa: corrisponde anche un veicolo di cui non \xe8 stata letta.",anyKnownHint:"Solo i veicoli di cui la targa \xe8 stata effettivamente letta, qualunque essa sia.",specificHint:"Solo queste targhe, con corrispondenza tollerante \u2014 la lettura della targa non \xe8 mai perfetta."}},customZones:{empty:"Nessuna zona personalizzata. Scegli una camera e disegnane una.",pickCamera:"Camera su cui disegnare",noCameras:"Nessuna camera online su cui disegnare.",draw:"Disegna zona",zoneLabel:"Zona {{index}} ({{count}} punti)",remove:"Rimuovi zona {{index}}",title:"Disegna zona \u2014 {{name}}",hint:"Tocca per aggiungere punti, trascina un punto per spostarlo. Tocca il primo punto per chiudere.",loading:"Caricamento frame\u2026",cancel:"Annulla",clear:"Cancella",close:"Chiudi",confirm:"Conferma"},addWindow:"Aggiungi finestra",scheduleAlways:"Sempre attiva \u2014 aggiungi una finestra per limitare quando scatta.",scheduleInvert:"Attiva fuori dalle finestre",delivery:{immediate:"Immediata",trackEnd:"Fine traccia",deviceEvent:"Evento dispositivo",packageEvent:"Evento pacco",systemEvent:"Evento di sistema"},systemKinds:{"device-online":"Dispositivo online","device-offline":"Dispositivo offline","device-disabled":"Dispositivo spento","device-enabled":"Dispositivo acceso","camera-online":"Videocamera online","camera-offline":"Videocamera offline","camera-disabled":"Videocamera spenta","camera-enabled":"Videocamera accesa","stream-online":"Flusso online","stream-offline":"Flusso offline","node-online":"Nodo online","node-offline":"Nodo offline","node-inference-unavailable":"Nodo senza dispositivi di inferenza utilizzabili","detection-blind":"Telecamera che non rileva nulla","addon-crash-loop":"Crash loop addon (runner arreso)","alarm-arm-refused":"Inserimento allarme rifiutato","alarm-arming":"Allarme in inserimento","alarm-triggered":"Allarme scattato","alarm-armed":"Allarme inserito","alarm-disarmed":"Allarme disinserito","addon-update-available":"Aggiornamento addon disponibile","server-update-available":"Aggiornamento server disponibile","addon-updated":"Addon aggiornati","server-updated":"Server aggiornato","export-completed":"Export completato","device-battery-low":"Batteria scarica","device-battery-normal":"Batteria ripristinata","device-consumable-low":"Consumabile in esaurimento","device-consumable-normal":"Consumabile sostituito","device-tank-low":"Serbatoio basso (acqua, detergente)","device-tank-full":"Serbatoio pieno (acqua sporca, polvere)","device-tank-normal":"Serbatoio tornato normale","alarm-check-failed":"Allarme inserito senza verifica aperture","alarm-pending":"Ritardo di ingresso allarme avviato","alarm-rearmed":"Allarme reinserito","alarm-sensor-bypass":"Sensore allarme escluso o ripristinato","wrapper-update-available":"Aggiornamento immagine container disponibile","backup-completed":"Backup completato"},systemGroups:{"device-state":"Stato dei dispositivi",streams:"Stream",battery:"Batteria",consumables:"Consumabili",tanks:"Serbatoi","detection-blind":"Nessun rilevamento",nodes:"Nodi",addons:"Addon",updates:"Aggiornamenti di server e container","backups-exports":"Backup ed esportazioni",alarm:"Allarme"},systemFilters:{cameras:"Solo quando fatto scattare da queste videocamere (facoltativo)",deviceTypes:"Solo questi tipi di dispositivo (facoltativo)",nodes:"Solo questi nodi (facoltativo)",packages:"Solo questi pacchetti (facoltativo)",devices:"Solo questi dispositivi (facoltativo)",excludeDevices:"Mai questi dispositivi (facoltativo)",excludeHint:"Applicato dopo l'elenco sopra: un dispositivo qui non viene mai segnalato, qualunque altra cosa corrisponda.",noExcluded:"Nessun dispositivo escluso",batteryTypesWarning:"Gli avvisi di batteria e consumabili sono filtrati per tipo di dispositivo. Batterie e consumabili appartengono a sensori, contenitori, robot e tosaerba \u2014 quasi mai a una videocamera \u2014 quindi un filtro per tipo pensato per la connettivit\xe0 li zittisce. Lascia vuoti i tipi, o sposta questi eventi in una regola dispositivi a parte.",thresholdsHint:"La soglia della batteria e i promemoria sono impostazioni del cluster (interfaccia admin \u2192 impostazioni di post-analisi). La soglia di un consumabile \xe8 propria di questa regola.",consumableThreshold:"Consumabile in esaurimento al (%)",consumableThresholdHint:"Questa regola viene avvisata quando la vita residua di un consumabile scende a questa percentuale (vuoto = {{defaultPercent}}%). Un'altra regola pu\xf2 usare il proprio numero: ognuna viene avvisata alla propria soglia. Un dispositivo che segnala \u201cda sostituire\u201d viene annunciato qualunque cosa dica questo campo.",consumableThresholdInvalid:"Un numero intero da {{min}} a {{max}}: questo valore non viene salvato.",alarmSettings:"Impostazioni allarme",alarmTriggeredMedia:"Quando una regola fa scattare l'allarme, questa notifica porta le immagini di quella regola.",mixedNone:"Nessun evento selezionato"},media:{best:"Immagine migliore",bestMatching:"Migliore corrispondente",keyFrame:"Fotogramma chiave",none:"Nessun allegato"},source:{any:"Qualsiasi",pipeline:"Pipeline",onboard:"A bordo",sensor:"Sensore",audio:"Audio"},phase:{delivered:"Consegnato","picked-up":"Ritirato",both:"Entrambi"},group:{scope:"Ambito",class:"Rilevamenti",zones:"Zone di rilevamento",quality:"Qualit\xe0",label:"Identit\xe0 e targhe",device:"Evento dispositivo",package:"Pacco",system:"Eventi di sistema",schedule:"Programmazione",occupancy:"Occupazione",audio:"Suono"},taxonomy:{person:"Persone",vehicle:"Veicoli",animal:"Animali",audio:"Audio",sensor:"Sensori",control:"Comandi",custom:"Valori personalizzati",addCustom:"Aggiungi un valore\u2026"},weekday:{mon:"Lun",tue:"Mar",wed:"Mer",thu:"Gio",fri:"Ven",sat:"Sab",sun:"Dom"},crossing:{exit:"In uscita",any:"Entrambe",enter:"In entrata",enterHint:"Ingressi e movimento normale; mai un\u2019uscita.",exitHint:"Solo l\u2019uscita da una zona.",anyHint:"Ingressi, uscite e movimento normale."},deviceStateNone:"Non impostato \u2014 questa regola non dipende da nessun altro dispositivo.",deviceStateSet:"Solo mentre il dispositivo {{deviceId}} \xe8: {{states}}. Si modifica dall'admin \u2014 questa app non pu\xf2 elencare tutti i dispositivi.",sceneGateNone:"Non impostato.",sceneGateSet:"Solo mentre la scena {{sceneId}} \xe8 {{state}}.",occupancy:{zoneLabel:"Zona di rilevamento",wholeFrame:"\u2014 intero fotogramma \u2014",zonesLoading:"Caricamento zone\u2026",zonesNeedCamera:"Scegli le telecamere qui sopra per selezionare una delle loro zone.",zonesNone:"Queste telecamere non hanno zone \u2014 il conteggio copre l\u2019intero fotogramma.",zoneMissing:"La zona \"{{id}}\" non esiste pi\xf9 su queste telecamere. La regola la conserva e non scatter\xe0 finch\xe9 non scegli un altro ambito.",classLabel:"Classe",anyClass:"\u2014 qualsiasi classe \u2014",classesNone:"L\u2019hub non ha inviato un vocabolario di classi \u2014 il conteggio copre ogni classe.",classMissing:"\"{{name}}\" non \xe8 una classe segnalata da queste telecamere. La regola la conserva e non scatter\xe0 finch\xe9 non ne scegli un\u2019altra.",opLabel:"Scatta quando",op:{"became-occupied":"Diventa occupata","became-free":"Diventa libera",">=":"Conteggio \u2265","<=":"Conteggio \u2264"},thresholdLabel:"Soglia",countLabel:"Conteggio",sustainLabel:"Mantieni per (secondi)",sustainInstantHint:"Con 0 secondi scatta al primo fotogramma che supera la soglia \u2014 aspettati notifiche ripetute da un soggetto che cammina sul bordo della zona. Di solito si usano 15 secondi.",hint:"Conta gli oggetti tracciati confermati dall\u2019analisi delle zone. Il cambiamento deve durare per tutta la finestra prima di scattare; senza uno snapshot per la telecamera o la zona la regola non scatta mai.",classesDropped:"Il filtro classi ({{classes}}) viene rimosso al salvataggio: un evento di occupazione porta una sola classe, quindi impedirebbe soltanto alla regola di scattare. Imposta invece la classe qui sopra."},audio:{modeLabel:"Come scatta",modeLabelOption:"\ud83d\udd0e Suoni",modeLevelOption:"\ud83d\udcc8 Volume",modeLabelHint:"Scatta quando abbastanza fotogrammi etichettati cadono in una finestra breve (predefinito 2 in 5 secondi). Un falso positivo di un solo fotogramma non arriva a 2; un episodio vero di solito ne etichetta due o tre. L\u2019altro freno \xe8 la pausa della regola.",modeLevelHint:"Scatta quando il suono resta abbastanza forte abbastanza a lungo: la finestra qui sotto \xe8 tutta la condizione.",labelsLabel:"Suoni",labelsHint:"Scegline almeno uno. Il classificatore etichetta solo uno o due fotogrammi per episodio, quindi una percentuale su una finestra non potrebbe mai confermarli \u2014 questo modo conta quei fotogrammi.",confirmHitsLabel:"Conferma dopo (fotogrammi)",confirmHitsHint:"Quanti fotogrammi etichettati devono cadere nella finestra prima di notificare. Predefinito 2 \u2014 un falso positivo di un solo fotogramma non ci arriva.",confirmWindowLabel:"entro (secondi)",confirmWindowHint:"La finestra che quei fotogrammi devono condividere. Predefinito 5 s. Due fotogrammi a sei secondi di distanza non confermano.",labelsUnknown:"Questa regola conserva {{labels}}, che questo hub non classifica. Resta com\u2019\xe8; toccalo per rimuoverlo.",dbLabel:"Pi\xf9 forte di (dBFS)",dbHint:"I dBFS sono negativi: 0 \xe8 il fondo scala, \u221296 \xe8 il silenzio \u2014 quindi un numero PI\xd9 ALTO \xe8 un filtro PI\xd9 STRETTO. Misurato su questo hub, un bambino che piange sta fra \u221255 e \u221226 dBFS: una soglia sopra \u221255 ne esclude la maggior parte.",hitPercentLabel:"Rilevamenti nella finestra (%)",hitPercentHint:"Quanta parte della finestra deve corrispondere prima di scattare. Predefinito 60%.",samplingLabel:"Finestra (secondi)",samplingHint:"La finestra deve essere PIENA prima di poter corrispondere \u2014 una finestra a met\xe0 non scatta mai. Predefinito 10s.",failClosedHint:"Scegli almeno un suono oppure imposta una soglia di livello. Senza nessuno dei due ogni campione conta come rilevamento e l\u2019hub rifiuta la regola invece di notificare sul silenzio.",hint:"Scatta sul SUONO prolungato, non su un\u2019immagine: una regola con questa condizione viene valutata solo su una finestra audio confermata, mai su un rilevamento o una traccia. Le telecamere coinvolte devono avere l\u2019analisi audio attiva."},zonePicker:{needCamera:"Seleziona prima una camera \u2014 le zone appartengono a una camera.",loading:"Caricamento zone\u2026",none:"Le camere selezionate non hanno zone.",missing:"La zona {{id}} non esiste pi\xf9 sulle camere selezionate"},dropReason:{occupancy:{sensorKinds:"Un cambio di occupazione non \xe8 un evento di un sensore: non porta con s\xe9 alcun tipo di sensore, quindi questa condizione non potr\xe0 mai corrispondere.",eventTypeTokens:"Un cambio di occupazione non porta con s\xe9 alcun token di evento del dispositivo \u2014 quello arriva da un emettitore di eventi, che il superamento di una soglia di conteggio non ha.",source:"Un cambio di occupazione \xe8 sempre prodotto dalla pipeline, quindi qualsiasi altra origine non potr\xe0 mai corrispondere e \xabpipeline\xbb non restringe nulla.",sensorTransition:"Un cambio di occupazione \xe8 il superamento di un conteggio, non la lettura di un sensore: non scatta n\xe9 rientra, quindi questa scelta non potrebbe mai restringerlo."},sound:{classes:"Una regola audio scatta su ci\xf2 che la telecamera ha SENTITO. Il suo soggetto non contiene alcun rilevamento, quindi questa condizione non potr\xe0 mai corrispondere \u2014 indica invece i suoni nella condizione Suono.",classesExclude:"Una regola audio scatta su ci\xf2 che la telecamera ha SENTITO. Il suo soggetto non contiene alcun rilevamento, quindi qui non c'\xe8 nulla da escludere \u2014 indica invece i suoni nella condizione Suono.",minConfidence:"La prova di una finestra audio \xe8 una percentuale di campioni, non il punteggio di un rilevatore: una soglia di affidabilit\xe0 non potr\xe0 mai essere soddisfatta.",zones:"Un suono non ha una posizione nell'inquadratura, quindi una zona non potr\xe0 mai corrispondere.",zonesExclude:"Un suono non ha una posizione nell'inquadratura, quindi una zona non potr\xe0 mai escluderlo.",customZones:"Un suono non ha una posizione nell'inquadratura, quindi un'area disegnata non potr\xe0 mai corrispondere.",crossing:"Un suono non ha una posizione nell'inquadratura, quindi non potr\xe0 mai attraversare il bordo di una zona.",labelEquals:"Una regola audio scatta su ci\xf2 che la telecamera ha SENTITO. Il suo soggetto non contiene alcun rilevamento e quindi nessuna etichetta \u2014 indica invece i suoni nella condizione Suono.",identities:"Una regola audio scatta su ci\xf2 che la telecamera ha SENTITO. Il suo soggetto non contiene alcun rilevamento, quindi non c'\xe8 alcun volto da riconoscere.",identitiesExclude:"Una regola audio scatta su ci\xf2 che la telecamera ha SENTITO. Il suo soggetto non contiene alcun rilevamento, quindi non c'\xe8 alcun volto da escludere.",plates:"Una regola audio scatta su ci\xf2 che la telecamera ha SENTITO. Il suo soggetto non contiene alcun rilevamento, quindi non c'\xe8 alcuna targa da leggere.",source:"Una finestra audio confermata \xe8 sempre marcata come soggetto audio, quindi qualsiasi altra origine non potr\xe0 mai corrispondere."},sensor:{sensorTransition:"Solo un sensore che scatta e rientra (acqua, fumo, gas, CO, vibrazione, manomissione, movimento, contatto) pu\xf2 notificare su un solo fronte. Scegli solo tipi di sensore di questo genere, o la regola notificher\xe0 a ogni cambiamento."},detection:{audio:"Una regola di rilevamento scatta su ci\xf2 che la camera ha visto. I suoni sono una regola Suono a parte."}},ai:{sectionLabel:"Descrizione AI",enabledLabel:"Descrivi con l'AI",enabledHint:"Aggiunge a questa notifica una frase scritta da un modello di visione. Non trattiene mai la notifica: se il modello \xe8 freddo o irraggiungibile, l'avviso arriva senza la frase.",blurb:{occupancy:"Al modello vengono mostrati il fermo immagine e il conteggio che questa regola dichiara, e risponde se quel conteggio regge. La tua domanda guida ci\xf2 che guarda; la frase del verdetto la scrive l'hub, cos\xec un disaccordo lo dice sempre.","detection-immediate":"Al modello viene mostrato il fermo immagine preso nell'istante in cui la regola \xe8 scattata, e risponde alla tua domanda su di esso.","detection-track":"Al modello vengono mostrati l'inizio, il momento migliore e la fine del passaggio, e risponde alla tua domanda su cosa \xe8 successo."},profileLabel:"Modello",profileAuto:"Automatico",noProfiles:"Su questo hub non \xe8 configurato nessun modello con visione. Aggiungine uno dalle impostazioni admin prima di attivare questa sezione.",profilesUnavailable:"Questo hub non riesce a elencare i suoi modelli di visione. La sezione si salva lo stesso; l'hub sceglie il proprio modello predefinito.",languageLabel:"Lingua della risposta",languageAuto:"Predefinita dell'hub",language:{en:"Inglese",it:"Italiano"},maxWordsLabel:"Lunghezza",maxWordsHint:"Quante parole chiedere, all'incirca. \xc8 un'istruzione al modello, non un taglio: aspettati pi\xf9 o meno questa lunghezza, ogni tanto una parola in pi\xf9. Senza impostarla, i destinatari di questa regola danno {{words}}.",maxWordsVaries:"Quante parole chiedere, all'incirca. \xc8 un'istruzione al modello, non un taglio. I tuoi destinatari non concordano su un valore predefinito; il pi\xf9 stretto d\xe0 {{words}}, e senza impostarla ognuno usa il proprio.",promptLabel:"La tua domanda",occupancyContract:"La risposta resta un verdetto: l'hub chiede il conteggio, lo confronta con quello della regola e scrive da s\xe9 la conferma o la smentita. La tua domanda guida il modello, non pu\xf2 cambiare il formato della risposta."},unsaved:{title:"Scartare le modifiche?",body:"Questa regola ha modifiche non salvate.",keep:"Continua a modificare",discard:"Scarta"},unknownSection:"Questa sezione non esiste.",missing:"Questa regola non esiste pi\xf9. Potrebbe essere stata eliminata.",fixedTrigger:"Attivazione: {{trigger}} \u2014 una regola sensore scatta sull'evento del dispositivo stesso.",actions:{securityNote:"Queste azioni agiscono sui tuoi dispositivi quando la regola scatta, o quando qualcuno tocca uno dei suoi pulsanti. Controlla ogni passo prima di salvare.",problemsTitle:"Non si salva finch\xe9 non \xe8 corretto:",sequencesTitle:"Sequenze",sequencesEmpty:"Nessuna sequenza. Una sequenza \xe8 un elenco di passi eseguiti sui tuoi dispositivi.",addSequence:"Aggiungi sequenza",removeSequence:"Rimuovi sequenza",sequenceNameLabel:"Nome",sequenceNameBase:"sequenza",enabledLabel:"Esegui quando la regola scatta",enabledOn:"Parte a ogni corrispondenza (e dai suoi pulsanti).",enabledOff:"Parte solo quando si tocca un pulsante della notifica.",minDelayLabel:"Intervallo minimo",minDelayNone:"Nessuno",minDelayHint:"La sequenza parte al massimo una volta in questo tempo, qualunque sia il cooldown della regola.",stepTitle:"Passo {{n}}",addStep:"Aggiungi passo",removeStep:"Rimuovi passo",stepKind:{wait:"Attendi",cap:"Esegui"},waitSecondsLabel:"Secondi",deviceLabel:"Dispositivo",deviceNone:"Scegli un dispositivo",deviceChange:"Cambia",deviceSearchPlaceholder:"Cerca per nome, stanza o id",deviceMore:"Altri {{count}} \u2014 restringi la ricerca",deviceNoMatch:"Nessun dispositivo corrisponde.",deviceLoading:"Caricamento dispositivi\u2026",deviceUnavailable:"L'hub non ha restituito i dispositivi: l'elenco ora non si pu\xf2 mostrare.",capLabel:"Capability",capNone:"Scegli\u2026",capLoading:"Lettura delle capability del dispositivo\u2026",capUnavailable:"Non \xe8 stato possibile leggere le capability del dispositivo. Scrivi il nome della capability.",capEmpty:"Questo dispositivo non espone capability.",capPickDeviceFirst:"Scegli prima un dispositivo.",methodLabel:"Metodo",methodHint:"Il metodo della capability da chiamare, es. setState o trigger.",argsLabel:"Argomenti",argsHint:"Ogni argomento viene controllato al salvataggio. JSON accetta oggetti e liste.",addArg:"Aggiungi argomento",removeArg:"Rimuovi argomento",argKeyPlaceholder:"nome",argValuePlaceholder:"valore",argType:{string:"Testo",number:"Numero",boolean:"S\xec/no",json:"JSON"},buttonsTitle:"Pulsanti della notifica",buttonsEmpty:"Nessun pulsante.",buttonsHint:"Un pulsante sulla notifica che esegue una delle sequenze qui sopra.",addButton:"Aggiungi pulsante",removeButton:"Rimuovi pulsante",buttonLabelLabel:"Etichetta",buttonDefaultLabel:"Azione",buttonSequenceLabel:"Esegue",buttonSequenceNone:"Scegli una sequenza",buttonSequenceMissing:"{{name}} (mancante)",buttonIconLabel:"Icona",iconNone:"Nessuna",icon:{acknowledge:"Conferma",dismiss:"Ignora",silence:"Silenzia",snooze:"Posticipa",view:"Guarda",play:"Riproduci",open:"Apri",close:"Chiudi",lock:"Blocca",unlock:"Sblocca",arm:"Inserisci","arm-home":"Inserisci \u2014 in casa","arm-away":"Inserisci \u2014 fuori casa","arm-night":"Inserisci \u2014 notte",disarm:"Disinserisci",light:"Luce",alert:"Allarme",camera:"Telecamera"},destructiveLabel:"Stile distruttivo",destructiveHint:"Disegna il pulsante in rosso. Cambia come appare, non chi pu\xf2 premerlo."},readOnly:"Questa regola \xe8 gestita da un amministratore. Puoi leggerla qui, non modificarla.",problem:{title:"Non ancora salvata:",name:"la regola ha bisogno di un nome (Regola)",targets:"scegli almeno una destinazione (Regola)",actions:"correggi le azioni (Azioni)",summaryFamily:"solo le regole dispositivi e sistema possono essere un riepilogo pianificato \u2014 l\u2019allarme resta immediato (Condizioni)",summaryActions:"un riepilogo non corrisponde mai a un evento, quindi le sue azioni non verrebbero mai eseguite \u2014 rimuovile (Azioni)",summaryNoSendTime:"un riepilogo richiede almeno un orario di invio (Condizioni)",summaryDegenerateWindow:"un orario di invio non ha giorni, oppure la sua finestra inizia e finisce nello stesso minuto \u2014 non verrebbe mai inviato (Condizioni)",summaryActionsByAdmin:"questa regola ha azioni aggiunte da un amministratore; un riepilogo non le esegue mai, quindi un amministratore deve rimuoverle prima che possa diventare un riepilogo"},mediaBlurb:{sound:"Un suono non ha un fotogramma: l'immagine \xe8 una foto della telecamera scattata nel momento della corrispondenza \u2014 tutta la scena, mai un ritaglio. La GIF e la clip sono tagliate attorno allo stesso istante, dalla telecamera.",alarm:"Un allarme fatto scattare da una regola arriva con le immagini di QUELLA regola, unite in una sola notifica. Questa regola non ne aggiunge di sue."},enabledLabel:"Attiva",enabledHint:"Spenta, la regola resta com'\xe8 ma non avvisa nessuno finch\xe9 non viene riaccesa.",usersLabel:"Avvisa utenti",usersHint:"Persone che ricevono questa regola sui propri dispositivi, oltre alle destinazioni qui sopra. Serve almeno una destinazione o un utente.",usersLoading:"Caricamento utenti\u2026",usersUnavailable:"L'hub non ha restituito i suoi utenti \u2014 la lista ora non si pu\xf2 mostrare.",usersEmpty:"Nessun utente su questo hub.",throttleLabel:"Frequenza",cooldownLabel:"Pausa (s)",cooldownHint:"Dopo un avviso, la stessa regola tace per questi secondi. 0 = nessuna pausa.",groupIdleLabel:"Raggruppa raffiche (s)",groupIdleHint:"Gli eventi che arrivano entro questi secondi l'uno dall'altro diventano un solo avviso. 0 = spento, ogni evento avvisa da s\xe9.",snoozeButtonsLabel:"Pulsanti silenzia",snoozeDefaultsHint:"Non impostati \u2014 l'avviso offre i predefiniti dell'hub ({{defaults}}).",snoozeNoneHint:"Nessun pulsante silenzia: l'avviso non si pu\xf2 silenziare dalla schermata di blocco.",snoozeChosenHint:"Al massimo quattro. Ogni pulsante silenzia toglie spazio ai pulsanti azione della regola.",snoozeResetDefaults:"Torna ai predefiniti dell'hub",snoozeAllowGlobalLabel:"Chiunque pu\xf2 silenziare per tutti",snoozeAllowGlobalHint:"Di norma il silenzia \xe8 personale. Accesa: chi riceve questa regola pu\xf2 silenziarla per tutti, non solo per s\xe9.",confirm:{title:"Conferma AI",enabledLabel:"Conferma con l'AI prima di avvisare",enabledHint:"Un modello di visione guarda l'immagine in partenza; l'avviso esce solo se \xe8 d'accordo.",profileLabel:"Modello",profileDefault:"Predefinito del cluster",profilesUnavailable:"Questo hub non sa elencare i profili di visione \u2014 si usa il predefinito del cluster.",promptLabel:"Domanda",promptPlaceholder:"Vuota: ricavata dalla regola",expectLabel:"Il conteggio deve essere",expectNone:"Decide il modello (s\xec/no)",countLabel:"Conteggio",timeoutLabel:"Timeout (s)",onTimeoutLabel:"Se il modello non risponde",onTimeout:{fire:"Avvisa comunque",suppress:"Resta in silenzio"},onTimeoutHint:"Avvisa comunque \xe8 la scelta sicura: un modello lento o spento non inghiotte mai un avviso."},oneSnapshotOnlyHint:"Una regola su sensore allega automaticamente uno scatto della telecamera \u2014 non c'\xe8 un rilevamento da cui scegliere un ritaglio, una GIF o una clip.",linkedCamerasLabel:"Telecamere collegate",linkedCamerasHint:"Tutte le telecamere collegate vengono fotografate nell'istante in cui il sensore scatta; quelle offline o in sospensione restano fuori. Mosaico: un'immagine composta da tutte le telecamere collegate. Una per telecamera: un'immagine ciascuna dove il notificatore ne accetta pi\xf9 d'una, altrimenti la prima.",linkedCameras:{mosaic:"Mosaico",each:"Una per telecamera"},clipSpeedLabel:"Velocit\xe0 di riproduzione",clipSpeedValue:"{{speed}}\xd7",clipSpeedHint:"Una GIF o una clip di notifica si guarda di sfuggita: a 2\xd7 il passaggio intero dura la met\xe0. 1\xd7 \xe8 tempo reale.",timezone:{label:"Fuso orario",pickerLabel:"Fuso della programmazione",hub:"Fuso dell'hub",hint:"L'orologio su cui si leggono le fasce della programmazione. Non impostato = il fuso dell'hub.",placeholder:"es. Europe/Rome",invalid:"Fuso sconosciuto \u2014 non viene salvato finch\xe9 non \xe8 valido."},snoozeExemptHint:"Regola d'allarme: questa regola riguarda \u2014 o aziona \u2014 la centrale d'allarme, e nessun silenzia pu\xf2 zittirla. I pulsanti silenzia non vengono offerti.",snoozeMaxReached:"Al massimo {{max}} pulsanti silenzia \u2014 togline prima uno.",unlistedTargetsKept:"Destinazioni non presenti nel tuo elenco, mantenute su questa regola: {{count}} (di un altro utente, o eliminate nel frattempo). Salvando non vengono mai rimosse.",unlistedTargetsRemoved:"Destinazioni non pi\xf9 disponibili, rimosse al salvataggio: {{count}}.",saveBlocked:{rolePending:"Verifica del tuo account prima del salvataggio\u2026",roleUnknown:"Impossibile confermare il ruolo del tuo account, quindi questa regola non si pu\xf2 salvare in sicurezza. Torna indietro e riaprila.",targetsPending:"Caricamento delle tue destinazioni prima del salvataggio\u2026",targetsFailed:"Impossibile caricare le tue destinazioni, quindi questa regola non si pu\xf2 ancora salvare. Torna indietro e riaprila."},notConnected:"Non connesso all'hub. Riconnettiti e riprova.",hubTooOldToClear:"Questo hub \xe8 troppo vecchio per svuotare quel campo, quindi la modifica non \xe8 stata salvata. Aggiorna CamStack sull'hub, poi salva di nuovo.",loadError:"Impossibile caricare questa regola. Torna indietro e riaprila.",targetsUnavailable:"Impossibile caricare le tue destinazioni. Torna indietro e riapri.",sensorTransition:{both:"Quando scatta e quando rientra",raised:"Solo quando scatta",cleared:"Solo quando rientra",neverFires:"Questa regola appartiene all\u2019allarme, e una regola d\u2019allarme scatta solo quando un\u2019apertura si APRE. Impostata su \u201csolo quando rientra\u201d, non potr\xe0 mai scattare.",hint:{both:"Ogni cambiamento: acqua rilevata, e di nuovo asciutto.",raised:"Acqua rilevata, fumo, un contatto che si apre \u2014 mai il ritorno alla normalit\xe0.",cleared:"Di nuovo asciutto, fumo sparito, un contatto che si chiude \u2014 mai l\u2019allarme stesso."}},sensorsEmptyWidens:"Nessun sensore selezionato: la regola varr\xe0 per TUTTI i sensori.",sensorsUnavailable:"L'hub non ha restituito i suoi sensori \u2014 quelli selezionati sono elencati per id, cos\xec puoi ancora rimuoverli.",systemDelivery:{label:"Invio",instant:"Immediato",summary:"Riepilogo",instantHint:"Una notifica per ogni evento, nel momento in cui accade.",summaryHint:"Nessun invio per singolo evento. A ogni orario qui sotto arriva una sola notifica con ci\xf2 che \xe8 ancora vero per i tipi e i filtri di questa regola \u2014 batterie scariche, consumabili, dispositivi o stream offline, aggiornamenti disponibili. Se non c\u2019\xe8 nulla da segnalare, non viene inviato nulla.",customSchedule:"Pianificazione personalizzata: il riepilogo viene inviato quando FINISCE ciascuna finestra qui sotto.",addTime:"Aggiungi un orario di invio",removeTime:"Rimuovi orario di invio",sendAt:"Invia alle",bodyWarning:"Questo testo non contiene il riepilogo ({{token}} o una variabile di sezione) \u2014 l\u2019hub vi aggiunge {{token}} al momento dell\u2019invio.",splitRule:"Un solo messaggio",splitSection:"Uno per categoria",splitHint:"Uno per categoria invia una notifica separata per ogni categoria con qualcosa da segnalare \u2014 batterie, consumabili, dispositivi offline\u2026 Richiede un hub aggiornato; uno pi\xf9 vecchio invia un solo messaggio.",splitBodyWarning:"Inviato uno per categoria: questo testo non contiene {{token}}, quindi nelle notifiche delle altre categorie l\u2019hub aggiunge {{token}} (le righe di quella categoria)."},summaryNotKept:"Questo hub non supporta ancora i riepiloghi pianificati, quindi la regola \xe8 stata salvata come Immediata. Aggiorna il server, poi reimposta il riepilogo.",advancedConditionsTitle:"Rilevamento"},kind:{all:"Tutte",detection:"Rilevamento",sensor:"Sensore",sound:"Suono",occupancy:"Occupazione","device-events":"Dispositivi",system:"Sistema",alarm:"Allarme",mixed:"Da ricreare"},kindCreate:{all:"Nuova regola",detection:"Nuova regola di rilevamento",sensor:"Nuova regola sensore",sound:"Nuova regola suono",occupancy:"Nuova regola di occupazione","device-events":"Nuova regola dispositivi",system:"Nuova regola di sistema",alarm:"Nuova regola allarme",mixed:"Nuova regola"},kindEmpty:{all:"Nessuna regola. Creane una per sapere cosa vedono telecamere e sensori.",detection:"Nessuna regola di rilevamento. Creane una per sapere cosa vedono le telecamere.",sensor:"Nessuna regola sensore. Una regola sensore scatta su un evento di un dispositivo \u2014 una porta che si apre, un interruttore che cambia.",sound:"Nessuna regola suono. Una nuova si apre con una soglia di livello gi\xe0 impostata: basta indicare i suoni e le destinazioni.",occupancy:"Nessuna regola di occupazione. Una nuova si apre sulla condizione di occupazione \u2014 scegli prima la telecamera, poi la zona e il conteggio.","device-events":"Nessuna regola dispositivi. Una regola cos\xec ti avvisa quando un dispositivo o il suo stream cade o torna, una batteria \xe8 scarica, o un filtro, una spazzola o un panno vanno sostituiti \u2014 su qualsiasi dispositivo, non solo sulle videocamere.",system:"Nessuna regola di sistema. Una regola di sistema ti avvisa sull'impianto stesso \u2014 un nodo offline, un addon in crash continuo, un aggiornamento, un backup completato.",alarm:"Nessuna regola allarme. Una regola cos\xec ti avvisa di cosa fa la centrale d'allarme \u2014 inserimento, inserito, scattato, disinserito.",mixed:"Nessuna regola da ricreare."},mustRecreate:"Questa regola mescola eventi di pi\xf9 famiglie (dispositivi, sistema, allarme). Continua a funzionare ma non \xe8 pi\xf9 modificabile: crea una regola per famiglia, poi elimina questa.",mustRecreateByAdmin:"Questa regola mescola eventi di pi\xf9 famiglie (dispositivi, sistema, allarme). Continua a funzionare, ma \xe8 in sola lettura: un amministratore deve ricrearla.",kindPicker:{title:"Nuova regola",subtitle:"Cosa deve osservare questa regola?"},summary:{rule:{targets:"Invia a {{names}}",noTargets:"Nessuna destinazione"},devices:{all:"Tutte le camere",some:"Camere selezionate: {{count}}",except:"Tutte le camere tranne {{count}}",someExcept:"Camere selezionate: {{count}}, meno {{excluded}} escluse",sensorsAll:"Ogni sensore",sensorsSome:"Sensori selezionati: {{count}}",sensorsExcept:"Ogni sensore tranne {{count}}",sensorsSomeExcept:"Sensori selezionati: {{count}}, meno {{excluded}} esclusi"},conditions:{count:"Condizioni impostate: {{count}}",none:"Nessuna condizione \u2014 vale per tutto",classesExcept:"Tutte le classi tranne {{classes}}",classesExceptMore:"Tutte le classi tranne {{classes}} \xb7 condizioni impostate: {{count}}"},notification:{custom:"Messaggio personalizzato \xb7 priorit\xe0 {{priority}}",default:"Messaggio predefinito dell'hub \xb7 priorit\xe0 {{priority}}"},actions:{count:"Sequenze: {{sequences}} \xb7 pulsanti: {{buttons}}",invalid:"Problemi da correggere: {{count}}",none:"Nessuna azione"},advanced:{cooldown:"Pausa {{seconds}} s",wait:"Attende il riconoscimento",none:"Predefinite",cooldownWait:"Pausa {{seconds}} s \xb7 attende il riconoscimento"},deviceList:{all:"Tutti i dispositivi",only:"Solo questi dispositivi ({{count}})",except:"Tutti i dispositivi tranne {{count}}",excludedTitle:"Esclusi"}},ai:{defaultPrompt:{occupancy:"Il conteggio dichiarato \xe8 corretto?","detection-immediate":"Cosa c'\xe8 in questa immagine?","detection-track":"Cosa \xe8 successo durante questo passaggio?"}},actions:{args:{invalidJson:"JSON non valido",invalidNumber:"Non \xe8 un numero",invalidBoolean:"Deve essere true o false",emptyKey:"L'argomento ha bisogno di un nome",duplicateKey:"Due argomenti hanno lo stesso nome"},stepMissingDevice:"Un passo non ha un dispositivo",stepMissingMethod:"Un passo non ha capability o metodo",sequenceMissingName:"Una sequenza non ha nome",emptySequence:"Una sequenza non ha passi",duplicateSequence:"Due sequenze hanno lo stesso nome",buttonMissingLabel:"Un pulsante non ha etichetta",duplicateButton:"Due pulsanti hanno lo stesso id",buttonMissingSequence:"Un pulsante punta a una sequenza che non esiste",waitOutOfRange:"Un'attesa deve essere di 0\u2013300 secondi",tooManyButtons:"Al massimo 8 pulsanti",nameTooLong:"Il nome di una sequenza supera i 120 caratteri",labelTooLong:"L'etichetta di un pulsante supera i 40 caratteri",idTooLong:"L'id di un pulsante supera i 64 caratteri",minDelayOutOfRange:"Il ritardo minimo deve essere un numero intero di secondi, fino a 86400"},test:{title:"Prova questa regola",wouldFire:"Scatterebbe",failed:"Non corrisponde \u2014 la condizione \u201c{{condition}}\u201d l'ha respinta",notMatched:"Non corrisponde",firingCount:"{{firing}} di {{total}} record valutati farebbero scattare la regola",noRecords:"Nessun record negli ultimi 60 minuti \u2014 niente da valutare.",deviceEventUnsupported:"Le regole dei sensori non si possono simulare: non esiste un archivio di eventi sensore passati da rigiocare. La regola scatta comunque dal vivo alla pressione o al cambio corrispondente.",note:"{{condition}}: {{note}}",detail:"\xb7 {{note}}",unavailable:"Impossibile eseguire la prova: {{message}}",dryRun:{button:"Simula (ultimi 60 min)",hint:"Valuta la regola ATTUALE, non ancora salvata, sui record degli ultimi 60 minuti. Non viene inviato nulla.",incomplete:"Dai alla regola un nome e una destinazione prima di simularla.",more:"Mostrati {{shown}} di {{total}} record.",targetsFailed:"Impossibile caricare le tue destinazioni, quindi la simulazione non pu\xf2 costruire questa regola. Torna indietro e riaprila."},now:{button:"Prova ora",hint:"Costruisce l'evento di cui parla la regola, esegue la valutazione reale e INVIA la notifica a ogni destinazione, marcata [TEST]. Cooldown e silenziamento vengono ignorati; le azioni della regola non vengono mai eseguite. Prova la regola SALVATA: salva prima per provare una modifica.",confirmTitle:"Inviare una notifica di prova?",confirmBody:"Consegna davvero \u201c{{name}}\u201d a tutte le sue destinazioni, marcata [TEST].",confirm:"Invia prova",queued:"Corrisponde \u2014 notifiche in coda: {{count}}, destinazioni: {{targets}}. Marcate [TEST] nel testo.",noneQueued:"Corrisponde, ma nulla \xe8 stato messo in coda: ogni destinazione ha escluso questa regola, oppure non ne ha nessuna.",notCandidate:"Questa regola non era candidata per un evento {{trigger}} \u2014 controlla l'attivazione e che sia abilitata.",dropped:"Nulla \xe8 stato valutato ({{reason}}) \u2014 l'evento \xe8 stato scartato prima di consultare le regole.",still:{live:"Con un'istantanea dal vivo.",unavailable:"La telecamera non ha restituito un'istantanea, quindi parte solo testo.",unattachable:"Questo tipo di regola non porta immagini nemmeno in produzione."},title:"Prova la regola sul serio",summary:{queued:"Riepilogo creato ora \u2014 notifiche in coda: {{count}}, destinazioni: {{targets}}. Segnate [TEST] nel testo.",queuedPerCategory:"Riepilogo creato ora \u2014 notifiche in coda: {{count}}, una per categoria ({{sections}}), destinazioni: {{targets}}. Segnate [TEST] nel testo.",noneQueued:"Il riepilogo \xe8 stato creato, ma nulla \xe8 in coda: la regola non raggiunge alcuna destinazione (i suoi utenti non sono admin, o ogni destinazione ne \xe8 esclusa).",nothing:"Nulla da segnalare ora \u2014 non \xe8 stato inviato nulla, esattamente come non invierebbe nulla il riepilogo programmato.",sectionRead:"{{section}}: {{items}} aperti",sectionUnavailable:"{{section}}: non disponibile \u2014 lo stato non \xe8 leggibile"}}},ownTargetsUnavailable:"Impossibile caricare le tue destinazioni, quindi le tue esclusioni per questa regola non si possono mostrare.",offNotice:"Disattivata \u2014 non verr\xe0 eseguita.",enabledSwitch:"Abilitata",enableFailed:"Impossibile {{state}} la regola: {{error}}",enableStateOn:"attivare",enableStateOff:"disattivare",enableNotApplied:"l'hub ha mantenuto lo stato precedente",scope:{all:"Tutti",only:"Solo i selezionati",except:"Tutti tranne i selezionati",clearedOnSave:"Salvando in questa modalit\xe0, {{items}} viene tolto dalla regola.",legacyExclusions:"Questa regola esclude anche {{items}} \u2014 mantenuti al salvataggio.",removeExclusions:"Rimuovi esclusioni",everyDevice:"Tutte le camere \u2014 nessuna restrizione.",everyClass:"Tutte le classi \u2014 nessuna restrizione.",classNotListed:"{{name}} \u2014 non \xe8 nell\u2019elenco delle classi",classTitle:"Classi",classSearch:"Cerca classi",classNoMatches:"Nessuna classe corrisponde",classesEmptyWidens:"Nessuna classe rimasta: salvando, la regola vale per tutte le classi.",classesUnavailable:"Impossibile leggere l\u2019elenco delle classi.",everySensor:"Ogni sensore \u2014 nessuna restrizione.",everyZone:"Tutte le zone \u2014 nessuna restrizione.",zoneTitle:"Zone",zonesEmptyWidens:"Nessuna zona rimasta: salvando, la regola vale per tutte le zone.",zonesUnavailable:"Impossibile leggere l\u2019elenco delle zone.",zoneSearch:"Cerca zone",zoneNoMatches:"Nessuna zona corrisponde",zoneNotListed:"{{name}} \u2014 non pi\xf9 presente su queste camere",everyPerson:"Chiunque \u2014 nessuna restrizione.",anyKnownFace:"Qualsiasi volto conosciuto",noFaceExcluded:"Nessuno escluso",faceTitle:"Volti",facesUnavailable:"Impossibile leggere la galleria dei volti.",faceSearch:"Cerca persone",faceNoMatches:"Nessuna persona corrisponde",faceNotListed:"{{name}} \u2014 non \xe8 in galleria",everyLabel:"Qualsiasi etichetta \u2014 nessuna restrizione."},lastRun:{label:"Ultima esecuzione",notInDays_one:"Non nell'ultimo giorno",notInDays_other:"Non negli ultimi {{count}} giorni",notInHours_one:"Non nell'ultima ora",notInHours_other:"Non nelle ultime {{count}} ore",notInMinutes_one:"Non nell'ultimo minuto",notInMinutes_other:"Non negli ultimi {{count}} minuti",notInWindow:"Non nella finestra letta",never:"Nessun invio registrato",unavailable:"Impossibile leggere l'ultima esecuzione",status:{sent:"Inviata",pending:"In attesa",dead:"Fallita"}},history:{action:"Storico",title:"Invii di {{name}}",titleFallback:"Invii della regola",empty:"Nessun invio per questa regola",error:"Impossibile caricare lo storico",deviceById:"Dispositivo #{{id}}",noImage:"Nessuna immagine al momento",target:"Destinazione",adminOnly:"Solo un amministratore pu\xf2 vedere gli invii di una regola",verdictUnknown:"Impossibile verificare il tuo accesso agli invii di questa regola",stateSummary:"Riepilogo di stato"},summaryDelivery:{label:"Riepilogo \xb7 {{when}}",custom:"Riepilogo \xb7 pianificazione personalizzata",daily:"ogni giorno",weekdays:"feriali",weekends:"weekend"},snoozeSwitch:"Silenzia 30 min",snoozeFailed:"Impossibile cambiare il silenziamento della regola: {{error}}"},targets:{add:"Aggiungi destinazione",empty:"Nessuna destinazione. Aggiungine una per ricevere notifiche.",loadError:"Impossibile caricare le destinazioni. Riprova.",pickKind:"Scegli un tipo di notifica",noKinds:"Nessun tipo di notifica disponibile.",kindUnavailable:"non disponibile",test:"Invia test",testing:"Invio\u2026",testOk:"Test consegnato",testFail:"Test fallito",edit:"Modifica",delete:"Elimina",cancel:"Annulla",save:"Salva modifiche",create:"Crea destinazione",addTitle:"Aggiungi destinazione {{kind}}",editTitle:"Modifica {{name}}",deleteConfirmTitle:"Elimina destinazione",deleteConfirmMessage:"Eliminare \"{{name}}\"? L'operazione non \xe8 reversibile.",form:{details:"Dettagli",config:"Configurazione",nameLabel:"Nome",nameHint:"Un'etichetta per riconoscere questa destinazione.",secretHint:"Lascia vuoto per mantenere il valore salvato."}},snooze:{title:"Silenzia",intro:"Silenzia TE, non tutta la casa \u2014 a meno che una regola non dica il contrario. Finisce da sola.",activeNone:"Non c'\xe8 niente in silenzio.",active:"In silenzio ora",past:"Finiti da poco",openTitle:"Silenzia per",scopeLabel:"Cosa silenziare",everything:"Tutto",aRule:"Una regola",aCamera:"Una telecamera",chooseRule:"Scegli una regola",chooseCamera:"Scegli una telecamera",camerasLoading:"Sto caricando le telecamere\u2026",noCameras:"Nessuna telecamera da silenziare.",globalLabel:"Silenzia per tutti",globalHelp:"Anche le altre persone smettono di ricevere le notifiche.",globalNotAllowed:"Questa regola si pu\xf2 silenziare solo per te.",summaryLabel:"Dimmi cosa ho perso",summaryHelp:"Alla fine della finestra arriva un riepilogo.",endNow:"Termina ora",endsIn:"finisce tra {{label}}",everyone:"per tutti",loadError:"Non riesco a caricare i silenzi.",createError:"Non riesco ad avviare il silenzio.",classesTitle:"Solo questi",classesHelp:"Se non tocchi nulla la finestra copre tutto. Scegli delle classi per silenziare solo quelle \u2014 il resto continua ad arrivarti.",everyClass:"Tutto",durations:{m10:"10 min",m30:"30 min",h1:"1 ora"},scope:{rule:"Una regola",device:"Una telecamera",all:"Tutto"},remaining:{ended:"finito",minutes:"{{minutes}} min",hours:"{{hours}}h",hoursMinutes:"{{hours}}h {{minutes}}m"},viewOnly:"Il tuo account pu\xf2 vedere le pause ma non aprirne una."},timelapse:{createTitle:"Nuovo timelapse",editTitle:"Modifica \xab{{name}}\xbb",namePlaceholder:"Vialetto di notte",enabledLabel:"Attivo",camerasHint:"Un video per telecamera. Una telecamera che non registra non pu\xf2 produrre un timelapse \u2014 l\u2019hub rifiuta il salvataggio e indica quale.",windowLabel:"Finestra",windowHint:"Le ore coperte. La finestra \xe8 la regola: inizia a raccogliere quando si apre e invia il video quando si chiude.",samplingLabel:"Campionamento",cadenceLabel:"Un fotogramma ogni (s)",framerateLabel:"Riproduzione (fps)",previewHint:"Cosa mostra la notifica prima che tu apra il video.",preview:{image:"Immagine",gif:"GIF"},problem:{devices:"Scegli almeno una telecamera.",schedule:"Aggiungi almeno una finestra \u2014 un timelapse senza ore non parte mai.",denseCadence:"Il ritmo vicino ai rilevamenti deve essere almeno 0,1 s e pi\xf9 breve della cadenza sopra.",minDwell:"La durata minima deve essere tra 0 e 60 s.",template:"Il titolo pu\xf2 avere al massimo 500 caratteri, il testo 2000.",previewText:"La didascalia pu\xf2 avere al massimo 200 caratteri.",reportClasses:"Al massimo 20 classi, ognuna di al massimo 40 caratteri."},denseCadenceLabel:"Vicino ai rilevamenti, un fotogramma ogni (s)",denseCadenceHint:"Attorno a un rilevamento il video campiona pi\xf9 fitto, cos\xec una persona che passa non si riduce a due fotogrammi. Vuoto significa automatico: un trentesimo della cadenza sopra, almeno 1 s. Se lo imposti, deve essere pi\xf9 breve della cadenza sopra.",minDwellLabel:"Durata minima per rilevamento (s)",minDwellHint:"Il minimo di video che ogni rilevamento ottiene; l\u2019hub campiona pi\xf9 fitto per raggiungerlo. Vuoto significa nessun minimo.",messageLabel:"Messaggio",messageHint:"Titolo e testo della notifica. Se li lasci vuoti, li scrive l\u2019hub.",previewTextLabel:"Didascalia dell\u2019anteprima",previewTextHint:"Scritta sopra il fotogramma di anteprima. Vuota significa la didascalia predefinita: \xabTimelapse\xbb e il nome della telecamera.",reportClassesLabel:"Classi conteggiate",reportClassesHint:"Quali rilevamenti conta la notifica. Nessuna selezionata significa tutte le classi presenti nella finestra.",loadError:"Impossibile caricare le regole timelapse.",previewTextNoneHint:"Questa regola \xe8 impostata per non mostrare alcuna didascalia (scelta nell\u2019amministrazione web). Lascia il campo vuoto per mantenerla cos\xec; scrivi una didascalia per aggiungerla.",captionPreviewLabel:"Anteprima della didascalia",editorTitle:"Timelapse"},summary:{createTitle:"Nuovo riepilogo",editTitle:"Modifica \xab{{name}}\xbb",namePlaceholder:"Riepilogo della notte",enabledLabel:"Attivo",camerasHint:"Una sola immagine per tutte \u2014 lo scatto migliore di tutto ci\xf2 che \xe8 passato.",windowLabel:"Finestra",window:{motion:"Al movimento",schedule:"A orario"},motionHint:"Si apre al primo movimento su una qualsiasi di queste telecamere e resta aperta finch\xe9 ne arriva altro.",scheduleHint:"Orari fissi. Il riepilogo viene inviato alla chiusura della finestra.",quietLabel:"Chiudi dopo quiete (s)",maxWindowLabel:"Mai pi\xf9 lunga di (s)",hubTooOld:"Su questo hub solo un amministratore pu\xf2 creare riepiloghi. Qui puoi vederli; aggiorna l\u2019hub per modificarli dall\u2019app.",problem:{devices:"Scegli almeno una telecamera.",window:"Controlla la finestra \u2014 un riepilogo a orario richiede delle ore e \xabmai pi\xf9 lunga di\xbb deve superare il periodo di quiete.",barrier:"L'attesa delle tracce \xe8 tra 0 e 3600 secondi.",budget:"L'AI non pu\xf2 guardare pi\xf9 immagini di quante ne contenga il mosaico (1\u201324 caselle, 1\u20138 per l'AI).",filters:"Controlla cosa entra \u2014 nessuna classe pu\xf2 essere inclusa ed esclusa per tutte, e l'importanza va da 0 a 1.",caption:"La didascalia \xe8 di al massimo 200 caratteri.",template:"Il titolo \xe8 di al massimo 500 caratteri e il testo di al massimo 2000.",ai:"Controlla l'AI \u2014 domanda fino a 2000 caratteri, immagine 64\u20132048 px, tempo 10\u2013600 s."},editorTitle:"Riepilogo",loadError:"Impossibile caricare questo riepilogo. Controlla la connessione e riprova.",section:{content:"Cosa entra",mosaic:"Mosaico",ai:"AI",delivery:"Consegna"},barrierLabel:"Attendi la chiusura delle tracce (s)",barrierHint:"Lo scatto migliore di un soggetto si salva quando la sua traccia finisce. Il riepilogo attende fino a questo tempo, cos\xec anche chi si muove ancora ha un'immagine.",classesLabel:"Classi",classesHint:"Vuoto = tutte le classi.",classesExcludeLabel:"Classi escluse",classesExcludeHint:"Mai nel riepilogo, anche se incluse sopra.",zonesLabel:"Zone",zonesHint:"Le zone valgono per telecamera: scegliere una zona su una telecamera non silenzia le altre.",minImportanceLabel:"Importanza minima",minImportanceHint:"Un punteggio da 0 a 1. Vuoto = nessun minimo.",minDwellLabel:"Permanenza minima (s)",minDwellHint:"Vuoto = nessun minimo.",includeStationaryLabel:"Includi gli oggetti fermi",includeStationaryHint:"Spento di default: un riepilogo racconta i passaggi, e un'auto parcheggiata prenderebbe tutte le caselle.",rankLabel:"Se sono troppi, tieni",rank:{importance:"I pi\xf9 importanti",recency:"I pi\xf9 recenti",dwell:"La permanenza pi\xf9 lunga"},maxTilesLabel:"Immagini nel mosaico",captionsLabel:"Testo sul mosaico",captions:{none:"Nessuno",tiles:"Sotto ogni casella",all:"Caselle e didascalia"},captionsHint:"Il testo resta impresso nell'immagine per sempre. \xabNessuno\xbb la lascia solo immagini.",captionTextLabel:"Didascalia",captionTextHint:"Scritta in alto solo con \xabCaselle e didascalia\xbb. Vuota = la didascalia predefinita (il nome della regola e gli orari della finestra).",captionTextNoneHint:"Questo riepilogo \xe8 impostato senza alcuna didascalia. Scrivine una per aggiungerla; lascia vuoto per non averne.",aiEnabledLabel:"Descrivi con l'AI",aiEnabledHint:"Un modello di visione guarda insieme le immagini della finestra e scrive nel messaggio cosa \xe8 successo.",aiProfileLabel:"Modello",aiProfileDefault:"Predefinito dell'hub",aiProfilesUnavailable:"L'hub non \xe8 riuscito a elencare i modelli AI. Quello gi\xe0 impostato resta.",aiPromptLabel:"Domanda",aiPromptPlaceholder:"La domanda standard",aiLanguageLabel:"Lingua della risposta",aiLanguage:{default:"Predefinita del modello",en:"Inglese",it:"Italiano"},aiMaxImagePxLabel:"Dimensione immagine per il modello (px)",aiMaxImagePxHint:"Vuoto = il predefinito dell'hub.",aiTimeoutLabel:"Tempo massimo (s)",aiTimeoutHint:"Vuoto = il predefinito dell'hub.",aiOnFailureLabel:"Se l'AI fallisce",aiOnFailure:{"deliver-without-text":"Invia senza il testo",skip:"Trattieni il riepilogo"},aiSkipWarning:"Con \xabTrattieni il riepilogo\xbb, una finestra la cui analisi AI fallisce non viene consegnata affatto \u2014 n\xe9 mosaico n\xe9 conteggi \u2014 e non torna pi\xf9.",maxAiImagesLabel:"Immagini guardate dall'AI",maxAiImagesHint:"Al massimo quante ne contiene il mosaico.",deliverEmptyLabel:"Invia un riepilogo vuoto",deliverEmptyHint:"Spento: una finestra in cui non \xe8 entrato nulla non invia niente.",messageHint:"Vuoto = titolo e testo standard."},family:{cameras_one:"{{count}} telecamera",cameras_other:"{{count}} telecamere",never:"Non ha ancora inviato nulla.",last:"Ultimo invio {{when}}.",off:"Disattivato \u2014 non verr\xe0 eseguito.",readOnly:"Creato da un amministratore. Qui puoi vederlo ma non modificarlo."},templateVars:{camera:"Telecamera",class:"Classe rilevata",label:"Nome o targa",subject:"Frase del soggetto",confidence:"Affidabilit\xe0",count:"Conteggio",detectionSummary:"Riepilogo rilevamenti",zones:"Zone",zone:"Zona",inZones:"Frammento \"in <zone>\"",scope:"Ambito occupazione",time:"Ora",rule:"Nome regola",from:"Inizio finestra",to:"Fine finestra",capacity:"Capienza",op:"Occupato / libero",sounds:"Suoni rilevati",hitPercent:"Percentuale della finestra",db:"Livello di picco (dBFS)",eventType:"Tipo di evento",ai:"Frase AI",eventKind:"Tipo di evento di sistema",deviceName:"Dispositivo",deviceId:"ID dispositivo",percentage:"Percentuale",item:"Materiale di consumo",tank:"Serbatoio",profile:"Profilo stream",node:"Nodo",nodeId:"ID nodo",devices:"Dispositivi",addons:"Addon",minutes:"Minuti",package:"Pacchetto",packageName:"Nome pacchetto",nodes:"Nodi",currentVersion:"Versione attuale",latestVersion:"Ultima versione",list:"Pacchetti aggiornati",fromVersion:"Dalla versione",toVersion:"Alla versione",destinationsOk:"Destinazioni riuscite",destinationsTotal:"Destinazioni",destinationsFailed:"Destinazioni fallite",sizeMB:"Dimensione (MB)",backupId:"ID backup",title:"Titolo esportazione",exportId:"ID esportazione",bytes:"Dimensione esportazione (byte)",mode:"Modalit\xe0 allarme",seconds:"Secondi",rules:"Regole attive",names:"Nomi dispositivi",skippedNames:"Dispositivi saltati",bypassedNames:"Sensori esclusi",coverage:"Copertura %",events:"Eventi",detections:"Rilevamenti",count_person:"Conteggio di una classe",cameras:"Telecamere",matched:"Eventi corrispondenti",shown:"Eventi mostrati",total:"Eventi totali",summaryText:"Riepilogo: tutte le sezioni",summaryCount:"Riepilogo: elementi segnalati",summarySection:"Riepilogo: questa categoria",summaryDevices:"Riepilogo: dispositivi offline / spenti",summaryStreams:"Riepilogo: stream offline",summaryBattery:"Riepilogo: batterie scariche",summaryConsumables:"Riepilogo: consumabili",summaryTanks:"Riepilogo: serbatoi",summaryDetection:"Riepilogo: telecamere senza rilevamenti",summaryNodes:"Riepilogo: nodi",summaryAddons:"Riepilogo: addon",summaryUpdates:"Riepilogo: aggiornamenti server e container"},templateField:{groups:{subject:"Soggetto",place:"Luogo",time:"Orario",rule:"Regola",occupancy:"Occupazione",sound:"Suono",sensor:"Sensore",system:"Sistema",digest:"Riepilogo",ai:"AI"},noVars:"Nessuna variabile per questo campo.",unknown:"Questi segnaposto saranno vuoti in questa notifica: {{names}}",preview:"Anteprima (valori di esempio)"},deviceType:{camera:"Telecamera",hub:"Hub",light:"Luce",siren:"Sirena",switch:"Interruttore",sensor:"Sensore",thermostat:"Termostato",climate:"Clima",button:"Pulsante","event-emitter":"Emettitore di eventi",update:"Aggiornamento",generic:"Generico",notifier:"Notificatore",script:"Script",automation:"Automazione",lock:"Serratura",cover:"Tapparella",valve:"Valvola",humidifier:"Umidificatore","water-heater":"Scaldabagno",fan:"Ventilatore","media-player":"Lettore multimediale","alarm-panel":"Centrale d'allarme",control:"Controllo",presence:"Presenza",weather:"Meteo",vacuum:"Aspirapolvere","lawn-mower":"Tosaerba",container:"Contenitore",image:"Immagine","pet-feeder":"Distributore di cibo per animali"},prune:{device:"Disattivata il {{date}}: il suo ultimo dispositivo (#{{id}}) \xe8 stato eliminato.",target:"Disattivata il {{date}}: la sua ultima destinazione ({{id}}) \xe8 stata eliminata."},alarm:{title:"Allarme",navLabel:"Allarme",navHint:"Pannello, modalit\xe0, destinatari e ritardi",entryHint:"Tempo tra un'intrusione e lo scatto dell'allarme \u2014 abbastanza per raggiungere il tastierino.",notAdmin:"Solo un amministratore pu\xf2 configurare l'allarme. L'hub non consente a questo account di modificarlo.",verdictUnknown:"Impossibile confermare il tuo ruolo con l'hub, quindi le impostazioni dell'allarme non sono mostrate.",retry:"Riprova",loadFailed:"Impossibile caricare le impostazioni dell'allarme: {{error}}",noPanel:"Questa installazione non ha un pannello d'allarme. Lo crea il Centro notifiche sull'hub \u2014 se questo \xe8 l'hub, la creazione \xe8 fallita e il log del server spiega perch\xe9.",sections:{state:"Stato",modes:"Modalit\xe0",recipients:"Destinatari",delays:"Ritardi predefiniti"},stateWord:{disarmed:"Disattivato",armed:"Attivo",arming:"In attivazione",disarming:"In disattivazione",pending:"Ritardo d'ingresso",triggered:"Scattato"},stateWithMode:"{{state}} \u2014 {{mode}}",liveUnknown:"L'hub non ha riportato lo stato del pannello.",exclusionOpen:"{{name}} \u2014 ignorato finch\xe9 non si chiude",exclusionClosed:"{{name}} \u2014 chiuso, di nuovo sorvegliato alla prossima apertura",modeDelays:{title:"Ritardi per {{mode}}",inherited:"Predefinito ({{seconds}} s)",useDefault:"Usa il predefinito"},modesHint:"Cosa attiva ogni modalit\xe0 deriva dalle regole abilitate legate a essa. Qui non si salva nulla \u2014 cambia una regola e questo cambia con lei.",coverageNone:"Non attiva nulla \u2014 nessuna regola abilitata \xe8 legata a questa modalit\xe0.",coverageAll_one:"Tutti i dispositivi \u2014 {{count}} regola senza limiti di dispositivo.",coverageAll_other:"Tutti i dispositivi \u2014 {{count}} regole senza limiti di dispositivo.",coverageRules_one:"{{count}} regola, nessuna restrizione di dispositivo.",coverageRules_other:"{{count}} regole, nessuna restrizione di dispositivo.",coverageDevices:"Copre: {{devices}}",skipped:"Nominati ma non attivati: {{devices}}",skipReason:{muted:"notifiche silenziate","detection-off":"rilevamento spento",offline:"offline"},openingsUnknown:"Dispositivi aperti: non riportati dall'hub.",openingsNone:"Niente di ci\xf2 che questa modalit\xe0 copre \xe8 aperto ora.",openingsCount:"Aperti ora: {{blocking}} bloccanti, {{nonBlocking}} non bloccanti, {{unknown}} illeggibili",openingBlocking:"{{name}} ({{state}}) \u2014 impedisce l'attivazione",openingNonBlocking:"{{name}} ({{state}}) \u2014 non bloccante",openingUnreadable:"{{name}} \u2014 stato illeggibile, non blocca",nonBlockingEmpty:"In casa non c'\xe8 nessuna apertura \u2014 nessun contatto, tapparella o serratura \u2014 da elencare qui.",openingsChecking:"Verifico quali dispositivi sono aperture\u2026",openingsCheckFailed:"Non \xe8 stato possibile verificare quali dispositivi sono aperture \u2014 sono mostrate solo quelle lette ora dall'hub e quelle gi\xe0 elencate.",recipientsHint:"Ogni cambio dell'allarme viene inviato qui: attivazione, attivo, intrusione, sirena, riattivato, disattivato, rifiutato, sensori esclusi.",recipientsNone:"Nessun destinatario selezionato \u2014 i cambi dell'allarme non vengono inviati a nessuno.",targetsFailed:"Impossibile caricare le destinazioni delle notifiche.",targetsEmpty:"Nessuna destinazione di notifica configurata \u2014 non si pu\xf2 inviare nulla.",targetDisabled:"Disattivata",targetUnlisted:"Destinazione {{id}} \u2014 non pi\xf9 disponibile",exitDelay:"Ritardo di uscita",exitHint:"Tempo tra l'attivazione e l'entrata in vigore della modalit\xe0 \u2014 abbastanza per uscire.",exitZero:"si attiva subito",entryDelay:"Ritardo d'ingresso",entryZero:"scatta subito",triggeredFor:"Scattato per",triggeredHint:"Quanto resta scattato l'allarme prima di riattivarsi da solo.",triggeredZero:"fino alla disattivazione",seconds:"{{seconds}} s",minutes:"{{minutes}} min",minutesSeconds:"{{minutes}} min {{seconds}} s",delayRange:"0\u2013{{max}} s",unsaved:"Modifiche non salvate",save:"Salva",discard:"Annulla",saveFailed:"Impossibile salvare: {{error}}",changedElsewhere:"La configurazione \xe8 cambiata altrove \u2014 le tue modifiche sono state applicate sopra.",saveNotLanded:"L'hub ha risposto ma non ha mantenuto ogni modifica \u2014 probabilmente \xe8 troppo vecchio per questa impostazione. Le tue modifiche restano.",recipientsLimit:"Al massimo {{max}} destinatari \u2014 togline uno per aggiungerne un altro.",leave:{title:"Scartare le modifiche all'allarme?",body:"Le impostazioni dell'allarme hanno modifiche non salvate.",keep:"Continua a modificare",discard:"Scarta"},refreshFailed:"Impossibile rileggere le impostazioni dell'allarme prima di salvare: {{error}}. Non \xe8 stato salvato nulla; le tue modifiche restano.",coverageAllExcept_one:"Tutti i dispositivi tranne {{count}}: {{devices}}",coverageAllExcept_other:"Tutti i dispositivi tranne {{count}}: {{devices}}",table:{title:"Blocca l'inserimento",hint:"Interruttore acceso: {{mode}} viene rifiutata finch\xe9 questa apertura \xe8 aperta. Spegnilo per lasciarla aperta. Sono elencati solo i sensori che una regola di questa modalit\xe0 nomina; il controllo all'inserimento non ne legge altri.",switchLabel:"Blocca l'inserimento: {{name}}",searchPlaceholder:"Cerca per nome, stanza o tipo",none:"Nessun sensore \xe8 coperto da una regola di questa modalit\xe0.",noMatches:"Nessun dispositivo corrisponde.",hidden_one:"{{count}} riga nascosta dai filtri",hidden_other:"{{count}} righe nascoste dai filtri",showMore:"Mostra altri {{count}} ({{left}} rimasti)",sensorsFailed:"Impossibile leggere lo stato dei sensori.",state:{checking:"Verifico\u2026",hubTooOld:"Questo hub non riporta lo stato dei sensori \u2014 aggiorna l'hub",readFailed:"Stato sconosciuto \u2014 {{error}}",offline:"{{word}} \u2014 offline, ultimo stato noto",unknownNotAnswered:"Sconosciuto (nessuna risposta)",unknownReadFailed:"Sconosciuto (lettura non riuscita)",unknownWord:"Sconosciuto (nessuno stato riportato)",notOpening:"Non \xe8 un'apertura \u2014 non blocca mai",removed:"Rimosso"},coverage:{armChecked:"S\xec",armCheckedSkipped:"S\xec \u2014 blocca l'inserimento (notifiche saltate: {{reason}})",unscoped:"Coperto da una regola per tutti i dispositivi \u2014 il controllo all'inserimento non lo legge; non blocca mai questa modalit\xe0",notCovered:"No \u2014 non blocca mai questa modalit\xe0",listedUncovered:"Non controllato da nessuna regola di questa modalit\xe0 \u2014 in elenco come non bloccante; accendilo per togliere la voce"},notice:{refused:"Salvataggio di {{name}} ({{mode}}) in corso \u2014 attendi che finisca.",notLanded:"L'hub non ha applicato questa modifica \u2014 un altro editor potrebbe averla cambiata, oppure l'hub va aggiornato ({{name}}, {{mode}}).",failed:"Impossibile modificare {{name}} per {{mode}}: {{error}}"}},checks_one:"Controlla {{count}} sensore",checks_other:"Controlla {{count}} sensori",openRefuse_one:"{{count}} aperto \u2014 blocca l'inserimento",openRefuse_other:"{{count}} aperti \u2014 bloccano l'inserimento",skippedCount:"{{count}} non notificati"},devicePicker:{title:"Scegli dispositivi",add:"Aggiungi",edit:"Modifica",done:"Fatto",search:"Cerca per nome, stanza o tipo",shown:"{{shown}} di {{total}} \xb7 {{selected}} selezionati",selectAll:"Tutti",clear:"Nessuno",noType:"Senza tipo",noRoom:"Senza stanza",noMatches:"Nessun dispositivo corrisponde.",everyDevice:"Tutti i dispositivi \u2014 nessuna restrizione",none:"Nessuno selezionato",remove:"Rimuovi {{name}}",groupBy:{label:"Raggruppa per",zone:"Zona",location:"Luogo",none:"Nessuno",noZone:"Senza zona",noLocation:"Senza luogo",zonesPending:"Caricamento zone \u2014 raggruppati per luogo",zonesUnavailable:"Zone non disponibili \u2014 raggruppati per luogo"},filter:{type:"Tipo",zone:"Zona",location:"Luogo",all:"Tutti",selected:"{{count}} selezionati",noType:"Nessun tipo",noLocation:"Senza luogo",noZone:"Senza zona",zonesLoading:"Caricamento zone\u2026",zonesUnavailable:"Zone non disponibili",zonePaused:"Filtro zona in pausa \u2014 zone non caricate"},resetFilters:"Azzera filtri",hiddenSelected:"{{count}} selezionati nascosti dai filtri",nodeTitle:"Scegli i nodi",packageTitle:"Scegli i pacchetti",everyNode:"Tutti i nodi \u2014 nessuna restrizione",everyPackage:"Tutti i pacchetti \u2014 nessuna restrizione",nodeRemoved:"Nodo {{id}} \u2014 rimosso",packageNotInstalled:"{{name}} \u2014 non installato",nodesEmptyWidens:"Nessun nodo selezionato: la regola si applicher\xe0 a TUTTI i nodi.",packagesEmptyWidens:"Nessun pacchetto selezionato: la regola si applicher\xe0 a TUTTI i pacchetti.",nodesUnavailable:"L'hub non ha restituito i suoi nodi \u2014 quelli selezionati sono elencati per id, cos\xec puoi comunque rimuoverli.",packagesUnavailable:"L'hub non ha restituito i suoi pacchetti \u2014 quelli selezionati sono elencati per nome, cos\xec puoi comunque rimuoverli.",nodeDirectoryIncomplete:"Non \xe8 stato possibile leggere lo storico dei nodi \u2014 i nodi offline potrebbero mancare da questo elenco.",nodeGroup:{hub:"Hub",agent:"Agent",other:"Nodi",offline:"{{role}} \xb7 offline"},packageGroup:{server:"Server",framework:"Framework",wrapper:"Wrapper",addon:"Addon",other:"Pacchetti"},nodeSearch:"Cerca per nome o id del nodo",packageSearch:"Cerca per nome del pacchetto",nodeNoMatches:"Nessun nodo corrisponde.",packageNoMatches:"Nessun pacchetto corrisponde."}},login:{loginFailed:"Accesso fallito",verifyFailed:"Verifica fallita",serverUrl:"Server URL",username:"Username",password:"Password",showPassword:"Mostra password",hidePassword:"Nascondi password",signIn:"Accedi",signingIn:"Accesso\u2026",twoFactor:"Autenticazione a due fattori",totpHint:"Inserisci il codice a 6 cifre dall'app di autenticazione per accedere come ",verificationCode:"Codice di verifica",verifyAndSignIn:"Verifica e accedi",verifying:"Verifica\u2026",back:"Indietro",or:"oppure",signInWithCamStack:"Accedi con CamStack",hubSignInHint:"Apre la pagina di accesso del tuo hub e collega questa app senza digitare qui la password.",handoffFailed:"Accesso con CamStack non riuscito \u2014 riprova oppure usa nome utente e password",invalidServerUrl:"Inserisci prima un URL server valido (https://\u2026)"},live:{webUnsupported:"La vista live non \xe8 ancora disponibile nella versione web.",connecting:"Connessione allo stream live\u2026",error:"Impossibile caricare lo stream live.",retry:"Riprova",noConnection:"Nessuna connessione al server",failed:"Connessione fallita",errorPageLoad:"Caricamento della pagina del player fallito."},ptz:{title:"PTZ",notAvailable:"I controlli PTZ non sono disponibili per questa telecamera.",zoom:"Zoom",home:"Posizione iniziale",presets:"Preset",noPresets:"Nessun preset salvato.",noHome:"Nessuna posizione iniziale impostata per questa telecamera \u2014 impostala nelle impostazioni PTZ dell'interfaccia di amministrazione."},navigation:{title:"Navigazione",notAvailable:"I comandi di navigazione non sono disponibili per questo dispositivo.",drive:"Guida",forward:"Avanti",left:"Gira a sinistra",right:"Gira a destra",turnAround:"Inverti",stop:"Stop",actions:"Azioni",sounds:"Suoni",light:"Luce",lightOn:"Luce accesa",lightOff:"Luce spenta",auto:"Auto",manual:"Manuale",levelUp:"Pi\xf9 luminosa",levelDown:"Meno luminosa",following:"sta seguendo",joystick:"Joystick di guida",joystickHint:"Trascina per guidare il robot; rilascia per fermarlo.",followMe:"Seguimi",returnToDock:"Torna alla base",moreControls:"Altri comandi",mode:{idle:"Fermo",cleaning:"Pulizia",spot:"Pulizia puntuale",following:"Sta seguendo",goto:"Verso il punto",returning:"Rientro alla base",paused:"In pausa",unknown:"Sconosciuto"}},timeline:{activityTitle:"Attivit\xe0",last24h:"Ultime 24h",loading:"Caricamento attivit\xe0\u2026",noActivity:"Nessuna attivit\xe0 nelle ultime 24 ore.",legendRecording:"Registrato",legendMotion:"Movimento",legendAudio:"Audio",showTimeline:"Mostra timeline",hideTimeline:"Nascondi timeline",faultStream:"Lo stream video non \xe8 disponibile.",clipShortTitle:"La telecamera ha interrotto questa clip in anticipo.",clipEmptyTitle:"La telecamera non ha inviato alcun video per questa clip.",faultRecordings:"Non \xe8 stato possibile caricare le registrazioni di questo giorno.",faultEvents:"Non \xe8 stato possibile caricare gli eventi di questo giorno.",faultDismiss:"Ignora",loadRetry:"Riprova",loadRetrying:"Riprovo\u2026",moreHistory:"C'\xe8 cronologia pi\xf9 vecchia non ancora mostrata.",scopeUnreadable_one:"Una videocamera di questa vista non \xe8 stata letta: qui mancano i suoi eventi e le sue registrazioni.",scopeUnreadable_other:"{{count}} videocamere di questa vista non sono state lette: qui mancano i loro eventi e le loro registrazioni.",scopeOverflow_one:"Questa vista ha una videocamera in pi\xf9 di quante la timeline riesca a leggerne insieme.",scopeOverflow_other:"Questa vista ha {{count}} videocamere in pi\xf9 di quante la timeline riesca a leggerne insieme.",scopeUnreadableAndOverflow:"{{unreadable}} videocamere non sono state lette e altre {{overflow}}, oltre il limite della timeline, non sono mostrate.",loadMoreHistory:"Carica altro",loadingMoreHistory:"Caricamento\u2026"},theater:{back:"Indietro",today:"Oggi",yesterday:"Ieri",prevDay:"Giorno precedente",nextDay:"Giorno successivo",selectDate:"Seleziona una data",live:"LIVE",now:"ORA",auto:"Auto",quality:"Qualit\xe0 stream",filterAll:"Tutti",filter_motion:"Movimento",filter_audio:"Audio",goToLive:"Vai al live",liveLockOn:"Blocco live attivo \u2014 navigando l'immagine resta in diretta",liveLockOff:"Blocco live disattivo \u2014 navigando parte la registrazione",recordLive:"Registra live",keepClip:"Salva la registrazione",keepClipTitle:"Tenere questo clip?",discardClip:"Scarta",saveToGallery:"Salva in Foto",shareClip:"Condividi",recordFailed:"Impossibile registrare la vista live",noRecording:"Nessuna registrazione",noRecordingHint:"Nessun filmato per questo momento",detailCount:"{{frames}} frame \xb7 {{count}} rilevamenti",detailTracks:"{{tracks}} tracce \xb7 {{count}} rilevamenti",detailEmpty:"Nessuna immagine di dettaglio per questo istante",detailSeek:"Vai a questo momento",zoneHint:"Trascina un rettangolo sul video per filtrare gli eventi per zona",zoneConfirm:"Conferma",zoneCancel:"Annulla",playbackBar:"Controlli di riproduzione",footerBar:"Strumenti timeline",filterTitle:"Filtri",zoomRange:"Intervallo di tempo",zoomSpanMinutes:"{{count}}m",zoomSpanHours:"{{count}}h",zoneFilter:"Filtro zona",detailSubjects_one:"{{count}} soggetto",detailSubjects_other:"{{count}} soggetti",zoneModeRect:"Rettangolo",zoneModePolygon:"Poligono",zoneClearPoints:"Pulisci",zoneHintPolygon:"Tocca per aggiungere punti \u2014 3 o pi\xf9",selectTime:"Ora",goSameTime:"Vai \u2014 stessa ora del giorno",recordingDaysFailed:"Non \xe8 stato possibile leggere i giorni con registrazioni.",recordingDaysPartial:"Alcune videocamere di questa vista non sono state lette: i giorni senza pallino potrebbero comunque avere registrazioni.",clusterOpenDetail:"Apri il dettaglio evento",clusterCarouselShow:"Apri il carosello del cluster",clusterCarouselHide:"Chiudi il carosello del cluster",clusterPrevImage:"Immagine precedente",clusterNextImage:"Immagine successiva",clusterCameras_one:"{{count}} telecamera",clusterCameras_other:"{{count}} telecamere",clipStartsAtSubjectAt:"La clip parte alle {{start}}, soggetto alle {{subject}}",clipEndsAt:"La clip termina alle {{end}}",legend:{open:"Legenda heatmap e timeline",title:"Legenda",heatmapTitle:"Heatmap delle 24 ore",heatmapRecordingTitle:"Registrazione",heatmapRecordingBody:"Linea rossa in alto sul nastro \u2014 copertura di quel tratto di giornata.",heatmapAudioTitle:"Audio",heatmapAudioBody:"Picchi dall'alto. Verde = basso, rosso = alto: la stessa scala a sei gradini del misuratore live.",heatmapBottomTitle:"Motion e detection",heatmapBottomBody:"La parte bassa di ogni slot \xe8 motion verde, oppure la classe prominente quando c'\xe8 object detection.",timelineTitle:"Colonna attivit\xe0",timelineRecordingTitle:"Registrazione",timelineRecordingBody:"Linea rossa continua all'estrema destra.",timelineMotionTitle:"Motion",timelineMotionBody:"Linea verde al centro.",timelineDetectionTitle:"Object detection",timelineDetectionBody:"Pallino sulla linea motion, del colore della classe prominente in quel momento.",timelineAudioTitle:"Livello audio",timelineAudioBody:"Linea all'estrema sinistra. Stessa scala verde\u2192rosso della heatmap e del misuratore live.",classesTitle:"Classi di detection",classPerson:"Persona",classPersonBody:"Persone e volti.",classVehicle:"Veicolo",classVehicleBody:"Auto, camion, bici e il resto della famiglia veicolo.",classAnimal:"Animale",classAnimalBody:"Cani, gatti, uccelli e altri animali."}},mediaKind:{crop:"Ritaglio oggetto",thumbnail:"Best shot",faceCrop:"Volto",plateCrop:"Targa",fullFrame:"Frame",fullFrameBoxed:"Riquadrato",keyFrame:"Frame chiave",firstFrame:"Primo",lastFrame:"Ultimo",snapshot:"Istantanea"},tracks:{crop:"Ritaglio",fullFrame:"Frame completo",bestShot:"Scatto migliore",media:"Media",noMedia:"Nessun media per questa traccia",mediaLoadError:"Impossibile caricare i media",mediaEntryLoading:"Caricamento del media\u2026",mediaEntryError:"Media presente in indice ma non leggibile",mediaEntryAbsent:"Non archiviato per questa traccia",path:"Percorso",pathSummary:"{{count}} punti \xb7 {{seconds}}s",pathNoLocalization:"nessuna posizione precisa",share:"Condividi",copyLink:"Copia link",linkCopied:"Link copiato",shareImage:"Condividi immagine",viewFullRes:"Risoluzione piena",fullResBadge:"Piena",zones:"Zone",audio:"Audio",prevTrack:"Evento precedente",nextTrack:"Evento successivo",reason:"Perch\xe9 rilevante",empty:"Nessuna traccia",recent:"Recenti",searchPlaceholder:"Cerca eventi (es. \"persona in rosso\")",searchSubmit:"Cerca",searchClear:"Cancella ricerca",noMatches:"Nessun evento corrispondente",person:"Persona",assignPerson:"Associa a persona",changePerson:"Cambia",notAssigned:"Non associata",matchConfidence:"Affidabilit\xe0 match",suggested:"Suggerito",suggestedUnknown:"Persona suggerita",suggestedConfirm:"Conferma",suggestedDismiss:"Ignora",assignFaceTitle:"Associa volto",newPersonPlaceholder:"Nome nuova persona\u2026",createAndAssign:"Crea e associa",assignFailed:"Associazione del volto non riuscita",removePerson:"Rimuovi persona",removePersonConfirmTitle:"Rimuovere la persona?",removePersonConfirmBody:"Questo scollega la persona da questo volto. Il volto torna tra quelli non associati e potr\xe0 essere riassociato in seguito.",disassociateFailed:"Rimozione della persona non riuscita",removePersonAll:"Rimuovi da tutti gli eventi",removePersonAllConfirmTitle:"Rimuovere da tutti gli eventi?",removePersonAllConfirmBody:"Questo scollega la persona da OGNI evento. Tutti i volti attualmente riconosciuti come questa persona tornano tra quelli non associati e potranno essere riassociati in seguito. La persona viene mantenuta.",disassociateAllFailed:"Rimozione della persona da tutti gli eventi non riuscita",existingPersons:"Persone",noPersons:"Ancora nessuna persona",metadata:"Metadati",markForTraining:"Segna per addestramento",markForTrainingHint:"Mantiene questa traccia e i suoi media oltre la conservazione",debugFlag:"Debug",debugFlagHint:"Segna questa traccia per un controllo diagnostico. Tieni premuto per modificare cosa controllare.",debugNotePromptTitle:"Cosa dobbiamo controllare?",debugNotePromptBody:"Descrivi cosa non torna in questo evento, con parole tue. Resta sulla traccia, cos\xec chi rivede il set di debug legge la domanda insieme ad essa.",debugNotePlaceholder:"es. il box salta sul cancello quando passa l\u2019auto",debugPreset:{stationaryObject:"Oggetto stazionario",lateStart:"Iniziata in ritardo",earlyEnd:"Terminata presto",targetSwapped:"Target scambiato durante la traccia",edgeCropMirror:"Best shot sul bordo con mirror",betterShotExisted:"Un miglior best shot disponibile",missingMedia:"Media mancanti",cropOffTarget:"Crop shot non in target",riderNotInKeyframe:"Due ruote shot senza conducente"},debugReviewed:"Analizzata",debugReviewedHint:"Segna questa traccia debug come analizzata cos\xec esce dal filtro e dall'export",favourited:"Preferito",favouritedHint:"Mantiene questa traccia e i suoi media oltre la conservazione",copy:"Copia",copied:"Copiato","meta.trackId":"ID traccia","meta.eventId":"ID evento migliore","meta.deviceId":"ID dispositivo","meta.camera":"Telecamera","meta.className":"Classe","meta.label":"Etichetta","meta.firstSeen":"Prima apparizione","meta.lastSeen":"Ultima apparizione","meta.state":"Stato","meta.importance":"Importanza","meta.confidence":"Confidenza","meta.mediaKeys":"ID media",rescore:{button:"Ricalcola le corrispondenze",failed:"Impossibile ricalcolare le corrispondenze",params:"Soglia {{threshold}} \xb7 margine {{margin}}",needsSamples:"{{count}} campioni \u2014 ne servono {{min}}",reembed:"Ricalcola l'embedding e riprova",reembedFailed:"Ricalcolo embedding fallito: {{reason}}",verdict:{"auto-assignable":"Verrebbe assegnata a {{name}}",ambiguous:"Due persone hanno punteggi troppo vicini \u2014 il margine lo impedisce",suggestion:"Plausibile, ma sotto la soglia di assegnazione automatica","below-threshold":"Nessuna corrispondenza nella galleria attuale","no-eligible-identity":"Nessuna persona ha ancora abbastanza campioni (ne servono {{min}})","empty-gallery":"Nella galleria non c'\xe8 nulla di confrontabile con questo volto","model-mismatch":"Questo volto \xe8 stato calcolato con un modello precedente \u2014 i punteggi non sono confrontabili"}}},accessories:{on:"Acceso",off:"Spento",dimUp:"Pi\xf9 luminoso",dimDown:"Meno luminoso",lock:"Blocca",unlock:"Sblocca",open:"Apri",close:"Chiudi",stop:"Ferma",disarm:"Disattiva",onMotion:"Su movimento",openPercent:"Apertura {{percent}}",warmer:"Pi\xf9 caldo",cooler:"Pi\xf9 freddo",speedUp:"Pi\xf9 veloce",speedDown:"Pi\xf9 lento",oscillate:"Oscillazione",press:"Premi",play:"Riproduci",pause:"Pausa",previous:"Precedente",next:"Successivo",start:"Avvia",dock:"Rientra",locate:"Localizza",feed:"Eroga",feeding:"Erogazione\u2026",install:"Installa",installing:"Installazione\u2026",upToDate:"Aggiornato",increase:"Aumenta",decrease:"Diminuisci",select:"Seleziona",noEvent:"Nessun evento",buttonIndex:"Tasto {{index}}",mode:"Modalit\xe0",fanMode:"Modalit\xe0 ventola",preset:"Preset",direction:"Direzione",forward:"Avanti",reverse:"Indietro",away:"Assente",humidityUp:"Aumenta umidit\xe0",humidityDown:"Riduci umidit\xe0",swingVertical:"Oscillazione verticale",swingHorizontal:"Oscillazione orizzontale",setTemperature:"Temperatura impostata",currentTemperature:"Temperatura attuale",climateModes:{off:"Spento",heat:"Riscaldamento",cool:"Raffreddamento",auto:"Auto",heat_cool:"Caldo/Freddo",fan_only:"Ventola",dry:"Deumidificazione"},unsupported:"Questo hub non supporta l'operazione. Aggiornalo e riprova.",armMode:{home:"Casa",away:"Fuori",night:"Notte",vacation:"Vacanza",custom_bypass:"Personalizzato"},alarmRefused:"Non attivato \u2014 aperti: {{devices}}",armAnyway:"Attiva comunque",armAnywayRejected:{"unknown-refusal":"Attiva comunque non accettato: l'hub non conosce pi\xf9 quel rifiuto. Riprova ad attivare.",stale:"Attiva comunque non accettato: il pannello \xe8 cambiato dal rifiuto. Riprova ad attivare.",expired:"Attiva comunque non accettato: il rifiuto \xe8 scaduto. Riprova ad attivare.",used:"Attiva comunque non accettato: quel rifiuto \xe8 gi\xe0 stato usato."},alarmState:{arming:"Attivazione in corso\u2026",pending:"Intrusione \u2014 disattiva ora",triggered:"Allarme scattato"},alarmRefusedCap:"Non attivato \u2014 aperti: {{devices}}. \"Attiva comunque\" \xe8 nella notifica dell'allarme.",alarmLookupUnknown:"Stato dell'allarme sconosciuto \u2014 nuovo tentativo in corso",alarmStateUnknown:"Stato del pannello sconosciuto",alarmExcluded:"Attivato \u2014 esclusi: {{devices}}",deviceFallback:"Dispositivo #{{id}}",alarmRefusedNone:"Non attivato \u2014 l'hub ha rifiutato senza indicare un dispositivo aperto. Riprova."},updates:{otaReadyTitle:"Aggiornamento scaricato",otaReadyBody:"Riavviare l'app adesso per applicarlo? Con \"Pi\xf9 tardi\" si applica al prossimo avvio.",install:"Riavvia ora",later:"Pi\xf9 tardi",whatsNewTitle:"Novit\xe0 nella {{version}}",whatsNewHeading:"Novit\xe0",whatsNewPrevious:"Aggiornamenti precedenti",whatsNewRow:"Novit\xe0",whatsNewNone:"Nessuna nota per questa versione.",nativeRow:"Build dell'app",nativeUpToDate:"Aggiornata",nativeUnknown:"\u2014",nativeNewer:"Disponibile {{version}} ({{build}})",nativeNewerTitle:"\xc8 disponibile una nuova build dell'app",nativeNewerBody:"La versione {{version}} (build {{build}}) \xe8 disponibile. Da ora gli aggiornamenti la richiedono.",openTestFlight:"Apri TestFlight",openStore:"Apri lo store"},cameraMenu:{title:"Opzioni vista",gridCommonHint:"Gli overlay comuni a tutta la griglia \u2014 riquadri, bordo di evidenziazione e i suoi trigger, etichette dei cluster \u2014 si impostano una volta sola per la griglia, nella barra della griglia.",streamStats:"Statistiche stream",audioLevel:"Livello audio",densityTitle:"Densit\xe0 timeline",density_compact:"Compatta",density_medium:"Media",density_wide:"Ampia",densityCustom:"Personalizzata",showImportance:"Mostra importanza",showClass:"Mostra classe rilevata",timelineSection:"Timeline",managementTitle:"Gestione"},viewOptions:{groupDetection:"Overlay di rilevamento"},cameraShelf:{goTo:"Vai a questa telecamera",addToView:"Aggiungi alla vista",closeView:"Chiudi la vista",loading:"Caricamento telecamere\u2026",loadingA11y:"Caricamento delle altre telecamere"},cameraSwitches:{title:"Funzioni telecamera",loading:"Lettura delle funzioni\u2026",readFailed:"Impossibile leggere le funzioni della telecamera. Nulla \xe8 cambiato \u2014 non vengono mostrate anzich\xe9 mostrarle con uno stato ipotizzato.",writeFailed:"Modifica rifiutata e annullata. {{reason}}",offBadge:"OFF",badgeLabel_one:"{{count}} funzione disattivata",badgeLabel_other:"{{count}} funzioni disattivate",unavailableNoProvider:"Non disponibile \u2014 nessun componente di questa installazione la fornisce.",unavailableUnreachable:"Sconosciuto \u2014 il servizio che la gestisce non ha risposto.",unavailableNotConfigured:"Non offerta \u2014 non \xe8 ancora configurato nulla su cui agire.",unavailableNoPrivacyZones:"Non offerta \u2014 sulla telecamera non \xe8 disegnata nessuna zona di privacy. Disegnane una nell\u2019app della telecamera e l\u2019interruttore comparir\xe0.",warnUnknown:"Questo controllo riporta una nota dall\u2019hub che questa versione dell\u2019app non riconosce ancora.",warnNoPrivacyZones:"Sulla telecamera non \xe8 ancora disegnata nessuna zona di privacy, quindi la maschera non ha nulla da oscurare. Disegnane una nell\u2019app della telecamera; l\u2019interruttore resta offerto per poter avviare la funzione da qui.",unavailableDeviceDisabled:"Non offerta finch\xe9 la telecamera \xe8 spenta.",unavailableUnknown:"Non disponibile su questa telecamera."},stats:{title:"Statistiche stream",resolution:"Risoluzione",fps:"FPS",bitrate:"Bitrate",packetLoss:"Pacchetti persi",jitter:"Jitter",codec:"Codec",frames:"Frame (persi/totali)",waiting:"Misurazione\u2026",playbackHint:"Le statistiche WebRTC complete richiedono il player nativo."},exportActions:{title:"Cattura",recordingExport:"Esporta registrazione"},exportSelection:{start:"Seleziona un periodo da esportare",discard:"Scarta la selezione",save:"Salva il periodo selezionato",savePartial:"Salva il periodo selezionato \u2014 una parte non \xe8 registrata",title:"Esportazione",queued:"Esportazione in coda. La troverai in Esportazioni quando \xe8 pronta.",failed:"Non \xe8 stato possibile mettere in coda l'esportazione.",gapTitle:"Una parte di questo periodo non \xe8 registrata",gapMessage:"I {{duration}} selezionati attraversano un tratto senza registrazione. L'esportazione conterr\xe0 solo le parti registrate.",gapConfirm:"Esporta comunque"},exports:{title:"Esportazioni",range:"Intervallo",createAction:"Nuova esportazione",withAudio:"con audio",variantRegular:"1\xd7",variantAccelerated:"Accelerato {{speed}}\xd7",variantSlow:"Rallentato {{speed}}\xd7",variantTimelapse:"Timelapse",expired:"Scaduto",expiresInDays:"Scade tra {{count}}g",expiresInHours:"Scade tra {{count}}h",expiresInMinutes:"Scade tra {{count}}m",downloadAction:"Scarica",downloadUnavailable:"Download non disponibile.",downloadFailed:"Download non riuscito.",cancelAction:"Annulla",cancelConfirmTitle:"Annullare l'esportazione?",cancelConfirmBody:"Interrompe il rendering ed elimina il file parziale.",deleteAction:"Elimina",deleteConfirmTitle:"Eliminare l'esportazione?",deleteConfirmBody:"Rimuove il file. La voce nella cronologia viene mantenuta.",dismiss:"Chiudi",state:{queued:"In coda",rendering:"Rendering",ready:"Pronto",failed:"Non riuscito",expired:"Scaduto",deleted:"Eliminato"},createHint:"Scegli una camera: l'esportazione si traccia sulla sua timeline di registrazione, dove si vede il filmato che esiste davvero.",stillRendering:"Ancora in elaborazione: il file non \xe8 pronto per la riproduzione.",noFile:"Non c\u2019\xe8 nessun file da riprodurre per questa esportazione.",stateLabel:"Stato",variant:"Resa"},library:{title:"Libreria",sections:{events:"Eventi",artifacts:"Media",review:"Revisione"}},artifacts:{title:"Media",empty:"Nessun file.",emptyFiltered:"Nessun file corrisponde a questi filtri.",loadError:"Impossibile caricare i media.",gone:"Questo file non \xe8 pi\xf9 sull'hub.",expired:"Scaduto",expiredBody:"La finestra di conservazione \xe8 terminata e il file \xe8 stato rimosso.",expiresInDays:"Scade tra {{count}}g",expiresInHours:"Scade tra {{count}}h",expiresInMinutes:"Scade tra {{count}}m",retentionHint:"Conservato fino a 14 giorni. I file possono essere rimossi prima se l'hub raggiunge i limiti di spazio.",byRule:"Regola: {{name}}",allCameras:"Tutte le telecamere",cameraPlus:"{{name}} +{{count}}",close:"Chiudi",downloadAction:"Scarica",downloadUnavailable:"Download non disponibile.",downloadFailed:"Download non riuscito.",deleteAction:"Elimina",deleteConfirmTitle:"Eliminare questo file?",deleteConfirmBody:"Viene rimosso definitivamente dall'hub.",deleteRefused:"L'hub non ha rimosso questo file. Potrebbe non esserci pi\xf9, oppure appartenere a tutta la casa: in quel caso solo un amministratore pu\xf2 eliminarlo.",deleteFailed:"Impossibile eliminare il file.",kind:{timelapse:"Timelapse","timelapse-preview":"Anteprima timelapse","summary-mosaic":"Mosaico riepilogo","event-gif":"GIF","event-clip":"MP4","event-still":"Foto",export:"Esportazione"},time:{now:"Adesso",minutesAgo:"{{count}}m fa",hoursAgo:"{{count}}h fa",daysAgo:"{{count}}g fa"},range:{all:"Tutto",day:"24h",week:"7g",month:"30g"},filters:{toggle:"Filtri",kind:"Tipo",camera:"Telecamera",range:"Periodo",clear:"Azzera filtri"},detail:{kind:"Tipo",cameras:"Telecamere",rule:"Regola",captured:"Ripreso il",created:"Prodotto il",size:"Dimensione",format:"Formato",expiry:"Scadenza"}},streamBar:{play:"Riproduci",pause:"Pausa",scrubForward:"Avanzamento veloce",scrubBackward:"Riavvolgimento",mute:"Silenzia",unmute:"Riattiva audio",silentBySpeed:"Nessun audio a {{rate}} \u2014 la velocit\xe0 lo silenzia",talkStart:"Inizia a parlare",talkStop:"Smetti di parlare",quality:"Qualit\xe0 stream",menu:"Opzioni vista",snapshot:"Istantanea",pip:"Picture in picture",fullscreen:"Schermo intero",exitFullscreen:"Esci da schermo intero"},playback:{servedTier:"In riproduzione {{tier}}",servedTierDegraded:"{{requested}} non disponibile qui \u2014 riproduco {{served}}",tier:{high:"Alta",mid:"Media",low:"Bassa"},prevFrame:"Frame precedente",nextFrame:"Frame successivo",speed:"Velocit\xe0 riproduzione",rateUnavailable:"Non disponibile per le clip di questa camera",stepBackUnavailable:"Le clip di questa camera non tornano indietro di un fotogramma: i frame prima dell'immagine non sono stati conservati"},cameraSwitcher:{title:"Cambia videocamera",empty:"Nessuna videocamera disponibile",openGrid:"Apri griglia ({{n}})",selectA11y:"Seleziona {{name}}",buildView_one:"Mostra questa videocamera",buildView_other:"Mostra queste {{count}} videocamere"},storage:{title:"Archiviazione",usageTitle:"Utilizzo",nodeTotal:"Totale nodo",defaultLocation:"Posizione predefinita",locationFree:"{{free}} liberi",retentionTitle:"Conservazione",pruneAction:"Applica conservazione ora",pruneConfirmTitle:"Applicare la conservazione?",pruneConfirmBody:"Elimina le registrazioni su {{name}} che superano la policy di conservazione.",pruneResult:"Recuperati {{bytes}} ({{buckets}} segmenti).",deleteTitle:"Elimina registrazioni",deleteAction:"Elimina",deleteConfirmTitle:"Eliminare le registrazioni?",deleteConfirmBody:"Elimina definitivamente {{range}} di registrazioni su {{name}}. Operazione irreversibile.",deleteResult:"Recuperati {{bytes}} ({{buckets}} segmenti).",cancel:"Annulla",window24h:"Ultime 24h",window7d:"Ultimi 7 giorni",window30d:"Ultimi 30 giorni",windowAll:"Tutto"},eventsMgmt:{title:"Eventi",footprintTitle:"Ingombro",rowsBytes:"{{rows}} eventi \xb7 {{bytes}}",clusterTotal:"Totale cluster",pruneTitle:"Elimina pi\xf9 vecchi di",pruneHint:"Si applica a tutte le telecamere.",pruneAction:"Elimina",pruneConfirmTitle:"Eliminare gli eventi vecchi?",pruneConfirmBody:"Elimina gli eventi pi\xf9 vecchi di {{range}} su TUTTE le telecamere. Operazione irreversibile.",pruneResult:"Eliminati {{count}} eventi.",deleteTitle:"Elimina eventi telecamera",deleteAction:"Elimina tutti gli eventi di questa telecamera",deleteConfirmTitle:"Eliminare tutti gli eventi?",deleteConfirmBody:"Elimina definitivamente ogni evento di {{name}}. Operazione irreversibile.",deleteResult:"Eliminati {{count}} eventi.",cancel:"Annulla",older24h:"24 ore",older7d:"7 giorni",older30d:"30 giorni"},overlay:{title:"Overlay",liveSection:"Indicatori live",readoutsSection:"Sensori e valori",layersLabel:"Riquadri sull'immagine",layerMotion:"Movimento",layerObjects:"Oggetti",layerDiscarded:"Scartate",layerStationary:"Stazionarie",layerDiscardedHint:"Disegna anche, con tratteggio, le rilevazioni quasi accettate e quelle fuori zona delle classi che hai abilitato \u2014 soggetti rimasti appena sotto la soglia di confidenza, o fuori da una regola di zona. Utile quando i riquadri lampeggiano su un soggetto in movimento. La pillola confronta ci\xf2 che il modello ha visto con ci\xf2 che \xe8 stato tenuto.",layerStationaryHint:"Disegna gli oggetti che si sono fermati e non sono pi\xf9 tracciati \u2014 un'auto parcheggiata, un bidone lasciato fuori. L'hub sopprime le loro rilevazioni, quindi non possono mai comparire sotto Oggetti o Scartate.",diagCounts:"modello {{saw}} \xb7 tenuti {{kept}}",diagHidden:"{{hidden}} nascosti",diagOffTopic:"{{offTopic}} non pertinenti",diagShed:"frame saltato \xb7 {{reason}}",reasonThreshold:"sotto soglia",reasonFullFrame:"guardia full-frame",reasonNms:"soppresso da NMS",reasonClassFilter:"filtro classe",reasonZoneGate:"regola di zona",motionBadge:"Badge movimento",highlightBorder:"Bordo evidenziazione",occupancy:"Occupazione",addReadout:"Aggiungi un valore",removeReadout:"Rimuovi valore",readoutsHint:"Fissa un valore live sull'immagine: il livello audio, o un sensore collegato a questa telecamera.",noFields:"Questo dispositivo non pubblica valori live.",thisCamera:"Questa telecamera",audioDbfs:"Livello audio",liveOnlyHint:"Si disegnano solo sull'immagine live \u2014 non in riproduzione n\xe9 in pausa.",positions:{off:"Off","top-left":"In alto a sinistra","top-center":"In alto al centro","top-right":"In alto a destra","left-center":"Al centro a sinistra","right-center":"Al centro a destra","bottom-left":"In basso a sinistra","bottom-center":"In basso al centro","bottom-right":"In basso a destra"}},clips:{title:"Clip",lengthUnknown:"durata sconosciuta",progressLabel:"Posizione nella clip {{position}} di {{duration}}",loading:"Caricamento clip\u2026",empty:"Nessuna clip per questa telecamera nell'intervallo caricato.",searching:"Cerco nei giorni precedenti\u2026 ({{days}}/{{max}})",emptySearched:"Nessuna clip negli ultimi {{days}} giorni.",summary_one:"{{count}} clip",summary_other:"{{count}} clip",collapsedHint:"{{duration}} saltati",hiddenHint_one:"{{count}} nascosta dal filtro sorgenti",hiddenHint_other:"{{count}} nascoste dal filtro sorgenti",segmentLabel:"Clip delle {{time}}, durata {{duration}}",gapLabel:"Salto di {{duration}}",notPlayable:"non ancora riproducibile",kind_motion:"Movimento",kind_object:"Oggetto",kind_audio:"Audio",kind_native:"Telecamera",sourceAnalytics:"Registrazione",sourceOnboard:"Telecamera ({{vendor}})",sourceHksv:"HomeKit",sourceUnknown:"{{vendor}}",unitDay:"g",unitHour:"o",unitMinute:"m",unitSecond:"s",sourceSilent:"{{source}} non ha potuto rispondere per questo intervallo.",sourceMissing:"Questa telecamera non offre pi\xf9 {{source}}. Mostro {{fallback}}.",sourceSetting:"Sorgente clip",recordingSourceSetting:"Sorgente registrazioni",recordingSourceOurs:"CamStack",sourceStateSleeping:"la telecamera sta dormendo",sourceStateUnreachable:"la telecamera non \xe8 raggiungibile",sourceStateNoStorage:"la telecamera non ha memoria installata",sourceStateIndexEmpty:"la telecamera non elenca alcun file",sourceStateUnknown:"il motivo non \xe8 noto a questa app",catalogAsOf:"Catalogo letto {{ago}} fa",thumbQueued:"Anteprima in coda\u2026",thumbNone:"Nessuna anteprima",playFailed:"Impossibile aprire questa clip.",servedInstead:"Richiesto {{asked}}, ricevuto {{served}}.",closeClip:"Chiudi clip",nextClip:"Clip successiva",previousClip:"Clip precedente",saveClip:"Salva clip",saveUnavailable:"Questa clip non pu\xf2 essere fornita",stillRecordingNoLoop:"Registrazione in corso \u2014 riprodotta una volta",still:{waiting:"Sto chiedendo un fermo immagine alla telecamera\u2026",queueFull:"In attesa della telecamera \u2014 la coda dei fermi immagine \xe8 piena",cameraBackoff:"La telecamera si sta riposando dopo un rifiuto \u2014 riprovo a breve",gaveUp:"La telecamera \xe8 ancora occupata \u2014 aggiorna per richiedere",sleeping:"La telecamera dorme \u2014 un fermo immagine costerebbe un risveglio",cameraRefused:"La telecamera ha rifiutato di estrarre un fermo immagine",noKeyframe:"Nessun fotogramma decodificabile in questa finestra",unsupported:"Questa sorgente non pu\xf2 produrre fermi immagine",noCatalogRow:"Questa clip non \xe8 pi\xf9 nel catalogo della telecamera",unknownDevice:"Questa telecamera non \xe8 servita qui",uidMissing:"L'id della telecamera non \xe8 ancora noto"},export:{title:"Salva clip",close:"Chiudi",pickHint:"Scegli la copia da tenere. L'hub la prepara e finisce nella Libreria.",profile:{high:"Qualit\xe0 alta",low:"Qualit\xe0 bassa"},sizeUnknown:"dimensione non indicata",tooLarge:"Troppo grande da trasferire",working:"Preparazione dell'export\u2026",workingHint:"Puoi chiudere \u2014 il lavoro continua.",ready:"Pronto",readyHint:"Lo trovi nella Libreria.",failed:"Export fallito",failure:{"catalog-miss":"La telecamera non elenca pi\xf9 questa clip","catalog-unreachable":"Impossibile leggere il catalogo della telecamera","no-file-for-window":"Non c'\xe8 nessun file dietro questa clip","clip-in-progress":"Questa clip \xe8 ancora in scrittura","unsupported-option":"L'export ha chiesto qualcosa che una clip non pu\xf2 fare",sleeping:"La telecamera sta dormendo","camera-refused":"La telecamera ha rifiutato","fetch-failed":"Impossibile scaricare la clip","too-large-to-transfer":"Troppo grande da trasferire","wake-expired":"La telecamera si \xe8 riaddormentata prima che il lavoro partisse"}},scrubUnavailable:"Le clip di questa camera non si possono scorrere: solo in avanti dal punto in cui \xe8 l'immagine",loopOn:"Riproduci la clip in loop, attivo",loopOff:"Riproduci la clip in loop, disattivo"},eventsEmbed:{section:"Embed dell'hub (anteprima)",title:"Embed eventi",count:"{{count}} mostrati",openPreview:"Anteprima embed",openPreviewHint:"Apre la superficie eventi ospitata dall'hub accanto a questa pagina. Non sostituisce nulla.",view_reel:"Striscia",view_gallery:"Galleria",error:"Impossibile caricare gli eventi",retry:"Riprova",empty:"Nessun evento",emptyFiltered:"Nessun evento corrisponde a questo filtro",end:"\xb7 fine \xb7"},eventsShare:{title:"Link embed eventi",openBuilder:"Crea link embed",openBuilderHint:"Costruisci un URL autonomo per una dashboard o un iframe.",view:"Vista",viewReel:"Striscia",viewGallery:"Galleria",columns:"Colonne",rows:"Righe",auto:"Auto",thumb:"Dimensione miniature",thumbSmall:"Piccola",thumbMedium:"Media",thumbLarge:"Grande",theme:"Tema",themeAuto:"Auto",themeDark:"Scuro",themeLight:"Chiaro",fields:"Testo della card",field_label:"Titolo",field_sublabel:"Classe",field_camera:"Telecamera",field_time:"Ora",field_badges:"Badge",cameras:"Telecamere",camerasAll:"Tutte le telecamere visibili al link",camerasCount:"{{count}} selezionate",preview:"Anteprima del link",shareMediaNotice:"Un link di condivisione non riesce a caricare le miniature. I token di condivisione non hanno alcun accesso all'endpoint dei media: la pagina elenca gli eventi, senza le immagini.",copyLink:"Crea link",chip:"Link embed",semanticScopeNotice:"La ricerca semantica gira su tutte le telecamere e viene poi ristretta a questo link: un link con poche telecamere pu\xf2 quindi restituire pochi risultati su un cluster grande."},eventsCard:{unassignedFace:"volto non assegnato",reviewed:"analizzata",debug:"debug",train:"addestramento",favourite:"preferito",active:"attivo",loadingMore:"Caricamento altri eventi"},gridTile:{play:"Riproduci",pause:"Pausa",listen:"Ascolta",mute:"Silenzia",talk:"Parla",stopTalk:"Termina",ptz:"PTZ",linkedDevices:"Dispositivi collegati",viewOptions:"Opzioni di visualizzazione",moreActions:"Altre azioni",open:"Apri",removeFromView:"Togli dalla vista",resizeWidth:"Ridimensiona larghezza",resizeHeight:"Ridimensiona altezza",noActiveCameras:"Nessuna videocamera attiva",camera:"Videocamera"},battery:{holdHint:"La camera \xe8 a batteria: premi play per avviare lo stream e svegliarla.",startStreamA11y:"Avvia lo stream e sveglia la camera a batteria"},faceReview:{loading:"Caricamento volti\u2026",loadError:"Impossibile caricare i volti.",empty:"Nessun volto da rivedere al momento.",previewClose:"Chiudi",pickIdentityTitle:"Assegna a\u2026",assignFailed:"Impossibile assegnare questo volto.",assign:"Assegna",assignedSuccess:"Assegnato a {{name}}.",confirmAssignTitle:"Assegna volti",confidence:"Affidabilit\xe0",groupSize:"{{count}} volti in questo gruppo",filterAssigned:"Assegnate",filterSuggested:"Suggerite",filterUnassigned:"Non assegnate",certaintyCertain:"quasi certo",certaintyProbable:"probabile",certaintyUncertain:"incerto",analyzeButton:"Gruppi simili",analyzeModalTitle:"Gruppi simili",analyzeLoading:"Ricerca gruppi simili\u2026",analyzeEmpty:"Nessun gruppo simile trovato.",analyzeConfirmBody:"Assegnare {{count}} volti in {{groups}} gruppi?",analyzeResult:"Assegnati {{assigned}} di {{count}} volti.",analyzeAssignFailed:"Alcuni volti sono stati rifiutati e restano non assegnati.",recomputeButton:"Ricalcola i suggerimenti",recomputeProgress:"Ricalcolo {{done}}/{{total}}\u2026",recomputeDone:"Ricalcolati {{count}} volti.",analyzeCoverage:"{{grouped}} dei {{pool}} volti non assegnati analizzati ricadono in {{groups}} gruppo/i di somiglianza. Gli altri qui non hanno somiglianze.",groupExcludeFace:"Escludi questo volto dal gruppo",groupIncludeFace:"Rimetti questo volto nel gruppo",groupPickPerson:"Assegna questo gruppo a",groupShowDetail:"Mostra questo volto ingrandito",groupDetailExclude:"Escludi dal gruppo",groupDetailInclude:"Rimetti nel gruppo",assignedManySuccess:"Assegnati {{count}} volti a {{name}}.",detailTitleMany:"Assegna {{count}} volti selezionati a\u2026",knownPeople:"Persone conosciute",filtersButton:"Filtri",filtersButtonActive:"Filtri ({{count}})",sortLabel:"Ordina per",sortByCertainty:"Certezza",sortByDate:"Data",sortAscending:"Ordine crescente \u2014 tocca per decrescente",sortDescending:"Ordine decrescente \u2014 tocca per crescente",dateLabel:"Intervallo di date",rangeAll:"Tutte",rangeToday:"Oggi",rangeYesterday:"Ieri",rangeLast7:"7 giorni",rangeLast30:"30 giorni",cameraLabel:"Telecamera",cameraNone:"Nessuna telecamera nei volti caricati.",selectButton:"Seleziona",selectDone:"Fatto",selectionCount:"{{count}} selezionati",applySuggestions:"Applica {{count}} suggerimenti",applySuggestionsBlocked:"{{count}} dei volti selezionati non ha un suggerimento \u2014 deselezionali, oppure usa Assegna.",applySuggestionsResult:"Applicati {{count}} suggerimenti su {{total}}, per {{groups}} persone.",emptyFiltered:"Nessun volto corrisponde a questi filtri.",partialWindowHint:"Stai filtrando i {{count}} volti caricati finora \u2014 scorri in basso per caricarne di pi\xf9 vecchi.",auditTitle:"Rianalizza i campioni di {{name}}",auditSummary:"{{flagged}} campioni su {{total}} da guardare",auditLooksLike:"Somiglia a {{name}} ({{foreign}}) pi\xf9 che a questa persona ({{self}})",auditSelfOnly:"Concorda con gli altri campioni di questa persona: {{self}}",auditNotComparable:"Arruolato con un altro modello di volto \u2014 non \xe8 confrontabile, nemmeno per dire che va bene.",auditFromPhoto:"foto",auditRemoveTitle:"Rimuovi questo campione",auditRemoveBody:"Il campione smette di insegnare al riconoscimento. Non cambia nient\u2019altro, e la faccia da cui proviene resta dov\u2019\xe8.",auditUnavailable:"Questo hub non sa ancora rianalizzare una galleria.",auditRemoveFailed:"Impossibile rimuovere questo campione:",pickPersonSearch:"Cerca persone",pickPersonClear:"Cancella la ricerca",pickPersonSamples:"{{count}} campione/i",pickPersonNoMatch:"Nessuna persona corrisponde a \xab{{query}}\xbb.",pickPersonCreate:"Crea \xab{{name}}\xbb",auditOpenButton:"Rianalizza i campioni di una persona",auditPickTitle:"Campioni di chi?",groupPickNone:"Scegli una persona",newPersonButton:"Nuova persona",newPersonTitle:"Aggiungi una persona",newPersonCreated:"Aggiunta {{name}}.",newPersonFailed:"Impossibile aggiungere questa persona.",deleteSelected:"Elimina",deleteBlocked:"{{count}} dei volti selezionati appartengono a una persona: deselezionali, oppure scollegali prima.",deleteConfirmTitle:"Elimina {{count}} volti",deleteConfirmBody:"Il ritaglio e la sua riga escono definitivamente dal buffer di revisione. L\u2019evento da cui provengono non viene toccato.",deleteResult:"Eliminati {{count}} di {{total}} volti.",deleteFailed:"Impossibile eliminare questi volti."},statusDetail:{batteryTitle:"Batteria",linkTitle:"Collegamento",openBatteryA11y:"Dettagli batteria",openLinkA11y:"Dettagli collegamento",close:"Chiudi",label:{charge:"Carica",charging:"Alimentazione",state:"Stato",linkType:"Collegamento",signal:"Segnale",ssid:"Rete",verdict:"Verdetto",picture:"Immagine",bitrate:"Bitrate",decoded:"Fotogrammi decodificati",freezes:"Blocchi",keyframeRequests:"Richieste key frame",loss:"Perdita",latency:"Latenza \xb7 jitter",path:"Percorso",servedRung:"Profilo servito",source:"Sorgente",ingest:"Nodo di ingest",egress:"Leg di uscita",ladder:"Scala qualit\xe0",ladderWhy:"Perch\xe9 \xe8 ferma"},value:{unknown:"Non noto",notApplicable:"Non applicabile",binary:"Solo scarica / ok, senza percentuale",sleeping:"In sospensione",chargingDc:"In carica (rete)",chargingSolar:"In carica (solare)",chargingNone:"Non in carica",wifi:"Wi-Fi",ethernet:"Cavo (Ethernet)",cellular:"Cellulare",linkUnknown:"Non noto",decoding:"Decodifica in corso",decoderStall:"Stallo del decoder \u2014 i byte arrivano, i fotogrammi no",transportStall:"Stallo del trasporto \u2014 non arriva niente",frozenUnknown:"Fotogrammi fermi, byte sconosciuti",noWindow:"Nessuna finestra ancora",native:"Stream nativo",derived:"Derivato (transcodificato qui)",copyLeg:"Copy \u2014 nessuna ricodifica",transcodeLeg:"Transcodifica",ladderNeverMoved:"Mai mossa",ladderHeld:"Ferma",ladderHeldStallBuilding:"Ferma: l'immagine non arriva",ladderHeldDelivery:"Ferma: la qualit\xe0 attuale non arriva intera",ladderHeldNoEvidence:"Ferma: ancora nessun riscontro dal player",ladderHeldWarming:"Stabile, sta per salire",ladderHeldCooldown:"Ferma: appena cambiata",ladderHeldCapacity:"Ferma: banda insufficiente per il livello successivo",ladderHeldTryUnclean:"Ferma: connessione non abbastanza stabile per provare un livello superiore",ladderHeldTryBackoff:"Ferma: il livello superiore \xe8 stato provato e non ha tenuto; nuovo tentativo pi\xf9 tardi",ladderHeldTrial:"Sta provando un livello superiore",ladderHeldSuspended:"In pausa durante la riproduzione registrata",serverNotWired:"Non disponibile da questo player",serverWaiting:"In attesa del server",sessionGone:"Sessione non trovata sul server",noSample:"Nessuna misura ancora"},streamTitle:"Stream"},onDemandPlayer:{openA11y:"Apri nel player on-demand",title:"Player on-demand",close:"Chiudi il player",resize:"Ridimensiona il player",move:"Sposta il player",openCamera:"Apri la schermata della camera",goLive:"Diretta"},reelHighlight:{title:"Highlight del reel",section:"Illumina una card su",close:"Chiudi",reset:"Torna a motion + audio",openA11y:"Impostazioni highlight del reel"},accessoryPanel:{edit:"Personalizza i dispositivi",done:"Fine personalizzazione",emptyHint:"Tocca la matita per aggiungere dispositivi dall\u2019hub \u2014 restano nel profilo di questa app.",addAction:"Aggiungi dispositivi",addTitle:"Aggiungi dispositivi",addHint:"I dispositivi aggiunti qui compaiono solo nel profilo di questa app, sotto questa telecamera. I collegamenti dell\u2019hub non cambiano. Quelli nella stessa stanza sono suggeriti per primi.",picked:"Aggiunti qui",pickedNone:"Nessuno aggiunto",suggested:"Suggeriti \xb7 {{location}}",suggestedNone:"Nessuno",allDevices:"Tutti i dispositivi",searchToSee:"Cerca per vedere gli altri",noMatches:"Nessun risultato",searchPlaceholder:"Cerca per nome, stanza o id",truncated_one:"{{count}} altro risultato non \xe8 mostrato \u2014 restringi la ricerca.",truncated_other:"Altri {{count}} risultati non sono mostrati \u2014 restringi la ricerca.",save:"Conferma le aggiunte",cancel:"Annulla le modifiche",loadFailed:"L\u2019hub non ha risposto con la lista dei dispositivi. Chiudi e riprova.",localBadge:"Aggiunto qui",hiddenBadge:"Nascosto",rename:"Rinomina {{device}}",renameHint:"Visibile solo in questa app. Lascia vuoto per usare il nome dell\u2019hub.",icon:"Cambia l\u2019icona di {{device}}",iconTitle:"Icona per {{device}}",iconDefault:"Icona predefinita",iconSearchPlaceholder:"Cerca icone",iconGroups:{devices:"Dispositivi",lighting:"Luci, clima, elettrodomestici",sensors:"Sensori e meteo",places:"Stanze e luoghi",life:"Veicoli, animali, persone"},hide:"Nascondi {{device}}",show:"Mostra {{device}}",moveUp:"Sposta {{device}} in su",moveDown:"Sposta {{device}} in gi\xf9",remove:"Togli {{device}} da questa lista"}},prototype:{today:"Oggi",yesterday:"Ieri",now:"ORA",endOfDay:"FINE GIORNATA",loading:"Caricamento...",timeline:"Timeline",events:"Eventi",playClip:"Riproduci clip",goToNow:"ORA",noEvents:"Nessun evento"},eventKind:{motion:"Movimento",audio:"Audio",person:"Persona",vehicle:"Veicolo",animal:"Animale",package:"Pacco",sensor:"Sensore",control:"Controllo",car:"Auto",truck:"Camion",bus:"Autobus",motorcycle:"Motocicletta",bicycle:"Bicicletta",airplane:"Aereo",boat:"Barca",train:"Treno",bird:"Uccello",cat:"Gatto",dog:"Cane",horse:"Cavallo",sheep:"Pecora",cow:"Mucca",elephant:"Elefante",bear:"Orso",zebra:"Zebra",giraffe:"Giraffa",contact:"Contatto","motion-sensor":"Sensore movimento",smoke:"Fumo",flood:"Allagamento",gas:"Gas","carbon-monoxide":"Monossido di carbonio",vibration:"Vibrazione",tamper:"Manomissione",presence:"Presenza","enum-sensor":"Stato sensore","device-event":"Evento dispositivo",lock:"Serratura",cover:"Tapparella",switch:"Interruttore",siren:"Sirena",button:"Pulsante",doorbell:"Campanello","package-delivered":"Pacco consegnato","package-picked-up":"Pacco ritirato","audio-speech":"Voce","audio-music":"Musica","audio-dog":"Cane","audio-doorbell":"Campanello","audio-siren":"Sirena","audio-alarm":"Allarme","audio-animal":"Animale (altro)","audio-bird":"Uccello","audio-cat":"Gatto","audio-crowd":"Folla / Chiacchiericcio","audio-crying":"Pianto / Neonato","audio-door":"Porta","audio-engine":"Motore","audio-fire":"Fuoco / Fumo","audio-footsteps":"Passi","audio-glass_breaking":"Vetro rotto","audio-gunshot":"Sparo / Esplosione","audio-laughter":"Risata","audio-scream":"Urlo","audio-silence":"Silenzio","audio-telephone":"Telefono","audio-tools":"Utensili / Lavori","audio-vehicle":"Veicolo","audio-water":"Acqua","audio-wind":"Vento / Maltempo"}}},2616,[]);
|
|
4517
4517
|
__d(function(g,r,i,a,m,_e,_d){"use strict";var e,t=r(_d[0]),n=(e=t)&&e.__esModule?e:{default:e},u=(function(e){if(e&&e.__esModule)return e;var t={};return e&&Object.keys(e).forEach(function(n){var u=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,u.get?u:{enumerable:!0,get:function(){return e[n]}})}),t.default=e,t})(r(_d[1])),c=r(_d[2]);(0,c.setEmbedCacheBust)((0,c.deriveEmbedCacheBust)({updateId:(function(){try{return u.updateId}catch{return null}})(),appVersion:(function(){try{return n.default.expoConfig?.version??null}catch{return null}})()}))},2617,[288,2190,1769]);
|
|
4518
4518
|
__d(function(g,r,i,a,m,e,d){"use strict";var t=r(d[0]),s=r(d[1]),S=r(d[2]);t.useCameraPrefsStore.getState().hydrate(),s.useGridStore.getState().hydrate(),S.useLastCameraStore.getState().hydrate()},2618,[1644,1645,1204]);
|
|
4519
4519
|
__d(function(g,r,i,a,m,_e,d){"use strict";Object.defineProperty(_e,'__esModule',{value:!0}),_e.RootProviders=function(t){const f=(0,e.c)(7),{children:v}=t;let b,P,S,M,C,E;f[0]===Symbol.for("react.memo_cache_sentinel")?(b={flex:1},f[0]=b):b=f[0];f[1]===Symbol.for("react.memo_cache_sentinel")?(P=(0,R.jsx)(c.ThemedStatusBar,{}),f[1]=P):P=f[1];f[2]===Symbol.for("react.memo_cache_sentinel")?(S=(0,R.jsx)(x.OtaUpdateGate,{}),M=(0,R.jsx)(j.WhatsNewGate,{}),C=(0,R.jsx)(h.EmbedWarmup,{}),f[2]=S,f[3]=M,f[4]=C):(S=f[2],M=f[3],C=f[4]);f[5]!==v?(E=(0,R.jsx)(p.RootErrorBoundary,{children:(0,R.jsx)(n.GestureHandlerRootView,{style:b,children:(0,R.jsx)(o.SafeAreaProvider,{initialMetrics:o.initialWindowMetrics,children:(0,R.jsx)(s.QueryClientProvider,{client:B,children:(0,R.jsxs)(l.ThemeProvider,{children:[P,(0,R.jsx)(y.ConfirmProvider,{children:(0,R.jsx)(u.ServerProvider,{children:(0,R.jsxs)(_.LoggerBridge,{children:[S,M,C,v]})})})]})})})})}),f[5]=v,f[6]=E):E=f[6];return E};var e=r(d[0]);r(d[1]);var t,n=r(d[2]),o=r(d[3]),s=r(d[4]),l=r(d[5]),c=r(d[6]),u=r(d[7]),h=r(d[8]),x=r(d[9]),j=r(d[10]),_=r(d[11]),f=r(d[12]),v=r(d[13]),p=r(d[14]),y=r(d[15]),b=r(d[16]),P=(t=b)&&t.__esModule?t:{default:t},S=r(d[17]),M=r(d[18]),R=r(d[19]);const B=(0,f.createQueryClient)();(0,v.bindQueryFocusToAppState)(),(0,M.publishRunningBundle)(),(0,S.installCrashReporter)(),(0,S.reportPreviousExit)(),(0,S.bindExitMarkerToAppState)(P.default)},2619,[15,17,1782,466,1594,782,2620,1657,2621,2627,2628,2629,1662,2630,2631,1912,223,2202,2201,10]);
|