@camstack/addon-admin-ui 1.2.428 → 1.2.429

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.
Files changed (167) hide show
  1. package/dist/assets/{AddonAssetIcon-Cs_blBpK.js → AddonAssetIcon-DR35yt0E.js} +1 -1
  2. package/dist/assets/Addons-gkGgGpTC.js +4 -0
  3. package/dist/assets/{AdminPage-DuuyDIsY.js → AdminPage-DAO24U0w.js} +1 -1
  4. package/dist/assets/AdminSectionedPage-B-qoE6ra.js +1 -0
  5. package/dist/assets/AiProfiles-BXcreqZP.js +3 -0
  6. package/dist/assets/BrokerForm-B3xs9aBj.js +1 -0
  7. package/dist/assets/Build-DeMAJfjN.js +40 -0
  8. package/dist/assets/Calendars-VPH-vy-o.js +1 -0
  9. package/dist/assets/Cluster-B-k0M79z.js +1 -0
  10. package/dist/assets/ClusterStepModel-DaAc_6nI.js +1 -0
  11. package/dist/assets/CompositionEditor-BrtLjoSu.js +1 -0
  12. package/dist/assets/{CompositionEditorPage-Acq7iapA.js → CompositionEditorPage-D51jS9td.js} +1 -1
  13. package/dist/assets/Data-IfJuKcwc.js +2 -0
  14. package/dist/assets/DeviceDetail-D1qU_p1k.js +2 -0
  15. package/dist/assets/DeviceDoActionFields-B62Nv4K7.js +1 -0
  16. package/dist/assets/Devices-Cf5Exjsk.js +1 -0
  17. package/dist/assets/{EmbedPlayerPage-RXOmf2F3.js → EmbedPlayerPage-CnEcSJ8D.js} +1 -1
  18. package/dist/assets/Identity-DNE80jdX.js +1 -0
  19. package/dist/assets/IntegrationDetail-LKbiJFU3.js +1 -0
  20. package/dist/assets/IntegrationHub-DdjWEObX.js +1 -0
  21. package/dist/assets/Integrations-CU7Ll9U_.js +1 -0
  22. package/dist/assets/Integrations-uZB2ozhn.js +1 -0
  23. package/dist/assets/Library-DSuCaXt6.js +1 -0
  24. package/dist/assets/Locations-BeaznsZS.js +3 -0
  25. package/dist/assets/{Logs-DIeXeCqI.js → Logs-cm-1R2Z4.js} +1 -1
  26. package/dist/assets/MaskShapeCanvas-CM9D4FOf.js +1 -0
  27. package/dist/assets/MotionZonesSettings-DqS8ndiK.js +1 -0
  28. package/dist/assets/MyAccess-Dxb11B6h.js +2 -0
  29. package/dist/assets/Network-BCDUHSB0.js +1 -0
  30. package/dist/assets/NodeAddonsSettingsPanel-BMat4ckt.js +1 -0
  31. package/dist/assets/Notifications-EPQiEZ1t.js +1 -0
  32. package/dist/assets/PrivacyMaskSettings-Bis0PO01.js +1 -0
  33. package/dist/assets/Recordings-BCeoXxL4.js +1 -0
  34. package/dist/assets/ScanNetworkModal-dHWFmbFe.js +1 -0
  35. package/dist/assets/SceneMonitorEditor-SFMMIopn.js +1 -0
  36. package/dist/assets/SessionsList-BRTwG3uv.js +2 -0
  37. package/dist/assets/{Showroom-W2yJvb8s.js → Showroom-Er-hes9K.js} +1 -1
  38. package/dist/assets/System-BDXxfgsq.js +1 -0
  39. package/dist/assets/{Terminal-CrFum1tE.js → Terminal-B70jnm8e.js} +4 -4
  40. package/dist/assets/{Viewer-YBzeS3RA.js → Viewer-BsGL5Dfa.js} +1 -1
  41. package/dist/assets/_virtual_mf-localSharedImportMap___mfe_internal__admin_ui_host-C7iEnSHU.js +1 -0
  42. package/dist/assets/_virtual_mf___mfe_internal__admin_ui_host__loadShare___mf_0_tanstack_mf_1_react_mf_2_query__loadShare__.js-CEHpkaJP.js +1 -0
  43. package/dist/assets/_virtual_mf___mfe_internal__admin_ui_host__loadShare___mf_0_trpc_mf_1_react_mf_2_query__loadShare__.js-DdJYWyu3.js +1 -0
  44. package/dist/assets/{_virtual_mf___mfe_internal__admin_ui_host__loadShare__react_mf_2_dom__loadShare__.js-BsvPG3BX.js → _virtual_mf___mfe_internal__admin_ui_host__loadShare__react_mf_2_dom__loadShare__.js-DPkvGqVU.js} +1 -1
  45. package/dist/assets/{_virtual_mf___mfe_internal__admin_ui_host__loadShare__react_mf_2_dom_mf_1_client__loadShare__.js-DtoGixA1.js → _virtual_mf___mfe_internal__admin_ui_host__loadShare__react_mf_2_dom_mf_1_client__loadShare__.js-Cb2QlpvS.js} +1 -1
  46. package/dist/assets/{_virtual_mf___mfe_internal__admin_ui_host__loadShare__react_mf_2_konva__loadShare__.js-PmiLsYEK.js → _virtual_mf___mfe_internal__admin_ui_host__loadShare__react_mf_2_konva__loadShare__.js-Cyj0Xie_.js} +4 -4
  47. package/dist/assets/{addon-icons-context-D6glxUQF.js → addon-icons-context--6Hi3qRW.js} +1 -1
  48. package/dist/assets/{archive-kvflMCgL.js → archive-DtcjevJM.js} +1 -1
  49. package/dist/assets/{authed-media-CSlndmzS.js → authed-media-LCmlAEZ5.js} +1 -1
  50. package/dist/assets/{bell-off-BYnwGeiH.js → bell-off-eQBpwamg.js} +1 -1
  51. package/dist/assets/board-model-wzCmdEKJ.js +1 -0
  52. package/dist/assets/{boxes-Dx4USyB3.js → boxes-DikDfAoo.js} +1 -1
  53. package/dist/assets/circle-slash-YVgGJTpJ.js +1 -0
  54. package/dist/assets/client-DYbvGOid.js +358 -0
  55. package/dist/assets/{cloud-upload-82x5w5u8.js → cloud-upload-DI9XunFf.js} +1 -1
  56. package/dist/assets/crop-CxZbpOyK.js +1 -0
  57. package/dist/assets/{device-integration-icon-bTnWrYe0.js → device-integration-icon-D2lWVDM2.js} +1 -1
  58. package/dist/assets/device-picker-model-C4w1vbly.js +1 -0
  59. package/dist/assets/dist-CPO0KWoy.js +358 -0
  60. package/dist/assets/dist-ChQzskeX.js +1 -0
  61. package/dist/assets/{eraser-B8Awx5Sj.js → eraser-Dl5ROV0l.js} +1 -1
  62. package/dist/assets/{file-up-LqDVgVVa.js → file-up-WS3s_T9x.js} +1 -1
  63. package/dist/assets/{hard-drive-download-C24D80x2.js → hard-drive-download-B1ard6ym.js} +1 -1
  64. package/dist/assets/{history-DZsORyBG.js → history-BMhP0SFG.js} +1 -1
  65. package/dist/assets/{hostInit-D2EmEDvv.js → hostInit-FCvre9AW.js} +1 -1
  66. package/dist/assets/i18n-Vb3uBp7P.js +1 -0
  67. package/dist/assets/{icons-D5RaCH1q.js → icons-DocdgFuy.js} +1 -1
  68. package/dist/assets/index-DKqvG7BE.css +2 -0
  69. package/dist/assets/index-DvOECbab.js +4 -0
  70. package/dist/assets/{key-DLwSBrPM.js → key-B1M6i1mf.js} +1 -1
  71. package/dist/assets/{key-round-CYflkUyd.js → key-round-yCDTbIQb.js} +1 -1
  72. package/dist/assets/{layers-C1wzFfr1.js → layers-c960YTPf.js} +1 -1
  73. package/dist/assets/linked-devices-model-CB7qgVjI.js +1 -0
  74. package/dist/assets/{list-ordered-CFeS9o_w.js → list-ordered-C7hEwAd1.js} +1 -1
  75. package/dist/assets/location-owned-usage-D28vwYJT.js +1 -0
  76. package/dist/assets/{log-in-Be_RcxDr.js → log-in-DFfxcqYz.js} +1 -1
  77. package/dist/assets/{memory-stick-4BwYEagi.js → memory-stick-BBfIGrWx.js} +1 -1
  78. package/dist/assets/{message-square-plus-D7BNG3h7.js → message-square-plus-D8ZUT6rz.js} +1 -1
  79. package/dist/assets/{mf-entry-bootstrap-0-9df0d08c.js → mf-entry-bootstrap-0-3035e647.js} +2 -2
  80. package/dist/assets/{mic-off-e162Bcfu.js → mic-off-w2mFOBi3.js} +1 -1
  81. package/dist/assets/{monitor-off-CARYfHC4.js → monitor-off-DPi_gm_c.js} +1 -1
  82. package/dist/assets/{monitor-smartphone-lsNgnRRZ.js → monitor-smartphone-9Ife1Trw.js} +1 -1
  83. package/dist/assets/mount-C4w1vbly.js +1 -0
  84. package/dist/assets/notification-schedule-field-BuLfSYLZ.js +1 -0
  85. package/dist/assets/{octagon-alert-h80nyWRM.js → octagon-alert-C-jH7VH_.js} +1 -1
  86. package/dist/assets/player-overlays-D0U2dNvn.js +1 -0
  87. package/dist/assets/{recycle-0MLWppmT.js → recycle-Bbki65G2.js} +1 -1
  88. package/dist/assets/remoteEntry-DYVoozgD.js +1 -0
  89. package/dist/assets/{scan-eye-DVK8MF3K.js → scan-eye-AfIM_Dlr.js} +1 -1
  90. package/dist/assets/{scissors-Cz3GoeOd.js → scissors-CnL6g0BO.js} +1 -1
  91. package/dist/assets/{search-x-i_A-Upbe.js → search-x-eqJd3G8u.js} +1 -1
  92. package/dist/assets/{send-B5VKcNUH.js → send-B72RQ9UL.js} +1 -1
  93. package/dist/assets/{settings-2-ZQsYJ0Zb.js → settings-2-CXZ6DVRg.js} +1 -1
  94. package/dist/assets/{speaker-Cl8DZGk_.js → speaker-CcCWWecW.js} +1 -1
  95. package/dist/assets/src-CGxdJN_f.js +67 -0
  96. package/dist/assets/{timer-reset-A5ofAkBW.js → timer-reset-B9Lihcw9.js} +1 -1
  97. package/dist/assets/{ungroup-t0yDnzVf.js → ungroup-D753owNE.js} +1 -1
  98. package/dist/assets/{unlink-C1ZpCxl3.js → unlink-DzoLNfsq.js} +1 -1
  99. package/dist/assets/{usb-DmUPajSy.js → usb-CuSU-_EY.js} +1 -1
  100. package/dist/assets/{use-scenes-feed-BQlYhRMq.js → use-scenes-feed-CZjJNxfD.js} +1 -1
  101. package/dist/assets/{use-stationary-objects-BWM4vE0E.js → use-stationary-objects-BoGqWyLV.js} +1 -1
  102. package/dist/assets/useEventInvalidation-C4w1vbly.js +1 -0
  103. package/dist/assets/useNodeUrlSelection-BA6CgjTU.js +1 -0
  104. package/dist/assets/useTranslation-D3Is_4B6.js +1 -0
  105. package/dist/assets/user-round-CMg3Ndlt.js +1 -0
  106. package/dist/assets/{user-x-DRcPeM9C.js → user-x-PK8sSsso.js} +1 -1
  107. package/dist/assets/{video-tLHyNE3q.js → video-BBtESt54.js} +1 -1
  108. package/dist/assets/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__admin_ui_host__remoteEntry-_hash_-DOOXjnRq.js → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__admin_ui_host__remoteEntry-_hash_-BKfTL-9e.js} +2 -2
  109. package/dist/index.html +12 -12
  110. package/dist/server/addon.js +174 -5
  111. package/package.json +1 -1
  112. package/dist/assets/Addons-2xWF73cR.js +0 -4
  113. package/dist/assets/AdminSectionedPage-C3VHg80L.js +0 -1
  114. package/dist/assets/AiProfiles-DmHcVlS2.js +0 -3
  115. package/dist/assets/BrokerForm-Dqhjsi3Y.js +0 -1
  116. package/dist/assets/Build-CBYP1fT5.js +0 -40
  117. package/dist/assets/Calendars-C926x7b_.js +0 -1
  118. package/dist/assets/Cluster-OZlA14uV.js +0 -1
  119. package/dist/assets/ClusterStepModel-DHbwIGAW.js +0 -1
  120. package/dist/assets/CompositionEditor-vP3JcV2R.js +0 -1
  121. package/dist/assets/Data-7BoejvKA.js +0 -1
  122. package/dist/assets/DeviceDetail-ByM0856T.js +0 -2
  123. package/dist/assets/DeviceDoActionFields-BDJsvRNX.js +0 -1
  124. package/dist/assets/Devices-PIrWjfhq.js +0 -1
  125. package/dist/assets/Identity-C-tztwfa.js +0 -1
  126. package/dist/assets/IntegrationDetail-DugB7cv6.js +0 -1
  127. package/dist/assets/IntegrationHub-BePMbmC5.js +0 -1
  128. package/dist/assets/Integrations-Dj3nT9ZT.js +0 -1
  129. package/dist/assets/Integrations-OH5z-t03.js +0 -1
  130. package/dist/assets/Library-DDNti2te.js +0 -1
  131. package/dist/assets/Locations-OL9_NoSi.js +0 -3
  132. package/dist/assets/MaskShapeCanvas-Dcpby34M.js +0 -1
  133. package/dist/assets/MotionZonesSettings-CfTOerul.js +0 -1
  134. package/dist/assets/MyAccess-iJP3JQIS.js +0 -2
  135. package/dist/assets/Network-DYssxNiN.js +0 -1
  136. package/dist/assets/NodeAddonsSettingsPanel-mmtEgDbu.js +0 -1
  137. package/dist/assets/Notifications-DEcxFWp3.js +0 -1
  138. package/dist/assets/PrivacyMaskSettings-CJUKFEIs.js +0 -1
  139. package/dist/assets/Recordings-lygSYEJj.js +0 -1
  140. package/dist/assets/ScanNetworkModal-C2oJlLfj.js +0 -1
  141. package/dist/assets/SceneMonitorEditor-D1S-D2V9.js +0 -1
  142. package/dist/assets/SessionsList-CIN4GdSm.js +0 -2
  143. package/dist/assets/System-ChWpOOqN.js +0 -1
  144. package/dist/assets/_virtual_mf-localSharedImportMap___mfe_internal__admin_ui_host-CE2IIKhe.js +0 -1
  145. package/dist/assets/_virtual_mf___mfe_internal__admin_ui_host__loadShare___mf_0_tanstack_mf_1_react_mf_2_query__loadShare__.js-DhP-Lgiq.js +0 -1
  146. package/dist/assets/_virtual_mf___mfe_internal__admin_ui_host__loadShare___mf_0_trpc_mf_1_react_mf_2_query__loadShare__.js-DX7sYWrs.js +0 -1
  147. package/dist/assets/board-model-Bmts6hrg.js +0 -1
  148. package/dist/assets/circle-slash-D5mo-8G0.js +0 -1
  149. package/dist/assets/client-CMlUvfoK.js +0 -358
  150. package/dist/assets/crop-Dev61hIh.js +0 -1
  151. package/dist/assets/device-picker-model-DlnG_8P7.js +0 -1
  152. package/dist/assets/dist--5X8Gy0U.js +0 -1
  153. package/dist/assets/dist-Dod19ois.js +0 -358
  154. package/dist/assets/i18n-vggiB6gm.js +0 -1
  155. package/dist/assets/index-BgQGn3LX.js +0 -4
  156. package/dist/assets/index-BndCgmxf.css +0 -2
  157. package/dist/assets/linked-devices-model-CCTQ_gka.js +0 -1
  158. package/dist/assets/location-owned-usage-DSLiI6RY.js +0 -1
  159. package/dist/assets/mount-DlnG_8P7.js +0 -1
  160. package/dist/assets/notification-schedule-field-DWpT_5Vh.js +0 -1
  161. package/dist/assets/player-overlays-Cda8wso6.js +0 -1
  162. package/dist/assets/remoteEntry-V_83-NrI.js +0 -1
  163. package/dist/assets/src-eoSUZcV-.js +0 -67
  164. package/dist/assets/useEventInvalidation-DlnG_8P7.js +0 -1
  165. package/dist/assets/useNodeUrlSelection-CTxv9Em7.js +0 -1
  166. package/dist/assets/useTranslation-Bc5yH9V9.js +0 -1
  167. package/dist/assets/user-round-BTaID248.js +0 -1
@@ -1 +0,0 @@
1
- import{n as e}from"./useTranslation-Bc5yH9V9.js";var t=e=>typeof e==`string`,n=()=>{let e,t,n=new Promise((n,r)=>{e=n,t=r});return n.resolve=e,n.reject=t,n},r=e=>e==null?``:String(e),i=(e,t,n)=>{e.forEach(e=>{t[e]&&(n[e]=t[e])})},a=/###/g,o=e=>e&&e.includes(`###`)?e.replace(a,`.`):e,s=e=>!e||t(e),c=(e,n,r)=>{let i=t(n)?n.split(`.`):n,a=0;for(;a<i.length-1;){if(s(e))return{};let t=o(i[a]);!e[t]&&r&&(e[t]=new r),e=Object.prototype.hasOwnProperty.call(e,t)?e[t]:{},++a}return s(e)?{}:{obj:e,k:o(i[a])}},l=(e,t,n)=>{let{obj:r,k:i}=c(e,t,Object);if(r!==void 0||t.length===1){r[i]=n;return}let a=t[t.length-1],o=t.slice(0,t.length-1),s=c(e,o,Object);for(;s.obj===void 0&&o.length;)a=`${o[o.length-1]}.${a}`,o=o.slice(0,o.length-1),s=c(e,o,Object),s?.obj&&s.obj[`${s.k}.${a}`]!==void 0&&(s.obj=void 0);s.obj[`${s.k}.${a}`]=n},u=(e,t,n,r)=>{let{obj:i,k:a}=c(e,t,Object);i[a]=i[a]||[],i[a].push(n)},d=(e,t)=>{let{obj:n,k:r}=c(e,t);if(n&&Object.prototype.hasOwnProperty.call(n,r))return n[r]},f=(e,t,n)=>{let r=d(e,n);return r===void 0?d(t,n):r},p=(e,n,r)=>{for(let i in n)i!==`__proto__`&&i!==`constructor`&&(i in e?t(e[i])||e[i]instanceof String||t(n[i])||n[i]instanceof String?r&&(e[i]=n[i]):p(e[i],n[i],r):e[i]=n[i]);return e},m=e=>e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,`\\$&`),h={"&":`&amp;`,"<":`&lt;`,">":`&gt;`,'"':`&quot;`,"'":`&#39;`,"/":`&#x2F;`},g=e=>t(e)?e.replace(/[&<>"'\/]/g,e=>h[e]):e,_=class{constructor(e){this.capacity=e,this.regExpMap=new Map,this.regExpQueue=[]}getRegExp(e){let t=this.regExpMap.get(e);if(t!==void 0)return t;let n=new RegExp(e);return this.regExpQueue.length===this.capacity&&this.regExpMap.delete(this.regExpQueue.shift()),this.regExpMap.set(e,n),this.regExpQueue.push(e),n}},v=[` `,`,`,`?`,`!`,`;`],y=new _(20),b=(e,t,n)=>{t||=``,n||=``;let r=v.filter(e=>!t.includes(e)&&!n.includes(e));if(r.length===0)return!0;let i=y.getRegExp(`(${r.map(e=>e===`?`?`\\?`:e).join(`|`)})`),a=!i.test(e);if(!a){let t=e.indexOf(n);t>0&&!i.test(e.substring(0,t))&&(a=!0)}return a},x=(e,t,n=`.`)=>{if(!e)return;if(e[t])return Object.prototype.hasOwnProperty.call(e,t)?e[t]:void 0;let r=t.split(n),i=e;for(let e=0;e<r.length;){if(!i||typeof i!=`object`)return;let t,a=``;for(let o=e;o<r.length;++o)if(o!==e&&(a+=n),a+=r[o],t=i[a],t!==void 0){if([`string`,`number`,`boolean`].includes(typeof t)&&o<r.length-1)continue;e+=o-e+1;break}i=t}return i},S=e=>e?.replace(/_/g,`-`),C={type:`logger`,log(e){this.output(`log`,e)},warn(e){this.output(`warn`,e)},error(e){this.output(`error`,e)},output(e,t){console?.[e]?.apply?.(console,t)}},w=new class e{constructor(e,t={}){this.init(e,t)}init(e,t={}){this.prefix=t.prefix||`i18next:`,this.logger=e||C,this.options=t,this.debug=t.debug}log(...e){return this.forward(e,`log`,``,!0)}warn(...e){return this.forward(e,`warn`,``,!0)}error(...e){return this.forward(e,`error`,``)}deprecate(...e){return this.forward(e,`warn`,`WARNING DEPRECATED: `,!0)}forward(e,n,r,i){return i&&!this.debug?null:(e=e.map(e=>t(e)?e.replace(/[\r\n\x00-\x1F\x7F]/g,` `):e),t(e[0])&&(e[0]=`${r}${this.prefix} ${e[0]}`),this.logger[n](e))}create(t){return new e(this.logger,{prefix:`${this.prefix}:${t}:`,...this.options})}clone(t){return t||=this.options,t.prefix=t.prefix||this.prefix,new e(this.logger,t)}},T=class{constructor(){this.observers={}}on(e,t){return e.split(` `).forEach(e=>{this.observers[e]||(this.observers[e]=new Map);let n=this.observers[e].get(t)||0;this.observers[e].set(t,n+1)}),this}off(e,t){if(this.observers[e]){if(!t){delete this.observers[e];return}this.observers[e].delete(t)}}once(e,t){let n=(...r)=>{t(...r),this.off(e,n)};return this.on(e,n),this}emit(e,...t){this.observers[e]&&Array.from(this.observers[e].entries()).forEach(([e,n])=>{for(let r=0;r<n;r++)e(...t)}),this.observers[`*`]&&Array.from(this.observers[`*`].entries()).forEach(([n,r])=>{for(let i=0;i<r;i++)n(e,...t)})}},E=class extends T{constructor(e,t={ns:[`translation`],defaultNS:`translation`}){super(),this.data=e||{},this.options=t,this.options.keySeparator===void 0&&(this.options.keySeparator=`.`),this.options.ignoreJSONStructure===void 0&&(this.options.ignoreJSONStructure=!0)}addNamespaces(e){this.options.ns.includes(e)||this.options.ns.push(e)}removeNamespaces(e){let t=this.options.ns.indexOf(e);t>-1&&this.options.ns.splice(t,1)}getResource(e,n,r,i={}){let a=i.keySeparator===void 0?this.options.keySeparator:i.keySeparator,o=i.ignoreJSONStructure===void 0?this.options.ignoreJSONStructure:i.ignoreJSONStructure,s;e.includes(`.`)?s=e.split(`.`):(s=[e,n],r&&(Array.isArray(r)?s.push(...r):t(r)&&a?s.push(...r.split(a)):s.push(r)));let c=d(this.data,s);return!c&&!n&&!r&&e.includes(`.`)&&(e=s[0],n=s[1],r=s.slice(2).join(`.`)),c||!o||!t(r)?c:x(this.data?.[e]?.[n],r,a)}addResource(e,t,n,r,i={silent:!1}){let a=i.keySeparator===void 0?this.options.keySeparator:i.keySeparator,o=[e,t];n&&(o=o.concat(a?n.split(a):n)),e.includes(`.`)&&(o=e.split(`.`),r=t,t=o[1]),this.addNamespaces(t),l(this.data,o,r),i.silent||this.emit(`added`,e,t,n,r)}addResources(e,n,r,i={silent:!1}){for(let i in r)(t(r[i])||Array.isArray(r[i]))&&this.addResource(e,n,i,r[i],{silent:!0});i.silent||this.emit(`added`,e,n,r)}addResourceBundle(e,t,n,r,i,a={silent:!1,skipCopy:!1}){let o=[e,t];e.includes(`.`)&&(o=e.split(`.`),r=n,n=t,t=o[1]),this.addNamespaces(t);let s=d(this.data,o)||{};a.skipCopy||(n=JSON.parse(JSON.stringify(n))),r?p(s,n,i):s={...s,...n},l(this.data,o,s),a.silent||this.emit(`added`,e,t,n)}removeResourceBundle(e,t){this.hasResourceBundle(e,t)&&delete this.data[e][t],this.removeNamespaces(t),this.emit(`removed`,e,t)}hasResourceBundle(e,t){return this.getResource(e,t)!==void 0}getResourceBundle(e,t){return t||=this.options.defaultNS,this.getResource(e,t)}getDataByLanguage(e){return this.data[e]}hasLanguageSomeTranslations(e){let t=this.getDataByLanguage(e);return!!(t&&Object.keys(t)||[]).find(e=>t[e]&&Object.keys(t[e]).length>0)}toJSON(){return this.data}},D={processors:{},addPostProcessor(e){this.processors[e.name]=e},handle(e,t,n,r,i){return e.forEach(e=>{t=this.processors[e]?.process(t,n,r,i)??t}),t}},O=Symbol(`i18next/PATH_KEY`);function k(){let e=[],t=Object.create(null),n;return t.get=(r,i)=>(n?.revoke?.(),i===O?e:(e.push(i),n=Proxy.revocable(r,t),n.proxy)),Proxy.revocable(Object.create(null),t).proxy}function A(e,t){let{[O]:n}=e(k()),r=t?.keySeparator??`.`,i=t?.nsSeparator??`:`,a=t?.enableSelector===`strict`;if(n.length>1&&i){let e=t?.ns,o=a?Array.isArray(e)?e:e?[e]:null:Array.isArray(e)?e:null;if(o&&(a?o:o.length>1?o.slice(1):[]).includes(n[0]))return`${n[0]}${i}${n.slice(1).join(r)}`}return n.join(r)}var j=e=>!t(e)&&typeof e!=`boolean`&&typeof e!=`number`,M=class e extends T{constructor(e,t={}){super(),i([`resourceStore`,`languageUtils`,`pluralResolver`,`interpolator`,`backendConnector`,`i18nFormat`,`utils`],e,this),this.options=t,this.options.keySeparator===void 0&&(this.options.keySeparator=`.`),this.logger=w.create(`translator`),this.checkedLoadedFor={}}changeLanguage(e){e&&(this.language=e)}exists(e,t={interpolation:{}}){let n={...t};if(e==null)return!1;let r=this.resolve(e,n);if(r?.res===void 0)return!1;let i=j(r.res);return!(n.returnObjects===!1&&i)}extractFromKey(e,n){let r=n.nsSeparator===void 0?this.options.nsSeparator:n.nsSeparator;r===void 0&&(r=`:`);let i=n.keySeparator===void 0?this.options.keySeparator:n.keySeparator,a=n.ns||this.options.defaultNS||[],o=r&&e.includes(r),s=!this.options.userDefinedKeySeparator&&!n.keySeparator&&!this.options.userDefinedNsSeparator&&!n.nsSeparator&&!b(e,r,i);if(o&&!s){let n=e.match(this.interpolator.nestingRegexp);if(n&&n.length>0)return{key:e,namespaces:t(a)?[a]:a};let o=e.split(r);(r!==i||r===i&&this.options.ns.includes(o[0]))&&(a=o.shift()),e=o.join(i)}return{key:e,namespaces:t(a)?[a]:a}}translate(n,r,i){let a=typeof r==`object`?{...r}:r;if(typeof a!=`object`&&this.options.overloadTranslationOptionHandler&&(a=this.options.overloadTranslationOptionHandler(arguments)),typeof a==`object`&&(a={...a}),a||={},n==null)return``;typeof n==`function`&&(n=A(n,{...this.options,...a})),Array.isArray(n)||(n=[String(n)]),n=n.map(e=>typeof e==`function`?A(e,{...this.options,...a}):String(e));let o=a.returnDetails===void 0?this.options.returnDetails:a.returnDetails,s=a.keySeparator===void 0?this.options.keySeparator:a.keySeparator,{key:c,namespaces:l}=this.extractFromKey(n[n.length-1],a),u=l[l.length-1],d=a.nsSeparator===void 0?this.options.nsSeparator:a.nsSeparator;d===void 0&&(d=`:`);let f=a.lng||this.language,p=a.appendNamespaceToCIMode||this.options.appendNamespaceToCIMode;if(f?.toLowerCase()===`cimode`)return p?o?{res:`${u}${d}${c}`,usedKey:c,exactUsedKey:c,usedLng:f,usedNS:u,usedParams:this.getUsedParamsDetails(a)}:`${u}${d}${c}`:o?{res:c,usedKey:c,exactUsedKey:c,usedLng:f,usedNS:u,usedParams:this.getUsedParamsDetails(a)}:c;let m=this.resolve(n,a),h=m?.res,g=m?.usedKey||c,_=m?.exactUsedKey||c,v=[`[object Number]`,`[object Function]`,`[object RegExp]`],y=a.joinArrays===void 0?this.options.joinArrays:a.joinArrays,b=!this.i18nFormat||this.i18nFormat.handleAsObject,x=a.count!==void 0&&!t(a.count),S=e.hasDefaultValue(a),C=x?this.pluralResolver.getSuffix(f,a.count,a):``,w=a.ordinal&&x?this.pluralResolver.getSuffix(f,a.count,{ordinal:!1}):``,T=x&&!a.ordinal&&a.count===0,E=T&&a[`defaultValue${this.options.pluralSeparator}zero`]||a[`defaultValue${C}`]||a[`defaultValue${w}`]||a.defaultValue,D=h;b&&!h&&S&&(D=E);let O=j(D),k=Object.prototype.toString.apply(D);if(b&&D&&O&&!v.includes(k)&&!(t(y)&&Array.isArray(D))){if(!a.returnObjects&&!this.options.returnObjects){this.options.returnedObjectHandler||this.logger.warn(`accessing an object - but returnObjects options is not enabled!`);let e=this.options.returnedObjectHandler?this.options.returnedObjectHandler(g,D,{...a,ns:l}):`key '${c} (${this.language})' returned an object instead of string.`;return o?(m.res=e,m.usedParams=this.getUsedParamsDetails(a),m):e}if(s){let e=Array.isArray(D),t=e?[]:{},n=e?_:g;for(let e in D)if(Object.prototype.hasOwnProperty.call(D,e)){let r=`${n}${s}${e}`;S&&!h?t[e]=this.translate(r,{...a,defaultValue:j(E)?E[e]:void 0,joinArrays:!1,ns:l}):t[e]=this.translate(r,{...a,joinArrays:!1,ns:l}),t[e]===r&&(t[e]=D[e])}h=t}}else if(b&&t(y)&&Array.isArray(h))h=h.join(y),h&&=this.extendTranslation(h,n,a,i);else{let e=!1,t=!1;!this.isValidLookup(h)&&S&&(e=!0,h=E),this.isValidLookup(h)||(t=!0,h=c);let r=(a.missingKeyNoValueFallbackToKey||this.options.missingKeyNoValueFallbackToKey)&&t?void 0:h,o=S&&E!==h&&this.options.updateMissing;if(t||e||o){if(this.logger.log(o?`updateKey`:`missingKey`,f,u,x&&!o?`${c}${this.pluralResolver.getSuffix(f,a.count,a)}`:c,o?E:h),s){let e=this.resolve(c,{...a,keySeparator:!1});e&&e.res&&this.logger.warn(`Seems the loaded translations were in flat JSON format instead of nested. Either set keySeparator: false on init or make sure your translations are published in nested format.`)}let e=[],t=this.languageUtils.getFallbackCodes(this.options.fallbackLng,a.lng||this.language);if(this.options.saveMissingTo===`fallback`&&t&&t[0])for(let n=0;n<t.length;n++)e.push(t[n]);else this.options.saveMissingTo===`all`?e=this.languageUtils.toResolveHierarchy(a.lng||this.language):e.push(a.lng||this.language);let n=(e,t,n)=>{let i=S&&n!==h?n:r;this.options.missingKeyHandler?this.options.missingKeyHandler(e,u,t,i,o,a):this.backendConnector?.saveMissing&&this.backendConnector.saveMissing(e,u,t,i,o,a),this.emit(`missingKey`,e,u,t,h)};this.options.saveMissing&&(this.options.saveMissingPlurals&&x?e.forEach(e=>{let t=this.pluralResolver.getSuffixes(e,a);T&&a[`defaultValue${this.options.pluralSeparator}zero`]&&!t.includes(`${this.options.pluralSeparator}zero`)&&t.push(`${this.options.pluralSeparator}zero`),t.forEach(t=>{n([e],c+t,a[`defaultValue${t}`]||E)})}):n(e,c,E))}h=this.extendTranslation(h,n,a,m,i),t&&h===c&&this.options.appendNamespaceToMissingKey&&(h=`${u}${d}${c}`),(t||e)&&this.options.parseMissingKeyHandler&&(h=this.options.parseMissingKeyHandler(this.options.appendNamespaceToMissingKey?`${u}${d}${c}`:c,e?h:void 0,a))}return o?(m.res=h,m.usedParams=this.getUsedParamsDetails(a),m):h}extendTranslation(e,n,r,i,a){if(this.i18nFormat?.parse)e=this.i18nFormat.parse(e,{...this.options.interpolation.defaultVariables,...r},r.lng||this.language||i.usedLng,i.usedNS,i.usedKey,{resolved:i});else if(!r.skipInterpolation){r.interpolation&&this.interpolator.init({...r,interpolation:{...this.options.interpolation,...r.interpolation}});let o=t(e)&&(r?.interpolation?.skipOnVariables===void 0?this.options.interpolation.skipOnVariables:r.interpolation.skipOnVariables),s;if(o){let t=e.match(this.interpolator.nestingRegexp);s=t&&t.length}let c=r.replace&&!t(r.replace)?r.replace:r;if(this.options.interpolation.defaultVariables&&(c={...this.options.interpolation.defaultVariables,...c}),e=this.interpolator.interpolate(e,c,r.lng||this.language||i.usedLng,r),o){let t=e.match(this.interpolator.nestingRegexp),n=t&&t.length;s<n&&(r.nest=!1)}!r.lng&&i&&i.res&&(r.lng=this.language||i.usedLng),r.nest!==!1&&(e=this.interpolator.nest(e,(...e)=>a?.[0]===e[0]&&!r.context?(this.logger.warn(`It seems you are nesting recursively key: ${e[0]} in key: ${n[0]}`),null):this.translate(...e,n),r)),r.interpolation&&this.interpolator.reset()}let o=r.postProcess||this.options.postProcess,s=t(o)?[o]:o;return e!=null&&s?.length&&r.applyPostProcessor!==!1&&(e=D.handle(s,e,n,this.options&&this.options.postProcessPassResolved?{i18nResolved:{...i,usedParams:this.getUsedParamsDetails(r)},...r}:r,this)),e}resolve(e,n={}){let r,i,a,o,s;return t(e)&&(e=[e]),Array.isArray(e)&&(e=e.map(e=>typeof e==`function`?A(e,{...this.options,...n}):e)),e.forEach(e=>{if(this.isValidLookup(r))return;let c=this.extractFromKey(e,n),l=c.key;i=l;let u=c.namespaces;this.options.fallbackNS&&(u=u.concat(this.options.fallbackNS));let d=n.count!==void 0&&!t(n.count),f=d&&!n.ordinal&&n.count===0,p=n.context!==void 0&&(t(n.context)||typeof n.context==`number`)&&n.context!==``,m=n.lngs?n.lngs:this.languageUtils.toResolveHierarchy(n.lng||this.language,n.fallbackLng);u.forEach(e=>{this.isValidLookup(r)||(s=e,!this.checkedLoadedFor[`${m[0]}-${e}`]&&this.utils?.hasLoadedNamespace&&!this.utils?.hasLoadedNamespace(s)&&(this.checkedLoadedFor[`${m[0]}-${e}`]=!0,this.logger.warn(`key "${i}" for languages "${m.join(`, `)}" won't get resolved as namespace "${s}" was not yet loaded`,`This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!`)),m.forEach(t=>{if(this.isValidLookup(r))return;o=t;let i=[l];if(this.i18nFormat?.addLookupKeys)this.i18nFormat.addLookupKeys(i,l,t,e,n);else{let e;d&&(e=this.pluralResolver.getSuffix(t,n.count,n));let r=`${this.options.pluralSeparator}zero`,a=`${this.options.pluralSeparator}ordinal${this.options.pluralSeparator}`;if(d&&(n.ordinal&&e.startsWith(a)&&i.push(l+e.replace(a,this.options.pluralSeparator)),i.push(l+e),f&&i.push(l+r)),p){let t=`${l}${this.options.contextSeparator||`_`}${n.context}`;i.push(t),d&&(n.ordinal&&e.startsWith(a)&&i.push(t+e.replace(a,this.options.pluralSeparator)),i.push(t+e),f&&i.push(t+r))}}let s;for(;s=i.pop();)this.isValidLookup(r)||(a=s,r=this.getResource(t,e,s,n))}))})}),{res:r,usedKey:i,exactUsedKey:a,usedLng:o,usedNS:s}}isValidLookup(e){return e!==void 0&&!(!this.options.returnNull&&e===null)&&!(!this.options.returnEmptyString&&e===``)}getResource(e,t,n,r={}){return this.i18nFormat?.getResource?this.i18nFormat.getResource(e,t,n,r):this.resourceStore.getResource(e,t,n,r)}getUsedParamsDetails(e={}){let n=[`defaultValue`,`ordinal`,`context`,`replace`,`lng`,`lngs`,`fallbackLng`,`ns`,`keySeparator`,`nsSeparator`,`returnObjects`,`returnDetails`,`joinArrays`,`postProcess`,`interpolation`],r=e.replace&&!t(e.replace),i=r?e.replace:e;if(r&&e.count!==void 0&&(i.count=e.count),this.options.interpolation.defaultVariables&&(i={...this.options.interpolation.defaultVariables,...i}),!r){i={...i};for(let e of n)delete i[e]}return i}static hasDefaultValue(e){for(let t in e)if(Object.prototype.hasOwnProperty.call(e,t)&&t.startsWith(`defaultValue`)&&e[t]!==void 0)return!0;return!1}},N=class{constructor(e){this.options=e,this.supportedLngs=this.options.supportedLngs||!1,this.logger=w.create(`languageUtils`)}getScriptPartFromCode(e){if(e=S(e),!e||!e.includes(`-`))return null;let t=e.split(`-`);return t.length===2||(t.pop(),t[t.length-1].toLowerCase()===`x`)?null:this.formatLanguageCode(t.join(`-`))}getLanguagePartFromCode(e){if(e=S(e),!e||!e.includes(`-`))return e;let t=e.split(`-`);return this.formatLanguageCode(t[0])}formatLanguageCode(e){if(t(e)&&e.includes(`-`)){let t;try{t=Intl.getCanonicalLocales(e)[0]}catch{}return t&&this.options.lowerCaseLng&&(t=t.toLowerCase()),t||(this.options.lowerCaseLng?e.toLowerCase():e)}return this.options.cleanCode||this.options.lowerCaseLng?e.toLowerCase():e}isSupportedCode(e){return(this.options.load===`languageOnly`||this.options.nonExplicitSupportedLngs)&&(e=this.getLanguagePartFromCode(e)),!this.supportedLngs||!this.supportedLngs.length||this.supportedLngs.includes(e)}getBestMatchFromCodes(e){if(!e)return null;let t;return e.forEach(e=>{if(t)return;let n=this.formatLanguageCode(e);(!this.options.supportedLngs||this.isSupportedCode(n))&&(t=n)}),!t&&this.options.supportedLngs&&e.forEach(e=>{if(t)return;let n=this.getScriptPartFromCode(e);if(this.isSupportedCode(n))return t=n;let r=this.getLanguagePartFromCode(e);if(this.isSupportedCode(r))return t=r;t=this.options.supportedLngs.find(e=>e===r?!0:!e.includes(`-`)&&!r.includes(`-`)?!1:!!(e.includes(`-`)&&!r.includes(`-`)&&e.slice(0,e.indexOf(`-`))===r||e.startsWith(r)&&r.length>1))}),t||=this.getFallbackCodes(this.options.fallbackLng)[0],t}getFallbackCodes(e,n){if(!e)return[];if(typeof e==`function`&&(e=e(n)),t(e)&&(e=[e]),Array.isArray(e))return e;if(!n)return e.default||[];let r=e[n];return r||=e[this.getScriptPartFromCode(n)],r||=e[this.formatLanguageCode(n)],r||=e[this.getLanguagePartFromCode(n)],r||=e.default,r||[]}toResolveHierarchy(e,n){let r=this.getFallbackCodes((n===!1?[]:n)||this.options.fallbackLng||[],e),i=[],a=e=>{e&&(this.isSupportedCode(e)?i.push(e):this.logger.warn(`rejecting language code not found in supportedLngs: ${e}`))};return t(e)&&(e.includes(`-`)||e.includes(`_`))?(this.options.load!==`languageOnly`&&a(this.formatLanguageCode(e)),this.options.load!==`languageOnly`&&this.options.load!==`currentOnly`&&a(this.getScriptPartFromCode(e)),this.options.load!==`currentOnly`&&a(this.getLanguagePartFromCode(e))):t(e)&&a(this.formatLanguageCode(e)),r.forEach(e=>{i.includes(e)||a(this.formatLanguageCode(e))}),i}},P={zero:0,one:1,two:2,few:3,many:4,other:5},F={select:e=>e===1?`one`:`other`,resolvedOptions:()=>({pluralCategories:[`one`,`other`]})},I=class{constructor(e,t={}){this.languageUtils=e,this.options=t,this.logger=w.create(`pluralResolver`),this.pluralRulesCache={}}clearCache(){this.pluralRulesCache={}}getRule(e,t={}){let n=S(e===`dev`?`en`:e),r=t.ordinal?`ordinal`:`cardinal`,i=JSON.stringify({cleanedCode:n,type:r});if(i in this.pluralRulesCache)return this.pluralRulesCache[i];let a;try{a=new Intl.PluralRules(n,{type:r})}catch{if(typeof Intl>`u`)return this.logger.error(`No Intl support, please use an Intl polyfill!`),F;if(!e.match(/-|_/))return F;let n=this.languageUtils.getLanguagePartFromCode(e);a=this.getRule(n,t)}return this.pluralRulesCache[i]=a,a}needsPlural(e,t={}){let n=this.getRule(e,t);return n||=this.getRule(`dev`,t),n?.resolvedOptions().pluralCategories.length>1}getPluralFormsOfKey(e,t,n={}){return this.getSuffixes(e,n).map(e=>`${t}${e}`)}getSuffixes(e,t={}){let n=this.getRule(e,t);return n||=this.getRule(`dev`,t),n?n.resolvedOptions().pluralCategories.sort((e,t)=>P[e]-P[t]).map(e=>`${this.options.prepend}${t.ordinal?`ordinal${this.options.prepend}`:``}${e}`):[]}getSuffix(e,t,n={}){let r=this.getRule(e,n);return r?`${this.options.prepend}${n.ordinal?`ordinal${this.options.prepend}`:``}${r.select(t)}`:(this.logger.warn(`no plural rule found for: ${e}`),this.getSuffix(`dev`,t,n))}},L=(e,n,r,i=`.`,a=!0)=>{let o=f(e,n,r);return!o&&a&&t(r)&&(o=x(e,r,i),o===void 0&&(o=x(n,r,i))),o},R=e=>e.replace(/\$/g,`$$$$`),z=class{constructor(e={}){this.logger=w.create(`interpolator`),this.options=e,this.format=e?.interpolation?.format||(e=>e),this.init(e)}init(e={}){e.interpolation||={escapeValue:!0};let{escape:t,escapeValue:n,useRawValueToEscape:r,prefix:i,prefixEscaped:a,suffix:o,suffixEscaped:s,formatSeparator:c,unescapeSuffix:l,unescapePrefix:u,nestingPrefix:d,nestingPrefixEscaped:f,nestingSuffix:p,nestingSuffixEscaped:h,nestingOptionsSeparator:_,maxReplaces:v,alwaysFormat:y}=e.interpolation;this.escape=t===void 0?g:t,this.escapeValue=n===void 0?!0:n,this.useRawValueToEscape=r===void 0?!1:r,this.prefix=i?m(i):a||`{{`,this.suffix=o?m(o):s||`}}`,this.formatSeparator=c||`,`,this.unescapePrefix=l?``:u?m(u):`-`,this.unescapeSuffix=this.unescapePrefix?``:l?m(l):``,this.nestingPrefix=d?m(d):f||m(`$t(`),this.nestingSuffix=p?m(p):h||m(`)`),this.nestingOptionsSeparator=_||`,`,this.maxReplaces=v||1e3,this.alwaysFormat=y===void 0?!1:y,this.resetRegExp()}reset(){this.options&&this.init(this.options)}resetRegExp(){let e=(e,t)=>e?.source===t?(e.lastIndex=0,e):new RegExp(t,`g`);this.regexp=e(this.regexp,`${this.prefix}(.+?)${this.suffix}`),this.regexpUnescape=e(this.regexpUnescape,`${this.prefix}${this.unescapePrefix}(.+?)${this.unescapeSuffix}${this.suffix}`),this.nestingRegexp=e(this.nestingRegexp,`${this.nestingPrefix}((?:[^()"']+|"[^"]*"|'[^']*'|\\((?:[^()]|"[^"]*"|'[^']*')*\\))*?)${this.nestingSuffix}`)}interpolate(e,n,i,a){let o,s,c,l=this.options&&this.options.interpolation&&this.options.interpolation.defaultVariables||{},u=e=>{if(!e.includes(this.formatSeparator)){let t=L(n,l,e,this.options.keySeparator,this.options.ignoreJSONStructure);return this.alwaysFormat?this.format(t,void 0,i,{...a,...n,interpolationkey:e}):t}let t=e.split(this.formatSeparator),r=t.shift().trim(),o=t.join(this.formatSeparator).trim();return this.format(L(n,l,r,this.options.keySeparator,this.options.ignoreJSONStructure),o,i,{...a,...n,interpolationkey:r})};this.resetRegExp(),!this.escapeValue&&typeof e==`string`&&/\$t\([^)]*\{[^}]*\{\{/.test(e)&&this.logger.warn(`nesting options string contains interpolated variables with escapeValue: false — if any of those values are attacker-controlled they can inject additional nesting options (e.g. redirect lng/ns). Sanitise untrusted input before passing it to t(), or keep escapeValue: true.`);let d=a?.missingInterpolationHandler||this.options.missingInterpolationHandler,f=a?.interpolation?.skipOnVariables===void 0?this.options.interpolation.skipOnVariables:a.interpolation.skipOnVariables;return[{regex:this.regexpUnescape,safeValue:e=>R(e)},{regex:this.regexp,safeValue:e=>this.escapeValue?R(this.escape(e)):R(e)}].forEach(n=>{for(c=0;o=n.regex.exec(e);){let i=o[1].trim();if(s=u(i),s===void 0)if(typeof d==`function`){let n=d(e,o,a);s=t(n)?n:``}else if(a&&Object.prototype.hasOwnProperty.call(a,i))s=``;else if(f){s=o[0];continue}else this.logger.warn(`missed to pass in variable ${i} for interpolating ${e}`),s=``;else !t(s)&&!this.useRawValueToEscape&&(s=r(s));let l=n.safeValue(s);if(e=e.replace(o[0],l),f?(n.regex.lastIndex+=s.length,n.regex.lastIndex-=o[0].length):n.regex.lastIndex=0,c++,c>=this.maxReplaces)break}}),e}nest(e,n,i={}){let a,o,s,c=(e,t)=>{let n=this.nestingOptionsSeparator;if(!e.includes(n))return e;let r=e.split(RegExp(`${m(n)}[ ]*{`)),i=`{${r[1]}`;e=r[0],i=this.interpolate(i,s);let a=i.match(/'/g),o=i.match(/"/g);((a?.length??0)%2==0&&!o||(o?.length??0)%2!=0)&&(i=i.replace(/'/g,`"`));try{s=JSON.parse(i),t&&(s={...t,...s})}catch(t){return this.logger.warn(`failed parsing options string in nesting for key ${e}`,t),`${e}${n}${i}`}return s.defaultValue&&s.defaultValue.includes(this.prefix)&&delete s.defaultValue,e};for(;a=this.nestingRegexp.exec(e);){let l=[];s={...i},s=s.replace&&!t(s.replace)?s.replace:s,s.applyPostProcessor=!1,delete s.defaultValue;let u=/{.*}/.test(a[1])?a[1].lastIndexOf(`}`)+1:a[1].indexOf(this.formatSeparator);if(u!==-1&&(l=a[1].slice(u).split(this.formatSeparator).map(e=>e.trim()).filter(Boolean),a[1]=a[1].slice(0,u)),o=n(c.call(this,a[1].trim(),s),s),o&&a[0]===e&&!t(o))return o;t(o)||(o=r(o)),o||=(this.logger.warn(`missed to resolve ${a[1]} for nesting ${e}`),``),l.length&&(o=l.reduce((e,t)=>this.format(e,t,i.lng,{...i,interpolationkey:a[1].trim()}),o.trim())),e=e.replace(a[0],o),this.regexp.lastIndex=0}return e}},B=e=>{let t=e.toLowerCase().trim(),n={};if(e.includes(`(`)){let r=e.split(`(`);t=r[0].toLowerCase().trim();let i=r[1].slice(0,-1);t===`currency`&&!i.includes(`:`)?n.currency||=i.trim():t===`relativetime`&&!i.includes(`:`)?n.range||=i.trim():i.split(`;`).forEach(e=>{if(e){let[t,...r]=e.split(`:`),i=r.join(`:`).trim().replace(/^'+|'+$/g,``),a=t.trim();n[a]||(n[a]=i),i===`false`&&(n[a]=!1),i===`true`&&(n[a]=!0),isNaN(i)||(n[a]=parseInt(i,10))}})}return{formatName:t,formatOptions:n}},V=e=>{let t={};return(n,r,i)=>{let a=i;i&&i.interpolationkey&&i.formatParams&&i.formatParams[i.interpolationkey]&&i[i.interpolationkey]&&(a={...a,[i.interpolationkey]:void 0});let o=r+JSON.stringify(a),s=t[o];return s||(s=e(S(r),i),t[o]=s),s(n)}},H=e=>(t,n,r)=>e(S(n),r)(t),U=class{constructor(e={}){this.logger=w.create(`formatter`),this.options=e,this.init(e)}init(e,t={interpolation:{}}){this.formatSeparator=t.interpolation.formatSeparator||`,`;let n=t.cacheInBuiltFormats?V:H;this.formats={number:n((e,t)=>{let n=new Intl.NumberFormat(e,{...t});return e=>n.format(e)}),currency:n((e,t)=>{let n=new Intl.NumberFormat(e,{...t,style:`currency`});return e=>n.format(e)}),datetime:n((e,t)=>{let n=new Intl.DateTimeFormat(e,{...t});return e=>n.format(e)}),relativetime:n((e,t)=>{let n=new Intl.RelativeTimeFormat(e,{...t});return e=>n.format(e,t.range||`day`)}),list:n((e,t)=>{let n=new Intl.ListFormat(e,{...t});return e=>n.format(e)})}}add(e,t){this.formats[e.toLowerCase().trim()]=t}addCached(e,t){this.formats[e.toLowerCase().trim()]=V(t)}format(e,t,n,r={}){if(!t||e==null)return e;let i=t.split(this.formatSeparator);if(i.length>1&&i[0].indexOf(`(`)>1&&!i[0].includes(`)`)&&i.find(e=>e.includes(`)`))){let e=i.findIndex(e=>e.includes(`)`));i[0]=[i[0],...i.splice(1,e)].join(this.formatSeparator)}return i.reduce((e,t)=>{let{formatName:i,formatOptions:a}=B(t);if(this.formats[i]){let t=e;try{let o=r?.formatParams?.[r.interpolationkey]||{},s=o.locale||o.lng||r.locale||r.lng||n;t=this.formats[i](e,s,{...a,...r,...o})}catch(e){this.logger.warn(e)}return t}else this.logger.warn(`there was no format function for ${i}`);return e},e)}},W=(e,t)=>{e.pending[t]!==void 0&&(delete e.pending[t],e.pendingCount--)},G=class extends T{constructor(e,t,n,r={}){super(),this.backend=e,this.store=t,this.services=n,this.languageUtils=n.languageUtils,this.options=r,this.logger=w.create(`backendConnector`),this.waitingReads=[],this.maxParallelReads=r.maxParallelReads||10,this.readingCalls=0,this.maxRetries=r.maxRetries>=0?r.maxRetries:5,this.retryTimeout=r.retryTimeout>=1?r.retryTimeout:350,this.state={},this.queue=[],this.backend?.init?.(n,r.backend,r)}queueLoad(e,t,n,r){let i={},a={},o={},s={};return e.forEach(e=>{let r=!0;t.forEach(t=>{let o=`${e}|${t}`;!n.reload&&this.store.hasResourceBundle(e,t)?this.state[o]=2:this.state[o]<0||(this.state[o]===1?a[o]===void 0&&(a[o]=!0):(this.state[o]=1,r=!1,a[o]===void 0&&(a[o]=!0),i[o]===void 0&&(i[o]=!0),s[t]===void 0&&(s[t]=!0)))}),r||(o[e]=!0)}),(Object.keys(i).length||Object.keys(a).length)&&this.queue.push({pending:a,pendingCount:Object.keys(a).length,loaded:{},errors:[],callback:r}),{toLoad:Object.keys(i),pending:Object.keys(a),toLoadLanguages:Object.keys(o),toLoadNamespaces:Object.keys(s)}}loaded(e,t,n){let r=e.split(`|`),i=r[0],a=r[1];t&&this.emit(`failedLoading`,i,a,t),!t&&n&&this.store.addResourceBundle(i,a,n,void 0,void 0,{skipCopy:!0}),this.state[e]=t?-1:2,t&&n&&(this.state[e]=0);let o={};this.queue.forEach(n=>{u(n.loaded,[i],a),W(n,e),t&&n.errors.push(t),n.pendingCount===0&&!n.done&&(Object.keys(n.loaded).forEach(e=>{o[e]||(o[e]={});let t=n.loaded[e];t.length&&t.forEach(t=>{o[e][t]===void 0&&(o[e][t]=!0)})}),n.done=!0,n.errors.length?n.callback(n.errors):n.callback())}),this.emit(`loaded`,o),this.queue=this.queue.filter(e=>!e.done)}read(e,t,n,r=0,i=this.retryTimeout,a){if(!e.length)return a(null,{});if(this.readingCalls>=this.maxParallelReads){this.waitingReads.push({lng:e,ns:t,fcName:n,tried:r,wait:i,callback:a});return}this.readingCalls++;let o=(o,s)=>{if(this.readingCalls--,this.waitingReads.length>0){let e=this.waitingReads.shift();this.read(e.lng,e.ns,e.fcName,e.tried,e.wait,e.callback)}if(o&&s&&r<this.maxRetries){setTimeout(()=>{this.read(e,t,n,r+1,i*2,a)},i);return}a(o,s)},s=this.backend[n].bind(this.backend);if(s.length===2){try{let n=s(e,t);n&&typeof n.then==`function`?n.then(e=>o(null,e)).catch(o):o(null,n)}catch(e){o(e)}return}return s(e,t,o)}prepareLoading(e,n,r={},i){if(!this.backend)return this.logger.warn(`No backend was added via i18next.use. Will not load resources.`),i&&i();t(e)&&(e=this.languageUtils.toResolveHierarchy(e)),t(n)&&(n=[n]);let a=this.queueLoad(e,n,r,i);if(!a.toLoad.length)return a.pending.length||i(),null;a.toLoad.forEach(e=>{this.loadOne(e)})}load(e,t,n){this.prepareLoading(e,t,{},n)}reload(e,t,n){this.prepareLoading(e,t,{reload:!0},n)}loadOne(e,t=``){let n=e.split(`|`),r=n[0],i=n[1];this.read(r,i,`read`,void 0,void 0,(n,a)=>{n&&this.logger.warn(`${t}loading namespace ${i} for language ${r} failed`,n),!n&&a&&this.logger.log(`${t}loaded namespace ${i} for language ${r}`,a),this.loaded(e,n,a)})}saveMissing(e,t,n,r,i,a={},o=()=>{}){if(this.services?.utils?.hasLoadedNamespace&&!this.services?.utils?.hasLoadedNamespace(t)){this.logger.warn(`did not save key "${n}" as the namespace "${t}" was not yet loaded`,`This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!`);return}if(!(n==null||n===``)){if(this.backend?.create){let s={...a,isUpdate:i},c=this.backend.create.bind(this.backend);if(c.length<6)try{let i;i=c.length===5?c(e,t,n,r,s):c(e,t,n,r),i&&typeof i.then==`function`?i.then(e=>o(null,e)).catch(o):o(null,i)}catch(e){o(e)}else c(e,t,n,r,o,s)}!e||!e[0]||this.store.addResource(e[0],t,n,r)}}},K=()=>({debug:!1,initAsync:!0,ns:[`translation`],defaultNS:[`translation`],fallbackLng:[`dev`],fallbackNS:!1,supportedLngs:!1,nonExplicitSupportedLngs:!1,load:`all`,preload:!1,keySeparator:`.`,nsSeparator:`:`,pluralSeparator:`_`,contextSeparator:`_`,enableSelector:!1,partialBundledLanguages:!1,saveMissing:!1,updateMissing:!1,saveMissingTo:`fallback`,saveMissingPlurals:!0,missingKeyHandler:!1,missingInterpolationHandler:!1,postProcess:!1,postProcessPassResolved:!1,returnNull:!1,returnEmptyString:!0,returnObjects:!1,joinArrays:!1,returnedObjectHandler:!1,parseMissingKeyHandler:!1,appendNamespaceToMissingKey:!1,appendNamespaceToCIMode:!1,overloadTranslationOptionHandler:e=>{let n={};if(typeof e[1]==`object`&&(n=e[1]),t(e[1])&&(n.defaultValue=e[1]),t(e[2])&&(n.tDescription=e[2]),typeof e[2]==`object`||typeof e[3]==`object`){let t=e[3]||e[2];Object.keys(t).forEach(e=>{n[e]=t[e]})}return n},interpolation:{escapeValue:!0,prefix:`{{`,suffix:`}}`,formatSeparator:`,`,unescapePrefix:`-`,nestingPrefix:`$t(`,nestingSuffix:`)`,nestingOptionsSeparator:`,`,maxReplaces:1e3,skipOnVariables:!0},cacheInBuiltFormats:!0}),q=e=>(t(e.ns)&&(e.ns=[e.ns]),t(e.fallbackLng)&&(e.fallbackLng=[e.fallbackLng]),t(e.fallbackNS)&&(e.fallbackNS=[e.fallbackNS]),e.supportedLngs&&!e.supportedLngs.includes(`cimode`)&&(e.supportedLngs=e.supportedLngs.concat([`cimode`])),e),J=()=>{},Y=e=>{Object.getOwnPropertyNames(Object.getPrototypeOf(e)).forEach(t=>{typeof e[t]==`function`&&(e[t]=e[t].bind(e))})},X=class e extends T{constructor(e={},t){if(super(),this.options=q(e),this.services={},this.logger=w,this.modules={external:[]},Y(this),t&&!this.isInitialized&&!e.isClone){if(!this.options.initAsync)return this.init(e,t),this;setTimeout(()=>{this.init(e,t)},0)}}init(e={},r){this.isInitializing=!0,typeof e==`function`&&(r=e,e={}),e.defaultNS==null&&e.ns&&(t(e.ns)?e.defaultNS=e.ns:e.ns.includes(`translation`)||(e.defaultNS=e.ns[0]));let i=K();this.options={...i,...this.options,...q(e)},this.options.interpolation={...i.interpolation,...this.options.interpolation},e.keySeparator!==void 0&&(this.options.userDefinedKeySeparator=e.keySeparator),e.nsSeparator!==void 0&&(this.options.userDefinedNsSeparator=e.nsSeparator),typeof this.options.overloadTranslationOptionHandler!=`function`&&(this.options.overloadTranslationOptionHandler=i.overloadTranslationOptionHandler);let a=e=>e?typeof e==`function`?new e:e:null;if(!this.options.isClone){this.modules.logger?w.init(a(this.modules.logger),this.options):w.init(null,this.options);let e;e=this.modules.formatter?this.modules.formatter:U;let t=new N(this.options);this.store=new E(this.options.resources,this.options);let n=this.services;n.logger=w,n.resourceStore=this.store,n.languageUtils=t,n.pluralResolver=new I(t,{prepend:this.options.pluralSeparator}),e&&(n.formatter=a(e),n.formatter.init&&n.formatter.init(n,this.options),this.options.interpolation.format=n.formatter.format.bind(n.formatter)),n.interpolator=new z(this.options),n.utils={hasLoadedNamespace:this.hasLoadedNamespace.bind(this)},n.backendConnector=new G(a(this.modules.backend),n.resourceStore,n,this.options),n.backendConnector.on(`*`,(e,...t)=>{this.emit(e,...t)}),this.modules.languageDetector&&(n.languageDetector=a(this.modules.languageDetector),n.languageDetector.init&&n.languageDetector.init(n,this.options.detection,this.options)),this.modules.i18nFormat&&(n.i18nFormat=a(this.modules.i18nFormat),n.i18nFormat.init&&n.i18nFormat.init(this)),this.translator=new M(this.services,this.options),this.translator.on(`*`,(e,...t)=>{this.emit(e,...t)}),this.modules.external.forEach(e=>{e.init&&e.init(this)})}if(this.format=this.options.interpolation.format,r||=J,this.options.fallbackLng&&!this.services.languageDetector&&!this.options.lng){let e=this.services.languageUtils.getFallbackCodes(this.options.fallbackLng);e.length>0&&e[0]!==`dev`&&(this.options.lng=e[0])}!this.services.languageDetector&&!this.options.lng&&this.logger.warn(`init: no languageDetector is used and no lng is defined`),[`getResource`,`hasResourceBundle`,`getResourceBundle`,`getDataByLanguage`].forEach(e=>{this[e]=(...t)=>this.store[e](...t)}),[`addResource`,`addResources`,`addResourceBundle`,`removeResourceBundle`].forEach(e=>{this[e]=(...t)=>(this.store[e](...t),this)});let o=n(),s=()=>{let e=(e,t)=>{this.isInitializing=!1,this.isInitialized&&!this.initializedStoreOnce&&this.logger.warn(`init: i18next is already initialized. You should call init just once!`),this.isInitialized=!0,this.options.isClone||this.logger.log(`initialized`,this.options),this.emit(`initialized`,this.options),o.resolve(t),r(e,t)};if((this.languages||this.isLanguageChangingTo)&&!this.isInitialized)return e(null,this.t.bind(this));this.changeLanguage(this.options.lng,e)};return this.options.resources||!this.options.initAsync?s():setTimeout(s,0),o}loadResources(e,n=J){let r=n,i=t(e)?e:this.language;if(typeof e==`function`&&(r=e),!this.options.resources||this.options.partialBundledLanguages){if(i?.toLowerCase()===`cimode`&&(!this.options.preload||this.options.preload.length===0))return r();let e=[],t=t=>{t&&t!==`cimode`&&this.services.languageUtils.toResolveHierarchy(t).forEach(t=>{t!==`cimode`&&(e.includes(t)||e.push(t))})};i?t(i):this.services.languageUtils.getFallbackCodes(this.options.fallbackLng).forEach(e=>t(e)),this.options.preload?.forEach?.(e=>t(e)),this.services.backendConnector.load(e,this.options.ns,e=>{!e&&!this.resolvedLanguage&&this.language&&this.setResolvedLanguage(this.language),r(e)})}else r(null)}reloadResources(e,t,r){let i=n();return typeof e==`function`&&(r=e,e=void 0),typeof t==`function`&&(r=t,t=void 0),e||=this.languages,t||=this.options.ns,r||=J,this.services.backendConnector.reload(e,t,e=>{i.resolve(),r(e)}),i}use(e){if(!e)throw Error(`You are passing an undefined module! Please check the object you are passing to i18next.use()`);if(!e.type)throw Error(`You are passing a wrong module! Please check the object you are passing to i18next.use()`);return e.type===`backend`&&(this.modules.backend=e),(e.type===`logger`||e.log&&e.warn&&e.error)&&(this.modules.logger=e),e.type===`languageDetector`&&(this.modules.languageDetector=e),e.type===`i18nFormat`&&(this.modules.i18nFormat=e),e.type===`postProcessor`&&D.addPostProcessor(e),e.type===`formatter`&&(this.modules.formatter=e),e.type===`3rdParty`&&this.modules.external.push(e),this}setResolvedLanguage(e){if(!(!e||!this.languages)&&![`cimode`,`dev`].includes(e)){for(let e=0;e<this.languages.length;e++){let t=this.languages[e];if(![`cimode`,`dev`].includes(t)&&this.store.hasLanguageSomeTranslations(t)){this.resolvedLanguage=t;break}}!this.resolvedLanguage&&!this.languages.includes(e)&&this.store.hasLanguageSomeTranslations(e)&&(this.resolvedLanguage=e,this.languages.unshift(e))}}changeLanguage(e,r){this.isLanguageChangingTo=e;let i=n();this.emit(`languageChanging`,e);let a=e=>{this.language=e,this.languages=this.services.languageUtils.toResolveHierarchy(e),this.resolvedLanguage=void 0,this.setResolvedLanguage(e)},o=(t,n)=>{n?this.isLanguageChangingTo===e&&(a(n),this.translator.changeLanguage(n),this.isLanguageChangingTo=void 0,this.emit(`languageChanged`,n),this.logger.log(`languageChanged`,n)):this.isLanguageChangingTo=void 0,i.resolve((...e)=>this.t(...e)),r&&r(t,(...e)=>this.t(...e))},s=n=>{!e&&!n&&this.services.languageDetector&&(n=[]);let r=t(n)?n:n&&n[0],i=this.store.hasLanguageSomeTranslations(r)?r:this.services.languageUtils.getBestMatchFromCodes(t(n)?[n]:n);i&&(this.language||a(i),this.translator.language||this.translator.changeLanguage(i),this.services.languageDetector?.cacheUserLanguage?.(i)),this.loadResources(i,e=>{o(e,i)})};return!e&&this.services.languageDetector&&!this.services.languageDetector.async?s(this.services.languageDetector.detect()):!e&&this.services.languageDetector&&this.services.languageDetector.async?this.services.languageDetector.detect.length===0?this.services.languageDetector.detect().then(s):this.services.languageDetector.detect(s):s(e),i}getFixedT(e,n,r,i){let a=i?.scopeNs,o=(e,t,...n)=>{let i;i=typeof t==`object`?{...t}:this.options.overloadTranslationOptionHandler([e,t].concat(n)),i.lng=i.lng||o.lng,i.lngs=i.lngs||o.lngs;let s=i.ns!==void 0&&i.ns!==null;i.ns=i.ns||o.ns,i.keyPrefix!==``&&(i.keyPrefix=i.keyPrefix||r||o.keyPrefix);let c={...this.options,...i};Array.isArray(a)&&!s&&(c.ns=a),typeof i.keyPrefix==`function`&&(i.keyPrefix=A(i.keyPrefix,c));let l=this.options.keySeparator||`.`,u;return i.keyPrefix&&Array.isArray(e)?u=e.map(e=>(typeof e==`function`&&(e=A(e,c)),`${i.keyPrefix}${l}${e}`)):(typeof e==`function`&&(e=A(e,c)),u=i.keyPrefix?`${i.keyPrefix}${l}${e}`:e),this.t(u,i)};return t(e)?o.lng=e:o.lngs=e,o.ns=n,o.keyPrefix=r,o}t(...e){return this.translator?.translate(...e)}exists(...e){return this.translator?.exists(...e)}setDefaultNamespace(e){this.options.defaultNS=e}hasLoadedNamespace(e,t={}){if(!this.isInitialized)return this.logger.warn(`hasLoadedNamespace: i18next was not initialized`,this.languages),!1;if(!this.languages||!this.languages.length)return this.logger.warn(`hasLoadedNamespace: i18n.languages were undefined or empty`,this.languages),!1;let n=t.lng||this.resolvedLanguage||this.languages[0],r=this.options?this.options.fallbackLng:!1,i=this.languages[this.languages.length-1];if(n.toLowerCase()===`cimode`)return!0;let a=(e,t)=>{let n=this.services.backendConnector.state[`${e}|${t}`];return n===-1||n===0||n===2};if(t.precheck){let e=t.precheck(this,a);if(e!==void 0)return e}return!!(this.hasResourceBundle(n,e)||!this.services.backendConnector.backend||this.options.resources&&!this.options.partialBundledLanguages||a(n,e)&&(!r||a(i,e)))}loadNamespaces(e,r){let i=n();return this.options.ns?(t(e)&&(e=[e]),e.forEach(e=>{this.options.ns.includes(e)||this.options.ns.push(e)}),this.loadResources(e=>{i.resolve(),r&&r(e)}),i):(r&&r(),Promise.resolve())}loadLanguages(e,r){let i=n();t(e)&&(e=[e]);let a=this.options.preload||[],o=e.filter(e=>!a.includes(e)&&this.services.languageUtils.isSupportedCode(e));return o.length?(this.options.preload=a.concat(o),this.loadResources(e=>{i.resolve(),r&&r(e)}),i):(r&&r(),Promise.resolve())}dir(e){if(e||=this.resolvedLanguage||(this.languages?.length>0?this.languages[0]:this.language),!e)return`rtl`;try{let t=new Intl.Locale(e);if(t&&t.getTextInfo){let e=t.getTextInfo();if(e&&e.direction)return e.direction}}catch{}let t=`ar.shu.sqr.ssh.xaa.yhd.yud.aao.abh.abv.acm.acq.acw.acx.acy.adf.ads.aeb.aec.afb.ajp.apc.apd.arb.arq.ars.ary.arz.auz.avl.ayh.ayl.ayn.ayp.bbz.pga.he.iw.ps.pbt.pbu.pst.prp.prd.ug.ur.ydd.yds.yih.ji.yi.hbo.men.xmn.fa.jpr.peo.pes.prs.dv.sam.ckb`.split(`.`),n=this.services?.languageUtils||new N(K());return e.toLowerCase().indexOf(`-latn`)>1?`ltr`:t.includes(n.getLanguagePartFromCode(e))||e.toLowerCase().indexOf(`-arab`)>1?`rtl`:`ltr`}static createInstance(t={},n){let r=new e(t,n);return r.createInstance=e.createInstance,r}cloneInstance(t={},n=J){let r=t.forkResourceStore;r&&delete t.forkResourceStore;let i={...this.options,...t,isClone:!0},a=new e(i);if((t.debug!==void 0||t.prefix!==void 0)&&(a.logger=a.logger.clone(t)),[`store`,`services`,`language`].forEach(e=>{a[e]=this[e]}),a.services={...this.services},a.services.utils={hasLoadedNamespace:a.hasLoadedNamespace.bind(a)},r&&(a.store=new E(Object.keys(this.store.data).reduce((e,t)=>(e[t]={...this.store.data[t]},e[t]=Object.keys(e[t]).reduce((n,r)=>(n[r]={...e[t][r]},n),e[t]),e),{}),i),a.services.resourceStore=a.store),t.interpolation){let e={...K().interpolation,...this.options.interpolation,...t.interpolation},n={...i,interpolation:e};a.services.interpolator=new z(n)}return a.translator=new M(a.services,i),a.translator.on(`*`,(e,...t)=>{a.emit(e,...t)}),a.init(i,n),a.translator.options=i,a.translator.backendConnector.services.utils={hasLoadedNamespace:a.hasLoadedNamespace.bind(a)},a}toJSON(){return{options:this.options,store:this.store,language:this.language,languages:this.languages,resolvedLanguage:this.resolvedLanguage}}}.createInstance();X.createInstance,X.dir,X.init,X.loadResources,X.reloadResources,X.use,X.changeLanguage,X.getFixedT,X.t,X.exists,X.setDefaultNamespace,X.hasLoadedNamespace,X.loadNamespaces,X.loadLanguages;var Z={nav:{integrations:`Integrations`,metrics:`Metrics`,detectionSection:`Detection`,detectionIntelligence:`People`,vehicles:`Vehicles`,events:`Library`,library:`Library`,clusterSection:`Cluster`,nodes:`Nodes`,pipeline:`Pipeline`},system:JSON.parse(`{"title":"Administration","addons":"Addons","agents":"Agents","processes":"Processes","logs":"Logs","users":"Users","settings":"Settings","repl":"REPL","models":"Models","integrations":"Connectivity","serverManagement":"Server","systemNav":"System","secrets":"Secrets","reconnectOverlay":{"frameworkUpdated":"Framework updated","isNow":"{{packageName}} is now {{fromTo}}.","serverRestarted":"Server restarted","manualRestartByCompleted":"Manual restart by {{requestedBy}} completed.","manualRestartCompleted":"Manual restart completed."},"access":{"loginSessions":"Login sessions","linkedApps":"Linked apps","tokens":"Tokens","shareLinks":"Share links","legacyApiKeys":"Legacy API keys","signInLinks":"Sign-in links","audit":"Audit","credentialKinds":"Credential kinds","newToken":"New token"},"addressesCard":{"address":"Address","noneNoTunnelOrTailscale":"none (no tunnel or Tailscale)","alsoAddedAsACustom":"also added as a custom address","unlikelyUsable":"Unlikely usable","kind":"Kind","inUseAutomatically":"{{title}}: in use automatically. {{help}}","thisAddressCannotBeUsed":"This address cannot be used for this.","remove":"Remove {{baseUrl}}","removeThisCustomAddressIts":"Remove this custom address (its roles turn automatic)","addresses":"Addresses","everyAddressThisHubIs":"Every address this hub is reached at, detected or added by you. Tick what each one is used for.","whatAreRoles":"What are roles?","automatic":"(automatic)","setByYou":"(set by you)","useAutomatic":"Use automatic","useHttpAnyway":"Use http anyway","noAddressesAvailable":"No addresses available.","customAddress":"Custom address","labelOptional":"Label (optional)","customAddressLabel":"Custom address label","addCustomAddress":"Add custom address"},"aiModelPicker":{"unslothQwen3635bA3b":"unsloth/Qwen3.6-35B-A3B-GGUF:UD-Q4_K_M"},"aiProfilesTab":{"toggle":"toggle {{name}}"},"aiTestChat":{"tokMs":"{{model}} · {{value2}} tok · {{value3}} ms","sentToTheModel":"sent to the model"},"authentication":{"authenticationProviders":"Authentication providers","about":"About","setupSteps":"Setup steps","myAccess":"My access","users":"Users","pageViaActionsRemove2fa":"page via Actions → “Remove 2FA”."},"backup":{"restartServerNow":"Restart server now?","activeConnectionsWillDropAnd":"Active connections will drop and the apply-backup hook will run before boot.","restart":"Restart","backUpNow":"Back up now","restore":"Restore…","newEntry":"New entry","restoreScheduledRestartTheServer":"Restore scheduled. Restart the server to apply.","restartNow":"Restart Now"},"capabilities":{"isNowActive":"{{capName}} → {{addonId}} is now active.","nowInheritsTheGlobalDefault":"{{capName}} @ {{nodeId}} now inherits the global default.","providerSEnabled":"{{capName}}: {{length}} provider(s) enabled.","capabilities":"Capabilities","chooseWhichProviderIsActive":"Choose which provider is active for each system capability. Singleton caps pick exactly one provider; collection caps enable a set.","failedToLoadCapabilities":"Failed to load capabilities","unknownError":"Unknown error","noCapabilitiesRegistered":"No capabilities registered.","singletonPickOneProvider":"Singleton — pick one provider","collectionEnableASet":"Collection — enable a set"},"capabilityCatalog":{"installed":"Installed","install":"Install","couldNotSearchTheNpm":"Could not search the npm catalog right now. Try again in a moment.","searchingTheNpmCatalog":"Searching the npm catalog…","noPublishedAddonDeclaresThe":"No published addon declares the \\"{{capability}}\\" capability.","everyPublishedAddonThatDeclares":"Every published addon that declares \\"{{capability}}\\" is already installed.","availableToInstall":"Available to install"},"localAccess":{"lanHttp":"LAN HTTP","nativeAppsOnThisWi":"Native apps on this Wi-Fi use http:// and skip the private certificate. The tunnel and this admin UI stay on HTTPS.","certificate":"Certificate","couldNotReadTlsStatus":"Could not read TLS status.","certificateReissue":"Certificate reissue","restartRequired":"Restart required","theHttpsListenerStillServes":"The HTTPS listener still serves the previous certificate. Restart the hub to apply it.","mode":"Mode","validTo":"Valid to","leafSha256":"Leaf SHA-256","caSha256":"CA SHA-256","issuerNotIncludedInThe":"Issuer not included in the upload (not the local CA)","regenerate":"Regenerate","issueANewLeaf":"Issue a new leaf?","issuesANewLeafUnder":"Issues a new leaf under the current local CA. Clients that trust the CA keep working. The HTTPS listener reloads.","upload":"Upload","downloadCa":"Download CA","revertToGenerated":"Revert to generated","dropTheUploadedCertificate":"Drop the uploaded certificate?","deletesTheUploadedPairAnd":"Deletes the uploaded pair and returns to the generated local CA.","revert":"Revert","certificateOrFullChainPem":"Certificate or full chain (PEM)","privateKeyPem":"Private key (PEM)","caPemOptional":"CA (PEM, optional)","saveCertificate":"Save certificate","uploadFailed":"Upload failed"},"logging":{"logDestinations":"Log destinations","destinations":"Destinations","everyRegisteredLogDestinationEntries":"Every registered log destination. Entries are fanned to all enabled destinations at once — enabling one does not disable another.","noLogDestinationsRegistered":"No log destinations registered","thisShouldNotHappenThe":"This should not happen — the console and rotated-file destinations are builtins. If the list is empty, the node is still booting."},"meshNetworks":{"meshNetworks":"Mesh networks","addMesh":"Add mesh","status":"Status","meshNetworks2":"Mesh Networks","privateVpnMeshesThatConnect":"Private VPN meshes that connect CamStack to your other devices (Tailscale, Headscale, …). Each provider can also expose this hub publicly via its ingress (Tailscale Funnel).","noMeshNetworkProvidersInstalled":"No mesh-network providers installed","installAMeshAddonE":"Install a mesh addon (e.g. @camstack/addon-tailscale) to join this hub into a private VPN mesh.","joined":"Joined","notJoined":"Not joined","disconnect":"Disconnect","logOut":"Log out","connect":"Connect","endpoints":"Endpoints","tenant":"Tenant","user":"User","controlPlane":"Control plane","meshIp":"Mesh IP","magicdns":"MagicDNS","dnsSuffix":"DNS suffix","peers":"Peers","keyExpiry":"Key expiry","hostname":"Hostname","unknown":"(unknown)","copyMagicdns":"Copy MagicDNS","copyIp":"Copy IP","connection":"Connection","routes":"Routes","txRx":"TX / RX","lastSeen":"Last seen","noPeersVisibleYourTailnet":"No peers visible — your tailnet may be empty or the host is not joined."},"networkAddresses":{"pinWhichHostInterfacesExist":"Pin which host interfaces exist, then tick what each address is used for. Add a custom address when this hub is reached at one it cannot detect.","allowedAddresses":"Allowed addresses","reRunTheAutoDetection":"Re-run the auto-detection heuristic + overwrite the current allowlist with the best matches.","detecting":"Detecting…","bestMatch":"Best match","clear":"Clear","discard":"Discard","saving":"Saving…","autoEveryNonLoopbackNon":"Auto — every non-loopback / non-link-local interface participates.","pinned":"{{value1}} pinned","loadingInterfaces":"Loading interfaces…","noInterfacesDetected":"No interfaces detected."},"networkDiagnostics":{"loadingCameras":"Loading cameras…","noCameras":"No cameras","pickACamera":"Pick a camera","camera":"Camera"},"notificationAlarm":{"couldNotChangeFor":"Could not change {{name}} for {{value2}}: {{error}}","alarm":"Alarm","panelDelaysAndModeCoverage":"Panel delays and mode coverage.","alarmSettingsAreNotAvailable":"Alarm settings are not available","thisHubHasNotBeen":"This hub has not been updated to serve the alarm configuration yet.","thisInstallationHasNoAlarm":"This installation has no alarm panel. The panel is created by the Notification Center on the hub — if this is the hub, its creation failed and the server log says why.","thePanelWhatEachMode":"The panel, what each mode arms, and who hears about it.","couldNotSave":"Could not save","couldNotUpdateProfile":"Could not update profile","notApplied":"Not applied","theHubDidNotApply":"The hub did not apply this change — another editor may have changed it, or the hub needs an update"},"notificationCalendarEventsEditor":{"newCalendarEvents":"New calendar events","basics":"Basics","name":"Name","horizonDays":"Horizon (days)","priority":"Priority","enabled":"Enabled","deliverWhenEmpty":"Deliver when empty","schedule":"Schedule","oneSendTimePerRow":"One send time per row. The digest fires at that minute.","calendars":"Calendars","targets":"Targets","template":"Template","optionalLeaveBlankForThe":"Optional. Leave blank for the default digest body (tomorrow highlighted, then later days). Variables:","title":"Title","body":"Body"},"notificationCalendarEventsPage":{"calendarEventsRulesAreNot":"Calendar-events rules are not available on this hub","theHubAnsweredSomethingThis":"The hub answered something this admin build does not understand. Update both and reload.","thisHubHasNotBeen":"This hub has not been updated to serve calendar-events rules yet. Deploy addon-post-analysis and reload — the rules themselves are untouched.","couldNotDeleteTheRule":"Could not delete the rule","noCalendarEventsRulesYet":"No calendar-events rules yet — create one, and upcoming calendar events arrive on schedule.","calendarEvents":"Calendar events","newCalendarEvents":"New calendar events","rule":"Rule","when":"When","horizon":"Horizon","calendars":"Calendars","targets":"Targets","lastRun":"Last run","on":"On","toggle":"toggle {{name}}","deleteThisCalendarEventsRule":"Delete this calendar-events rule?","thisWillPermanentlyDeleteThis":"This will permanently delete \\"{{name}}\\". This action cannot be undone.","delete":"delete {{name}}"},"notificationHistory":{"body":"Body","when":"When","status":"Status","rule":"Rule","device":"Device","kind":"Kind","deliveryHistory":"Delivery history","aSearchableLogOfEvery":"A searchable log of every notification the rules delivered (or failed to deliver).","camera":"Camera","allCameras":"All cameras","window":"Window","limit":"Limit","deliveryHistoryRequiresAServer":"Delivery history requires a server update","theHistoryQueryIsNot":"The history query is not available on this hub yet. It becomes queryable after the next server update ships the notification-center history endpoint. Rules still deliver and record their outcome in the meantime.","noDeliveriesMatchTheseFilters":"No deliveries match these filters.","notification":"Notification","detail":"Detail"},"notificationProducerRules":{"couldNotDeleteTheRule":"Could not delete the rule","theTestRunFailed":"The test run failed","whichCamera":"Which camera","nothingWasProduced":"Nothing was produced:","dismiss":"Dismiss"},"notificationRuleActions":{"buttonsOnTheNotification":"Buttons on the notification","eachButtonRunsOneShared":"Each button runs one shared sequence when tapped.","createASequenceOnThe":"Create a sequence on the Sequences tab first — a button runs one, it does not define its own steps.","noButtonsTheNotificationArrives":"No buttons. The notification arrives with nothing to tap.","nothingOnThisEdge":"Nothing on this edge.","sequence":"Sequence","id":"Id","label":"Label","icon":"Icon"},"notificationRuleColumns":{"rule":"Rule","trigger":"Trigger","targets":"Targets","lastRun":"Last run","priority":"Priority","on":"On","toggle":"toggle {{name}}","openInTheSimulatorDescribe":"Open in the simulator — describe an event and tune it before injecting","simulate":"simulate {{name}}","duplicate":"Duplicate","recreateAsOneRulePer":"Recreate as one rule per family","events":"Events","scope":"Scope","cooldown":"Cooldown"},"notificationRuleConditions":{"addValue":"Add value…","anyPhase":"— any phase —","authoredElsewhereAndPreservedThis":"Authored elsewhere and preserved — this admin editor cannot change it yet.","notEditableHereYetThis":"Not editable here yet — this condition has no admin editor."},"notificationRuleLastRun":{"lastRunLoading":"Last run loading","lastRunCouldNotBe":"Last run could not be read: {{reason}}","historyThisRuleSDeliveries":"History — this rule's deliveries","historyOf":"history of {{name}}"},"notificationRuleSnoozeControl":{"thisRuleConcernsOrTriggers":"This rule concerns — or triggers — the alarm panel, so no snooze window can silence it.","silenceThisRuleForIt":"Silence this rule for {{value1}} — it appears under \\"Silenced right now\\"","snooze":"snooze {{ruleName}}","silenceThisRuleNow":"Silence this rule now","opensARealSnoozeWindow":"Opens a real snooze window right now — distinct from the buttons above, which only choose the durations this rule's NOTIFICATION offers. It appears under \\"Silenced right now\\" and can be ended from there."},"notificationRuleStatus":{"nextWindowOpens":"Next window opens {{value1}}","noFurtherWindowOpensIn":"No further window opens in the next nine days"},"notificationRuleTestButton":{"testNowFiresThisRule":"Test now — fires this rule and really sends the notification","testNow":"test {{ruleName}} now","testNow2":"Test now"},"notificationRules":{"newRule":"New rule","rules":"Rules","failedToLoadRules":"Failed to load rules","unknownError":"Unknown error","noRulesYet":"No rules yet.","chooseARuleType":"Choose a rule type","edit":"Edit {{name}}","newNotificationRule":"New notification rule","saveChanges":"Save changes","createRule":"Create rule","name":"Name","eGFrontDoorPackage":"e.g. Front door package","enabled":"Enabled","trigger":"Trigger","deliveryTargets":"Delivery targets","noDeliveryTargetsConfiguredAdd":"No delivery targets configured. Add one under the Targets tab first.","notifyUsers":"Notify users","deliversToTheTargetsEach":"Delivers to the targets each user owns, only for cameras that user can access.","noUsersToNotify":"No users to notify.","searchUsers":"Search users…","cooldownSeconds":"Cooldown (seconds)","aCameraThatFlapsOr":"A camera that flaps, or a node that reconnects every minute, would otherwise send one notification per flap. The cooldown is the shortest gap between two deliveries of this rule.","theShortestGapBetweenTwo":"The shortest gap between two deliveries of this rule, counted as chosen below.","cooldownCounted":"Cooldown counted","perDeviceADeliveryAbout":"Per device: a delivery about one camera (or node) does not hold back another. Whole rule: one delivery per cooldown, whichever device matched.","acrossObjectClasses":"Across object classes","separateDefaultADogAfter":"Separate (default): a dog after a cat is delivered at once, a second cat still waits. Shared: a cat holds back the next dog for the cooldown. Sounds always count per class.","allowGlobalSnooze":"allow global snooze","anyoneMaySnoozeThisRule":"Anyone may snooze this rule for everyone","aSnoozeIsPersonalBy":"A snooze is personal by default — it silences only the person who set it. Turn this on for a rule where silencing the whole household is legitimate (the gardener is here all afternoon). Admins can always do it.","snoozeButtons":"Snooze buttons","notSetTheNotificationOffers":"Not set — the notification offers the defaults ({{value1}}). A pause opened from a button silences this camera for this class of subject, only for whoever received the notification, and sends no summary.","noSnoozeButtonsOnThis":"No snooze buttons on this rule. That is an explicit choice: the notification cannot be silenced from the lock screen.","fourAtMostEverySnooze":"Four at most. Every snooze button takes space from the rule’s action buttons — ntfy accepts three in total.","backToTheDefaults":"Back to the defaults","silenceItNow":"Silence it now","priority":"Priority","aSystemEventCarriesNo":"A system event carries no image: there is no camera frame behind \\"a node went offline\\". This rule sends text only.","mediaAttachment":"Media attachment","cropTheImageToThe":"Crop the image to the rule's zone","attachAGifAroundThe":"Attach a GIF around the event","attachAnMp4ClipAround":"Attach an MP4 clip around the event","videoQuality":"Video quality","aNotificationIsWatchedOn":"A notification is watched on a phone — the cheapest stream is normally the right one, and the high profile only costs CPU to render.","playbackSpeed":"Playback speed","aNotificationClipIsGlanced":"A notification clip is glanced at, not watched: at 2× the recipient sees the whole passage in half the time and the file is half the size. Real time is there when the detail matters more than the glance.","linkedCameras":"Linked cameras","whenTheSensorIsLinked":"When the sensor is linked to several cameras, all of them are photographed the moment it fires. Cameras that are offline or asleep are left out.","imageFrame":"Image frame","whatTheAttachedStillShows":"What the attached still shows. \\"Automatic\\" leaves it to the attachment mode above.","notificationTitle":"Notification title","notificationBody":"Notification body","leaveBothBlankForThe":"Leave both blank for the hub's own wording (editable on the Texts tab).","whichSystemEvents":"Which system events","conditions":"Conditions","thisIsASoundRule":"This is a SOUND rule: it fires on a confirmed sampling window of audio, never on a picture. Name the sounds and/or keep a level threshold — with neither it can never match. Everything else below still composes (a camera scope, a schedule).","thisIsAnOccupancyRule":"This is an OCCUPANCY rule: it fires when the count in a camera frame or a zone crosses your threshold and holds. Pick the camera on the Devices tab first — the zone list is that camera's.","pickTheEventsThisRule":"Pick the events this rule reacts to, then narrow them if you want. Nothing else on a system rule is a condition — there is no detection behind it.","conditionCatalogUnavailableThisRule":"Condition catalog unavailable — this rule matches on its trigger and targets alone.","testThisRuleForReal":"Test this rule for real","buildsTheEventThisRule":"Builds the event this rule is about, runs the REAL evaluation and delivery, and sends the notification to every target — marked [TEST] in the body. The cooldown and the camera mute are bypassed (neither window is consumed); the rule's actions are never run. Saved conditions only: save first to test an edit.","testRule":"Test rule","dryRunLast60Min":"Dry-run (last 60 min)","evaluateTheCurrentUnsavedRule":"Evaluate the CURRENT (unsaved) rule against recently persisted records — no notification is sent.","rule":"Rule","targets":"Targets","deviceEventRulesCannotBe":"Device-event rules cannot be dry-run: the sensor-event store has no cross-device scan surface, so a test returns no candidate records. The rule still fires live on a matching doorbell press / sensor change.","noRecordsInTheLast":"No records in the last 60 minutes matched — nothing to evaluate."},"notificationSequences":{"name":"Name","minDelayS":"Min delay (s)","step":"Step","steps":"Steps","deleteThisSequence":"Delete this sequence?","willBeRemovedRulesAnd":"“{{name}}” will be removed. Rules and buttons that bind to it keep the id until you re-point them.","delete":"Delete {{name}}","sequences":"Sequences","namedStepListsSharedBy":"Named step lists shared by notification rules and buttons. A rule binds to one by id; two rules sharing a gate share its throttle.","couldNotReadSequences":"Could not read sequences","noSequencesYetCreateOne":"No sequences yet. Create one, then bind it from a rule's Actions tab.","edit":"Edit {{value1}}","newSequence":"New sequence","saving":"Saving…","seconds":"Seconds"},"notificationSimulate":{"simulateAnEvent":"Simulate an event","injectASyntheticDetectionDoorbell":"Inject a synthetic detection, doorbell press or occupancy edge and see exactly which rules match it, which condition each one fails on, and what would be delivered. Nothing is persisted — no track, no event row, no media.","failedToLoadCameras":"Failed to load cameras","unknownError":"Unknown error","ruleToSimulate":"Rule to simulate","pickARuleToPrefill":"— pick a rule to prefill trigger + conditions —","picksTheTriggerThatRule":"Picks the trigger that rule listens for and fills the fields from its conditions. Edit any value below, then inject.","camera":"Camera","loadingCameras":"Loading cameras…","pickACamera":"— pick a camera —","theCameraTheEventIs":"The camera the event is attributed to — what a notification shows.","trigger":"Trigger","quality":"Quality","everyFieldHereCanBe":"Every field here can be left EMPTY, and empty is a real state: a rule with a minimum confidence FAILS on a subject that carries none. Leave one blank to reproduce exactly that.","labelIdentityNamePlateSubclass":"Label (identity name / plate / subclass)","eGMarcoAb123cd":"e.g. Marco, AB123CD","detectionConfidence":"Detection confidence","labelMatchConfidence":"Label-match confidence","importance":"Importance","dwellSeconds":"Dwell (seconds)","howToRunIt":"How to run it","ignoreTheCooldown":"Ignore the cooldown","aRuleThatAlreadyFired":"A rule that already fired recently is normally silenced. Turn this on to fire anyway; leave it off to SEE the suppression.","ignoreMutesAndSnoozes":"Ignore mutes and snoozes","aMutedCameraOrA":"A muted camera or a snoozed rule drops the event before any rule is consulted.","runTheRuleSActions":"Run the rule's actions — this actuates real devices","aMatchedRuleSOntrigger":"A matched rule's onTrigger sequences run for real: locks unlock, lights switch, sirens sound. Off unless you mean it.","stillImage":"Still image","liveSnapshotOfTheCamera":"Live snapshot of the camera","noImage":"No image","evaluateOnlyOneRule":"Evaluate only one rule","everyEnabledRule":"— every enabled rule —","nothingIsPersistedNoTrack":"Nothing is persisted: no track, no event row, no stored media. Delivery is real.","injectEvent":"Inject event","theHubAnsweredButThis":"The hub answered, but this build could not read the answer. That is what a hub older than the simulator looks like — update the server, then re-run."},"notificationSimulateFields":{"whatHappened":"What happened","audioClasses":"Audio classes","audioClassId":"Audio class id…","zones":"Zones","detectedClasses":"Detected classes","classIdPersonCar":"Class id (person, car…)","zonesTheSubjectIsIn":"Zones the subject is in","packagePhase":"Package phase","none":"— none —","delivered":"Delivered","pickedUp":"Picked up","eventKind":"Event kind","loadingKinds":"Loading kinds…","pickAKind":"— pick a kind —","pickACameraFirstSensor":"Pick a camera first — sensor and control kinds come from the devices linked to it.","thisCameraHasNoLinked":"This camera has no linked sensor or control device, so it can produce no device event. Link one on the camera page first.","sourceDevice":"Source device","theCameraItself":"the camera itself","theLinkedDeviceWhoseState":"The linked device whose state changed. Filled in for you when you pick a kind.","filledInFromContributedBy":"Filled in from \\"{{label}}\\" — contributed by device #{{deviceId}} via the {{capName}} capability.","eventTypeToken":"Event type token","pressPressLong":"press, press_long…","onlyEventEmitterSourcesCarry":"Only event-emitter sources carry one. A passive sensor emits none, and a rule gating on a token would fail closed for it.","zone":"Zone","leaveEmptyForTheWhole":"Leave empty for the whole frame.","class":"Class","anyClass":"— any class —","countNow":"Count now","countBefore":"Count before","threshold":"Threshold","occupied":"Occupied","advanced":"Advanced","zoneCrossing":"zone crossing","thisEventIsAConfirmed":"This event is a confirmed zone crossing","enteredTheZone":"Entered the zone","leftTheZone":"Left the zone","boundingBox":"bounding box","carryABoundingBox":"Carry a bounding box","normalized01TopLeft":"Normalized 0–1, top-left origin. Feeds the \`customZones\` condition and decides how the still is cropped or boxed.","happenedAt":"Happened at","set":"Set","now":"Now","emptyNowSetItTo":"Empty = now. Set it to a time inside (or outside) a rule's schedule window to test the schedule without waiting for the hour.","detectionSource":"Detection source","unsetReadsAsPipeline":"— unset (reads as pipeline) —","pipeline":"Pipeline","onboardCamera":"Onboard (camera)","sensor":"Sensor","audio":"Audio","actuatesDevices":"actuates devices"},"notificationSimulateResult":{"copyRecordId":"Copy record id","didNotMatchTheEngine":"Did not match. The engine reported no failing condition id."},"notificationSnoozes":{"silencedRightNow":"Silenced right now","nothingIsSilencedASnooze":"Nothing is silenced. A snooze opened from the app or from a notification button appears here until its clock runs out.","noSummary":"no summary","endNow":"End now"},"notificationSummaries":{"summaryRulesAreNotAvailable":"Summary rules are not available on this hub","theHubAnsweredSomethingThis":"The hub answered something this admin build does not understand. Update both and reload.","thisHubHasNotBeen":"This hub has not been updated to serve summary rules yet. Deploy addon-post-analysis and reload — nothing is lost in the meantime.","couldNotDeleteTheRule":"Could not delete the rule","theTestRunFailed":"The test run failed","nothingWasProduced":"Nothing was produced:","dismiss":"Dismiss","noSummaryRulesYetCreate":"No summary rules yet — create one, and every window it covers arrives as a single picture.","summaries":"Summaries","newSummary":"New summary","digest":"Digest","aiOff":"AI off","cameras":"Cameras","window":"Window","keeps":"Keeps","mosaic":"Mosaic","targets":"Targets","lastRun":"Last run","on":"On","toggle":"toggle {{name}}","produceThisDigestNowAnd":"Produce this digest now and DELIVER it","test":"test {{name}}","deleteThisSummary":"Delete this summary?","thisWillPermanentlyDeleteThis":"This will permanently delete \\"{{name}}\\". This action cannot be undone.","delete":"delete {{name}}"},"notificationSummaryEditor":{"newSummary":"New summary","edit":"Edit {{name}}","whatItIs":"What it is","oneWindowOnePictureThe":"One window, one picture: the best shot of every track the window held, laid out as one mosaic and delivered once.","name":"Name","eGOvernightSweep":"e.g. Overnight sweep","enabled":"Enabled","cameras":"Cameras","everyCameraInTheDigest":"Every camera in the digest gets at least one tile when it contributed anything — a digest in which two of six cameras never appear is not multi-camera.","theFirstCameraSelectedOwns":"The first camera selected owns the delivered notification.","whenTheWindowCloses":"When the window closes","window":"Window","motionOpenedAndClosedBy":"Motion — opened and closed by activity","scheduleFixedWeeklyWindows":"Schedule — fixed weekly windows","quietPeriodSeconds":"Quiet period (seconds)","theWindowOpensOnThe":"The window opens on the first motion on any of these cameras and stays open while more arrives. This much silence closes it.","longestWindowSeconds":"Longest window (seconds)","aPermanentlyBusyDrivewayWould":"A permanently busy driveway would otherwise never deliver. At this bound the window closes with whatever it holds.","weeklyWindows":"Weekly windows","theDigestIsProducedWhen":"The digest is produced when a window CLOSES, and covers exactly that window. The first one is the first window that closes after you save — nothing is backfilled.","waitForOpenTracksSeconds":"Wait for open tracks (seconds)","aTrackSBestShot":"A track's best shot is written when the track ENDS. Rendering the instant the window closes would show every still-moving subject with no picture. 0 disables the wait.","whatGoesIn":"What goes in","evaluatedOnTracksOnePassage":"Evaluated on tracks: one passage is one tile.","classes":"Classes","emptyEveryClassOnlyThe":"Empty = every class. Only the macro classes are offered: a digest matches the class stored on the track, and tracks store macros — a sub-type would match nothing, forever.","excludedClasses":"Excluded classes","zones":"Zones","zonesAreScopedPerCamera":"Zones are scoped per camera: picking a zone on one camera does not mute the others, which keep matching on the whole frame.","minimumImportance":"Minimum importance","thePipelineSOwnScore":"The pipeline's own score, 0–1. Empty keeps everything.","minimumStaySeconds":"Minimum stay (seconds)","dropsThePassagesTooBrief":"Drops the passages too brief to be worth a tile.","includeParkedObjects":"Include parked objects","offByDefaultACar":"Off by default. A car left in the drive is tracked until it is recognised as parked, and it stays parked for as long as it is there — with this on, a digest fills up with the same stationary object instead of the passages. Parked objects remain on the Events page either way.","theMosaic":"The mosaic","tiles":"Tiles","9A33Grid":"9 (a 3×3 grid) is the most a phone lock-screen thumbnail can carry and still be read.","whenThereAreMoreTracks":"When there are more tracks than tiles","everyContributingCameraKeepsIts":"Every contributing camera keeps its single best tile first; the remaining slots go to this ranking.","textOnTheMosaic":"Text on the mosaic","imagesOnlyIsTheDefault":"Images only is the default, and it is what a rule with nothing set here does. Anything drawn is burnt into the picture for good — a label covers the bottom of the tile, which is where feet, wheels and parcels are, and a caption from a detection that was wrong cannot be un-drawn. Nothing downstream needs the words: the written summary reads the frames themselves and is told the camera, the class and the time in its prompt.","captionBurnedOntoTheMosaic":"Caption burned onto the mosaic","leaveEmptyForNoCaption":"Leave empty for no caption","acrossTheTopBand":"Across the top band.","onlyDrawnWithTileLabels":"Only drawn with “tile labels and a caption across the top”. What you type here is kept either way.","writtenSummary":"Written summary","oneVisionCallOverThe":"One vision call over the window's best frames TOGETHER, so the answer is an account of what happened rather than a list of pictures. The sentence goes in the notification body.","haveAModelDescribeThe":"Have a model describe the window","offByDefaultTheMosaic":"Off by default. The mosaic and the counts are delivered either way.","theSwitchAboveIsOff":"The switch above is off, so nothing below it can be edited. Everything you already set is kept — turning it on hands the fields back exactly as you left them.","visionProfile":"Vision profile","theHubSDefaultVision":"The hub's default vision profile","thisHubDidNotAnswer":"This hub did not answer with a profile list — the digest will use whatever the AI addon resolves for the “ai-summary” consumer.","noVisionCapableProfileOn":"No vision-capable profile on this hub yet. Add one under AI → Profiles; until then the digest delivers without text.","onlyVisionCapableProfilesAre":"Only vision-capable profiles are offered — a vision call against a text profile is refused, never degraded.","answerIn":"Answer in","donTAskForA":"Don’t ask for a language","nothingIsAddedToThe":"Nothing is added to the prompt unless you pick one, and these models answer in English on their own.","yourQuestionOptional":"Your question (optional)","eGTellMeWhether":"e.g. Tell me whether anybody approached the gate, and whether a parcel was left.","leaveBlankForWhatHappened":"Leave blank for “what happened during this period?”. Your words are the only free text the model is given: what the cameras are called and what the pipeline classified are reduced to plain labels first, and anything written INSIDE a frame — a sign, a plate, an overlay — is treated as scenery, never as an instruction.","framesTheModelMayLook":"Frames the model may look at","theHighestRankedTilesSent":"The highest-ranked tiles, sent as ONE question. Bounded separately from the tile budget — one is bounded by pixels, the other by the model's time — and never larger than it.","timeLimitSeconds":"Time limit (seconds)","nobodyIsWaitingOnA":"Nobody is waiting on a phone for a digest, so this is generous. At the bound the generation is cancelled, not merely abandoned.","frameSizeSentPixels":"Frame size sent (pixels)","longestEdge448IsThe":"Longest edge. 448 is the native tile size of these vision encoders — larger costs tokens and latency without adding detail the encoder can see.","ifTheModelGivesNo":"If the model gives no answer","aColdModelAnUnreachable":"A cold model, an unreachable endpoint or an answer the hub cannot parse are all this case. The default delivers: the mosaic and the counts are worth more than silence, and a closed window does not come back.","delivery":"Delivery","priority":"Priority","deliverAWindowThatMatched":"Deliver a window that matched nothing","offByDefaultANightly":"Off by default: a nightly '0 events' is a line nobody reads, and it costs the lines beside it their reader.","create":"Create"},"notificationSystemEventDelivery":{"delivery":"Delivery","instantANotificationPerEvent":"Instant — a notification per event","summaryOnScheduleTheCurrent":"Summary on schedule — the current state, at set times","nothingIsSentPerEvent":"Nothing is sent per event. At each time below, one notification lists what is still true for the kinds and filters of this rule — low batteries, consumables, devices or streams offline, updates available — or one notification per category, if you choose so below. Nothing to report sends nothing. Time zone:","theHubS":"the hub’s","howTheSummaryIsSent":"How the summary is sent","oneMessageWithEveryCategory":"One message with every category","oneNotificationPerCategoryBatteries":"One notification per category (batteries, consumables, devices…)","readingTheState":"Reading the state…","previewTheSummaryNow":"Preview the summary now"},"notificationTargets":{"target":"Target","kind":"Kind","owner":"Owner","on":"On","toggle":"toggle {{name}}","test":"Test","duplicate":"Duplicate","notificationTargets":"Notification Targets","deliverNotificationsToNtfyPushover":"Deliver notifications to ntfy, Pushover, Telegram, Home Assistant and more. Each target's kind declares its capabilities; the test panel shows exactly what a message degrades to.","addTarget":"Add target","failedToLoadTargets":"Failed to load targets","unknownError":"Unknown error","noNotificationTargetsYetClick":"No notification targets yet. Click \\"Add target\\" to configure one.","chooseANotificationKind":"Choose a notification kind","noNotificationProvidersAreInstalled":"No notification providers are installed. Install the notifiers addon (or connect Home Assistant) to add targets.","saveChanges":"Save changes","createTarget":"Create target","name":"Name","systemSharedAdminManaged":"System (shared, admin-managed)","aUserOwnedTargetBelongs":"A user-owned target belongs to that user: it shows in their viewer and their own rules may deliver to it. System targets stay admin-managed.","storedSecretsLoadIntoThe":"Stored secrets load into the masked fields (eye to reveal). Clear a field to leave the stored value unchanged on save; type a new value to replace it.","testConnection":"Test connection","connected":"Connected — {{value1}}","connectionFailed":"Connection failed"},"notificationTestPanel":{"level":"Level","deriveFromPriority":"— derive from priority —","requiresTargetConfig":"Requires target config:","priorityOrdinal":"Priority (ordinal):","format":"Format","title":"Title","mode":"(mode:","mb":", ≤{{value1}}MB","url":"{{mt}} URL","clickUrl":"Click URL","sound":"Sound","ttlSeconds":"TTL (seconds)","tag":"Tag","payloadPreview":"Payload preview","sendTest":"Send test","delivered":"Delivered","failed":"Failed","resolvedLevel":"Resolved level","formatSent":"Format sent","attachmentsSent":"Attachments sent","actionsSent":"Actions sent","truncated":"Truncated","dropped":"Dropped"},"notificationTexts":{"englishFallback":"English fallback","resetToTheShippedWording":"Reset to the shipped wording","shipped":"Shipped:","texts":"Texts","theNotificationTextCatalogIs":"The notification text catalog is not available on this hub","theHubAnsweredSomethingThis":"The hub answered something this admin build does not understand. Update both and reload.","thisHubHasNotBeen":"This hub has not been updated to serve the notification text catalog yet. Deploy addon-post-analysis and reload — nothing is lost in the meantime: notifications keep using the shipped wording.","couldNotChangeTheLanguage":"Could not change the language","couldNotSave":"Could not save","hubLanguage":"Hub language","everyNotificationIsWrittenIn":"Every notification is written in this language.","editing":"Editing","ofTextsCustomised":"{{overriddenCount}} of {{length}} texts customised.","thisHubDoesNotSpeak":"This hub does not speak this language — these words are not in use yet.","aRuleThatWritesIts":"A rule that writes its own title or body still overrides everything here — this page is the wording used when a rule does not.","searchAKeyOrA":"Search a key or a sentence…","save":"Save {{pending}}","noTextMatchesThatSearch":"No text matches that search."},"notificationTimelapseEditor":{"newTimelapse":"New timelapse","edit":"Edit {{name}}","whatItIs":"What it is","oneVideoPerCameraAssembled":"One video per camera, assembled from that camera's RECORDED footage when the window closes.","name":"Name","eGNightDriveway":"e.g. Night driveway","enabled":"Enabled","cameras":"Cameras","eachCameraRendersAndDelivers":"Each camera renders and delivers its own video. Recording must be ON for a camera — a timelapse is cut from recorded footage, and the hub refuses a rule for a camera that does not record.","when":"When","weeklyWindows":"Weekly windows","theVideoCoversExactlyOne":"The video covers exactly one window and is delivered when it CLOSES. A window that crosses midnight (21:00 → 07:00) is the ordinary case for a night timelapse.","sampling":"Sampling","twoRatesABaseRate":"Two rates: a base rate for the whole window, and a denser one inside the ranges where something was detected.","baseCadenceSeconds":"Base cadence (seconds)","oneFrameEveryNSeconds":"One frame every N seconds across the quiet parts of the window.","outputFrameRateFps":"Output frame rate (fps)","howFastTheAssembledVideo":"How fast the assembled video plays.","denseCadenceNearTheDetections":"Dense cadence, near the detections","automaticS":"Automatic ({{seconds}}s)","setItMyself":"Set it myself","minimumSecondsOfVideoPer":"Minimum seconds of video per detection (optional)","stateTheStayAndLet":"State the stay and let the renderer solve for the cadence. It only ever samples DENSER, down to the recording's own frame interval — a passage too short to reach it is rendered with every frame that exists and no more.","theNotification":"The notification","preview":"Preview","priority":"Priority","captionOnThePreviewFrame":"Caption on the preview frame","shippedDefault":"{{DEFAULT_TIMELAPSE_PREVIEW_TEXT}} (shipped default)","emptyAndSetThePreview":"Empty and set: the preview frame carries NO caption.","leaveUntouchedForTheShipped":"Leave untouched for the shipped caption ({{DEFAULT_TIMELAPSE_PREVIEW_TEXT}}).","backToTheShippedCaption":"Back to the shipped caption","create":"Create"},"notificationTimelapses":{"timelapseRulesAreNotAvailable":"Timelapse rules are not available on this hub","theHubAnsweredSomethingThis":"The hub answered something this admin build does not understand. Update both and reload.","thisHubHasNotBeen":"This hub has not been updated to serve timelapse rules yet. Deploy addon-post-analysis and reload — the rules themselves are untouched.","couldNotDeleteTheRule":"Could not delete the rule","theTestRunFailed":"The test run failed","nothingWasProduced":"Nothing was produced:","dismiss":"Dismiss","noTimelapseRulesYetCreate":"No timelapse rules yet — create one, and each night's recorded footage arrives as a short video.","whichCamera":"Which camera","timelapses":"Timelapses","newTimelapse":"New timelapse","timelapse":"Timelapse","cameras":"Cameras","cameras2":"{{length}} cameras","window":"Window","sampling":"Sampling","targets":"Targets","lastRun":"Last run","on":"On","toggle":"toggle {{name}}","renderThisRuleSLast":"Render this rule's last closed window now and DELIVER it","test":"test {{name}}","deleteThisTimelapse":"Delete this timelapse?","thisWillPermanentlyDeleteThis":"This will permanently delete \\"{{name}}\\". This action cannot be undone.","delete":"delete {{name}}"},"oidcSettingsConnections":{"deleteOidcConnection":"Delete OIDC connection?","removeTheLoginButtonAnd":"Remove “{{displayName}}” ({{id}}). The login button and IdP credentials for this id are dropped.","id":"Id","name":"Name","issuer":"Issuer","status":"Status","configured":"Configured","notConfigured":"Not configured","delete":"Delete {{displayName}}","eachRowIsOneIdp":"Each row is one IdP. Redirect URI:","addConnection":"Add connection","couldNotLoadConnections":"Could not load connections.","noOidcConnectionsYetAdd":"No OIDC connections yet. Add one to register an IdP.","addOidcConnection":"Add OIDC connection","edit":"Edit {{value1}}","saving":"Saving…","instanceId":"Instance id","urlSlugAppearsInAddon":"URL slug — appears in /addon/{{addonId}}/<id>/callback. Stable; renaming is not supported after save.","instanceId2":"Instance id:","loadingForm":"Loading form…"},"pemField":{"chooseFile":"Choose file"},"remoteAccess":{"remoteAccess":"Remote access","addTunnel":"Add tunnel","remoteAccess2":"Remote Access","publicFacingTunnelsThatExpose":"Public-facing tunnels that expose this hub to the internet (Cloudflare Tunnel, ngrok, …).","noRemoteAccessProvidersInstalled":"No remote-access providers installed","installATunnelAddonE":"Install a tunnel addon (e.g. @camstack/addon-cloudflare) to expose this hub publicly.","connected":"Connected","disconnected":"Disconnected","stop":"Stop","start":"Start"},"storage":{"disable":"Disable \\"{{displayName}}\\"?","nothingIsDeletedSetThe":"{{consequence}} Nothing is deleted — set the location back to Read-only or Active to bring its footage back.","deleteLocation":"Delete location \\"{{displayName}}\\"?","thisRemovesTheLocationRecord":"This removes the location record. Files on disk are not deleted; the underlying directory or remote path stays untouched.","deleteAnyway":"Delete anyway?","forceDelete":"Force delete","loadingLocations":"Loading locations…","failedToLoadStorageLocations":"Failed to load storage locations.","noStorageLocationsDeclaredBy":"No storage locations declared by any installed addon."},"system":{"settings":"Settings","secrets":"Secrets","capabilities":"Capabilities"},"turnServers":{"turnProviders":"TURN providers","addProvider":"Add provider","discoveredIceServers":"Discovered ICE servers","turnServers":"TURN Servers","iceServersUsedForWebrtc":"ICE servers used for WebRTC NAT traversal. Multiple providers can coexist — the WebRTC layer concatenates servers from all enabled providers per session.","noTurnProvidersInstalled":"No TURN providers installed","installATurnAddonE":"Install a TURN addon (e.g. @camstack/addon-cloudflare) to enable WebRTC behind restrictive NATs.","combinedIceServerListAll":"Combined ICE server list — all enabled providers","noServersFromEnabledProviders":"No servers from enabled providers."},"wasteSettingsSources":{"countryService":"Country & service","country":"Country","selectCountry":"Select country…","service":"Service","pickACountryFirst":"Pick a country first","selectService":"Select service…","newSource":"New source","deleteWasteSource":"Delete waste source?","removeItsCalendarUnderSystem":"Remove “{{label}}” ({{id}}). Its calendar under System → Calendars is dropped.","label":"Label","module":"Module","enabled":"Enabled","on":"On","off":"Off","delete":"Delete {{label}}","pickACountryAndA":"Pick a country and a service — configuration fields come from that HACS source.","addSource":"Add source","couldNotLoadSources":"Could not load sources.","noWasteSourcesYetAdd":"No waste sources yet. Add one to register a municipal service.","addWasteSource":"Add waste source","edit":"Edit {{value1}}","saving":"Saving…","loadingFields":"Loading fields…","chooseACountryAndService":"Choose a country and service to see the required fields."},"alarmLiveCard":{"panel":"Panel","thisHubDoesNotReport":"This hub does not report the panel's live state yet — update it to arm from here.","disarm":"Disarm","thePanelDidNotDo":"The panel did not do that","armAnyway":"Arm anyway","eachOpenDeviceIsIgnored":"Each open device is ignored until it closes, then monitored again.","excludedSensors":"Excluded sensors","noSensorIsExcluded":"No sensor is excluded."},"alarmModeCard":{"armsNothingNoEnabledRule":"Arms nothing — no enabled rule is gated on this mode","checkingWhichDevicesAreOpenings":"Checking which devices are openings…","usesTheSystemDefaultS":"Uses the system default ({{value1}} s)","default":"Default","useTheDefault":"Use the default","useTheDefault2":"{{label}}: use the default","afterTrigger":"After trigger","usesTheSystemDefault":"Uses the system default","afterTriggerUseTheDefault":"After trigger: use the default","activationSchedule":"Activation schedule","whenThisModeMayBe":"When this mode may be armed. Empty means any day and time.","noSensorIsCoveredBy":"No sensor is covered by a rule of this mode."},"alarmProfileBar":{"profile":"Profile","deleteThisProfile":"Delete this profile","newName":"New name","newProfileName":"New profile name","rename":"Rename","createWithSystemDefaults":"Create with system defaults","create":"Create","cloneTheSelectedProfile":"Clone the selected profile","clone":"Clone","createStartsFromSystemDefaults":"Create starts from system defaults. Clone copies the selected profile (sensors, secure-on-arm, delays). Switching applies that profile for the next arm."},"alarmSensorTable":{"name":"Name","type":"Type","state":"State","checkedWhenArming":"Checked when arming","blocksArming":"Blocks arming","blocksArming2":"Blocks arming: {{name}}","closeLockOrTurnOff":"Close, lock, or turn off when this mode arms","secureOnArm":"Secure on arm","secureOnArmCloseLock":"Secure on arm (close/lock/off): {{name}}","couldNotReadTheSensor":"Could not read the sensor states.","searchSensors":"Search sensors"},"notificationClassScopeField":{"addValue":"Add value…"},"notificationConditionWidgets":{"remove":"remove {{v}}","customValueClickToRemove":"Custom value — click to remove","eventToken":"Event token…","subTypeNeverCountsAlways":"{{stored}} — sub-type, never counts (always 0)","loadingZones":"Loading zones…","wholeFrame":"— whole frame —","anyClass":"— any class —","threshold":"Threshold","count":"Count","holdFor":"Hold for","clear":"Clear","noCameraPickedOnThe":"No camera picked on the Devices tab: this watches EVERY camera's occupancy, and no zone can be offered until you choose one — a zone id belongs to a camera.","countsConfirmedTrackedObjectsFrom":"Counts confirmed tracked objects from zone analytics. The change must hold for the sustain window before it fires; with no snapshot for the camera or zone the rule never fires.","storedByTheRuleNot":"Stored by the rule — not offered by this hub","keptFromTheRuleUnknown":"Kept from the rule, unknown to this hub:","confirmAfter":"Confirm after","louderThan":"Louder than","hits":"Hits","withNeitherASoundNor":"With neither a sound nor a level threshold this can never match — every sample would be a hit, so the engine refuses it rather than notifying on silence.","plateText":"Plate text…","seen":"Seen:","maxDistance":"Max distance","noDeviceGate":"— no device gate —","thisDeviceReportsNoState":"This device reports no state the gate can read, so it cannot arm a rule.","theRuleIsSilentWhile":"The rule is silent while the device is in any other state — including when its state cannot be read at all."},"notificationDigestFields":{"thisRuleCouldNeverProduce":"This rule could never produce anything, so it cannot be saved:","worthKnowing":"Worth knowing:","noDeliveryTargetIsConfigured":"No delivery target is configured. Add one on the Targets tab first — without one the artefact is rendered and thrown away.","notificationTitle":"Notification title","notificationBody":"Notification body","leaveBothBlankToUse":"Leave both blank to use the hub's own wording (editable on the Texts tab).","sendARealNotificationNow":"Send a real notification now?","itDoesNotConsumeThe":"It does not consume the schedule: the next scheduled run still happens.","sending":"Sending…","produceAndSend":"Produce and send"},"notificationRulePickers":{"customValueClickToRemove":"Custom value — click to remove"},"notificationScheduleField":{"activeOutsideTheWindows":"Active outside the windows","invertedScheduleShownAsBands":"Inverted schedule — shown as bands. Clear the invert flag (or the windows) to author punctual times.","shownAsSendAtTimes":"Shown as send-at times from each window's end (when the summary fires). Edit or save to store them as punctual one-minute windows.","noTimesYetAddOne":"No times yet — add one to send on those days at that clock time.","removeWindow":"Remove window","at":"At","removeTime":"Remove time"},"notificationSystemEventField":{"theBatteryThresholdAndThe":"The battery threshold and the reminder interval are cluster settings (the consumable threshold is this rule’s own, below):","settingsBatteryOfflineAlerts":"Settings → Battery & offline alerts","alarmSettings":"Alarm settings","couldNotCheckWhetherThis":"Could not check whether this hub’s server knows per-rule consumable thresholds and tank alerts.","consumableLowAt":"Consumable low at (%)","deviceTypes":"Device types","deviceType":"Device type…","batteryAndConsumableAlertsAre":"Battery and consumable alerts are narrowed by device type here. Batteries and consumables belong to sensors, containers, vacuums and mowers — rarely to a camera — so a type filter meant for liveness silences them. Leave the types empty, or put these kinds in a rule of their own.","nodes":"Nodes","packages":"Packages","thisRuleIsNotOne":"This rule is not one kind of system rule — its events span device events, system and alarm, or it names none. It keeps firing as it is, but it cannot be edited here: recreate it as one rule per kind.","kindOfSystemRule":"Kind of system rule","oneRuleAnswersOneQuestion":"One rule answers one question: about devices, about the installation, or about the alarm. Changing it starts the event list over."},"scopePickers":{"theNodeHistoryCouldNot":"The node history could not be read — offline nodes may be missing from this list."},"targetSecretNotice":{"theHubNeedsTheSecret":"The hub needs the secret again — nothing was saved."},"unifiedRulesColumns":{"when":"When","type":"Type"},"cluster":{"unlockFromAgentFailed":"Unlock from agent failed:","loadingClusterTopology":"Loading cluster topology..."}}`),common:{save:`Save`,cancel:`Cancel`,delete:`Delete`,enable:`Enable`,disable:`Disable`,edit:`Edit`,add:`Add`,remove:`Remove`,confirm:`Confirm`,close:`Close`,back:`Back`,next:`Next`,search:`Search`,filter:`Filter`,reset:`Reset`,apply:`Apply`,submit:`Submit`,loading:`Loading…`,error:`Error`,success:`Success`,warning:`Warning`,info:`Info`,noData:`No data available`,noResults:`No results found`,retry:`Retry`,refresh:`Refresh`,copy:`Copy`,copied:`Copied!`,yes:`Yes`,no:`No`},connection:{disconnected:`Server unreachable — reconnecting…`,connected:`Connected`,reconnecting:`Reconnecting…`,degraded:`Live connection interrupted — hub is online (a cluster node may be unresponsive), re-establishing…`,degradedNodes_one:`Cluster degraded — node {{nodes}} not responding. Hub is online, live link re-establishing…`,degradedNodes_other:`Cluster degraded — nodes {{nodes}} not responding. Hub is online, live link re-establishing…`,degradedCount_one:`Cluster degraded — {{count}} cluster node offline. Hub is online, live link re-establishing…`,degradedCount_other:`Cluster degraded — {{count}} cluster nodes offline. Hub is online, live link re-establishing…`,sessionExpired:`Session expired — please sign in again.`,signIn:`Sign in`},passkeyPrompt:{message:`Save a passkey for faster sign-in?`,enrollNow:`Enroll now`,notNow:`Not now`},status:{online:`Online`,offline:`Offline`,connecting:`Connecting`,error:`Error`,disabled:`Disabled`,enabled:`Enabled`,active:`Active`,inactive:`Inactive`,running:`Running`,stopped:`Stopped`,pending:`Pending`,unknown:`Unknown`},auth:{login:`Login`,logout:`Logout`,username:`Username`,password:`Password`,signIn:`Sign In`,invalidCredentials:`Invalid username or password`,adminTokensSection:{revokeAdminToken:`Revoke admin token "{{name}}"?`,everyScriptUsingItLoses:`Every script using it loses access immediately. This cannot be undone.`,revoke:`Revoke`,adminTokens:`Admin tokens`,fullAdministrator:`full administrator`,itExpiresInAtMost:`It expires in at most 90 days and every use is audited. Creating one asks you to confirm it is you.`,newAdminToken:`New admin token`,adminTokens2:`admin tokens`,createAdminToken:`Create admin token`,tokenName:`Token name`,expiresInDays:`Expires in (days)`},authAuditSection:{authenticationAudit:`Authentication audit`,loadingAuditTrail:`Loading audit trail…`,couldNotLoadTheAudit:`Could not load the audit trail:`,requestFailed:`Request failed`,noAuthenticationEventsRecordedYet:`No authentication events recorded yet.`,thisTrailRecordsAdminToken:`This trail records admin-token create/use/revoke, trusted-network 2FA skips, and credential revokes (including single share-link revoke). Browser password logins are not listed here.`},createScopedTokenModal:{createScopedToken:`Create scoped token`,issueToken:`Issue token`,onBehalfOfUser:`On behalf of user`,name:`Name`,scopes:`Scopes`,eachScopePicksACap:`Each scope picks a (cap or addon) target + one or more access flavours. The token can access ONLY what's listed.`,expiresInDays:`Expires in (days)`,leaveBlankForNonExpiring:`Leave blank for non-expiring.`},mySessionsSection:{signOutThisSession:`Sign out this session`,willHaveToSignIn:`{{label}} will have to sign in again.`,signOut:`Sign out`,signOutEverywhere:`Sign out everywhere`,everySessionOfYourAccount:`Every session of your account ends, this browser included: you will be signed out here too and every device has to sign in again.`,activeSessions:`Active sessions`,theBrowsersAndAppsSigned:`The browsers and apps signed in to your account. Signing one out ends it at once.`},reauthDialog:{confirmItSYou:`Confirm it’s you`,currentPassword:`Current password`,useAPasskey:`Use a passkey`},sessionsList:{loadingSessions:`Loading sessions…`,couldNotLoadSessions:`Could not load sessions:`,thisDevice:`This device`,ipUnknown:`IP unknown`,signOut:`Sign out`},tokenModals:{token:`Token: {{label}}`,copyThisTokenNowOnce:`Copy this token now. Once you close this dialog the secret cannot be displayed again.`,done:`Done`}},theme:{dark:`Dark`,light:`Light`,system:`System`},language:{select:`Language`,en:`English`,it:`Italian`},pages:{viewer:{frameTitle:`CamStack viewer`,underMountTitle:`The viewer cannot be shown through this relay`,underMountBody:`This admin UI is served under {{mount}}. The viewer app only runs at the hub’s own address — open it there, in a new tab.`},integrations:{title:`Integrations`,subtitle:`Manage camera sources and provider connections`},metrics:{title:`Metrics`,subtitle:`System performance and usage statistics`},agents:{title:`Agents`,subtitle:`Manage distributed processing agents`},addons:{title:`Addons`,subtitle:`Extend functionality with addon modules`},settings:{title:`Settings`,subtitle:`Configure system-wide preferences`},users:{title:`Users`,subtitle:`Manage user accounts and permissions`},logs:{title:`Logs`,subtitle:`View system and device logs`}},integrations:{preview:`Preview`,snapshotUnavailable:`Snapshot unavailable`,noSnapshot:`No snapshot`,lastSnapshot:`Last snapshot:`,offline:`Offline`,active:`Active`,available:`Available`,noDevices:`No devices.`,addFirstDevice:`Add your first device to get started.`,import:`+ Import`,noProviders:`No providers available. Install a provider addon.`,manage:`Manage`,integrationName:`Integration name`,integrationNamePlaceholder:`e.g. Garage Server`,connectionSuccess:`Connection successful!`,errorPrefix:`Error:`,back:`Back`,testing:`Testing...`,testConnection:`Test connection`,forward:`Next`,searchingDevices:`Searching for devices...`,foundDevices:`Found {{count}} devices. Select the ones to import.`,noDevicesFound:`No devices found.`,skip:`Skip`,importSelected:`Import selected`,newIntegration:`New Integration`,configureIntegration:`Configure Integration`,importDevices:`Import Devices`,addDevice:`Add device`,name:`Name`,namePlaceholder:`e.g. Entrance Camera`,snapshotUrlOptional:`Snapshot URL (optional)`,streamUrls:`Stream URLs`,addStream:`Add stream`,cancel:`Cancel`,saving:`Saving...`,save:`Save`,saveAndNew:`Save and new`,test:`Test`,stream:`Stream {{number}}:`,devices:`devices`,rediscover:`Rediscover`,config:`Config`,integrationNotFound:`Integration not found.`,configComingSoon:`Config coming soon.`,providerConfig:`Provider Config`,editConfig:`Edit configuration`,relinkBrokerHelp:`Choose the broker this integration connects through. Picking a different broker re-points it and restarts the addon.`,currentBroker:`Current broker`,relinkFailed:`Failed to update broker link.`,noBrokerKind:`This integration declares device-adoption but its addon manifest has no brokerKind.`,connectionInconclusive:`Could not be checked:`,connectionUntestable:`This integration cannot be tested before it is created.`,addDeviceDialog:{providerUnavailable:`Provider unavailable`,testLogs:`Test logs`,required:`Required: {{value1}}`,testAll:`Test All`},adoptDevicesModal:{deselect:`Deselect`,select:`Select`,discoveryGranularity:`Discovery granularity`,collapse:`Collapse`,expand:`Expand`,showChild:`Show child`,hideChild:`Hide child`,showAfterAdopt:`Show after adopt`,hideAfterAdopt:`Hide after adopt`},alexaLoginStep:{loginProxyReturnedAnError:`Login proxy returned an error`,accountName:`Account name`,alexaAccount:`Alexa account`,amazonRegion:`Amazon region`,startingLoginProxy:`Starting login proxy…`,waitingForProxyToBe:`Waiting for proxy to be ready…`,savingCredentials:`Saving credentials…`,openTheLinkBelowTo:`Open the link below to log in to your Amazon account`,afterCompletingTheLoginAnd:`After completing the login and any 2FA steps, this wizard will continue automatically.`,loginToAmazon:`Login to Amazon`,note:`Note:`,waitingForAmazonLoginTo:`Waiting for Amazon login to complete…`,cancelLogin:`Cancel login`,startLogin:`Start login`},brokerStep:{loginInteractively:`Login interactively`,useExisting:`Use existing`,pasteCookie:`Paste cookie`,createNew:`Create new`,failedToLoadBrokers:`Failed to load brokers:`,unknownError:`Unknown error`,toRegisterOne:`to register one.`,useThisBroker:`Use this broker`,name:`Name`,myHomeAssistant:`My Home Assistant`,creating:`Creating…`,createBroker:`Create broker`,enterANameBeforeCreating:`Enter a name before creating.`},scanNetworkModal:{alreadyAdded:`Already added`,added:`Added`,reScan:`Re-scan`,scanningTheLocalNetwork:`Scanning the local network…`,noDevicesRespondedToThe:`No devices responded to the scan.`,scanning:`Scanning…`,scan:`Scan`,theScanFailedTryAgain:`The scan failed. Try again.`},snapshotPopover:{disabled:`Disabled`},integrationColumns:{collapse:`Collapse`,expand:`Expand`,integration:`Integration`,devices:`Devices`,status:`Status`},scanTheLocalNetworkFor:`Scan the local network for devices`,scanNetwork:`Scan network`,noIntegrationsConfigured:`No integrations configured.`,clickNewIntegrationToConnect:`Click "New Integration" to connect cameras and devices.`},ai:{addProfile:`Add profile`,attachSnapshot:`Camera snapshot`,attachTrack:`Recent track`,chatEmpty:`Pick a profile, optionally attach a camera snapshot or a recent track, and send a message. Nothing here is saved.`,chatFailed:`The test call failed`,chooseKind:`Choose a profile type`,clearChat:`Clear`,colAvgMs:`Avg ms`,colCalls:`Calls`,colConsumer:`Consumer`,colDay:`Day`,colDisk:`On disk`,colError:`Error`,colKind:`Kind`,colModel:`Model`,colNode:`Node`,colOkErr:`OK / err`,colOn:`On`,colProfile:`Profile`,colState:`State`,colTokens:`In / out tok`,colVision:`Vision`,createProfile:`Create profile`,defaultDisabled:`This default profile is disabled — callers resolve to no profile.`,defaultMissing:`This default names a profile that no longer exists.`,defaultText:`Default text profile`,defaultVision:`Default vision profile`,editProfile:`Edit {{name}}`,lastDays:`Last {{days}} days`,loadFailed:`Failed to load profiles`,message:`Message`,messagePlaceholder:`Ask the model something…`,model:`Model`,name:`Name`,newProfile:`New {{kind}} profile`,noCameras:`No camera found.`,noEnabledProfiles:`No enabled profile. Add one on the Profiles tab.`,noKinds:`No AI provider is installed.`,noProfiles:`No AI profiles yet. Click "Add profile" to configure one.`,noRuntimes:`No node advertises the llm-runtime capability.`,noTracks:`No track in the last 6 hours.`,noUsage:`No AI calls in this window.`,none:`None`,notVision:`This profile is not vision-capable — an attached image will be refused before anything is read.`,pickModelFirst:`pick a model`,appleNode:`Mac that runs it`,appleAsking:`Asking the nodes…`,appleHint:`Text only for now — notification titles and summaries. Apple refuses prompts framed as surveillance; when it does, the next profile in the chain answers instead.`,pickAppleNodeFirst:`pick a Mac`,colApple:`Apple on-device`,appleAvailable:`available`,appleUnknown:`unknown`,appleNotMac:`not a Mac`,appleNotEligible:`not eligible`,appleIntelligenceOff:`Apple Intelligence off`,appleModelNotReady:`model downloading`,appleOsTooOld:`macOS too old`,appleHelperMissing:`helper missing`,appleHelperCrashed:`helper crashed`,profile:`Profile`,profilesSubtitle:`One row = one usable model endpoint. The defaults below decide who answers when a feature names no profile.`,profilesTitle:`AI profiles`,ready:`ready`,runtimeNode:`Runtime node`,runtimesFailed:`Failed to read runtime nodes`,runtimesSubtitle:`Nodes advertising the llm-runtime capability: what each has loaded, what it is downloading, and how much model data sits on its disk.`,runtimesTitle:`Managed runtimes`,saveChanges:`Save changes`,saveFailed:`Save failed`,secretHint:`A stored API key is never shown. Leave it as-is to keep it; type a new value to replace it.`,selectModel:`Select a model…`,selectProfile:`Select a profile…`,send:`Send`,snapshotOf:`Snapshot of {{name}}`,stop:`Stop`,streamNote:`The answer streams as the model produces it. A cold model can take a while to load — the status line says which phase it is in.`,systemPlaceholder:`Answer in one short sentence.`,systemPrompt:`System prompt (optional)`,tabProfiles:`Profiles`,tabRuntimes:`Runtimes`,tabTest:`Test`,tabUsage:`Usage`,test:`Test`,testSubtitle:`A throwaway conversation with one profile. Attach a live camera snapshot or a recent track to check the model can actually read a picture. Nothing is saved — only the usage row.`,testTitle:`Test chat`,trackOf:`{{class}} on {{name}}`,unreachable:`unreachable`,usageFailed:`Failed to read usage`,usageSubtitle:`Server-side rollup per day, consumer and profile — never raw call rows. Errors are counted, so a profile that always fails is visible here before a feature reports it.`,usageTitle:`Usage`,vision:`vision`,window:`Window`},logging:{levels:{title:`Levels`,subtitle:`Cluster → node, most specific wins. The floor gates what reaches the log destinations; the in-memory viewer keeps every line either way.`,scope:`Scope`,cluster:`Cluster`,effective:`In force here`,fromDefault:`nothing is set anywhere — this is the default`,fromLayer:`decided by the {{source}} layer`,notPersisted:`The settings store could not be read or written — what you see is live, but it would not survive a restart.`,inForce:`in force`,inherits:`inherits — nothing set at this layer`,setHere:`set here: {{level}}`,clear:`Clear`,componentNote:`A per-component layer is planned and not resolvable yet — nothing on this page inherits from one.`},diagnostics:{title:`Diagnostics`,subtitle:`Diagnostics are armed for a window, never switched on. Each carries a deadline and expires by itself — one left running is an incident of its own.`,expiresIn:`expires in {{left}}`,disarmed:`disarmed`,notPersisted:`not persisted — will not survive a restart`,disarm:`Disarm`}},clusterLoad:{sourceNote:"Drawn from the `metrics.node-processes-snapshot` event this node already emits on a fixed cadence — this page adds no sampling of its own. It is read back through `metricsProvider.getLoadSeries`, the ONE reader over both retention tiers: the node keeps its last 180 snapshots in memory, and the hub keeps the operator retention on disk.",durableYes:`The durable tier answered, so this window survives closing the page AND a node restart.`,durableNo:`The durable tier did NOT answer — this window is the in-memory ring alone (about an hour) and a node restart clears it.`,windowSince:`Showing from {{since}}.`,reduced:`{{samples}} raw snapshots, reduced to one point per {{bucket}}s. A point carries its bucket MAXIMUM, never a mean — a mean would smear away the spike this chart exists to find.`,unreduced:`{{samples}} raw snapshots, one point each.`,noThreadSplit:`No thread-level CPU split on this node — /proc/<pid>/task is Linux-only, and the first sample after a restart has no window to measure. CPU below falls back to the ps lifetime AVERAGE, which is not a rate.`,loadingRetained:`Reading the retained series from this node…`,waitingFirstSample:`No retained samples for this node — waiting for the next snapshot. The chart needs two to draw a rate.`,bucketRoot:`Node supervisor`,bucketUnattributed:`Unattributed processes`,processCount:`{{count}} process(es)`,cpuTitle:`CPU % of one core`,cpuTitleLifetime:`CPU % (ps lifetime average)`,seriesMain:`Main threads`,seriesGc:`GC / V8 helpers`,cpuUnavailable:`No thread split on this node. Lifetime average: {{avg}}%`,memoryTitle:`Memory RSS`,memoryUnavailable:`No memory samples yet.`},cameraAttribution:{title:`Per-camera load — what can be attributed`,intro:`This table is the gate for the charts above, not a footnote to them: a family is drawn per camera only when it is genuinely measured AND readable today. Detection runs on a pool shared by every camera and can only be counted, never measured — it is shown as one shared total and never divided. Streaming is per-camera by construction and still unreadable, because only an ffmpeg-backed source spawns a child. A chart of a number the system cannot attribute is worse than no chart.`,measured:`Measurable per camera`,accounted:`Countable only (shared pool)`,unattributable:`Not attributable`,colFamily:`Load`,colAttribution:`Attribution`,colUnit:`Unit of work`,colChartable:`Chartable today`,colMissing:`What is missing`,unitNotSortable:`No meaningful order — the cell describes a mechanism, not a value.`,missingNotSortable:`No meaningful order — the cell is an explanation, not a value.`,evidence:`Evidence ({{count}})`},cameraLoad:{title:`Per-camera load — measured, on this node`,intro:"Each addon reports its OWN cost through the `load-contribution` capability — the recorder does not have to be told which camera its ffmpeg serves, it spawned it. Nothing here joins a pid to a camera. Only families that are measured AND readable today are drawn ({{roles}}); the rest are named below rather than estimated.",windowNote:`CPU is a DELTA of the cumulative counters, over the same fixed cadence the node already emits its process snapshot on — this panel adds no sampling and reads nothing while it is closed. Contributions are not stored anywhere, so unlike the per-addon charts above this window starts when you open this panel.`,windowSince:`Differencing since {{since}} ({{count}} windows).`,readFailed:`Could not read the load contributions: {{error}}. This is a failed read, NOT an idle cluster.`,loading:`Reading what the addons report…`,waitingWindow:`No per-camera window yet. A rate needs two readings, and the second arrives with the next process snapshot. A node running no decode, transcode or recording child stays empty — which is the truth, not a failure.`,deviceLabel:`Camera {{deviceId}}`,unitCount:`{{count}} unit(s): {{roles}}`,cpuTitle:`CPU % of one core (delta)`,cpuUnavailable:`No measurable window yet — every window so far contained a unit that started, stopped or reported no counter.`,memoryTitle:`Memory RSS`,memoryUnavailable:`No memory reported for this camera.`,coverage:`Addons claim {{claimed}} of the {{observed}} camstack processes this node reports.`,coverageUnknown:`No process snapshot from this node yet, so nothing can be said about what is unclaimed. That is different from "everything is claimed".`,noUnclaimed:`Nothing is unclaimed on this node.`,unclaimed:`{{count}} process(es) nobody claims, holding {{rss}}. Either a leak or a cost family nobody has taught to report — they stay in their own bucket and are never folded into a camera. CPU is unknown for them: the observer measures RSS and reports no cumulative CPU seconds.`,sharedTitle:`Shared — declared as belonging to no camera`,sharedNote:`Reported so the shared cost is visible as shared instead of invisible. It is NOT divided across the cameras present: the inference pool is one process serving all of them, and an apportioned share is an estimate, not a measurement. These totals are cumulative since each unit started — not a rate.`,sharedRow:`{{roles}} — {{units}} unit(s), {{cpu}} CPU-seconds, {{rss}}`,refusedTitle:`Reported per camera, and still not charted`,refusedRow:`— {{count}} entr(ies) from {{addons}}. {{reason}}`},deviceMigrate:{title:`Migrate to…`,subtitle:`Replace this camera with other hardware you have already adopted. The new camera inherits number {{deviceId}}, so recordings, rules and integrations follow it.`,pickerLabel:`Replacement camera`,pickerPlaceholder:`Select a camera…`,pickerPending:`Reading the fleet…`,noTargets:`No other camera is adopted, so there is nothing to migrate to.`,action:`Migrate`,running:`Migrating…`,confirmTitle:`Replace “{{source}}” with “{{target}}”?`,confirmMessage:`“{{target}}” takes over number {{sourceId}}. That number is what every recording, event, rule, zone and home-automation export of “{{source}}” is filed under, so all of it follows the number to the new hardware and keeps working. “{{source}}” is switched off and handed number {{targetId}} in exchange. This swaps two device identities and cannot be undone from here.`,confirmAction:`Migrate`,failed:`Migration failed: {{error}}`,swapped:`The replacement now answers on number {{inheritedId}}; the old camera was handed number {{retiredId}}.`,quiet:`Every function on the replaced camera was switched off — the old hardware is quiet.`,stillLive:`The replaced camera could not be reached, so these functions are STILL RUNNING on the old hardware. Nothing here failed to migrate — but until you unplug it or reach it physically, it can still produce data.`,neverOffered:`The replaced camera never offered these, so there was nothing to switch off. They are not running.`},locations:{filter:{searchPlaceholder:`Search by name…`,typesLabel:`Filter by type`,clear:`Clear filters`,noMatch:`No device matches this filter.`},unassigned:{searchLabel:`Search devices not in a room`},room:{searchLabel:`Search devices in {{room}}`,add:`Add`,addTo:`Add devices to {{room}}`,addDialogTitle:`Add devices to {{room}}`,alreadyHere:`Already in this room`,suggestedUnassigned:`Not in a room yet`},roomPicker:{label:`Room`,placeholder:`Choose a room`,unassigned:`Unassigned`},addDialog:{cancel:`Cancel`,confirm:`Add {{count}}`,nonePicked:`Nothing picked yet`},links:{noRoom:`No rooms yet. Add one on the Locations tab.`,noCameras:`No camera is assigned to “{{room}}”.`,loading:`Reading linked devices…`,unreadable:`Linked devices could not be read: {{reason}}`,unsupported:`This camera does not keep a linked-devices list.`,none:`No linked devices.`,implied:`automatic`,edit:`Edit links`,addNamed:`Link devices to {{camera}}`,pickTitle:`Link devices to {{camera}}`,alreadyLinked:`Already linked`,suggested:`Suggested · {{room}}`},columns:{device:`Device`,type:`Type`,status:`Status`,noSort:`Accessories follow their parent — this list keeps its order.`},rebuildLinkedDevices:`Rebuild linked devices`,noCameraIsAssignedTo:`No camera is assigned to “{{room}}”.`,replaceTheLinkedDeviceList:`Replace the linked-device list of every camera in “{{room}}” with what the room contains? {{lines}} Anything linked by hand that is not in this room is lost.`,rebuild:`Rebuild`,notRebuilt:`Not rebuilt: {{value1}}`,deleteLocation:`Delete location`,deleteTheLocation:`Delete the location “{{name}}”?{{extra}}`,deleteZone:`Delete zone`,deleteTheZoneTheRooms:`Delete the zone “{{name}}”? The rooms in it are kept.`,loadingLocationsAndDevices:`Loading locations and devices…`,everyTopLevelDeviceHas:`Every top-level device has a room.`,noLocationsYetAddIngresso:`No locations yet. Add Ingresso, Salone, Cucina…`,locations:`Locations`,roomsAndAreasOfThe:`Rooms and areas of the site. Assign any device here — storage disks are under Data → Storage.`,cameraLinks:`Camera links`,zones:`Zones`,locationCard:{rename:`Rename`,rebuildLinkedDevices:`Rebuild linked devices`,rename2:`Rename {{name}}`,cancelRename:`Cancel rename`,actionsFor:`Actions for {{name}}`,nothingHereYetAssignA:`Nothing here yet — assign a device from the table below.`},locationDescriptionField:{whatIsThere:`What is there`,surfacesBoundariesWhatIsNormally:`Surfaces, boundaries, what is normally parked or stored here.`,givenToTheAiWith:`Given to the AI with the pictures, so it knows what it is looking at. Describe the PLACE, not what happens in it — events change, the ground does not.`},locationZoneField:{none:`— none —`,zone:`Zone`},newLocationButton:{newLocation:`New location`,ingressoSaloneCucina:`Ingresso, Salone, Cucina…`,newLocationName:`New location name`,cancelNewLocation:`Cancel new location`},newZoneButton:{newZone:`New zone`,zonaGiornoZonaNotte:`Zona giorno, Zona notte…`,newZoneName:`New zone name`,cancelNewZone:`Cancel new zone`},siteZonesPanel:{icon:`Icon`,zone:`Zone`,rename:`Rename {{label}}`,renameTheZone:`Rename the zone`,rooms:`Rooms`,actions:`Actions`,delete:`Delete {{label}}`,deleteTheZoneTheRooms:`Delete the zone — the rooms in it are kept`,noZonesYetAZone:`No zones yet. A zone groups rooms — “Zona notte” for the bedrooms — and shows up before them in the app’s camera filter.`},unassignedTable:{clearSelection:`Clear selection`,selectAllUnassignedDevices:`Select all unassigned devices`,select:`Select {{name}}`,device:`Device`,type:`Type`,status:`Status`,accessoriesInTow:`Accessories in tow`,assignTo:`Assign to`,locationFor:`Location for {{name}}`,notInARoom:`Not in a room`,topLevelDevicesOnlyAccessories:`Top-level devices only — accessories move with their parent.`,bulkAssignment:`Bulk assignment`,assignSelectedDevicesTo:`Assign selected devices to`,assignTo2:`Assign to…`,assign:`Assign`,clear:`Clear`}},deviceDisplay:{title:`Display`,icon:`Icon`,label:`Label`,unit:`Unit`,precision:`Precision`,precisionInherit:`inherit`,hidden:`Hidden`,hideFromLists:`Hide from device lists`,unitSource:`Source{{unit}}`,inherited:`Default ({{name}})`,inheritedContainer:`Default (the primary child's icon)`,pickIcon:`Change the icon of {{name}}`,iconFor:`Icon for {{name}}`,iconSearchPlaceholder:`Search icons`,iconNoMatches:`No icon matches that`,iconCategory:{devices:`Devices`,home:`Home`,security:`Security`,buildings:`Buildings`,connectivity:`Connectivity`,multimedia:`Multimedia`,nature:`Nature`,weather:`Weather`,transportation:`Transport`,animals:`Animals`,accessibility:`Accessibility`,account:`Account`,arrows:`Arrows`,brands:`Brands`,charts:`Charts`,communication:`Communication`,cursors:`Cursors`,design:`Design`,development:`Development`,emoji:`Emoji`,files:`Files`,finance:`Finance`,"food-beverage":`Food and drink`,gaming:`Gaming`,layout:`Layout`,mail:`Mail`,math:`Math`,medical:`Medical`,navigation:`Navigation`,notifications:`Notifications`,photography:`Photography`,science:`Science`,shapes:`Shapes`,shopping:`Shopping`,social:`Social`,sports:`Sports`,sustainability:`Sustainability`,text:`Text`,time:`Time`,tools:`Tools`,travel:`Travel`},setRoleDefault:`Set as default for all {{role}} sensors`,setRoleDefaultTitle:`Apply this unit / precision / icon as the default for every {{role}} sensor`,inheritedRoleDefault:`Default ({{icon}} — the {{role}} role default)`},customize:{loadingDevice:`Loading the device…`,deviceUnreadable:`The device could not be read`,noSuchDevice:`No device {{deviceId}} exists.`,composerAbsent:`The composer is not running on this hub: customizations are stored, but nothing computes them.`,status:{pending:`Reading this device's customization…`,unknownTitle:`The customization could not be read`,notLoaded:`Customizations are not loaded yet: {{reason}}`,off:`Off`,composerUnreachable:`The composer did not answer: {{reason}}`},blockStatus:{stopped:`Stopped`,starting:`Starting`,running:`Customization active`,degraded:`Degraded`,failed:`Failed`},remove:{button:`Remove customization`,title:`Remove this customization?`,message:`Every added function is removed and every replaced field goes back to the integration's own value, exactly as before.`,confirm:`Remove`},composed:{body:`This device is composed: every field comes from its composition.`,edit:`Edit its composition`},identity:{title:`Identity`,role:`Role`,noRole:`— none —`,name:`Name`,room:`Room`,hidden:`Hidden`},picker:{search:`Search a device`,loadingDevices:`Loading devices…`,devicesFailed:`The devices could not be listed`,loadingFields:`Reading this device's fields…`,fieldsFailed:`This device's fields could not be read`,valuesFailed:`Live values could not be read: {{reason}}`,fields:`Fields`,hidden_one:`{{count}} field is not {{kind}} and cannot be used here`,hidden_other:`{{count}} fields are not {{kind}} and cannot be used here`,cancel:`Cancel`},kinds:{number:`a number`,string:`text`,boolean:`true/false`,enum:`one of a list`},doorbell:{title:`Doorbell`,add:`+ Add source`,active:`Active`,pickTitle:`Add doorbell source`,removeWhat:`The doorbell source {{name}}`,otherFormula:`Composed by another formula — edit it in Advanced`},motion:{title:`Motion`,add:`+ Add sensor`,pickTitle:`Add motion sensor`,camera:`Camera motion`,cameraState:{always:`always included`,"when-confirmed":`only when confirmed`,never:`replaced`,passes:`passes through`},mode:{"in-addition":`In addition`,confirm:`Confirm`,replace:`Replace`},modeFor:`Mode of {{name}}`,reading:`Reading the attached sensors…`,unreadable:`The attached sensors could not be read: {{reason}}`,notForwarded:{"onboard-not-listed":`Sensors are not forwarded: its detection does not list its onboard motion. The camera's own motion passes through.`,"no-active-detection":`Sensors are not forwarded: it has no active detection. The camera's own motion passes through.`},notEnforced:`This camera's provider does not support Confirm and Replace yet: the camera's own motion passes through until it is updated`,state:{offline:`offline`,missing:`not found`,unsupported:`cannot drive motion`,unreadable:`could not be read`},removeWhat:`The sensor {{name}}`,olderOrchestrator:`This camera's orchestrator is older than sensor modes: update it to change the attached sensors`,refetchFailed:`The attached sensors could not be re-read after the change: reload to edit them again`,cameraLevelUnknown:`Unknown: the orchestrator has not heard the camera itself since it started, or is older than this view`,cameraLevelOwn:`The camera's own motion, as it last said it ({{at}}) — not what the sensors make of it`,tooMany:`A camera takes at most {{max}} sensors`},assign:{search:`Search a device`,filtersLabel:`Filter by kind`,loadingDevices:`Loading devices…`,devicesFailed:`The devices could not be listed`,noCompatible:`No compatible device`,showMore_one:`Show {{count}} more`,showMore_other:`Show {{count}} more`,cancel:`Cancel`,addCount_one:`Add {{count}}`,addCount_other:`Add {{count}}`,add:`Add`,change:`change`,stepDevice:`1 · Device`,stepField:`2 · Field`,stepDetails:`3 · Name`,filters:{motion:`Motion & presence`,contact:`Contacts`,all:`All compatible`},value:{active:`active`,inactive:`inactive`,open:`open`,closed:`closed`},checking:`Checking…`,unknown:`Could not be checked: {{reason}}`,removeNamed:`Remove {{name}}`,none:`None`,missingKept:`Device not found — kept until you remove it`,devicesUnreadable:`The devices could not be listed: {{reason}}`,native:`Native`,replaces:`replaces`,adds:`added`,pickUnusable:`This field cannot be used here`,removeConfirm:{title:`Remove this?`,message:`{{what}} will be removed.`,last:`It is the last function of this customization: the whole customization is removed, and every field goes back to its integration's own value.`,confirm:`Remove`}},saveInFlight:`Another change is still being saved — try again in a moment`,battery:{title:`Battery`,native:`Native battery`,replace:`Replace with another field`,add:`+ Add battery`,otherFormula:`Composed by another formula — edit it in Advanced`,removeWhat:`The battery from {{name}}`,nativeReplaced:`Native · replaced`},numericTransforms:{title:`Numeric transforms`,blurb:`Publishes a converted or inverted value to every consumer (export, rules, history). Display unit and precision stay on Overview.`,publishUnit:`Publish as unit`,fromUnit:`Native unit: {{unit}}`,fromUnknown:`Native unit not known yet`,toUnit:`Target unit`,pickUnit:`Choose unit…`,applyConvert:`Publish converted value`,clearConvert:`Remove unit convert`,convertRefused:`Those units cannot be converted`,invert:`Invert`,invertBlurb:`Negate the device's own boolean so active and inactive swap.`,applyInvert:`Invert value`,clearInvert:`Remove invert`,invertRefused:`This device cannot be inverted`,script:`Script`,scriptBlurb:`Expression over v (the native value). Clears a plain unit convert when published (v1).`,applyScript:`Publish script`,clearScript:`Remove script`,preview:`{{source}} → {{result}}`,previewWaiting:`Waiting for the live value…`,previewError:`Preview: {{reason}}`,previewRuntimeOnly:`This expression only runs on the composer`},consumables:{title:`Consumables`,add:`+ Add consumable`,pickTitle:`Add consumable`,name:`Name`,unit:`Unit`,units:{percent:`%`,days:`days`,hours:`hours`,cycles:`cycles`},removeWhat:`The consumable {{name}}`,otherFormula:`Composed by another formula — edit it in Advanced`,takenBy:`An item with this name exists: {{name}}`,keyless:`The name needs at least one letter or digit`,outOfRange:`Not added: the field reads {{value}}, outside the unit's range (% is 0–100, a count is 0 or more) — pick another field or unit`},linked:{title:`Linked devices`,add:`+ Link`,pickTitle:`Link devices`,device:`Device`,type:`Type`,controls:`Controls with the camera`,controlsAlways:`Every linked device's controls show with the camera`,yes:`Yes`,tracked:`On camera timeline`,trackFor:`Show {{name}} on this camera's timeline`,trackedHint:`Timeline rows only — notifications photograph every linked camera without this switch.`,health:{missing:`not found`,foreign:`not readable by its owner`,unavailable:`not a valid link now`},removeWhat:`The link to {{name}}`,notLinked:`no longer linked — still on timeline`},changes:{title:`What changes on the device`,reading:`Reading this device's fields…`,unknown:`What changes could not be listed: {{reason}}`,origin:{added:`added · from {{from}}`,replaced:`replaced · from {{from}}`},motion:{camera:`camera`,"in-addition":`{{name}}`,confirm:`confirm {{name}}`,replace:`replace {{name}}`},value:{stale:`stale: {{reason}}`,unavailable:`unavailable: {{reason}}`,unknown:`unknown: {{reason}}`},noRows:`Stored, but it changes no field yet.`,kind:{added:`added`,replaced:`replaced`},originUnread:{pending:`{{kind}} · reading the source names…`,unknown:`{{kind}} · the source names could not be read: {{reason}}`}},advancedLink:`Advanced — expression editor`,suggest:{heading:`Suggested · {{location}}`,hint_one:`{{count}} suggested · {{location}}`,hint_other:`{{count}} suggested · {{location}}`,in:`in {{container}}`,add:`Add`,addNamed:`Add {{name}}`,addAll:`Add all {{count}}`,use:`Use`,useNamed:`Use {{name}}`}},compositionEditor:{now:`the time of this evaluation (ms)`,builtins:{min:`smallest number`,max:`largest number`,abs:`absolute value`,floor:`round down`,ceil:`round up`,sqrt:`square root`,round:`round to digits`,pow:`x to the power y`,clamp:`keep x between lo and hi`,avg:`average, ignores nulls`,sum:`sum`,coalesce:`first value that is not null`,age:`ms since ts`,convert:`convert between units of one kind`,any:`true if one is true`,all:`true if all are true`,within:`true if ts is at most ms ago`,number:`a number from a number or numeric text, else null`,latest:`the most recent timestamp`,rose:`time of the last rise of a level (has memory)`,count:`how many times x advanced (has memory)`},pageTitle:`Composed device`,loading:`Loading the composition…`,loadFailed:`The composition could not be read`,notFound:`No composition {{blockId}}.`,notComposition:`This block is not a composition.`,customizationUnknownDevice:`This is the customization of a device the composer has not reported yet.`,openOnDevice:`Open it on the device page`,existingTarget:`Customization of {{name}}: add functions or replace single fields; the rest stays its integration's.`,name:`Name`,required:`required`,takeFrom:`Take from…`,formula:`Formula`,formulaFor:`Formula for {{path}}`,clear:`Clear`,addSource:`+ Add source`,removeBinding:`Remove binding {{name}}`,copyFeature:`Copy the whole feature from…`,replaces:`replaces`,replaceIn:`Replace a field of {{cap}}`,removeFeature:`Remove {{cap}}`,suggestions:`Suggestions`,save:`Save`,cancel:`Cancel`,steps:{target:`1 · Target`,features:`2 · Features`,fieldsOf:`3 · Fields — {{cap}}`,verify:`4 · Verify and save`},verify:{checking:`Checking with the server…`,ok:`✓ No problems: types, sources, cycles and ownership all check out.`,unknown:`Could not check: {{reason}}`},preview:{label:`Live preview`,waiting:`waiting for {{sources}}`,runtimeOnly:`evaluated by the composer (this formula has memory)`,devicesFailed:`the device list could not be read: {{reason}}`,unknownDevice:`no device is registered for {{sources}}`},reading:`Reading this device's fields…`,checking:`Checking what this device can be given…`,unknown:`Some functions could not be checked: {{reason}}`,added:`+ added`,targetType:`Type`,templates:{label:`Start from`,room:`Room`,"converted-sensor":`Converted sensor`,"derived-binary":`Derived binary`,confirmTitle:`Replace your draft?`,confirmMessage:`Applying a template discards unsaved edits in this editor.`,confirmApply:`Apply template`},openComposedDevice:`Open composed device #{{id}}`},notificationRules:{groups:{system:`System events`,class:`Detections`,zones:`Zones`,label:`Faces, plates & labels`,quality:`Quality`,scope:`Only while`,device:`Device event`,package:`Package`,occupancy:`Occupancy`,audio:`Sound`,schedule:`Schedule`},labels:{classes:`Object classes`,zones:`Zones`,faces:`Known faces`,labels:`Labels`,crossing:`Zone crossing`,source:`Detection source`,add:`Add a label…`},crossing:{enter:`Entering`,exit:`Leaving`,any:`Entering or leaving`,hint:`Which way the subject crosses the zone.`},zones:{group:`Zones`,noCameras:`This rule covers no camera, so it has no zones.`},faces:{group:`Known faces`,anyKnown:`Any known face — nobody in particular`},scene:{hint:`Only fire while a scene is matched or diverged.`,noGate:`— no scene gate —`,none:`No scenes yet — create one on the Scenes page.`,onlyWhile:`Only while it is`,read:`Read`,readOwn:`The scene's own setting`,rightNow:`Right now:`,missing:`This scene no longer exists — pick another or remove the gate.`},snooze:{title:`Silence this rule for {{minutes}} minutes`,failed:`The snooze could not be changed.`,aria:`snooze {{name}}`},delete:{confirm:`Delete this rule?`,message:`This will permanently delete "{{name}}". This action cannot be undone.`,aria:`delete {{name}}`},columns:{snooze:`Snooze`},devices:{compatLoading:`Checking which devices this rule's kind can use…`,compatFailed:`Couldn't check which devices this rule's kind can use — every device is listed. The hub still refuses an incompatible one on save.`},media:{sensorOneSnapshot:`A sensor rule attaches one snapshot of the camera automatically — there is no detection to choose a crop, a GIF or a clip around.`},status:{grouped:{unknown:`Open windows unknown — {{reason}}`,none:`No window open`,windows_one:`{{count}} open window`,windows_other:`{{count}} open windows`,waiting:`{{count}} waiting`,windowLine:`{{camera}} · {{members}} in the window · {{pending}} waiting · closes within {{seconds}} s`}},grouping:{choice:`Immediate, grouped`,seconds:`Group for (seconds)`,hint:`Immediate, grouped — waits up to {{n}} s for subjects to be recognised, then sends one message with a mosaic, one picture per subject. Closes earlier when every subject is final.`,plainRecognitionHint:`Fires only if the name is already known when an event is written — choose Immediate, grouped to wait for it.`,scopedHint:`A subject not recognised within {{n}} s is not notified.`,minNote:`At least 5 s: subjects arriving together share one message.`},alarmNotify:{title:`Notifications in this mode`,duringEntryDelay:`Notify during the entry delay`,duringEntryDelayHint:`Off: the entry-delay notification is the only one until the alarm triggers. On: each match of an alarm rule is its own "Intrusion — <location>" notification.`,rewatched:`Notify “watched again”`,rewatchedHint:`A bypassed sensor that closed and opened again is watched once more. Never sent when that same opening starts the entry delay.`,ignored:`Notify ignored sensors`,ignoredHint:`A bypassed sensor that really moved while armed set nothing off. Never sent for a sensor that was simply still open, came back after a dropout, or repeated itself.`}},ruleScope:{mode:{all:`All`,only:`Only these`,except:`All except these`},which:`Which {{items}}`,items:{devices:`devices`,classes:`classes`,zones:`zones`,faces:`faces`,labels:`labels`},every:{devices:`Every device — no restriction.`,classes:`Every class — no restriction.`,zones:`Every zone — no restriction.`,faces:`Every face — no restriction.`,labels:`Every label — no restriction.`},legacy:`This rule also excludes {{items}} — kept when you save.`,removeExclusions:`Remove exclusions`,cleared:`Saving in this mode clears {{items}} from the rule.`},inlineEdit:{editName:`Edit name`,editLocation:`Edit location`,save:`Save`,cancel:`Cancel`},connectPhone:{title:`Connect a phone`,description:`Scan the code with your phone to open the CamStack app (or the web viewer) on this hub. The link carries only the hub address — no token, no credentials.`,signInHint:`The app then signs in with your usual login: password (and TOTP code, if enabled) or "Sign in with CamStack".`,addressLabel:`Hub address for the phone`,copyLink:`Copy link`,linkLabel:`Pairing link`,qrAlt:`QR code that opens the CamStack app on this hub`,loading:`Reading this hub's addresses…`,error:`Could not read this hub's addresses: {{message}}`,retry:`Retry`,empty:`This hub advertises no address a phone can reach (no tunnel, no mesh, no LAN interface). Check Cluster → Network.`,insecure:`Plain HTTP address: the app can use it on this network, but the browser fallback page only accepts https hubs. Prefer the tunnel or the mesh address when one exists.`,implausible:`The hub marks this address as unlikely to be reachable from a phone.`,tier:{public:`Public tunnel`,mesh:`Tailscale (MagicDNS)`,lan:`Local network`,"lan-ipv6":`Local network (IPv6)`}},storage:{addLocationWizard:{type:`Type:`,loadingProviders:`Loading providers…`,node:`Node`,path:`Path`,connectionOk:`Connection OK.`,testFailed:`Test failed: {{value1}}`,testing:`Testing…`,testConnection:`Test connection`,displayName:`Display name`,on:`{{type}} on {{displayName}}`,autoDerivedOverrideIfNeeded:`— auto-derived; override if needed`,format:`Format:`,typeSlug:`<type>:<slug>`,enableImmediately:`Enable immediately`,aDisabledLocationReceivesNo:`A disabled location receives no writes until enabled — reads and age-based retention still work, nothing new lands here. Leave this off to register the disk now and start using it later.`,saving:`Saving…`},drainProgressLine:{thisLocationIsDrainingThe:`This location is draining. The hub has not reported how much is left yet — either the drain has just been set, or this hub predates the drain-progress report.`,drainingRemainingNotReportedYet:`Draining · remaining not reported yet`,everythingThatWasHereHas:`Everything that was here has been moved. The location is still in drain mode — it receives no new writes until you change that.`,drainedNothingLeftToMove:`Drained · nothing left to move`,drainProgress:`Drain progress`,theDrainIsPacedBy:`The drain is paced by how fast this class of data is still growing, and that has not been observed yet. There is no date to give.`,emptyTimeNotKnownYet:`· empty time not known yet`},editLocationModal:{displayName:`Display name`,node:`Node`,path:`Path`,connectionOk:`Connection OK.`,testFailed:`Test failed: {{value1}}`,testing:`Testing…`,testConnection:`Test connection`,saving:`Saving…`},pathBrowser:{newFolder:`new folder`,create:`Create`},protectionPolicyField:{protectedFreeSpace:`Protected free space`,protectionUnit:`Protection unit`,ofTheVolume:`% of the volume`,gbOfFreeSpace:`GB of free space`},locationCapacityBar:{capacityUnknown:`Capacity unknown`,capacityUnknownCamstackHolds:`Capacity unknown · CamStack holds {{owned}}`},locationCard:{deleteLocation:`Delete location`},locationDiscardControl:{discardLeftoversOn:`Discard leftovers on "{{displayName}}"?`,permanentlyDeletesLeftoverFilesAnd:`Permanently deletes leftover files and records on this location. Other locations are not affected. This cannot be undone and may take hours.`,discardLeftovers:`Discard leftovers`,permanentlyDeleteLeftoverFilesOn:`Permanently delete leftover files on this location. Other locations are not affected.`},locationGroup:{singleOneLocationPerType:`Single — one location per type. Edit the existing entry; it can't be split.`,noLocationRegisteredClickAdd:`No location registered. Click "Add" to register one.`,noLocationRegisteredYetShould:`No location registered yet — should be auto-seeded at next boot.`},locationModeSelector:{locationState:`Location state`,locationStateChoices:`Location state choices`,closeLocationStateChoices:`Close location state choices`}},pipeline:JSON.parse(`{"cameraAssignmentsTable":{"camera":"Camera","placement":"Placement","rolesHere":"Roles here","runningOn":"Running on","status":"Status","filterByCameraActivity":"Filter by camera activity"},"cameraStatusStrip":{"cameras":"Cameras","fpsMsInferQ":"{{name}} · {{label}} · {{value3}} fps · {{value4}}ms infer · q={{queueDepth}}"},"clusterDetail":{"clusterOrchestration":"Cluster Orchestration","cameraAssignmentsLoadBalancingThe":"Camera assignments, load balancing, the detector recommendation, cluster roles and settings."},"clusterStepModel":{"oneValueForTheWhole":"One value for the whole cluster — this step writes into a shared vector index, where two encoders make similarity scores meaningless.","changeInClusterSettings":"Change in Cluster → Settings ›","oneModelForEveryNode":"One model for every node and camera:"},"liveLoadPanel":{"liveLoad":"Live load","activeAttached":"Active / Attached","avgInferMs":"Avg infer ms","queue":"Queue","audio":"Audio","totalAgents":"Total agents","totalFps":"Total FPS","avgInferenceMs":"Avg inference ms","queueDepth":"Queue depth","agent":"Agent","cameras":"Cameras","inferenceMs":"Inference ms","noCameraMetricsReceivedYet":"No camera metrics received yet"},"nodeCameraAssignmentsTable":{"moveDetectionTo":"Move detection to {{name}}","moveAudioTo":"Move audio to {{name}}","unpinDetection":"Unpin detection","unpinAudio":"Unpin audio","camera":"Camera","rolesHere":"Roles here","status":"Status","move":"Move {{deviceName}}","loadingCameras":"Loading cameras…","noCameraRunsOnThis":"No camera runs on this node right now"},"nodeDetail":{"assignments":"Assignments","pipeline":"Pipeline","warmInstances":"Warm instances","logs":"Logs"},"nodeDetailHeader":{"nodeNotFound":"Node not found:"},"nodeList":{"cluster":"Cluster","assignmentsLoadBalancingRoles":"Assignments, load balancing, roles","pipelineEnabled":"Pipeline: enabled","pipelineNotEnabledAgentCapability":"Pipeline: not enabled (agent capability)","pipe":"Pipe","audioEnabled":"Audio: enabled","audioNotEnabledAgentCapability":"Audio: not enabled (agent capability)","aud":"Aud"},"nodeLoadOverview":{"nodeLoad":"Node load","reading":"reading…","noClusterNodesReportedYet":"No cluster nodes reported yet.","noDetect":"no detect","onlineButItDidNot":"Online, but it did not answer the last load read — its numbers below are unknown, not zero.","runningAttached":"Running / attached","sessionsInInferenceNowCameras":"Sessions in inference now / cameras attached to this runner (the balancer's committed load) / operator cap.","targetShare":"Target share","theNodeShareAutomaticOr":"The node share (automatic or manual) normalised over the nodes the balancer actually ranks (online AND detect-enabled).","actualShare1H":"Actual share (1 h)","timeWeightedShareOfThe":"Time-weighted share of the cluster's PARALLEL detection sessions this node carried over the last hour — the quantity a share holds. '—' = no session ran here in the window.","peakYields":"Peak · yields","mostSessionsThisNodeRan":"Most sessions this node ran at once in the last hour, and how many share turns it handed to another node because it was full or drowning.","scoreQueue":"Score · queue","theCapacityScoreBalanceMinimises":"The capacity score balance() minimises (attached + queue depth), and the raw queue depth.","capFill":"Cap fill","attachedMaxcameras":"attached / maxCameras.","avgInfer":"Avg infer","meanInferenceTimeAcrossThis":"Mean inference time across this node's attached cameras.","decode":"Decode","thisNodeSProbedDecode":"This node's probed decode hwaccel.","acceleratorsNotReadYet":"Accelerators not read yet.","accelerators":"Accelerators","noDeviceIsACamera":"No device is a camera-root candidate on this node — sessions run on the runner's default (CPU) pool.","noneInPlayRunnerDefault":"none in play · runner default pool","notKnownTheNodeDid":"Not known: the node did not report, or runs a session no device accounts for.","atItsMaxsessionsCapThe":"At its maxSessions cap — the balancer skips it until a session ends.","atCap":"· at cap"},"settingsPanel":{"saving":"Saving…"},"clusterAssignmentsTab":{"cameraPlacement":"Camera placement","pinACameraToA":"Pin a camera to a node, or to one accelerator of its node; Auto lets each session pick. Decode always runs with detection. Load, shares and caps are on Load balancing."},"clusterAutoTuneTab":{"notChanged":"Not changed","device":"Device","capacity":"Capacity","detector":"Detector","why":"Why","nodeSettings":"Node settings","noChange":"No change.","stepDefault":"step default","cameraOverridesCleared":"Camera overrides cleared","none":"None.","modelRemoved":": model {{modelIdBefore}} removed","reset":"; {{value1}} reset","anotherApplyIsAlreadyRunning":"Another apply is already running.","theConfigurationChangedSinceThe":"The configuration changed since the plan was shown. Review the updated plan below and apply again.","aModelCouldNotBe":"A model could not be downloaded: nothing was changed.","autoTune":"Auto tune","picksForEveryAcceleratorThe":"Picks, for every accelerator, the most accurate YOLOv9 detector that still carries at least the chosen number of cameras at once, from the node's hardware and measured speeds. Nothing is measured or estimated about your cameras' activity. Applying it sets those models and clears every model and threshold override — node level and per camera — so each model runs its own default thresholds. Enabled steps, devices, pins, recording, notifications, zones and rules are not touched. There is no undo.","keepFree":"Keep free","shareOfEachAcceleratorKept":"Share of each accelerator kept free","ofEachAccelerator":"{{value1}}% of each accelerator","atLeast":"At least","minimumParallelSessionsPerDevice":"Minimum parallel sessions per device","computing":"Computing…","computePlan":"Compute plan","recompute":"Recompute","apply":"Apply…","applyAutoTune":"Apply auto tune?","theseAreAllTheChanges":"These are all the changes. Every override listed is removed and cannot be restored.","applying":"Applying…"},"clusterEventsTab":{"postProcessingNode":"Post-processing node","theSingleNodeThatRuns":"The single node that runs detection post-processing (events, media, audio & motion). Every other node stays inert — no multi-node balancing. Takes effect on addon restart.","hubDefault":"hub (default)","eventsFolder":"Events folder","whereEventCropsFullFrames":"Where event crops / full frames are stored. A single folder — no collection / equal-splitting."},"clusterLoadBalancingTab":{"placementPolicy":"Placement policy","howANewDetectionSession":"How a new detection session picks its node and device, and what happens when a node falls behind. 'Honour shares' (default) holds the shares below for PARALLEL sessions.","nodeShares":"Node shares","shareSource":"Share source","suggesting":"Suggesting…","suggestFromBenchmark":"Suggest from benchmark","suggestFromHardware":"Suggest from hardware","autoTune":"Auto tune","moveStandingAlwaysOnCameras":"Move standing (always-on) cameras that are no longer on their best node. Pinned cameras never move; on-motion sessions are placed per session anyway.","rebalancing":"Rebalancing…","rebalance":"Rebalance","policy":"Policy:","honourShares":"honour shares","automaticSharesAreBeingComputed":"Automatic shares are being computed from the cluster's measured capacity; the stored values are used meanwhile.","benchmarkEachNodeSShare":"Benchmark: each node's share follows its measured capacity from node benchmark results (hardware capacity where it has none)","hardwareEachNodeSShare":"Hardware: each node's share follows its capacity at its Auto tune model, from the measured speed of its hardware","recomputedWheneverANodeOr":", recomputed whenever a node or accelerator is added, removed, switched on or off, or changes model","maxConcurrentSessionsAdvanced":"Max concurrent sessions (advanced)","maxConcurrentSessionsFor":"Max concurrent sessions for {{name}}","aHardCapOnThe":"A hard cap on the sessions a node runs at once (always-on cameras count too). A node at its cap is never chosen; under shares its turn goes to a free node. Empty = unlimited.","accelerators":"Accelerators","noDetectCapableNodes":"No detect-capable nodes","enableDetectionOnANode":"Enable detection on a node in Roles & nodes to configure its accelerators.","suggestedFromBenchmark":"Suggested from benchmark","suggestedFromHardware":"Suggested from hardware","applySuggestedShares":"Apply suggested shares","notPartOfTheSuggestion":"not part of the suggestion — {{skippedReason}}","parallelSessions":"≈ {{capacitySessions}} parallel sessions · {{value2}}","measuredByNodeBenchmarksOr":"measured by node benchmarks, or from the hardware table where a node has no results","atTheModelsAutoTune":"at the models Auto tune picks (at least {{minSessionsPerDevice}} per accelerator), from the measured speed of each node's hardware","applyingWritesTheNodeAnd":"Applying writes the node and accelerator shares; the caps are advisory — apply each from its accelerator row.","automaticSharesAlreadyFollowThis":"Automatic shares already follow this; the caps are advisory — apply each from its accelerator row.","staleDevicePins":"Stale device pins","clearPin":"Clear pin"},"clusterOrchestratorLogsTab":{"orchestratorLogs":"Orchestrator logs","dispatchDecisionsBalancerMovesAnd":"Dispatch decisions, balancer moves and failover events from the pipeline orchestrator. Streaming live; the device chip on a line tells which camera it refers to."},"clusterRecordingTab":{"recordingNode":"Recording node","theSingleNodeThatRecords":"The single node that records (continuous & events) and serves playback. Every other node stays inert — no multi-node balancing. Takes effect on addon restart.","hubDefault":"hub (default)","recordingsFolders":"Recordings folders","whereRecordingsAreStoredMulti":"Where recordings are stored. Multi-location collections — segments are split across the locations of a type. Add a location to grow capacity; mark one default per type."},"clusterRolesNodesTab":{"loading":"Loading","clusterRoles":"Cluster roles","oneNodeHoldsEachRole":"One node holds each role for every camera. Detection shares and caps are on Load balancing.","nodeCapabilities":"Node capabilities"},"clusterSettingsTab":{"notAvailableTheAddonThat":"Not available — the addon that owns these settings did not answer."},"nodeCamerasTab":{"theRolesEachCameraRuns":"The roles each camera runs here right now. Move a role or unpin it from the row menu; pins for every camera are on Cluster → Assignments."},"nodeEnginesTab":{"killEngine":"Kill engine","inferenceEnginesOnThisNode":"Inference engines on this node","kind":"Kind","runtimeBackendDevice":"Runtime / Backend / Device","models":"Models","poolPid":"Pool PID","autoKill":"Auto-kill","inUse":"In use","kill":"Kill","noEnginesResidentTheFactory":"No engines resident — the factory spins up on the first pipeline run."},"nodeLiveTab":{"liveStatus":"Live status","runtimeMetricsForTheRunner":"Runtime metrics for the runner instance on this node. Refreshes every 2s.","inferenceLatency":"Inference latency","activeCameras":"Active cameras","throttled":"Throttled","queueDepth":"Queue depth","camera":"Camera","phase":"Phase","actualFps":"Actual FPS","queue":"Queue","inferenceMs":"Inference ms","noCamerasAttachedToThis":"No cameras attached to this runner"},"nodeLogsTab":{"runnerLogs":"Runner logs"},"nodePipelineTab":{"resetToHardwareAwareDefaults":"Reset {{nodeName}} to hardware-aware defaults?","thisClearsEveryPerDevice":"This clears every per-device model default on this node (back to the format default) and every per-camera step override scoped to it. Existing per-camera customisations on this node are lost.","resetFailed":"Reset failed","clearThisNodeSPer":"Clear this node's per-device model defaults + per-camera overrides scoped to this node","resetting":"Resetting…","resetToDefault":"Reset to default"},"storageLocationsPanel":{"disable":"Disable \\"{{displayName}}\\"?","nothingIsDeletedSetThe":"{{consequence}} Nothing is deleted — set the location back to Read-only or Active to bring its footage back.","deleteLocation":"Delete location \\"{{displayName}}\\"?","removesTheRecordFilesOn":"Removes the record; files on disk are untouched.","deleteAnyway":"Delete anyway?","forceDelete":"Force delete","noStorageLocationsDeclaredFor":"No storage locations declared for this purpose."},"pipelineView":"Pipeline view","nodes":"Nodes","cameras":"Cameras","pipeline":"Pipeline","detectionPlacementLoadAndPer":"Detection placement, load and per-camera runtime across the cluster.","hide":"Hide","show":"Show"}`),assignments:{assignmentStatusCell:{noMetricsInTheLast:`No metrics in the last 10 s — the camera has no session running`,noLiveData:`no live data`},clusterRowCells:{inferenceDevicePinNoNode:`Inference device pin (no node yet)`,anAcceleratorIsPinnedOn:`An accelerator is pinned on the camera's node; this camera has not run on one yet.`,anyAccelerator:`Any accelerator`,noSessionYet:`— no session yet`,anUnpinnedCameraIsPlaced:`An unpinned camera is placed again at every session start, so this can change between sessions.`,idleLastSession:`{{how}} · idle, last session`,streamBrokersOf:`Stream brokers of {{deviceName}}`,streamBrokersClients:`Stream brokers & clients`},placementControls:{nodePin:`Node pin`,autoLetsEachSessionPick:`Auto lets each session pick its node; a pin keeps the camera on one node.`,accelerator:`accelerator: …`,anyAccelerator:`Any accelerator`,inferenceDevicePin:`Inference device pin`,pinDetectionToOneAccelerator:`Pin detection to one accelerator of the node, or let each session pick.`}},cameras:{cameraPipelineCard:{pipelineStatus:`{{name}} pipeline status`,objectDetectionMode:`Object detection mode`,detectionOff:`detection off`,recording:`Recording ({{mode}})`,recordingMode:`Recording mode`,noPipelineStatusYetThe:`No pipeline status yet — the orchestrator has not composed a snapshot for this camera.`},camerasOverview:{loadingCameraPipelines:`Loading camera pipelines…`,noCamerasFound:`No cameras found`,withIssues:`with issues`,polledEvery5SDetection:`polled every 5 s · detection metrics live at 1 Hz`},cardPrimitives:{deviceLevelOverrideActive:`Device-level override active`},configBlocks:{manuallyPinned:`Manually pinned`,persistedSettingsPinForThis:`Persisted settings pin for this role`,whereItRuns:`Where it runs`,detection:`Detection`,decoder:`Decoder`,audio:`Audio`,source:`Source`,detectionPlacementPin:`Detection placement pin`,autoLoadBalanced:`Auto (load balanced)`,streamsMotion:`Streams & motion`,detectStream:`Detect stream`,detectFps:`Detect FPS`,motionSrc:`Motion src`,cameraSensors:`Camera sensors`,motionStream:`Motion stream`,motionFps:`Motion FPS`,cooldown:`Cooldown`,noStreamsRegistered:`No streams registered`,pipelineSteps:`Pipeline steps`,resolving:`Resolving…`,noStepsConfigured:`No steps configured`,audioClass:`Audio class.`},runtimeBlocks:{detectionRuntime:`Detection runtime`,mode:`Mode`,detectionStageInactiveOrUnreachable:`Detection stage inactive or unreachable`,inference:`Inference`,engine:`Engine`,provisioning:`Provisioning`,streamBroker:`Stream broker`,brokerStageInactiveOrUnreachable:`Broker stage inactive or unreachable`,noBrokerProfiles:`No broker profiles`,subscribers:`Subscribers`,decoder:`Decoder`,decoderStageInactiveOrUnreachable:`Decoder stage inactive or unreachable`,node:`Node`},streamsTab:{streamProfiles:`Stream Profiles`,autoAssign:`Auto-assign`,noStreamsAvailable:`No streams available`,notAssigned:`— Not assigned —`,availableStreams:`Available Streams`,reProbe:`Re-probe`,rtspRestream:`RTSP Restream`,host:`Host:`,rtspRestreamProviderNotAvailable:`RTSP restream provider not available — capability may not be loaded yet`,restreamEnabledClickToDisable:`Restream enabled — click to disable`,restreamDisabledClickToEnable:`Restream disabled — click to enable`,regenerateRtspToken:`Regenerate RTSP Token`,regenerateRtspTokenForThe:`Regenerate RTSP token for {{profileLabel}}? The current URL will stop working and a new one will be generated.`,regenerate:`Regenerate`,regenerateRtspTokenCurrentUrl:`Regenerate RTSP token (current URL will change)`,muted:`Muted`,videoOnlyNoAudio:`Video only — no audio`,restreamDisabledRtspClientsWill:`Restream disabled — RTSP clients will receive 403`,clickToCopy:`Click to copy: {{url}}`,resolution:`Resolution`,codec:`Codec`,frameRate:`Frame Rate`,noMetadataAvailableClickRe:`No metadata available — click Re-probe to detect stream properties`,sourceUrl:`Source URL`}},placementBoard:{nodeCapabilitiesTable:{node:`Node`,on:`{{label}} on {{name}}`,noClusterNodesReportingYet:`No cluster nodes reporting yet.`},nodeInferenceDevices:{singleDefault:`single default`,autoDefault:`auto default`,probingAccelerators:`Probing accelerators…`,noInferenceDevicesReportedBy:`No inference devices reported by this node's platform probe.`,maxConcurrentSessionsFor:`Max concurrent sessions for {{label}}`,enable:`Enable {{label}}`,acceleratorShare:`Accelerator share`,automaticEachAcceleratorSShare:`Automatic: each accelerator's share follows its measured throughput at its model. Switch the node shares to manual to set them yourself.`,dragToShiftTheShare:`Drag to shift the share of detection sessions each accelerator handles; lock one to pin its share while the others rebalance. Shares always sum to 100%.`,failedToSaveInferenceDevices:`Failed to save inference devices:`,unknownError:`unknown error`,advisoryCapFromTheMeasured:`Advisory cap from the measured throughput at the suggested model, with the headroom kept free. Applying it writes this device's cap.`,nodeUnreachable:`Node unreachable`,thePlatformProbeCouldnT:`The platform probe couldn't be reached, so its live accelerator set is unavailable. Settings resume once the node reconnects.`},reachableHostInput:{reachableHostFor:`Reachable host for {{nodeId}}`,saveReachableHostFor:`Save reachable host for {{nodeId}}`,saveReachableHost:`Save reachable host`,saved:`Saved`,failedToSaveReachableHost:`Failed to save reachable host`},roleControls:{default:`{{name}} (default)`,node:`{{value1}} node`},weightSliderStack:{noDetectEnabledNodesEnable:`No detect-enabled nodes. Enable “Detect” on a node above to distribute detection weight.`,for:`{{weightLabel}} for {{name}}`,unlockAllowRebalancing:`Unlock — allow rebalancing`,lockThisShareWhenOthers:`Lock this share when others change`,draggingOneSliderSplitsThe:`Dragging one slider splits the rest equally across the unlocked nodes; lock a node to pin its share — locked nodes never move and the total always stays at 100%, so a drag is bounded by the room the unlocked nodes leave. Detection only distributes across nodes that can source a camera’s frames.`}},stepInspector:{clusterOwnedSettings:{clusterWideSettings:`Cluster-wide settings`,editInClusterSettings:`Edit in Cluster → Settings ›`,oneValueForEveryNode:`One value for every node and camera — this step writes into a shared index.`},effectiveModelSummary:{toChangeAModelOpen:`To change a model, open that accelerator's cell in the table.`},nodeStepInspector:{loadingPipeline:`Loading pipeline…`,catalogUnavailable:`Catalog unavailable.`,accelerators:`Accelerators:`,noneEnabled:`none enabled`,off:`— off:`,clusterLoadBalancing:`Cluster → Load balancing ›`,detectionSteps:`Detection steps`,noStepSelected:`No step selected.`,itRunsOnInstead:`It runs on {{shortLabel}} instead.`,itDoesNotRunHere:`It does not run here.`,runOn:`Run on`,autoThisAcceleratorOrThe:`Auto (this accelerator, or the next one that can run it)`,routesThisStepAndIts:`Routes this step (and its child steps) to another accelerator of this node.`,baseForEveryCameraThat:`{{slot}} · {{format}} · base for every camera that lands here`,everyAcceleratorOf:`{{slot}} · every accelerator of {{nodeName}}`,model:`Model`,enableOneInClusterLoad:`enable one in Cluster → Load balancing`,settings:`Settings`,thisStepSSettingsDiffer:`This step's settings differ between this node's accelerators. Saving makes the values shown here node-wide.`},stepMatrixFrame:{discardUnsavedChanges:`Discard unsaved changes?`,thisStepHasChangesThat:`This step has changes that are not saved yet.`,discard:`Discard`,filterStepsOrSettings:`Filter steps or settings /`,filterStepsOrSettings2:`Filter steps or settings`,stepSettings:`Step settings`}},detectionIntelligence:JSON.parse(`{"assignDialog":{"assignFacesToPerson":"Assign {{value1}} faces to person","assignFaceToPerson":"Assign face to person","selectAnExistingPersonOr":"Select an existing person or create a new one.","newPersonName":"New person name…","newPerson":"+ New person…","createAssign":"Create & assign"},"assignPlateDialog":{"assignPlatesToVehicle":"Assign {{value1}} plates to vehicle","assignPlateToVehicle":"Assign plate to vehicle","selectAnExistingVehicleOr":"Select an existing vehicle or create a new one.","newVehicleName":"New vehicle name…","newVehicle":"+ New vehicle…","createAssign":"Create & assign"},"cameraMultiSelect":{"clearSelection":"Clear selection"},"copyUrlChips":{"copyTheMediaUrl":"Copy the media URL","clipboardAccessWasRefusedSelect":"Clipboard access was refused. Select the URL below and copy it manually.","url":"{{label}} URL","copyUrl":"Copy {{label}} URL","copied":"Copied","local":"Local","copyLanUrl":"Copy LAN URL — {{AUTH_HINT}}","public":"Public","copyPublicUrl":"Copy public URL — {{AUTH_HINT}}"},"dateRangeFilter":{"fromDate":"From date","toDate":"To date"},"eventCard":{"eventFrom":"Event from {{cameraName}}","keyEventMediaUnavailable":"Key-event media unavailable","noKeyEventMedia":"No key-event media","deselect":"Deselect","select":"Select","clipSemanticMatchScore":"CLIP semantic-match score","markedForTraining":"Marked for training","trainingComplete":"Training complete","flaggedForDebug":"Flagged for debug","favourited":"Favourited"},"eventDetailPanel":{"snapshotCheckpointClickToView":"Snapshot checkpoint — click to view this frame","clipUnavailable":"Clip unavailable","couldNotResolveClipPlayback":"Could not resolve clip playback. Check the server logs.","deleteTrack":"Delete track","deleteThisTrackAndEvery":"Delete this track and every image and clip captured for it? This cannot be undone.","deleteFailed":"Delete failed","failedToDeleteThisTrack":"Failed to delete this track. Check the server logs.","eventDetail":"Event detail","keyFrameFrom":"Key frame from {{cameraName}}","keyFrameMediaUnavailable":"Key-frame media unavailable","viewClip":"View clip","bestShot":"Best shot","camera":"Camera","class":"Class","label":"Label","subLabel":"Sub-label","importance":"Importance","zonesVisited":"Zones visited","audioHeard":"Audio heard","totalDistance":"Total distance","firstSeen":"First seen","lastSeen":"Last seen","track":"Track"},"eventKindFilter":{"kinds":"Kinds ({{value1}})","kinds2":"Kinds","searchKinds":"Search kinds…","clear":"Clear","loadingKinds":"Loading kinds…","noKindMatchesThatSearch":"No kind matches that search.","theseCamerasAdvertiseNoEvent":"These cameras advertise no event kinds.","expand":"Expand"},"eventsSection":{"someTracksWereNotDeleted":"Some tracks were not deleted","failedToDeleteTracksOn":"Failed to delete tracks on: {{names}}. They remain selected — retry, or check the server logs.","minScore":"Min score","minimumImportance":"Minimum importance","ofEvents":"{{value1}} of {{value2}} events","newEventsRefresh":"New events — refresh","nothingMatchesTheFilter":"Nothing matches the filter","noKeyEventsInThis":"No key events in this window","widenTheDateRangeClear":"Widen the date range, clear cameras or kinds, or lower the min score.","capturedTracksAppearHereWhen":"Captured tracks appear here when the pipeline scores a key event."},"faceDetailPanel":{"face":"Face","faceDetail":"Face detail","fullFrameWithDetectedFace":"Full frame with detected face","detectedFace":"Detected face","noImage":"No image","theCropMediaForThis":"The crop media for this face could not be resolved (a pre-fix orphan). Safe to delete.","camera":"Camera","captured":"Captured","track":"Track","identity":"Identity"},"peopleList":{"loadingSamples":"Loading samples…","noSamplesYet":"No samples yet.","sample":"Sample","enrolledFromAnUploadedPhoto":"Enrolled from an uploaded photo","removeSample":"Remove sample","person":"Person","samples":"Samples","edit":"Edit {{name}}","delete":"Delete {{name}}","name":"Name","personName":"Person name…","trainingSamples":"Training samples","removeASampleToDrop":"Remove a sample to drop it from recognition training for this person.","deletePerson":"Delete person","deleteAndAllTheirSamples":"Delete {{name}} and all their samples? This cannot be undone.","loadingPeople":"Loading people…","addPerson":"Add person","enrolFromAPhoto":"Enrol from a photo","nothingMatchesTheFilter":"Nothing matches the filter","noPeopleEnrolledYet":"No people enrolled yet","clearTheSearchOrTry":"Clear the search or try another name.","addAPersonOrEnrol":"Add a person, or enrol faces from a photo.","noPeopleEnrolledYet2":"No people enrolled yet."},"photoEnrollDialog":{"ignoreThisFace":"Ignore this face","newPerson":"+ New person…","face":"Face {{value1}}","assignFace":"Assign face {{value1}}","notUsable":"Not usable","thisPhotoCouldNotBe":"This photo could not be analysed:","unknownError":"unknown error","noFacesWereFoundIn":"No faces were found in this photo. A face has to be reasonably large and facing the camera for the detector to measure it.","newPersonNameTypeThe":"New person name… (type the same name under another face to reuse it)","enrolFromPhotos":"Enrol from photos","everyPhotoIsAnalysedWith":"Every photo is analysed with the same face detector the cameras use, and all the faces found are reviewed below in one pass, grouped by photo. Assign each face to a person, or leave it ignored.","atLeast3PhotosPer":"at least 3 photos per person","choosePhotos":"Choose photos"},"plateDetailPanel":{"plate":"Plate","plateDetail":"Plate detail","fullFrameWithDetectedPlate":"Full frame with detected plate","detectedPlate":"Detected plate","noImage":"No image","theCropMediaForThis":"The crop media for this plate could not be resolved. Safe to delete.","plateText":"Plate text","saveCorrectedText":"Save corrected text","correctTheOcrReading":"Correct the OCR reading","camera":"Camera","captured":"Captured","confidence":"Confidence","vehicle":"Vehicle","track":"Track"},"recentPlates":{"plateFrom":"Plate {{text}} from {{cameraName}}","noCropImageThePlate":"No crop image — the plate's crop media is missing. Safe to delete.","noCrop":"No crop","deselect":"Deselect","select":"Select","manuallyCorrected":"Manually corrected","detachPlate":"Detach plate","detach":"Detach","assignPlateToVehicle":"Assign plate to vehicle","assignToVehicle":"Assign to vehicle","deletePlate":"Delete plate","ofPlates":"{{value1}} of {{value2}} plates","nothingMatchesTheFilter":"Nothing matches the filter","noPlatesRecognizedYet":"No plates recognized yet","widenTheDateRangeOr":"Widen the date range or clear the camera filter.","plateReadsAppearHereWhen":"Plate reads appear here when the detection pipeline OCRs a vehicle."},"retrainTabCallout":{"trainingFromThisFeed":"Training from this feed","markATrackWithThe":"Mark a track with the graduation-cap control on its card. On Training you correct frames, build collections, and start cloud fine-tunes.","openTraining":"Open Training"},"semanticEventSearch":{"semanticSearchDescribeWhatYou":"Semantic search — describe what you're looking for…","semanticEventSearch":"Semantic event search","clearSearch":"Clear search","camera":"Camera","filterByCamera":"Filter by camera","all":"All","match":"Match","searchFailed":"Search failed:","unknownError":"unknown error","noSemanticMatchesForTry":"No semantic matches for “{{debounced}}”. Try a looser match threshold or a different phrasing."},"similarGroupsModal":{"faceFrom":"Face from {{cameraName}}","noCrop":"No crop","includeFace":"Include face","excludeFace":"Exclude face","include":"Include","exclude":"Exclude","deleteFace":"Delete face","permanentlyDeletesThisFaceCrop":"Permanently deletes this face crop. This cannot be undone.","lookAlikeGroups":"Look-alike groups","threshold":"Threshold","minSize":"Min size","reAnalyze":"Re-analyze","noLookAlikeGroupsAt":"No look-alike groups at this threshold.","selectInGallery":"Select in gallery"},"stationarySection":{"parkedOn":"Parked {{className}} on {{cameraName}}","stationary":"Stationary","parkedObjectsKeptOutOf":"Parked objects — kept out of the event feed"},"trackFlagToggles":{"couldNotUpdateThisTrack":"Could not update this track","couldNotUpdateThisTrack2":"Could not update this track. Check the server logs.","markForTraining":"Mark for training","keepsThisTrackAndIts":"Keeps this track and its media past retention","debug":"Debug","flagThisTrackForDiagnostic":"Flag this track for diagnostic attention","favourited":"Favourited"},"unassignedFaces":{"faceFrom":"Face from {{cameraName}}","noCropImageTheFace":"No crop image — the face's crop media is missing (a pre-fix orphan). Safe to delete.","noCrop":"No crop","deselect":"Deselect","select":"Select","detachFace":"Detach face","detach":"Detach","assignFaceToPerson":"Assign face to person","assignToPerson":"Assign to person","deleteFace":"Delete face","selectEveryVisibleFaceWhose":"Select every visible face whose crop image is missing so you can delete the orphans in one pass","ofFaces":"{{value1}} of {{value2}} faces","nothingMatchesTheFilter":"Nothing matches the filter","noFacesFoundForThis":"No faces found for this filter","widenTheDateRangeOr":"Widen the date range or clear the camera filter.","faceCropsAppearHereWhen":"Face crops appear here when the detection pipeline captures them."},"vehiclesList":{"loadingPlates":"Loading plates…","noPlatesYet":"No plates yet.","removePlateSample":"Remove plate sample","vehicle":"Vehicle","plates":"Plates","edit":"Edit {{name}}","delete":"Delete {{name}}","name":"Name","vehicleName":"Vehicle name…","plateSamples":"Plate samples","removeAPlateCropTo":"Remove a plate crop to drop it from recognition for this vehicle. Assign new plates from Recent recognized plates.","deleteVehicle":"Delete vehicle","deleteAndAllItsPlate":"Delete {{name}} and all its plate samples? This cannot be undone.","loadingVehicles":"Loading vehicles…","addVehicle":"Add vehicle","nothingMatchesTheFilter":"Nothing matches the filter","noVehiclesEnrolledYet":"No vehicles enrolled yet","clearTheSearchOrTry":"Clear the search or try another name.","addAVehicleThenAssign":"Add a vehicle, then assign plate crops from Recent recognized plates.","noVehiclesEnrolledYet2":"No vehicles enrolled yet."},"people":"People","enrolledIdentitiesUsedForFace":"Enrolled identities used for face recognition. Open a person to rename them or remove training samples.","recentDetectedFaces":"Recent detected faces","faceCropsCapturedByThe":"Face crops captured by the detection pipeline. Assign them to a person to build recognition training data."}`),recordings:{activitySection:{when:`When`,domain:`Domain`,operation:`Operation`,reason:`Reason`,camera:`Camera`,items:`Items`,reclaimed:`Reclaimed`,loadingActivity:`Loading activity…`,activityCouldNotBeRead:`Activity could not be read`,theOpsLogDidNot:`The {{value1}} ops log did not answer. This is not "nothing happened" — retry, or check the node that owns it.`,noActivityYet:`No activity yet`,pruneDeleteAndRescanOperations:`Prune, delete and rescan operations across recordings and events show up here.`,thatDomain:`that domain`,thoseDomains:`those domains`},cameraRecordingSettingsSection:{noCameras:`No cameras`,addACameraFirst:`Add a camera first.`,perCameraRecordingRetention:`Per-camera recording & retention`,recordingModeScheduleBandsAnd:`Recording mode, schedule bands and the retention policy for one camera — the same controls as the camera's own Recording tab. Retention is one policy over footage and analytics; per-camera event deletion lives on the Events tab.`,camera:`Camera`},cleanupSection:{couldNotCheckWhetherStorage:`Could not check whether storage cleanup is installed on this hub.`,runStorageCleanup:`Run storage cleanup?`,reclaimsLeftoverAnalyticsRowsAnd:`Reclaims leftover analytics rows and files, debug stills/filmstrips, and ghost footage rows on frozen locations. Safe to re-run.`,reclaimsLeftoverAnalyticsRowsAnd2:`Reclaims leftover analytics rows and files, and ghost footage rows on frozen locations. Debug stills are left alone. Safe to re-run.`,runCleanup:`Run cleanup`,cancelCleanup:`Cancel cleanup?`,stopsAfterTheCurrentStep:`Stops after the current step. Work already done stays done.`,cancelCleanup2:`Cancel cleanup`,cleanup:`Cleanup`,onePassOverLeftoverAnalytics:`One pass over leftover analytics (database + files) and ghost footage rows on frozen locations. Does not time out — progress updates here until it finishes.`,alsoRemoveDebugMediaMotion:`Also remove debug media (motion stills and track filmstrips)`,phase:`Phase:`},diskReconcileSection:{reconcileStorageFromDisk:`Reconcile storage from disk?`,makesTheDatabaseMatchThe:`Makes the database match the filesystem: recordings index, tracks, events and media whose files are gone. Favourited tracks without files are deleted. Snapshot-less motion/audio events are deleted. Enrolled identities stay. This cannot be undone.`,reconcile:`Reconcile`,diskReconcile:`Disk reconcile`,deletesDatabaseRowsWhoseFiles:`Deletes database rows whose files are gone. Enrolled identities stay.`,lastRun:`Last run:`,failed:`, {{value1}} failed ({{value2}})`,reconcileFailed:`Reconcile failed:`},eventsManagementSection:{permanentlyDeletesEveryEventMotion:`Permanently deletes every event (motion / object / audio) older than the cutoff across all cameras, and their media. This cannot be undone.`,pruneEvents:`Prune events`,deleteAllEventsFor:`Delete all events for {{label}}?`,deleteEvents:`Delete events`,camera:`Camera`,events:`Events`,media:`Media`,deleteAllEventsForThis:`Delete all events for this camera`,loadingEventStoreFootprint:`Loading event-store footprint…`,noEventData:`No event data`,pipelineAnalyticsHasNotReported:`Pipeline analytics has not reported any event-store footprint yet.`,totalEvents:`Total events`,eventMediaOnDisk:`Event media on disk`,pruneEventsOlderThan:`Prune events older than`,pruneNow:`Prune now`,noStoredEvents:`No stored events`,noCameraHasPersistedEvents:`No camera has persisted events yet.`},eventsSection:{eventStore:`Event store`,whatTheDurableEventStore:`What the durable event store occupies, per camera, with fleet-wide prune-by-age and delete-all-events.`,postProcessingNodeFolders:`Post-processing node & folders`,theSingleNodeThatWrites:`The single node that writes event crops, and the storage location they land in.`},exportsSection:{cancelThisExport:`Cancel this export?`,stopsTheRenderThePartial:`Stops the render. The partial file is discarded.`,cancelExport:`Cancel export`,deleteThisExport:`Delete this export?`,permanentlyRemovesTheRenderedFile:`Permanently removes the rendered file and its history row.`,camera:`Camera`,range:`Range`,variant:`Variant`,state:`State`,expires:`Expires`,size:`Size`,downloadMp4:`Download MP4`,download:`Download`,cancelRender:`Cancel render`,deleteExport:`Delete export`,loadingExports:`Loading exports…`,newExport:`New export`,noExportsYet:`No exports yet`,createOneHereNewExport:`Create one here (New export) or from a camera's timeline in the viewer. Rendered clips show up here to download or manage.`},maintenanceAuditSection:{reclaimOrphanedAnalyticsRows:`Reclaim orphaned analytics rows?`,deletesIndexRowsAndTheir:`Deletes index rows (and their blobs) whose owning track, event or group is already gone. Enrolled gallery media is skipped.`,reclaimOrphans:`Reclaim orphans`,reclaimDebugMedia:`Reclaim debug media?`,deletesMotionVisitStillsAnd:`Deletes motion-visit stills and track filmstrips. Key frames and enrolled gallery stay. Paced at 2 MB/s — you can leave this page.`,reclaimDebugMedia2:`Reclaim debug media`,forgetGhostRowsOn:`Forget ghost rows on {{locationId}}?`,dropsDurableHourRowsWhose:`Drops durable hour rows whose files are not on disk. Files the ledger does not name are reported, never deleted.`,forgetGhosts:`Forget ghosts`,countLeftovers:`Count leftovers`,orphanAnalyticsRowsDebugStills:`Orphan analytics rows, debug stills/filmstrips, and ghost hours on a frozen recordings folder. Counts only — Reclaim or Forget deletes after you confirm.`,auditing:`Auditing…`,runAudit:`Run audit`,orphansAlreadyRunningRequestIgnored:`Orphans: already running — request ignored.`,debugMediaAlreadyRunningShowing:`Debug media: already running — showing last pass.`,forgot:`, forgot {{value1}}`,orphanFilesLeftOnDisk:`, {{value1}} orphan files left on disk`,noFrozenLocationSkipped:`No frozen location — skipped.`},newExportModal:{newExport:`New export`,camera:`Camera`,profile:`Profile`,from:`From`,to:`To`,speed:`Speed`,titleOptional:`Title (optional)`,eGCourierAtThe:`e.g. courier at the gate`,fromMustBeBeforeTo:`"From" must be before "To".`,queuing:`Queuing…`,createExport:`Create export`},recordingsManagementSection:{moveStorage:`Move storage`,copyRecordingsLowResRecordings:`Copy recordings, low-res recordings or event media to a new location, verify, then repoint the default. Applies to every camera.`},recordingsStorageSection:{footageOnDisk:`Footage on disk`,whatRecordedFootageOccupiesPer:`What recorded footage occupies, per camera and per volume, with prune-by-policy and delete-all-footage.`,recordingNodeFolders:`Recording node & folders`,theSingleNodeThatRecords:`The single node that records and serves playback, and the storage locations footage is written to.`},storageSection:{prune:`Prune {{label}}?`,appliesTheRetentionPolicyNow:`Applies the retention policy now (reason: {{reason}}). Footage beyond the policy is permanently deleted.`,pruneNow:`Prune now`,deleteAllFootageFor:`Delete all footage for {{label}}?`,permanentlyDeletesOfRecordedFootage:`Permanently deletes {{value1}} of recorded footage for this camera. This cannot be undone.`,delete:`Delete {{value1}}`,camera:`Camera`,disk:`Disk`,theOnlyRecordingsVolumeOn:`The only recordings volume on this node — this camera can only be here.`,theRecordingsDefaultThisNode:`The recordings DEFAULT. This node has several recordings volumes and the per-camera placement is not reported by recording.getStorageUsage, so this is where footage lands by default rather than a per-camera fact.`,default:`(default)`,used:`Used`,oldestFootage:`Oldest footage`,theOldestSegmentTheArchive:`The oldest segment the ARCHIVE holds for this camera — the per-camera answer to 'is retention actually holding?'.`,applyRetentionPolicyNow:`Apply retention policy now`,prune2:`Prune`,deleteAllFootage:`Delete all footage`,loadingStorageUsage:`Loading storage usage…`,noStorageData:`No storage data`,theRecordingNodeHasNot:`The recording node has not reported any storage usage yet.`,totalUsed:`Total used`,freeOnRecordingsVolumes:`Free on recordings volumes`,disk2:`Disk: {{label}}`,volumeFillEverythingOnThe:`Volume fill — everything on the disk, not only recordings. Warn at 85%, critical at 95%.`,pruneReason:`Prune reason`,perCameraUsageUnavailable:`Per-camera usage unavailable`,noRecordedFootage:`No recorded footage`,thisRecordingNodeHasNo:`This recording node has no footage ledger, so it refused to answer the per-camera table rather than report what it happens to hold in memory. The disk totals above are unaffected.`,noCameraHasRecordedFootage:`No camera has recorded footage on this node yet.`},recordedFootageAndTheDurable:`Recorded footage and the durable event store — what each occupies, where it is written, and the operations that move or reconcile both.`,recordings:`Recordings`,events:`Events`,cameras:`Cameras`,export:`Export`,activity:`Activity`,management:`Management`},migration:{storageMigrationSection:{checkingWhetherStorageMigrationIs:`Checking whether storage migration is installed…`,couldnTCheckWhetherStorage:`Couldn't check whether storage migration is installed`,theCapabilityRegistryDidNot:`The capability registry did not answer, so this panel has nothing to report either way — it is not a statement that the capability is missing. Reload to ask again.`,storageMigrationNotInstalled:`Storage migration not installed`,theCapabilityRegistryAnsweredNo:`The capability registry answered: no addon in this cluster provides storage-migration. Once one is deployed, this panel moves recordings, low-res recordings and event media to new storage locations in one coordinated, verified operation.`,startStorageMigration:`Start storage migration?`,copiesTheSelectedClassesFrom:`Copies the selected classes from the chosen source to the destination, verifies, then either makes the destination the default (if the source was) or disables the source. Safe to re-run if interrupted.`,startMigration:`Start migration`,cancelMigration:`Cancel migration?`,stopsTheInProgressMigration:`Stops the in-progress migration. Data already moved and verified stays at the destination; anything already repointed is not reverted.`,cancelMigration2:`Cancel migration`,storageMigration:`Storage migration`,moveRecordingsLowResRecordings:`Move recordings, low-res recordings and/or event media from one location to another: copies via the recorder / pipeline-analytics movers, verifies, then either repoints the default (when the source was the default) or disables the source (when it was not). Skip a class with an empty destination.`,skip:`— skip —`,plan:`Plan`,nothingToMoveSelectedDestinations:`Nothing to move — selected destinations match the current defaults.`,migrationStatus:`Migration status`,phase:`Phase:`,paused:`Paused:`,migrationHistory:`Migration history`,drainRemaining:`Drain remaining {{storageClass}}?`,drainRemaining2:`Drain remaining`,leftOnTheOldLocation:`Left on the old location`,measured:`Measured {{value1}}`,measuredNever:`Measured — never`,counting:`Counting…`,aMigrationRepointsFirstAnd:`A migration repoints first and drains behind. If the drain was cancelled, failed, or was interrupted by a restart, the data below is still on the source — readable, but not where the defaults now point. Draining moves it; it changes no default and pauses nothing.`,thisCountIsTakenOn:`This count is taken on demand: measuring it walks the whole media collection, so it is not refreshed on a timer. Press Refresh after a drain finishes.`,moversRunningOutsideAMigration:`Movers running outside a migration`}},deviceDoAction:{deviceDoActionFields:{target:`Target`,specificDevice:`Specific device`,theDeviceThatTriggeredThis:`The device that triggered this run`,sameFamilyOnlyTheAction:`Same family only — the action runs on each selected device.`,action:`Action`,pickADeviceFirst:`Pick a device first`,loadingActions:`Loading actions…`,noActionsForThisDevice:`No actions for this device`,selectAnAction:`Select an action…`,couldNotReadThisDevice:`Could not read this device’s capabilities.`}},device:{cameraFunctionSwitches:{cameraFunctions:`Camera functions`,functions:`Functions`},deviceConfigPanel:{failedToLoadDeviceConfiguration:`Failed to load device configuration.`,noConfigurationAvailableForThis:`No configuration available for this device.`,saving:`Saving...`},deviceNotificationMute:{notifications:`Notifications`,notificationMuteStateUnknownThe:`Notification mute — state unknown; the notification centre did not answer.`,muted:`Muted. {{costWhenOff}}`,notifyingMutingIt:`Notifying. Muting it: {{costWhenOff}}`,unknown:`Unknown`,muted2:`Muted`,notifying:`Notifying`,writeFailed:`Write failed: {{failure}}`,theNotificationCentreDidNot:`The notification centre did not answer, so this device’s mute state is unknown.`},intercomPanel:{mic:`Mic:`,audioPath:`Audio path:`},panelContent:{reboot:`Reboot "{{deviceName}}"?`,theDeviceWillGoOffline:`The device will go offline for ~30 seconds while the firmware restarts.`,reboot2:`Reboot`,restartAddon:`Restart addon "{{addonId}}"?`,everyDeviceServedByThis:`Every device served by this addon disconnects briefly and reconnects.`,restart:`Restart`,restartDevice:`Restart device`,rebootTheFirmware30sOffline:`Reboot the firmware. ~30s offline.`,restartAddon2:`Restart addon`,perAgentRestartComingWith:`Per-agent restart — coming with the agent-process supervisor.`,restartAgent:`Restart agent`,disabledAgentProcessSupervisorNot:`Disabled — agent-process supervisor not yet wired.`},resyncButton:{reSync:`Re-sync`,reAlignThisDeviceS:`Re-align this device's type, role, capabilities and units with its source.`,reSyncing:`Re-syncing…`},bindingsTab:{failedToLoadBindings:`Failed to load bindings:`,noCapabilityProvidersApplicableTo:`No capability providers applicable to this device yet.`,nativeProvidersShowUpHere:`Native providers show up here as soon as the owning addon registers them.`,capability:`Capability`,kind:`Kind`,activeProvider:`Active Provider`,node:`Node`,native:`Native`,wrapper:`Wrapper`,noneAvailable:`none available`,clickToDeactivateRevertTo:`Click to deactivate (revert to native)`,activateWrapper:`Activate wrapper {{wrapperId}}`},cameraStepInspector:{loadingPipeline:`Loading pipeline…`,noPipelineNodeIsOnline:`No pipeline node is online.`,catalogUnavailable:`Catalog unavailable.`,detectionStepsOfThisCamera:`Detection steps of this camera`,noStepSelected:`No step selected.`,appliesTo:`Applies to`,settingsApplyTo:`Settings apply to`,thisAccelerator:`This accelerator`,allAcceleratorsOfThisCamera:`All accelerators of this camera`,appliesToAllAcceleratorsOf:`Applies to: all accelerators of this camera.`,thisCamera:`{{name}} · this camera`,everyAcceleratorThisCameraRuns:`{{slot}} · every accelerator this camera runs on`,model:`Model`,settings:`Settings`,applyToAllAccelerators:`Apply to all accelerators`},detectionPipelineTab:{steps:`Steps`,settings:`Settings`},detectionSourceControl:{rootDetector:`Root detector`,thisNode:`This node`,cameraOnboardAi:`Camera onboard AI`,none:`None`,saving:`Saving…`},deviceAggregateSection:{loadingDeviceAggregate:`Loading device aggregate…`,noAggregateContributionsForThis:`No aggregate contributions for this device.`},deviceLiveInfoSection:{loadingLiveInfo:`Loading live info…`,liveInfo:`Live Info`},eventsTab:{eventTimeline:`Event Timeline`,"0Events":`0 events`,noEvents:`No events`,deviceEventsWillAppearHere:`Device events will appear here as they occur`},overviewTab:{streamNetwork:`Stream Network`,nominal:`Nominal`,observed:`Observed`,peak:`Peak`,packetLoss:`Packet Loss`},tracksTab:{backendPending:`Backend pending`,zones:`Zones:`,time:`Time`,bindings:`Bindings`,analytics:`Analytics`,activeTracks:`Active tracks`,pipelineanalyticsGetactivetracks:`pipelineAnalytics.getActiveTracks`,noActiveTracks:`No active tracks`,tracksAppearWhenObjectsAre:`Tracks appear when objects are currently moving`,historicalTracks:`Historical tracks`,pipelineanalyticsListtracks:`pipelineAnalytics.listTracks`,noCompletedTracksYet:`No completed tracks yet`,tracksAreArchivedWhenTheir:`Tracks are archived when their TTL expires`}},hero:{buttonHero:{justPressed:`Just pressed`,idle:`Idle`,lastPress:`Last press {{value1}}`,unknown:`Unknown`,awaitingState:`Awaiting state…`},eventEmitterHero:{noPressRecorded:`No press recorded`,button:`Button {{value1}}`,awaitingState:`Awaiting state…`,waitingForTheFirstEvent:`Waiting for the first event`},genericHero:{noLiveViewForThis:`No live view for this device type. Use the Config tab or the shortcut row to interact.`},hubHero:{discovered:`Discovered`,adopted:`Adopted`,available:`Available`,discover:`Discover`,online:`{{online}} online`,sleeping:`{{sleeping}} sleeping`,offline:`{{offline}} offline`,unknown:`{{unknown}} unknown`},lightHero:{awaitingState:`Awaiting state…`,turnOff:`Turn off {{deviceName}}`,turnOn:`Turn on {{deviceName}}`,brightness:`Brightness`,brightnessUnavailable:`Brightness unavailable`,on:`On`,off:`Off`,unknown:`Unknown`,changed:`Changed {{value1}}`},motionTriggerToggle:{awaitingState:`Awaiting state…`,disableTriggerOnMotion:`Disable trigger on motion`,enableTriggerOnMotion:`Enable trigger on motion`},sensorHero:{motionDetected:`Motion detected`,idle:`Idle`,triggered:`Triggered`,unknown:`Unknown`,lastTrip:`Last trip {{value1}}`,awaitingState:`Awaiting state…`},switchHero:{awaitingState:`Awaiting state…`,turnOff:`Turn off {{deviceName}}`,turnOn:`Turn on {{deviceName}}`,on:`On`,off:`Off`,unknown:`Unknown`,changed:`Changed {{value1}}`}},overviewAdapters:{deviceInfoAdapter:{deviceInfo:`Device Info`,identity:`Identity`,hardware:`Hardware`,type:`Type`,provider:`Provider`,capabilities:`Capabilities`,none:`None`,autoPopulatedByTheDriver:`Auto-populated by the driver on every connect. Read-only.`}},shared:{primaryChildRow:{primaryChild:`Primary child`},addressSelector:{noAddressesAvailable:`No addresses available.`,autoPreferred:`Auto-preferred`,alwaysIncluded:`Always included`,unlikelyUsable:`Unlikely usable`},replTerminal:{thinking:`…thinking`,text:`>`},webRtcPlayer:{connecting:`Connecting…`,connectionFailed:`Connection failed`,streamDisconnected:`Stream disconnected`,reconnect:`Reconnect`,unmute:`Unmute`,mute:`Mute`},locationRow:{roomAreaOrLeaveEmpty:`Room / area (or leave empty to clear)`,create:`Create`}},formBuilder:{formBuilder:{searchOrAdd:`Search or add…`,searchToAdd:`Search to add…`},formSaveBar:{saving:`Saving…`},modelSelector:{models:`Models ({{length}})`,customPath:`Custom Path`,noPredefinedModelsAvailableUse:`No predefined models available. Use the Custom Path tab to specify a model file path or URL.`,enterPathLikeDataModels:`Enter path like /data/models/custom.onnx or https://...`,acceptedFormats:`Accepted formats:`,howToConvertYourModel:`How to convert your model`},searchableMultiSelectField:{searchToAdd:`Search to add…`}},backup:{archiveList:{deleteThisArchive:`Delete this archive?`,permanentlyDeletesAndFrees:`Permanently deletes "{{value1}}" and frees {{value2}}.`,loadingArchives:`Loading archives…`,failedToReadManifestFor:`Failed to read manifest for this destination`,noArchivesAtThisDestination:`No archives at this destination yet.`,when:`When`,label:`Label`,encryptedRestoreNeedsBackupKey:`encrypted — restore needs backup key {{keyId}}`,databases:`Databases`,files:`Files`,size:`Size`,downloadArchive:`Download archive`,download:`Download`,restoreFromThisArchive:`Restore from this archive`,restore:`Restore`,delete:`Delete {{value1}}`},backupDatabaseBadges:{snapshotsOnly:`Snapshots only`},backupDatabasePicker:{whatToBackUp:`What to back up`,notCreatedYet:`Not created yet`},backupEncryptionCard:{thisKeyIsShownOnly:`This key is shown only once. CamStack does not keep it — not the hub, not its database, not its backups. Without it, an encrypted backup cannot be restored by anyone, including you. Store it in a password manager or print it, away from this server.`,copied:`Copied`,downloadAsFile:`Download as file`,iHaveStoredThisKey:`I have stored this key somewhere safe, off this server.`,iHaveStoredIt:`I have stored it`,replaceTheBackupKey:`Replace the backup key`,encryptBackups:`Encrypt backups`,aNewKeyIsGenerated:`A new key is generated and shown once; new backups are encrypted to it. Older backups keep needing the key they were made with — keep that one too.`,aBackupKeyIsGenerated:`A backup key is generated and shown once. Every new backup is encrypted to it, and restoring one will ask for it. Existing backups stay as they are.`,generateANewKey:`Generate a new key`,generateTheKey:`Generate the key`,turnBackupEncryptionOff:`Turn backup encryption off`,newBackupsWillBeWritten:`New backups will be written unencrypted. Existing encrypted backups still need their key to be restored.`,turnOff:`Turn off`,encryption:`Encryption`,onKeySince:`On — key {{keyId}}, since {{value2}}`,offBackupsAreNotEncrypted:`Off — backups are not encrypted`,replaceKey:`Replace key`,enableEncryption:`Enable encryption`,archivesAreEncryptedOnThis:`Archives are encrypted on this server before they reach any destination. The server keeps only a public key, so it can encrypt scheduled backups but cannot decrypt them — only your backup key can. Covers the database snapshot, config.yaml, addon data (HomeKit pairing, Matter fabric, Tailscale state) and TLS.`,olderKeysBackupsMadeWith:`Older keys (backups made with them still need them):`},backupEntriesTable:{loadingBackupEntries:`Loading backup entries…`,failedToLoadBackupEntries:`Failed to load backup entries`,unknownError:`Unknown error`,noBackupEntriesYet:`No backup entries yet`,createOneToScheduleBackups:`Create one to schedule backups across one or more storage locations.`,hideArchives:`Hide archives`,showArchives:`Show archives`,entry:`Entry`,unnamed:`(unnamed)`,enabled:`Enabled`,backsUp:`Backs up`,locations:`Locations`,retention:`Retention`,schedule:`Schedule`,noLocations:`No locations`,manual:`Manual`,enable:`Enable {{value1}}`,retentionFor:`Retention for {{value1}}`,deleteBackupEntry:`Delete backup entry?`,willStopRunningExistingArchives:`"{{value1}}" will stop running. Existing archives are kept.`,runThisEntryNow:`Run this entry now`,runNow:`Run now`,edit:`Edit {{value1}}`,delete:`Delete {{value1}}`,thisEntryHasNoLocations:`This entry has no locations selected.`},backupEntryModal:{editBackupEntry:`Edit backup entry`,newBackupEntry:`New backup entry`,createEntry:`Create entry`,name:`Name`,nightlyOffsite:`Nightly offsite`,locationsSelected:`Locations ({{value1}} selected)`,loadingLocations:`Loading locations…`,noBackupsStorageLocationsConfigured:"No `backups` storage locations configured. Add one in Settings → Storage first.",retentionArchivesKept:`Retention (archives kept)`,enabled:`Enabled`,runOnScheduleWhenChecked:`Run on schedule when checked.`,runOnSchedule:`Run on schedule`,schedule:`Schedule`},backupNowDialog:{backUpNow:`Back up now`,runsOnceAndWritesThe:`Runs once and writes the archive to every enabled backup location.`},backupRunsPanel:{cancelQueuedBackupRun:`Cancel queued backup run?`,thisRunHasNotStarted:`This run has not started. Cancelling removes it from the queue — nothing has been written, nothing is deleted.`,cancelRun:`Cancel run`,stopThisBackupRun:`Stop this backup run?`,theHalfWrittenStagingArchive:`The half-written staging archive is deleted and the destination currently uploading discards its partial copy. {{keptSentence}}`,stopRun:`Stop run`,runs:`Runs`,aBackupRunIsIn:`A backup run is in progress`,oneRunExecutesAtA:`One run executes at a time — queued runs wait in line.`,checkingForBackupRuns:`Checking for backup runs…`,couldNotReadBackupRuns:`Could not read backup runs — the orchestrator did not answer.`,noBackupRunsYetRuns:`No backup runs yet. Runs appear here the moment one starts — manual or scheduled.`,run:`Run`,state:`State`,progress:`Progress`,destinations:`Destinations`,timing:`Timing`,actions:`Actions`,removeThisRunFromThe:`Remove this run from the queue before it starts`,stopThisRunTheHalf:`Stop this run — the half-written archive is discarded`,stop:`Stop`,queued:`Queued`,uploading:`Uploading`,buildingArchive:`Building archive`,succeeded:`Succeeded`,failed:`Failed`,stoppedBeforeCompletingEveryDestination:`Stopped before completing every destination — not a success`,stopped:`Stopped`,inLine:`in line`,waitingItsTurn:`waiting its turn`,stagedSoFar:`staged so far`,toCurrentDestination:`to current destination`,notResolvedYet:`not resolved yet`,keptTheirArchive:`Kept their archive: {{value1}}`,failed2:`Failed: {{value1}}`},cronEditor:{schedulePreset:`Schedule preset`,custom:`Custom…`,cronExpression5FieldPosix:`Cron expression (5-field POSIX)`,format:`Format:`,validating:`Validating…`,invalidCronExpression:`Invalid cron expression`,noFutureRunsMatchThis:`No future runs match this expression.`,nextRuns:`Next runs`},restoreWizard:{restoreBackup:`Restore Backup`,pickSource:`pick source`,pickLocations:`pick locations`,scheduleRestore:`Schedule Restore`,destination:`Destination`,selectDestination:`Select destination…`,archive:`Archive`,pickADestinationFirst:`Pick a destination first.`,readingArchives:`Reading archives…`,noArchivesAvailableAtThis:`No archives available at this destination.`,encryptedKey:`encrypted (key {{keyId}})`,databasesInThisArchive:`Databases in this archive`,snapshotsOnlyRestoringThisArchive:`Snapshots only: restoring this archive replaces just these databases. It does NOT touch configuration, addons, addon data or certificates.`,loadingArchiveManifestIfThis:`Loading archive manifest… If this persists, the archive may predate manifests — restoring will apply everything in the tarball.`,selectedEntriesWillOverwriteLive:`Selected entries will overwrite live data on the next server restart. Unchecked entries stay current.`,restoreIsAppliedAtNext:`Restore is applied at next server boot. Active connections will drop when you restart.`,backupKey:`Backup key`,camstackBackupSecretV1:`camstack-backup-secret-v1:…`}},graph:{clusterGraphView:{filterByNodeRunnerCap:`Filter by node / runner / cap…`,expandAll:`Expand all`,collapseAll:`Collapse all`,restoreTheAutomaticLayoutDiscarding:`Restore the automatic layout, discarding dragged positions`,resetLayout:`Reset layout`},nodeBox:{lastSeen:`last seen {{relativeLastSeen}}`,openNodeDetail:`Open node detail`,noProcesses:`No processes`},runnerBlock:{restartAddon:`Restart addon`,logs:`Logs`}},load:{loadChart:{andOverTime:`{{title}}: {{mainLabel}} and {{gcLabel}} over time`,noSamplesInThisInterval:`No samples in this interval — nothing was measured, nothing is drawn.`}},pairing:{agentStateBadge:{notConnected:`not connected`},agentsFoundSection:{unpairFailed:`Unpair failed: {{message}}`,unpair:`Unpair {{nodeId}}`,sCertificatesAreRevokedAt:`{{nodeId}}'s certificates are revoked at once and it is disconnected from the mesh. It must be paired again before it can rejoin.`,unpair2:`Unpair`,node:`Node`,address:`Address`,version:`Version`,state:`State`,certificate:`Certificate`,pair:`Pair`,agentsFoundOnTheNetwork:`Agents found on the network`,scan:`Scan`,addByAddress:`Add by address`,anAgentHoldsNoSecret:`An agent holds no secret: pairing issues it a certificate after you confirm the same six digits on this page and on the agent. Discovery needs the agent on its own IP or host networking; a Docker bridge hides it — add it by address.`,addAgentByAddress:`Add agent by address`,aPrivateOrLocalAddress:`A private or local address only.`,agentAddress:`Agent address`,port:`Port`,optional:`Optional.`,agentPort:`Agent port`,couldNotListAgents:`Could not list agents`,requestFailed:`Request failed`,lookingForAgents:`Looking for agents…`,noAgentsFound:`No agents found`,nothingIsAdvertisingOnThis:`Nothing is advertising on this network. Start the agent on its own IP (or host networking), or add it by address.`},pairingDialog:{eachScreenShowsACode:`Each screen shows a code; you type the code from the OTHER screen. Agent at {{value1}}`,couldNotStartThePairing:`Could not start the pairing`,reject:`Reject`,codeOnThisHub:`Code on this hub`,codeOnThisHubRead:`Code on this hub — read it out to the agent`,onTheAgentEnterThis:`On the agent, enter this code and the agent’s local PIN (shown on the agent’s console or log, or on its own screen).`,codeShownOnTheAgent:`Code shown on the agent`,typeTheSixDigitsThe:`Type the six digits the agent displays. Do not copy the code above.`,youConfirmedHereTheAgent:`You confirmed here. The agent still has to enter the hub code and its PIN.`,working:`Working…`,hubConfirmed:`Hub: confirmed`,hubNotConfirmed:`Hub: not confirmed`,agentConfirmed:`Agent: confirmed`,agentNotConfirmed:`Agent: not confirmed`,joinedAndRegisteredItsCapabilities:`{{nodeId}} joined and registered its capabilities.`,holdsItsCertificateWaitingFor:`{{nodeId}} holds its certificate. Waiting for it to connect and register its capabilities…`,openNode:`Open node`}},cluster:{forksTab:{setLogLevel:`Set log level`,restartProcess:`Restart process`,showLogsFor:`Show logs for {{addonId}}`,showEventsFor:`Show events for {{addonId}}`,restart:`Restart {{addonId}}`,noServices:`No services`,noProcessesOnThisNode:`No processes on this node`},nodeDetailCapabilitiesTab:{noCapabilitiesOnThisNode:`No capabilities on this node`,capability:`Capability`,boundProvider:`Bound provider`,onlyOneProviderInstalledChoice:`Only one provider installed — choice becomes available once a second addon registers this capability`},nodeDetailSettingsTab:{noAddonsOnThisNode:`No addons on this node`},nodeInfoTab:{rename:`Rename`,hub:`Hub`,agent:`Agent`,gb:`{{value1}} GB`},processesTab:{class:`Class`,addon:`Addon`,command:`Command`,cpu:`CPU%`,uptime:`Uptime`,scanning:`Scanning…`},nodeCard:{unpair:`Unpair {{name}}`,unpairItDisconnectsAndMust:`Unpair {{name}}? It disconnects and must be paired again.`,unpair2:`Unpair`,unpairThisNodeRevokesIts:`Unpair this node — revokes its certificates; it must be paired again to rejoin`,unpairing:`Unpairing…`,gb:`{{value1}}GB`,forgetThisNodeRemovesIts:`Forget this node — removes its saved history and pipeline assignments`,forgetting:`Forgetting…`,forgetNode:`Forget node`,openThisAgentSStatus:`Open this agent's status dashboard (unlocks with a short-lived hub ticket)`,opening:`Opening…`,openDashboard:`Open dashboard`,general:`General`,forks:`Forks ({{length}})`,processes:`Processes`,load:`Load`,settings:`Settings`,capabilities:`Capabilities`}},access:{accessSection:{dismiss:`Dismiss`},createTokenModal:{createAdminToken:`Create admin token`,createToken:`Create token`,issueToken:`Issue token`,administrator:`Administrator`,offScopedToASurface:`Off = scoped to a surface. On = full admin for scripts (audited, max 90 days).`,fullAdministrator:`full administrator`,onBehalfOfUser:`On behalf of user`,name:`Name`,expiresInDays:`Expires in (days)`,scopes:`Scopes`,eachScopePicksACap:`Each scope picks a (cap or addon) target + one or more access flavours. The token can access ONLY what's listed.`,leaveBlankForNonExpiring:`Leave blank for non-expiring.`},credentialTable:{couldNotLoad:`Could not load {{label}}`,noMatchTheFilters:`No {{label}} match the filters.`,clearSelection:`Clear selection`},legacyApiKeysSection:{revoke:`Revoke "{{name}}"?`,anyClientUsingThisKey:`Any client using this key loses access immediately. This cannot be undone.`,revoke2:`Revoke`,legacyApiKeys:`Legacy API keys`,keysFromBeforeScopedTokens:`Keys from before scoped tokens. Nothing creates them any more; revoke them and issue a scoped token instead.`,legacyApiKeys2:`legacy API keys`},linkedAppsSection:{revokeTheLink:`Revoke the "{{name}}" link?`,losesAccessForOnIts:`{{name}} loses access for {{ownerName}} on its next call. Linking it again needs the account-link flow from the start.`,revoke:`Revoke`,linkedApps:`Linked apps`,externalIntegrationsAlexaLinkedTo:`External integrations (Alexa, …) linked to this hub through OAuth. Revoking one stops that integration on its next call. Already-revoked rows can be selected and removed from the list.`,linkedApps2:`linked apps`,selectRevoked:`Select revoked`},loginSessionsSection:{signOutThisSession:`Sign out this session`,onWillHaveToSign:`{{ownerName}} on {{name}} will have to sign in again.`,signOut:`Sign out`,loginSessions:`Login sessions`,everyBrowserAndAppSigned:`Every browser and app signed in to this hub, for every user. Signing one out ends it at once; it has to sign in again. Your own current session is marked and never included in a bulk sign-out.`},scopedTokensSection:{revoke:`Revoke "{{name}}"?`,sScopedTokenStopsWorking:`{{ownerName}}'s scoped token stops working on its next use. This cannot be undone.`,revoke2:`Revoke`,scopedTokens:`Scoped tokens`,tokensIssuedOnBehalfOf:`Tokens issued on behalf of a user for one narrow surface — an addon, an integration, a capability or some devices. Every token must be scoped, so revoking one has a predictable blast radius.`,createAUserFirst:`Create a user first`,issueAScopedToken:`Issue a scoped token`,newToken:`New token`,scopedTokens2:`scoped tokens`},tokensSection:{revoke:`Revoke "{{name}}"?`,everyScriptUsingItLoses:`Every script using it loses access immediately. This cannot be undone.`,sScopedTokenStopsWorking:`{{ownerName}}'s scoped token stops working on its next use. This cannot be undone.`,revoke2:`Revoke`,tokens:`Tokens`,scopedTokensForANarrow:`Scoped tokens for a narrow surface, and admin tokens for full-administrator scripts. Revoking one stops it on its next use.`},credentialColumns:{name:`Name`,owner:`Owner`,kindScope:`Kind / scope`,status:`Status`,created:`Created`,lastUsed:`Last used`,expires:`Expires`},externalIdentitiesSection:{removeSignInLink:`Remove sign-in link`,willNoLongerBeAble:`"{{ownerName}}" will no longer be able to sign in with this {{kind}} account.`,signInLinks:`Sign-in links`,externalAccountsSingleSignOn:`External accounts (single sign-on) each user linked to their CamStack account. Only the owner can link one, from their profile; an admin can remove it.`}},users:{linkedSignInsSection:{unlinkSignInAccount:`Unlink sign-in account`,stopSigningInWithThis:`Stop signing in with this {{label}} account?`,unlink:`Unlink`,linkedSignInAccounts:`Linked sign-in accounts`,signInWithAnExternal:`Sign in with an external account instead of your password. Only accounts you link here can sign you in; your two-factor authentication still applies.`,providerUnavailable:`provider unavailable`},scopePreview:{all:`all {{total}}`,of:`{{count}} of {{total}}`,resolving:`Resolving…`,couldNotResolveThisGrant:`Could not resolve this grant set. Saving is still allowed — the server enforces the same rules either way.`,administrator:`Administrator`,devicesTheyCanSee:`Devices they can see`,devicesTheyCanOperate:`Devices they can operate`,devicesTheyCanDelete:`Devices they can delete`,systemAccess:`System access:`,extraCapabilities:`· Extra capabilities:`,addons:`· Addons:`,thisUserWillNotBe:`This user will not be able to see any device.`},shareLinksSection:{revokeShareLink:`Revoke share link`,anyoneHoldingThisLinkTo:`Anyone holding this link to {{value1}} loses access immediately. This cannot be undone.`,revoke:`Revoke`,shareLinks:`Share links`,viewOnlyLinksYouCreated:`View-only links you created in the viewer app to share a grid or the events of some cameras. Revoking a link stops it working everywhere it was sent.`,shareLinks2:`share links`,everyUserSViewOnly:`Every user's view-only share links. Revoking one stops it working for whoever it was sent to — a revoked link is deleted and cannot be restored.`,selectExpired:`Select expired`},totpModal:{remove2fa:`Remove 2FA`,removeTwoFactorAuthenticationFor:`Remove two-factor authentication for "{{username}}"? They'll be able to log in with just their password until they re-enroll from their own profile page.`,twoFactorAuthentication:`Two-factor authentication`,user:`User:`,checkingStatus:`Checking status…`,"2faNotEnrolled":`2FA not enrolled`,onlyTheUserThemselvesCan:`Only the user themselves can enable 2FA, from their own profile page.`,"2faIsActive":`2FA is active`,removingHereClearsTheServer:`Removing here clears the server-side secret. Use this only when the user has lost access — they'll have to re-enroll from their profile page afterwards.`},totpQrCode:{qrRenderingUnavailableUseThe:`QR rendering unavailable — use the secret below.`,generating:`Generating…`},userAccessModal:{thisUserIsAnAdministrator:`This user is an administrator — they can do everything, and the settings below are ignored.`,chooseWhatTheyCanDo:`Choose what they can do, then which devices it applies to.`,noAccess:`No access.`,"1WhatCanTheyDo":`1 · What can they do`,advancedEditRawGrants:`Advanced — edit raw grants`,oneRowPerGrantAnything:`One row per grant. Anything expressible here overrides the three roles above; close this section to go back to them.`,"2OnWhichDevices":`2 · On which devices`,"3Result":`3 · Result`,"2Result":`2 · Result`,saveAccess:`Save access`},userSessionsModal:{signOutThisSession:`Sign out this session`,onWillHaveToSign:`"{{username}}" on {{label}} will have to sign in again.`,signOut:`Sign out`,signOutEverywhere:`Sign out everywhere`,everySessionOfYourOwn:`Every session of your own account ends, this browser included: you will be signed out here too.`,everySessionOfEndsAt:`Every session of "{{username}}" ends at once; each device has to sign in again.`,activeSessions:`Active sessions`,user:`User:`},externalIdentitiesModal:{removeSignInLink:`Remove sign-in link`,willNoLongerBeAble:`"{{username}}" will no longer be able to sign in with this {{label}} account.`,linkedSignInAccounts:`Linked sign-in accounts`,user:`User:`,noLinkedAccountsOnlyThe:`No linked accounts. Only the user can link one, from their own profile page.`,providerUnavailable:`provider unavailable`}},addons:{addonCard:{updating:`Updating…`,updateTo:`Update to {{target}}`,update:`Update`,selectVersionToInstall:`Select version to install`,installedUpdateAvailableSelectedTap:`Installed {{version}} — update available. Selected {{target}}; tap to choose another version.`,versionTapToViewAll:`Version {{version}} — tap to view all versions`,unknownError:`Unknown error`,resetRetryCounterAndForce:`Reset retry counter and force immediate reload`,retryNow:`Retry now`,systemPackageUpdatingRestartsThe:`System package — updating restarts the hub`,system:`System`,restart:`Restart`,logs:`Logs`,settings:`Settings`,clusterDeployment:`Cluster Deployment`,events:`Events`,clusterWideSettingsOneValue:`Cluster-wide settings — one value for every node. Per-node settings live under Cluster → the node → Settings.`,thisAddonExposesNoCluster:`This addon exposes no cluster-wide settings. Anything it can configure is per-node — open it from Cluster → the node → Settings.`,deviceExport:`Device export`,autoUpdate:`Auto-Update`,installedOn:`Installed on`,hubLocal:`Hub (local)`,installOnMoreAgents:`Install on more agents`,addAgent:`Add agent`,noAvailableAgents:`No available agents`},addonRow:{systemPackage:`System package`,changesRequireAHubRestart:`Changes require a hub restart`,requiresRestart:`requires restart`,update:`Update`,restart:`Restart`,uninstall:`Uninstall`},addonUninstallControls:{uninstalled:`{{displayName}} uninstalled`,notEveryNodeWasCleaned:`{{displayName}}: not every node was cleaned`,uninstallFailed:`Uninstall {{displayName}} failed`,uninstallFrom:`Uninstall {{displayName}} from {{name}}?`,uninstall:`Uninstall`,cannotListTheNodes:`Cannot list the nodes`,theHubDidNotAnswer:`The hub did not answer which nodes have this package — nothing was removed.`,uninstallEverywhere:`Uninstall {{displayName}} everywhere?`,uninstallFromNodeS:`Uninstall from {{length}} node(s)`,uninstallFrom2:`Uninstall from {{name}}`,removing:`Removing...`,uninstallFromEveryNodeThat:`Uninstall from every node that has it`},addonUploadZone:{uploading:`Uploading...`,upload:`Upload`},capabilityMap:{noActiveProvider:`No active provider`,noProviders:`No providers`,noCapabilitiesRegistered:`No capabilities registered`},nodeOnlyPackagesPanel:{installedOnAgentsButNot:`Installed on agents but not on the hub`,installedOnButNotOn:`Installed on {{name}} but not on the hub`},updatesList:{checking:`Checking…`,checkForUpdates:`Check for updates`,allPackagesAreUpTo:`All packages are up to date`,restart:`Restart`,hotSwap:`Hot-swap`,update:`Update`},versionPicker:{versions:`Versions`,uploadedCopy:`Uploaded copy`,localCopy:`Local copy`,loadingVersions:`Loading versions...`,select:`Select {{version}}`,reInstallFromNpm:`Re-install {{version}} from npm`,install:`Install {{version}}`,noVersionsFound:`No versions found`}},brokers:{brokerForm:{failedToLoadSettingsSchema:`Failed to load settings schema:`,unknownError:`Unknown error`,connectionOk:`Connection OK.`,testFailed:`Test failed: {{value1}}`,testing:`Testing…`,testConnection:`Test connection`},brokerManager:{addBroker:`Add broker`,registerAMessageBrokerFor:`Register a message broker for exporters and automations.`,adding:`Adding…`,edit:`Edit {{name}}`,saving:`Saving…`,deleteBroker:`Delete broker`,deleteBrokerIntegrationsThatDepend:`Delete broker "{{name}}"? Integrations that depend on it will stop working.`,signInOpensAPopup:`Sign in — opens a popup that closes when done`,signOutClearsTheLinked:`Sign out — clears the linked Google account on this broker`,testConnection:`Test connection`,test:`Test`,noBrokerProvidersAvailable:`No broker providers available`,name:`Name`,kind:`Kind`,status:`Status`,actions:`Actions`,failedToLoadBrokers:`Failed to load brokers:`,unknownError:`Unknown error`,noBrokersRegisteredYetAdd:`No brokers registered yet. Add one to publish device events for downstream automations.`}},integrationHub:{addonIntegrationBody:{settings:`Settings`,activity:`Activity`,activityStream:`Activity stream`},integrationHub:{integrations:`{{title}} integrations`},integrationSection:{linkTo:`Link to {{title}}`},addonControls:{enabled:`Enabled`,disabled:`Disabled`,restart:`Restart`,restart2:`Restart "{{displayName}}"?`,restartingTheAddonBouncesIts:`Restarting the addon bounces its subprocess — the provider will briefly drop and reconnect automatically.`}},app:{bootProbeFailed:`Boot probe failed:`,connecting:`Connecting…`},galleryPager:{previousPage:`Previous page`,nextPage:`Next page`},login:{primaryLoginMethods:{orContinueWith:`Or continue with`},returningToTheApp:`Returning to the app…`,couldNotPrepareTheSign:`Could not prepare the sign-in handoff. You are logged in — retry below.`,preparingAOneTimeSign:`Preparing a one-time sign-in code…`,ifTheAppDoesNot:`If the app does not open automatically, tap below (the code expires in 60s).`,openCamstack:`Open CamStack`,camstackAdmin:`CamStack Admin`,username:`Username`,password:`Password`,logIn:`Log in`,loggingIn:`Logging in...`,twoFactorAuthentication:`Two-factor authentication`,finishSigningIn:`Finish signing in.`,passkeyVerificationIsnTAvailable:`Passkey verification isn't available on this address. Open the hub via its domain URL to complete sign-in.`,authenticationCode:`Authentication code`,verifyAndSignIn:`Verify and sign in`,verifying:`Verifying...`,backToUsernamePassword:`Back to username + password`},metrics:{agentLoad:{agentLoad:`Agent Load`,loading:`Loading...`,failedToLoadData:`Failed to load data`},integrationUsage:{integrationUsage:`Integration Usage`,loading:`Loading...`,failedToLoadData:`Failed to load data`},processResources:{processResources:`Process Resources`,loading:`Loading...`,failedToLoadData:`Failed to load data`,cpu:`CPU:`,mem:`Mem:`,process:`Process`,memory:`Memory`,uptime:`Uptime`,rst:`Rst`}},notifications:{templateField:{noVariablesForThisField:`No variables for this field.`,class:`{{name}}<class>`,previewExampleValues:`Preview (example values)`}},search:{globalSearch:{clearSearch:`Clear search`}},settings:{nodeAddonsSettingsPanel:{theCurrentSelection:`the current selection`,saveFailed:`Save failed:`,nothingToConfigureHereFor:`Nothing to configure here for this node.`},siteLocationCard:{siteLocation:`Site location`,setByYou:`Set by you`,derivedFromIp:`Derived from IP`,notConfigured:`Not configured`,automaticDetectionFromThePublic:`Automatic detection from the public IP did not succeed`,itIsNotRetriedOn:`It is not retried on its own — enter the coordinates, or press Detect.`,latitude:`Latitude`,longitude:`Longitude`,detectFromIp:`Detect from IP`,clear:`Clear`,wgs84DecimalDegreesDetectAsks:`WGS84 decimal degrees. Detect asks a public geo-IP service once and will not overwrite a value you typed — clear it first.`}},secrets:{keychainAuditTable:{nothingHasBeenAuditedYet:`Nothing has been audited yet.`,previousPage:`Previous page`,nextPage:`Next page`},keychainNoticeContent:{resetKeychain:`Reset keychain`,dismiss:`Dismiss`,download:`Download`,rotate:`Rotate`,review:`Review`,noValueCanBeRead:`No value can be read or stored. If the master key is lost for good, Reset archives every stored value and starts a new keychain; every secret field then reads “not set”.`,withoutACopyOfThe:`Without a copy of the master key, the stored values cannot be recovered.`,theKeychainUnlockedWithA:`The keychain unlocked with a previous key. Rotate to move onto the configured one.`},keychainNotices:{keychainNotices:`Keychain notices`,showLess:`Show less`,more:`{{hidden}} more`,details:`Details`},keychainStatusCard:{keychain:`Keychain`,rotateKey:`Rotate key`,downloadRecoveryKey:`Download recovery key`,state:`State`,locked:`Locked`,unlocked:`Unlocked`,keySource:`Key source`,fingerprint:`Fingerprint`,recoveryKey:`Recovery key`,notTaken:`Not taken`},revealDialog:{hide:`Hide`},secretsTable:{filterByUsage:`Filter by usage`,noValueIsStoredIn:`No value is stored in the keychain yet.`,noStoredValueMatchesThis:`No stored value matches this filter.`,hubSystem:`Hub (system)`,owner:`Owner`,scope:`Scope`,field:`Field`,updated:`Updated`,lastRead:`Last read`,status:`Status`,reveal:`Reveal {{fieldPath}}`,theKeychainIsLocked:`The keychain is locked`,revealAudited:`Reveal (audited)`,reveal2:`Reveal`}},ui:{alertBell:{markAsRead:`Mark as read`,dismiss:`Dismiss`,alerts:`Alerts`,showRead:`Show read`,markAllRead:`Mark all read`,noUnreadAlerts:`No unread alerts`,noAlerts:`No alerts`,inProgress:`In Progress`}},layouts:{addonPageLoader:{addonPageNotFound:`Addon page not found`},protectedRoute:{loading:`Loading...`},appLayout:{camstackAdmin:`CamStack Admin`,expandSidebar:`Expand sidebar`,collapseSidebar:`Collapse sidebar`,logout:`Logout`,user:`User`,adminUiV:`admin-ui v{{__APP_VERSION__}}`,openMenu:`Open menu`,camstack:`CamStack`}},build:{automationsScriptsAndComposedDevices:`Automations, scripts and composed devices — what this installation does on its own.`,automationsTab:{automation:`Automation`,couldNotReadTheAutomations:`Could not read the automations`,loadingAutomations:`Loading automations…`,noAutomationsYet:`No automations yet.`,edit:`Edit {{name}}`,newAutomation:`New automation`},blockEditor:{loadExample:`Load example`,replaceTheCurrentEditorContents:`Replace the current editor contents with this example?`,replace:`Replace`,name:`Name`,whatThisScriptDoes:`What this script does`,integrationOptional:`Integration (optional)`,leaveEmptyForTheShared:`Leave empty for the shared system integration`,startFrom:`Start from`,runsOn:`Runs on`,failed:`Failed`,renameFile:`Rename file`,doubleClickToRename:`Double-click to rename`,file:`+ file`,useThisFileAsThe:`Use this file as the compile entry`,setAsEntry:`Set as entry`,loadingTheNodeSType:`Loading the node's type definitions…`,theNodeReturnedNoType:`The node returned no type definitions, so this code is NOT being checked against the system's types. The server-side compile still applies on save.`,theCodeDoesNotCompile:`the code does not compile`,couldNotReachTheCompiler:`Could not reach the compiler:`,typeCheckOnTheNode:`Type-check on the node without saving`,stopTheProcessAndLet:`Stop the process and let the supervisor bring it back`,restart:`Restart`,showThisScriptSProcess:`Show this script's process logs`,nameRequired:`Name required`,logsAppearOnceTheScript:`Logs appear once the script has been saved and started.`},customDeviceTab:{couldNotReadTheCompositions:`Could not read the compositions`,loadingCompositions:`Loading compositions…`,theCompositionStoreHasNot:`The composition store has not been read yet.`,thisIsNotTheSame:`This is not the same as having none — the list appears once the hub has read it (`,newComposedDevice:`New composed device`,editComposedDevice:`Edit composed device`,showingTheLastAnswerThe:`Showing the last answer — the latest refresh failed:`,deviceNamesAreShownAs:`Device names are shown as references:`,composedDevices:`Composed devices`,aNewDeviceWhoseState:`A new device whose state is derived from other devices.`,noComposedDevices:`No composed devices.`,customizations:`Customizations`,fieldsAddedToOrReplaced:`Fields added to or replaced on an existing device — one per device, edited from the device.`,noCustomizations:`No customizations.`,type:`Type`,state:`State`,sources:`Sources`,deviceMissing:`device missing`},scriptDevicesPanel:{couldNotListDevices:`Could not list devices:`,devices:`Devices`,declaredByThisScriptUnder:`Declared by this script under the shared Blocks integration (`,openDeviceDetail:`Open device detail`},scriptSettingsPanel:{couldNotLoadSettings:`Could not load settings:`,settings:`Settings`,saveSettings:`Save settings`},scriptsTab:{name:`Name`,deleteThisScript:`Delete this script?`,restart:`Restart`,enableItInsteadADisabled:`Enable it instead — a disabled script has no process`,logs:`Logs`,couldNotReadTheScripts:`Could not read the scripts`,noScriptsYetAScript:`No scripts yet. A script is TypeScript the hub runs in its own process.`,loadingScripts:`Loading scripts…`,noScriptsYet:`No scripts yet.`,edit:`Edit {{name}}`,newScript:`New script`}},automation:{actionList:{noActionsYetAnAutomation:`No actions yet. An automation that does nothing is not an automation.`,step:`Step`,runThisStepEarlier:`Run this step earlier`,runThisStepLater:`Run this step later`,removeThisStep:`Remove this step`,seconds:`Seconds`,code:`Code`,stepsRunInOrderAnd:`Steps run in order and stop at the first failure.`},automationEditor:{runsOnTheHub:`runs on the hub`,name:`Name`,whatThisAutomationDoes:`What this automation does`,when:`When`,anyOneOfTheseStarts:`Any one of these starts a run.`,andOnlyIf:`And only if`,checkedAfterATriggerFires:`Checked after a trigger fires. Nothing runs unless this is true.`,then:`Then`,inThisOrderStoppingAt:`In this order, stopping at the first failure.`,logsAppearOnceTheAutomation:`Logs appear once the automation has been saved and started`,showThisAutomationSProcess:`Show this automation's process logs`,nameRequired:`Name required`},automationList:{deleteThisAutomation:`Delete this automation?`,thisBlockCannotBeOpened:`This block cannot be opened visually`,runActions:`Run actions`,runningAnAutomationByHand:`Running an automation by hand needs the automation-control authority, which is not wired up yet. There is deliberately no second way to execute one.`,logs:`Logs`,noAutomationsYet:`No automations yet.`,anAutomationIsATrigger:`An automation is a trigger, a set of conditions and a list of actions. It compiles to an ordinary block and runs in its own supervised process — there is no separate engine, so anything that goes wrong shows up here with a reason.`,newAutomation:`New automation`},conditionRow:{comparison:`Comparison`,value:`Value`},conditionTree:{andOnlyIf:`And only if`,noConditionsTheActionsRun:`No conditions. The actions run every time a trigger fires.`,compareOneDeviceFieldTo:`Compare one device field to a value`,arithmeticAcrossDeviceFieldsThe:`Arithmetic across device fields — the bounded expression engine`,allSelectedRowsMustBe:`All selected rows must be true`,groupAsAll:`Group as ALL`,anyOneOfTheSelected:`Any one of the selected rows is enough`,groupAsAny:`Group as ANY`,invertTheSelectedRow:`Invert the selected row`,selectThisRowForGrouping:`Select this row for grouping`,dissolveThisGroupKeepingIts:`Dissolve this group, keeping its rows`,deleteThisGroupAndEverything:`Delete this group and everything in it`,removeTheNotKeepingThe:`Remove the NOT, keeping the row`,removeThisCondition:`Remove this condition`},expressionLeafRow:{expression:`Expression`,indoorOutdoor5:`indoor - outdoor > 5`,mustEvaluateToTrueOr:`Must evaluate to true or false. Every name in it has to be bound below — an unbound name is refused when the automation is saved, not when it runs.`,noNamesBoundYetAn:`No names bound yet. An expression reads devices only through these.`,name:`Name`,reads:`Reads`,aDeviceField:`A device field`,aConstant:`A constant`,constant:`Constant`,removeThisName:`Remove this name`},fieldPicker:{device:`Device`,selectADevice:`Select a device…`,capability:`Capability`,field:`Field`,noReadableFields:`No readable fields`,selectAField:`Select a field…`},generatedCodePanel:{ejectToCodeThisCannot:`Eject to code — this cannot be undone`,theRecipeIsRemovedFrom:`The recipe is removed from the block and it becomes an ordinary script. The visual editor will no longer open it, and there is no way back to it except authoring a new automation from scratch. The code itself is kept exactly as it is now.`,ejectToCode:`Eject to code`,keepItVisual:`Keep it visual`,generatedCode:`Generated code`,derivedFromTheRecipeAbove:`Derived from the recipe above — regenerated on every save, never edited here.`,takePermanentOwnershipOfThis:`Take permanent ownership of this code as a script`,saveTheAutomationFirstThere:`Save the automation first — there is no stored block to eject yet`,theRecipeIsNotComplete:`The recipe is not complete enough to generate a block yet.`},triggerEditor:{noTriggersYetWithoutOne:`No triggers yet. Without one nothing can ever start this automation — not even "Run actions", which needs a manual trigger to have somewhere to arrive.`,addAnotherWayThisAutomation:`Add another way this automation can start`,when:`When`,orWhen:`or when`,trigger:`Trigger`,removeThisTrigger:`Remove this trigger`,cronExpression:`Cron expression`,runActions:`Run actions`,becomes:`Becomes`,anyChange:`any change`,onlyOnAChange:`only on a change`,heldForS:`Held for (s)`,debounceS:`Debounce (s)`,eventCategory:`Event category`,selectAnEvent:`Select an event…`,fromDevice:`From device`,anyDevice:`Any device`},valueInput:{oneTwoThree:`one, two, three`}},accessDenied:{accessDenied:`Access Denied`,youDonTHavePermission:`You don't have permission to access this page.`,goToDevices:`Go to Devices`},changePassword:{camstackAdmin:`CamStack Admin`,setANewPassword:`Set a new password`,youMustRotateTheSeed:`You must rotate the seed password before continuing.`,chooseANewPasswordFor:`Choose a new password for your account.`,newPassword:`New password`,confirmNewPassword:`Confirm new password`,saving:`Saving…`,saveAndContinue:`Save and continue`,signOutInstead:`Sign out instead`},deviceDetail:{invalidDeviceId:`Invalid device id`,isNotANumber:`is not a number.`,backToIntegrations:`Back to Integrations`,deviceNotFound:`Device not found`,integrations:`Integrations`,openParentDevice:`Open parent device {{name}}`,disable:`Disable "{{name}}"?`,theDeviceWillStopProcessing:`The device will stop processing streams and events. You can re-enable it later.`,disableDevice:`Disable device`,enableDevice:`Enable device`,updating:`Updating…`,enabled:`Enabled`,disabled:`Disabled`,takeSnapshot:`Take snapshot`,fetchAFreshFrameAnd:`Fetch a fresh frame and download it.`,rebootDevice:`Reboot device`,cameraGoesOfflineFor30:`Camera goes offline for ~30 seconds.`,reboot:`Reboot "{{name}}"?`,theCameraWillGoOffline:`The camera will go offline for around 30 seconds while the firmware reboots.`,reboot2:`Reboot`,restartAddon:`Restart addon`,bouncesEveryDeviceServedBy:`Bounces every device served by {{servingAddonLabel}}.`,restart:`Restart "{{servingAddonLabel}}"?`,restartingTheAddonWillBriefly:`Restarting the addon will briefly disconnect every device served by it (not just "{{name}}"). Streams will reconnect automatically.`,restart2:`Restart`,deleteDevice:`Delete device`,removeTheDeviceAndAll:`Remove the device and all its settings.`,delete:`Delete "{{name}}"?`,thisWillRemoveTheDevice:`This will remove the device and all its settings. This action cannot be undone.`,dragToResize:`Drag to resize`,currentAudioLevelDbfs:`Current audio level (dBFS)`},devices:{orphanDevices:`Orphan devices`,theseDevicesReferenceAnIntegration:"These devices reference an integration that is no longer registered (their `integrationId`, or — for older devices without one — their `addonId`). Delete them, or re-install the missing integration to bring them back online. The provider badge beside each row is the addon that serves it."},embedPlayerPage:{embedConfigError:`Embed config error:`,failedToInitialiseTheEmbed:`Failed to initialise the embed player`},events:{feed:`Feed`,debug:`Debug`},eventsDebug:{noAnomalyFound:`no anomaly found`,analysing:`analysing…`,notAnalysed:`not analysed`,noMediaOfAnyKind:`no media of any kind`,allCameras:`All cameras`,selectAll:`Select all`,keep:`Keep`,analyzed:`Analyzed`,couldNotLoadTheMarked:`Could not load the marked tracks.`,aCameraFilledThePer:`A camera filled the per-camera cap — some marked tracks are not listed. Un-mark a few, or filter to one camera.`,noTrackIsMarkedFor:`No track is marked for debug`,markOneFromATrack:`Mark one from a track's actions on the Feed to see it here.`},eventsDebugTapes:{trackingTapes:`Tracking tapes`,recordTheTrackHistory:`Record the track history`,loadingCameraStatus:`Loading camera status…`,camera:`Camera`,state:`State`,framesMin:`Frames/min`,lastHour:`Last hour`,held:`Held`,gaps:`Gaps`,segmentsUnknown:`{{value1}} (segments unknown)`,loadingPromotedTapes:`Loading promoted tapes…`,scenario:`Scenario`,window:`Window`,tracks:`Tracks`,review:`Review {{scenario}}`,review2:`Review`,download:`Download {{scenario}}`,release:`Release`,release2:`Release {{scenario}}?`,releasingReturnsThisTapeS:`Releasing returns this tape's pinned tracks to ordinary retention — they can be pruned from then on. The promoted bundle itself is kept until deleted.`,delete:`Delete {{scenario}}?`,deletingRemovesThePromotedBundle:`Deleting removes the promoted bundle and its index row for good. Its tracks' pins are released first — this cannot be undone.`},eventsDebugTapesPromoteForm:{camera:`Camera`,from:`From`,to:`To`,scenario:`Scenario`,note:`Note`,optionalNote:`optional note`,lighting:`Lighting`,lightingAuto:`Lighting: auto`,aPromotedTapeMayBe:`A promoted tape may be shared as a test case — keep the scenario slug and note free of names or other personal data.`},eventsDebugTapesReview:{loadingTheTape:`Loading the tape…`,sameSubject:`Same subject`,differentSubjects:`Different subjects`,changedAtSFromTape:`Changed at (s from tape start)`,changedAtS:`changed at s`,mixed:`Mixed`,notASubject:`Not a subject`,markNotReviewed:`Mark not reviewed`,markReviewed:`Mark reviewed`,select:`select {{trackId}}`,notStoredMarkedThroughThe:`not stored — marked through the tape`},integrationDetail:{integrations:`Integrations`,scanTheNetworkForDevices:`Scan the network for devices (incl. a different subnet)`,scanNetwork:`Scan network`,disableIntegration:`Disable integration`,enableIntegration:`Enable integration`,enabled:`Enabled`,disabled:`Disabled`,restart:`Restart`,restart2:`Restart "{{name}}"?`,restartingTheAddonWillBriefly:`Restarting the addon will briefly disconnect every device backed by it ({{topLevelCountLabel}} active). Streams will reconnect automatically.`},library:{peopleVehiclesCapturedEventsAnd:`People, vehicles, captured events and scenes — what detection has recognised.`,people:`People`,vehicles:`Vehicles`,events:`Events`,scenes:`Scenes`},plates:{vehicles:`Vehicles`,enrolledVehicleIdentitiesUsedFor:`Enrolled vehicle identities used for plate recognition. Open a vehicle to rename it or remove plate samples.`,recentRecognizedPlates:`Recent recognized plates`,licensePlatesReadByThe:`License plates read by the detection pipeline. Assign them to a vehicle, correct the OCR text, or delete.`},scenes:{scene:`Scene`,camera:`Camera`,state:`State`,whatItSays:`What it says`,variants:`Variants`,lastChange:`Last change`,open:`Open`,aSceneWatchesOneRegion:`A scene watches one region of one camera and tells you when it stops looking like the picture you captured — a wheelie bin, a gate, a parking space.`,newScene:`New scene`,loadingScenes:`Loading scenes…`,nothingMatchesTheFilter:`Nothing matches the filter`,noScenesYetPressNew:`No scenes yet. Press “New scene”, pick a camera, then draw a box around the thing you want watched.`,whichCamera:`Which camera?`,continue:`Continue`,aSceneLivesOnOne:`A scene lives on one camera. Pick the one that can see the thing.`,scenes:`Scenes — {{editingName}}`,drawABoxNameIt:`Draw a box, name it, then capture what “normal” looks like. Daylight is enough — the night reference is optional, and “Settings” on each scene tunes how fussy and how often it checks.`,loadingTheEditor:`Loading the editor…`},ssoComplete:{nothingToFinishHereGo:`Nothing to finish here — go to sign-in`,closeThisWindow:`Close this window`,finishingSignIn:`Finishing sign-in…`},admin:{system:{integrations:{connectivity:`Connectivity`,externalSystemsThisHubTalks:`External systems this hub talks to — exporters, email, brokers and calendar sources.`,devices:`Devices`,connections:`Connections`,exposed:`{{linkState}} · {{exposedDeviceCount}} exposed`},logs:{viewer:`Viewer`,destinations:`Destinations`,levels:`Levels`,diagnostics:`Diagnostics`},secrets:{revealRefused:`Reveal refused`,secrets:`Secrets`,passwordsTokensAndKeysEncrypted:`Passwords, tokens and keys, encrypted in the hub keychain. Values leave the hub only through an audited reveal.`,storedValues:`Stored values`,audit:`Audit`},settings:{loadingHubTopology:`Loading hub topology…`,noOnlineHubNodeFound:`No online hub node found.`,settingsWillAppearOnceThe:`Settings will appear once the hub is reachable.`,noAddonsInstalledOnThe:`No addons installed on the hub yet.`},users:{deleteUser:`Delete user`,permanentlyDeleteUserThisCannot:`Permanently delete user "{{username}}"? This cannot be undone — any active sessions will be revoked on next request.`,resetPassword:`Reset password`,setANewPasswordFor:`Set a new password for "{{username}}".`,newPassword:`New password`,atLeast8Characters:`At least 8 characters`,continue:`Continue`,resetThePasswordForThey:`Reset the password for "{{username}}"? They will need to use the new password on their next login.`,username:`Username`,admin:`Admin`,regular:`Regular`,access:`Access`,everythingAdmin:`everything (admin)`,configureAccess:`Configure access`,created:`Created`,actions:`Actions`,editUser:`Edit user`,removeTwoFactorAuthentication:`Remove two-factor authentication`,remove2fa:`Remove 2FA`,linkedSignInAccounts:`Linked sign-in accounts`,signInLinks:`Sign-in links`,activeSessions:`Active sessions`,sessions:`Sessions`,users:`Users`,hubAccountsAdminFlagAccess:`Hub accounts, admin flag, access scopes, sessions and sign-in links.`,createUser:`Create User`,couldNotLoadUsers:`Could not load users`,noUsersYet:`No users yet`,createAUserToGrant:`Create a user to grant hub access.`,edit:`Edit {{value1}}`,create:`Create`,saving:`Saving…`,password:`Password`,atLeastCharacters:`At least {{value1}} characters.`,unrestrictedAccessToEveryCapability:`Unrestricted access to every capability and device.`,toChangeThePasswordUse:`To change the password, use Reset password on the user's row. Access scopes are configured from the Access column.`,noAccess:`No access`},addons:{sort:`Sort:`,bundlesFirst:`Bundles first`,name:`Name`,installSource:`Install source`,view:`View:`,groupMultiAddonPackagesInto:`Group multi-addon packages into a bundle card`,showEveryAddonAsIts:`Show every addon as its own card`,autoUpdate:`Auto-Update:`,checkEvery:`Check every:`,updating:`Updating…`,updateAll:`Update All ({{nonSystemUpdateCount}})`,filterInstalledAddons:`Filter installed addons`,filter:`Filter:`,updatable:`Updatable`,dev:`Dev`,searchAddonsOnNpm:`Search addons on npm...`,searchAddonsOnNpm2:`Search addons on npm`,filteringByCapability:`Filtering by capability:`,clear:`Clear`,installed:`Installed`,bulkUpdateCompleted:`Bulk update completed`,systemPackagesUpdatedHubRestarted:`System packages updated — hub restarted successfully.`,noAddonsInstalled:`No addons installed`,noInstalledAddonDeclaresThe:`No installed addon declares the "{{capabilityFilter}}" capability. Any addon you can install appears under "Available to install" above.`,noAddonsCompatibleWithPlacement:`No addons compatible with {{name}} (placement filter active)`,reFetchAddonsCheckNpm:`Re-fetch addons + check npm for new versions`,checkForUpdates:`Check for updates`,failedToLoadAddons:`Failed to load addons`}}},systemPage:{myAccess:{notSignedIn:`Not signed in.`,administrator:`Administrator`,user:`User`,unrestrictedAccess:`Unrestricted access`,adminSessionsBypassThePer:`Admin sessions bypass the per-call scope check. Every protected endpoint is reachable regardless of the list below.`,grantedScopes:`Granted scopes`,bakedIntoYourSessionToken:`Baked into your session token at login; sign out + back in to refresh after changes.`,type:`Type`,target:`Target`,access:`Access`,can:`Can {{a}}`,cannot:`Cannot {{a}}`,signOut:`Sign out`,changePassword:`Change password`,currentPassword:`Current password`,newPassword:`New password`,atLeast8Characters:`At least 8 characters.`,confirmNewPassword:`Confirm new password`,passwordsDoNotMatch:`Passwords do not match.`,newPasswordMustBeAt:`New password must be at least 8 characters.`,updatePassword:`Update password`,twoFactorAuthentication:`Two-factor authentication`,checkingStatus:`Checking status…`,"2faIsnTActiveOn":`2FA isn't active on your account. Enable it to require a 6-digit code from your authenticator app at every login.`,enable2fa:`Enable 2FA`,secretManualEntry:`Secret (manual entry)`,copied:`Copied`,"2faIsActive":`2FA is active`,disable2fa:`Disable 2FA`},identity:{pairADevice:`Pair a device`,users:`Users`,tokensSessions:`Tokens & sessions`,certificates:`Certificates`,authentication:`Authentication`},network:{localAccess:`Local access`,networkAddresses:`Network Addresses`,remoteAccess:`Remote Access`,meshNetworks:`Mesh Networks`,turnServers:`TURN Servers`,diagnostics:`Diagnostics`},data:{storage:`Storage`,backup:`Backup`},notifications:{newRule:`New rule`,addTarget:`Add target`,newSequence:`New sequence`,targets:`Targets`,rules:`Rules`,sequences:`Sequences`,simulate:`Simulate`,history:`History`,alarm:`Alarm`,texts:`Texts`},calendars:{when:`When`,calendar:`Calendar`,location:`Location`,description:`Description`,month:`Month`,week:`Week`,day:`Day`,calendarView:`Calendar view`,calendars:`Calendars`,show:`Show {{name}}`,colourFor:`Colour for {{name}}`,noEventsOnThisDay:`No events on this day.`,loadingCalendars:`Loading calendars…`,couldNotListCalendars:`Could not list calendars:`,openConnectivityCalendars:`Open Connectivity → Calendars`,toInstallOrConnectA:`to install or connect a source (Google Calendar, waste collections, Home Assistant, …).`,allCalendarsAreHiddenTurn:`All calendars are hidden. Turn one on in the legend to see events.`,previous:`Previous`,today:`Today`,loadingEvents:`Loading events…`,couldNotListEvents:`Could not list events:`,calendarsFromConnectedSourcesUsed:`Calendars from connected sources. Used by Calendar events notification rules.`},terminal:{executable:`Executable`,workingDirectory:`Working directory`,argumentsOnePerLine:`Arguments (one per line)`,environmentNameValueOnePer:`Environment NAME=value (one per line)`,terminal:`Terminal`,openLiveSessionsOrExplicitly:`Open live sessions or explicitly create Terminal camera instances from available profiles.`,terminalConfiguration:`Terminal configuration`,thisNodeOffersNoTerminal:`This node offers no terminal profile. Enable BTM, Top or Glances below, or add a custom profile.`,couldnTLoadProfiles:`Couldn't load profiles`,theTerminalSessionCapabilityMay:`The terminal-session capability may be disabled or unconfigured.`,availableTerminalProfile:`Available terminal profile`,noProfilesAvailable:`No profiles available`,openSession:`Open session`,terminalName:`Terminal name`,optionalCameraName:`Optional camera name`,createTerminalCamera:`Create Terminal camera`,terminalInstances:`Terminal instances`,onlyTheseExplicitInstancesDeclare:`Only these explicit instances declare cameras. Closing a live session does not delete an instance.`,noTerminalCamerasHaveBeen:`No Terminal cameras have been created.`,deleteTerminal:`Delete Terminal`,name:`Name`,saveAndRestart:`Save and restart`,legacyAutomaticCameras:`Legacy automatic cameras`,theseCamerasPredateExplicitTerminal:`These cameras predate explicit Terminal instances. They are intentionally untouched: confirm each migration before deleting one. Only BTM cameras can retain their legacy identity by being adopted below; create new instances for Top or Glances first.`,adoptBtm:`Adopt BTM`,liveSessions:`Live sessions`,noSessionsRunningOpenOne:`No sessions running. Open one above to begin.`,attached:`Attached`,attach:`Attach`}},certificates:{caStrip:{localHttpsCaSha256:`Local HTTPS CA (SHA-256)`,downloadCa:`Download CA`,clusterCaSha256:`Cluster CA (SHA-256)`,clusterCaValidUntil:`Cluster CA valid until`,nodeListener:`Node listener`,open:`Open`,notStarted:`Not started`,theCertificateRegistryIsNot:`The certificate registry is not up, so the node list below is incomplete.`},deviceCaCard:{deviceCertificateAuthority:`Device certificate authority`,signsTheCertificateEachPaired:`Signs the certificate each paired device holds. It is created the first time a device is paired.`,state:`State`,ready:`Ready`,notCreatedYet:`Not created yet`,unavailable:`Unavailable`,subject:`Subject`,fingerprintSha256:`Fingerprint (SHA-256)`,validUntil:`Valid until`,reason:`Reason`},deviceSettingsRow:{usersCanEnrollTheirOwn:`Users can enroll their own devices`,allowedAUserSignedIn:`Allowed - a user signed in on a phone can keep it signed in. Pairing by QR works either way.`,disabledOnlyAnAdminCan:`Disabled - only an admin can pair a device, with a QR code.`},devicesCard:{revoke:`Revoke "{{name}}"?`,sDeviceStopsSigningIn:`{{ownerName}}'s device stops signing in at once and its open sessions end. To use it again it has to be paired anew. This cannot be undone.`,revoke2:`Revoke`,delete:`Delete "{{name}}"?`,isRemovedFromTheList:`{{name}} is removed from the list. The audit trail keeps the revocation.`,renameDevice:`Rename device`,deviceName:`Device name`,rename:`Rename`,devices:`Devices`,phonesThatStaySignedIn:`Phones that stay signed in with a certificate instead of a login. Revoking one signs it out at once; it has to be paired again.`},myDevicesSection:{revoke:`Revoke "{{name}}"?`,theDeviceStopsSigningIn:`The device stops signing in at once and its open sessions end. To use it again you have to pair it anew. This cannot be undone.`,revoke2:`Revoke`,myDevices:`My devices`,phonesThatStaySignedIn:`Phones that stay signed in to your account with a certificate. If one is lost, revoke it here and it is signed out at once.`},nodesCard:{newCertificateIssuedRestartThe:`{{nodeId}}: new certificate issued. Restart the node to serve it.`,newCertificateIssuedAndServed:`{{nodeId}}: new certificate issued and served.`,renewHttpsOn:`Renew HTTPS on "{{nodeId}}"?`,aNewCertificateIsIssued:`A new certificate is issued from the local CA. Clients that trust the CA keep working.`,theNodeMakesANew:`The node makes a new key, the hub signs it and the node switches over without a restart. It keeps serving what it had if anything fails.`,renew:`Renew`,revokeTheIdentityOf:`Revoke the identity of "{{nodeId}}"?`,isDisconnectedAtOnceAnd:`{{nodeId}} is disconnected at once and can no longer connect. To bring it back it must be paired again from System → Cluster → Agents. It stays in the node list until you forget it on the Cluster page. This cannot be undone.`,revokeAndDisconnect:`Revoke and disconnect`,nodes:`Nodes`,eachNodeHoldsTwoCertificates:`Each node holds two certificates: one it serves over HTTPS, one that proves its identity to the hub. Renewing replaces a certificate without a gap; revoking an identity cuts the node off until it re-joins.`,noNodesReported:`No nodes reported.`,theCertificateRegistryIsNot:`The certificate registry is not available yet, so nodes cannot be listed.`},pairDeviceDialog:{pairADevice:`Pair a device`,createPairingCode:`Create pairing code`,done:`Done`,createsAOneTimeCode:`Creates a one-time code for a phone you hold. Scan it with the CamStack app on that phone; the phone then stays signed in as the chosen user until you revoke it.`,user:`User`,deviceName:`Device name`,howThisPhoneIsListed:`How this phone is listed, e.g. Anna's iPhone.`,annaSIphone:`Anna's iPhone`,enrollmentQrCode:`Enrollment QR code`,openTheCamstackAppOn:`Open the CamStack app on the phone and scan this code. It works once.`,expiredCreateANewCode:`Expired - create a new code`,expiresIn:`Expires in {{label}}`,theHubCouldNotName:`The hub could not name an address for this link, so the app must already know it.`,newCode:`New code`},queryBody:{couldNotRead:`Could not read {{what}}`,requestFailed:`Request failed`},nodesColumns:{served:`Served`,unreadable:`Unreadable`,notServed:`Not served`,noneRecorded:`None recorded`,offline:`Offline`,noPresentsAnother:`No - presents another`,managedByTheHub:`Managed by the hub`,renewHttps:`Renew HTTPS`,renewTheCertificateOn:`Renew the certificate on {{nodeId}}`,renewing:`Renewing…`,renewIdentity:`Renew identity`,renewTheClusterCertificateOf:`Renew the cluster certificate of {{nodeId}}`,revokeIdentity:`Revoke identity`,revokeTheClusterCertificateOf:`Revoke the cluster certificate of {{nodeId}}`,node:`Node`,httpsExpires:`HTTPS expires`,identity:`Identity`,identityExpires:`Identity expires`,inUse:`In use`,actions:`Actions`}},serverName:{title:`Name this server`,description:`Pick a name for this hub. It shows in the admin UI and on the apps’ sign-in screen. You can change it later in System settings.`,label:`Server name`,later:`Later`,invalid:`Not a valid name`}},Q={nav:{integrations:`Integrazioni`,metrics:`Metriche`,detectionSection:`Detection`,detectionIntelligence:`Persone`,vehicles:`Veicoli`,events:`Libreria`,library:`Libreria`,clusterSection:`Cluster`,nodes:`Nodi`,pipeline:`Pipeline`},system:JSON.parse(`{"title":"Amministrazione","addons":"Addon","agents":"Agenti","processes":"Processi","logs":"Log","users":"Utenti","settings":"Impostazioni","repl":"REPL","models":"Modelli","integrations":"Connettività","serverManagement":"Server","systemNav":"Sistema","secrets":"Segreti","reconnectOverlay":{"frameworkUpdated":"Framework aggiornato","isNow":"{{packageName}} è ora {{fromTo}}.","serverRestarted":"Server riavviato","manualRestartByCompleted":"Riavvio manuale richiesto da {{requestedBy}} completato.","manualRestartCompleted":"Riavvio manuale completato."},"access":{"loginSessions":"Sessioni di accesso","linkedApps":"App collegate","tokens":"Token","shareLinks":"Link di condivisione","legacyApiKeys":"Chiavi API legacy","signInLinks":"Link di accesso","audit":"Audit","credentialKinds":"Tipi di credenziali","newToken":"Nuovo token"},"addressesCard":{"address":"Indirizzo","noneNoTunnelOrTailscale":"nessuno (niente tunnel né Tailscale)","alsoAddedAsACustom":"aggiunto anche come indirizzo personalizzato","unlikelyUsable":"Probabilmente inutilizzabile","kind":"Tipo","inUseAutomatically":"{{title}}: in uso automaticamente. {{help}}","thisAddressCannotBeUsed":"Questo indirizzo non può essere usato per questo scopo.","remove":"Rimuovi {{baseUrl}}","removeThisCustomAddressIts":"Rimuovi questo indirizzo personalizzato (i suoi ruoli diventano automatici)","addresses":"Indirizzi","everyAddressThisHubIs":"Ogni indirizzo con cui questo hub è raggiungibile, rilevato o aggiunto da te. Spunta a cosa serve ciascuno.","whatAreRoles":"Cosa sono i ruoli?","automatic":"(automatico)","setByYou":"(impostato da te)","useAutomatic":"Usa automatico","useHttpAnyway":"Usa comunque http","noAddressesAvailable":"Nessun indirizzo disponibile.","customAddress":"Indirizzo personalizzato","labelOptional":"Etichetta (facoltativa)","customAddressLabel":"Etichetta indirizzo personalizzato","addCustomAddress":"Aggiungi indirizzo personalizzato"},"aiModelPicker":{"unslothQwen3635bA3b":"unsloth/Qwen3.6-35B-A3B-GGUF:UD-Q4_K_M"},"aiProfilesTab":{"toggle":"attiva/disattiva {{name}}"},"aiTestChat":{"tokMs":"{{model}} · {{value2}} tok · {{value3}} ms","sentToTheModel":"inviato al modello"},"authentication":{"authenticationProviders":"Provider di autenticazione","about":"Informazioni","setupSteps":"Passaggi di configurazione","myAccess":"Il mio accesso","users":"Utenti","pageViaActionsRemove2fa":"pagina tramite Azioni → “Rimuovi 2FA”."},"backup":{"restartServerNow":"Riavviare il server ora?","activeConnectionsWillDropAnd":"Le connessioni attive cadranno e l'hook di applicazione del backup verrà eseguito prima dell'avvio.","restart":"Riavvia","backUpNow":"Esegui backup ora","restore":"Ripristina…","newEntry":"Nuova voce","restoreScheduledRestartTheServer":"Ripristino pianificato. Riavvia il server per applicarlo.","restartNow":"Riavvia ora"},"capabilities":{"isNowActive":"{{capName}} → {{addonId}} è ora attivo.","nowInheritsTheGlobalDefault":"{{capName}} @ {{nodeId}} ora eredita il valore predefinito globale.","providerSEnabled":"{{capName}}: {{length}} provider abilitati.","capabilities":"Capability","chooseWhichProviderIsActive":"Scegli quale provider è attivo per ogni capability di sistema. Le capability singleton scelgono esattamente un provider; quelle di tipo collezione ne abilitano un insieme.","failedToLoadCapabilities":"Impossibile caricare le capability","unknownError":"Errore sconosciuto","noCapabilitiesRegistered":"Nessuna capability registrata.","singletonPickOneProvider":"Singleton — scegli un provider","collectionEnableASet":"Collezione — abilita un insieme"},"capabilityCatalog":{"installed":"Installato","install":"Installa","couldNotSearchTheNpm":"Impossibile cercare nel catalogo npm in questo momento. Riprova tra un attimo.","searchingTheNpmCatalog":"Ricerca nel catalogo npm…","noPublishedAddonDeclaresThe":"Nessun addon pubblicato dichiara la capability \\"{{capability}}\\".","everyPublishedAddonThatDeclares":"Ogni addon pubblicato che dichiara \\"{{capability}}\\" è già installato.","availableToInstall":"Disponibili per l'installazione"},"localAccess":{"lanHttp":"HTTP in LAN","nativeAppsOnThisWi":"Le app native su questa rete Wi-Fi usano http:// e saltano il certificato privato. Il tunnel e questa UI di amministrazione restano su HTTPS.","certificate":"Certificato","couldNotReadTlsStatus":"Impossibile leggere lo stato TLS.","certificateReissue":"Riemissione del certificato","restartRequired":"Riavvio necessario","theHttpsListenerStillServes":"Il listener HTTPS serve ancora il certificato precedente. Riavvia l'hub per applicarlo.","mode":"Modalità","validTo":"Valido fino al","leafSha256":"SHA-256 foglia","caSha256":"SHA-256 CA","issuerNotIncludedInThe":"Emittente non incluso nel caricamento (non è la CA locale)","regenerate":"Rigenera","issueANewLeaf":"Emettere un nuovo certificato foglia?","issuesANewLeafUnder":"Emette un nuovo certificato foglia sotto la CA locale corrente. I client che si fidano della CA continuano a funzionare. Il listener HTTPS si ricarica.","upload":"Carica","downloadCa":"Scarica CA","revertToGenerated":"Torna al generato","dropTheUploadedCertificate":"Scartare il certificato caricato?","deletesTheUploadedPairAnd":"Elimina la coppia caricata e torna alla CA locale generata.","revert":"Ripristina","certificateOrFullChainPem":"Certificato o catena completa (PEM)","privateKeyPem":"Chiave privata (PEM)","caPemOptional":"CA (PEM, facoltativa)","saveCertificate":"Salva certificato","uploadFailed":"Caricamento fallito"},"logging":{"logDestinations":"Destinazioni dei log","destinations":"Destinazioni","everyRegisteredLogDestinationEntries":"Ogni destinazione di log registrata. Le voci vengono inviate a tutte le destinazioni abilitate contemporaneamente — abilitarne una non ne disabilita un'altra.","noLogDestinationsRegistered":"Nessuna destinazione di log registrata","thisShouldNotHappenThe":"Non dovrebbe succedere — le destinazioni console e file a rotazione sono integrate. Se l'elenco è vuoto, il nodo è ancora in avvio."},"meshNetworks":{"meshNetworks":"Reti mesh","addMesh":"Aggiungi mesh","status":"Stato","meshNetworks2":"Reti mesh","privateVpnMeshesThatConnect":"Mesh VPN private che collegano CamStack ai tuoi altri dispositivi (Tailscale, Headscale, …). Ogni provider può anche esporre questo hub pubblicamente tramite il suo ingress (Tailscale Funnel).","noMeshNetworkProvidersInstalled":"Nessun provider di rete mesh installato","installAMeshAddonE":"Installa un addon mesh (es. @camstack/addon-tailscale) per unire questo hub a una mesh VPN privata.","joined":"Unito","notJoined":"Non unito","disconnect":"Disconnetti","logOut":"Esci","connect":"Connetti","endpoints":"Endpoint","tenant":"Tenant","user":"Utente","controlPlane":"Control plane","meshIp":"IP mesh","magicdns":"MagicDNS","dnsSuffix":"Suffisso DNS","peers":"Peer","keyExpiry":"Scadenza chiave","hostname":"Hostname","unknown":"(sconosciuto)","copyMagicdns":"Copia MagicDNS","copyIp":"Copia IP","connection":"Connessione","routes":"Route","txRx":"TX / RX","lastSeen":"Ultimo accesso","noPeersVisibleYourTailnet":"Nessun peer visibile — il tuo tailnet potrebbe essere vuoto o l'host non è unito."},"networkAddresses":{"pinWhichHostInterfacesExist":"Fissa quali interfacce dell'host esistono, poi spunta a cosa serve ciascun indirizzo. Aggiungi un indirizzo personalizzato quando questo hub è raggiungibile a uno che non riesce a rilevare.","allowedAddresses":"Indirizzi consentiti","reRunTheAutoDetection":"Riesegui il rilevamento automatico e sovrascrivi la lista consentita corrente con le corrispondenze migliori.","detecting":"Rilevamento…","bestMatch":"Migliore corrispondenza","clear":"Svuota","discard":"Scarta","saving":"Salvataggio…","autoEveryNonLoopbackNon":"Auto — partecipa ogni interfaccia non loopback e non link-local.","pinned":"{{value1}} fissati","loadingInterfaces":"Caricamento interfacce…","noInterfacesDetected":"Nessuna interfaccia rilevata."},"networkDiagnostics":{"loadingCameras":"Caricamento telecamere…","noCameras":"Nessuna telecamera","pickACamera":"Scegli una telecamera","camera":"Telecamera"},"notificationAlarm":{"couldNotChangeFor":"Impossibile modificare {{name}} per {{value2}}: {{error}}","alarm":"Allarme","panelDelaysAndModeCoverage":"Ritardi del pannello e copertura delle modalità.","alarmSettingsAreNotAvailable":"Le impostazioni dell'allarme non sono disponibili","thisHubHasNotBeen":"Questo hub non è ancora stato aggiornato per servire la configurazione dell'allarme.","thisInstallationHasNoAlarm":"Questa installazione non ha un pannello allarme. Il pannello viene creato dal Centro notifiche sull'hub — se questo è l'hub, la creazione è fallita e il log del server ne spiega il motivo.","thePanelWhatEachMode":"Il pannello, cosa arma ogni modalità e chi ne viene informato.","couldNotSave":"Impossibile salvare","couldNotUpdateProfile":"Impossibile aggiornare il profilo","notApplied":"Non applicato","theHubDidNotApply":"L'hub non ha applicato questa modifica — un altro editor potrebbe averla cambiata, oppure l'hub richiede un aggiornamento"},"notificationCalendarEventsEditor":{"newCalendarEvents":"Nuovi eventi del calendario","basics":"Generale","name":"Nome","horizonDays":"Orizzonte (giorni)","priority":"Priorità","enabled":"Abilitata","deliverWhenEmpty":"Invia anche se vuoto","schedule":"Pianificazione","oneSendTimePerRow":"Un orario di invio per riga. Il riepilogo parte a quel minuto.","calendars":"Calendari","targets":"Target","template":"Modello","optionalLeaveBlankForThe":"Facoltativo. Lascia vuoto per il corpo predefinito del riepilogo (domani in evidenza, poi i giorni successivi). Variabili:","title":"Titolo","body":"Corpo"},"notificationCalendarEventsPage":{"calendarEventsRulesAreNot":"Le regole per eventi del calendario non sono disponibili su questo hub","theHubAnsweredSomethingThis":"L'hub ha risposto con qualcosa che questa versione dell'admin non comprende. Aggiorna entrambi e ricarica.","thisHubHasNotBeen":"Questo hub non è ancora stato aggiornato per servire le regole per eventi del calendario. Distribuisci addon-post-analysis e ricarica — le regole stesse non sono toccate.","couldNotDeleteTheRule":"Impossibile eliminare la regola","noCalendarEventsRulesYet":"Ancora nessuna regola per eventi del calendario — creane una e i prossimi eventi arriveranno secondo la pianificazione.","calendarEvents":"Eventi del calendario","newCalendarEvents":"Nuovi eventi del calendario","rule":"Regola","when":"Quando","horizon":"Orizzonte","calendars":"Calendari","targets":"Target","lastRun":"Ultima esecuzione","on":"Attiva","toggle":"attiva/disattiva {{name}}","deleteThisCalendarEventsRule":"Eliminare questa regola per eventi del calendario?","thisWillPermanentlyDeleteThis":"Eliminerà definitivamente \\"{{name}}\\". Questa azione non può essere annullata.","delete":"elimina {{name}}"},"notificationHistory":{"body":"Corpo","when":"Quando","status":"Stato","rule":"Regola","device":"Dispositivo","kind":"Tipo","deliveryHistory":"Cronologia degli invii","aSearchableLogOfEvery":"Un registro consultabile di ogni notifica che le regole hanno inviato (o non sono riuscite a inviare).","camera":"Telecamera","allCameras":"Tutte le telecamere","window":"Intervallo","limit":"Limite","deliveryHistoryRequiresAServer":"La cronologia degli invii richiede un aggiornamento del server","theHistoryQueryIsNot":"La query della cronologia non è ancora disponibile su questo hub. Lo diventerà quando il prossimo aggiornamento del server includerà l'endpoint della cronologia del centro notifiche. Nel frattempo le regole continuano a inviare e a registrare l'esito.","noDeliveriesMatchTheseFilters":"Nessun invio corrisponde a questi filtri.","notification":"Notifica","detail":"Dettaglio"},"notificationProducerRules":{"couldNotDeleteTheRule":"Impossibile eliminare la regola","theTestRunFailed":"L'esecuzione del test è fallita","whichCamera":"Quale telecamera","nothingWasProduced":"Non è stato prodotto nulla:","dismiss":"Chiudi"},"notificationRuleActions":{"buttonsOnTheNotification":"Pulsanti sulla notifica","eachButtonRunsOneShared":"Ogni pulsante esegue una sequenza condivisa quando viene toccato.","createASequenceOnThe":"Crea prima una sequenza nella scheda Sequenze — un pulsante ne esegue una, non definisce i propri passaggi.","noButtonsTheNotificationArrives":"Nessun pulsante. La notifica arriva senza nulla da toccare.","nothingOnThisEdge":"Nulla su questo collegamento.","sequence":"Sequenza","id":"Id","label":"Etichetta","icon":"Icona"},"notificationRuleColumns":{"rule":"Regola","trigger":"Trigger","targets":"Target","lastRun":"Ultima esecuzione","priority":"Priorità","on":"Attiva","toggle":"attiva/disattiva {{name}}","openInTheSimulatorDescribe":"Apri nel simulatore — descrivi un evento e regolalo prima di iniettarlo","simulate":"simula {{name}}","duplicate":"Duplica","recreateAsOneRulePer":"Ricrea come una regola per famiglia","events":"Eventi","scope":"Ambito","cooldown":"Cooldown"},"notificationRuleConditions":{"addValue":"Aggiungi valore…","anyPhase":"— qualsiasi fase —","authoredElsewhereAndPreservedThis":"Creata altrove e conservata — questo editor admin non può ancora modificarla.","notEditableHereYetThis":"Non ancora modificabile qui — questa condizione non ha un editor admin."},"notificationRuleLastRun":{"lastRunLoading":"Caricamento ultima esecuzione","lastRunCouldNotBe":"Impossibile leggere l'ultima esecuzione: {{reason}}","historyThisRuleSDeliveries":"Cronologia — gli invii di questa regola","historyOf":"cronologia di {{name}}"},"notificationRuleSnoozeControl":{"thisRuleConcernsOrTriggers":"Questa regola riguarda — o attiva — il pannello allarme, quindi nessuna finestra di posticipo può silenziarla.","silenceThisRuleForIt":"Silenzia questa regola per {{value1}} — comparirà in \\"Silenziate ora\\"","snooze":"posticipa {{ruleName}}","silenceThisRuleNow":"Silenzia questa regola ora","opensARealSnoozeWindow":"Apre subito una vera finestra di posticipo — diversa dai pulsanti qui sopra, che scelgono solo le durate offerte dalla NOTIFICA di questa regola. Compare in \\"Silenziate ora\\" e da lì si può terminare."},"notificationRuleStatus":{"nextWindowOpens":"La prossima finestra si apre {{value1}}","noFurtherWindowOpensIn":"Nessuna altra finestra si apre nei prossimi nove giorni"},"notificationRuleTestButton":{"testNowFiresThisRule":"Testa ora — attiva questa regola e invia davvero la notifica","testNow":"testa {{ruleName}} ora","testNow2":"Testa ora"},"notificationRules":{"newRule":"Nuova regola","rules":"Regole","failedToLoadRules":"Impossibile caricare le regole","unknownError":"Errore sconosciuto","noRulesYet":"Ancora nessuna regola.","chooseARuleType":"Scegli un tipo di regola","edit":"Modifica {{name}}","newNotificationRule":"Nuova regola di notifica","saveChanges":"Salva modifiche","createRule":"Crea regola","name":"Nome","eGFrontDoorPackage":"es. Pacco alla porta d'ingresso","enabled":"Abilitata","trigger":"Trigger","deliveryTargets":"Target di consegna","noDeliveryTargetsConfiguredAdd":"Nessun target di consegna configurato. Aggiungine prima uno nella scheda Target.","notifyUsers":"Notifica gli utenti","deliversToTheTargetsEach":"Invia ai target di ciascun utente, solo per le telecamere a cui quell'utente ha accesso.","noUsersToNotify":"Nessun utente da notificare.","searchUsers":"Cerca utenti…","cooldownSeconds":"Cooldown (secondi)","aCameraThatFlapsOr":"Una telecamera che va e viene, o un nodo che si riconnette ogni minuto, altrimenti invierebbe una notifica a ogni oscillazione. Il cooldown è l'intervallo minimo tra due invii di questa regola.","theShortestGapBetweenTwo":"L'intervallo minimo tra due invii di questa regola, conteggiato come scelto qui sotto.","cooldownCounted":"Conteggio del cooldown","perDeviceADeliveryAbout":"Per dispositivo: un invio su una telecamera (o nodo) non ne blocca un altro. Intera regola: un invio per cooldown, qualunque dispositivo abbia corrisposto.","acrossObjectClasses":"Tra le classi di oggetti","separateDefaultADogAfter":"Separato (predefinito): un cane dopo un gatto viene inviato subito, un secondo gatto attende. Condiviso: un gatto blocca il cane successivo per la durata del cooldown. I suoni contano sempre per classe.","allowGlobalSnooze":"consenti posticipo globale","anyoneMaySnoozeThisRule":"Chiunque può posticipare questa regola per tutti","aSnoozeIsPersonalBy":"Un posticipo è personale per impostazione predefinita — silenzia solo chi lo ha impostato. Attivalo per una regola in cui silenziare l'intera famiglia è legittimo (il giardiniere è qui tutto il pomeriggio). Gli admin possono sempre farlo.","snoozeButtons":"Pulsanti di posticipo","notSetTheNotificationOffers":"Non impostato — la notifica offre i valori predefiniti ({{value1}}). Una pausa aperta da un pulsante silenzia questa telecamera per questa classe di soggetto, solo per chi ha ricevuto la notifica, e non invia alcun riepilogo.","noSnoozeButtonsOnThis":"Nessun pulsante di posticipo su questa regola. È una scelta esplicita: la notifica non può essere silenziata dalla schermata di blocco.","fourAtMostEverySnooze":"Al massimo quattro. Ogni pulsante di posticipo toglie spazio ai pulsanti di azione della regola — ntfy ne accetta tre in totale.","backToTheDefaults":"Torna ai valori predefiniti","silenceItNow":"Silenzia ora","priority":"Priorità","aSystemEventCarriesNo":"Un evento di sistema non porta immagini: non c'è alcun frame di telecamera dietro \\"un nodo è andato offline\\". Questa regola invia solo testo.","mediaAttachment":"Allegato multimediale","cropTheImageToThe":"Ritaglia l'immagine sulla zona della regola","attachAGifAroundThe":"Allega una GIF attorno all'evento","attachAnMp4ClipAround":"Allega una clip MP4 attorno all'evento","videoQuality":"Qualità video","aNotificationIsWatchedOn":"Una notifica si guarda su un telefono — di norma lo stream più leggero è quello giusto, e il profilo alto costa solo CPU per il rendering.","playbackSpeed":"Velocità di riproduzione","aNotificationClipIsGlanced":"Una clip di notifica si guarda al volo, non si guarda per intero: a 2× il destinatario vede l'intero passaggio in metà tempo e il file pesa la metà. Il tempo reale serve quando il dettaglio conta più del colpo d'occhio.","linkedCameras":"Telecamere collegate","whenTheSensorIsLinked":"Quando il sensore è collegato a più telecamere, tutte vengono fotografate nel momento in cui scatta. Le telecamere offline o in sospensione sono escluse.","imageFrame":"Inquadratura dell'immagine","whatTheAttachedStillShows":"Cosa mostra la foto allegata. \\"Automatico\\" lo lascia alla modalità di allegato qui sopra.","notificationTitle":"Titolo della notifica","notificationBody":"Corpo della notifica","leaveBothBlankForThe":"Lascia vuoti entrambi per usare il testo dell'hub (modificabile nella scheda Testi).","whichSystemEvents":"Quali eventi di sistema","conditions":"Condizioni","thisIsASoundRule":"Questa è una regola AUDIO: scatta su una finestra di campionamento audio confermata, mai su un'immagine. Indica i suoni e/o mantieni una soglia di livello — senza nessuno dei due non può mai corrispondere. Tutto il resto qui sotto si combina comunque (ambito telecamere, pianificazione).","thisIsAnOccupancyRule":"Questa è una regola di OCCUPAZIONE: scatta quando il conteggio in un'inquadratura o in una zona supera la soglia e vi resta. Scegli prima la telecamera nella scheda Dispositivi — l'elenco delle zone è quello di quella telecamera.","pickTheEventsThisRule":"Scegli gli eventi a cui reagisce questa regola, poi restringili se vuoi. Nient'altro in una regola di sistema è una condizione — dietro non c'è alcuna detection.","conditionCatalogUnavailableThisRule":"Catalogo condizioni non disponibile — questa regola corrisponde solo in base al suo trigger e ai target.","testThisRuleForReal":"Testa questa regola per davvero","buildsTheEventThisRule":"Costruisce l'evento a cui si riferisce questa regola, esegue la valutazione e l'invio REALI, e manda la notifica a ogni target — con [TEST] nel corpo. Il cooldown e il silenziamento della telecamera sono ignorati (nessuna finestra viene consumata); le azioni della regola non vengono mai eseguite. Solo condizioni salvate: salva prima per testare una modifica.","testRule":"Testa regola","dryRunLast60Min":"Simulazione (ultimi 60 min)","evaluateTheCurrentUnsavedRule":"Valuta la regola CORRENTE (non salvata) sui record persistiti di recente — nessuna notifica viene inviata.","rule":"Regola","targets":"Target","deviceEventRulesCannotBe":"Le regole per eventi di dispositivo non possono essere simulate: l'archivio degli eventi dei sensori non ha una superficie di scansione tra dispositivi, quindi un test non restituisce record candidati. La regola continua a scattare dal vivo alla pressione di un campanello o al cambio di un sensore corrispondente.","noRecordsInTheLast":"Nessun record negli ultimi 60 minuti corrisponde — niente da valutare."},"notificationSequences":{"name":"Nome","minDelayS":"Ritardo min. (s)","step":"Passaggio","steps":"Passaggi","deleteThisSequence":"Eliminare questa sequenza?","willBeRemovedRulesAnd":"“{{name}}” verrà rimossa. Le regole e i pulsanti collegati mantengono l'id finché non li riassegni.","delete":"Elimina {{name}}","sequences":"Sequenze","namedStepListsSharedBy":"Elenchi di passaggi con nome condivisi da regole e pulsanti di notifica. Una regola ne usa uno tramite id; due regole che condividono un gate ne condividono il throttle.","couldNotReadSequences":"Impossibile leggere le sequenze","noSequencesYetCreateOne":"Ancora nessuna sequenza. Creane una, poi collegala dalla scheda Azioni di una regola.","edit":"Modifica {{value1}}","newSequence":"Nuova sequenza","saving":"Salvataggio…","seconds":"Secondi"},"notificationSimulate":{"simulateAnEvent":"Simula un evento","injectASyntheticDetectionDoorbell":"Inietta una detection sintetica, la pressione di un campanello o un cambio di occupazione e vedi esattamente quali regole corrispondono, su quale condizione ciascuna fallisce e cosa verrebbe inviato. Nulla viene salvato — nessuna track, nessuna riga evento, nessun media.","failedToLoadCameras":"Impossibile caricare le telecamere","unknownError":"Errore sconosciuto","ruleToSimulate":"Regola da simulare","pickARuleToPrefill":"— scegli una regola per precompilare trigger e condizioni —","picksTheTriggerThatRule":"Sceglie il trigger a cui la regola è in ascolto e compila i campi dalle sue condizioni. Modifica qualsiasi valore qui sotto, poi inietta.","camera":"Telecamera","loadingCameras":"Caricamento telecamere…","pickACamera":"— scegli una telecamera —","theCameraTheEventIs":"La telecamera a cui è attribuito l'evento — ciò che mostra una notifica.","trigger":"Trigger","quality":"Qualità","everyFieldHereCanBe":"Ogni campo qui può essere lasciato VUOTO, e vuoto è uno stato reale: una regola con confidenza minima FALLISCE su un soggetto che non ne ha. Lascia un campo vuoto per riprodurre esattamente questo caso.","labelIdentityNamePlateSubclass":"Etichetta (nome identità / targa / sottoclasse)","eGMarcoAb123cd":"es. Marco, AB123CD","detectionConfidence":"Confidenza della detection","labelMatchConfidence":"Confidenza di corrispondenza dell'etichetta","importance":"Importanza","dwellSeconds":"Permanenza (secondi)","howToRunIt":"Come eseguirlo","ignoreTheCooldown":"Ignora il cooldown","aRuleThatAlreadyFired":"Una regola scattata da poco di norma viene silenziata. Attiva per farla scattare comunque; lascia disattivato per VEDERE la soppressione.","ignoreMutesAndSnoozes":"Ignora silenziamenti e posticipi","aMutedCameraOrA":"Una telecamera silenziata o una regola posticipata scarta l'evento prima di consultare qualsiasi regola.","runTheRuleSActions":"Esegui le azioni della regola — aziona dispositivi reali","aMatchedRuleSOntrigger":"Le sequenze onTrigger di una regola corrispondente vengono eseguite davvero: le serrature si aprono, le luci si accendono, le sirene suonano. Disattivato a meno che non lo vuoi davvero.","stillImage":"Immagine fissa","liveSnapshotOfTheCamera":"Snapshot live della telecamera","noImage":"Nessuna immagine","evaluateOnlyOneRule":"Valuta solo una regola","everyEnabledRule":"— tutte le regole abilitate —","nothingIsPersistedNoTrack":"Nulla viene salvato: nessuna track, nessuna riga evento, nessun media archiviato. L'invio è reale.","injectEvent":"Inietta evento","theHubAnsweredButThis":"L'hub ha risposto, ma questa versione non è riuscita a leggere la risposta. È così che appare un hub più vecchio del simulatore — aggiorna il server, poi riesegui."},"notificationSimulateFields":{"whatHappened":"Cosa è successo","audioClasses":"Classi audio","audioClassId":"Id classe audio…","zones":"Zone","detectedClasses":"Classi rilevate","classIdPersonCar":"Id classe (person, car…)","zonesTheSubjectIsIn":"Zone in cui si trova il soggetto","packagePhase":"Fase del pacco","none":"— nessuna —","delivered":"Consegnato","pickedUp":"Ritirato","eventKind":"Tipo di evento","loadingKinds":"Caricamento tipi…","pickAKind":"— scegli un tipo —","pickACameraFirstSensor":"Scegli prima una telecamera — i tipi di sensore e di controllo provengono dai dispositivi collegati.","thisCameraHasNoLinked":"Questa telecamera non ha sensori o dispositivi di controllo collegati, quindi non può produrre eventi di dispositivo. Collegane uno prima dalla pagina della telecamera.","sourceDevice":"Dispositivo sorgente","theCameraItself":"la telecamera stessa","theLinkedDeviceWhoseState":"Il dispositivo collegato il cui stato è cambiato. Compilato automaticamente quando scegli un tipo.","filledInFromContributedBy":"Compilato da \\"{{label}}\\" — fornito dal dispositivo #{{deviceId}} tramite la capability {{capName}}.","eventTypeToken":"Token del tipo di evento","pressPressLong":"press, press_long…","onlyEventEmitterSourcesCarry":"Solo le sorgenti che emettono eventi ne hanno uno. Un sensore passivo non ne emette, e una regola che filtra su un token fallirebbe per esso.","zone":"Zona","leaveEmptyForTheWhole":"Lascia vuoto per l'intera inquadratura.","class":"Classe","anyClass":"— qualsiasi classe —","countNow":"Conteggio attuale","countBefore":"Conteggio precedente","threshold":"Soglia","occupied":"Occupato","advanced":"Avanzate","zoneCrossing":"attraversamento di zona","thisEventIsAConfirmed":"Questo evento è un attraversamento di zona confermato","enteredTheZone":"Entrato nella zona","leftTheZone":"Uscito dalla zona","boundingBox":"bounding box","carryABoundingBox":"Includi una bounding box","normalized01TopLeft":"Normalizzata 0–1, origine in alto a sinistra. Alimenta la condizione \`customZones\` e decide come l'immagine viene ritagliata o riquadrata.","happenedAt":"Avvenuto alle","set":"Imposta","now":"Adesso","emptyNowSetItTo":"Vuoto = adesso. Impostalo a un orario dentro (o fuori) la finestra di pianificazione di una regola per testarla senza aspettare l'ora.","detectionSource":"Sorgente della detection","unsetReadsAsPipeline":"— non impostata (equivale a pipeline) —","pipeline":"Pipeline","onboardCamera":"A bordo (telecamera)","sensor":"Sensore","audio":"Audio","actuatesDevices":"aziona dispositivi"},"notificationSimulateResult":{"copyRecordId":"Copia id record","didNotMatchTheEngine":"Nessuna corrispondenza. Il motore non ha riportato alcun id di condizione fallita."},"notificationSnoozes":{"silencedRightNow":"Silenziate ora","nothingIsSilencedASnooze":"Nulla è silenziato. Un posticipo aperto dall'app o da un pulsante di notifica compare qui finché il suo timer non scade.","noSummary":"nessun riepilogo","endNow":"Termina ora"},"notificationSummaries":{"summaryRulesAreNotAvailable":"Le regole di riepilogo non sono disponibili su questo hub","theHubAnsweredSomethingThis":"L'hub ha risposto con qualcosa che questa versione dell'admin non comprende. Aggiorna entrambi e ricarica.","thisHubHasNotBeen":"Questo hub non è ancora stato aggiornato per servire le regole di riepilogo. Distribuisci addon-post-analysis e ricarica — nel frattempo non si perde nulla.","couldNotDeleteTheRule":"Impossibile eliminare la regola","theTestRunFailed":"L'esecuzione del test è fallita","nothingWasProduced":"Non è stato prodotto nulla:","dismiss":"Chiudi","noSummaryRulesYetCreate":"Ancora nessuna regola di riepilogo — creane una e ogni finestra che copre arriverà come un'unica immagine.","summaries":"Riepiloghi","newSummary":"Nuovo riepilogo","digest":"Riepilogo","aiOff":"AI disattivata","cameras":"Telecamere","window":"Finestra","keeps":"Conserva","mosaic":"Mosaico","targets":"Target","lastRun":"Ultima esecuzione","on":"Attivo","toggle":"attiva/disattiva {{name}}","produceThisDigestNowAnd":"Produci questo riepilogo ora e INVIALO","test":"testa {{name}}","deleteThisSummary":"Eliminare questo riepilogo?","thisWillPermanentlyDeleteThis":"Eliminerà definitivamente \\"{{name}}\\". Questa azione non può essere annullata.","delete":"elimina {{name}}"},"notificationSummaryEditor":{"newSummary":"Nuovo riepilogo","edit":"Modifica {{name}}","whatItIs":"Di cosa si tratta","oneWindowOnePictureThe":"Una finestra, un'immagine: il miglior scatto di ogni track contenuta nella finestra, disposto in un unico mosaico e inviato una sola volta.","name":"Nome","eGOvernightSweep":"es. Controllo notturno","enabled":"Abilitato","cameras":"Telecamere","everyCameraInTheDigest":"Ogni telecamera del riepilogo ottiene almeno un riquadro se ha contribuito con qualcosa — un riepilogo in cui due telecamere su sei non compaiono mai non è multi-telecamera.","theFirstCameraSelectedOwns":"La prima telecamera selezionata è la titolare della notifica inviata.","whenTheWindowCloses":"Quando si chiude la finestra","window":"Finestra","motionOpenedAndClosedBy":"Movimento — aperta e chiusa dall'attività","scheduleFixedWeeklyWindows":"Pianificazione — finestre settimanali fisse","quietPeriodSeconds":"Periodo di quiete (secondi)","theWindowOpensOnThe":"La finestra si apre al primo movimento su una di queste telecamere e resta aperta finché ne arriva altro. Questo intervallo di silenzio la chiude.","longestWindowSeconds":"Finestra massima (secondi)","aPermanentlyBusyDrivewayWould":"Un vialetto sempre trafficato altrimenti non invierebbe mai nulla. A questo limite la finestra si chiude con ciò che contiene.","weeklyWindows":"Finestre settimanali","theDigestIsProducedWhen":"Il riepilogo viene prodotto quando una finestra SI CHIUDE e copre esattamente quella finestra. La prima è la prima che si chiude dopo il salvataggio — nulla viene recuperato dal passato.","waitForOpenTracksSeconds":"Attendi le track aperte (secondi)","aTrackSBestShot":"Il miglior scatto di una track viene scritto quando la track TERMINA. Renderizzare nell'istante in cui la finestra si chiude mostrerebbe ogni soggetto ancora in movimento senza immagine. 0 disattiva l'attesa.","whatGoesIn":"Cosa include","evaluatedOnTracksOnePassage":"Valutato sulle track: un passaggio è un riquadro.","classes":"Classi","emptyEveryClassOnlyThe":"Vuoto = ogni classe. Sono offerte solo le macro classi: un riepilogo corrisponde alla classe memorizzata sulla track, e le track memorizzano macro classi — un sottotipo non corrisponderebbe mai a nulla.","excludedClasses":"Classi escluse","zones":"Zone","zonesAreScopedPerCamera":"Le zone sono per telecamera: sceglierne una su una telecamera non silenzia le altre, che continuano a corrispondere sull'intera inquadratura.","minimumImportance":"Importanza minima","thePipelineSOwnScore":"Il punteggio della pipeline stessa, 0–1. Vuoto conserva tutto.","minimumStaySeconds":"Permanenza minima (secondi)","dropsThePassagesTooBrief":"Scarta i passaggi troppo brevi per meritare un riquadro.","includeParkedObjects":"Includi oggetti parcheggiati","offByDefaultACar":"Disattivato per impostazione predefinita. Un'auto lasciata nel vialetto viene tracciata finché non è riconosciuta come parcheggiata, e resta parcheggiata finché c'è — con questa opzione attiva, un riepilogo si riempie dello stesso oggetto fermo invece dei passaggi. Gli oggetti parcheggiati restano comunque nella pagina Eventi.","theMosaic":"Il mosaico","tiles":"Riquadri","9A33Grid":"9 (una griglia 3×3) è il massimo che la miniatura sulla schermata di blocco del telefono può contenere restando leggibile.","whenThereAreMoreTracks":"Quando ci sono più track che riquadri","everyContributingCameraKeepsIts":"Ogni telecamera che contribuisce mantiene per prima il suo miglior riquadro; i posti rimanenti vanno secondo questa classifica.","textOnTheMosaic":"Testo sul mosaico","imagesOnlyIsTheDefault":"Solo immagini è il valore predefinito, ed è ciò che fa una regola senza nulla di impostato qui. Tutto ciò che viene disegnato resta impresso nell'immagine per sempre — un'etichetta copre la parte bassa del riquadro, dove ci sono piedi, ruote e pacchi, e una didascalia da una detection sbagliata non si può più cancellare. Nulla a valle ha bisogno delle parole: il riepilogo scritto legge i frame stessi e riceve nel prompt la telecamera, la classe e l'ora.","captionBurnedOntoTheMosaic":"Didascalia impressa sul mosaico","leaveEmptyForNoCaption":"Lascia vuoto per nessuna didascalia","acrossTheTopBand":"Lungo la fascia superiore.","onlyDrawnWithTileLabels":"Disegnata solo con “etichette sui riquadri e una didascalia in alto”. Quello che scrivi qui viene conservato comunque.","writtenSummary":"Riepilogo scritto","oneVisionCallOverThe":"Una sola chiamata di visione sui migliori frame della finestra INSIEME, così la risposta è un resoconto di ciò che è successo e non un elenco di immagini. La frase va nel corpo della notifica.","haveAModelDescribeThe":"Fai descrivere la finestra a un modello","offByDefaultTheMosaic":"Disattivato per impostazione predefinita. Il mosaico e i conteggi vengono inviati comunque.","theSwitchAboveIsOff":"L'interruttore qui sopra è disattivato, quindi nulla sotto di esso è modificabile. Tutto ciò che hai già impostato viene conservato — riattivandolo i campi tornano esattamente come li avevi lasciati.","visionProfile":"Profilo di visione","theHubSDefaultVision":"Il profilo di visione predefinito dell'hub","thisHubDidNotAnswer":"Questo hub non ha risposto con un elenco di profili — il riepilogo userà ciò che l'addon AI risolve per il consumer “ai-summary”.","noVisionCapableProfileOn":"Ancora nessun profilo con capacità di visione su questo hub. Aggiungine uno in AI → Profili; fino ad allora il riepilogo viene inviato senza testo.","onlyVisionCapableProfilesAre":"Sono offerti solo profili con capacità di visione — una chiamata di visione su un profilo testuale viene rifiutata, mai degradata.","answerIn":"Rispondi in","donTAskForA":"Non richiedere una lingua","nothingIsAddedToThe":"Nulla viene aggiunto al prompt a meno che tu ne scelga una, e questi modelli rispondono in inglese di loro.","yourQuestionOptional":"La tua domanda (facoltativa)","eGTellMeWhether":"es. Dimmi se qualcuno si è avvicinato al cancello e se è stato lasciato un pacco.","leaveBlankForWhatHappened":"Lascia vuoto per “cosa è successo in questo periodo?”. Le tue parole sono l'unico testo libero che riceve il modello: i nomi delle telecamere e ciò che la pipeline ha classificato vengono prima ridotti a etichette semplici, e qualsiasi cosa scritta DENTRO un frame — un cartello, una targa, un overlay — è trattata come scenario, mai come istruzione.","framesTheModelMayLook":"Frame che il modello può guardare","theHighestRankedTilesSent":"I riquadri meglio classificati, inviati come UNA sola domanda. Limitato separatamente dal numero di riquadri — uno è limitato dai pixel, l'altro dal tempo del modello — e mai superiore ad esso.","timeLimitSeconds":"Limite di tempo (secondi)","nobodyIsWaitingOnA":"Nessuno aspetta un riepilogo sul telefono, quindi è generoso. Al limite la generazione viene annullata, non semplicemente abbandonata.","frameSizeSentPixels":"Dimensione dei frame inviati (pixel)","longestEdge448IsThe":"Lato più lungo. 448 è la dimensione nativa dei riquadri di questi encoder di visione — valori maggiori costano token e latenza senza aggiungere dettaglio visibile all'encoder.","ifTheModelGivesNo":"Se il modello non dà risposta","aColdModelAnUnreachable":"Un modello freddo, un endpoint irraggiungibile o una risposta che l'hub non riesce a interpretare rientrano tutti in questo caso. Il valore predefinito invia: il mosaico e i conteggi valgono più del silenzio, e una finestra chiusa non torna.","delivery":"Consegna","priority":"Priorità","deliverAWindowThatMatched":"Invia una finestra senza corrispondenze","offByDefaultANightly":"Disattivato per impostazione predefinita: un “0 eventi” notturno è una riga che nessuno legge, e toglie il lettore alle righe accanto.","create":"Crea"},"notificationSystemEventDelivery":{"delivery":"Consegna","instantANotificationPerEvent":"Immediata — una notifica per evento","summaryOnScheduleTheCurrent":"Riepilogo pianificato — lo stato attuale, a orari stabiliti","nothingIsSentPerEvent":"Nulla viene inviato per singolo evento. A ciascun orario qui sotto, una notifica elenca ciò che è ancora vero per i tipi e i filtri di questa regola — batterie scariche, materiali di consumo, dispositivi o stream offline, aggiornamenti disponibili — oppure una notifica per categoria, se lo scegli qui sotto. Se non c'è nulla da segnalare, non viene inviato nulla. Fuso orario:","theHubS":"quello dell'hub","howTheSummaryIsSent":"Come viene inviato il riepilogo","oneMessageWithEveryCategory":"Un messaggio con tutte le categorie","oneNotificationPerCategoryBatteries":"Una notifica per categoria (batterie, materiali di consumo, dispositivi…)","readingTheState":"Lettura dello stato…","previewTheSummaryNow":"Anteprima del riepilogo ora"},"notificationTargets":{"target":"Target","kind":"Tipo","owner":"Proprietario","on":"Attivo","toggle":"attiva/disattiva {{name}}","test":"Test","duplicate":"Duplica","notificationTargets":"Target di notifica","deliverNotificationsToNtfyPushover":"Invia le notifiche a ntfy, Pushover, Telegram, Home Assistant e altro. Il tipo di ogni target dichiara le sue capability; il pannello di test mostra esattamente a cosa degrada un messaggio.","addTarget":"Aggiungi target","failedToLoadTargets":"Impossibile caricare i target","unknownError":"Errore sconosciuto","noNotificationTargetsYetClick":"Ancora nessun target di notifica. Clicca \\"Aggiungi target\\" per configurarne uno.","chooseANotificationKind":"Scegli un tipo di notifica","noNotificationProvidersAreInstalled":"Nessun provider di notifica installato. Installa l'addon notifiers (o collega Home Assistant) per aggiungere target.","saveChanges":"Salva modifiche","createTarget":"Crea target","name":"Nome","systemSharedAdminManaged":"Sistema (condiviso, gestito dagli admin)","aUserOwnedTargetBelongs":"Un target di proprietà di un utente appartiene a quell'utente: compare nel suo viewer e le sue regole possono inviarvi. I target di sistema restano gestiti dagli admin.","storedSecretsLoadIntoThe":"I segreti memorizzati vengono caricati nei campi mascherati (occhio per mostrarli). Svuota un campo per lasciare invariato il valore memorizzato al salvataggio; digita un nuovo valore per sostituirlo.","testConnection":"Test connessione","connected":"Connesso — {{value1}}","connectionFailed":"Connessione fallita"},"notificationTestPanel":{"level":"Livello","deriveFromPriority":"— ricava dalla priorità —","requiresTargetConfig":"Richiede la configurazione del target:","priorityOrdinal":"Priorità (ordinale):","format":"Formato","title":"Titolo","mode":"(modalità:","mb":", ≤{{value1}}MB","url":"URL {{mt}}","clickUrl":"URL al clic","sound":"Suono","ttlSeconds":"TTL (secondi)","tag":"Tag","payloadPreview":"Anteprima del payload","sendTest":"Invia test","delivered":"Consegnato","failed":"Fallito","resolvedLevel":"Livello risolto","formatSent":"Formato inviato","attachmentsSent":"Allegati inviati","actionsSent":"Azioni inviate","truncated":"Troncato","dropped":"Scartato"},"notificationTexts":{"englishFallback":"Fallback in inglese","resetToTheShippedWording":"Ripristina il testo originale","shipped":"Originale:","texts":"Testi","theNotificationTextCatalogIs":"Il catalogo dei testi di notifica non è disponibile su questo hub","theHubAnsweredSomethingThis":"L'hub ha risposto con qualcosa che questa versione dell'admin non comprende. Aggiorna entrambi e ricarica.","thisHubHasNotBeen":"Questo hub non è ancora stato aggiornato per servire il catalogo dei testi di notifica. Distribuisci addon-post-analysis e ricarica — nel frattempo non si perde nulla: le notifiche continuano a usare il testo originale.","couldNotChangeTheLanguage":"Impossibile cambiare la lingua","couldNotSave":"Impossibile salvare","hubLanguage":"Lingua dell'hub","everyNotificationIsWrittenIn":"Ogni notifica è scritta in questa lingua.","editing":"Modifica di","ofTextsCustomised":"{{overriddenCount}} testi su {{length}} personalizzati.","thisHubDoesNotSpeak":"Questo hub non parla questa lingua — queste parole non sono ancora in uso.","aRuleThatWritesIts":"Una regola che scrive un proprio titolo o corpo prevale comunque su tutto ciò che c'è qui — questa pagina contiene il testo usato quando una regola non ne ha uno.","searchAKeyOrA":"Cerca una chiave o una frase…","save":"Salva {{pending}}","noTextMatchesThatSearch":"Nessun testo corrisponde a questa ricerca."},"notificationTimelapseEditor":{"newTimelapse":"Nuovo timelapse","edit":"Modifica {{name}}","whatItIs":"Di cosa si tratta","oneVideoPerCameraAssembled":"Un video per telecamera, assemblato dal girato REGISTRATO di quella telecamera alla chiusura della finestra.","name":"Nome","eGNightDriveway":"es. Vialetto di notte","enabled":"Abilitato","cameras":"Telecamere","eachCameraRendersAndDelivers":"Ogni telecamera renderizza e invia il proprio video. La registrazione deve essere ATTIVA per una telecamera — un timelapse viene ricavato dal girato registrato, e l'hub rifiuta una regola per una telecamera che non registra.","when":"Quando","weeklyWindows":"Finestre settimanali","theVideoCoversExactlyOne":"Il video copre esattamente una finestra e viene inviato quando SI CHIUDE. Una finestra che attraversa la mezzanotte (21:00 → 07:00) è il caso ordinario di un timelapse notturno.","sampling":"Campionamento","twoRatesABaseRate":"Due frequenze: una di base per l'intera finestra e una più fitta negli intervalli in cui è stato rilevato qualcosa.","baseCadenceSeconds":"Cadenza di base (secondi)","oneFrameEveryNSeconds":"Un frame ogni N secondi nelle parti tranquille della finestra.","outputFrameRateFps":"Frame rate di output (fps)","howFastTheAssembledVideo":"Quanto velocemente viene riprodotto il video assemblato.","denseCadenceNearTheDetections":"Cadenza fitta, vicino alle detection","automaticS":"Automatica ({{seconds}}s)","setItMyself":"La imposto io","minimumSecondsOfVideoPer":"Secondi minimi di video per detection (facoltativo)","stateTheStayAndLet":"Indica la permanenza e lascia che il renderer calcoli la cadenza. Campiona sempre e solo più FITTO, fino all'intervallo tra frame della registrazione — un passaggio troppo breve per raggiungerlo viene renderizzato con tutti i frame esistenti e non di più.","theNotification":"La notifica","preview":"Anteprima","priority":"Priorità","captionOnThePreviewFrame":"Didascalia sul frame di anteprima","shippedDefault":"{{DEFAULT_TIMELAPSE_PREVIEW_TEXT}} (predefinito originale)","emptyAndSetThePreview":"Vuoto e impostato: il frame di anteprima NON ha didascalia.","leaveUntouchedForTheShipped":"Lascia invariato per la didascalia originale ({{DEFAULT_TIMELAPSE_PREVIEW_TEXT}}).","backToTheShippedCaption":"Torna alla didascalia originale","create":"Crea"},"notificationTimelapses":{"timelapseRulesAreNotAvailable":"Le regole timelapse non sono disponibili su questo hub","theHubAnsweredSomethingThis":"L'hub ha risposto con qualcosa che questa versione dell'admin non comprende. Aggiorna entrambi e ricarica.","thisHubHasNotBeen":"Questo hub non è ancora stato aggiornato per servire le regole timelapse. Distribuisci addon-post-analysis e ricarica — le regole stesse non sono toccate.","couldNotDeleteTheRule":"Impossibile eliminare la regola","theTestRunFailed":"L'esecuzione del test è fallita","nothingWasProduced":"Non è stato prodotto nulla:","dismiss":"Chiudi","noTimelapseRulesYetCreate":"Ancora nessuna regola timelapse — creane una e il girato registrato di ogni notte arriverà come breve video.","whichCamera":"Quale telecamera","timelapses":"Timelapse","newTimelapse":"Nuovo timelapse","timelapse":"Timelapse","cameras":"Telecamere","cameras2":"{{length}} telecamere","window":"Finestra","sampling":"Campionamento","targets":"Target","lastRun":"Ultima esecuzione","on":"Attivo","toggle":"attiva/disattiva {{name}}","renderThisRuleSLast":"Renderizza ora l'ultima finestra chiusa di questa regola e INVIALA","test":"testa {{name}}","deleteThisTimelapse":"Eliminare questo timelapse?","thisWillPermanentlyDeleteThis":"Eliminerà definitivamente \\"{{name}}\\". Questa azione non può essere annullata.","delete":"elimina {{name}}"},"oidcSettingsConnections":{"deleteOidcConnection":"Eliminare la connessione OIDC?","removeTheLoginButtonAnd":"Rimuovi “{{displayName}}” ({{id}}). Il pulsante di login e le credenziali IdP per questo id vengono eliminati.","id":"Id","name":"Nome","issuer":"Emittente","status":"Stato","configured":"Configurata","notConfigured":"Non configurata","delete":"Elimina {{displayName}}","eachRowIsOneIdp":"Ogni riga è un IdP. URI di reindirizzamento:","addConnection":"Aggiungi connessione","couldNotLoadConnections":"Impossibile caricare le connessioni.","noOidcConnectionsYetAdd":"Ancora nessuna connessione OIDC. Aggiungine una per registrare un IdP.","addOidcConnection":"Aggiungi connessione OIDC","edit":"Modifica {{value1}}","saving":"Salvataggio…","instanceId":"Id istanza","urlSlugAppearsInAddon":"Slug URL — compare in /addon/{{addonId}}/<id>/callback. Stabile; dopo il salvataggio non può essere rinominato.","instanceId2":"Id istanza:","loadingForm":"Caricamento modulo…"},"pemField":{"chooseFile":"Scegli file"},"remoteAccess":{"remoteAccess":"Accesso remoto","addTunnel":"Aggiungi tunnel","remoteAccess2":"Accesso remoto","publicFacingTunnelsThatExpose":"Tunnel pubblici che espongono questo hub a internet (Cloudflare Tunnel, ngrok, …).","noRemoteAccessProvidersInstalled":"Nessun provider di accesso remoto installato","installATunnelAddonE":"Installa un addon tunnel (es. @camstack/addon-cloudflare) per esporre pubblicamente questo hub.","connected":"Connesso","disconnected":"Disconnesso","stop":"Ferma","start":"Avvia"},"storage":{"disable":"Disabilitare \\"{{displayName}}\\"?","nothingIsDeletedSetThe":"{{consequence}} Nulla viene eliminato — riporta la posizione a Sola lettura o Attiva per recuperarne i filmati.","deleteLocation":"Eliminare la posizione \\"{{displayName}}\\"?","thisRemovesTheLocationRecord":"Rimuove il record della posizione. I file su disco non vengono eliminati; la directory o il percorso remoto sottostante resta intatto.","deleteAnyway":"Eliminare comunque?","forceDelete":"Forza eliminazione","loadingLocations":"Caricamento posizioni…","failedToLoadStorageLocations":"Impossibile caricare le posizioni di archiviazione.","noStorageLocationsDeclaredBy":"Nessuna posizione di archiviazione dichiarata da alcun addon installato."},"system":{"settings":"Impostazioni","secrets":"Segreti","capabilities":"Capability"},"turnServers":{"turnProviders":"Provider TURN","addProvider":"Aggiungi provider","discoveredIceServers":"Server ICE rilevati","turnServers":"Server TURN","iceServersUsedForWebrtc":"Server ICE usati per l'attraversamento NAT di WebRTC. Più provider possono coesistere — il livello WebRTC concatena, per ogni sessione, i server di tutti i provider abilitati.","noTurnProvidersInstalled":"Nessun provider TURN installato","installATurnAddonE":"Installa un addon TURN (es. @camstack/addon-cloudflare) per abilitare WebRTC dietro NAT restrittivi.","combinedIceServerListAll":"Elenco combinato dei server ICE — tutti i provider abilitati","noServersFromEnabledProviders":"Nessun server dai provider abilitati."},"wasteSettingsSources":{"countryService":"Paese e servizio","country":"Paese","selectCountry":"Seleziona paese…","service":"Servizio","pickACountryFirst":"Scegli prima un paese","selectService":"Seleziona servizio…","newSource":"Nuova sorgente","deleteWasteSource":"Eliminare la sorgente rifiuti?","removeItsCalendarUnderSystem":"Rimuovi “{{label}}” ({{id}}). Il suo calendario in Sistema → Calendari viene eliminato.","label":"Etichetta","module":"Modulo","enabled":"Abilitata","on":"Attiva","off":"Disattiva","delete":"Elimina {{label}}","pickACountryAndA":"Scegli un paese e un servizio — i campi di configurazione provengono da quella sorgente HACS.","addSource":"Aggiungi sorgente","couldNotLoadSources":"Impossibile caricare le sorgenti.","noWasteSourcesYetAdd":"Ancora nessuna sorgente rifiuti. Aggiungine una per registrare un servizio comunale.","addWasteSource":"Aggiungi sorgente rifiuti","edit":"Modifica {{value1}}","saving":"Salvataggio…","loadingFields":"Caricamento campi…","chooseACountryAndService":"Scegli un paese e un servizio per vedere i campi richiesti."},"alarmLiveCard":{"panel":"Pannello","thisHubDoesNotReport":"Questo hub non riporta ancora lo stato live del pannello — aggiornalo per armare da qui.","disarm":"Disarma","thePanelDidNotDo":"Il pannello non lo ha eseguito","armAnyway":"Arma comunque","eachOpenDeviceIsIgnored":"Ogni dispositivo aperto viene ignorato finché non si chiude, poi torna monitorato.","excludedSensors":"Sensori esclusi","noSensorIsExcluded":"Nessun sensore escluso."},"alarmModeCard":{"armsNothingNoEnabledRule":"Non arma nulla — nessuna regola abilitata dipende da questa modalità","checkingWhichDevicesAreOpenings":"Verifica di quali dispositivi sono aperture…","usesTheSystemDefaultS":"Usa il valore predefinito di sistema ({{value1}} s)","default":"Predefinito","useTheDefault":"Usa il predefinito","useTheDefault2":"{{label}}: usa il predefinito","afterTrigger":"Dopo il trigger","usesTheSystemDefault":"Usa il valore predefinito di sistema","afterTriggerUseTheDefault":"Dopo il trigger: usa il predefinito","activationSchedule":"Pianificazione di attivazione","whenThisModeMayBe":"Quando questa modalità può essere armata. Vuoto significa qualsiasi giorno e ora.","noSensorIsCoveredBy":"Nessun sensore è coperto da una regola di questa modalità."},"alarmProfileBar":{"profile":"Profilo","deleteThisProfile":"Elimina questo profilo","newName":"Nuovo nome","newProfileName":"Nome del nuovo profilo","rename":"Rinomina","createWithSystemDefaults":"Crea con i valori predefiniti di sistema","create":"Crea","cloneTheSelectedProfile":"Clona il profilo selezionato","clone":"Clona","createStartsFromSystemDefaults":"Crea parte dai valori predefiniti di sistema. Clona copia il profilo selezionato (sensori, messa in sicurezza all'armamento, ritardi). Il cambio applica quel profilo al prossimo armamento."},"alarmSensorTable":{"name":"Nome","type":"Tipo","state":"Stato","checkedWhenArming":"Verificato all'armamento","blocksArming":"Blocca l'armamento","blocksArming2":"Blocca l'armamento: {{name}}","closeLockOrTurnOff":"Chiudi, blocca o spegni quando questa modalità arma","secureOnArm":"Metti in sicurezza all'armamento","secureOnArmCloseLock":"Metti in sicurezza all'armamento (chiudi/blocca/spegni): {{name}}","couldNotReadTheSensor":"Impossibile leggere lo stato dei sensori.","searchSensors":"Cerca sensori"},"notificationClassScopeField":{"addValue":"Aggiungi valore…"},"notificationConditionWidgets":{"remove":"rimuovi {{v}}","customValueClickToRemove":"Valore personalizzato — clicca per rimuoverlo","eventToken":"Token evento…","subTypeNeverCountsAlways":"{{stored}} — sottotipo, non viene mai conteggiato (sempre 0)","loadingZones":"Caricamento zone…","wholeFrame":"— intera inquadratura —","anyClass":"— qualsiasi classe —","threshold":"Soglia","count":"Conteggio","holdFor":"Mantieni per","clear":"Svuota","noCameraPickedOnThe":"Nessuna telecamera scelta nella scheda Dispositivi: questa regola osserva l'occupazione di OGNI telecamera, e non si può offrire alcuna zona finché non ne scegli una — l'id di una zona appartiene a una telecamera.","countsConfirmedTrackedObjectsFrom":"Conta gli oggetti tracciati confermati dalle analitiche di zona. La variazione deve durare per l'intera finestra di sostegno prima di scattare; senza snapshot per la telecamera o la zona la regola non scatta mai.","storedByTheRuleNot":"Memorizzato dalla regola — non offerto da questo hub","keptFromTheRuleUnknown":"Conservato dalla regola, sconosciuto a questo hub:","confirmAfter":"Conferma dopo","louderThan":"Più forte di","hits":"Rilevamenti","withNeitherASoundNor":"Senza né un suono né una soglia di livello non può mai corrispondere — ogni campione sarebbe un rilevamento, quindi il motore lo rifiuta invece di notificare il silenzio.","plateText":"Testo della targa…","seen":"Visti:","maxDistance":"Distanza massima","noDeviceGate":"— nessun gate di dispositivo —","thisDeviceReportsNoState":"Questo dispositivo non riporta alcuno stato che il gate possa leggere, quindi non può armare una regola.","theRuleIsSilentWhile":"La regola resta silenziosa mentre il dispositivo è in qualsiasi altro stato — anche quando il suo stato non può essere letto affatto."},"notificationDigestFields":{"thisRuleCouldNeverProduce":"Questa regola non potrebbe mai produrre nulla, quindi non può essere salvata:","worthKnowing":"Da sapere:","noDeliveryTargetIsConfigured":"Nessun target di consegna configurato. Aggiungine prima uno nella scheda Target — senza, il risultato viene prodotto e poi scartato.","notificationTitle":"Titolo della notifica","notificationBody":"Corpo della notifica","leaveBothBlankToUse":"Lascia vuoti entrambi per usare il testo dell'hub (modificabile nella scheda Testi).","sendARealNotificationNow":"Inviare ora una notifica reale?","itDoesNotConsumeThe":"Non consuma la pianificazione: la prossima esecuzione pianificata avviene comunque.","sending":"Invio…","produceAndSend":"Produci e invia"},"notificationRulePickers":{"customValueClickToRemove":"Valore personalizzato — clicca per rimuoverlo"},"notificationScheduleField":{"activeOutsideTheWindows":"Attiva fuori dalle finestre","invertedScheduleShownAsBands":"Pianificazione invertita — mostrata come fasce. Disattiva il flag di inversione (o le finestre) per impostare orari puntuali.","shownAsSendAtTimes":"Mostrati come orari di invio dalla fine di ciascuna finestra (quando parte il riepilogo). Modifica o salva per memorizzarli come finestre puntuali di un minuto.","noTimesYetAddOne":"Ancora nessun orario — aggiungine uno per inviare in quei giorni a quell'ora.","removeWindow":"Rimuovi finestra","at":"Alle","removeTime":"Rimuovi orario"},"notificationSystemEventField":{"theBatteryThresholdAndThe":"La soglia della batteria e l'intervallo dei promemoria sono impostazioni del cluster (la soglia dei materiali di consumo è propria di questa regola, qui sotto):","settingsBatteryOfflineAlerts":"Impostazioni → Avvisi batteria e offline","alarmSettings":"Impostazioni allarme","couldNotCheckWhetherThis":"Impossibile verificare se il server di questo hub conosce le soglie dei materiali di consumo per regola e gli avvisi sui serbatoi.","consumableLowAt":"Materiale di consumo basso al (%)","deviceTypes":"Tipi di dispositivo","deviceType":"Tipo di dispositivo…","batteryAndConsumableAlertsAre":"Gli avvisi di batteria e materiali di consumo sono qui ristretti per tipo di dispositivo. Batterie e materiali di consumo appartengono a sensori, contenitori, aspirapolvere e tagliaerba — raramente a una telecamera — quindi un filtro di tipo pensato per la raggiungibilità li silenzia. Lascia vuoti i tipi, oppure metti questi eventi in una regola a parte.","nodes":"Nodi","packages":"Pacchetti","thisRuleIsNotOne":"Questa regola non è di un solo tipo di regola di sistema — i suoi eventi coprono eventi di dispositivo, sistema e allarme, oppure non ne indica nessuno. Continua a scattare così com'è, ma non può essere modificata qui: ricreala come una regola per tipo.","kindOfSystemRule":"Tipo di regola di sistema","oneRuleAnswersOneQuestion":"Una regola risponde a una domanda: sui dispositivi, sull'installazione o sull'allarme. Cambiarla riparte da un elenco eventi vuoto."},"scopePickers":{"theNodeHistoryCouldNot":"Impossibile leggere la cronologia dei nodi — i nodi offline potrebbero mancare da questo elenco."},"targetSecretNotice":{"theHubNeedsTheSecret":"L'hub ha di nuovo bisogno del segreto — nulla è stato salvato."},"unifiedRulesColumns":{"when":"Quando","type":"Tipo"},"cluster":{"unlockFromAgentFailed":"Sblocco dall'agent non riuscito:","loadingClusterTopology":"Caricamento della topologia del cluster..."}}`),common:{save:`Salva`,cancel:`Annulla`,delete:`Elimina`,enable:`Abilita`,disable:`Disabilita`,edit:`Modifica`,add:`Aggiungi`,remove:`Rimuovi`,confirm:`Conferma`,close:`Chiudi`,back:`Indietro`,next:`Avanti`,search:`Cerca`,filter:`Filtra`,reset:`Reimposta`,apply:`Applica`,submit:`Invia`,loading:`Caricamento…`,error:`Errore`,success:`Successo`,warning:`Avviso`,info:`Info`,noData:`Nessun dato disponibile`,noResults:`Nessun risultato trovato`,retry:`Riprova`,refresh:`Aggiorna`,copy:`Copia`,copied:`Copiato!`,yes:`Sì`,no:`No`},connection:{disconnected:`Server non raggiungibile — riconnessione in corso…`,connected:`Connesso`,reconnecting:`Riconnessione in corso…`,degraded:`Connessione live interrotta — l'hub è online (un nodo del cluster potrebbe non rispondere), ripristino in corso…`,degradedNodes_one:`Cluster degradato — il nodo {{nodes}} non risponde. L'hub è online, ripristino del collegamento live…`,degradedNodes_other:`Cluster degradato — i nodi {{nodes}} non rispondono. L'hub è online, ripristino del collegamento live…`,degradedCount_one:`Cluster degradato — {{count}} nodo del cluster offline. L'hub è online, ripristino del collegamento live…`,degradedCount_other:`Cluster degradato — {{count}} nodi del cluster offline. L'hub è online, ripristino del collegamento live…`,sessionExpired:`Sessione scaduta — effettua di nuovo l'accesso.`,signIn:`Accedi`},passkeyPrompt:{message:`Vuoi salvare una passkey per accedere più velocemente?`,enrollNow:`Registra ora`,notNow:`Non ora`},status:{online:`Online`,offline:`Offline`,connecting:`Connessione in corso`,error:`Errore`,disabled:`Disabilitato`,enabled:`Abilitato`,active:`Attivo`,inactive:`Inattivo`,running:`In esecuzione`,stopped:`Fermato`,pending:`In attesa`,unknown:`Sconosciuto`},auth:{login:`Accesso`,logout:`Esci`,username:`Nome utente`,password:`Password`,signIn:`Accedi`,invalidCredentials:`Nome utente o password non validi`,adminTokensSection:{revokeAdminToken:`Revocare il token admin "{{name}}"?`,everyScriptUsingItLoses:`Ogni script che lo usa perde subito l'accesso. L'operazione non può essere annullata.`,revoke:`Revoca`,adminTokens:`Token admin`,fullAdministrator:`amministratore completo`,itExpiresInAtMost:`Scade al massimo in 90 giorni e ogni utilizzo viene registrato in audit. Per crearne uno ti viene chiesto di confermare la tua identità.`,newAdminToken:`Nuovo token admin`,adminTokens2:`token admin`,createAdminToken:`Crea token admin`,tokenName:`Nome del token`,expiresInDays:`Scade tra (giorni)`},authAuditSection:{authenticationAudit:`Audit di autenticazione`,loadingAuditTrail:`Caricamento audit…`,couldNotLoadTheAudit:`Impossibile caricare l'audit:`,requestFailed:`Richiesta fallita`,noAuthenticationEventsRecordedYet:`Nessun evento di autenticazione registrato finora.`,thisTrailRecordsAdminToken:`Questo audit registra creazione/uso/revoca dei token admin, i salti del 2FA su rete attendibile e le revoche di credenziali (inclusa la revoca di un singolo link di condivisione). Gli accessi con password dal browser non sono elencati qui.`},createScopedTokenModal:{createScopedToken:`Crea token con scope`,issueToken:`Emetti token`,onBehalfOfUser:`A nome dell'utente`,name:`Nome`,scopes:`Scope`,eachScopePicksACap:`Ogni scope sceglie un target (cap o addon) + uno o più tipi di accesso. Il token può accedere SOLO a ciò che è elencato.`,expiresInDays:`Scade tra (giorni)`,leaveBlankForNonExpiring:`Lascia vuoto per nessuna scadenza.`},mySessionsSection:{signOutThisSession:`Disconnetti questa sessione`,willHaveToSignIn:`{{label}} dovrà accedere di nuovo.`,signOut:`Disconnetti`,signOutEverywhere:`Disconnetti ovunque`,everySessionOfYourAccount:`Tutte le sessioni del tuo account terminano, questo browser incluso: verrai disconnesso anche qui e ogni dispositivo dovrà accedere di nuovo.`,activeSessions:`Sessioni attive`,theBrowsersAndAppsSigned:`I browser e le app connessi al tuo account. Disconnetterne uno lo termina subito.`},reauthDialog:{confirmItSYou:`Conferma la tua identità`,currentPassword:`Password attuale`,useAPasskey:`Usa una passkey`},sessionsList:{loadingSessions:`Caricamento sessioni…`,couldNotLoadSessions:`Impossibile caricare le sessioni:`,thisDevice:`Questo dispositivo`,ipUnknown:`IP sconosciuto`,signOut:`Disconnetti`},tokenModals:{token:`Token: {{label}}`,copyThisTokenNowOnce:`Copia questo token adesso. Una volta chiusa questa finestra il segreto non potrà più essere mostrato.`,done:`Fatto`}},theme:{dark:`Scuro`,light:`Chiaro`,system:`Sistema`},language:{select:`Lingua`,en:`Inglese`,it:`Italiano`},pages:{viewer:{frameTitle:`Viewer CamStack`,underMountTitle:`Il viewer non può essere mostrato attraverso questo relay`,underMountBody:`Questa admin UI è servita sotto {{mount}}. L’app viewer funziona solo all’indirizzo proprio dell’hub — aprila lì, in una nuova scheda.`},integrations:{title:`Integrazioni`,subtitle:`Gestisci le sorgenti video e le connessioni ai provider`},metrics:{title:`Metriche`,subtitle:`Statistiche di prestazioni e utilizzo del sistema`},agents:{title:`Agenti`,subtitle:`Gestisci gli agenti di elaborazione distribuita`},addons:{title:`Addon`,subtitle:`Estendi le funzionalità con moduli addon`},settings:{title:`Impostazioni`,subtitle:`Configura le preferenze di sistema`},users:{title:`Utenti`,subtitle:`Gestisci gli account utente e i permessi`},logs:{title:`Log`,subtitle:`Visualizza i log di sistema e dei dispositivi`}},integrations:{preview:`Anteprima`,snapshotUnavailable:`Snapshot non disponibile`,noSnapshot:`Nessuno snapshot`,lastSnapshot:`Ultimo snapshot:`,offline:`Offline`,active:`Attivi`,available:`Disponibili`,noDevices:`Nessun dispositivo.`,addFirstDevice:`Aggiungi il primo dispositivo per iniziare.`,import:`+ Importa`,noProviders:`Nessun provider disponibile. Installa un addon provider.`,manage:`Gestisci`,integrationName:`Nome integrazione`,integrationNamePlaceholder:`es. Server Garage`,connectionSuccess:`Connessione riuscita!`,errorPrefix:`Errore:`,back:`Indietro`,testing:`Test...`,testConnection:`Test connessione`,forward:`Avanti`,searchingDevices:`Ricerca dispositivi in corso...`,foundDevices:`Trovati {{count}} dispositivi. Seleziona quelli da importare.`,noDevicesFound:`Nessun dispositivo trovato.`,skip:`Salta`,importSelected:`Importa selezionati`,newIntegration:`Nuova Integrazione`,configureIntegration:`Configura Integrazione`,importDevices:`Importa Dispositivi`,addDevice:`Aggiungi dispositivo`,name:`Nome`,namePlaceholder:`es. Camera Ingresso`,snapshotUrlOptional:`Snapshot URL (opzionale)`,streamUrls:`Stream URLs`,addStream:`Aggiungi stream`,cancel:`Annulla`,saving:`Salvataggio...`,save:`Salva`,saveAndNew:`Salva e nuova`,test:`Test`,stream:`Stream {{number}}:`,devices:`dispositivi`,rediscover:`Riscopri`,config:`Config`,integrationNotFound:`Integrazione non trovata.`,configComingSoon:`Config coming soon.`,providerConfig:`Provider Config`,editConfig:`Modifica configurazione`,relinkBrokerHelp:`Scegli il broker tramite cui questa integrazione si connette. Selezionando un broker diverso la si ricollega e riavvia l’addon.`,currentBroker:`Broker attuale`,relinkFailed:`Aggiornamento del collegamento al broker non riuscito.`,noBrokerKind:`Questa integrazione dichiara device-adoption ma il manifest dell’addon non ha un brokerKind.`,connectionInconclusive:`Non è stato possibile verificare:`,connectionUntestable:`Questa integrazione non può essere testata prima di essere creata.`,addDeviceDialog:{providerUnavailable:`Provider non disponibile`,testLogs:`Log del test`,required:`Obbligatorio: {{value1}}`,testAll:`Testa tutto`},adoptDevicesModal:{deselect:`Deseleziona`,select:`Seleziona`,discoveryGranularity:`Granularità del rilevamento`,collapse:`Comprimi`,expand:`Espandi`,showChild:`Mostra figlio`,hideChild:`Nascondi figlio`,showAfterAdopt:`Mostra dopo l'adozione`,hideAfterAdopt:`Nascondi dopo l'adozione`},alexaLoginStep:{loginProxyReturnedAnError:`Il proxy di accesso ha restituito un errore`,accountName:`Nome account`,alexaAccount:`Account Alexa`,amazonRegion:`Regione Amazon`,startingLoginProxy:`Avvio del proxy di accesso…`,waitingForProxyToBe:`In attesa che il proxy sia pronto…`,savingCredentials:`Salvataggio credenziali…`,openTheLinkBelowTo:`Apri il link qui sotto per accedere al tuo account Amazon`,afterCompletingTheLoginAnd:`Dopo aver completato l'accesso e gli eventuali passaggi 2FA, questa procedura continuerà automaticamente.`,loginToAmazon:`Accedi ad Amazon`,note:`Nota:`,waitingForAmazonLoginTo:`In attesa del completamento dell'accesso ad Amazon…`,cancelLogin:`Annulla accesso`,startLogin:`Avvia accesso`},brokerStep:{loginInteractively:`Accedi in modo interattivo`,useExisting:`Usa esistente`,pasteCookie:`Incolla cookie`,createNew:`Crea nuovo`,failedToLoadBrokers:`Impossibile caricare i broker:`,unknownError:`Errore sconosciuto`,toRegisterOne:`per registrarne uno.`,useThisBroker:`Usa questo broker`,name:`Nome`,myHomeAssistant:`Il mio Home Assistant`,creating:`Creazione…`,createBroker:`Crea broker`,enterANameBeforeCreating:`Inserisci un nome prima di creare.`},scanNetworkModal:{alreadyAdded:`Già aggiunto`,added:`Aggiunto`,reScan:`Scansiona di nuovo`,scanningTheLocalNetwork:`Scansione della rete locale…`,noDevicesRespondedToThe:`Nessun dispositivo ha risposto alla scansione.`,scanning:`Scansione…`,scan:`Scansiona`,theScanFailedTryAgain:`Scansione fallita. Riprova.`},snapshotPopover:{disabled:`Disabilitato`},integrationColumns:{collapse:`Comprimi`,expand:`Espandi`,integration:`Integrazione`,devices:`Dispositivi`,status:`Stato`},scanTheLocalNetworkFor:`Cerca dispositivi sulla rete locale`,scanNetwork:`Scansiona rete`,noIntegrationsConfigured:`Nessuna integrazione configurata.`,clickNewIntegrationToConnect:`Clicca "Nuova integrazione" per collegare telecamere e dispositivi.`},serverManagement:{title:`Gestione server`,subtitle:`Pacchetti radice aggiornabili a runtime per ogni nodo — gli aggiornamenti si installano nella data directory del nodo e si applicano al riavvio con rollback automatico.`,nodeHub:`hub`,nodeAgent:`agent`,nodeOffline:`offline`,lastReportedVersion:`Ultima versione riportata`,nodeRestarting:`Il nodo si sta riavviando per applicare la modifica…`,topologyError:`Impossibile caricare l'elenco dei nodi del cluster — viene mostrato solo il hub.`,checkForUpdate:`Controlla aggiornamenti`,updateTo:`Aggiorna a {{version}}`,rollback:`Ripristina {{version}}`,runningVersion:`Versione in esecuzione`,latestVersion:`Ultima sul registry`,previousVersion:`Precedente (destinazione rollback)`,seedVersion:`Versione seed immagine`,pendingVersion:`In attesa (si applica al riavvio)`,stateUpToDate:`aggiornato`,stateUpdateAvailable:`aggiornamento disponibile`,stateChecking:`controllo…`,stateStaging:`aggiornamento…`,statePending:`riavvio in sospeso`,stateAwaitingConfirmation:`in attesa di conferma`,stateRolledBack:`rollback eseguito (aggiornamento fallito)`,bootDataRoot:`aggiornabile a runtime`,bootWorkspace:`workspace di sviluppo`,bootBaked:`seed dell'immagine`,bakedSeed:`il seed dell'immagine`,lastChecked:`Ultimo controllo: {{when}}`,loadError:`Impossibile caricare lo stato del pacchetto radice del nodo.`,workspaceNote:`Workspace di sviluppo rilevato — gli aggiornamenti runtime sono disabilitati.`,rolledBackDetail:`Aggiornamento a {{from}} fallito, rollback a {{to}}: {{reason}}`,confirmUpdateTitle:`Aggiorna pacchetto radice del nodo`,confirmUpdateBody:`Installa {{pkg}}@{{version}} sul nodo "{{node}}" e riavvialo per applicarlo. La nuova versione parte in prova: se non raggiunge lo stato ready, il nodo torna automaticamente alla versione corrente. Richiede un supervisore che riavvii sempre il processo (restart policy Docker "unless-stopped" o "always"), altrimenti il nodo resta spento dopo essere uscito per applicare l'aggiornamento.`,confirmUpdateAction:`Aggiorna e riavvia`,confirmRollbackTitle:`Ripristina pacchetto radice del nodo`,confirmRollbackBody:`Riavviare il nodo "{{node}}" sulla versione precedente ({{version}})?`,confirmRollbackAction:`Ripristina e riavvia`,restart:`Riavvia`,nodeRuntimeVersion:`Runtime Node.js`,confirmRestartTitle:`Riavvia nodo`,confirmRestartBody:`Riavviare ora il nodo "{{node}}"? Il processo esce e il suo supervisore lo riavvia sulla stessa versione. Le richieste in corso verso questo nodo vengono interrotte.`,confirmRestartAction:`Riavvia`,updateAll:`Aggiorna tutti i nodi`,updateAllHint:`In sequenza: prima gli agent, l'hub per ultimo — i nodi già aggiornati vengono saltati.`,confirmUpdateAllTitle:`Aggiorna tutti i nodi`,confirmUpdateAllBody:`Aggiorna in sequenza ogni nodo online all'ultima versione pubblicata — prima gli agent, l'hub per ultimo. Ogni nodo installa il suo pacchetto radice (solo se più recente di quello in esecuzione) e riparte in prova con rollback automatico; i nodi già aggiornati vengono saltati. L'hub riparte per ultimo, quindi questa pagina si riconnetterà successivamente.`,confirmUpdateAllAction:`Aggiorna tutti e riavvia`,awaitingConfirmationWarning:`Questo nodo è ripartito su {{version}} e sta confermando lo stato di boot — evita di riavviarlo ora. Aggiornamento e rollback sono temporaneamente non disponibili finché il boot in prova non viene confermato; un riavvio manuale in questa finestra causerebbe il rollback automatico dell'aggiornamento.`,stateCorruptWarning:`Il file di stato server-root su questo nodo è corrotto — il nodo è partito dal seed dell'immagine e le versioni installate nella data directory vengono ignorate. Applicare un aggiornamento riscriverà il file di stato.`,phase2Note:`Fase 2: l'aggiornamento riguarda solo il processo principale di ciascun nodo (hub + agent docker) — i runner degli addon restano sull'overlay /data/framework e l'agent Electron resta legato al bundle fino alle fasi successive. Non assumere coerenza dell'intero stack da un singolo Update.`},ai:{addProfile:`Aggiungi profilo`,attachSnapshot:`Snapshot telecamera`,attachTrack:`Traccia recente`,chatEmpty:`Scegli un profilo, allega se vuoi uno snapshot di una telecamera o una traccia recente, e invia un messaggio. Niente di tutto questo viene salvato.`,chatFailed:`La chiamata di test è fallita`,chooseKind:`Scegli un tipo di profilo`,clearChat:`Pulisci`,colAvgMs:`ms medi`,colCalls:`Chiamate`,colConsumer:`Consumatore`,colDay:`Giorno`,colDisk:`Su disco`,colError:`Errore`,colKind:`Tipo`,colModel:`Modello`,colNode:`Nodo`,colOkErr:`OK / err`,colOn:`Attivo`,colProfile:`Profilo`,colState:`Stato`,colTokens:`Token in / out`,colVision:`Vision`,createProfile:`Crea profilo`,defaultDisabled:`Questo profilo predefinito è disabilitato — i chiamanti non risolvono alcun profilo.`,defaultMissing:`Questo predefinito indica un profilo che non esiste più.`,defaultText:`Profilo testo predefinito`,defaultVision:`Profilo vision predefinito`,editProfile:`Modifica {{name}}`,lastDays:`Ultimi {{days}} giorni`,loadFailed:`Impossibile caricare i profili`,message:`Messaggio`,messagePlaceholder:`Chiedi qualcosa al modello…`,model:`Modello`,name:`Nome`,newProfile:`Nuovo profilo {{kind}}`,noCameras:`Nessuna telecamera trovata.`,noEnabledProfiles:`Nessun profilo abilitato. Aggiungine uno nella scheda Profili.`,noKinds:`Nessun provider AI installato.`,noProfiles:`Nessun profilo AI. Premi "Aggiungi profilo" per configurarne uno.`,noRuntimes:`Nessun nodo espone la capability llm-runtime.`,noTracks:`Nessuna traccia nelle ultime 6 ore.`,noUsage:`Nessuna chiamata AI in questo intervallo.`,none:`Nessuno`,notVision:`Questo profilo non supporta la vision — un'immagine allegata verrà rifiutata prima di leggere qualsiasi cosa.`,pickModelFirst:`scegli un modello`,appleNode:`Mac su cui gira`,appleAsking:`Interrogo i nodi…`,appleHint:`Per ora solo testo: titoli e riassunti delle notifiche. Apple rifiuta le richieste formulate come sorveglianza; in quel caso risponde il profilo successivo della catena.`,pickAppleNodeFirst:`scegli un Mac`,colApple:`Apple on-device`,appleAvailable:`disponibile`,appleUnknown:`sconosciuto`,appleNotMac:`non è un Mac`,appleNotEligible:`non idoneo`,appleIntelligenceOff:`Apple Intelligence disattivata`,appleModelNotReady:`modello in download`,appleOsTooOld:`macOS troppo vecchio`,appleHelperMissing:`helper mancante`,appleHelperCrashed:`helper andato in crash`,profile:`Profilo`,profilesSubtitle:`Una riga = un endpoint di modello utilizzabile. I predefiniti qui sotto decidono chi risponde quando una funzione non nomina alcun profilo.`,profilesTitle:`Profili AI`,ready:`pronto`,runtimeNode:`Nodo di esecuzione`,runtimesFailed:`Impossibile leggere i nodi di esecuzione`,runtimesSubtitle:`Nodi che espongono la capability llm-runtime: cosa ha caricato ciascuno, cosa sta scaricando e quanti dati di modello occupa su disco.`,runtimesTitle:`Runtime gestiti`,saveChanges:`Salva modifiche`,saveFailed:`Salvataggio fallito`,secretHint:`Una chiave API salvata non viene mai mostrata. Lasciala com'è per conservarla; digita un nuovo valore per sostituirla.`,selectModel:`Scegli un modello…`,selectProfile:`Scegli un profilo…`,send:`Invia`,snapshotOf:`Snapshot di {{name}}`,stop:`Ferma`,streamNote:`La risposta arriva in streaming mentre il modello la produce. Un modello a freddo può metterci un po' a caricarsi — la riga di stato dice in quale fase si trova.`,systemPlaceholder:`Rispondi con una frase breve.`,systemPrompt:`System prompt (opzionale)`,tabProfiles:`Profili`,tabRuntimes:`Runtime`,tabTest:`Test`,tabUsage:`Utilizzo`,test:`Prova`,testSubtitle:`Una conversazione usa e getta con un solo profilo. Allega uno snapshot dal vivo o una traccia recente per verificare che il modello sappia davvero leggere un'immagine. Non viene salvato nulla — solo la riga di utilizzo.`,testTitle:`Chat di test`,trackOf:`{{class}} su {{name}}`,unreachable:`irraggiungibile`,usageFailed:`Impossibile leggere l'utilizzo`,usageSubtitle:`Aggregato lato server per giorno, consumatore e profilo — mai le singole chiamate. Gli errori sono contati, così un profilo che fallisce sempre è visibile qui prima che una funzione lo segnali.`,usageTitle:`Utilizzo`,vision:`vision`,window:`Intervallo`},logging:{levels:{title:`Livelli`,subtitle:`Cluster → nodo, vince il più specifico. La soglia filtra ciò che arriva alle destinazioni; il visualizzatore in memoria conserva comunque ogni riga.`,scope:`Ambito`,cluster:`Cluster`,effective:`In vigore qui`,fromDefault:`non è impostato nulla da nessuna parte — questo è il valore predefinito`,fromLayer:`deciso dal livello {{source}}`,notPersisted:`Impossibile leggere o scrivere le impostazioni — quanto vedi è attivo ora, ma non sopravvivrebbe a un riavvio.`,inForce:`in vigore`,inherits:`eredita — nulla impostato a questo livello`,setHere:`impostato qui: {{level}}`,clear:`Azzera`,componentNote:`Un livello per componente è previsto e non ancora risolvibile — nulla in questa pagina eredita da uno.`},diagnostics:{title:`Diagnostica`,subtitle:`Le diagnostiche si armano per una finestra, non si accendono. Ognuna porta una scadenza e scade da sola — una lasciata accesa è essa stessa un incidente.`,expiresIn:`scade tra {{left}}`,disarmed:`disarmata`,notPersisted:`non persistita — non sopravvive a un riavvio`,disarm:`Disarma`}},clusterLoad:{sourceNote:"Ricavato dall'evento `metrics.node-processes-snapshot` che questo nodo emette già a cadenza fissa — questa pagina non aggiunge campionamenti propri. Viene riletto attraverso `metricsProvider.getLoadSeries`, l'UNICO lettore su entrambi i livelli di ritenzione: il nodo conserva in memoria i suoi ultimi 180 snapshot, l'hub conserva su disco la ritenzione decisa dall'operatore.",durableYes:`Il livello durevole ha risposto: questa finestra sopravvive alla chiusura della pagina E al riavvio del nodo.`,durableNo:`Il livello durevole NON ha risposto — questa finestra è il solo anello in memoria (circa un'ora) e un riavvio del nodo la azzera.`,windowSince:`Mostrato da {{since}}.`,reduced:`{{samples}} campioni grezzi, ridotti a un punto ogni {{bucket}}s. Un punto porta il MASSIMO del suo intervallo, mai una media — una media spalmerebbe via il picco che questo grafico esiste per trovare.`,unreduced:`{{samples}} campioni grezzi, un punto ciascuno.`,noThreadSplit:`Nessuna ripartizione CPU per thread su questo nodo — /proc/<pid>/task esiste solo su Linux, e il primo campione dopo un riavvio non ha una finestra da misurare. La CPU qui sotto ripiega sulla MEDIA di vita di ps, che non è una velocità.`,loadingRetained:`Lettura della serie conservata da questo nodo…`,waitingFirstSample:`Nessun campione conservato per questo nodo — in attesa del prossimo snapshot. Al grafico ne servono due per disegnare una velocità.`,bucketRoot:`Supervisore del nodo`,bucketUnattributed:`Processi non attribuiti`,processCount:`{{count}} process(i)`,cpuTitle:`CPU % di un core`,cpuTitleLifetime:`CPU % (media di vita ps)`,seriesMain:`Thread principali`,seriesGc:`GC / helper V8`,cpuUnavailable:`Nessuna ripartizione per thread su questo nodo. Media di vita: {{avg}}%`,memoryTitle:`Memoria RSS`,memoryUnavailable:`Ancora nessun campione di memoria.`},cameraAttribution:{title:`Carico per telecamera — cosa è attribuibile`,intro:`Questa tabella è il cancello dei grafici qui sopra, non una nota a piè di pagina: una famiglia viene disegnata per telecamera solo quando è davvero misurata E leggibile oggi. La detection gira su un pool condiviso da tutte le telecamere e può solo essere contata, mai misurata — viene mostrata come un unico totale condiviso e mai divisa. Lo streaming è per telecamera per costruzione e resta illeggibile, perché solo una sorgente basata su ffmpeg genera un figlio. Un grafico di un numero che il sistema non sa attribuire è peggio di nessun grafico.`,measured:`Misurabile per telecamera`,accounted:`Solo contabilizzabile (pool condiviso)`,unattributable:`Non attribuibile`,colFamily:`Carico`,colAttribution:`Attribuzione`,colUnit:`Unità di lavoro`,colChartable:`Graficabile oggi`,colMissing:`Cosa manca`,unitNotSortable:`Nessun ordinamento sensato — la cella descrive un meccanismo, non un valore.`,missingNotSortable:`Nessun ordinamento sensato — la cella è una spiegazione, non un valore.`,evidence:`Prove ({{count}})`},cameraLoad:{title:`Carico per telecamera — misurato, su questo nodo`,intro:"Ogni addon dichiara il PROPRIO costo attraverso la capability `load-contribution` — al recorder non serve che qualcuno gli dica quale telecamera serve il suo ffmpeg: l'ha generato lui. Qui nessuno unisce un pid a una telecamera. Vengono disegnate solo le famiglie misurate E leggibili oggi ({{roles}}); le altre sono nominate qui sotto invece che stimate.",windowNote:`La CPU è un DELTA dei contatori cumulativi, sulla stessa cadenza fissa con cui il nodo emette già il suo snapshot dei processi — questo pannello non aggiunge campionamenti e non legge nulla mentre è chiuso. I contributi non vengono conservati da nessuna parte, quindi a differenza dei grafici per addon qui sopra questa finestra parte quando apri il pannello.`,windowSince:`Differenze da {{since}} ({{count}} finestre).`,readFailed:`Impossibile leggere i contributi di carico: {{error}}. È una lettura fallita, NON un cluster inattivo.`,loading:`Lettura di ciò che gli addon dichiarano…`,waitingWindow:`Ancora nessuna finestra per telecamera. Una velocità ha bisogno di due letture, e la seconda arriva col prossimo snapshot dei processi. Un nodo che non esegue alcun figlio di decode, transcode o registrazione resta vuoto — ed è la verità, non un guasto.`,deviceLabel:`Telecamera {{deviceId}}`,unitCount:`{{count}} unità: {{roles}}`,cpuTitle:`CPU % di un core (delta)`,cpuUnavailable:`Ancora nessuna finestra misurabile — finora ogni finestra conteneva un'unità che è partita, si è fermata o non ha riportato un contatore.`,memoryTitle:`Memoria RSS`,memoryUnavailable:`Nessuna memoria riportata per questa telecamera.`,coverage:`Gli addon rivendicano {{claimed}} dei {{observed}} processi camstack che questo nodo riporta.`,coverageUnknown:`Nessuno snapshot dei processi da questo nodo, quindi non si può dire nulla su ciò che non è rivendicato. È diverso da «tutto è rivendicato».`,noUnclaimed:`Nulla è non rivendicato su questo nodo.`,unclaimed:`{{count}} process(i) che nessuno rivendica, con {{rss}} occupati. O una perdita o una famiglia di costo che nessuno ha insegnato a dichiararsi — restano nel loro secchio e non vengono mai ripiegati su una telecamera. La loro CPU è sconosciuta: l'osservatore misura la RSS e non riporta secondi di CPU cumulativi.`,sharedTitle:`Condiviso — dichiarato come non appartenente ad alcuna telecamera`,sharedNote:`Riportato perché il costo condiviso sia visibile come condiviso invece che invisibile. NON viene diviso fra le telecamere presenti: il pool di inferenza è un processo solo che le serve tutte, e una quota ripartita è una stima, non una misura. Questi totali sono cumulativi dall'avvio di ciascuna unità — non una velocità.`,sharedRow:`{{roles}} — {{units}} unità, {{cpu}} secondi di CPU, {{rss}}`,refusedTitle:`Dichiarato per telecamera, e comunque non disegnato`,refusedRow:`— {{count}} voci da {{addons}}. {{reason}}`},deviceMigrate:{title:`Migra verso…`,subtitle:`Sostituisci questa telecamera con un altro dispositivo già adottato. La nuova telecamera eredita il numero {{deviceId}}, così registrazioni, regole e integrazioni la seguono.`,pickerLabel:`Telecamera sostitutiva`,pickerPlaceholder:`Scegli una telecamera…`,pickerPending:`Lettura del parco dispositivi…`,noTargets:`Nessun'altra telecamera è adottata, quindi non c'è nulla verso cui migrare.`,action:`Migra`,running:`Migrazione in corso…`,confirmTitle:`Sostituire “{{source}}” con “{{target}}”?`,confirmMessage:`“{{target}}” prende il numero {{sourceId}}. Sotto quel numero sono archiviati tutte le registrazioni, gli eventi, le regole, le zone e le esportazioni verso la domotica di “{{source}}”: tutto segue il numero sul nuovo hardware e continua a funzionare. “{{source}}” viene spenta e riceve in cambio il numero {{targetId}}. Questa operazione scambia due identità di dispositivo e da qui non è annullabile.`,confirmAction:`Migra`,failed:`Migrazione fallita: {{error}}`,swapped:`La sostituta risponde ora sul numero {{inheritedId}}; alla vecchia telecamera è stato assegnato il numero {{retiredId}}.`,quiet:`Tutte le funzioni della telecamera sostituita sono state spente: il vecchio hardware è silenzioso.`,stillLive:`La telecamera sostituita non è stata raggiunta, quindi queste funzioni sono ANCORA ATTIVE sul vecchio hardware. Nulla qui ha impedito la migrazione, ma finché non la scolleghi o non la raggiungi fisicamente può continuare a produrre dati.`,neverOffered:`La telecamera sostituita non ha mai offerto queste funzioni, quindi non c'era nulla da spegnere. Non sono attive.`},locations:{filter:{searchPlaceholder:`Cerca per nome…`,typesLabel:`Filtra per tipo`,clear:`Azzera filtri`,noMatch:`Nessun dispositivo corrisponde a questo filtro.`},unassigned:{searchLabel:`Cerca tra i dispositivi senza stanza`},room:{searchLabel:`Cerca tra i dispositivi in {{room}}`,add:`Aggiungi`,addTo:`Aggiungi dispositivi a {{room}}`,addDialogTitle:`Aggiungi dispositivi a {{room}}`,alreadyHere:`Già in questa stanza`,suggestedUnassigned:`Ancora senza stanza`},roomPicker:{label:`Stanza`,placeholder:`Scegli una stanza`,unassigned:`Senza stanza`},addDialog:{cancel:`Annulla`,confirm:`Aggiungi {{count}}`,nonePicked:`Nessun dispositivo scelto`},links:{noRoom:`Nessuna stanza. Aggiungine una nella scheda Locations.`,noCameras:`Nessuna telecamera assegnata a “{{room}}”.`,loading:`Lettura dei dispositivi collegati…`,unreadable:`Impossibile leggere i dispositivi collegati: {{reason}}`,unsupported:`Questa telecamera non ha una lista di dispositivi collegati.`,none:`Nessun dispositivo collegato.`,implied:`automatico`,edit:`Modifica collegamenti`,addNamed:`Collega dispositivi a {{camera}}`,pickTitle:`Collega dispositivi a {{camera}}`,alreadyLinked:`Già collegato`,suggested:`Suggeriti · {{room}}`},columns:{device:`Dispositivo`,type:`Tipo`,status:`Stato`,noSort:`Gli accessori seguono il loro dispositivo: questa lista mantiene l'ordine.`},rebuildLinkedDevices:`Ricostruisci i dispositivi collegati`,noCameraIsAssignedTo:`Nessuna telecamera è assegnata a “{{room}}”.`,replaceTheLinkedDeviceList:`Sostituire l'elenco dei dispositivi collegati di ogni telecamera in “{{room}}” con quello che contiene la stanza? {{lines}} Tutto ciò che è stato collegato a mano e non è in questa stanza andrà perso.`,rebuild:`Ricostruisci`,notRebuilt:`Non ricostruite: {{value1}}`,deleteLocation:`Elimina posizione`,deleteTheLocation:`Eliminare la posizione “{{name}}”?{{extra}}`,deleteZone:`Elimina zona`,deleteTheZoneTheRooms:`Eliminare la zona “{{name}}”? Le stanze al suo interno restano.`,loadingLocationsAndDevices:`Caricamento di posizioni e dispositivi…`,everyTopLevelDeviceHas:`Ogni dispositivo di primo livello ha una stanza.`,noLocationsYetAddIngresso:`Ancora nessuna posizione. Aggiungi Ingresso, Salone, Cucina…`,locations:`Posizioni`,roomsAndAreasOfThe:`Stanze e aree del sito. Assegna qui qualsiasi dispositivo: i dischi di archiviazione sono in Dati → Archiviazione.`,cameraLinks:`Collegamenti telecamere`,zones:`Zone`,locationCard:{rename:`Rinomina`,rebuildLinkedDevices:`Ricostruisci i dispositivi collegati`,rename2:`Rinomina {{name}}`,cancelRename:`Annulla la rinomina`,actionsFor:`Azioni per {{name}}`,nothingHereYetAssignA:`Ancora nulla qui: assegna un dispositivo dalla tabella qui sotto.`},locationDescriptionField:{whatIsThere:`Cosa c'è`,surfacesBoundariesWhatIsNormally:`Superfici, confini, cosa viene normalmente parcheggiato o riposto qui.`,givenToTheAiWith:`Viene dato all'IA insieme alle immagini, così sa cosa sta guardando. Descrivi il LUOGO, non ciò che vi accade: gli eventi cambiano, il terreno no.`},locationZoneField:{none:`— nessuna —`,zone:`Zona`},newLocationButton:{newLocation:`Nuova posizione`,ingressoSaloneCucina:`Ingresso, Salone, Cucina…`,newLocationName:`Nome della nuova posizione`,cancelNewLocation:`Annulla la nuova posizione`},newZoneButton:{newZone:`Nuova zona`,zonaGiornoZonaNotte:`Zona giorno, Zona notte…`,newZoneName:`Nome della nuova zona`,cancelNewZone:`Annulla la nuova zona`},siteZonesPanel:{icon:`Icona`,zone:`Zona`,rename:`Rinomina {{label}}`,renameTheZone:`Rinomina la zona`,rooms:`Stanze`,actions:`Azioni`,delete:`Elimina {{label}}`,deleteTheZoneTheRooms:`Elimina la zona: le stanze al suo interno restano`,noZonesYetAZone:`Ancora nessuna zona. Una zona raggruppa stanze (“Zona notte” per le camere da letto) e compare prima di esse nel filtro telecamere dell'app.`},unassignedTable:{clearSelection:`Cancella la selezione`,selectAllUnassignedDevices:`Seleziona tutti i dispositivi non assegnati`,select:`Seleziona {{name}}`,device:`Dispositivo`,type:`Tipo`,status:`Stato`,accessoriesInTow:`Accessori al seguito`,assignTo:`Assegna a`,locationFor:`Posizione per {{name}}`,notInARoom:`Non in una stanza`,topLevelDevicesOnlyAccessories:`Solo dispositivi di primo livello: gli accessori seguono il dispositivo principale.`,bulkAssignment:`Assegnazione multipla`,assignSelectedDevicesTo:`Assegna i dispositivi selezionati a`,assignTo2:`Assegna a…`,assign:`Assegna`,clear:`Cancella`}},deviceDisplay:{title:`Aspetto`,icon:`Icona`,label:`Etichetta`,unit:`Unità`,precision:`Precisione`,precisionInherit:`ereditata`,hidden:`Nascosto`,hideFromLists:`Nascondi dagli elenchi dei dispositivi`,unitSource:`Sorgente{{unit}}`,inherited:`Predefinita ({{name}})`,inheritedContainer:`Predefinita (l'icona del figlio principale)`,pickIcon:`Cambia l'icona di {{name}}`,iconFor:`Icona di {{name}}`,iconSearchPlaceholder:`Cerca icone`,iconNoMatches:`Nessuna icona corrisponde`,iconCategory:{devices:`Dispositivi`,home:`Casa`,security:`Sicurezza`,buildings:`Edifici`,connectivity:`Connettività`,multimedia:`Multimedia`,nature:`Natura`,weather:`Meteo`,transportation:`Trasporti`,animals:`Animali`,accessibility:`Accessibilità`,account:`Account`,arrows:`Frecce`,brands:`Marchi`,charts:`Grafici`,communication:`Comunicazione`,cursors:`Cursori`,design:`Design`,development:`Sviluppo`,emoji:`Emoji`,files:`File`,finance:`Finanza`,"food-beverage":`Cibo e bevande`,gaming:`Giochi`,layout:`Layout`,mail:`Posta`,math:`Matematica`,medical:`Medicina`,navigation:`Navigazione`,notifications:`Notifiche`,photography:`Fotografia`,science:`Scienza`,shapes:`Forme`,shopping:`Acquisti`,social:`Social`,sports:`Sport`,sustainability:`Sostenibilità`,text:`Testo`,time:`Tempo`,tools:`Strumenti`,travel:`Viaggi`},setRoleDefault:`Imposta come predefinito per tutti i sensori {{role}}`,setRoleDefaultTitle:`Applica questa unità / precisione / icona come predefinita per ogni sensore {{role}}`,inheritedRoleDefault:`Predefinita ({{icon}} — il predefinito del ruolo {{role}})`},customize:{loadingDevice:`Caricamento del dispositivo…`,deviceUnreadable:`Impossibile leggere il dispositivo`,noSuchDevice:`Il dispositivo {{deviceId}} non esiste.`,composerAbsent:`Il composer non è in esecuzione su questo hub: le personalizzazioni sono salvate, ma niente le calcola.`,status:{pending:`Lettura della personalizzazione di questo dispositivo…`,unknownTitle:`Impossibile leggere la personalizzazione`,notLoaded:`Le personalizzazioni non sono ancora caricate: {{reason}}`,off:`Spenta`,composerUnreachable:`Il composer non ha risposto: {{reason}}`},blockStatus:{stopped:`Ferma`,starting:`In avvio`,running:`Personalizzazione attiva`,degraded:`Degradata`,failed:`Errore`},remove:{button:`Rimuovi personalizzazione`,title:`Rimuovere questa personalizzazione?`,message:`Ogni funzione aggiunta viene tolta e ogni campo sostituito torna al valore dell'integrazione, esattamente come prima.`,confirm:`Rimuovi`},composed:{body:`Questo dispositivo è composto: ogni campo viene dalla sua composizione.`,edit:`Modifica la composizione`},identity:{title:`Identità`,role:`Ruolo`,noRole:`— nessuno —`,name:`Nome`,room:`Stanza`,hidden:`Nascosto`},picker:{search:`Cerca un dispositivo`,loadingDevices:`Caricamento dei dispositivi…`,devicesFailed:`Impossibile elencare i dispositivi`,loadingFields:`Lettura dei campi del dispositivo…`,fieldsFailed:`Impossibile leggere i campi del dispositivo`,valuesFailed:`Impossibile leggere i valori attuali: {{reason}}`,fields:`Campi`,hidden_one:`{{count}} campo non è {{kind}} e non si può usare qui`,hidden_other:`{{count}} campi non sono {{kind}} e non si possono usare qui`,cancel:`Annulla`},kinds:{number:`un numero`,string:`testo`,boolean:`vero/falso`,enum:`uno di un elenco`},doorbell:{title:`Campanello`,add:`+ Aggiungi sorgente`,active:`Attivo`,pickTitle:`Aggiungi sorgente del campanello`,removeWhat:`La sorgente del campanello {{name}}`,otherFormula:`Composto da un'altra formula — modificalo in Avanzate`},motion:{title:`Movimento`,add:`+ Aggiungi sensore`,pickTitle:`Aggiungi sensore di movimento`,camera:`Movimento della camera`,cameraState:{always:`sempre incluso`,"when-confirmed":`solo se confermato`,never:`sostituito`,passes:`passa invariato`},mode:{"in-addition":`In aggiunta`,confirm:`Conferma`,replace:`Sostituisci`},modeFor:`Modalità di {{name}}`,reading:`Lettura dei sensori collegati…`,unreadable:`Impossibile leggere i sensori collegati: {{reason}}`,notForwarded:{"onboard-not-listed":`I sensori non vengono inoltrati: la sua detection non elenca il movimento della camera. Il movimento della camera passa invariato.`,"no-active-detection":`I sensori non vengono inoltrati: non ha una detection attiva. Il movimento della camera passa invariato.`},notEnforced:`Il provider di questa camera non supporta ancora Conferma e Sostituisci: il movimento della camera passa invariato finché non viene aggiornato`,state:{offline:`offline`,missing:`non trovato`,unsupported:`non può generare movimento`,unreadable:`non leggibile`},removeWhat:`Il sensore {{name}}`,olderOrchestrator:`L'orchestratore di questa camera è più vecchio delle modalità dei sensori: aggiornalo per cambiare i sensori collegati`,refetchFailed:`Non è stato possibile rileggere i sensori collegati dopo la modifica: ricarica per modificarli di nuovo`,cameraLevelUnknown:`Sconosciuto: l'orchestratore non ha sentito la camera stessa da quando è partito, oppure è più vecchio di questa vista`,cameraLevelOwn:`Il movimento della camera stessa, come l'ha detto l'ultima volta ({{at}}) — non quello che ne fanno i sensori`,tooMany:`Una camera accetta al massimo {{max}} sensori`},assign:{search:`Cerca un dispositivo`,filtersLabel:`Filtra per tipo`,loadingDevices:`Caricamento dispositivi…`,devicesFailed:`Impossibile elencare i dispositivi`,noCompatible:`Nessun dispositivo compatibile`,showMore_one:`Mostra altri {{count}}`,showMore_other:`Mostra altri {{count}}`,cancel:`Annulla`,addCount_one:`Aggiungi {{count}}`,addCount_other:`Aggiungi {{count}}`,add:`Aggiungi`,change:`cambia`,stepDevice:`1 · Dispositivo`,stepField:`2 · Campo`,stepDetails:`3 · Come si chiama`,filters:{motion:`Movimento e presenza`,contact:`Contatti`,all:`Tutti i compatibili`},value:{active:`attivo`,inactive:`inattivo`,open:`aperto`,closed:`chiuso`},checking:`Verifica in corso…`,unknown:`Impossibile verificare: {{reason}}`,removeNamed:`Rimuovi {{name}}`,none:`Nessuno`,missingKept:`Dispositivo non trovato — resta finché non lo rimuovi`,devicesUnreadable:`Impossibile elencare i dispositivi: {{reason}}`,native:`Nativo`,replaces:`sostituisce`,adds:`aggiunto`,pickUnusable:`Questo campo non può essere usato qui`,removeConfirm:{title:`Rimuovere?`,message:`{{what}} verrà rimosso.`,last:`È l'ultima funzione di questa personalizzazione: viene rimossa l'intera personalizzazione, e ogni campo torna al valore della sua integrazione.`,confirm:`Rimuovi`}},saveInFlight:`Un'altra modifica è ancora in salvataggio — riprova tra un momento`,battery:{title:`Batteria`,native:`Batteria nativa`,replace:`Sostituisci con un altro campo`,add:`+ Aggiungi batteria`,otherFormula:`Composta da un'altra formula — modificala in Avanzate`,removeWhat:`La batteria da {{name}}`,nativeReplaced:`Nativa · sostituita`},numericTransforms:{title:`Trasformazioni numeriche`,blurb:`Pubblica un valore convertito o invertito per ogni consumatore (export, regole, cronologia). Unità e precisione di visualizzazione restano in Panoramica.`,publishUnit:`Pubblica come unità`,fromUnit:`Unità nativa: {{unit}}`,fromUnknown:`Unità nativa non ancora nota`,toUnit:`Unità di destinazione`,pickUnit:`Scegli unità…`,applyConvert:`Pubblica valore convertito`,clearConvert:`Rimuovi conversione unità`,convertRefused:`Queste unità non si possono convertire`,invert:`Inverti`,invertBlurb:`Nega il booleano del dispositivo così attivo e inattivo si scambiano.`,applyInvert:`Inverti valore`,clearInvert:`Rimuovi inversione`,invertRefused:`Questo dispositivo non si può invertire`,script:`Script`,scriptBlurb:`Espressione su v (il valore nativo). Pubblicarla cancella una conversione unità semplice (v1).`,applyScript:`Pubblica script`,clearScript:`Rimuovi script`,preview:`{{source}} → {{result}}`,previewWaiting:`In attesa del valore live…`,previewError:`Preview: {{reason}}`,previewRuntimeOnly:`Questa espressione gira solo sul composer`},consumables:{title:`Consumabili`,add:`+ Aggiungi consumabile`,pickTitle:`Aggiungi consumabile`,name:`Nome`,unit:`Unità`,units:{percent:`%`,days:`giorni`,hours:`ore`,cycles:`cicli`},removeWhat:`Il consumabile {{name}}`,otherFormula:`Composto da un'altra formula — modificalo in Avanzate`,takenBy:`Esiste già una voce con questo nome: {{name}}`,keyless:`Il nome deve contenere almeno una lettera o una cifra`,outOfRange:`Non aggiunto: il campo vale {{value}}, fuori dall'intervallo dell'unità (% va da 0 a 100, un conteggio da 0 in su) — scegli un altro campo o unità`},linked:{title:`Dispositivi collegati`,add:`+ Collega`,pickTitle:`Collega dispositivi`,device:`Dispositivo`,type:`Tipo`,controls:`Controlli con la camera`,controlsAlways:`I controlli di ogni dispositivo collegato compaiono con la camera`,yes:`Sì`,tracked:`In timeline camera`,trackFor:`Mostra {{name}} nella timeline di questa camera`,trackedHint:`Solo le righe in timeline — le notifiche fotografano ogni dispositivo collegato senza questo interruttore.`,health:{missing:`non trovato`,foreign:`non leggibile dal suo proprietario`,unavailable:`non è un collegamento valido ora`},removeWhat:`Il collegamento a {{name}}`,notLinked:`non più collegato — ancora in timeline`},changes:{title:`Cosa cambia sul dispositivo`,reading:`Lettura dei campi del dispositivo…`,unknown:`Non si è potuto elencare cosa cambia: {{reason}}`,origin:{added:`aggiunto · da {{from}}`,replaced:`sostituito · da {{from}}`},motion:{camera:`camera`,"in-addition":`{{name}}`,confirm:`conferma {{name}}`,replace:`sostituisce {{name}}`},value:{stale:`non aggiornato: {{reason}}`,unavailable:`non disponibile: {{reason}}`,unknown:`sconosciuto: {{reason}}`},noRows:`Salvata, ma non cambia ancora nessun campo.`,kind:{added:`aggiunto`,replaced:`sostituito`},originUnread:{pending:`{{kind}} · lettura dei nomi delle sorgenti…`,unknown:`{{kind}} · i nomi delle sorgenti non si sono potuti leggere: {{reason}}`}},advancedLink:`Avanzate — editor delle espressioni`,suggest:{heading:`Suggeriti · {{location}}`,hint_one:`{{count}} suggerito · {{location}}`,hint_other:`{{count}} suggeriti · {{location}}`,in:`in {{container}}`,add:`Aggiungi`,addNamed:`Aggiungi {{name}}`,addAll:`Aggiungi tutti ({{count}})`,use:`Usa`,useNamed:`Usa {{name}}`}},compositionEditor:{now:`l'istante di questa valutazione (ms)`,builtins:{min:`il numero più piccolo`,max:`il numero più grande`,abs:`valore assoluto`,floor:`arrotonda per difetto`,ceil:`arrotonda per eccesso`,sqrt:`radice quadrata`,round:`arrotonda alle cifre`,pow:`x elevato a y`,clamp:`tiene x fra lo e hi`,avg:`media, ignora i null`,sum:`somma`,coalesce:`il primo valore non null`,age:`ms trascorsi da ts`,convert:`converte fra unità dello stesso tipo`,any:`vero se uno è vero`,all:`vero se tutti sono veri`,within:`vero se ts è di al più ms fa`,number:`un numero da un numero o da testo numerico, altrimenti null`,latest:`il timestamp più recente`,rose:`istante dell'ultima salita di un livello (ha memoria)`,count:`quante volte x è avanzato (ha memoria)`},pageTitle:`Dispositivo composto`,loading:`Caricamento della composizione…`,loadFailed:`Impossibile leggere la composizione`,notFound:`Nessuna composizione {{blockId}}.`,notComposition:`Questo blocco non è una composizione.`,customizationUnknownDevice:`È la personalizzazione di un dispositivo che il composer non ha ancora riportato.`,openOnDevice:`Aprila nella pagina del dispositivo`,existingTarget:`Personalizzazione di {{name}}: aggiungi funzioni o sostituisci singoli campi; il resto resta dell'integrazione.`,name:`Nome`,required:`obbligatorio`,takeFrom:`Prendi da…`,formula:`Formula`,formulaFor:`Formula per {{path}}`,clear:`Svuota`,addSource:`+ Aggiungi sorgente`,removeBinding:`Rimuovi binding {{name}}`,copyFeature:`Copia l'intera funzione da…`,replaces:`sostituisce`,replaceIn:`Sostituisci un campo di {{cap}}`,removeFeature:`Rimuovi {{cap}}`,suggestions:`Suggerimenti`,save:`Salva`,cancel:`Annulla`,steps:{target:`1 · Destinazione`,features:`2 · Funzioni`,fieldsOf:`3 · Campi — {{cap}}`,verify:`4 · Verifica e salva`},verify:{checking:`Verifica col server…`,ok:`✓ Nessun problema: tipi, sorgenti, cicli e proprietà dei campi sono a posto.`,unknown:`Impossibile verificare: {{reason}}`},preview:{label:`Anteprima dal vivo`,waiting:`in attesa di {{sources}}`,runtimeOnly:`calcolata dal composer (questa formula ha memoria)`,devicesFailed:`impossibile leggere l'elenco dei dispositivi: {{reason}}`,unknownDevice:`nessun dispositivo registrato per {{sources}}`},reading:`Lettura dei campi del dispositivo…`,checking:`Verifica di cosa si può dare a questo dispositivo…`,unknown:`Alcune funzioni non si sono potute verificare: {{reason}}`,added:`+ aggiunta`,targetType:`Tipo`,templates:{label:`Parti da`,room:`Stanza`,"converted-sensor":`Sensore convertito`,"derived-binary":`Binario derivato`,confirmTitle:`Sostituire la bozza?`,confirmMessage:`Applicare un modello scarta le modifiche non salvate in questo editor.`,confirmApply:`Applica modello`},openComposedDevice:`Apri dispositivo composto #{{id}}`},notificationRules:{groups:{system:`Eventi di sistema`,class:`Rilevamenti`,zones:`Zone`,label:`Volti, targhe ed etichette`,quality:`Qualità`,scope:`Solo mentre`,device:`Evento dispositivo`,package:`Pacco`,occupancy:`Occupazione`,audio:`Suono`,schedule:`Orari`},labels:{classes:`Classi di oggetti`,zones:`Zone`,faces:`Volti noti`,labels:`Etichette`,crossing:`Attraversamento zona`,source:`Sorgente del rilevamento`,add:`Aggiungi un'etichetta…`},crossing:{enter:`In entrata`,exit:`In uscita`,any:`In entrata o in uscita`,hint:`In che direzione il soggetto attraversa la zona.`},zones:{group:`Zone`,noCameras:`Questa regola non copre nessuna telecamera, quindi non ha zone.`},faces:{group:`Volti noti`,anyKnown:`Qualsiasi volto noto — nessuno in particolare`},scene:{hint:`Notifica solo mentre una scena corrisponde o è diversa.`,noGate:`— nessun vincolo di scena —`,none:`Nessuna scena — creane una nella pagina Scene.`,onlyWhile:`Solo mentre è`,read:`Leggi`,readOwn:`L'impostazione della scena`,rightNow:`Adesso:`,missing:`Questa scena non esiste più — scegline un'altra o rimuovi il vincolo.`},snooze:{title:`Silenzia questa regola per {{minutes}} minuti`,failed:`Impossibile modificare la pausa.`,aria:`metti in pausa {{name}}`},delete:{confirm:`Eliminare questa regola?`,message:`Questa azione eliminerà definitivamente "{{name}}". Non si può annullare.`,aria:`elimina {{name}}`},columns:{snooze:`Pausa`},devices:{compatLoading:`Verifica dei dispositivi utilizzabili da questo tipo di regola…`,compatFailed:`Impossibile verificare quali dispositivi può usare questo tipo di regola — sono elencati tutti. L'hub rifiuta comunque al salvataggio un dispositivo incompatibile.`},media:{sensorOneSnapshot:`Una regola sensore allega automaticamente un'istantanea della telecamera — non c'è un rilevamento attorno a cui scegliere un ritaglio, una GIF o un clip.`},status:{grouped:{unknown:`Finestre aperte sconosciute — {{reason}}`,none:`Nessuna finestra aperta`,windows_one:`{{count}} finestra aperta`,windows_other:`{{count}} finestre aperte`,waiting:`{{count}} in attesa`,windowLine:`{{camera}} · {{members}} nella finestra · {{pending}} in attesa · si chiude entro {{seconds}} s`}},grouping:{choice:`Immediata raggruppata`,seconds:`Raggruppa per (secondi)`,hint:`Immediata raggruppata — attende fino a {{n}} s che i soggetti vengano riconosciuti e invia un solo messaggio con un mosaico, uno per soggetto. Si chiude prima se tutti sono già definitivi.`,plainRecognitionHint:`Scatta solo se il nome è già noto quando l'evento viene scritto — scegli Immediata raggruppata per attenderlo.`,scopedHint:`Un soggetto non riconosciuto entro {{n}} s non viene notificato.`,minNote:`Almeno 5 s: i soggetti che arrivano insieme condividono un messaggio.`},alarmNotify:{title:`Notifiche in questa modalità`,duringEntryDelay:`Notifica durante il ritardo di ingresso`,duringEntryDelayHint:`Spento: la notifica del ritardo di ingresso è l’unica finché l’allarme non scatta. Acceso: ogni corrispondenza di una regola d’allarme è una notifica "Intrusione — <luogo>".`,rewatched:`Notifica “di nuovo sorvegliato”`,rewatchedHint:`Un sensore bypassato che si è chiuso e riaperto torna sorvegliato. Mai inviata quando la stessa apertura avvia il ritardo di ingresso.`,ignored:`Notifica sensori ignorati`,ignoredHint:`Un sensore bypassato si è davvero mosso ad allarme inserito e non ha fatto scattare nulla. Mai inviata per un sensore rimasto semplicemente aperto, tornato dopo un'interruzione o ripetuto.`}},ruleScope:{mode:{all:`Tutti`,only:`Solo i selezionati`,except:`Tutti tranne i selezionati`},which:`Quali {{items}}`,items:{devices:`dispositivi`,classes:`classi`,zones:`zone`,faces:`volti`,labels:`etichette`},every:{devices:`Tutti i dispositivi — nessuna restrizione.`,classes:`Tutte le classi — nessuna restrizione.`,zones:`Tutte le zone — nessuna restrizione.`,faces:`Tutti i volti — nessuna restrizione.`,labels:`Tutte le etichette — nessuna restrizione.`},legacy:`Questa regola esclude anche {{items}} — mantenuti al salvataggio.`,removeExclusions:`Rimuovi le esclusioni`,cleared:`Salvando in questa modalità si rimuovono {{items}} dalla regola.`},inlineEdit:{editName:`Modifica nome`,editLocation:`Modifica posizione`,save:`Salva`,cancel:`Annulla`},connectPhone:{title:`Collega un telefono`,description:`Inquadra il codice con il telefono per aprire l'app CamStack (o il viewer web) su questo hub. Il link contiene solo l'indirizzo dell'hub — nessun token, nessuna credenziale.`,signInHint:`L'app poi accede con il login abituale: password (e codice TOTP, se attivo) oppure "Accedi con CamStack".`,addressLabel:`Indirizzo dell'hub per il telefono`,copyLink:`Copia link`,linkLabel:`Link di collegamento`,qrAlt:`Codice QR che apre l'app CamStack su questo hub`,loading:`Lettura degli indirizzi di questo hub…`,error:`Impossibile leggere gli indirizzi di questo hub: {{message}}`,retry:`Riprova`,empty:`Questo hub non pubblica alcun indirizzo raggiungibile da un telefono (nessun tunnel, nessuna mesh, nessuna interfaccia LAN). Controlla Cluster → Network.`,insecure:`Indirizzo HTTP non cifrato: l'app può usarlo su questa rete, ma la pagina di fallback nel browser accetta solo hub https. Preferisci il tunnel o l'indirizzo mesh quando disponibili.`,implausible:`L'hub segnala questo indirizzo come difficilmente raggiungibile da un telefono.`,tier:{public:`Tunnel pubblico`,mesh:`Tailscale (MagicDNS)`,lan:`Rete locale`,"lan-ipv6":`Rete locale (IPv6)`}},storage:{addLocationWizard:{type:`Tipo:`,loadingProviders:`Caricamento dei provider…`,node:`Nodo`,path:`Percorso`,connectionOk:`Connessione riuscita.`,testFailed:`Test fallito: {{value1}}`,testing:`Test in corso…`,testConnection:`Test connessione`,displayName:`Nome visualizzato`,on:`{{type}} su {{displayName}}`,autoDerivedOverrideIfNeeded:`— derivato automaticamente; modificalo se serve`,format:`Formato:`,typeSlug:`<type>:<slug>`,enableImmediately:`Abilita subito`,aDisabledLocationReceivesNo:`Una posizione disabilitata non riceve scritture finché non viene abilitata: le letture e la retention per età continuano a funzionare, ma nulla di nuovo viene salvato qui. Lascia disattivato per registrare il disco ora e iniziare a usarlo più tardi.`,saving:`Salvataggio…`},drainProgressLine:{thisLocationIsDrainingThe:`Questa posizione si sta svuotando. L'hub non ha ancora indicato quanto resta: lo svuotamento è appena stato impostato, oppure questo hub è precedente al report di avanzamento.`,drainingRemainingNotReportedYet:`Svuotamento · residuo non ancora indicato`,everythingThatWasHereHas:`Tutto ciò che c'era è stato spostato. La posizione è ancora in modalità svuotamento: non riceve nuove scritture finché non la cambi.`,drainedNothingLeftToMove:`Svuotata · niente da spostare`,drainProgress:`Avanzamento dello svuotamento`,theDrainIsPacedBy:`Lo svuotamento procede alla velocità con cui questa classe di dati continua a crescere, e questa non è ancora stata osservata. Non c'è una data da indicare.`,emptyTimeNotKnownYet:`· tempo di svuotamento non ancora noto`},editLocationModal:{displayName:`Nome visualizzato`,node:`Nodo`,path:`Percorso`,connectionOk:`Connessione riuscita.`,testFailed:`Test fallito: {{value1}}`,testing:`Test in corso…`,testConnection:`Test connessione`,saving:`Salvataggio…`},pathBrowser:{newFolder:`nuova cartella`,create:`Crea`},protectionPolicyField:{protectedFreeSpace:`Spazio libero protetto`,protectionUnit:`Unità di protezione`,ofTheVolume:`% del volume`,gbOfFreeSpace:`GB di spazio libero`},locationCapacityBar:{capacityUnknown:`Capacità sconosciuta`,capacityUnknownCamstackHolds:`Capacità sconosciuta · CamStack occupa {{owned}}`},locationCard:{deleteLocation:`Elimina posizione`},locationDiscardControl:{discardLeftoversOn:`Scartare gli avanzi su "{{displayName}}"?`,permanentlyDeletesLeftoverFilesAnd:`Elimina definitivamente i file e i record avanzati su questa posizione. Le altre posizioni non sono toccate. L'operazione non si può annullare e può richiedere ore.`,discardLeftovers:`Scarta gli avanzi`,permanentlyDeleteLeftoverFilesOn:`Elimina definitivamente i file avanzati su questa posizione. Le altre posizioni non sono toccate.`},locationGroup:{singleOneLocationPerType:`Singola: una posizione per tipo. Modifica quella esistente; non si può dividere.`,noLocationRegisteredClickAdd:`Nessuna posizione registrata. Fai clic su "Aggiungi" per registrarne una.`,noLocationRegisteredYetShould:`Nessuna posizione registrata: dovrebbe essere creata automaticamente al prossimo avvio.`},locationModeSelector:{locationState:`Stato della posizione`,locationStateChoices:`Scelte dello stato della posizione`,closeLocationStateChoices:`Chiudi le scelte dello stato della posizione`}},pipeline:JSON.parse(`{"cameraAssignmentsTable":{"camera":"Telecamera","placement":"Posizionamento","rolesHere":"Ruoli qui","runningOn":"In esecuzione su","status":"Stato","filterByCameraActivity":"Filtra per attività della telecamera"},"cameraStatusStrip":{"cameras":"Telecamere","fpsMsInferQ":"{{name}} · {{label}} · {{value3}} fps · {{value4}}ms infer · q={{queueDepth}}"},"clusterDetail":{"clusterOrchestration":"Orchestrazione del cluster","cameraAssignmentsLoadBalancingThe":"Assegnazioni delle telecamere, bilanciamento del carico, raccomandazione del detector, ruoli e impostazioni del cluster."},"clusterStepModel":{"oneValueForTheWhole":"Un unico valore per tutto il cluster — questo step scrive in un indice vettoriale condiviso, dove due encoder rendono i punteggi di similarità privi di significato.","changeInClusterSettings":"Modifica in Cluster → Impostazioni ›","oneModelForEveryNode":"Un unico modello per ogni nodo e telecamera:"},"liveLoadPanel":{"liveLoad":"Carico live","activeAttached":"Attive / Collegate","avgInferMs":"Infer medio ms","queue":"Coda","audio":"Audio","totalAgents":"Agenti totali","totalFps":"FPS totali","avgInferenceMs":"Inferenza media ms","queueDepth":"Profondità coda","agent":"Agente","cameras":"Telecamere","inferenceMs":"Inferenza ms","noCameraMetricsReceivedYet":"Nessuna metrica ricevuta dalle telecamere"},"nodeCameraAssignmentsTable":{"moveDetectionTo":"Sposta la detection su {{name}}","moveAudioTo":"Sposta l'audio su {{name}}","unpinDetection":"Rimuovi vincolo detection","unpinAudio":"Rimuovi vincolo audio","camera":"Telecamera","rolesHere":"Ruoli qui","status":"Stato","move":"Sposta {{deviceName}}","loadingCameras":"Caricamento telecamere…","noCameraRunsOnThis":"Nessuna telecamera è in esecuzione su questo nodo al momento"},"nodeDetail":{"assignments":"Assegnazioni","pipeline":"Pipeline","warmInstances":"Istanze attive","logs":"Log"},"nodeDetailHeader":{"nodeNotFound":"Nodo non trovato:"},"nodeList":{"cluster":"Cluster","assignmentsLoadBalancingRoles":"Assegnazioni, bilanciamento del carico, ruoli","pipelineEnabled":"Pipeline: abilitata","pipelineNotEnabledAgentCapability":"Pipeline: non abilitata (capability dell'agente)","pipe":"Pipe","audioEnabled":"Audio: abilitato","audioNotEnabledAgentCapability":"Audio: non abilitato (capability dell'agente)","aud":"Aud"},"nodeLoadOverview":{"nodeLoad":"Carico dei nodi","reading":"lettura…","noClusterNodesReportedYet":"Nessun nodo del cluster ha ancora riferito.","noDetect":"no detect","onlineButItDidNot":"Online, ma non ha risposto all'ultima lettura del carico — i suoi valori qui sotto sono sconosciuti, non zero.","runningAttached":"In esecuzione / collegate","sessionsInInferenceNowCameras":"Sessioni in inferenza ora / telecamere collegate a questo runner (il carico impegnato del bilanciatore) / limite impostato dall'operatore.","targetShare":"Quota obiettivo","theNodeShareAutomaticOr":"La quota del nodo (automatica o manuale) normalizzata sui nodi che il bilanciatore considera davvero (online E con detect abilitato).","actualShare1H":"Quota effettiva (1 h)","timeWeightedShareOfThe":"Quota, pesata nel tempo, delle sessioni di detection PARALLELE del cluster svolte da questo nodo nell'ultima ora — la grandezza che una quota governa. '—' = nessuna sessione eseguita qui nella finestra.","peakYields":"Picco · cessioni","mostSessionsThisNodeRan":"Il massimo di sessioni eseguite insieme da questo nodo nell'ultima ora, e quanti turni di quota ha ceduto a un altro nodo perché pieno o in affanno.","scoreQueue":"Punteggio · coda","theCapacityScoreBalanceMinimises":"Il punteggio di capacità che balance() minimizza (collegate + profondità della coda) e la profondità grezza della coda.","capFill":"Riempimento limite","attachedMaxcameras":"collegate / maxCameras.","avgInfer":"Infer medio","meanInferenceTimeAcrossThis":"Tempo medio di inferenza sulle telecamere collegate a questo nodo.","decode":"Decode","thisNodeSProbedDecode":"L'accelerazione hardware di decode rilevata su questo nodo.","acceleratorsNotReadYet":"Acceleratori non ancora letti.","accelerators":"Acceleratori","noDeviceIsACamera":"Nessun dispositivo è candidato come radice telecamera su questo nodo — le sessioni girano sul pool predefinito (CPU) del runner.","noneInPlayRunnerDefault":"nessuno in uso · pool predefinito del runner","notKnownTheNodeDid":"Sconosciuto: il nodo non ha riferito, oppure esegue una sessione che nessun dispositivo giustifica.","atItsMaxsessionsCapThe":"Al limite maxSessions — il bilanciatore lo salta finché una sessione non termina.","atCap":"· al limite"},"settingsPanel":{"saving":"Salvataggio…"},"clusterAssignmentsTab":{"cameraPlacement":"Posizionamento delle telecamere","pinACameraToA":"Vincola una telecamera a un nodo, o a un acceleratore del suo nodo; Auto lascia scegliere a ogni sessione. Il decode gira sempre insieme alla detection. Carico, quote e limiti sono in Bilanciamento del carico."},"clusterAutoTuneTab":{"notChanged":"Non modificato","device":"Dispositivo","capacity":"Capacità","detector":"Detector","why":"Motivo","nodeSettings":"Impostazioni del nodo","noChange":"Nessuna modifica.","stepDefault":"predefinito dello step","cameraOverridesCleared":"Override delle telecamere rimossi","none":"Nessuno.","modelRemoved":": modello {{modelIdBefore}} rimosso","reset":"; {{value1}} reimpostato","anotherApplyIsAlreadyRunning":"Un'altra applicazione è già in corso.","theConfigurationChangedSinceThe":"La configurazione è cambiata da quando il piano è stato mostrato. Controlla il piano aggiornato qui sotto e applica di nuovo.","aModelCouldNotBe":"Impossibile scaricare un modello: nulla è stato modificato.","autoTune":"Auto tune","picksForEveryAcceleratorThe":"Sceglie, per ogni acceleratore, il detector YOLOv9 più accurato che regga comunque almeno il numero di telecamere indicato contemporaneamente, in base all'hardware del nodo e alle velocità misurate. Non viene misurato né stimato nulla sull'attività delle tue telecamere. Applicandolo si impostano quei modelli e si rimuove ogni override di modello e soglia — a livello di nodo e per telecamera — così ogni modello usa le proprie soglie predefinite. Step abilitati, dispositivi, vincoli, registrazione, notifiche, zone e regole non vengono toccati. Non è possibile annullare.","keepFree":"Mantieni libero","shareOfEachAcceleratorKept":"Quota di ogni acceleratore mantenuta libera","ofEachAccelerator":"{{value1}}% di ogni acceleratore","atLeast":"Almeno","minimumParallelSessionsPerDevice":"Sessioni parallele minime per dispositivo","computing":"Calcolo…","computePlan":"Calcola piano","recompute":"Ricalcola","apply":"Applica…","applyAutoTune":"Applicare l'auto tune?","theseAreAllTheChanges":"Queste sono tutte le modifiche. Ogni override elencato viene rimosso e non può essere ripristinato.","applying":"Applicazione…"},"clusterEventsTab":{"postProcessingNode":"Nodo di post-elaborazione","theSingleNodeThatRuns":"L'unico nodo che esegue la post-elaborazione della detection (eventi, media, audio e movimento). Ogni altro nodo resta inattivo — nessun bilanciamento multi-nodo. Ha effetto al riavvio dell'addon.","hubDefault":"hub (predefinito)","eventsFolder":"Cartella degli eventi","whereEventCropsFullFrames":"Dove vengono salvati i ritagli e i frame completi degli eventi. Una sola cartella — nessuna collezione / divisione equa."},"clusterLoadBalancingTab":{"placementPolicy":"Policy di posizionamento","howANewDetectionSession":"Come una nuova sessione di detection sceglie nodo e dispositivo, e cosa succede quando un nodo resta indietro. 'Rispetta le quote' (predefinito) mantiene le quote qui sotto per le sessioni PARALLELE.","nodeShares":"Quote dei nodi","shareSource":"Origine delle quote","suggesting":"Calcolo del suggerimento…","suggestFromBenchmark":"Suggerisci dal benchmark","suggestFromHardware":"Suggerisci dall'hardware","autoTune":"Auto tune","moveStandingAlwaysOnCameras":"Sposta le telecamere fisse (sempre attive) che non sono più sul loro nodo migliore. Le telecamere vincolate non si spostano mai; le sessioni su movimento vengono comunque posizionate per sessione.","rebalancing":"Riequilibrio…","rebalance":"Riequilibra","policy":"Policy:","honourShares":"rispetta le quote","automaticSharesAreBeingComputed":"Le quote automatiche vengono calcolate dalla capacità misurata del cluster; nel frattempo si usano i valori salvati.","benchmarkEachNodeSShare":"Benchmark: la quota di ogni nodo segue la sua capacità misurata dai risultati dei benchmark dei nodi (capacità hardware dove mancano)","hardwareEachNodeSShare":"Hardware: la quota di ogni nodo segue la sua capacità al modello di Auto tune, dalla velocità misurata del suo hardware","recomputedWheneverANodeOr":", ricalcolata ogni volta che un nodo o un acceleratore viene aggiunto, rimosso, attivato o disattivato, o cambia modello","maxConcurrentSessionsAdvanced":"Sessioni simultanee massime (avanzato)","maxConcurrentSessionsFor":"Sessioni simultanee massime per {{name}}","aHardCapOnThe":"Un limite rigido alle sessioni che un nodo esegue insieme (contano anche le telecamere sempre attive). Un nodo al limite non viene mai scelto; con le quote il suo turno passa a un nodo libero. Vuoto = illimitato.","accelerators":"Acceleratori","noDetectCapableNodes":"Nessun nodo in grado di fare detect","enableDetectionOnANode":"Abilita la detection su un nodo in Ruoli e nodi per configurarne gli acceleratori.","suggestedFromBenchmark":"Suggerito dal benchmark","suggestedFromHardware":"Suggerito dall'hardware","applySuggestedShares":"Applica le quote suggerite","notPartOfTheSuggestion":"escluso dal suggerimento — {{skippedReason}}","parallelSessions":"≈ {{capacitySessions}} sessioni parallele · {{value2}}","measuredByNodeBenchmarksOr":"misurato dai benchmark dei nodi, o dalla tabella hardware dove un nodo non ha risultati","atTheModelsAutoTune":"ai modelli scelti da Auto tune (almeno {{minSessionsPerDevice}} per acceleratore), dalla velocità misurata dell'hardware di ogni nodo","applyingWritesTheNodeAnd":"Applicando si scrivono le quote di nodi e acceleratori; i limiti sono indicativi — applicali uno a uno dalla riga del rispettivo acceleratore.","automaticSharesAlreadyFollowThis":"Le quote automatiche seguono già questo valore; i limiti sono indicativi — applicali uno a uno dalla riga del rispettivo acceleratore.","staleDevicePins":"Vincoli dispositivo obsoleti","clearPin":"Rimuovi vincolo"},"clusterOrchestratorLogsTab":{"orchestratorLogs":"Log dell'orchestrator","dispatchDecisionsBalancerMovesAnd":"Decisioni di dispatch, spostamenti del bilanciatore ed eventi di failover dell'orchestrator della pipeline. In streaming live; il chip del dispositivo su una riga indica a quale telecamera si riferisce."},"clusterRecordingTab":{"recordingNode":"Nodo di registrazione","theSingleNodeThatRecords":"L'unico nodo che registra (continuo ed eventi) e serve la riproduzione. Ogni altro nodo resta inattivo — nessun bilanciamento multi-nodo. Ha effetto al riavvio dell'addon.","hubDefault":"hub (predefinito)","recordingsFolders":"Cartelle delle registrazioni","whereRecordingsAreStoredMulti":"Dove vengono salvate le registrazioni. Collezioni multi-posizione — i segmenti sono distribuiti tra le posizioni di un tipo. Aggiungi una posizione per aumentare la capacità; segnane una come predefinita per tipo."},"clusterRolesNodesTab":{"loading":"Caricamento","clusterRoles":"Ruoli del cluster","oneNodeHoldsEachRole":"Un nodo ricopre ciascun ruolo per tutte le telecamere. Quote e limiti della detection sono in Bilanciamento del carico.","nodeCapabilities":"Capability dei nodi"},"clusterSettingsTab":{"notAvailableTheAddonThat":"Non disponibile — l'addon che gestisce queste impostazioni non ha risposto."},"nodeCamerasTab":{"theRolesEachCameraRuns":"I ruoli che ogni telecamera esegue qui in questo momento. Sposta un ruolo o rimuovi il vincolo dal menu della riga; i vincoli di tutte le telecamere sono in Cluster → Assegnazioni."},"nodeEnginesTab":{"killEngine":"Termina engine","inferenceEnginesOnThisNode":"Engine di inferenza su questo nodo","kind":"Tipo","runtimeBackendDevice":"Runtime / Backend / Dispositivo","models":"Modelli","poolPid":"PID del pool","autoKill":"Auto-terminazione","inUse":"In uso","kill":"Termina","noEnginesResidentTheFactory":"Nessun engine residente — la factory ne avvia uno alla prima esecuzione della pipeline."},"nodeLiveTab":{"liveStatus":"Stato live","runtimeMetricsForTheRunner":"Metriche di runtime dell'istanza runner su questo nodo. Si aggiorna ogni 2s.","inferenceLatency":"Latenza di inferenza","activeCameras":"Telecamere attive","throttled":"Limitate","queueDepth":"Profondità coda","camera":"Telecamera","phase":"Fase","actualFps":"FPS effettivi","queue":"Coda","inferenceMs":"Inferenza ms","noCamerasAttachedToThis":"Nessuna telecamera collegata a questo runner"},"nodeLogsTab":{"runnerLogs":"Log del runner"},"nodePipelineTab":{"resetToHardwareAwareDefaults":"Reimpostare {{nodeName}} ai valori predefiniti basati sull'hardware?","thisClearsEveryPerDevice":"Questo rimuove ogni modello predefinito per dispositivo su questo nodo (si torna al predefinito del formato) e ogni override di step per telecamera riferito a questo nodo. Le personalizzazioni per telecamera esistenti su questo nodo andranno perse.","resetFailed":"Reimpostazione fallita","clearThisNodeSPer":"Rimuove i modelli predefiniti per dispositivo di questo nodo + gli override per telecamera riferiti a questo nodo","resetting":"Reimpostazione…","resetToDefault":"Ripristina predefiniti"},"storageLocationsPanel":{"disable":"Disabilitare \\"{{displayName}}\\"?","nothingIsDeletedSetThe":"{{consequence}} Nulla viene eliminato — riporta la posizione su Sola lettura o Attiva per riavere le sue registrazioni.","deleteLocation":"Eliminare la posizione \\"{{displayName}}\\"?","removesTheRecordFilesOn":"Rimuove il record; i file su disco non vengono toccati.","deleteAnyway":"Eliminare comunque?","forceDelete":"Elimina forzatamente","noStorageLocationsDeclaredFor":"Nessuna posizione di archiviazione dichiarata per questo scopo."},"pipelineView":"Vista pipeline","nodes":"Nodi","cameras":"Telecamere","pipeline":"Pipeline","detectionPlacementLoadAndPer":"Posizionamento della detection, carico e runtime per telecamera nel cluster.","hide":"Nascondi","show":"Mostra"}`),assignments:{assignmentStatusCell:{noMetricsInTheLast:`Nessuna metrica negli ultimi 10 s — la telecamera non ha sessioni in esecuzione`,noLiveData:`nessun dato live`},clusterRowCells:{inferenceDevicePinNoNode:`Vincolo dispositivo di inferenza (ancora nessun nodo)`,anAcceleratorIsPinnedOn:`Un acceleratore è vincolato sul nodo della telecamera; questa telecamera non ne ha ancora usato uno.`,anyAccelerator:`Qualsiasi acceleratore`,noSessionYet:`— nessuna sessione ancora`,anUnpinnedCameraIsPlaced:`Una telecamera non vincolata viene riposizionata a ogni avvio di sessione, quindi può cambiare da una sessione all'altra.`,idleLastSession:`{{how}} · inattiva, ultima sessione`,streamBrokersOf:`Stream broker di {{deviceName}}`,streamBrokersClients:`Stream broker e client`},placementControls:{nodePin:`Vincolo nodo`,autoLetsEachSessionPick:`Auto lascia che ogni sessione scelga il proprio nodo; un vincolo mantiene la telecamera su un solo nodo.`,accelerator:`acceleratore: …`,anyAccelerator:`Qualsiasi acceleratore`,inferenceDevicePin:`Vincolo dispositivo di inferenza`,pinDetectionToOneAccelerator:`Vincola la detection a un acceleratore del nodo, oppure lascia scegliere a ogni sessione.`}},cameras:{cameraPipelineCard:{pipelineStatus:`Stato della pipeline di {{name}}`,objectDetectionMode:`Modalità di object detection`,detectionOff:`detection disattivata`,recording:`Registrazione ({{mode}})`,recordingMode:`Modalità di registrazione`,noPipelineStatusYetThe:`Ancora nessuno stato della pipeline — l'orchestrator non ha composto uno snapshot per questa telecamera.`},camerasOverview:{loadingCameraPipelines:`Caricamento pipeline delle telecamere…`,noCamerasFound:`Nessuna telecamera trovata`,withIssues:`con problemi`,polledEvery5SDetection:`interrogate ogni 5 s · metriche di detection live a 1 Hz`},cardPrimitives:{deviceLevelOverrideActive:`Override a livello di dispositivo attivo`},configBlocks:{manuallyPinned:`Vincolato manualmente`,persistedSettingsPinForThis:`Vincolo salvato nelle impostazioni per questo ruolo`,whereItRuns:`Dove viene eseguito`,detection:`Detection`,decoder:`Decoder`,audio:`Audio`,source:`Sorgente`,detectionPlacementPin:`Vincolo di posizionamento della detection`,autoLoadBalanced:`Auto (bilanciato)`,streamsMotion:`Stream e movimento`,detectStream:`Stream di detection`,detectFps:`FPS detection`,motionSrc:`Sorgente mov.`,cameraSensors:`Sensori della telecamera`,motionStream:`Stream del movimento`,motionFps:`FPS movimento`,cooldown:`Cooldown`,noStreamsRegistered:`Nessuno stream registrato`,pipelineSteps:`Step della pipeline`,resolving:`Risoluzione…`,noStepsConfigured:`Nessuno step configurato`,audioClass:`Classe audio.`},runtimeBlocks:{detectionRuntime:`Runtime di detection`,mode:`Modalità`,detectionStageInactiveOrUnreachable:`Fase di detection inattiva o non raggiungibile`,inference:`Inferenza`,engine:`Engine`,provisioning:`Provisioning`,streamBroker:`Stream broker`,brokerStageInactiveOrUnreachable:`Fase broker inattiva o non raggiungibile`,noBrokerProfiles:`Nessun profilo broker`,subscribers:`Sottoscrittori`,decoder:`Decoder`,decoderStageInactiveOrUnreachable:`Fase decoder inattiva o non raggiungibile`,node:`Nodo`},streamsTab:{streamProfiles:`Profili stream`,autoAssign:`Assegna automaticamente`,noStreamsAvailable:`Nessuno stream disponibile`,notAssigned:`— Non assegnato —`,availableStreams:`Stream disponibili`,reProbe:`Rileva di nuovo`,rtspRestream:`Restream RTSP`,host:`Host:`,rtspRestreamProviderNotAvailable:`Provider di restream RTSP non disponibile — la capability potrebbe non essere ancora caricata`,restreamEnabledClickToDisable:`Restream abilitato — clicca per disabilitare`,restreamDisabledClickToEnable:`Restream disabilitato — clicca per abilitare`,regenerateRtspToken:`Rigenera token RTSP`,regenerateRtspTokenForThe:`Rigenerare il token RTSP per {{profileLabel}}? L'URL attuale smetterà di funzionare e ne verrà generato uno nuovo.`,regenerate:`Rigenera`,regenerateRtspTokenCurrentUrl:`Rigenera token RTSP (l'URL attuale cambierà)`,muted:`Audio disattivato`,videoOnlyNoAudio:`Solo video — nessun audio`,restreamDisabledRtspClientsWill:`Restream disabilitato — i client RTSP riceveranno 403`,clickToCopy:`Clicca per copiare: {{url}}`,resolution:`Risoluzione`,codec:`Codec`,frameRate:`Frame rate`,noMetadataAvailableClickRe:`Nessun metadato disponibile — clicca Rileva di nuovo per rilevare le proprietà dello stream`,sourceUrl:`URL sorgente`}},placementBoard:{nodeCapabilitiesTable:{node:`Nodo`,on:`{{label}} su {{name}}`,noClusterNodesReportingYet:`Nessun nodo del cluster ha ancora riferito.`},nodeInferenceDevices:{singleDefault:`predefinito singolo`,autoDefault:`predefinito automatico`,probingAccelerators:`Rilevamento acceleratori…`,noInferenceDevicesReportedBy:`Nessun dispositivo di inferenza riportato dal rilevamento della piattaforma di questo nodo.`,maxConcurrentSessionsFor:`Sessioni simultanee massime per {{label}}`,enable:`Abilita {{label}}`,acceleratorShare:`Quota acceleratore`,automaticEachAcceleratorSShare:`Automatico: la quota di ogni acceleratore segue il throughput misurato al suo modello. Passa le quote dei nodi in manuale per impostarle tu.`,dragToShiftTheShare:`Trascina per spostare la quota di sessioni di detection gestita da ogni acceleratore; bloccane uno per fissarne la quota mentre gli altri si riequilibrano. Le quote sommano sempre a 100%.`,failedToSaveInferenceDevices:`Impossibile salvare i dispositivi di inferenza:`,unknownError:`errore sconosciuto`,advisoryCapFromTheMeasured:`Limite indicativo calcolato dal throughput misurato al modello suggerito, lasciando libero il margine. Applicandolo si scrive il limite di questo dispositivo.`,nodeUnreachable:`Nodo non raggiungibile`,thePlatformProbeCouldnT:`Il rilevamento della piattaforma non è raggiungibile, quindi l'insieme di acceleratori live non è disponibile. Le impostazioni riprendono quando il nodo si riconnette.`},reachableHostInput:{reachableHostFor:`Host raggiungibile per {{nodeId}}`,saveReachableHostFor:`Salva host raggiungibile per {{nodeId}}`,saveReachableHost:`Salva host raggiungibile`,saved:`Salvato`,failedToSaveReachableHost:`Impossibile salvare l'host raggiungibile`},roleControls:{default:`{{name}} (predefinito)`,node:`nodo {{value1}}`},weightSliderStack:{noDetectEnabledNodesEnable:`Nessun nodo con detect abilitato. Abilita “Detect” su un nodo qui sopra per distribuire il peso della detection.`,for:`{{weightLabel}} per {{name}}`,unlockAllowRebalancing:`Sblocca — consenti il riequilibrio`,lockThisShareWhenOthers:`Blocca questa quota quando gli altri cambiano`,draggingOneSliderSplitsThe:`Trascinando uno slider, il resto viene diviso in parti uguali tra i nodi sbloccati; blocca un nodo per fissarne la quota — i nodi bloccati non si spostano mai e il totale resta sempre al 100%, quindi il trascinamento è limitato dallo spazio che lasciano i nodi sbloccati. La detection si distribuisce solo tra i nodi che possono fornire i frame di una telecamera.`}},stepInspector:{clusterOwnedSettings:{clusterWideSettings:`Impostazioni di tutto il cluster`,editInClusterSettings:`Modifica in Cluster → Impostazioni ›`,oneValueForEveryNode:`Un unico valore per ogni nodo e telecamera — questo step scrive in un indice condiviso.`},effectiveModelSummary:{toChangeAModelOpen:`Per cambiare un modello, apri la cella di quell'acceleratore nella tabella.`},nodeStepInspector:{loadingPipeline:`Caricamento pipeline…`,catalogUnavailable:`Catalogo non disponibile.`,accelerators:`Acceleratori:`,noneEnabled:`nessuno abilitato`,off:`— disattivato:`,clusterLoadBalancing:`Cluster → Bilanciamento del carico ›`,detectionSteps:`Step di detection`,noStepSelected:`Nessuno step selezionato.`,itRunsOnInstead:`Viene eseguito invece su {{shortLabel}}.`,itDoesNotRunHere:`Non viene eseguito qui.`,runOn:`Esegui su`,autoThisAcceleratorOrThe:`Auto (questo acceleratore, o il successivo in grado di eseguirlo)`,routesThisStepAndIts:`Instrada questo step (e i suoi step figli) su un altro acceleratore di questo nodo.`,baseForEveryCameraThat:`{{slot}} · {{format}} · base per ogni telecamera che arriva qui`,everyAcceleratorOf:`{{slot}} · ogni acceleratore di {{nodeName}}`,model:`Modello`,enableOneInClusterLoad:`abilitane uno in Cluster → Bilanciamento del carico`,settings:`Impostazioni`,thisStepSSettingsDiffer:`Le impostazioni di questo step differiscono tra gli acceleratori di questo nodo. Salvando, i valori mostrati qui diventano validi per tutto il nodo.`},stepMatrixFrame:{discardUnsavedChanges:`Scartare le modifiche non salvate?`,thisStepHasChangesThat:`Questo step ha modifiche non ancora salvate.`,discard:`Scarta`,filterStepsOrSettings:`Filtra step o impostazioni /`,filterStepsOrSettings2:`Filtra step o impostazioni`,stepSettings:`Impostazioni dello step`}},detectionIntelligence:JSON.parse(`{"assignDialog":{"assignFacesToPerson":"Assegna {{value1}} volti a una persona","assignFaceToPerson":"Assegna il volto a una persona","selectAnExistingPersonOr":"Scegli una persona esistente o creane una nuova.","newPersonName":"Nome della nuova persona…","newPerson":"+ Nuova persona…","createAssign":"Crea e assegna"},"assignPlateDialog":{"assignPlatesToVehicle":"Assegna {{value1}} targhe a un veicolo","assignPlateToVehicle":"Assegna la targa a un veicolo","selectAnExistingVehicleOr":"Scegli un veicolo esistente o creane uno nuovo.","newVehicleName":"Nome del nuovo veicolo…","newVehicle":"+ Nuovo veicolo…","createAssign":"Crea e assegna"},"cameraMultiSelect":{"clearSelection":"Cancella selezione"},"copyUrlChips":{"copyTheMediaUrl":"Copia l'URL del media","clipboardAccessWasRefusedSelect":"Accesso agli appunti negato. Seleziona l'URL qui sotto e copialo a mano.","url":"URL {{label}}","copyUrl":"Copia URL {{label}}","copied":"Copiato","local":"Locale","copyLanUrl":"Copia URL LAN — {{AUTH_HINT}}","public":"Pubblico","copyPublicUrl":"Copia URL pubblico — {{AUTH_HINT}}"},"dateRangeFilter":{"fromDate":"Data di inizio","toDate":"Data di fine"},"eventCard":{"eventFrom":"Evento da {{cameraName}}","keyEventMediaUnavailable":"Media dell'evento chiave non disponibile","noKeyEventMedia":"Nessun media dell'evento chiave","deselect":"Deseleziona","select":"Seleziona","clipSemanticMatchScore":"Punteggio di corrispondenza semantica CLIP","markedForTraining":"Segnato per l'addestramento","trainingComplete":"Addestramento completato","flaggedForDebug":"Segnalato per debug","favourited":"Preferito"},"eventDetailPanel":{"snapshotCheckpointClickToView":"Punto di controllo dello snapshot — clicca per vedere questo frame","clipUnavailable":"Clip non disponibile","couldNotResolveClipPlayback":"Impossibile risolvere la riproduzione della clip. Controlla i log del server.","deleteTrack":"Elimina track","deleteThisTrackAndEvery":"Eliminare questo track e ogni immagine e clip acquisita per esso? L'operazione non può essere annullata.","deleteFailed":"Eliminazione fallita","failedToDeleteThisTrack":"Impossibile eliminare questo track. Controlla i log del server.","eventDetail":"Dettaglio evento","keyFrameFrom":"Key frame da {{cameraName}}","keyFrameMediaUnavailable":"Media del key frame non disponibile","viewClip":"Guarda clip","bestShot":"Miglior scatto","camera":"Telecamera","class":"Classe","label":"Etichetta","subLabel":"Sotto-etichetta","importance":"Importanza","zonesVisited":"Zone visitate","audioHeard":"Audio rilevato","totalDistance":"Distanza totale","firstSeen":"Visto per la prima volta","lastSeen":"Visto per l'ultima volta","track":"Track"},"eventKindFilter":{"kinds":"Tipi ({{value1}})","kinds2":"Tipi","searchKinds":"Cerca tipi…","clear":"Cancella","loadingKinds":"Caricamento tipi…","noKindMatchesThatSearch":"Nessun tipo corrisponde alla ricerca.","theseCamerasAdvertiseNoEvent":"Queste telecamere non dichiarano alcun tipo di evento.","expand":"Espandi"},"eventsSection":{"someTracksWereNotDeleted":"Alcuni track non sono stati eliminati","failedToDeleteTracksOn":"Impossibile eliminare i track su: {{names}}. Restano selezionati — riprova, oppure controlla i log del server.","minScore":"Punteggio minimo","minimumImportance":"Importanza minima","ofEvents":"{{value1}} di {{value2}} eventi","newEventsRefresh":"Nuovi eventi — aggiorna","nothingMatchesTheFilter":"Nessun risultato per il filtro","noKeyEventsInThis":"Nessun evento chiave in questo intervallo","widenTheDateRangeClear":"Amplia l'intervallo di date, deseleziona telecamere o tipi, oppure abbassa il punteggio minimo.","capturedTracksAppearHereWhen":"I track acquisiti compaiono qui quando la pipeline assegna un punteggio a un evento chiave."},"faceDetailPanel":{"face":"Volto","faceDetail":"Dettaglio volto","fullFrameWithDetectedFace":"Frame intero con il volto rilevato","detectedFace":"Volto rilevato","noImage":"Nessuna immagine","theCropMediaForThis":"Impossibile risolvere il media del ritaglio di questo volto (un orfano precedente alla correzione). Si può eliminare senza rischi.","camera":"Telecamera","captured":"Acquisito","track":"Track","identity":"Identità"},"peopleList":{"loadingSamples":"Caricamento campioni…","noSamplesYet":"Ancora nessun campione.","sample":"Campione","enrolledFromAnUploadedPhoto":"Registrato da una foto caricata","removeSample":"Rimuovi campione","person":"Persona","samples":"Campioni","edit":"Modifica {{name}}","delete":"Elimina {{name}}","name":"Nome","personName":"Nome della persona…","trainingSamples":"Campioni di addestramento","removeASampleToDrop":"Rimuovi un campione per escluderlo dall'addestramento del riconoscimento per questa persona.","deletePerson":"Elimina persona","deleteAndAllTheirSamples":"Eliminare {{name}} e tutti i suoi campioni? L'operazione non può essere annullata.","loadingPeople":"Caricamento persone…","addPerson":"Aggiungi persona","enrolFromAPhoto":"Registra da una foto","nothingMatchesTheFilter":"Nessun risultato per il filtro","noPeopleEnrolledYet":"Nessuna persona ancora registrata","clearTheSearchOrTry":"Cancella la ricerca o prova con un altro nome.","addAPersonOrEnrol":"Aggiungi una persona, oppure registra i volti da una foto.","noPeopleEnrolledYet2":"Nessuna persona ancora registrata."},"photoEnrollDialog":{"ignoreThisFace":"Ignora questo volto","newPerson":"+ Nuova persona…","face":"Volto {{value1}}","assignFace":"Assegna il volto {{value1}}","notUsable":"Non utilizzabile","thisPhotoCouldNotBe":"Impossibile analizzare questa foto:","unknownError":"errore sconosciuto","noFacesWereFoundIn":"Nessun volto trovato in questa foto. Un volto deve essere abbastanza grande e rivolto verso la fotocamera perché il detector possa misurarlo.","newPersonNameTypeThe":"Nome della nuova persona… (scrivi lo stesso nome sotto un altro volto per riutilizzarlo)","enrolFromPhotos":"Registra da foto","everyPhotoIsAnalysedWith":"Ogni foto viene analizzata con lo stesso detector di volti usato dalle telecamere, e tutti i volti trovati vengono rivisti qui sotto in un unico passaggio, raggruppati per foto. Assegna ogni volto a una persona, oppure lascialo ignorato.","atLeast3PhotosPer":"almeno 3 foto per persona","choosePhotos":"Scegli foto"},"plateDetailPanel":{"plate":"Targa","plateDetail":"Dettaglio targa","fullFrameWithDetectedPlate":"Frame intero con la targa rilevata","detectedPlate":"Targa rilevata","noImage":"Nessuna immagine","theCropMediaForThis":"Impossibile risolvere il media del ritaglio di questa targa. Si può eliminare senza rischi.","plateText":"Testo della targa","saveCorrectedText":"Salva testo corretto","correctTheOcrReading":"Correggi la lettura OCR","camera":"Telecamera","captured":"Acquisita","confidence":"Confidenza","vehicle":"Veicolo","track":"Track"},"recentPlates":{"plateFrom":"Targa {{text}} da {{cameraName}}","noCropImageThePlate":"Nessuna immagine del ritaglio — manca il media del ritaglio della targa. Si può eliminare senza rischi.","noCrop":"Nessun ritaglio","deselect":"Deseleziona","select":"Seleziona","manuallyCorrected":"Corretta manualmente","detachPlate":"Scollega targa","detach":"Scollega","assignPlateToVehicle":"Assegna la targa a un veicolo","assignToVehicle":"Assegna a un veicolo","deletePlate":"Elimina targa","ofPlates":"{{value1}} di {{value2}} targhe","nothingMatchesTheFilter":"Nessun risultato per il filtro","noPlatesRecognizedYet":"Nessuna targa ancora riconosciuta","widenTheDateRangeOr":"Amplia l'intervallo di date o cancella il filtro telecamera.","plateReadsAppearHereWhen":"Le letture delle targhe compaiono qui quando la pipeline di detection esegue l'OCR su un veicolo."},"retrainTabCallout":{"trainingFromThisFeed":"Addestramento da questo feed","markATrackWithThe":"Segna un track con il controllo a cappello da laurea sulla sua scheda. In Addestramento correggi i frame, costruisci collezioni e avvia fine-tuning nel cloud.","openTraining":"Apri Addestramento"},"semanticEventSearch":{"semanticSearchDescribeWhatYou":"Ricerca semantica — descrivi cosa stai cercando…","semanticEventSearch":"Ricerca semantica degli eventi","clearSearch":"Cancella ricerca","camera":"Telecamera","filterByCamera":"Filtra per telecamera","all":"Tutte","match":"Corrispondenza","searchFailed":"Ricerca fallita:","unknownError":"errore sconosciuto","noSemanticMatchesForTry":"Nessuna corrispondenza semantica per “{{debounced}}”. Prova una soglia di corrispondenza più bassa o una formulazione diversa."},"similarGroupsModal":{"faceFrom":"Volto da {{cameraName}}","noCrop":"Nessun ritaglio","includeFace":"Includi volto","excludeFace":"Escludi volto","include":"Includi","exclude":"Escludi","deleteFace":"Elimina volto","permanentlyDeletesThisFaceCrop":"Elimina definitivamente il ritaglio di questo volto. L'operazione non può essere annullata.","lookAlikeGroups":"Gruppi di volti simili","threshold":"Soglia","minSize":"Dimensione minima","reAnalyze":"Rianalizza","noLookAlikeGroupsAt":"Nessun gruppo di volti simili a questa soglia.","selectInGallery":"Seleziona nella galleria"},"stationarySection":{"parkedOn":"{{className}} parcheggiato su {{cameraName}}","stationary":"Fermi","parkedObjectsKeptOutOf":"Oggetti parcheggiati — tenuti fuori dal feed degli eventi"},"trackFlagToggles":{"couldNotUpdateThisTrack":"Impossibile aggiornare questo track","couldNotUpdateThisTrack2":"Impossibile aggiornare questo track. Controlla i log del server.","markForTraining":"Segna per l'addestramento","keepsThisTrackAndIts":"Conserva questo track e i suoi media oltre la retention","debug":"Debug","flagThisTrackForDiagnostic":"Segnala questo track per un'attenzione diagnostica","favourited":"Preferito"},"unassignedFaces":{"faceFrom":"Volto da {{cameraName}}","noCropImageTheFace":"Nessuna immagine del ritaglio — manca il media del ritaglio del volto (un orfano precedente alla correzione). Si può eliminare senza rischi.","noCrop":"Nessun ritaglio","deselect":"Deseleziona","select":"Seleziona","detachFace":"Scollega volto","detach":"Scollega","assignFaceToPerson":"Assegna il volto a una persona","assignToPerson":"Assegna a una persona","deleteFace":"Elimina volto","selectEveryVisibleFaceWhose":"Seleziona ogni volto visibile la cui immagine del ritaglio manca, per eliminare gli orfani in un solo passaggio","ofFaces":"{{value1}} di {{value2}} volti","nothingMatchesTheFilter":"Nessun risultato per il filtro","noFacesFoundForThis":"Nessun volto trovato per questo filtro","widenTheDateRangeOr":"Amplia l'intervallo di date o cancella il filtro telecamera.","faceCropsAppearHereWhen":"I ritagli dei volti compaiono qui quando la pipeline di detection li acquisisce."},"vehiclesList":{"loadingPlates":"Caricamento targhe…","noPlatesYet":"Ancora nessuna targa.","removePlateSample":"Rimuovi campione di targa","vehicle":"Veicolo","plates":"Targhe","edit":"Modifica {{name}}","delete":"Elimina {{name}}","name":"Nome","vehicleName":"Nome del veicolo…","plateSamples":"Campioni di targa","removeAPlateCropTo":"Rimuovi il ritaglio di una targa per escluderlo dal riconoscimento di questo veicolo. Assegna nuove targhe da Ultime targhe riconosciute.","deleteVehicle":"Elimina veicolo","deleteAndAllItsPlate":"Eliminare {{name}} e tutti i suoi campioni di targa? L'operazione non può essere annullata.","loadingVehicles":"Caricamento veicoli…","addVehicle":"Aggiungi veicolo","nothingMatchesTheFilter":"Nessun risultato per il filtro","noVehiclesEnrolledYet":"Nessun veicolo ancora registrato","clearTheSearchOrTry":"Cancella la ricerca o prova con un altro nome.","addAVehicleThenAssign":"Aggiungi un veicolo, poi assegna i ritagli delle targhe da Ultime targhe riconosciute.","noVehiclesEnrolledYet2":"Nessun veicolo ancora registrato."},"people":"Persone","enrolledIdentitiesUsedForFace":"Identità registrate usate per il riconoscimento facciale. Apri una persona per rinominarla o rimuovere i campioni di addestramento.","recentDetectedFaces":"Volti rilevati di recente","faceCropsCapturedByThe":"Ritagli di volti acquisiti dalla pipeline di detection. Assegnali a una persona per costruire i dati di addestramento del riconoscimento."}`),recordings:JSON.parse(`{"activitySection":{"when":"Quando","domain":"Dominio","operation":"Operazione","reason":"Motivo","camera":"Telecamera","items":"Elementi","reclaimed":"Recuperato","loadingActivity":"Caricamento attività…","activityCouldNotBeRead":"Impossibile leggere l'attività","theOpsLogDidNot":"Il log delle operazioni di {{value1}} non ha risposto. Questo non significa \\"non è successo nulla\\" — riprova, oppure controlla il nodo che ne è responsabile.","noActivityYet":"Ancora nessuna attività","pruneDeleteAndRescanOperations":"Le operazioni di pulizia, eliminazione e nuova scansione su registrazioni ed eventi compaiono qui.","thatDomain":"quel dominio","thoseDomains":"quei domini"},"cameraRecordingSettingsSection":{"noCameras":"Nessuna telecamera","addACameraFirst":"Aggiungi prima una telecamera.","perCameraRecordingRetention":"Registrazione e retention per telecamera","recordingModeScheduleBandsAnd":"Modalità di registrazione, fasce orarie e policy di retention per una telecamera — gli stessi controlli della scheda Registrazione della telecamera. La retention è un'unica policy su filmati e analisi; l'eliminazione degli eventi per telecamera è nella scheda Eventi.","camera":"Telecamera"},"cleanupSection":{"couldNotCheckWhetherStorage":"Impossibile verificare se la pulizia dello storage è installata su questo hub.","runStorageCleanup":"Eseguire la pulizia dello storage?","reclaimsLeftoverAnalyticsRowsAnd":"Recupera righe e file di analisi residui, still/filmstrip di debug e righe di filmati fantasma sulle posizioni congelate. Si può rieseguire senza rischi.","reclaimsLeftoverAnalyticsRowsAnd2":"Recupera righe e file di analisi residui e righe di filmati fantasma sulle posizioni congelate. Gli still di debug non vengono toccati. Si può rieseguire senza rischi.","runCleanup":"Esegui pulizia","cancelCleanup":"Annullare la pulizia?","stopsAfterTheCurrentStep":"Si ferma dopo lo step in corso. Il lavoro già fatto resta fatto.","cancelCleanup2":"Annulla pulizia","cleanup":"Pulizia","onePassOverLeftoverAnalytics":"Un passaggio su analisi residue (database + file) e righe di filmati fantasma sulle posizioni congelate. Non va in timeout — l'avanzamento si aggiorna qui fino al termine.","alsoRemoveDebugMediaMotion":"Rimuovi anche i media di debug (still di movimento e filmstrip dei track)","phase":"Fase:"},"diskReconcileSection":{"reconcileStorageFromDisk":"Riconciliare lo storage con il disco?","makesTheDatabaseMatchThe":"Allinea il database al filesystem: indice delle registrazioni, track, eventi e media i cui file non esistono più. I track preferiti senza file vengono eliminati. Gli eventi di movimento/audio senza snapshot vengono eliminati. Le identità registrate restano. L'operazione non può essere annullata.","reconcile":"Riconcilia","diskReconcile":"Riconciliazione con il disco","deletesDatabaseRowsWhoseFiles":"Elimina le righe del database i cui file non esistono più. Le identità registrate restano.","lastRun":"Ultima esecuzione:","failed":", {{value1}} falliti ({{value2}})","reconcileFailed":"Riconciliazione fallita:"},"eventsManagementSection":{"permanentlyDeletesEveryEventMotion":"Elimina definitivamente ogni evento (movimento / oggetto / audio) più vecchio del limite su tutte le telecamere, insieme ai loro media. L'operazione non può essere annullata.","pruneEvents":"Elimina eventi","deleteAllEventsFor":"Eliminare tutti gli eventi di {{label}}?","deleteEvents":"Elimina eventi","camera":"Telecamera","events":"Eventi","media":"Media","deleteAllEventsForThis":"Elimina tutti gli eventi di questa telecamera","loadingEventStoreFootprint":"Caricamento occupazione dell'archivio eventi…","noEventData":"Nessun dato sugli eventi","pipelineAnalyticsHasNotReported":"Pipeline analytics non ha ancora riportato l'occupazione dell'archivio eventi.","totalEvents":"Eventi totali","eventMediaOnDisk":"Media degli eventi su disco","pruneEventsOlderThan":"Elimina gli eventi più vecchi di","pruneNow":"Elimina ora","noStoredEvents":"Nessun evento archiviato","noCameraHasPersistedEvents":"Nessuna telecamera ha ancora eventi salvati."},"eventsSection":{"eventStore":"Archivio eventi","whatTheDurableEventStore":"Quanto occupa l'archivio eventi persistente, per telecamera, con eliminazione per età e cancellazione di tutti gli eventi su tutta la flotta.","postProcessingNodeFolders":"Nodo di post-elaborazione e cartelle","theSingleNodeThatWrites":"L'unico nodo che scrive i ritagli degli eventi, e la posizione di archiviazione in cui finiscono."},"exportsSection":{"cancelThisExport":"Annullare questa esportazione?","stopsTheRenderThePartial":"Interrompe il rendering. Il file parziale viene scartato.","cancelExport":"Annulla esportazione","deleteThisExport":"Eliminare questa esportazione?","permanentlyRemovesTheRenderedFile":"Rimuove definitivamente il file renderizzato e la sua riga nello storico.","camera":"Telecamera","range":"Intervallo","variant":"Variante","state":"Stato","expires":"Scade","size":"Dimensione","downloadMp4":"Scarica MP4","download":"Scarica","cancelRender":"Annulla rendering","deleteExport":"Elimina esportazione","loadingExports":"Caricamento esportazioni…","newExport":"Nuova esportazione","noExportsYet":"Ancora nessuna esportazione","createOneHereNewExport":"Creane una qui (Nuova esportazione) o dalla timeline di una telecamera nel viewer. Le clip renderizzate compaiono qui per essere scaricate o gestite."},"maintenanceAuditSection":{"reclaimOrphanedAnalyticsRows":"Recuperare le righe di analisi orfane?","deletesIndexRowsAndTheir":"Elimina le righe dell'indice (e i loro blob) il cui track, evento o gruppo di appartenenza non esiste più. I media della galleria registrata vengono saltati.","reclaimOrphans":"Recupera orfani","reclaimDebugMedia":"Recuperare i media di debug?","deletesMotionVisitStillsAnd":"Elimina gli still delle visite di movimento e le filmstrip dei track. Key frame e galleria registrata restano. Procede a 2 MB/s — puoi lasciare questa pagina.","reclaimDebugMedia2":"Recupera media di debug","forgetGhostRowsOn":"Dimenticare le righe fantasma su {{locationId}}?","dropsDurableHourRowsWhose":"Elimina le righe orarie persistenti i cui file non sono su disco. I file che il registro non nomina vengono segnalati, mai eliminati.","forgetGhosts":"Dimentica fantasmi","countLeftovers":"Conta residui","orphanAnalyticsRowsDebugStills":"Righe di analisi orfane, still/filmstrip di debug e ore fantasma su una cartella di registrazioni congelata. Solo conteggi — Recupera o Dimentica elimina dopo la tua conferma.","auditing":"Verifica in corso…","runAudit":"Esegui verifica","orphansAlreadyRunningRequestIgnored":"Orfani: già in esecuzione — richiesta ignorata.","debugMediaAlreadyRunningShowing":"Media di debug: già in esecuzione — mostro l'ultimo passaggio.","forgot":", dimenticati {{value1}}","orphanFilesLeftOnDisk":", {{value1}} file orfani lasciati su disco","noFrozenLocationSkipped":"Nessuna posizione congelata — saltato."},"newExportModal":{"newExport":"Nuova esportazione","camera":"Telecamera","profile":"Profilo","from":"Da","to":"A","speed":"Velocità","titleOptional":"Titolo (facoltativo)","eGCourierAtThe":"es. corriere al cancello","fromMustBeBeforeTo":"\\"Da\\" deve precedere \\"A\\".","queuing":"Messa in coda…","createExport":"Crea esportazione"},"recordingsManagementSection":{"moveStorage":"Sposta storage","copyRecordingsLowResRecordings":"Copia registrazioni, registrazioni a bassa risoluzione o media degli eventi in una nuova posizione, verifica, poi riassegna il predefinito. Vale per ogni telecamera."},"recordingsStorageSection":{"footageOnDisk":"Filmati su disco","whatRecordedFootageOccupiesPer":"Quanto occupano i filmati registrati, per telecamera e per volume, con pulizia secondo policy ed eliminazione di tutti i filmati.","recordingNodeFolders":"Nodo di registrazione e cartelle","theSingleNodeThatRecords":"L'unico nodo che registra e serve la riproduzione, e le posizioni di archiviazione su cui vengono scritti i filmati."},"storageSection":{"prune":"Pulire {{label}}?","appliesTheRetentionPolicyNow":"Applica subito la policy di retention (motivo: {{reason}}). I filmati oltre la policy vengono eliminati definitivamente.","pruneNow":"Pulisci ora","deleteAllFootageFor":"Eliminare tutti i filmati di {{label}}?","permanentlyDeletesOfRecordedFootage":"Elimina definitivamente {{value1}} di filmati registrati di questa telecamera. L'operazione non può essere annullata.","delete":"Elimina {{value1}}","camera":"Telecamera","disk":"Disco","theOnlyRecordingsVolumeOn":"L'unico volume di registrazioni su questo nodo — questa telecamera può stare solo qui.","theRecordingsDefaultThisNode":"Il PREDEFINITO delle registrazioni. Questo nodo ha più volumi di registrazioni e il posizionamento per telecamera non è riportato da recording.getStorageUsage, quindi questo è dove i filmati finiscono per impostazione predefinita, non un dato per telecamera.","default":"(predefinito)","used":"Usato","oldestFootage":"Filmato più vecchio","theOldestSegmentTheArchive":"Il segmento più vecchio che l'ARCHIVIO conserva per questa telecamera — la risposta per telecamera a 'la retention sta davvero tenendo?'.","applyRetentionPolicyNow":"Applica subito la policy di retention","prune2":"Pulisci","deleteAllFootage":"Elimina tutti i filmati","loadingStorageUsage":"Caricamento utilizzo dello storage…","noStorageData":"Nessun dato sullo storage","theRecordingNodeHasNot":"Il nodo di registrazione non ha ancora riportato alcun utilizzo dello storage.","totalUsed":"Totale usato","freeOnRecordingsVolumes":"Libero sui volumi delle registrazioni","disk2":"Disco: {{label}}","volumeFillEverythingOnThe":"Riempimento del volume — tutto ciò che c'è sul disco, non solo le registrazioni. Avviso all'85%, critico al 95%.","pruneReason":"Motivo della pulizia","perCameraUsageUnavailable":"Utilizzo per telecamera non disponibile","noRecordedFootage":"Nessun filmato registrato","thisRecordingNodeHasNo":"Questo nodo di registrazione non ha un registro dei filmati, quindi ha rifiutato di rispondere alla tabella per telecamera invece di riportare ciò che ha in memoria. I totali del disco qui sopra non sono toccati.","noCameraHasRecordedFootage":"Nessuna telecamera ha ancora registrato filmati su questo nodo."},"recordedFootageAndTheDurable":"Filmati registrati e archivio eventi durevole — cosa occupa ciascuno, dove viene scritto e le operazioni che spostano o riconciliano entrambi.","recordings":"Registrazioni","events":"Eventi","cameras":"Telecamere","export":"Esporta","activity":"Attività","management":"Gestione"}`),migration:{storageMigrationSection:{checkingWhetherStorageMigrationIs:`Verifica che la migrazione dello storage sia installata…`,couldnTCheckWhetherStorage:`Impossibile verificare se la migrazione dello storage è installata`,theCapabilityRegistryDidNot:`Il registro delle capability non ha risposto, quindi questo pannello non ha nulla da riportare in nessun senso — non significa che la capability manchi. Ricarica per chiedere di nuovo.`,storageMigrationNotInstalled:`Migrazione dello storage non installata`,theCapabilityRegistryAnsweredNo:`Il registro delle capability ha risposto: nessun addon di questo cluster fornisce storage-migration. Quando ne verrà distribuito uno, questo pannello sposterà registrazioni, registrazioni a bassa risoluzione e media degli eventi su nuove posizioni di archiviazione in un'unica operazione coordinata e verificata.`,startStorageMigration:`Avviare la migrazione dello storage?`,copiesTheSelectedClassesFrom:`Copia le classi selezionate dalla sorgente scelta alla destinazione, verifica, poi rende la destinazione il predefinito (se lo era la sorgente) oppure disabilita la sorgente. Si può rieseguire senza rischi se interrotta.`,startMigration:`Avvia migrazione`,cancelMigration:`Annullare la migrazione?`,stopsTheInProgressMigration:`Interrompe la migrazione in corso. I dati già spostati e verificati restano nella destinazione; ciò che è già stato riassegnato non viene ripristinato.`,cancelMigration2:`Annulla migrazione`,storageMigration:`Migrazione dello storage`,moveRecordingsLowResRecordings:`Sposta registrazioni, registrazioni a bassa risoluzione e/o media degli eventi da una posizione a un'altra: copia tramite i mover del recorder / pipeline-analytics, verifica, poi riassegna il predefinito (se la sorgente lo era) oppure disabilita la sorgente (se non lo era). Salta una classe lasciando vuota la destinazione.`,skip:`— salta —`,plan:`Piano`,nothingToMoveSelectedDestinations:`Nulla da spostare — le destinazioni selezionate coincidono con i predefiniti attuali.`,migrationStatus:`Stato della migrazione`,phase:`Fase:`,paused:`In pausa:`,migrationHistory:`Storico migrazioni`,drainRemaining:`Svuotare il {{storageClass}} rimanente?`,drainRemaining2:`Svuota il rimanente`,leftOnTheOldLocation:`Rimasto sulla vecchia posizione`,measured:`Misurato {{value1}}`,measuredNever:`Misurato — mai`,counting:`Conteggio…`,aMigrationRepointsFirstAnd:`Una migrazione riassegna prima e svuota dopo. Se lo svuotamento è stato annullato, è fallito o è stato interrotto da un riavvio, i dati qui sotto sono ancora sulla sorgente — leggibili, ma non dove puntano ora i predefiniti. Lo svuotamento li sposta; non cambia alcun predefinito e non mette nulla in pausa.`,thisCountIsTakenOn:`Questo conteggio viene eseguito su richiesta: misurarlo scorre l'intera collezione di media, quindi non si aggiorna a intervalli. Premi Aggiorna al termine di uno svuotamento.`,moversRunningOutsideAMigration:`Mover in esecuzione fuori da una migrazione`}},deviceDoAction:{deviceDoActionFields:{target:`Destinazione`,specificDevice:`Dispositivo specifico`,theDeviceThatTriggeredThis:`Il dispositivo che ha attivato questa esecuzione`,sameFamilyOnlyTheAction:`Solo della stessa famiglia — l'azione viene eseguita su ogni dispositivo selezionato.`,action:`Azione`,pickADeviceFirst:`Scegli prima un dispositivo`,loadingActions:`Caricamento azioni…`,noActionsForThisDevice:`Nessuna azione per questo dispositivo`,selectAnAction:`Scegli un'azione…`,couldNotReadThisDevice:`Impossibile leggere le capability di questo dispositivo.`}},device:{cameraFunctionSwitches:{cameraFunctions:`Funzioni della telecamera`,functions:`Funzioni`},deviceConfigPanel:{failedToLoadDeviceConfiguration:`Impossibile caricare la configurazione del dispositivo.`,noConfigurationAvailableForThis:`Nessuna configurazione disponibile per questo dispositivo.`,saving:`Salvataggio...`},deviceNotificationMute:{notifications:`Notifiche`,notificationMuteStateUnknownThe:`Silenziamento notifiche — stato sconosciuto; il centro notifiche non ha risposto.`,muted:`Silenziato. {{costWhenOff}}`,notifyingMutingIt:`Notifica attiva. Silenziandolo: {{costWhenOff}}`,unknown:`Sconosciuto`,muted2:`Silenziato`,notifying:`Notifica attiva`,writeFailed:`Scrittura fallita: {{failure}}`,theNotificationCentreDidNot:`Il centro notifiche non ha risposto, quindi lo stato di silenziamento di questo dispositivo è sconosciuto.`},intercomPanel:{mic:`Microfono:`,audioPath:`Percorso audio:`},panelContent:{reboot:`Riavviare "{{deviceName}}"?`,theDeviceWillGoOffline:`Il dispositivo resterà offline per circa 30 secondi mentre il firmware si riavvia.`,reboot2:`Riavvia`,restartAddon:`Riavviare l'addon "{{addonId}}"?`,everyDeviceServedByThis:`Ogni dispositivo servito da questo addon si disconnette per un attimo e si riconnette.`,restart:`Riavvia`,restartDevice:`Riavvia dispositivo`,rebootTheFirmware30sOffline:`Riavvia il firmware. ~30s offline.`,restartAddon2:`Riavvia addon`,perAgentRestartComingWith:`Riavvio per agente — in arrivo con il supervisore dei processi agente.`,restartAgent:`Riavvia agente`,disabledAgentProcessSupervisorNot:`Disabilitato — il supervisore dei processi agente non è ancora collegato.`},resyncButton:{reSync:`Risincronizza`,reAlignThisDeviceS:`Riallinea tipo, ruolo, capability e unità di questo dispositivo alla sua sorgente.`,reSyncing:`Risincronizzazione…`},bindingsTab:{failedToLoadBindings:`Impossibile caricare i binding:`,noCapabilityProvidersApplicableTo:`Ancora nessun provider di capability applicabile a questo dispositivo.`,nativeProvidersShowUpHere:`I provider nativi compaiono qui non appena l'addon che li gestisce li registra.`,capability:`Capability`,kind:`Tipo`,activeProvider:`Provider attivo`,node:`Nodo`,native:`Nativo`,wrapper:`Wrapper`,noneAvailable:`nessuno disponibile`,clickToDeactivateRevertTo:`Clicca per disattivare (torna al nativo)`,activateWrapper:`Attiva il wrapper {{wrapperId}}`},cameraStepInspector:{loadingPipeline:`Caricamento pipeline…`,noPipelineNodeIsOnline:`Nessun nodo pipeline è online.`,catalogUnavailable:`Catalogo non disponibile.`,detectionStepsOfThisCamera:`Step di detection di questa telecamera`,noStepSelected:`Nessuno step selezionato.`,appliesTo:`Si applica a`,settingsApplyTo:`Le impostazioni si applicano a`,thisAccelerator:`Questo acceleratore`,allAcceleratorsOfThisCamera:`Tutti gli acceleratori di questa telecamera`,appliesToAllAcceleratorsOf:`Si applica a: tutti gli acceleratori di questa telecamera.`,thisCamera:`{{name}} · questa telecamera`,everyAcceleratorThisCameraRuns:`{{slot}} · ogni acceleratore su cui gira questa telecamera`,model:`Modello`,settings:`Impostazioni`,applyToAllAccelerators:`Applica a tutti gli acceleratori`},detectionPipelineTab:{steps:`Step`,settings:`Impostazioni`},detectionSourceControl:{rootDetector:`Detector radice`,thisNode:`Questo nodo`,cameraOnboardAi:`AI integrata nella telecamera`,none:`Nessuno`,saving:`Salvataggio…`},deviceAggregateSection:{loadingDeviceAggregate:`Caricamento aggregato del dispositivo…`,noAggregateContributionsForThis:`Nessun contributo aggregato per questo dispositivo.`},deviceLiveInfoSection:{loadingLiveInfo:`Caricamento info live…`,liveInfo:`Info live`},eventsTab:{eventTimeline:`Timeline eventi`,"0Events":`0 eventi`,noEvents:`Nessun evento`,deviceEventsWillAppearHere:`Gli eventi del dispositivo compariranno qui man mano che si verificano`},overviewTab:{streamNetwork:`Rete dello stream`,nominal:`Nominale`,observed:`Osservato`,peak:`Picco`,packetLoss:`Perdita di pacchetti`},tracksTab:{backendPending:`Backend in sospeso`,zones:`Zone:`,time:`Ora`,bindings:`Binding`,analytics:`Analisi`,activeTracks:`Track attivi`,pipelineanalyticsGetactivetracks:`pipelineAnalytics.getActiveTracks`,noActiveTracks:`Nessun track attivo`,tracksAppearWhenObjectsAre:`I track compaiono quando degli oggetti si stanno muovendo`,historicalTracks:`Track storici`,pipelineanalyticsListtracks:`pipelineAnalytics.listTracks`,noCompletedTracksYet:`Ancora nessun track completato`,tracksAreArchivedWhenTheir:`I track vengono archiviati alla scadenza del loro TTL`}},hero:{buttonHero:{justPressed:`Appena premuto`,idle:`Inattivo`,lastPress:`Ultima pressione {{value1}}`,unknown:`Sconosciuto`,awaitingState:`In attesa dello stato…`},eventEmitterHero:{noPressRecorded:`Nessuna pressione registrata`,button:`Pulsante {{value1}}`,awaitingState:`In attesa dello stato…`,waitingForTheFirstEvent:`In attesa del primo evento`},genericHero:{noLiveViewForThis:`Nessuna vista live per questo tipo di dispositivo. Usa la scheda Config o la riga di scorciatoie per interagire.`},hubHero:{discovered:`Rilevati`,adopted:`Adottati`,available:`Disponibili`,discover:`Rileva`,online:`{{online}} online`,sleeping:`{{sleeping}} in standby`,offline:`{{offline}} offline`,unknown:`{{unknown}} sconosciuti`},lightHero:{awaitingState:`In attesa dello stato…`,turnOff:`Spegni {{deviceName}}`,turnOn:`Accendi {{deviceName}}`,brightness:`Luminosità`,brightnessUnavailable:`Luminosità non disponibile`,on:`Acceso`,off:`Spento`,unknown:`Sconosciuto`,changed:`Cambiato {{value1}}`},motionTriggerToggle:{awaitingState:`In attesa dello stato…`,disableTriggerOnMotion:`Disabilita il trigger su movimento`,enableTriggerOnMotion:`Abilita il trigger su movimento`},sensorHero:{motionDetected:`Movimento rilevato`,idle:`Inattivo`,triggered:`Attivato`,unknown:`Sconosciuto`,lastTrip:`Ultima attivazione {{value1}}`,awaitingState:`In attesa dello stato…`},switchHero:{awaitingState:`In attesa dello stato…`,turnOff:`Spegni {{deviceName}}`,turnOn:`Accendi {{deviceName}}`,on:`Acceso`,off:`Spento`,unknown:`Sconosciuto`,changed:`Cambiato {{value1}}`}},overviewAdapters:{deviceInfoAdapter:{deviceInfo:`Info dispositivo`,identity:`Identità`,hardware:`Hardware`,type:`Tipo`,provider:`Provider`,capabilities:`Capability`,none:`Nessuna`,autoPopulatedByTheDriver:`Compilato automaticamente dal driver a ogni connessione. Sola lettura.`}},shared:{primaryChildRow:{primaryChild:`Figlio principale`},addressSelector:{noAddressesAvailable:`Nessun indirizzo disponibile.`,autoPreferred:`Preferito automaticamente`,alwaysIncluded:`Sempre incluso`,unlikelyUsable:`Probabilmente inutilizzabile`},replTerminal:{thinking:`…elaborazione`,text:`>`},webRtcPlayer:{connecting:`Connessione…`,connectionFailed:`Connessione fallita`,streamDisconnected:`Stream disconnesso`,reconnect:`Riconnetti`,unmute:`Attiva audio`,mute:`Disattiva audio`},locationRow:{roomAreaOrLeaveEmpty:`Stanza / area (o lascia vuoto per cancellare)`,create:`Crea`}},formBuilder:{formBuilder:{searchOrAdd:`Cerca o aggiungi…`,searchToAdd:`Cerca per aggiungere…`},formSaveBar:{saving:`Salvataggio…`},modelSelector:{models:`Modelli ({{length}})`,customPath:`Percorso personalizzato`,noPredefinedModelsAvailableUse:`Nessun modello predefinito disponibile. Usa la scheda Percorso personalizzato per indicare il percorso o l'URL di un file di modello.`,enterPathLikeDataModels:`Inserisci un percorso come /data/models/custom.onnx o https://...`,acceptedFormats:`Formati accettati:`,howToConvertYourModel:`Come convertire il tuo modello`},searchableMultiSelectField:{searchToAdd:`Cerca per aggiungere…`}},backup:{archiveList:{deleteThisArchive:`Eliminare questo archivio?`,permanentlyDeletesAndFrees:`Elimina definitivamente "{{value1}}" e libera {{value2}}.`,loadingArchives:`Caricamento archivi…`,failedToReadManifestFor:`Impossibile leggere il manifest per questa destinazione`,noArchivesAtThisDestination:`Ancora nessun archivio in questa destinazione.`,when:`Quando`,label:`Etichetta`,encryptedRestoreNeedsBackupKey:`cifrato — il ripristino richiede la chiave di backup {{keyId}}`,databases:`Database`,files:`File`,size:`Dimensione`,downloadArchive:`Scarica archivio`,download:`Scarica`,restoreFromThisArchive:`Ripristina da questo archivio`,restore:`Ripristina`,delete:`Elimina {{value1}}`},backupDatabaseBadges:{snapshotsOnly:`Solo snapshot`},backupDatabasePicker:{whatToBackUp:`Cosa salvare nel backup`,notCreatedYet:`Non ancora creato`},backupEncryptionCard:{thisKeyIsShownOnly:`Questa chiave viene mostrata una sola volta. CamStack non la conserva — né l'hub, né il suo database, né i suoi backup. Senza di essa un backup cifrato non può essere ripristinato da nessuno, te compreso. Salvala in un password manager o stampala, lontano da questo server.`,copied:`Copiato`,downloadAsFile:`Scarica come file`,iHaveStoredThisKey:`Ho conservato questa chiave in un posto sicuro, fuori da questo server.`,iHaveStoredIt:`L'ho conservata`,replaceTheBackupKey:`Sostituisci la chiave di backup`,encryptBackups:`Cifra i backup`,aNewKeyIsGenerated:`Viene generata una nuova chiave e mostrata una volta sola; i nuovi backup sono cifrati con essa. I backup precedenti richiedono ancora la chiave con cui sono stati creati — conserva anche quella.`,aBackupKeyIsGenerated:`Viene generata una chiave di backup e mostrata una volta sola. Ogni nuovo backup è cifrato con essa, e per ripristinarne uno verrà richiesta. I backup esistenti restano come sono.`,generateANewKey:`Genera una nuova chiave`,generateTheKey:`Genera la chiave`,turnBackupEncryptionOff:`Disattiva la cifratura dei backup`,newBackupsWillBeWritten:`I nuovi backup verranno scritti non cifrati. I backup cifrati esistenti richiedono comunque la loro chiave per essere ripristinati.`,turnOff:`Disattiva`,encryption:`Cifratura`,onKeySince:`Attiva — chiave {{keyId}}, dal {{value2}}`,offBackupsAreNotEncrypted:`Disattivata — i backup non sono cifrati`,replaceKey:`Sostituisci chiave`,enableEncryption:`Attiva la cifratura`,archivesAreEncryptedOnThis:`Gli archivi vengono cifrati su questo server prima di raggiungere qualsiasi destinazione. Il server conserva solo una chiave pubblica, quindi può cifrare i backup pianificati ma non decifrarli — solo la tua chiave di backup può farlo. Copre lo snapshot del database, config.yaml, i dati degli addon (abbinamento HomeKit, fabric Matter, stato Tailscale) e TLS.`,olderKeysBackupsMadeWith:`Chiavi precedenti (i backup creati con esse le richiedono ancora):`},backupEntriesTable:{loadingBackupEntries:`Caricamento voci di backup…`,failedToLoadBackupEntries:`Impossibile caricare le voci di backup`,unknownError:`Errore sconosciuto`,noBackupEntriesYet:`Ancora nessuna voce di backup`,createOneToScheduleBackups:`Creane una per pianificare backup su una o più posizioni di archiviazione.`,hideArchives:`Nascondi archivi`,showArchives:`Mostra archivi`,entry:`Voce`,unnamed:`(senza nome)`,enabled:`Abilitata`,backsUp:`Salva`,locations:`Posizioni`,retention:`Retention`,schedule:`Pianificazione`,noLocations:`Nessuna posizione`,manual:`Manuale`,enable:`Abilita {{value1}}`,retentionFor:`Retention per {{value1}}`,deleteBackupEntry:`Eliminare la voce di backup?`,willStopRunningExistingArchives:`"{{value1}}" smetterà di essere eseguita. Gli archivi esistenti vengono conservati.`,runThisEntryNow:`Esegui questa voce ora`,runNow:`Esegui ora`,edit:`Modifica {{value1}}`,delete:`Elimina {{value1}}`,thisEntryHasNoLocations:`Questa voce non ha posizioni selezionate.`},backupEntryModal:{editBackupEntry:`Modifica voce di backup`,newBackupEntry:`Nuova voce di backup`,createEntry:`Crea voce`,name:`Nome`,nightlyOffsite:`Notturno offsite`,locationsSelected:`Posizioni ({{value1}} selezionate)`,loadingLocations:`Caricamento posizioni…`,noBackupsStorageLocationsConfigured:"Nessuna posizione di archiviazione `backups` configurata. Aggiungine una prima in Impostazioni → Storage.",retentionArchivesKept:`Retention (archivi conservati)`,enabled:`Abilitata`,runOnScheduleWhenChecked:`Se selezionato, viene eseguita secondo la pianificazione.`,runOnSchedule:`Esegui secondo pianificazione`,schedule:`Pianificazione`},backupNowDialog:{backUpNow:`Esegui backup ora`,runsOnceAndWritesThe:`Viene eseguito una volta e scrive l'archivio in ogni posizione di backup abilitata.`},backupRunsPanel:{cancelQueuedBackupRun:`Annullare l'esecuzione di backup in coda?`,thisRunHasNotStarted:`Questa esecuzione non è ancora iniziata. Annullandola la rimuovi dalla coda — nulla è stato scritto, nulla viene eliminato.`,cancelRun:`Annulla esecuzione`,stopThisBackupRun:`Fermare questa esecuzione di backup?`,theHalfWrittenStagingArchive:`L'archivio di staging scritto a metà viene eliminato e la destinazione in caricamento scarta la sua copia parziale. {{keptSentence}}`,stopRun:`Ferma esecuzione`,runs:`Esecuzioni`,aBackupRunIsIn:`Un'esecuzione di backup è in corso`,oneRunExecutesAtA:`Viene eseguita una sola esecuzione alla volta — le altre attendono in coda.`,checkingForBackupRuns:`Ricerca delle esecuzioni di backup…`,couldNotReadBackupRuns:`Impossibile leggere le esecuzioni di backup — l'orchestrator non ha risposto.`,noBackupRunsYetRuns:`Ancora nessuna esecuzione di backup. Le esecuzioni compaiono qui nel momento in cui ne parte una — manuale o pianificata.`,run:`Esecuzione`,state:`Stato`,progress:`Avanzamento`,destinations:`Destinazioni`,timing:`Tempi`,actions:`Azioni`,removeThisRunFromThe:`Rimuovi questa esecuzione dalla coda prima che parta`,stopThisRunTheHalf:`Ferma questa esecuzione — l'archivio scritto a metà viene scartato`,stop:`Ferma`,queued:`In coda`,uploading:`Caricamento`,buildingArchive:`Creazione archivio`,succeeded:`Riuscita`,failed:`Fallita`,stoppedBeforeCompletingEveryDestination:`Fermata prima di completare ogni destinazione — non è un successo`,stopped:`Fermata`,inLine:`in coda`,waitingItsTurn:`in attesa del proprio turno`,stagedSoFar:`preparati finora`,toCurrentDestination:`verso la destinazione corrente`,notResolvedYet:`non ancora risolto`,keptTheirArchive:`Hanno conservato il loro archivio: {{value1}}`,failed2:`Fallite: {{value1}}`},cronEditor:{schedulePreset:`Preset di pianificazione`,custom:`Personalizzata…`,cronExpression5FieldPosix:`Espressione cron (POSIX a 5 campi)`,format:`Formato:`,validating:`Validazione…`,invalidCronExpression:`Espressione cron non valida`,noFutureRunsMatchThis:`Nessuna esecuzione futura corrisponde a questa espressione.`,nextRuns:`Prossime esecuzioni`},restoreWizard:{restoreBackup:`Ripristina backup`,pickSource:`scegli sorgente`,pickLocations:`scegli posizioni`,scheduleRestore:`Pianifica ripristino`,destination:`Destinazione`,selectDestination:`Scegli la destinazione…`,archive:`Archivio`,pickADestinationFirst:`Scegli prima una destinazione.`,readingArchives:`Lettura archivi…`,noArchivesAvailableAtThis:`Nessun archivio disponibile in questa destinazione.`,encryptedKey:`cifrato (chiave {{keyId}})`,databasesInThisArchive:`Database in questo archivio`,snapshotsOnlyRestoringThisArchive:`Solo snapshot: il ripristino di questo archivio sostituisce soltanto questi database. NON tocca configurazione, addon, dati degli addon o certificati.`,loadingArchiveManifestIfThis:`Caricamento del manifest dell'archivio… Se persiste, l'archivio potrebbe essere precedente ai manifest — il ripristino applicherà tutto il contenuto del tarball.`,selectedEntriesWillOverwriteLive:`Le voci selezionate sovrascriveranno i dati live al prossimo riavvio del server. Le voci deselezionate restano aggiornate.`,restoreIsAppliedAtNext:`Il ripristino viene applicato al prossimo avvio del server. Le connessioni attive cadranno al riavvio.`,backupKey:`Chiave di backup`,camstackBackupSecretV1:`camstack-backup-secret-v1:…`}},graph:{clusterGraphView:{filterByNodeRunnerCap:`Filtra per nodo / runner / cap…`,expandAll:`Espandi tutto`,collapseAll:`Comprimi tutto`,restoreTheAutomaticLayoutDiscarding:`Ripristina il layout automatico, scartando le posizioni trascinate`,resetLayout:`Reimposta layout`},nodeBox:{lastSeen:`visto l'ultima volta {{relativeLastSeen}}`,openNodeDetail:`Apri dettaglio nodo`,noProcesses:`Nessun processo`},runnerBlock:{restartAddon:`Riavvia addon`,logs:`Log`}},load:{loadChart:{andOverTime:`{{title}}: {{mainLabel}} e {{gcLabel}} nel tempo`,noSamplesInThisInterval:`Nessun campione in questo intervallo — nulla è stato misurato, nulla viene disegnato.`}},pairing:{agentStateBadge:{notConnected:`non connesso`},agentsFoundSection:{unpairFailed:`Disaccoppiamento fallito: {{message}}`,unpair:`Disaccoppia {{nodeId}}`,sCertificatesAreRevokedAt:`I certificati di {{nodeId}} vengono revocati subito e il nodo viene disconnesso dalla mesh. Dovrà essere accoppiato di nuovo prima di potersi riunire.`,unpair2:`Disaccoppia`,node:`Nodo`,address:`Indirizzo`,version:`Versione`,state:`Stato`,certificate:`Certificato`,pair:`Accoppia`,agentsFoundOnTheNetwork:`Agenti trovati sulla rete`,scan:`Scansiona`,addByAddress:`Aggiungi per indirizzo`,anAgentHoldsNoSecret:`Un agente non conserva alcun segreto: l'accoppiamento gli rilascia un certificato dopo che hai confermato le stesse sei cifre su questa pagina e sull'agente. Il rilevamento richiede che l'agente abbia un proprio IP o la rete host; un bridge Docker lo nasconde — aggiungilo per indirizzo.`,addAgentByAddress:`Aggiungi agente per indirizzo`,aPrivateOrLocalAddress:`Solo un indirizzo privato o locale.`,agentAddress:`Indirizzo agente`,port:`Porta`,optional:`Facoltativo.`,agentPort:`Porta agente`,couldNotListAgents:`Impossibile elencare gli agenti`,requestFailed:`Richiesta fallita`,lookingForAgents:`Ricerca agenti…`,noAgentsFound:`Nessun agente trovato`,nothingIsAdvertisingOnThis:`Nessuno si sta annunciando su questa rete. Avvia l'agente con un proprio IP (o rete host), oppure aggiungilo per indirizzo.`},pairingDialog:{eachScreenShowsACode:`Ogni schermata mostra un codice; digiti il codice dell'ALTRA schermata. Agente a {{value1}}`,couldNotStartThePairing:`Impossibile avviare l'accoppiamento`,reject:`Rifiuta`,codeOnThisHub:`Codice su questo hub`,codeOnThisHubRead:`Codice su questo hub — leggilo all'agente`,onTheAgentEnterThis:`Sull'agente, inserisci questo codice e il PIN locale dell'agente (mostrato sulla console o nel log dell'agente, oppure sul suo schermo).`,codeShownOnTheAgent:`Codice mostrato sull'agente`,typeTheSixDigitsThe:`Digita le sei cifre mostrate dall'agente. Non copiare il codice qui sopra.`,youConfirmedHereTheAgent:`Hai confermato qui. L'agente deve ancora inserire il codice dell'hub e il suo PIN.`,working:`Elaborazione…`,hubConfirmed:`Hub: confermato`,hubNotConfirmed:`Hub: non confermato`,agentConfirmed:`Agente: confermato`,agentNotConfirmed:`Agente: non confermato`,joinedAndRegisteredItsCapabilities:`{{nodeId}} si è unito e ha registrato le proprie capability.`,holdsItsCertificateWaitingFor:`{{nodeId}} ha il suo certificato. In attesa che si connetta e registri le proprie capability…`,openNode:`Apri nodo`}},cluster:{forksTab:{setLogLevel:`Imposta livello di log`,restartProcess:`Riavvia processo`,showLogsFor:`Mostra i log di {{addonId}}`,showEventsFor:`Mostra gli eventi di {{addonId}}`,restart:`Riavvia {{addonId}}`,noServices:`Nessun servizio`,noProcessesOnThisNode:`Nessun processo su questo nodo`},nodeDetailCapabilitiesTab:{noCapabilitiesOnThisNode:`Nessuna capability su questo nodo`,capability:`Capability`,boundProvider:`Provider associato`,onlyOneProviderInstalledChoice:`È installato un solo provider — la scelta sarà disponibile quando un secondo addon registrerà questa capability`},nodeDetailSettingsTab:{noAddonsOnThisNode:`Nessun addon su questo nodo`},nodeInfoTab:{rename:`Rinomina`,hub:`Hub`,agent:`Agente`,gb:`{{value1}} GB`},processesTab:{class:`Classe`,addon:`Addon`,command:`Comando`,cpu:`CPU%`,uptime:`Uptime`,scanning:`Scansione…`},nodeCard:{unpair:`Dissocia {{name}}`,unpairItDisconnectsAndMust:`Dissociare {{name}}? Viene disconnesso e va associato di nuovo.`,unpair2:`Dissocia`,unpairThisNodeRevokesIts:`Dissocia questo nodo: ne revoca i certificati; va associato di nuovo per riunirsi`,unpairing:`Dissociazione…`,gb:`{{value1}} GB`,forgetThisNodeRemovesIts:`Dimentica questo nodo: ne rimuove lo storico salvato e le assegnazioni della pipeline`,forgetting:`Rimozione…`,forgetNode:`Dimentica nodo`,openThisAgentSStatus:`Apri il pannello di stato di questo agent (si sblocca con un ticket dell'hub di breve durata)`,opening:`Apertura…`,openDashboard:`Apri il pannello`,general:`Generale`,forks:`Fork ({{length}})`,processes:`Processi`,load:`Carico`,settings:`Impostazioni`,capabilities:`Capability`}},access:{accessSection:{dismiss:`Ignora`},createTokenModal:{createAdminToken:`Crea token admin`,createToken:`Crea token`,issueToken:`Emetti token`,administrator:`Amministratore`,offScopedToASurface:`Disattivato = limitato a una superficie. Attivato = admin completo per script (verificato in audit, max 90 giorni).`,fullAdministrator:`amministratore completo`,onBehalfOfUser:`A nome dell'utente`,name:`Nome`,expiresInDays:`Scade tra (giorni)`,scopes:`Scope`,eachScopePicksACap:`Ogni scope sceglie un target (cap o addon) + uno o più tipi di accesso. Il token può accedere SOLO a ciò che è elencato.`,leaveBlankForNonExpiring:`Lascia vuoto per nessuna scadenza.`},credentialTable:{couldNotLoad:`Impossibile caricare {{label}}`,noMatchTheFilters:`Nessun elemento di {{label}} corrisponde ai filtri.`,clearSelection:`Deseleziona`},legacyApiKeysSection:{revoke:`Revocare "{{name}}"?`,anyClientUsingThisKey:`Qualsiasi client che usa questa chiave perde subito l'accesso. L'operazione non può essere annullata.`,revoke2:`Revoca`,legacyApiKeys:`Chiavi API legacy`,keysFromBeforeScopedTokens:`Chiavi precedenti ai token con scope. Nulla le crea più; revocale ed emetti invece un token con scope.`,legacyApiKeys2:`chiavi API legacy`},linkedAppsSection:{revokeTheLink:`Revocare il collegamento "{{name}}"?`,losesAccessForOnIts:`{{name}} perde l'accesso per {{ownerName}} alla prossima chiamata. Per collegarla di nuovo serve ripartire dal flusso di collegamento dell'account.`,revoke:`Revoca`,linkedApps:`App collegate`,externalIntegrationsAlexaLinkedTo:`Integrazioni esterne (Alexa, …) collegate a questo hub tramite OAuth. Revocarne una ferma quell'integrazione alla prossima chiamata. Le righe già revocate possono essere selezionate e rimosse dall'elenco.`,linkedApps2:`app collegate`,selectRevoked:`Seleziona revocati`},loginSessionsSection:{signOutThisSession:`Disconnetti questa sessione`,onWillHaveToSign:`{{ownerName}} su {{name}} dovrà accedere di nuovo.`,signOut:`Disconnetti`,loginSessions:`Sessioni di accesso`,everyBrowserAndAppSigned:`Tutti i browser e le app connessi a questo hub, per ogni utente. Disconnetterne uno lo termina subito; dovrà accedere di nuovo. La tua sessione corrente è contrassegnata e non è mai inclusa in una disconnessione multipla.`},scopedTokensSection:{revoke:`Revocare "{{name}}"?`,sScopedTokenStopsWorking:`Il token con scope di {{ownerName}} smette di funzionare al prossimo utilizzo. L'operazione non può essere annullata.`,revoke2:`Revoca`,scopedTokens:`Token con scope`,tokensIssuedOnBehalfOf:`Token emessi a nome di un utente per una superficie ristretta — un addon, un'integrazione, una capability o alcuni dispositivi. Ogni token deve avere uno scope, così revocarne uno ha un impatto prevedibile.`,createAUserFirst:`Crea prima un utente`,issueAScopedToken:`Emetti un token con scope`,newToken:`Nuovo token`,scopedTokens2:`token con scope`},tokensSection:{revoke:`Revocare "{{name}}"?`,everyScriptUsingItLoses:`Ogni script che lo usa perde subito l'accesso. L'operazione non può essere annullata.`,sScopedTokenStopsWorking:`Il token con scope di {{ownerName}} smette di funzionare al prossimo utilizzo. L'operazione non può essere annullata.`,revoke2:`Revoca`,tokens:`Token`,scopedTokensForANarrow:`Token con scope per una superficie ristretta e token admin per script con accesso da amministratore completo. Revocarne uno lo ferma al prossimo utilizzo.`},credentialColumns:{name:`Nome`,owner:`Proprietario`,kindScope:`Tipo / scope`,status:`Stato`,created:`Creato`,lastUsed:`Ultimo utilizzo`,expires:`Scadenza`},externalIdentitiesSection:{removeSignInLink:`Rimuovi collegamento di accesso`,willNoLongerBeAble:`"{{ownerName}}" non potrà più accedere con questo account {{kind}}.`,signInLinks:`Collegamenti di accesso`,externalAccountsSingleSignOn:`Account esterni (accesso unico) che ogni utente ha collegato al proprio account CamStack. Solo il proprietario può collegarne uno, dal suo profilo; un amministratore può rimuoverlo.`}},users:{linkedSignInsSection:{unlinkSignInAccount:`Scollega account di accesso`,stopSigningInWithThis:`Smettere di accedere con questo account {{label}}?`,unlink:`Scollega`,linkedSignInAccounts:`Account di accesso collegati`,signInWithAnExternal:`Accedi con un account esterno invece che con la password. Solo gli account che colleghi qui possono farti accedere; la tua autenticazione a due fattori continua ad applicarsi.`,providerUnavailable:`provider non disponibile`},scopePreview:{all:`tutti e {{total}}`,of:`{{count}} di {{total}}`,resolving:`Risoluzione…`,couldNotResolveThisGrant:`Impossibile risolvere questo insieme di permessi. Il salvataggio è comunque consentito — il server applica le stesse regole in ogni caso.`,administrator:`Amministratore`,devicesTheyCanSee:`Dispositivi che può vedere`,devicesTheyCanOperate:`Dispositivi che può controllare`,devicesTheyCanDelete:`Dispositivi che può eliminare`,systemAccess:`Accesso al sistema:`,extraCapabilities:`· Capability extra:`,addons:`· Addon:`,thisUserWillNotBe:`Questo utente non potrà vedere alcun dispositivo.`},shareLinksSection:{revokeShareLink:`Revoca link di condivisione`,anyoneHoldingThisLinkTo:`Chiunque abbia questo link a {{value1}} perde subito l'accesso. L'operazione non può essere annullata.`,revoke:`Revoca`,shareLinks:`Link di condivisione`,viewOnlyLinksYouCreated:`Link di sola visualizzazione creati nell'app viewer per condividere una griglia o gli eventi di alcune telecamere. Revocare un link lo ferma ovunque sia stato inviato.`,shareLinks2:`link di condivisione`,everyUserSViewOnly:`I link di condivisione di sola visualizzazione di ogni utente. Revocarne uno lo ferma per chiunque lo abbia ricevuto — un link revocato viene eliminato e non può essere ripristinato.`,selectExpired:`Seleziona scaduti`},totpModal:{remove2fa:`Rimuovi 2FA`,removeTwoFactorAuthenticationFor:`Rimuovere l'autenticazione a due fattori per "{{username}}"? Potrà accedere con la sola password finché non si registra di nuovo dalla propria pagina profilo.`,twoFactorAuthentication:`Autenticazione a due fattori`,user:`Utente:`,checkingStatus:`Verifica dello stato…`,"2faNotEnrolled":`2FA non attivato`,onlyTheUserThemselvesCan:`Solo l'utente stesso può abilitare il 2FA, dalla propria pagina profilo.`,"2faIsActive":`2FA attivo`,removingHereClearsTheServer:`Rimuoverlo qui cancella il segreto lato server. Usalo solo se l'utente ha perso l'accesso — dovrà registrarsi di nuovo dalla pagina profilo.`},totpQrCode:{qrRenderingUnavailableUseThe:`Rendering del QR non disponibile — usa il segreto qui sotto.`,generating:`Generazione…`},userAccessModal:{thisUserIsAnAdministrator:`Questo utente è un amministratore — può fare tutto e le impostazioni qui sotto vengono ignorate.`,chooseWhatTheyCanDo:`Scegli cosa può fare, poi a quali dispositivi si applica.`,noAccess:`Nessun accesso.`,"1WhatCanTheyDo":`1 · Cosa può fare`,advancedEditRawGrants:`Avanzate — modifica i permessi grezzi`,oneRowPerGrantAnything:`Una riga per permesso. Tutto ciò che si può esprimere qui ha la precedenza sui tre ruoli sopra; chiudi questa sezione per tornare a quelli.`,"2OnWhichDevices":`2 · Su quali dispositivi`,"3Result":`3 · Risultato`,"2Result":`2 · Risultato`,saveAccess:`Salva accesso`},userSessionsModal:{signOutThisSession:`Disconnetti questa sessione`,onWillHaveToSign:`"{{username}}" su {{label}} dovrà accedere di nuovo.`,signOut:`Disconnetti`,signOutEverywhere:`Disconnetti ovunque`,everySessionOfYourOwn:`Tutte le sessioni del tuo account terminano, questo browser incluso: verrai disconnesso anche qui.`,everySessionOfEndsAt:`Tutte le sessioni di "{{username}}" terminano subito; ogni dispositivo dovrà accedere di nuovo.`,activeSessions:`Sessioni attive`,user:`Utente:`},externalIdentitiesModal:{removeSignInLink:`Rimuovi collegamento di accesso`,willNoLongerBeAble:`"{{username}}" non potrà più accedere con questo account {{label}}.`,linkedSignInAccounts:`Account di accesso collegati`,user:`Utente:`,noLinkedAccountsOnlyThe:`Nessun account collegato. Solo l'utente può collegarne uno, dalla propria pagina del profilo.`,providerUnavailable:`provider non disponibile`}},addons:{addonCard:{updating:`Aggiornamento…`,updateTo:`Aggiorna a {{target}}`,update:`Aggiorna`,selectVersionToInstall:`Seleziona la versione da installare`,installedUpdateAvailableSelectedTap:`Installata {{version}} — aggiornamento disponibile. Selezionata {{target}}; tocca per scegliere un'altra versione.`,versionTapToViewAll:`Versione {{version}} — tocca per vedere tutte le versioni`,unknownError:`Errore sconosciuto`,resetRetryCounterAndForce:`Azzera il contatore dei tentativi e forza un ricaricamento immediato`,retryNow:`Riprova ora`,systemPackageUpdatingRestartsThe:`Pacchetto di sistema — l'aggiornamento riavvia l'hub`,system:`Sistema`,restart:`Riavvia`,logs:`Log`,settings:`Impostazioni`,clusterDeployment:`Distribuzione nel cluster`,events:`Eventi`,clusterWideSettingsOneValue:`Impostazioni a livello di cluster — un solo valore per ogni nodo. Le impostazioni per nodo si trovano in Cluster → il nodo → Impostazioni.`,thisAddonExposesNoCluster:`Questo addon non espone impostazioni a livello di cluster. Tutto ciò che si può configurare è per nodo — aprilo da Cluster → il nodo → Impostazioni.`,deviceExport:`Esportazione dispositivi`,autoUpdate:`Aggiornamento automatico`,installedOn:`Installato su`,hubLocal:`Hub (locale)`,installOnMoreAgents:`Installa su altri agenti`,addAgent:`Aggiungi agente`,noAvailableAgents:`Nessun agente disponibile`},addonRow:{systemPackage:`Pacchetto di sistema`,changesRequireAHubRestart:`Le modifiche richiedono il riavvio dell'hub`,requiresRestart:`richiede riavvio`,update:`Aggiorna`,restart:`Riavvia`,uninstall:`Disinstalla`},addonUninstallControls:{uninstalled:`{{displayName}} disinstallato`,notEveryNodeWasCleaned:`{{displayName}}: non tutti i nodi sono stati ripuliti`,uninstallFailed:`Disinstallazione di {{displayName}} fallita`,uninstallFrom:`Disinstallare {{displayName}} da {{name}}?`,uninstall:`Disinstalla`,cannotListTheNodes:`Impossibile elencare i nodi`,theHubDidNotAnswer:`L'hub non ha indicato quali nodi hanno questo pacchetto — non è stato rimosso nulla.`,uninstallEverywhere:`Disinstallare {{displayName}} ovunque?`,uninstallFromNodeS:`Disinstalla da {{length}} nodo/i`,uninstallFrom2:`Disinstalla da {{name}}`,removing:`Rimozione...`,uninstallFromEveryNodeThat:`Disinstalla da ogni nodo che lo ha`},addonUploadZone:{uploading:`Caricamento...`,upload:`Carica`},capabilityMap:{noActiveProvider:`Nessun provider attivo`,noProviders:`Nessun provider`,noCapabilitiesRegistered:`Nessuna capability registrata`},nodeOnlyPackagesPanel:{installedOnAgentsButNot:`Installati sugli agenti ma non sull'hub`,installedOnButNotOn:`Installato su {{name}} ma non sull'hub`},updatesList:{checking:`Verifica…`,checkForUpdates:`Cerca aggiornamenti`,allPackagesAreUpTo:`Tutti i pacchetti sono aggiornati`,restart:`Riavvia`,hotSwap:`Hot-swap`,update:`Aggiorna`},versionPicker:{versions:`Versioni`,uploadedCopy:`Copia caricata`,localCopy:`Copia locale`,loadingVersions:`Caricamento versioni...`,select:`Seleziona {{version}}`,reInstallFromNpm:`Reinstalla {{version}} da npm`,install:`Installa {{version}}`,noVersionsFound:`Nessuna versione trovata`}},brokers:{brokerForm:{failedToLoadSettingsSchema:`Impossibile caricare lo schema delle impostazioni:`,unknownError:`Errore sconosciuto`,connectionOk:`Connessione OK.`,testFailed:`Test fallito: {{value1}}`,testing:`Test in corso…`,testConnection:`Test connessione`},brokerManager:{addBroker:`Aggiungi broker`,registerAMessageBrokerFor:`Registra un message broker per esportatori e automazioni.`,adding:`Aggiunta…`,edit:`Modifica {{name}}`,saving:`Salvataggio…`,deleteBroker:`Elimina broker`,deleteBrokerIntegrationsThatDepend:`Eliminare il broker "{{name}}"? Le integrazioni che ne dipendono smetteranno di funzionare.`,signInOpensAPopup:`Accedi — apre un popup che si chiude al termine`,signOutClearsTheLinked:`Disconnetti — scollega l'account Google collegato a questo broker`,testConnection:`Test connessione`,test:`Test`,noBrokerProvidersAvailable:`Nessun provider di broker disponibile`,name:`Nome`,kind:`Tipo`,status:`Stato`,actions:`Azioni`,failedToLoadBrokers:`Impossibile caricare i broker:`,unknownError:`Errore sconosciuto`,noBrokersRegisteredYetAdd:`Nessun broker registrato. Aggiungine uno per pubblicare gli eventi dei dispositivi alle automazioni a valle.`}},integrationHub:{addonIntegrationBody:{settings:`Impostazioni`,activity:`Attività`,activityStream:`Flusso di attività`},integrationHub:{integrations:`Integrazioni {{title}}`},integrationSection:{linkTo:`Collega a {{title}}`},addonControls:{enabled:`Abilitato`,disabled:`Disabilitato`,restart:`Riavvia`,restart2:`Riavviare "{{displayName}}"?`,restartingTheAddonBouncesIts:`Riavviare l'addon riavvia il suo sottoprocesso — il provider si disconnetterà brevemente e si riconnetterà in automatico.`}},app:{bootProbeFailed:`Verifica di avvio fallita:`,connecting:`Connessione…`},galleryPager:{previousPage:`Pagina precedente`,nextPage:`Pagina successiva`},login:{primaryLoginMethods:{orContinueWith:`Oppure continua con`},returningToTheApp:`Ritorno all'app…`,couldNotPrepareTheSign:`Impossibile preparare il passaggio dell'accesso. Hai effettuato l'accesso: riprova qui sotto.`,preparingAOneTimeSign:`Preparazione di un codice di accesso monouso…`,ifTheAppDoesNot:`Se l'app non si apre da sola, tocca qui sotto (il codice scade tra 60 s).`,openCamstack:`Apri CamStack`,camstackAdmin:`CamStack Admin`,username:`Nome utente`,password:`Password`,logIn:`Accedi`,loggingIn:`Accesso in corso...`,twoFactorAuthentication:`Autenticazione a due fattori`,finishSigningIn:`Completa l'accesso.`,passkeyVerificationIsnTAvailable:`La verifica con passkey non è disponibile a questo indirizzo. Apri l'hub dal suo indirizzo di dominio per completare l'accesso.`,authenticationCode:`Codice di autenticazione`,verifyAndSignIn:`Verifica e accedi`,verifying:`Verifica in corso...`,backToUsernamePassword:`Torna a nome utente + password`},metrics:{agentLoad:{agentLoad:`Carico agenti`,loading:`Caricamento...`,failedToLoadData:`Impossibile caricare i dati`},integrationUsage:{integrationUsage:`Utilizzo integrazioni`,loading:`Caricamento...`,failedToLoadData:`Impossibile caricare i dati`},processResources:{processResources:`Risorse dei processi`,loading:`Caricamento...`,failedToLoadData:`Impossibile caricare i dati`,cpu:`CPU:`,mem:`Mem:`,process:`Processo`,memory:`Memoria`,uptime:`Uptime`,rst:`Rst`}},notifications:{templateField:{noVariablesForThisField:`Nessuna variabile per questo campo.`,class:`{{name}}<class>`,previewExampleValues:`Anteprima (valori di esempio)`}},search:{globalSearch:{clearSearch:`Cancella ricerca`}},settings:{nodeAddonsSettingsPanel:{theCurrentSelection:`la selezione corrente`,saveFailed:`Salvataggio fallito:`,nothingToConfigureHereFor:`Nulla da configurare qui per questo nodo.`},siteLocationCard:{siteLocation:`Posizione del sito`,setByYou:`Impostata da te`,derivedFromIp:`Ricavata dall'IP`,notConfigured:`Non configurata`,automaticDetectionFromThePublic:`Il rilevamento automatico dall'IP pubblico non è riuscito`,itIsNotRetriedOn:`Non viene ritentato da solo — inserisci le coordinate oppure premi Rileva.`,latitude:`Latitudine`,longitude:`Longitudine`,detectFromIp:`Rileva dall'IP`,clear:`Cancella`,wgs84DecimalDegreesDetectAsks:`Gradi decimali WGS84. Rileva interroga una sola volta un servizio pubblico di geo-IP e non sovrascrive un valore che hai digitato — cancellalo prima.`}},secrets:{keychainAuditTable:{nothingHasBeenAuditedYet:`Nulla è stato ancora registrato in audit.`,previousPage:`Pagina precedente`,nextPage:`Pagina successiva`},keychainNoticeContent:{resetKeychain:`Reimposta keychain`,dismiss:`Ignora`,download:`Scarica`,rotate:`Ruota`,review:`Rivedi`,noValueCanBeRead:`Nessun valore può essere letto o memorizzato. Se la chiave master è persa per sempre, Reimposta archivia tutti i valori memorizzati e avvia una nuova keychain; ogni campo segreto risulterà quindi “non impostato”.`,withoutACopyOfThe:`Senza una copia della chiave master, i valori memorizzati non possono essere recuperati.`,theKeychainUnlockedWithA:`La keychain è stata sbloccata con una chiave precedente. Ruota per passare a quella configurata.`},keychainNotices:{keychainNotices:`Avvisi keychain`,showLess:`Mostra meno`,more:`altri {{hidden}}`,details:`Dettagli`},keychainStatusCard:{keychain:`Keychain`,rotateKey:`Ruota chiave`,downloadRecoveryKey:`Scarica chiave di recupero`,state:`Stato`,locked:`Bloccata`,unlocked:`Sbloccata`,keySource:`Origine della chiave`,fingerprint:`Impronta`,recoveryKey:`Chiave di recupero`,notTaken:`Non scaricata`},revealDialog:{hide:`Nascondi`},secretsTable:{filterByUsage:`Filtra per utilizzo`,noValueIsStoredIn:`Nessun valore è ancora memorizzato nella keychain.`,noStoredValueMatchesThis:`Nessun valore memorizzato corrisponde a questo filtro.`,hubSystem:`Hub (sistema)`,owner:`Proprietario`,scope:`Scope`,field:`Campo`,updated:`Aggiornato`,lastRead:`Ultima lettura`,status:`Stato`,reveal:`Mostra {{fieldPath}}`,theKeychainIsLocked:`La keychain è bloccata`,revealAudited:`Mostra (con audit)`,reveal2:`Mostra`}},ui:{alertBell:{markAsRead:`Segna come letto`,dismiss:`Ignora`,alerts:`Avvisi`,showRead:`Mostra letti`,markAllRead:`Segna tutti come letti`,noUnreadAlerts:`Nessun avviso non letto`,noAlerts:`Nessun avviso`,inProgress:`In corso`}},layouts:{addonPageLoader:{addonPageNotFound:`Pagina addon non trovata`},protectedRoute:{loading:`Caricamento...`},appLayout:{camstackAdmin:`CamStack Admin`,expandSidebar:`Espandi la barra laterale`,collapseSidebar:`Comprimi la barra laterale`,logout:`Esci`,user:`Utente`,adminUiV:`admin-ui v{{__APP_VERSION__}}`,openMenu:`Apri il menu`,camstack:`CamStack`}},build:{automationsScriptsAndComposedDevices:`Automazioni, script e dispositivi composti — ciò che questa installazione fa da sola.`,automationsTab:{automation:`Automazione`,couldNotReadTheAutomations:`Impossibile leggere le automazioni`,loadingAutomations:`Caricamento automazioni…`,noAutomationsYet:`Nessuna automazione.`,edit:`Modifica {{name}}`,newAutomation:`Nuova automazione`},blockEditor:{loadExample:`Carica esempio`,replaceTheCurrentEditorContents:`Sostituire il contenuto attuale dell'editor con questo esempio?`,replace:`Sostituisci`,name:`Nome`,whatThisScriptDoes:`Cosa fa questo script`,integrationOptional:`Integrazione (facoltativa)`,leaveEmptyForTheShared:`Lascia vuoto per l'integrazione di sistema condivisa`,startFrom:`Parti da`,runsOn:`Eseguito su`,failed:`Fallito`,renameFile:`Rinomina file`,doubleClickToRename:`Doppio clic per rinominare`,file:`+ file`,useThisFileAsThe:`Usa questo file come punto di ingresso della compilazione`,setAsEntry:`Imposta come ingresso`,loadingTheNodeSType:`Caricamento delle definizioni di tipo del nodo…`,theNodeReturnedNoType:`Il nodo non ha restituito definizioni di tipo, quindi questo codice NON viene verificato rispetto ai tipi del sistema. La compilazione lato server si applica comunque al salvataggio.`,theCodeDoesNotCompile:`il codice non compila`,couldNotReachTheCompiler:`Impossibile raggiungere il compilatore:`,typeCheckOnTheNode:`Verifica dei tipi sul nodo senza salvare`,stopTheProcessAndLet:`Ferma il processo e lascia che il supervisor lo riporti su`,restart:`Riavvia`,showThisScriptSProcess:`Mostra i log del processo di questo script`,nameRequired:`Nome obbligatorio`,logsAppearOnceTheScript:`I log compaiono dopo che lo script è stato salvato e avviato.`},customDeviceTab:{couldNotReadTheCompositions:`Impossibile leggere le composizioni`,loadingCompositions:`Caricamento composizioni…`,theCompositionStoreHasNot:`L'archivio delle composizioni non è ancora stato letto.`,thisIsNotTheSame:`Non equivale ad averne zero — l'elenco compare quando l'hub lo ha letto (`,newComposedDevice:`Nuovo dispositivo composto`,editComposedDevice:`Modifica dispositivo composto`,showingTheLastAnswerThe:`Viene mostrata l'ultima risposta — l'ultimo aggiornamento è fallito:`,deviceNamesAreShownAs:`I nomi dei dispositivi sono mostrati come riferimenti:`,composedDevices:`Dispositivi composti`,aNewDeviceWhoseState:`Un nuovo dispositivo il cui stato deriva da altri dispositivi.`,noComposedDevices:`Nessun dispositivo composto.`,customizations:`Personalizzazioni`,fieldsAddedToOrReplaced:`Campi aggiunti o sostituiti su un dispositivo esistente — uno per dispositivo, modificato dal dispositivo.`,noCustomizations:`Nessuna personalizzazione.`,type:`Tipo`,state:`Stato`,sources:`Sorgenti`,deviceMissing:`dispositivo mancante`},scriptDevicesPanel:{couldNotListDevices:`Impossibile elencare i dispositivi:`,devices:`Dispositivi`,declaredByThisScriptUnder:`Dichiarati da questo script nell'integrazione Blocks condivisa (`,openDeviceDetail:`Apri dettaglio dispositivo`},scriptSettingsPanel:{couldNotLoadSettings:`Impossibile caricare le impostazioni:`,settings:`Impostazioni`,saveSettings:`Salva impostazioni`},scriptsTab:{name:`Nome`,deleteThisScript:`Eliminare questo script?`,restart:`Riavvia`,enableItInsteadADisabled:`Abilitalo invece — uno script disabilitato non ha un processo`,logs:`Log`,couldNotReadTheScripts:`Impossibile leggere gli script`,noScriptsYetAScript:`Nessuno script. Uno script è TypeScript che l'hub esegue nel proprio processo.`,loadingScripts:`Caricamento script…`,noScriptsYet:`Nessuno script.`,edit:`Modifica {{name}}`,newScript:`Nuovo script`}},automation:{actionList:{noActionsYetAnAutomation:`Nessuna azione. Un'automazione che non fa nulla non è un'automazione.`,step:`Passo`,runThisStepEarlier:`Esegui questo passo prima`,runThisStepLater:`Esegui questo passo dopo`,removeThisStep:`Rimuovi questo passo`,seconds:`Secondi`,code:`Codice`,stepsRunInOrderAnd:`I passi vengono eseguiti in ordine e si fermano al primo errore.`},automationEditor:{runsOnTheHub:`eseguito sull'hub`,name:`Nome`,whatThisAutomationDoes:`Cosa fa questa automazione`,when:`Quando`,anyOneOfTheseStarts:`Uno qualsiasi di questi avvia un'esecuzione.`,andOnlyIf:`E solo se`,checkedAfterATriggerFires:`Verificato dopo che un trigger scatta. Non viene eseguito nulla se non è vero.`,then:`Allora`,inThisOrderStoppingAt:`In quest'ordine, fermandosi al primo errore.`,logsAppearOnceTheAutomation:`I log compaiono dopo che l'automazione è stata salvata e avviata`,showThisAutomationSProcess:`Mostra i log del processo di questa automazione`,nameRequired:`Nome obbligatorio`},automationList:{deleteThisAutomation:`Eliminare questa automazione?`,thisBlockCannotBeOpened:`Questo blocco non può essere aperto in modo visuale`,runActions:`Esegui azioni`,runningAnAutomationByHand:`Eseguire un'automazione a mano richiede l'autorità automation-control, non ancora collegata. Volutamente non esiste un secondo modo per eseguirla.`,logs:`Log`,noAutomationsYet:`Nessuna automazione.`,anAutomationIsATrigger:`Un'automazione è un trigger, un insieme di condizioni e un elenco di azioni. Viene compilata in un normale blocco ed eseguita nel proprio processo supervisionato — non esiste un motore separato, quindi qualsiasi problema compare qui con un motivo.`,newAutomation:`Nuova automazione`},conditionRow:{comparison:`Confronto`,value:`Valore`},conditionTree:{andOnlyIf:`E solo se`,noConditionsTheActionsRun:`Nessuna condizione. Le azioni vengono eseguite ogni volta che un trigger scatta.`,compareOneDeviceFieldTo:`Confronta un campo di un dispositivo con un valore`,arithmeticAcrossDeviceFieldsThe:`Aritmetica tra campi di dispositivi — il motore di espressioni limitato`,allSelectedRowsMustBe:`Tutte le righe selezionate devono essere vere`,groupAsAll:`Raggruppa come TUTTE`,anyOneOfTheSelected:`Basta una qualsiasi delle righe selezionate`,groupAsAny:`Raggruppa come QUALSIASI`,invertTheSelectedRow:`Inverti la riga selezionata`,selectThisRowForGrouping:`Seleziona questa riga per il raggruppamento`,dissolveThisGroupKeepingIts:`Sciogli questo gruppo, mantenendo le sue righe`,deleteThisGroupAndEverything:`Elimina questo gruppo e tutto il suo contenuto`,removeTheNotKeepingThe:`Rimuovi il NOT, mantenendo la riga`,removeThisCondition:`Rimuovi questa condizione`},expressionLeafRow:{expression:`Espressione`,indoorOutdoor5:`indoor - outdoor > 5`,mustEvaluateToTrueOr:`Deve valere vero o falso. Ogni nome al suo interno deve essere associato qui sotto — un nome non associato viene rifiutato al salvataggio dell'automazione, non durante l'esecuzione.`,noNamesBoundYetAn:`Nessun nome associato. Un'espressione legge i dispositivi solo attraverso questi.`,name:`Nome`,reads:`Legge`,aDeviceField:`Un campo di dispositivo`,aConstant:`Una costante`,constant:`Costante`,removeThisName:`Rimuovi questo nome`},fieldPicker:{device:`Dispositivo`,selectADevice:`Seleziona un dispositivo…`,capability:`Capability`,field:`Campo`,noReadableFields:`Nessun campo leggibile`,selectAField:`Seleziona un campo…`},generatedCodePanel:{ejectToCodeThisCannot:`Converti in codice — l'operazione non può essere annullata`,theRecipeIsRemovedFrom:`La ricetta viene rimossa dal blocco, che diventa un normale script. L'editor visuale non lo aprirà più e l'unico modo per tornare indietro è creare una nuova automazione da zero. Il codice resta esattamente com'è ora.`,ejectToCode:`Converti in codice`,keepItVisual:`Mantieni visuale`,generatedCode:`Codice generato`,derivedFromTheRecipeAbove:`Derivato dalla ricetta qui sopra — rigenerato a ogni salvataggio, mai modificato qui.`,takePermanentOwnershipOfThis:`Prendi definitivamente possesso di questo codice come script`,saveTheAutomationFirstThere:`Salva prima l'automazione — non c'è ancora un blocco salvato da convertire`,theRecipeIsNotComplete:`La ricetta non è ancora abbastanza completa per generare un blocco.`},triggerEditor:{noTriggersYetWithoutOne:`Nessun trigger. Senza non può mai partire nulla — nemmeno "Esegui azioni", che ha bisogno di un trigger manuale a cui arrivare.`,addAnotherWayThisAutomation:`Aggiungi un altro modo in cui questa automazione può partire`,when:`Quando`,orWhen:`oppure quando`,trigger:`Trigger`,removeThisTrigger:`Rimuovi questo trigger`,cronExpression:`Espressione cron`,runActions:`Esegui azioni`,becomes:`Diventa`,anyChange:`qualsiasi cambiamento`,onlyOnAChange:`solo a un cambiamento`,heldForS:`Mantenuto per (s)`,debounceS:`Debounce (s)`,eventCategory:`Categoria evento`,selectAnEvent:`Seleziona un evento…`,fromDevice:`Dal dispositivo`,anyDevice:`Qualsiasi dispositivo`},valueInput:{oneTwoThree:`uno, due, tre`}},accessDenied:{accessDenied:`Accesso negato`,youDonTHavePermission:`Non hai i permessi per accedere a questa pagina.`,goToDevices:`Vai ai Dispositivi`},changePassword:{camstackAdmin:`CamStack Admin`,setANewPassword:`Imposta una nuova password`,youMustRotateTheSeed:`Devi cambiare la password iniziale prima di continuare.`,chooseANewPasswordFor:`Scegli una nuova password per il tuo account.`,newPassword:`Nuova password`,confirmNewPassword:`Conferma nuova password`,saving:`Salvataggio…`,saveAndContinue:`Salva e continua`,signOutInstead:`Disconnetti invece`},deviceDetail:{invalidDeviceId:`ID dispositivo non valido`,isNotANumber:`non è un numero.`,backToIntegrations:`Torna alle Integrazioni`,deviceNotFound:`Dispositivo non trovato`,integrations:`Integrazioni`,openParentDevice:`Apri il dispositivo padre {{name}}`,disable:`Disabilitare "{{name}}"?`,theDeviceWillStopProcessing:`Il dispositivo smetterà di elaborare stream ed eventi. Potrai riabilitarlo in seguito.`,disableDevice:`Disabilita dispositivo`,enableDevice:`Abilita dispositivo`,updating:`Aggiornamento…`,enabled:`Abilitato`,disabled:`Disabilitato`,takeSnapshot:`Scatta snapshot`,fetchAFreshFrameAnd:`Ottieni un frame aggiornato e scaricalo.`,rebootDevice:`Riavvia dispositivo`,cameraGoesOfflineFor30:`La telecamera va offline per circa 30 secondi.`,reboot:`Riavviare "{{name}}"?`,theCameraWillGoOffline:`La telecamera andrà offline per circa 30 secondi durante il riavvio del firmware.`,reboot2:`Riavvia`,restartAddon:`Riavvia addon`,bouncesEveryDeviceServedBy:`Riavvia ogni dispositivo servito da {{servingAddonLabel}}.`,restart:`Riavviare "{{servingAddonLabel}}"?`,restartingTheAddonWillBriefly:`Riavviare l'addon disconnetterà brevemente tutti i dispositivi serviti da esso (non solo "{{name}}"). Gli stream si riconnetteranno automaticamente.`,restart2:`Riavvia`,deleteDevice:`Elimina dispositivo`,removeTheDeviceAndAll:`Rimuove il dispositivo e tutte le sue impostazioni.`,delete:`Eliminare "{{name}}"?`,thisWillRemoveTheDevice:`Il dispositivo e tutte le sue impostazioni verranno rimossi. L'operazione non può essere annullata.`,dragToResize:`Trascina per ridimensionare`,currentAudioLevelDbfs:`Livello audio attuale (dBFS)`},devices:{orphanDevices:`Dispositivi orfani`,theseDevicesReferenceAnIntegration:"Questi dispositivi fanno riferimento a un'integrazione non più registrata (il loro `integrationId` oppure, per i dispositivi più vecchi che non ne hanno uno, il loro `addonId`). Eliminali, oppure reinstalla l'integrazione mancante per riportarli online. Il badge del provider accanto a ogni riga è l'addon che lo serve."},embedPlayerPage:{embedConfigError:`Errore di configurazione dell'embed:`,failedToInitialiseTheEmbed:`Impossibile inizializzare il player embed`},events:{feed:`Feed`,debug:`Debug`},eventsDebug:{noAnomalyFound:`nessuna anomalia trovata`,analysing:`analisi in corso…`,notAnalysed:`non analizzato`,noMediaOfAnyKind:`nessun media di alcun tipo`,allCameras:`Tutte le telecamere`,selectAll:`Seleziona tutto`,keep:`Mantieni`,analyzed:`Analizzato`,couldNotLoadTheMarked:`Impossibile caricare le tracce contrassegnate.`,aCameraFilledThePer:`Una telecamera ha raggiunto il limite per telecamera — alcune tracce contrassegnate non sono elencate. Rimuovi il contrassegno ad alcune, oppure filtra su una sola telecamera.`,noTrackIsMarkedFor:`Nessuna traccia è contrassegnata per il debug`,markOneFromATrack:`Contrassegnane una dalle azioni di una traccia nel Feed per vederla qui.`},eventsDebugTapes:{trackingTapes:`Nastri di tracking`,recordTheTrackHistory:`Registra la cronologia delle tracce`,loadingCameraStatus:`Caricamento stato telecamere…`,camera:`Telecamera`,state:`Stato`,framesMin:`Frame/min`,lastHour:`Ultima ora`,held:`Trattenuti`,gaps:`Lacune`,segmentsUnknown:`{{value1}} (segmenti sconosciuti)`,loadingPromotedTapes:`Caricamento nastri promossi…`,scenario:`Scenario`,window:`Finestra`,tracks:`Tracce`,review:`Rivedi {{scenario}}`,review2:`Rivedi`,download:`Scarica {{scenario}}`,release:`Rilascia`,release2:`Rilasciare {{scenario}}?`,releasingReturnsThisTapeS:`Rilasciare riporta le tracce bloccate di questo nastro alla retention ordinaria — da quel momento possono essere eliminate. Il bundle promosso resta fino a quando non viene eliminato.`,delete:`Eliminare {{scenario}}?`,deletingRemovesThePromotedBundle:`Eliminare rimuove definitivamente il bundle promosso e la sua riga nell'indice. Prima vengono rilasciati i blocchi delle sue tracce — l'operazione non può essere annullata.`},eventsDebugTapesPromoteForm:{camera:`Telecamera`,from:`Da`,to:`A`,scenario:`Scenario`,note:`Nota`,optionalNote:`nota facoltativa`,lighting:`Illuminazione`,lightingAuto:`Illuminazione: auto`,aPromotedTapeMayBe:`Un nastro promosso può essere condiviso come caso di test — tieni lo slug dello scenario e la nota privi di nomi o altri dati personali.`},eventsDebugTapesReview:{loadingTheTape:`Caricamento del nastro…`,sameSubject:`Stesso soggetto`,differentSubjects:`Soggetti diversi`,changedAtSFromTape:`Cambiato a (s dall'inizio del nastro)`,changedAtS:`cambiato a s`,mixed:`Misto`,notASubject:`Non è un soggetto`,markNotReviewed:`Segna come non rivisto`,markReviewed:`Segna come rivisto`,select:`seleziona {{trackId}}`,notStoredMarkedThroughThe:`non memorizzato — contrassegnato tramite il nastro`},integrationDetail:{integrations:`Integrazioni`,scanTheNetworkForDevices:`Cerca dispositivi sulla rete (anche in una sottorete diversa)`,scanNetwork:`Scansiona rete`,disableIntegration:`Disabilita integrazione`,enableIntegration:`Abilita integrazione`,enabled:`Abilitata`,disabled:`Disabilitata`,restart:`Riavvia`,restart2:`Riavviare "{{name}}"?`,restartingTheAddonWillBriefly:`Riavviare l'addon disconnetterà brevemente tutti i dispositivi che ne dipendono ({{topLevelCountLabel}} attivi). Gli stream si riconnetteranno automaticamente.`},library:{peopleVehiclesCapturedEventsAnd:`Persone, veicoli, eventi acquisiti e scene — ciò che la detection ha riconosciuto.`,people:`Persone`,vehicles:`Veicoli`,events:`Eventi`,scenes:`Scene`},plates:{vehicles:`Veicoli`,enrolledVehicleIdentitiesUsedFor:`Identità di veicoli registrate usate per il riconoscimento delle targhe. Apri un veicolo per rinominarlo o rimuovere i campioni di targa.`,recentRecognizedPlates:`Targhe riconosciute di recente`,licensePlatesReadByThe:`Targhe lette dalla pipeline di detection. Assegnale a un veicolo, correggi il testo OCR oppure eliminale.`},scenes:{scene:`Scena`,camera:`Telecamera`,state:`Stato`,whatItSays:`Cosa dice`,variants:`Varianti`,lastChange:`Ultima modifica`,open:`Apri`,aSceneWatchesOneRegion:`Una scena osserva una regione di una telecamera e ti avvisa quando smette di somigliare all'immagine che hai acquisito — un bidone, un cancello, un posto auto.`,newScene:`Nuova scena`,loadingScenes:`Caricamento scene…`,nothingMatchesTheFilter:`Nessun risultato per il filtro`,noScenesYetPressNew:`Nessuna scena. Premi “Nuova scena”, scegli una telecamera, poi disegna un riquadro attorno a ciò che vuoi tenere d'occhio.`,whichCamera:`Quale telecamera?`,continue:`Continua`,aSceneLivesOnOne:`Una scena appartiene a una telecamera. Scegli quella che vede l'oggetto.`,scenes:`Scene — {{editingName}}`,drawABoxNameIt:`Disegna un riquadro, dagli un nome, poi acquisisci l'aspetto “normale”. La luce diurna basta — il riferimento notturno è facoltativo, e “Impostazioni” su ogni scena regola quanto è esigente e ogni quanto controlla.`,loadingTheEditor:`Caricamento dell'editor…`},ssoComplete:{nothingToFinishHereGo:`Nulla da completare qui — vai all'accesso`,closeThisWindow:`Chiudi questa finestra`,finishingSignIn:`Completamento dell'accesso…`},admin:{system:{integrations:{connectivity:`Connettività`,externalSystemsThisHubTalks:`Sistemi esterni con cui questo hub comunica — exporter, email, broker e sorgenti di calendario.`,devices:`Dispositivi`,connections:`Connessioni`,exposed:`{{linkState}} · {{exposedDeviceCount}} esposti`},logs:{viewer:`Visualizzatore`,destinations:`Destinazioni`,levels:`Livelli`,diagnostics:`Diagnostica`},secrets:{revealRefused:`Rivelazione rifiutata`,secrets:`Segreti`,passwordsTokensAndKeysEncrypted:`Password, token e chiavi, cifrati nel keychain dell'hub. I valori lasciano l'hub solo tramite una rivelazione sottoposta ad audit.`,storedValues:`Valori memorizzati`,audit:`Audit`},settings:{loadingHubTopology:`Caricamento topologia dell'hub…`,noOnlineHubNodeFound:`Nessun nodo hub online trovato.`,settingsWillAppearOnceThe:`Le impostazioni compariranno quando l'hub sarà raggiungibile.`,noAddonsInstalledOnThe:`Ancora nessun addon installato sull'hub.`},users:{deleteUser:`Elimina utente`,permanentlyDeleteUserThisCannot:`Eliminare definitivamente l'utente "{{username}}"? L'azione non può essere annullata — le sessioni attive verranno revocate alla richiesta successiva.`,resetPassword:`Reimposta password`,setANewPasswordFor:`Imposta una nuova password per "{{username}}".`,newPassword:`Nuova password`,atLeast8Characters:`Almeno 8 caratteri`,continue:`Continua`,resetThePasswordForThey:`Reimpostare la password di "{{username}}"? Dovrà usare la nuova password al prossimo accesso.`,username:`Nome utente`,admin:`Admin`,regular:`Standard`,access:`Accesso`,everythingAdmin:`tutto (admin)`,configureAccess:`Configura accesso`,created:`Creato`,actions:`Azioni`,editUser:`Modifica utente`,removeTwoFactorAuthentication:`Rimuovi autenticazione a due fattori`,remove2fa:`Rimuovi 2FA`,linkedSignInAccounts:`Account di accesso collegati`,signInLinks:`Link di accesso`,activeSessions:`Sessioni attive`,sessions:`Sessioni`,users:`Utenti`,hubAccountsAdminFlagAccess:`Account dell'hub, flag admin, scope di accesso, sessioni e link di accesso.`,createUser:`Crea utente`,couldNotLoadUsers:`Impossibile caricare gli utenti`,noUsersYet:`Ancora nessun utente`,createAUserToGrant:`Crea un utente per concedere l'accesso all'hub.`,edit:`Modifica {{value1}}`,create:`Crea`,saving:`Salvataggio…`,password:`Password`,atLeastCharacters:`Almeno {{value1}} caratteri.`,unrestrictedAccessToEveryCapability:`Accesso illimitato a ogni capability e dispositivo.`,toChangeThePasswordUse:`Per cambiare la password, usa Reimposta password sulla riga dell'utente. Gli scope di accesso si configurano dalla colonna Accesso.`,noAccess:`Nessun accesso`},addons:{sort:`Ordina:`,bundlesFirst:`Prima i pacchetti`,name:`Nome`,installSource:`Origine di installazione`,view:`Vista:`,groupMultiAddonPackagesInto:`Raggruppa i pacchetti con più addon in una scheda unica`,showEveryAddonAsIts:`Mostra ogni addon come scheda a sé`,autoUpdate:`Aggiornamento automatico:`,checkEvery:`Controlla ogni:`,updating:`Aggiornamento…`,updateAll:`Aggiorna tutti ({{nonSystemUpdateCount}})`,filterInstalledAddons:`Filtra gli addon installati`,filter:`Filtro:`,updatable:`Aggiornabili`,dev:`Sviluppo`,searchAddonsOnNpm:`Cerca addon su npm...`,searchAddonsOnNpm2:`Cerca addon su npm`,filteringByCapability:`Filtro per capability:`,clear:`Cancella`,installed:`Installati`,bulkUpdateCompleted:`Aggiornamento di massa completato`,systemPackagesUpdatedHubRestarted:`Pacchetti di sistema aggiornati: hub riavviato con successo.`,noAddonsInstalled:`Nessun addon installato`,noInstalledAddonDeclaresThe:`Nessun addon installato dichiara la capability "{{capabilityFilter}}". Ogni addon installabile compare sopra in "Disponibili da installare".`,noAddonsCompatibleWithPlacement:`Nessun addon compatibile con {{name}} (filtro di posizionamento attivo)`,reFetchAddonsCheckNpm:`Ricarica gli addon e controlla su npm le nuove versioni`,checkForUpdates:`Controlla aggiornamenti`,failedToLoadAddons:`Impossibile caricare gli addon`}}},systemPage:{myAccess:{notSignedIn:`Non hai effettuato l'accesso.`,administrator:`Amministratore`,user:`Utente`,unrestrictedAccess:`Accesso illimitato`,adminSessionsBypassThePer:`Le sessioni admin saltano il controllo degli scope per chiamata. Ogni endpoint protetto è raggiungibile a prescindere dall'elenco qui sotto.`,grantedScopes:`Scope concessi`,bakedIntoYourSessionToken:`Inseriti nel token di sessione al login; esci e rientra per aggiornarli dopo le modifiche.`,type:`Tipo`,target:`Destinazione`,access:`Accesso`,can:`Può {{a}}`,cannot:`Non può {{a}}`,signOut:`Esci`,changePassword:`Cambia password`,currentPassword:`Password attuale`,newPassword:`Nuova password`,atLeast8Characters:`Almeno 8 caratteri.`,confirmNewPassword:`Conferma nuova password`,passwordsDoNotMatch:`Le password non coincidono.`,newPasswordMustBeAt:`La nuova password deve avere almeno 8 caratteri.`,updatePassword:`Aggiorna password`,twoFactorAuthentication:`Autenticazione a due fattori`,checkingStatus:`Verifica dello stato…`,"2faIsnTActiveOn":`La 2FA non è attiva sul tuo account. Abilitala per richiedere a ogni accesso un codice di 6 cifre dalla tua app di autenticazione.`,enable2fa:`Abilita 2FA`,secretManualEntry:`Segreto (inserimento manuale)`,copied:`Copiato`,"2faIsActive":`La 2FA è attiva`,disable2fa:`Disabilita 2FA`},identity:{pairADevice:`Associa un dispositivo`,users:`Utenti`,tokensSessions:`Token e sessioni`,certificates:`Certificati`,authentication:`Autenticazione`},network:{localAccess:`Accesso locale`,networkAddresses:`Indirizzi di rete`,remoteAccess:`Accesso remoto`,meshNetworks:`Reti mesh`,turnServers:`Server TURN`,diagnostics:`Diagnostica`},data:{storage:`Archiviazione`,backup:`Backup`},notifications:{newRule:`Nuova regola`,addTarget:`Aggiungi target`,newSequence:`Nuova sequenza`,targets:`Target`,rules:`Regole`,sequences:`Sequenze`,simulate:`Simula`,history:`Cronologia`,alarm:`Allarme`,texts:`Testi`},calendars:{when:`Quando`,calendar:`Calendario`,location:`Luogo`,description:`Descrizione`,month:`Mese`,week:`Settimana`,day:`Giorno`,calendarView:`Vista calendario`,calendars:`Calendari`,show:`Mostra {{name}}`,colourFor:`Colore per {{name}}`,noEventsOnThisDay:`Nessun evento in questo giorno.`,loadingCalendars:`Caricamento calendari…`,couldNotListCalendars:`Impossibile elencare i calendari:`,openConnectivityCalendars:`Apri Connettività → Calendari`,toInstallOrConnectA:`per installare o collegare una sorgente (Google Calendar, raccolta rifiuti, Home Assistant, …).`,allCalendarsAreHiddenTurn:`Tutti i calendari sono nascosti. Attivane uno nella legenda per vedere gli eventi.`,previous:`Precedente`,today:`Oggi`,loadingEvents:`Caricamento eventi…`,couldNotListEvents:`Impossibile elencare gli eventi:`,calendarsFromConnectedSourcesUsed:`Calendari delle sorgenti collegate. Usati dalle regole di notifica per eventi del calendario.`},terminal:{executable:`Eseguibile`,workingDirectory:`Directory di lavoro`,argumentsOnePerLine:`Argomenti (uno per riga)`,environmentNameValueOnePer:`Ambiente NOME=valore (uno per riga)`,terminal:`Terminale`,openLiveSessionsOrExplicitly:`Apri sessioni live o crea esplicitamente istanze di telecamere Terminale dai profili disponibili.`,terminalConfiguration:`Configurazione del terminale`,thisNodeOffersNoTerminal:`Questo nodo non offre alcun profilo terminale. Abilita BTM, Top o Glances qui sotto, oppure aggiungi un profilo personalizzato.`,couldnTLoadProfiles:`Impossibile caricare i profili`,theTerminalSessionCapabilityMay:`La capability terminal-session potrebbe essere disabilitata o non configurata.`,availableTerminalProfile:`Profilo terminale disponibile`,noProfilesAvailable:`Nessun profilo disponibile`,openSession:`Apri sessione`,terminalName:`Nome del terminale`,optionalCameraName:`Nome della telecamera (facoltativo)`,createTerminalCamera:`Crea telecamera Terminale`,terminalInstances:`Istanze terminale`,onlyTheseExplicitInstancesDeclare:`Solo queste istanze esplicite dichiarano telecamere. Chiudere una sessione live non elimina un'istanza.`,noTerminalCamerasHaveBeen:`Nessuna telecamera Terminale è stata creata.`,deleteTerminal:`Elimina terminale`,name:`Nome`,saveAndRestart:`Salva e riavvia`,legacyAutomaticCameras:`Telecamere automatiche legacy`,theseCamerasPredateExplicitTerminal:`Queste telecamere precedono le istanze Terminale esplicite. Sono volutamente intatte: conferma ogni migrazione prima di eliminarne una. Solo le telecamere BTM possono mantenere la loro identità legacy venendo adottate qui sotto; crea prima nuove istanze per Top o Glances.`,adoptBtm:`Adotta BTM`,liveSessions:`Sessioni live`,noSessionsRunningOpenOne:`Nessuna sessione in esecuzione. Aprine una qui sopra per iniziare.`,attached:`Collegata`,attach:`Collega`}},certificates:{caStrip:{localHttpsCaSha256:`CA HTTPS locale (SHA-256)`,downloadCa:`Scarica la CA`,clusterCaSha256:`CA del cluster (SHA-256)`,clusterCaValidUntil:`CA del cluster valida fino al`,nodeListener:`Listener del nodo`,open:`Aperto`,notStarted:`Non avviato`,theCertificateRegistryIsNot:`Il registro dei certificati non è attivo, quindi l'elenco dei nodi qui sotto è incompleto.`},deviceCaCard:{deviceCertificateAuthority:`Autorità di certificazione dei dispositivi`,signsTheCertificateEachPaired:`Firma il certificato che ogni dispositivo associato conserva. Viene creata la prima volta che si associa un dispositivo.`,state:`Stato`,ready:`Pronta`,notCreatedYet:`Non ancora creata`,unavailable:`Non disponibile`,subject:`Soggetto`,fingerprintSha256:`Impronta (SHA-256)`,validUntil:`Valida fino al`,reason:`Motivo`},deviceSettingsRow:{usersCanEnrollTheirOwn:`Gli utenti possono registrare i propri dispositivi`,allowedAUserSignedIn:`Consentito: un utente connesso da un telefono può mantenerlo connesso. L'associazione tramite QR funziona in entrambi i casi.`,disabledOnlyAnAdminCan:`Disattivato: solo un amministratore può associare un dispositivo, con un codice QR.`},devicesCard:{revoke:`Revocare "{{name}}"?`,sDeviceStopsSigningIn:`Il dispositivo di {{ownerName}} smette subito di accedere e le sue sessioni aperte terminano. Per usarlo di nuovo va associato da capo. L'operazione non si può annullare.`,revoke2:`Revoca`,delete:`Eliminare "{{name}}"?`,isRemovedFromTheList:`{{name}} viene rimosso dall'elenco. Il registro di audit conserva la revoca.`,renameDevice:`Rinomina dispositivo`,deviceName:`Nome del dispositivo`,rename:`Rinomina`,devices:`Dispositivi`,phonesThatStaySignedIn:`Telefoni che restano connessi con un certificato invece di un login. Revocarne uno lo disconnette subito; va associato di nuovo.`},myDevicesSection:{revoke:`Revocare "{{name}}"?`,theDeviceStopsSigningIn:`Il dispositivo smette subito di accedere e le sue sessioni aperte terminano. Per usarlo di nuovo devi associarlo da capo. L'operazione non si può annullare.`,revoke2:`Revoca`,myDevices:`I miei dispositivi`,phonesThatStaySignedIn:`Telefoni che restano connessi al tuo account con un certificato. Se uno va perso, revocalo qui e verrà disconnesso subito.`},nodesCard:{newCertificateIssuedRestartThe:`{{nodeId}}: nuovo certificato emesso. Riavvia il nodo per usarlo.`,newCertificateIssuedAndServed:`{{nodeId}}: nuovo certificato emesso e in uso.`,renewHttpsOn:`Rinnovare l'HTTPS su "{{nodeId}}"?`,aNewCertificateIsIssued:`Viene emesso un nuovo certificato dalla CA locale. I client che si fidano della CA continuano a funzionare.`,theNodeMakesANew:`Il nodo genera una nuova chiave, l'hub la firma e il nodo passa al nuovo certificato senza riavviarsi. Se qualcosa fallisce continua a usare quello che aveva.`,renew:`Rinnova`,revokeTheIdentityOf:`Revocare l'identità di "{{nodeId}}"?`,isDisconnectedAtOnceAnd:`{{nodeId}} viene disconnesso subito e non può più connettersi. Per riportarlo va associato di nuovo da Sistema → Cluster → Agent. Resta nell'elenco dei nodi finché non lo dimentichi dalla pagina Cluster. L'operazione non si può annullare.`,revokeAndDisconnect:`Revoca e disconnetti`,nodes:`Nodi`,eachNodeHoldsTwoCertificates:`Ogni nodo ha due certificati: uno che serve via HTTPS, uno che prova la sua identità all'hub. Il rinnovo sostituisce un certificato senza interruzioni; revocare un'identità esclude il nodo finché non si ricollega.`,noNodesReported:`Nessun nodo segnalato.`,theCertificateRegistryIsNot:`Il registro dei certificati non è ancora disponibile, quindi i nodi non possono essere elencati.`},pairDeviceDialog:{pairADevice:`Associa un dispositivo`,createPairingCode:`Crea codice di associazione`,done:`Fatto`,createsAOneTimeCode:`Crea un codice monouso per un telefono che hai in mano. Inquadralo con l'app CamStack su quel telefono; il telefono resta poi connesso come l'utente scelto finché non lo revochi.`,user:`Utente`,deviceName:`Nome del dispositivo`,howThisPhoneIsListed:`Come appare questo telefono nell'elenco, ad es. iPhone di Anna.`,annaSIphone:`iPhone di Anna`,enrollmentQrCode:`Codice QR di registrazione`,openTheCamstackAppOn:`Apri l'app CamStack sul telefono e inquadra questo codice. Funziona una sola volta.`,expiredCreateANewCode:`Scaduto: crea un nuovo codice`,expiresIn:`Scade tra {{label}}`,theHubCouldNotName:`L'hub non ha potuto indicare un indirizzo per questo link, quindi l'app deve già conoscerlo.`,newCode:`Nuovo codice`},queryBody:{couldNotRead:`Impossibile leggere {{what}}`,requestFailed:`Richiesta non riuscita`},nodesColumns:{served:`In uso`,unreadable:`Illeggibile`,notServed:`Non in uso`,noneRecorded:`Nessuno registrato`,offline:`Offline`,noPresentsAnother:`No: presenta un altro`,managedByTheHub:`Gestito dall'hub`,renewHttps:`Rinnova HTTPS`,renewTheCertificateOn:`Rinnova il certificato su {{nodeId}}`,renewing:`Rinnovo…`,renewIdentity:`Rinnova identità`,renewTheClusterCertificateOf:`Rinnova il certificato del cluster di {{nodeId}}`,revokeIdentity:`Revoca identità`,revokeTheClusterCertificateOf:`Revoca il certificato del cluster di {{nodeId}}`,node:`Nodo`,httpsExpires:`Scadenza HTTPS`,identity:`Identità`,identityExpires:`Scadenza identità`,inUse:`In uso`,actions:`Azioni`}},serverName:{title:`Dai un nome a questo server`,description:`Scegli un nome per questo hub. Compare nell’interfaccia di amministrazione e nella schermata di accesso delle app. Puoi cambiarlo più tardi nelle impostazioni di Sistema.`,label:`Nome del server`,later:`Più tardi`,invalid:`Nome non valido`}},$=`camstack_language`,ee=localStorage.getItem($)??`en`;X.use(e).init({resources:{en:{translation:Z},it:{translation:Q}},lng:ee,fallbackLng:`en`,interpolation:{escapeValue:!1}}),X.on(`languageChanged`,e=>{localStorage.setItem($,e)});var te=X;export{te as t};