* feat(protobufs): sync to firmware-current and consume workspace package Sync the vendored .proto sources to firmware-current (v2.7.25+48), regenerate the v2 TS bindings, and consume the workspace @meshtastic/protobufs (workspace:*) in place of the stale JSR 2.7.20 — finishing the monorepo migration (core was already workspace:*). Includes the one required breaking-change fix: admin nodedb_reset changed int32 to bool, so resetNodes() now sends value: true. * build(protobufs): vendor generated bindings for workspace consumers The package is consumed via workspace:* — its exports point at the TS source, which imports ./dist/meshtastic/*_pb.ts — so the generated output must exist at build time. CI builds web/core with no codegen step and the runners have no buf CLI, so the bindings are vendored here (kept gitignored; lint/format skip them). Regenerate with: pnpm --filter @meshtastic/protobufs gen * fix(protobufs): clean script removes the actual generated output dir buf writes bindings to packages/ts/dist, but clean was removing a non-existent root dist — so it never cleaned stale output. Addresses Copilot review feedback. * refactor: move web app packages/web -> apps/web Aligns the web app with the apps/web layout (matching the Vercel web-test Root Directory and the SDK-migration direction). Pure directory move plus root config: pnpm-workspace (adds apps/*), vitest projects, root tsconfig reference, and the pr/release-web/nightly workflows. vercel.json moved with the app. Build + 36 validation tests green. * feat: config fields, module pages, key verification, telemetry capture Incorporates the firmware-current feature work onto the protobuf foundation: new config fields (Display message bubbles; LoRa fem_lna_mode + serial_hal_only; Telemetry air_quality_screen_enabled); 4 new ModuleConfig pages (TrafficManagement, StatusMessage, TAK, RemoteHardware); the manual Key Verification flow (sendKeyVerification + ClientNotificationDialog stages + Verify Key button); live telemetry capture (nodeDB addDeviceMetrics) and admin hardening (toggleMutedNode, graceful PortNum default); plus the sdk-preview ConfigEditor demo and store/config tests. Build + lint + format + 131 tests green. * chore: drop #1062 (unsaved-change-detection) to match upstream revert #1062 was merged to main by accident (per @danditomaso) and is being reverted. Reverse-applied its diff here via 3-way so #1097 stays consistent with where main is headed, while keeping the feature changes layered on the same files (deviceStore/changeRegistry). Build + 131 tests + lint + format green. * fix(nodes): clean up SNR display in node table and map popup SNR is a ratio measured in dB, not dBm (which is absolute power); the node table and map popup both mislabeled it and crammed three values together: '0dBm/50%/50raw'. The trailing '%/raw' pair was the same heuristic ((snr+10)*5) shown twice — once clamped, once not. Render SNR in dB rounded to one decimal, color-coded by a 0-100% signal-quality heuristic (green/yellow/red), with the quality percentage as a muted secondary. Drop the redundant raw value. Adds unit.db; this matches the existing SNRTooltip, which already renders dB.
239 lines
10 KiB
JSON
239 lines
10 KiB
JSON
{
|
|
"deleteMessages": {
|
|
"description": "Questa azione cancellerà tutta la cronologia dei messaggi. Non può essere annullata. Sei sicuro di voler continuare?",
|
|
"title": "Cancella Tutti I Messaggi"
|
|
},
|
|
"import": {
|
|
"description": "La configurazione attuale di LoRa sarà sovrascritta.",
|
|
"error": {
|
|
"invalidUrl": "URL Meshtastic non valido"
|
|
},
|
|
"channelPrefix": "Canale: ",
|
|
"primary": "Primary ",
|
|
"doNotImport": "No not import",
|
|
"channelName": "Nome",
|
|
"channelSlot": "Slot",
|
|
"channelSetUrl": "URL del Set di Canali/Codice QR",
|
|
"useLoraConfig": "Import LoRa Config",
|
|
"presetDescription": "The current LoRa Config will be replaced.",
|
|
"title": "Importa Set Canale"
|
|
},
|
|
"locationResponse": {
|
|
"title": "Posizione: {{identifier}}",
|
|
"altitude": "Altitudine: ",
|
|
"coordinates": "Coordinate: ",
|
|
"noCoordinates": "No Coordinates"
|
|
},
|
|
"pkiRegenerateDialog": {
|
|
"title": "Rigenerare La Chiave Pre-Condivisa?",
|
|
"description": "Sei sicuro di voler rigenerare la chiave pre-condivisa?",
|
|
"regenerate": "Rigenera"
|
|
},
|
|
"addConnection": {
|
|
"title": "Add connection",
|
|
"description": "Choose a connection type and fill in the details",
|
|
"validation": {
|
|
"requiresWebBluetooth": "This connection type requires <0>Web Bluetooth</0>. Please use a supported browser, like Chrome or Edge.",
|
|
"requiresWebSerial": "This connection type requires <0>Web Serial</0>. Please use a supported browser, like Chrome or Edge.",
|
|
"requiresSecureContext": "Questa applicazione richiede un <0>contesto sicuro</0>. Si prega di connettersi utilizzando HTTPS o localhost.",
|
|
"additionallyRequiresSecureContext": "Inoltre, richiede un <0>contesto sicuro</0>. Si prega di connettersi utilizzando HTTPS o localhost."
|
|
},
|
|
"bluetoothConnection": {
|
|
"namePlaceholder": "My Bluetooth Node",
|
|
"supported": {
|
|
"title": "Web Bluetooth supported"
|
|
},
|
|
"notSupported": {
|
|
"title": "Web Bluetooth not supported",
|
|
"description": "Your browser or device does not support Web Bluetooth"
|
|
},
|
|
"short": "BT: {{deviceName}}",
|
|
"long": "Bluetooth Device",
|
|
"device": "Dispositivo",
|
|
"selectDevice": "Select device",
|
|
"selected": "Bluetooth device selected",
|
|
"notSelected": "No device selected",
|
|
"helperText": "Uses the Meshtastic Bluetooth service for discovery."
|
|
},
|
|
"serialConnection": {
|
|
"namePlaceholder": "My Serial Node",
|
|
"helperText": "Selecting a port grants permission so the app can open it to connect.",
|
|
"supported": {
|
|
"title": "Web Serial supported"
|
|
},
|
|
"notSupported": {
|
|
"title": "Web Serial not supported",
|
|
"description": "Your browser or device does not support Web Serial"
|
|
},
|
|
"portSelected": {
|
|
"title": "Serial port selected",
|
|
"description": "Port permissions granted."
|
|
},
|
|
"port": "Port",
|
|
"selectPort": "Select port",
|
|
"deviceName": "USB {{vendorId}}:{{productId}}",
|
|
"notSelected": "No port selected"
|
|
},
|
|
"httpConnection": {
|
|
"namePlaceholder": "My HTTP Node",
|
|
"inputPlaceholder": "192.168.1.10 or meshtastic.local",
|
|
"heading": "URL or IP",
|
|
"useHttps": "Use HTTPS",
|
|
"invalidUrl": {
|
|
"title": "Invalid URL",
|
|
"description": "Please enter a valid HTTP or HTTPS URL."
|
|
},
|
|
"connectionTest": {
|
|
"description": "Test the connetion before saving to verify the device is reachable.",
|
|
"button": {
|
|
"loading": "Testing...",
|
|
"label": "Test connection"
|
|
},
|
|
"reachable": "Reachable",
|
|
"notReachable": "Not reachable",
|
|
"success": {
|
|
"title": "Connection test successful",
|
|
"description": "The device appears to be reachable."
|
|
},
|
|
"failure": {
|
|
"title": "Connection test failed",
|
|
"description": "Could not reach the device. Check the URL and try again."
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"nodeDetails": {
|
|
"message": "Messaggio",
|
|
"requestPosition": "Richiedi posizione",
|
|
"traceRoute": "Trace Route",
|
|
"airTxUtilization": "Tempo di Trasmissione Utilizzato",
|
|
"allRawMetrics": "Tutte Le Metriche Grezze:",
|
|
"batteryLevel": "Livello batteria",
|
|
"channelUtilization": "Utilizzo Canale",
|
|
"details": "Dettagli:",
|
|
"deviceMetrics": "Metriche Dispositivo:",
|
|
"hardware": "Hardware: ",
|
|
"lastHeard": "Ultimo Contatto: ",
|
|
"nodeHexPrefix": "Node Hex: ",
|
|
"nodeNumber": "Numero Nodo: ",
|
|
"position": "Posizione:",
|
|
"role": "Ruolo: ",
|
|
"uptime": "Tempo di attività: ",
|
|
"voltage": "Tensione",
|
|
"title": "Dettagli nodo per {{identifier}}",
|
|
"ignoreNode": "Ignora nodo",
|
|
"removeNode": "Rimuovi Nodo",
|
|
"unignoreNode": "Non ignorare più nodo",
|
|
"security": "Security:",
|
|
"publicKey": "Public Key: ",
|
|
"messageable": "Messageable: ",
|
|
"KeyManuallyVerifiedTrue": "Public Key has been manually verified",
|
|
"KeyManuallyVerifiedFalse": "Public Key is not manually verified"
|
|
},
|
|
"pkiBackup": {
|
|
"loseKeysWarning": "Se perdi le tue chiavi, dovrai reimpostare il tuo dispositivo.",
|
|
"secureBackup": "È importante eseguire il backup delle chiavi pubbliche e private e memorizzare il backup in modo sicuro!",
|
|
"footer": "=== END OF KEYS ===",
|
|
"header": "=== MESHTASTIC KEYS FOR {{longName}} ({{shortName}}) ===",
|
|
"privateKey": "Chiave Privata:",
|
|
"publicKey": "Chiave Pubblica:",
|
|
"fileName": "meshtastic_keys_{{longName}}_{{shortName}}.txt",
|
|
"title": "Backup chiavi"
|
|
},
|
|
"pkiBackupReminder": {
|
|
"description": "Ti consigliamo di eseguire regolarmente il backup delle tue chiavi. Vuoi eseguire un backup?",
|
|
"title": "Backup Reminder",
|
|
"remindLaterPrefix": "Remind me in",
|
|
"remindNever": "Never remind me",
|
|
"backupNow": "Back up now"
|
|
},
|
|
"pkiRegenerate": {
|
|
"description": "Sei sicuro di voler rigenerare la coppia di chiavi?",
|
|
"title": "Rigenera Coppia Chiavi"
|
|
},
|
|
"qr": {
|
|
"addChannels": "Aggiungi canali",
|
|
"replaceChannels": "Sostituisci Canali",
|
|
"description": "Anche l'attuale configurazione di LoRa verrà condivisa.",
|
|
"sharableUrl": "URL Condivisibile",
|
|
"title": "Genera codice QR"
|
|
},
|
|
"reboot": {
|
|
"title": "Reboot device",
|
|
"description": "Reboot now or schedule a reboot of the connected node. Optionally, you can choose to reboot into OTA (Over-the-Air) mode.",
|
|
"ota": "Reboot into OTA mode",
|
|
"enterDelay": "Enter delay",
|
|
"scheduled": "Il riavvio è stato pianificato",
|
|
"schedule": "Schedule reboot",
|
|
"now": "Reboot now",
|
|
"cancel": "Cancel scheduled reboot"
|
|
},
|
|
"refreshKeys": {
|
|
"description": {
|
|
"acceptNewKeys": "Questo rimuoverà il nodo dal dispositivo e richiederà nuove chiavi.",
|
|
"keyMismatchReasonSuffix": ". Ciò è dovuto alla chiave pubblica corrente del nodo remoto che non corrisponde alla chiave precedentemente memorizzata per questo nodo.",
|
|
"unableToSendDmPrefix": "Il nodo non è in grado di inviare un messaggio diretto al nodo: "
|
|
},
|
|
"acceptNewKeys": "Accetta Nuove Chiavi",
|
|
"title": "Chiavi Non Corrispondenti - {{identifier}}"
|
|
},
|
|
"removeNode": {
|
|
"description": "Sei sicuro di voler rimuovere questo nodo?",
|
|
"title": "Rimuovi Nodo?"
|
|
},
|
|
"shutdown": {
|
|
"title": "Pianifica Spegnimento",
|
|
"description": "Spegni il nodo connesso dopo x minuti."
|
|
},
|
|
"traceRoute": {
|
|
"routeToDestination": "Percorso di destinazione:",
|
|
"routeBack": "Percorso indietro:"
|
|
},
|
|
"tracerouteResponse": {
|
|
"title": "Traceroute: {{identifier}}"
|
|
},
|
|
"unsafeRoles": {
|
|
"confirmUnderstanding": "Sì, so cosa sto facendo",
|
|
"conjunction": " e il blog post su ",
|
|
"postamble": " e capisco le implicazioni di un cambiamento di ruolo.",
|
|
"preamble": "Dichiaro di aver letto i ",
|
|
"choosingRightDeviceRole": "Scegliere il ruolo corretto del dispositivo",
|
|
"deviceRoleDocumentation": "Documentazione sul ruolo del dispositivo",
|
|
"title": "Sei sicuro?"
|
|
},
|
|
"managedMode": {
|
|
"confirmUnderstanding": "Sì, so cosa sto facendo",
|
|
"title": "Sei sicuro?",
|
|
"description": "Enabling Managed Mode blocks client applications (including the web client) from writing configurations to a radio. Once enabled, radio configurations can only be changed through Remote Admin messages. This setting is not required for remote node administration."
|
|
},
|
|
"clientNotification": {
|
|
"title": "Notifiche Client",
|
|
"TraceRoute can only be sent once every 30 seconds": "TraceRoute can only be sent once every 30 seconds",
|
|
"Compromised keys were detected and regenerated.": "Compromised keys were detected and regenerated."
|
|
},
|
|
"resetNodeDb": {
|
|
"title": "Reset Node Database",
|
|
"description": "This will clear all nodes from the connected device's node database and clear all message history in the client. This cannot be undone. Are you sure you want to continue?",
|
|
"confirm": "Reset Node Database",
|
|
"failedTitle": "There was an error resetting the Node DB. Please try again."
|
|
},
|
|
"clearAllStores": {
|
|
"title": "Clear All Local Storage",
|
|
"description": "This will clear all locally stored data, including message history and node databases for all previously connected devices. This will require you to reconnect to your node once complete and cannot be undone. Are you sure you want to continue?",
|
|
"confirm": "Clear all local storage",
|
|
"failedTitle": "There was an error clearing local storage. Please try again."
|
|
},
|
|
"factoryResetDevice": {
|
|
"title": "Factory reset dispositivo",
|
|
"description": "This will factory reset the connected device, erasing all configurations and data on the device as well as all nodes and messages saved in the client. This cannot be undone. Are you sure you want to continue?",
|
|
"confirm": "Factory reset dispositivo",
|
|
"failedTitle": "There was an error performing the factory reset. Please try again."
|
|
},
|
|
"factoryResetConfig": {
|
|
"title": "Factory reset impostazioni",
|
|
"description": "This will factory reset the configuration on the connected device, erasing all configurations on the device. This cannot be undone. Are you sure you want to continue?",
|
|
"confirm": "Factory reset impostazioni",
|
|
"failedTitle": "There was an error performing the factory reset. Please try again."
|
|
}
|
|
}
|