Enhance USB error handling and improve user feedback

- Updated the _friendlyErrorMessage method in UsbScreen to provide more user-friendly error messages based on specific PlatformException codes.
- Added localized error messages for various USB-related errors, improving clarity for users.
- Modified the UsbSerialService to rethrow exceptions instead of throwing StateError, allowing for better error propagation.
- Updated the usb_flow_test to reflect changes in the USB display label behavior, ensuring the test accurately describes the functionality.
This commit is contained in:
just_stuff_tm 2026-03-03 15:04:22 -05:00 committed by just-stuff-tm
parent 5b4535d5dc
commit 38d40ca0a4
34 changed files with 15499 additions and 15317 deletions

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,4 +1,4 @@
{
{
"@@locale": "en",
"appTitle": "MeshCore Open",
"nav_contacts": "Contacts",
@ -53,6 +53,18 @@
"usbScreenStatus": "Select a USB device",
"usbScreenNote": "USB serial is active on supported Android devices and desktop platforms.",
"usbScreenEmptyState": "No USB devices found. Plug one in and refresh.",
"usbErrorPermissionDenied": "USB permission was denied.",
"usbErrorDeviceMissing": "The selected USB device is no longer available.",
"usbErrorInvalidPort": "Select a valid USB device.",
"usbErrorBusy": "Another USB connection request is already in progress.",
"usbErrorNotConnected": "No USB device is connected.",
"usbErrorOpenFailed": "Failed to open the selected USB device.",
"usbErrorConnectFailed": "Failed to connect to the selected USB device.",
"usbErrorUnsupported": "USB serial is not supported on this platform.",
"usbErrorAlreadyActive": "A USB connection is already active.",
"usbErrorNoDeviceSelected": "No USB device was selected.",
"usbErrorPortClosed": "The USB connection is not open.",
"usbErrorConnectTimedOut": "Timed out waiting for the device to respond.",
"scanner_scanning": "Scanning for devices...",
"scanner_connecting": "Connecting...",
"scanner_disconnecting": "Disconnecting...",

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,4 +1,4 @@
{
{
"channels_channelDeleteFailed": "Impossibile eliminare il canale \"{name}\"",
"@channels_channelDeleteFailed": {
"placeholders": {
@ -35,7 +35,7 @@
"common_disable": "Disattivare",
"common_reboot": "Riavvia",
"common_loading": "Caricamento...",
"common_notAvailable": "—",
"common_notAvailable": "",
"common_voltageValue": "{volts} V",
"@common_voltageValue": {
"placeholders": {
@ -98,11 +98,11 @@
"settings_locationInvalid": "Latitudine o longitudine non valida.",
"settings_latitude": "Latitudine",
"settings_longitude": "Longitudine",
"settings_privacyMode": "Modalità Privacy",
"settings_privacyMode": "Modalità Privacy",
"settings_privacyModeSubtitle": "Nascondere nome/luogo negli annunci",
"settings_privacyModeToggle": "Attiva la modalità privacy per nascondere il tuo nome e la tua posizione negli annunci.",
"settings_privacyModeEnabled": "Modalità privacy abilitata",
"settings_privacyModeDisabled": "Modalità privacy disabilitata",
"settings_privacyModeToggle": "Attiva la modalità privacy per nascondere il tuo nome e la tua posizione negli annunci.",
"settings_privacyModeEnabled": "Modalità privacy abilitata",
"settings_privacyModeDisabled": "Modalità privacy disabilitata",
"settings_actions": "Azioni",
"settings_sendAdvertisement": "Invia Annuncio",
"settings_sendAdvertisementSubtitle": "Presenza trasmessa ora",
@ -165,18 +165,18 @@
"appSettings_language": "Lingua",
"appSettings_languageSystem": "Predefinito di sistema",
"appSettings_languageEn": "English",
"appSettings_languageFr": "Français",
"appSettings_languageEs": "Español",
"appSettings_languageFr": "Français",
"appSettings_languageEs": "Español",
"appSettings_languageDe": "Deutsch",
"appSettings_languagePl": "Polski",
"appSettings_languageSl": "Slovenščina",
"appSettings_languagePt": "Português",
"appSettings_languageSl": "Slovenščina",
"appSettings_languagePt": "Português",
"appSettings_languageIt": "Italiano",
"appSettings_languageZh": "中文",
"appSettings_languageZh": "中文",
"appSettings_languageSv": "Svenska",
"appSettings_languageNl": "Nederlands",
"appSettings_languageSk": "Slovenčina",
"appSettings_languageBg": "Български",
"appSettings_languageSk": "Slovenčina",
"appSettings_languageBg": "Български",
"appSettings_notifications": "Notifiche",
"appSettings_enableNotifications": "Abilita Notifiche",
"appSettings_enableNotificationsSubtitle": "Ricevi notifiche per messaggi e annunci",
@ -195,7 +195,7 @@
"appSettings_pathsWillBeCleared": "I percorsi verranno puliti dopo 5 tentativi falliti.",
"appSettings_pathsWillNotBeCleared": "I percorsi non verranno eliminati automaticamente.",
"appSettings_autoRouteRotation": "Rotazione Percorso Automatico",
"appSettings_autoRouteRotationSubtitle": "Alterna tra i percorsi migliori e la modalità alluvione",
"appSettings_autoRouteRotationSubtitle": "Alterna tra i percorsi migliori e la modalità alluvione",
"appSettings_autoRouteRotationEnabled": "Rotazione percorso automatico abilitata",
"appSettings_autoRouteRotationDisabled": "Rotazione del percorso automatico disabilitata",
"appSettings_battery": "Batteria",
@ -284,8 +284,8 @@
},
"contacts_newGroup": "Nuovo Gruppo",
"contacts_groupName": "Nome gruppo",
"contacts_groupNameRequired": "Il nome del gruppo è obbligatorio.",
"contacts_groupAlreadyExists": "Il gruppo \"{name}\" esiste già.",
"contacts_groupNameRequired": "Il nome del gruppo è obbligatorio.",
"contacts_groupAlreadyExists": "Il gruppo \"{name}\" esiste già.",
"@contacts_groupAlreadyExists": {
"placeholders": {
"name": {
@ -345,7 +345,7 @@
"channels_muteChannel": "Silenzia canale",
"channels_unmuteChannel": "Attiva notifiche canale",
"channels_deleteChannel": "Elimina canale",
"channels_deleteChannelConfirm": "Eliminare \"{name}\"? Non può essere annullato.",
"channels_deleteChannelConfirm": "Eliminare \"{name}\"? Non può essere annullato.",
"@channels_deleteChannelConfirm": {
"placeholders": {
"name": {
@ -477,7 +477,7 @@
"debugLog_enableInSettings": "Abilita il logging di debug dell'app nelle impostazioni",
"debugLog_frames": "Frame",
"debugLog_rawLogRx": "Log Raw-RX",
"debugLog_noBleActivity": "Nessuna attività BLE rilevata ancora.",
"debugLog_noBleActivity": "Nessuna attività BLE rilevata ancora.",
"debugFrame_length": "Lunghezza del Frame: {count} byte",
"@debugFrame_length": {
"placeholders": {
@ -542,11 +542,11 @@
},
"debugFrame_hexDump": "Dumpa Esadecimale:",
"chat_pathManagement": "Gestione Percorsi",
"chat_routingMode": "Modalità di routing",
"chat_routingMode": "Modalità di routing",
"chat_autoUseSavedPath": "Utilizza il percorso salvato",
"chat_forceFloodMode": "Modalità Inondamento Forzato",
"chat_forceFloodMode": "Modalità Inondamento Forzato",
"chat_recentAckPaths": "Percorsi ACK Recenti (tocca per usare):",
"chat_pathHistoryFull": "La cronologia del percorso è piena. Rimuovi gli elementi per aggiungere nuovi.",
"chat_pathHistoryFull": "La cronologia del percorso è piena. Rimuovi gli elementi per aggiungere nuovi.",
"chat_hopSingular": "salta",
"chat_hopPlural": "salta",
"chat_hopsCount": "{count} {count, plural, =1{salto} other{salti}}",
@ -559,15 +559,15 @@
},
"chat_successes": "successi",
"chat_removePath": "Rimuovi percorso",
"chat_noPathHistoryYet": "Non c'è ancora una cronologia del percorso.\nInvia un messaggio per scoprire i percorsi.",
"chat_noPathHistoryYet": "Non c'è ancora una cronologia del percorso.\nInvia un messaggio per scoprire i percorsi.",
"chat_pathActions": "Azioni Percorso:",
"chat_setCustomPath": "Imposta Percorso Personalizzato",
"chat_setCustomPathSubtitle": "Specifica manualmente il percorso di routing",
"chat_clearPath": "Cancella Percorso",
"chat_clearPathSubtitle": "Riprova la scoperta alla prossima invio",
"chat_pathCleared": "Percorso sgomberato. Il prossimo messaggio riidentifierà il percorso.",
"chat_pathCleared": "Percorso sgomberato. Il prossimo messaggio riidentifierà il percorso.",
"chat_floodModeSubtitle": "Utilizza l'interruttore di routing nella barra delle applicazioni",
"chat_floodModeEnabled": "Modalità alluvione abilitata. Disattivala tramite l'icona di routing nella barra in alto.",
"chat_floodModeEnabled": "Modalità alluvione abilitata. Disattivala tramite l'icona di routing nella barra in alto.",
"chat_fullPath": "Percorso Completo",
"chat_pathDetailsNotAvailable": "I dettagli del percorso non sono ancora disponibili. Prova a inviare un messaggio per ricaricare.",
"chat_pathSetHops": "Percorso impostato: {hopCount} {hopCount, plural, =1{hop} other{hops}} - {status}",
@ -660,7 +660,7 @@
"map_sendToChannel": "Invia al canale",
"map_noChannelsAvailable": "Nessun canale disponibile",
"map_publicLocationShare": "Condividi in una posizione pubblica",
"map_publicLocationShareConfirm": "Stai per condividere una posizione in {channelLabel}. Questo canale è pubblico e chiunque abbia la PSK può vederlo.",
"map_publicLocationShareConfirm": "Stai per condividere una posizione in {channelLabel}. Questo canale è pubblico e chiunque abbia la PSK può vederlo.",
"@map_publicLocationShareConfirm": {
"placeholders": {
"channelLabel": {
@ -810,13 +810,13 @@
"login_password": "Password",
"login_enterPassword": "Inserisci password",
"login_savePassword": "Salva password",
"login_savePasswordSubtitle": "La password verrà memorizzata in modo sicuro su questo dispositivo.",
"login_savePasswordSubtitle": "La password verrà memorizzata in modo sicuro su questo dispositivo.",
"login_repeaterDescription": "Inserisci la password del ripetitore per accedere alle impostazioni e allo stato.",
"login_roomDescription": "Inserisci la password della stanza per accedere alle impostazioni e allo stato.",
"login_routing": "Instradamento",
"login_routingMode": "Modalità di routing",
"login_routingMode": "Modalità di routing",
"login_autoUseSavedPath": "Utilizza il percorso salvato",
"login_forceFloodMode": "Modalità Inondamento Forzato",
"login_forceFloodMode": "Modalità Inondamento Forzato",
"login_managePaths": "Gestisci Percorsi",
"login_login": "Accedi",
"login_attempt": "Prova {current}/{max}",
@ -838,7 +838,7 @@
}
}
},
"login_failedMessage": "Accesso fallito. La password non è corretta oppure il ripetitore non è raggiungibile.",
"login_failedMessage": "Accesso fallito. La password non è corretta oppure il ripetitore non è raggiungibile.",
"common_reload": "Ricaricare",
"common_clear": "Cancella",
"path_currentPath": "Percorso corrente: {path}",
@ -862,7 +862,7 @@
"path_hexPrefixInstructions": "Inserire i prefissi esadecimali a 2 caratteri per ogni salto, separati da virgole.",
"path_hexPrefixExample": "Esempio: A1,F2,3C (ogni nodo utilizza il primo byte della sua chiave pubblica)",
"path_labelHexPrefixes": "Prefisso esadecimale (percorso)",
"path_helperMaxHops": "Massimo 64 salti. Ogni prefisso è composto da 2 caratteri esadecimali (1 byte)",
"path_helperMaxHops": "Massimo 64 salti. Ogni prefisso è composto da 2 caratteri esadecimali (1 byte)",
"path_selectFromContacts": "Seleziona da contatti:",
"path_noRepeatersFound": "Non sono stati trovati ripetitori o server di stanza.",
"path_customPathsRequire": "I percorsi personalizzati richiedono salti intermedi che possono inoltrare messaggi.",
@ -874,7 +874,7 @@
}
}
},
"path_tooLong": "Il percorso è troppo lungo. Massimo 64 salti consentiti.",
"path_tooLong": "Il percorso è troppo lungo. Massimo 64 salti consentiti.",
"path_setPath": "Imposta Percorso",
"repeater_management": "Gestione Ripetitori",
"repeater_managementTools": "Strumenti di Gestione",
@ -887,9 +887,9 @@
"repeater_settings": "Impostazioni",
"repeater_settingsSubtitle": "Configura i parametri del ripetitore",
"repeater_statusTitle": "Stato del Ripetitore",
"repeater_routingMode": "Modalità di routing",
"repeater_routingMode": "Modalità di routing",
"repeater_autoUseSavedPath": "Percorso salvato automatico",
"repeater_forceFloodMode": "Modalità Inondamento Forzato",
"repeater_forceFloodMode": "Modalità Inondamento Forzato",
"repeater_pathManagement": "Gestione dei percorsi",
"repeater_refresh": "Aggiorna",
"repeater_statusRequestTimeout": "Richiesta stato scaduta.",
@ -904,7 +904,7 @@
"repeater_systemInformation": "Informazioni di sistema",
"repeater_battery": "Batteria",
"repeater_clockAtLogin": "Orologio (all'accesso)",
"repeater_uptime": "Disponibilità",
"repeater_uptime": "Disponibilità",
"repeater_queueLength": "Lunghezza della coda",
"repeater_debugFlags": "Impostazioni Debug",
"repeater_radioStatistics": "Statistiche Radio",
@ -1007,10 +1007,10 @@
"repeater_packetForwardingSubtitle": "Abilita il ripetitore per inoltrare i pacchetti",
"repeater_guestAccess": "Accesso Ospite",
"repeater_guestAccessSubtitle": "Consenti l'accesso ospite in sola lettura",
"repeater_privacyMode": "Modalità Privacy",
"repeater_privacyMode": "Modalità Privacy",
"repeater_privacyModeSubtitle": "Nascondere nome/luogo negli annunci",
"repeater_advertisementSettings": "Impostazioni Annuncio",
"repeater_localAdvertInterval": "Intervallo Pubblicità Locale",
"repeater_localAdvertInterval": "Intervallo Pubblicità Locale",
"repeater_localAdvertIntervalMinutes": "{minutes} minuti",
"@repeater_localAdvertIntervalMinutes": {
"placeholders": {
@ -1019,7 +1019,7 @@
}
}
},
"repeater_floodAdvertInterval": "Intervallo Pubblicità Inondazione",
"repeater_floodAdvertInterval": "Intervallo Pubblicità Inondazione",
"repeater_floodAdvertIntervalHours": "{hours} ore",
"@repeater_floodAdvertIntervalHours": {
"placeholders": {
@ -1033,13 +1033,13 @@
"repeater_rebootRepeater": "Riavvia Ripetitore",
"repeater_rebootRepeaterSubtitle": "Riavvia il dispositivo ripetitore",
"repeater_rebootRepeaterConfirm": "Sei sicuro di voler riavviare questo ripetitore?",
"repeater_regenerateIdentityKey": "Rigenera Chiave Identità",
"repeater_regenerateIdentityKey": "Rigenera Chiave Identità",
"repeater_regenerateIdentityKeySubtitle": "Genera una nuova coppia di chiavi pubblica/privata",
"repeater_regenerateIdentityKeyConfirm": "Questo genererà una nuova identità per il ripetitore. Procedere?",
"repeater_regenerateIdentityKeyConfirm": "Questo genererà una nuova identità per il ripetitore. Procedere?",
"repeater_eraseFileSystem": "Elimina File System",
"repeater_eraseFileSystemSubtitle": "Formatta il file system del ripetitore",
"repeater_eraseFileSystemConfirm": "ATTENZIONE: Ciò cancellerà tutti i dati sul ripetitore. Non può essere annullato!",
"repeater_eraseSerialOnly": "Elimina è disponibile solo tramite console seriale.",
"repeater_eraseFileSystemConfirm": "ATTENZIONE: Ciò cancellerà tutti i dati sul ripetitore. Non può essere annullato!",
"repeater_eraseSerialOnly": "Elimina è disponibile solo tramite console seriale.",
"repeater_commandSent": "Comando inviato: {command}",
"@repeater_commandSent": {
"placeholders": {
@ -1072,7 +1072,7 @@
"repeater_refreshLocationSettings": "Aggiorna le Impostazioni della Posizione",
"repeater_refreshPacketForwarding": "Aggiorna il inoltro pacchetti",
"repeater_refreshGuestAccess": "Aggiorna Accesso Ospite",
"repeater_refreshPrivacyMode": "Aggiorna Modalità Privacy",
"repeater_refreshPrivacyMode": "Aggiorna Modalità Privacy",
"repeater_refreshAdvertisementSettings": "Aggiorna le Impostazioni dell'Annuncio",
"repeater_refreshed": "{label} aggiornato",
"@repeater_refreshed": {
@ -1117,7 +1117,7 @@
"repeater_cliQuickAdvertise": "Pubblicare",
"repeater_cliQuickClock": "Orologio",
"repeater_cliHelpAdvert": "Invia un pacchetto pubblicitario",
"repeater_cliHelpReboot": "Riavvia il dispositivo. (nota, potresti ottenere 'Timeout' che è normale)",
"repeater_cliHelpReboot": "Riavvia il dispositivo. (nota, potresti ottenere 'Timeout' che è normale)",
"repeater_cliHelpClock": "Mostra l'ora corrente per l'orologio di ciascun dispositivo.",
"repeater_cliHelpPassword": "Imposta una nuova password di amministratore per il dispositivo.",
"repeater_cliHelpVersion": "Mostra la versione del dispositivo e la data di costruzione del firmware.",
@ -1125,12 +1125,12 @@
"repeater_cliHelpSetAf": "Imposta il fattore di tempo di trasmissione.",
"repeater_cliHelpSetTx": "Imposta la potenza di trasmissione LoRa in dBm (riavvia per applicare).",
"repeater_cliHelpSetRepeat": "Abilita o disabilita il ruolo del ripetitore per questo nodo.",
"repeater_cliHelpSetAllowReadOnly": "(Server della stanza) Se 'on', allora l'accesso con una password vuota sarà consentito, ma non sarà possibile pubblicare nella stanza. (solo lettura).",
"repeater_cliHelpSetAllowReadOnly": "(Server della stanza) Se 'on', allora l'accesso con una password vuota sarà consentito, ma non sarà possibile pubblicare nella stanza. (solo lettura).",
"repeater_cliHelpSetFloodMax": "Imposta il numero massimo di salti per i pacchetti di inondazione in entrata (se >= max, il pacchetto non viene inoltrato)",
"repeater_cliHelpSetIntThresh": "Imposta il Limite di Interferenza (in dB). Il valore predefinito è 14. Imposta su 0 per disabilitare il rilevamento delle interferenze del canale.",
"repeater_cliHelpSetIntThresh": "Imposta il Limite di Interferenza (in dB). Il valore predefinito è 14. Imposta su 0 per disabilitare il rilevamento delle interferenze del canale.",
"repeater_cliHelpSetAgcResetInterval": "Imposta l'intervallo per resettare il controllore Automatico del Guadagno. Imposta su 0 per disabilitare.",
"repeater_cliHelpSetMultiAcks": "Abilita o disabilita la funzione 'double ACKs'.",
"repeater_cliHelpSetAdvertInterval": "Imposta l'intervallo del timer in minuti per inviare un pacchetto di pubblicità locale (senza salto). Imposta su 0 per disabilitare.",
"repeater_cliHelpSetAdvertInterval": "Imposta l'intervallo del timer in minuti per inviare un pacchetto di pubblicità locale (senza salto). Imposta su 0 per disabilitare.",
"repeater_cliHelpSetFloodAdvertInterval": "Imposta l'intervallo del timer in ore per inviare un pacchetto pubblicitario di massa. Imposta su 0 per disabilitare.",
"repeater_cliHelpSetGuestPassword": "Imposta/aggiorna la password dell'ospite. (per ripetitori, gli accessi degli ospiti possono inviare la richiesta \"Get Stats\")",
"repeater_cliHelpSetName": "Imposta il nome dell'annuncio.",
@ -1138,33 +1138,33 @@
"repeater_cliHelpSetLon": "Imposta la longitudine della mappa pubblicitaria. (gradi decimali)",
"repeater_cliHelpSetRadio": "Imposta completamente nuovi parametri radio e li salva nelle preferenze. Richiede un comando \"reboot\" per l'applicazione.",
"repeater_cliHelpSetRxDelay": "Impostazioni (experimental) base (deve essere > 1 per l'effetto) per applicare un leggero ritardo ai pacchetti ricevuti, in base alla forza del segnale/punteggio. Imposta a 0 per disabilitare.",
"repeater_cliHelpSetTxDelay": "Imposta un fattore moltiplicato con il tempo di mantenimento per un pacchetto di modalità allagamento e con un sistema di slot casuale, per ritardarne la trasmissione (per diminuire la probabilità di collisioni).",
"repeater_cliHelpSetDirectTxDelay": "Uguale a txdelay, ma per applicare un ritardo casuale alla inoltrata di pacchetti in modalità diretta.",
"repeater_cliHelpSetTxDelay": "Imposta un fattore moltiplicato con il tempo di mantenimento per un pacchetto di modalità allagamento e con un sistema di slot casuale, per ritardarne la trasmissione (per diminuire la probabilità di collisioni).",
"repeater_cliHelpSetDirectTxDelay": "Uguale a txdelay, ma per applicare un ritardo casuale alla inoltrata di pacchetti in modalità diretta.",
"repeater_cliHelpSetBridgeEnabled": "Abilita/Disabilita ponte.",
"repeater_cliHelpSetBridgeDelay": "Imposta il ritardo prima di ritrasmettere i pacchetti.",
"repeater_cliHelpSetBridgeSource": "Scegliere se il ponte dovrà ritrasmettere i pacchetti ricevuti o i pacchetti trasmessi.",
"repeater_cliHelpSetBridgeBaud": "Imposta la velocità di trasmissione per i ponti rs232.",
"repeater_cliHelpSetBridgeSource": "Scegliere se il ponte dovrà ritrasmettere i pacchetti ricevuti o i pacchetti trasmessi.",
"repeater_cliHelpSetBridgeBaud": "Imposta la velocità di trasmissione per i ponti rs232.",
"repeater_cliHelpSetBridgeSecret": "Imposta il segreto per i ponti espnow.",
"repeater_cliHelpSetAdcMultiplier": "Imposta un fattore personalizzato per regolare la tensione della batteria riportata (supportato solo su schede selezionate).",
"repeater_cliHelpTempRadio": "Imposta parametri radio temporanei per il numero specificato di minuti, per poi tornare ai parametri radio originali. (non salva nelle preferenze).",
"repeater_cliHelpSetPerm": "Modifica l'ACL. Rimuove l'entrata corrispondente (per prefisso di pubkey) se \"permissions\" è zero. Aggiunge una nuova entrata se il pubkey-hex ha lunghezza completa e non è attualmente nell'ACL. Aggiorna l'entrata per corrispondenza del prefisso di pubkey. I bit di permesso variano per ogni ruolo di firmware, ma i primi 2 bit sono: 0 (Guest), 1 (solo lettura), 2 (lettura/scrittura), 3 (Admin)",
"repeater_cliHelpSetPerm": "Modifica l'ACL. Rimuove l'entrata corrispondente (per prefisso di pubkey) se \"permissions\" è zero. Aggiunge una nuova entrata se il pubkey-hex ha lunghezza completa e non è attualmente nell'ACL. Aggiorna l'entrata per corrispondenza del prefisso di pubkey. I bit di permesso variano per ogni ruolo di firmware, ma i primi 2 bit sono: 0 (Guest), 1 (solo lettura), 2 (lettura/scrittura), 3 (Admin)",
"repeater_cliHelpGetBridgeType": "Ottiene tipo ponte nessuno, rs232, espnow",
"repeater_cliHelpLogStart": "Avvia registrazione pacchetti nel file system.",
"repeater_cliHelpLogStop": "Interrompi la registrazione dei pacchetti al file system.",
"repeater_cliHelpLogErase": "Elimina i log del pacchetto dal file system.",
"repeater_cliHelpNeighbors": "Mostra un elenco di altri nodi repeater ricevuti tramite annunci zero-hop. Ogni riga è id-prefisso-esadecimale:timestamp:snr-volte-4",
"repeater_cliHelpNeighbors": "Mostra un elenco di altri nodi repeater ricevuti tramite annunci zero-hop. Ogni riga è id-prefisso-esadecimale:timestamp:snr-volte-4",
"repeater_cliHelpNeighborRemove": "Rimuove la prima corrispondenza in base al prefisso (esadecimale) della pubkey, dalla lista dei vicini.",
"repeater_cliHelpRegion": "(solo serie) Elenca tutte le regioni definite e le autorizzazioni di allagamento correnti.",
"repeater_cliHelpRegionLoad": "NOTA: questo è un'invocazione multi-comando speciale. Ogni comando successivo è un nome di regione (indentato con spazi per indicare la gerarchia parentale, con almeno uno spazio). Terminata inviando una riga vuota/comando.",
"repeater_cliHelpRegionLoad": "NOTA: questo è un'invocazione multi-comando speciale. Ogni comando successivo è un nome di regione (indentato con spazi per indicare la gerarchia parentale, con almeno uno spazio). Terminata inviando una riga vuota/comando.",
"repeater_cliHelpRegionGet": "Cerca la regione con il prefisso del nome dato (o \"\" per l'ambito globale). Risponde con \"-> nome-regione (nome-genitore) 'F'\"",
"repeater_cliHelpRegionPut": "Aggiunge o aggiorna una definizione di regione con il nome specificato.",
"repeater_cliHelpRegionRemove": "Rimuove una definizione di regione con il dato nome. (deve corrispondere esattamente e non avere regioni figlio)",
"repeater_cliHelpRegionAllowf": "Imposta il permesso di 'F'lood per la regione specificata. ('' per lo scope globale/legacy)",
"repeater_cliHelpRegionDenyf": "Rimuove il permesso 'F'lood per la regione specificata. (NOTA: a questo stadio non è consigliato utilizzarlo sullo scope globale/legacy!!).",
"repeater_cliHelpRegionDenyf": "Rimuove il permesso 'F'lood per la regione specificata. (NOTA: a questo stadio non è consigliato utilizzarlo sullo scope globale/legacy!!).",
"repeater_cliHelpRegionHome": "Risposte con la regione 'home' corrente. (Nota applicata finora, riservata per il futuro)",
"repeater_cliHelpRegionHomeSet": "Imposta la regione 'home'.",
"repeater_cliHelpRegionSave": "Persiste l'elenco/mappa delle regioni all'archiviazione.",
"repeater_cliHelpGps": "Mostra lo stato del GPS. Quando il GPS è spento, risponde solo \"spento\", se è acceso risponde con \"acceso\", \"stato\", \"fix\" e numero di satelliti.",
"repeater_cliHelpGps": "Mostra lo stato del GPS. Quando il GPS è spento, risponde solo \"spento\", se è acceso risponde con \"acceso\", \"stato\", \"fix\" e numero di satelliti.",
"repeater_cliHelpGpsOnOff": "Attiva/disattiva l'alimentazione del GPS.",
"repeater_cliHelpGpsSync": "Sincronizza l'orario del nodo con l'orologio GPS.",
"repeater_cliHelpGpsSetLoc": "Imposta la posizione del nodo alle coordinate GPS e salva le preferenze.",
@ -1180,7 +1180,7 @@
"repeater_regionManagementRepeaterOnly": "Gestione Regione (solo Ripetitore)",
"repeater_regionNote": "Sono state introdotte le comandi di regione per gestire le definizioni e le autorizzazioni delle regioni.",
"repeater_gpsManagement": "Gestione GPS",
"repeater_gpsNote": "è stata introdotta una funzione gps per gestire le tematiche relative alla posizione.",
"repeater_gpsNote": "è stata introdotta una funzione gps per gestire le tematiche relative alla posizione.",
"telemetry_receivedData": "Dati Telemetria Ricevuti",
"telemetry_requestTimeout": "Richiesta di telemetria scaduta.",
"telemetry_errorLoading": "Errore nel caricamento della telemetria: {error}",
@ -1232,7 +1232,7 @@
}
}
},
"telemetry_temperatureValue": "{celsius}°C / {fahrenheit}°F",
"telemetry_temperatureValue": "{celsius}°C / {fahrenheit}°F",
"@telemetry_temperatureValue": {
"placeholders": {
"celsius": {
@ -1254,7 +1254,7 @@
"channelPath_repeatsLabel": "Ripeti",
"channelPath_pathLabel": "Percorso {index}",
"channelPath_observedLabel": "Osservato",
"channelPath_observedPathTitle": "Percorso osservato {index} • {hops}",
"channelPath_observedPathTitle": "Percorso osservato {index} {hops}",
"@channelPath_observedPathTitle": {
"placeholders": {
"index": {
@ -1329,7 +1329,7 @@
},
"channelPath_pathLabelTitle": "Percorso",
"channelPath_observedPathHeader": "Percorso Osservato",
"channelPath_selectedPathLabel": "{label} • {prefixes}",
"channelPath_selectedPathLabel": "{label} {prefixes}",
"@channelPath_selectedPathLabel": {
"placeholders": {
"label": {
@ -1373,11 +1373,11 @@
"channels_joinPrivateChannel": "Unisciti a un Canale Privato",
"channels_joinPrivateChannelDesc": "Inserire manualmente una chiave segreta.",
"channels_joinPublicChannel": "Unisciti al Canale Pubblico",
"channels_joinPublicChannelDesc": "Chiunque può unirsi a questo canale.",
"channels_joinPublicChannelDesc": "Chiunque può unirsi a questo canale.",
"channels_joinHashtagChannel": "Unisciti a un Canale con Hashtag",
"channels_joinHashtagChannelDesc": "Chiunque può unirsi ai canali hashtag.",
"channels_joinHashtagChannelDesc": "Chiunque può unirsi ai canali hashtag.",
"channels_scanQrCode": "Scansiona un codice QR",
"channels_scanQrCodeComingSoon": "Arriverà presto",
"channels_scanQrCodeComingSoon": "Arriverà presto",
"channels_enterHashtag": "Inserisci hashtag",
"channels_hashtagHint": "es. #team",
"@neighbors_unknownContact": {
@ -1459,35 +1459,35 @@
}
},
"common_ok": "OK",
"community_title": "Comunità",
"community_create": "Crea Comunità",
"community_createDesc": "Crea una nuova comunità e condividila tramite codice QR.",
"community_title": "Comunità",
"community_create": "Crea Comunità",
"community_createDesc": "Crea una nuova comunità e condividila tramite codice QR.",
"community_join": "Unisciti",
"community_joinTitle": "Unisciti alla Community",
"community_joinConfirmation": "Vuoi unirti alla community \"{name}\"?",
"community_scanQr": "Scansiona il QR Code della Community",
"community_scanInstructions": "Punta la fotocamera su un codice QR della comunità",
"community_scanInstructions": "Punta la fotocamera su un codice QR della comunità",
"community_showQr": "Mostra il codice QR",
"community_publicChannel": "Comunità Pubblica",
"community_hashtagChannel": "Hashtag della Comunità",
"community_name": "Nome della Comunità",
"community_enterName": "Inserisci il nome della comunità",
"community_created": "Comunità \"{name}\" creata",
"community_joined": "Unito alla comunità \"{name}\"",
"community_qrTitle": "Condividi Comunità",
"community_publicChannel": "Comunità Pubblica",
"community_hashtagChannel": "Hashtag della Comunità",
"community_name": "Nome della Comunità",
"community_enterName": "Inserisci il nome della comunità",
"community_created": "Comunità \"{name}\" creata",
"community_joined": "Unito alla comunità \"{name}\"",
"community_qrTitle": "Condividi Comunità",
"community_qrInstructions": "Scansiona questo codice QR per unirti a {name}",
"community_hashtagPrivacyHint": "I canali hashtag della community sono accessibili solo ai membri della community",
"community_invalidQrCode": "Codice QR della community non valido",
"community_alreadyMember": "Già membro",
"community_alreadyMemberMessage": "Sei già un membro di \"{name}\".",
"community_addPublicChannel": "Aggiungi Canale Pubblico della Comunità",
"community_alreadyMember": "Già membro",
"community_alreadyMemberMessage": "Sei già un membro di \"{name}\".",
"community_addPublicChannel": "Aggiungi Canale Pubblico della Comunità",
"community_addPublicChannelHint": "Aggiungi automaticamente il canale pubblico per questa community",
"community_noCommunities": "Nessun gruppo aggiunto finora",
"community_scanOrCreate": "Scansiona un codice QR o crea una community per iniziare.",
"community_manageCommunities": "Gestisci Comunità",
"community_delete": "Lascia la Comunità",
"community_manageCommunities": "Gestisci Comunità",
"community_delete": "Lascia la Comunità",
"community_deleteConfirm": "Uscire da \"{name}\"?",
"community_deleteChannelsWarning": "Questo eliminerà anche {count} canale/i e i loro messaggi.",
"community_deleteChannelsWarning": "Questo eliminerà anche {count} canale/i e i loro messaggi.",
"@community_deleteChannelsWarning": {
"placeholders": {
"count": {
@ -1495,14 +1495,14 @@
}
}
},
"community_deleted": "Hai lasciato la comunità \"{name}\"",
"community_deleted": "Hai lasciato la comunità \"{name}\"",
"community_addHashtagChannel": "Aggiungi Hashtag della Community",
"community_addHashtagChannelDesc": "Aggiungi un canale con hashtag per questa community",
"community_selectCommunity": "Seleziona Comunità",
"community_selectCommunity": "Seleziona Comunità",
"community_regularHashtag": "Hashtag regolare",
"community_regularHashtagDesc": "Hashtag pubblico (chiunque può unirsi)",
"community_communityHashtag": "Hashtag della Comunità",
"community_communityHashtagDesc": "Visibile solo ai membri della comunità",
"community_regularHashtagDesc": "Hashtag pubblico (chiunque può unirsi)",
"community_communityHashtag": "Hashtag della Comunità",
"community_communityHashtagDesc": "Visibile solo ai membri della comunità",
"community_forCommunity": "Per {name}",
"@community_regenerateSecretConfirm": {
"placeholders": {
@ -1567,16 +1567,16 @@
"contacts_floodAdvert": "Annuncio alluvionale",
"contacts_copyAdvertToClipboard": "Copia Annuncio negli Appunti",
"contacts_addContactFromClipboard": "Aggiungere contatto dalla clipboard",
"contacts_clipboardEmpty": "La clipboard è vuota.",
"contacts_clipboardEmpty": "La clipboard è vuota.",
"contacts_ShareContact": "Copia contatto negli Appunti",
"contacts_contactImported": "Il contatto è stato importato.",
"contacts_contactImported": "Il contatto è stato importato.",
"contacts_contactImportFailed": "Contatto non importato con successo.",
"contacts_zeroHopContactAdvertSent": "Inviato contatto tramite annuncio.",
"contacts_contactAdvertCopyFailed": "Copia dell'annuncio nella Clipboard non riuscita.",
"contacts_ShareContactZeroHop": "Condividi contatto tramite annuncio",
"contacts_zeroHopContactAdvertFailed": "Invio del contatto non riuscito.",
"contacts_contactAdvertCopied": "Annuncio copiato negli Appunti.",
"notification_activityTitle": "Attività MeshCore",
"notification_activityTitle": "Attività MeshCore",
"notification_messagesCount": "{count} {count, plural, =1{messaggio} other{messaggi}}",
"notification_channelMessagesCount": "{count} {count, plural, =1{messaggio del canale} other{messaggi del canale}}",
"notification_newNodesCount": "{count} {count, plural, =1{nuovo nodo} other{nuovi nodi}}",
@ -1587,7 +1587,7 @@
"settings_gpxExportSuccess": "Esportazione del file GPX completata con successo.",
"settings_gpxExportNoContacts": "Nessun contatto da esportare.",
"settings_gpxExportNotAvailable": "Non supportato sul tuo dispositivo/Sistema Operativo",
"settings_gpxExportError": "Si è verificato un errore durante l'esportazione.",
"settings_gpxExportError": "Si è verificato un errore durante l'esportazione.",
"settings_gpxExportRepeatersSubtitle": "Esporta ripetitori / roomserver con una posizione in un file GPX.",
"settings_gpxExportContactsSubtitle": "Esporta i compagni con una posizione in un file GPX.",
"settings_gpxExportAll": "Esporta tutti i contatti in GPX",
@ -1597,13 +1597,13 @@
"settings_gpxExportAllContacts": "Tutte le posizioni dei contatti",
"settings_gpxExportShareText": "Dati mappa esportati da meshcore-open",
"settings_gpxExportShareSubject": "meshcore-open esportazione dati mappa GPX",
"pathTrace_someHopsNoLocation": "Uno o più dei luppoli mancano di una posizione!",
"pathTrace_someHopsNoLocation": "Uno o più dei luppoli mancano di una posizione!",
"map_removeLast": "Rimuovi ultimo",
"map_pathTraceCancelled": "Tracciamento del percorso annullato.",
"pathTrace_clearTooltip": "Pulisci percorso",
"map_runTrace": "Esegui Path Trace",
"map_tapToAdd": "Tocca i nodi per aggiungerli al percorso.",
"scanner_bluetoothOff": "Il Bluetooth è disattivato.",
"scanner_bluetoothOff": "Il Bluetooth è disattivato.",
"scanner_bluetoothOffMessage": "Si prega di attivare il Bluetooth per effettuare la scansione dei dispositivi.",
"scanner_chromeRequired": "Browser Chrome richiesto",
"scanner_chromeRequiredMessage": "Questa applicazione web richiede Google Chrome o un browser basato su Chromium per il supporto Bluetooth.",
@ -1612,10 +1612,10 @@
"snrIndicator_lastSeen": "Ultimo accesso",
"chat_ShowAllPaths": "Mostra tutti i percorsi",
"settings_clientRepeat": "Ripetizione \"fuori dalla rete\"",
"settings_clientRepeatFreqWarning": "Per la comunicazione fuori rete, è necessario utilizzare frequenze di 433, 869 o 918 MHz.",
"settings_clientRepeatFreqWarning": "Per la comunicazione fuori rete, è necessario utilizzare frequenze di 433, 869 o 918 MHz.",
"settings_clientRepeatSubtitle": "Permetti a questo dispositivo di ripetere i pacchetti di rete per gli altri.",
"settings_aboutOpenMeteoAttribution": "Dati di elevazione LOS: Open-Meteo (CC BY 4.0)",
"appSettings_unitsTitle": "Unità",
"appSettings_unitsTitle": "Unità",
"appSettings_unitsMetric": "Metrico (m/km)",
"appSettings_unitsImperial": "Imperiale (ft / mi)",
"map_lineOfSight": "Linea di vista",
@ -1631,7 +1631,7 @@
},
"losClearAllPoints": "Cancella tutti i punti",
"losRunToViewElevationProfile": "Eseguire LOS per visualizzare il profilo altimetrico",
"losMenuTitle": "Menù LOS",
"losMenuTitle": "Menù LOS",
"losMenuSubtitle": "Tocca i nodi o premi a lungo la mappa per punti personalizzati",
"losShowDisplayNodes": "Mostra i nodi di visualizzazione",
"losCustomPoints": "Punti personalizzati",
@ -1722,7 +1722,7 @@
}
}
},
"losErrorElevationUnavailable": "Dati di elevazione non disponibili per uno o più campioni.",
"losErrorElevationUnavailable": "Dati di elevazione non disponibili per uno o più campioni.",
"losErrorInvalidInput": "Dati punti/elevazione non validi per il calcolo della LOS.",
"losRenameCustomPoint": "Rinomina punto personalizzato",
"losPointName": "Nome del punto",
@ -1734,7 +1734,7 @@
"losLegendTerrain": "Terreno",
"losFrequencyLabel": "Frequenza",
"losFrequencyInfoTooltip": "Visualizza i dettagli del calcolo",
"losFrequencyDialogTitle": "Calcolo dell’orizzonte radio",
"losFrequencyDialogTitle": "Calcolo dellorizzonte radio",
"losFrequencyDialogDescription": "Partendo da k={baselineK} a {baselineFreq} MHz, il calcolo regola il fattore k per l'attuale banda {frequencyMHz} MHz, che definisce il limite curvo dell'orizzonte radio.",
"@losFrequencyDialogDescription": {
"description": "Explain how the calculation uses the baseline frequency and derived k-factor.",
@ -1802,11 +1802,23 @@
"contacts_unread": "Non letti",
"contacts_searchRepeaters": "Cerca {number}{str} Ripetitori...",
"contacts_searchRoomServers": "Cerca {number}{str} server Room...",
"connectionChoiceBluetoothLabel": "Bluetooth",
"connectionChoiceUsbLabel": "USB",
"usbScreenNote": "La comunicazione seriale USB è attiva sui dispositivi Android supportati e sulle piattaforme desktop.",
"usbScreenStatus": "Seleziona un dispositivo USB",
"usbScreenNote": "La comunicazione seriale USB è attiva sui dispositivi Android supportati e sulle piattaforme desktop.",
"usbScreenSubtitle": "Seleziona il dispositivo seriale rilevato e connettilo direttamente al tuo nodo MeshCore.",
"usbScreenStatus": "Seleziona un dispositivo USB",
"usbScreenTitle": "Connessione tramite USB",
"usbScreenEmptyState": "Nessun dispositivo USB rilevato. Collegare uno e riavviare."
"usbScreenEmptyState": "Nessun dispositivo USB rilevato. Collegare uno e riavviare.",
"usbErrorPermissionDenied": "È stato negato l'accesso tramite USB.",
"usbErrorDeviceMissing": "Il dispositivo USB selezionato non è più disponibile.",
"usbErrorInvalidPort": "Seleziona un dispositivo USB valido.",
"usbErrorBusy": "Un'altra richiesta di connessione tramite USB è già in corso.",
"usbErrorNotConnected": "Non è collegato alcun dispositivo USB.",
"usbErrorOpenFailed": "Impossibile aprire il dispositivo USB selezionato.",
"usbErrorConnectFailed": "Impossibile connettersi al dispositivo USB selezionato.",
"usbErrorUnsupported": "La comunicazione seriale tramite USB non è supportata su questa piattaforma.",
"usbErrorAlreadyActive": "La connessione USB è già attiva.",
"usbErrorNoDeviceSelected": "Non è stato selezionato alcun dispositivo USB.",
"usbErrorPortClosed": "La connessione USB non è attiva.",
"usbErrorConnectTimedOut": "Attesa superata, in attesa di una risposta dal dispositivo.",
"connectionChoiceUsbLabel": "USB",
"connectionChoiceBluetoothLabel": "Bluetooth"
}

View file

@ -358,6 +358,78 @@ abstract class AppLocalizations {
/// **'No USB devices found. Plug one in and refresh.'**
String get usbScreenEmptyState;
/// No description provided for @usbErrorPermissionDenied.
///
/// In en, this message translates to:
/// **'USB permission was denied.'**
String get usbErrorPermissionDenied;
/// No description provided for @usbErrorDeviceMissing.
///
/// In en, this message translates to:
/// **'The selected USB device is no longer available.'**
String get usbErrorDeviceMissing;
/// No description provided for @usbErrorInvalidPort.
///
/// In en, this message translates to:
/// **'Select a valid USB device.'**
String get usbErrorInvalidPort;
/// No description provided for @usbErrorBusy.
///
/// In en, this message translates to:
/// **'Another USB connection request is already in progress.'**
String get usbErrorBusy;
/// No description provided for @usbErrorNotConnected.
///
/// In en, this message translates to:
/// **'No USB device is connected.'**
String get usbErrorNotConnected;
/// No description provided for @usbErrorOpenFailed.
///
/// In en, this message translates to:
/// **'Failed to open the selected USB device.'**
String get usbErrorOpenFailed;
/// No description provided for @usbErrorConnectFailed.
///
/// In en, this message translates to:
/// **'Failed to connect to the selected USB device.'**
String get usbErrorConnectFailed;
/// No description provided for @usbErrorUnsupported.
///
/// In en, this message translates to:
/// **'USB serial is not supported on this platform.'**
String get usbErrorUnsupported;
/// No description provided for @usbErrorAlreadyActive.
///
/// In en, this message translates to:
/// **'A USB connection is already active.'**
String get usbErrorAlreadyActive;
/// No description provided for @usbErrorNoDeviceSelected.
///
/// In en, this message translates to:
/// **'No USB device was selected.'**
String get usbErrorNoDeviceSelected;
/// No description provided for @usbErrorPortClosed.
///
/// In en, this message translates to:
/// **'The USB connection is not open.'**
String get usbErrorPortClosed;
/// No description provided for @usbErrorConnectTimedOut.
///
/// In en, this message translates to:
/// **'Timed out waiting for the device to respond.'**
String get usbErrorConnectTimedOut;
/// No description provided for @scanner_scanning.
///
/// In en, this message translates to:

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -132,6 +132,47 @@ class AppLocalizationsEn extends AppLocalizations {
String get usbScreenEmptyState =>
'No USB devices found. Plug one in and refresh.';
@override
String get usbErrorPermissionDenied => 'USB permission was denied.';
@override
String get usbErrorDeviceMissing =>
'The selected USB device is no longer available.';
@override
String get usbErrorInvalidPort => 'Select a valid USB device.';
@override
String get usbErrorBusy =>
'Another USB connection request is already in progress.';
@override
String get usbErrorNotConnected => 'No USB device is connected.';
@override
String get usbErrorOpenFailed => 'Failed to open the selected USB device.';
@override
String get usbErrorConnectFailed =>
'Failed to connect to the selected USB device.';
@override
String get usbErrorUnsupported =>
'USB serial is not supported on this platform.';
@override
String get usbErrorAlreadyActive => 'A USB connection is already active.';
@override
String get usbErrorNoDeviceSelected => 'No USB device was selected.';
@override
String get usbErrorPortClosed => 'The USB connection is not open.';
@override
String get usbErrorConnectTimedOut =>
'Timed out waiting for the device to respond.';
@override
String get scanner_scanning => 'Scanning for devices...';

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -93,7 +93,7 @@ class AppLocalizationsIt extends AppLocalizations {
String get common_loading => 'Caricamento...';
@override
String get common_notAvailable => '—';
String get common_notAvailable => '';
@override
String common_voltageValue(String volts) {
@ -126,12 +126,56 @@ class AppLocalizationsIt extends AppLocalizations {
@override
String get usbScreenNote =>
'La comunicazione seriale USB è attiva sui dispositivi Android supportati e sulle piattaforme desktop.';
'La comunicazione seriale USB è attiva sui dispositivi Android supportati e sulle piattaforme desktop.';
@override
String get usbScreenEmptyState =>
'Nessun dispositivo USB rilevato. Collegare uno e riavviare.';
@override
String get usbErrorPermissionDenied =>
'È stato negato l\'accesso tramite USB.';
@override
String get usbErrorDeviceMissing =>
'Il dispositivo USB selezionato non è più disponibile.';
@override
String get usbErrorInvalidPort => 'Seleziona un dispositivo USB valido.';
@override
String get usbErrorBusy =>
'Un\'altra richiesta di connessione tramite USB è già in corso.';
@override
String get usbErrorNotConnected => 'Non è collegato alcun dispositivo USB.';
@override
String get usbErrorOpenFailed =>
'Impossibile aprire il dispositivo USB selezionato.';
@override
String get usbErrorConnectFailed =>
'Impossibile connettersi al dispositivo USB selezionato.';
@override
String get usbErrorUnsupported =>
'La comunicazione seriale tramite USB non è supportata su questa piattaforma.';
@override
String get usbErrorAlreadyActive => 'La connessione USB è già attiva.';
@override
String get usbErrorNoDeviceSelected =>
'Non è stato selezionato alcun dispositivo USB.';
@override
String get usbErrorPortClosed => 'La connessione USB non è attiva.';
@override
String get usbErrorConnectTimedOut =>
'Attesa superata, in attesa di una risposta dal dispositivo.';
@override
String get scanner_scanning => 'Scansione in corso per i dispositivi...';
@ -168,7 +212,7 @@ class AppLocalizationsIt extends AppLocalizations {
String get scanner_scan => 'Scansiona';
@override
String get scanner_bluetoothOff => 'Il Bluetooth è disattivato.';
String get scanner_bluetoothOff => 'Il Bluetooth è disattivato.';
@override
String get scanner_bluetoothOffMessage =>
@ -265,7 +309,7 @@ class AppLocalizationsIt extends AppLocalizations {
String get settings_longitude => 'Longitudine';
@override
String get settings_privacyMode => 'Modalità Privacy';
String get settings_privacyMode => 'Modalità Privacy';
@override
String get settings_privacyModeSubtitle =>
@ -273,13 +317,13 @@ class AppLocalizationsIt extends AppLocalizations {
@override
String get settings_privacyModeToggle =>
'Attiva la modalità privacy per nascondere il tuo nome e la tua posizione negli annunci.';
'Attiva la modalità privacy per nascondere il tuo nome e la tua posizione negli annunci.';
@override
String get settings_privacyModeEnabled => 'Modalità privacy abilitata';
String get settings_privacyModeEnabled => 'Modalità privacy abilitata';
@override
String get settings_privacyModeDisabled => 'Modalità privacy disabilitata';
String get settings_privacyModeDisabled => 'Modalità privacy disabilitata';
@override
String get settings_actions => 'Azioni';
@ -417,7 +461,7 @@ class AppLocalizationsIt extends AppLocalizations {
@override
String get settings_clientRepeatFreqWarning =>
'Per la comunicazione fuori rete, è necessario utilizzare frequenze di 433, 869 o 918 MHz.';
'Per la comunicazione fuori rete, è necessario utilizzare frequenze di 433, 869 o 918 MHz.';
@override
String settings_error(String message) {
@ -452,10 +496,10 @@ class AppLocalizationsIt extends AppLocalizations {
String get appSettings_languageEn => 'English';
@override
String get appSettings_languageFr => 'Français';
String get appSettings_languageFr => 'Français';
@override
String get appSettings_languageEs => 'Español';
String get appSettings_languageEs => 'Español';
@override
String get appSettings_languageDe => 'Deutsch';
@ -464,16 +508,16 @@ class AppLocalizationsIt extends AppLocalizations {
String get appSettings_languagePl => 'Polski';
@override
String get appSettings_languageSl => 'Slovenščina';
String get appSettings_languageSl => 'Slovenščina';
@override
String get appSettings_languagePt => 'Português';
String get appSettings_languagePt => 'Português';
@override
String get appSettings_languageIt => 'Italiano';
@override
String get appSettings_languageZh => '中文';
String get appSettings_languageZh => '中文';
@override
String get appSettings_languageSv => 'Svenska';
@ -482,10 +526,10 @@ class AppLocalizationsIt extends AppLocalizations {
String get appSettings_languageNl => 'Nederlands';
@override
String get appSettings_languageSk => 'Slovenčina';
String get appSettings_languageSk => 'Slovenčina';
@override
String get appSettings_languageBg => 'Български';
String get appSettings_languageBg => 'Български';
@override
String get appSettings_languageRu => 'Russo';
@ -568,7 +612,7 @@ class AppLocalizationsIt extends AppLocalizations {
@override
String get appSettings_autoRouteRotationSubtitle =>
'Alterna tra i percorsi migliori e la modalità alluvione';
'Alterna tra i percorsi migliori e la modalità alluvione';
@override
String get appSettings_autoRouteRotationEnabled =>
@ -663,7 +707,7 @@ class AppLocalizationsIt extends AppLocalizations {
String get appSettings_offlineMapCache => 'Cache Mappa Offline';
@override
String get appSettings_unitsTitle => 'Unità';
String get appSettings_unitsTitle => 'Unità';
@override
String get appSettings_unitsMetric => 'Metrico (m/km)';
@ -782,12 +826,11 @@ class AppLocalizationsIt extends AppLocalizations {
String get contacts_groupName => 'Nome gruppo';
@override
String get contacts_groupNameRequired =>
'Il nome del gruppo è obbligatorio.';
String get contacts_groupNameRequired => 'Il nome del gruppo è obbligatorio.';
@override
String contacts_groupAlreadyExists(String name) {
return 'Il gruppo \"$name\" esiste già.';
return 'Il gruppo \"$name\" esiste già.';
}
@override
@ -873,7 +916,7 @@ class AppLocalizationsIt extends AppLocalizations {
@override
String channels_deleteChannelConfirm(String name) {
return 'Eliminare \"$name\"? Non può essere annullato.';
return 'Eliminare \"$name\"? Non può essere annullato.';
}
@override
@ -970,20 +1013,20 @@ class AppLocalizationsIt extends AppLocalizations {
@override
String get channels_joinPublicChannelDesc =>
'Chiunque può unirsi a questo canale.';
'Chiunque può unirsi a questo canale.';
@override
String get channels_joinHashtagChannel => 'Unisciti a un Canale con Hashtag';
@override
String get channels_joinHashtagChannelDesc =>
'Chiunque può unirsi ai canali hashtag.';
'Chiunque può unirsi ai canali hashtag.';
@override
String get channels_scanQrCode => 'Scansiona un codice QR';
@override
String get channels_scanQrCodeComingSoon => 'Arriverà presto';
String get channels_scanQrCodeComingSoon => 'Arriverà presto';
@override
String get channels_enterHashtag => 'Inserisci hashtag';
@ -1117,7 +1160,7 @@ class AppLocalizationsIt extends AppLocalizations {
String get debugLog_rawLogRx => 'Log Raw-RX';
@override
String get debugLog_noBleActivity => 'Nessuna attività BLE rilevata ancora.';
String get debugLog_noBleActivity => 'Nessuna attività BLE rilevata ancora.';
@override
String debugFrame_length(int count) {
@ -1173,20 +1216,20 @@ class AppLocalizationsIt extends AppLocalizations {
String get chat_ShowAllPaths => 'Mostra tutti i percorsi';
@override
String get chat_routingMode => 'Modalità di routing';
String get chat_routingMode => 'Modalità di routing';
@override
String get chat_autoUseSavedPath => 'Utilizza il percorso salvato';
@override
String get chat_forceFloodMode => 'Modalità Inondamento Forzato';
String get chat_forceFloodMode => 'Modalità Inondamento Forzato';
@override
String get chat_recentAckPaths => 'Percorsi ACK Recenti (tocca per usare):';
@override
String get chat_pathHistoryFull =>
'La cronologia del percorso è piena. Rimuovi gli elementi per aggiungere nuovi.';
'La cronologia del percorso è piena. Rimuovi gli elementi per aggiungere nuovi.';
@override
String get chat_hopSingular => 'salta';
@ -1213,7 +1256,7 @@ class AppLocalizationsIt extends AppLocalizations {
@override
String get chat_noPathHistoryYet =>
'Non c\'è ancora una cronologia del percorso.\nInvia un messaggio per scoprire i percorsi.';
'Non c\'è ancora una cronologia del percorso.\nInvia un messaggio per scoprire i percorsi.';
@override
String get chat_pathActions => 'Azioni Percorso:';
@ -1234,7 +1277,7 @@ class AppLocalizationsIt extends AppLocalizations {
@override
String get chat_pathCleared =>
'Percorso sgomberato. Il prossimo messaggio riidentifierà il percorso.';
'Percorso sgomberato. Il prossimo messaggio riidentifierà il percorso.';
@override
String get chat_floodModeSubtitle =>
@ -1242,7 +1285,7 @@ class AppLocalizationsIt extends AppLocalizations {
@override
String get chat_floodModeEnabled =>
'Modalità alluvione abilitata. Disattivala tramite l\'icona di routing nella barra in alto.';
'Modalità alluvione abilitata. Disattivala tramite l\'icona di routing nella barra in alto.';
@override
String get chat_fullPath => 'Percorso Completo';
@ -1417,7 +1460,7 @@ class AppLocalizationsIt extends AppLocalizations {
@override
String map_publicLocationShareConfirm(String channelLabel) {
return 'Stai per condividere una posizione in $channelLabel. Questo canale è pubblico e chiunque abbia la PSK può vederlo.';
return 'Stai per condividere una posizione in $channelLabel. Questo canale è pubblico e chiunque abbia la PSK può vederlo.';
}
@override
@ -1635,7 +1678,7 @@ class AppLocalizationsIt extends AppLocalizations {
@override
String get login_savePasswordSubtitle =>
'La password verrà memorizzata in modo sicuro su questo dispositivo.';
'La password verrà memorizzata in modo sicuro su questo dispositivo.';
@override
String get login_repeaterDescription =>
@ -1649,13 +1692,13 @@ class AppLocalizationsIt extends AppLocalizations {
String get login_routing => 'Instradamento';
@override
String get login_routingMode => 'Modalità di routing';
String get login_routingMode => 'Modalità di routing';
@override
String get login_autoUseSavedPath => 'Utilizza il percorso salvato';
@override
String get login_forceFloodMode => 'Modalità Inondamento Forzato';
String get login_forceFloodMode => 'Modalità Inondamento Forzato';
@override
String get login_managePaths => 'Gestisci Percorsi';
@ -1675,7 +1718,7 @@ class AppLocalizationsIt extends AppLocalizations {
@override
String get login_failedMessage =>
'Accesso fallito. La password non è corretta oppure il ripetitore non è raggiungibile.';
'Accesso fallito. La password non è corretta oppure il ripetitore non è raggiungibile.';
@override
String get common_reload => 'Ricaricare';
@ -1718,7 +1761,7 @@ class AppLocalizationsIt extends AppLocalizations {
@override
String get path_helperMaxHops =>
'Massimo 64 salti. Ogni prefisso è composto da 2 caratteri esadecimali (1 byte)';
'Massimo 64 salti. Ogni prefisso è composto da 2 caratteri esadecimali (1 byte)';
@override
String get path_selectFromContacts => 'Seleziona da contatti:';
@ -1738,7 +1781,7 @@ class AppLocalizationsIt extends AppLocalizations {
@override
String get path_tooLong =>
'Il percorso è troppo lungo. Massimo 64 salti consentiti.';
'Il percorso è troppo lungo. Massimo 64 salti consentiti.';
@override
String get path_setPath => 'Imposta Percorso';
@ -1790,13 +1833,13 @@ class AppLocalizationsIt extends AppLocalizations {
String get repeater_statusTitle => 'Stato del Ripetitore';
@override
String get repeater_routingMode => 'Modalità di routing';
String get repeater_routingMode => 'Modalità di routing';
@override
String get repeater_autoUseSavedPath => 'Percorso salvato automatico';
@override
String get repeater_forceFloodMode => 'Modalità Inondamento Forzato';
String get repeater_forceFloodMode => 'Modalità Inondamento Forzato';
@override
String get repeater_pathManagement => 'Gestione dei percorsi';
@ -1822,7 +1865,7 @@ class AppLocalizationsIt extends AppLocalizations {
String get repeater_clockAtLogin => 'Orologio (all\'accesso)';
@override
String get repeater_uptime => 'Disponibilità';
String get repeater_uptime => 'Disponibilità';
@override
String get repeater_queueLength => 'Lunghezza della coda';
@ -1974,7 +2017,7 @@ class AppLocalizationsIt extends AppLocalizations {
'Consenti l\'accesso ospite in sola lettura';
@override
String get repeater_privacyMode => 'Modalità Privacy';
String get repeater_privacyMode => 'Modalità Privacy';
@override
String get repeater_privacyModeSubtitle =>
@ -1984,7 +2027,7 @@ class AppLocalizationsIt extends AppLocalizations {
String get repeater_advertisementSettings => 'Impostazioni Annuncio';
@override
String get repeater_localAdvertInterval => 'Intervallo Pubblicità Locale';
String get repeater_localAdvertInterval => 'Intervallo Pubblicità Locale';
@override
String repeater_localAdvertIntervalMinutes(int minutes) {
@ -1993,7 +2036,7 @@ class AppLocalizationsIt extends AppLocalizations {
@override
String get repeater_floodAdvertInterval =>
'Intervallo Pubblicità Inondazione';
'Intervallo Pubblicità Inondazione';
@override
String repeater_floodAdvertIntervalHours(int hours) {
@ -2019,7 +2062,7 @@ class AppLocalizationsIt extends AppLocalizations {
'Sei sicuro di voler riavviare questo ripetitore?';
@override
String get repeater_regenerateIdentityKey => 'Rigenera Chiave Identità';
String get repeater_regenerateIdentityKey => 'Rigenera Chiave Identità';
@override
String get repeater_regenerateIdentityKeySubtitle =>
@ -2027,7 +2070,7 @@ class AppLocalizationsIt extends AppLocalizations {
@override
String get repeater_regenerateIdentityKeyConfirm =>
'Questo genererà una nuova identità per il ripetitore. Procedere?';
'Questo genererà una nuova identità per il ripetitore. Procedere?';
@override
String get repeater_eraseFileSystem => 'Elimina File System';
@ -2038,11 +2081,11 @@ class AppLocalizationsIt extends AppLocalizations {
@override
String get repeater_eraseFileSystemConfirm =>
'ATTENZIONE: Ciò cancellerà tutti i dati sul ripetitore. Non può essere annullato!';
'ATTENZIONE: Ciò cancellerà tutti i dati sul ripetitore. Non può essere annullato!';
@override
String get repeater_eraseSerialOnly =>
'Elimina è disponibile solo tramite console seriale.';
'Elimina è disponibile solo tramite console seriale.';
@override
String repeater_commandSent(String command) {
@ -2086,7 +2129,7 @@ class AppLocalizationsIt extends AppLocalizations {
String get repeater_refreshGuestAccess => 'Aggiorna Accesso Ospite';
@override
String get repeater_refreshPrivacyMode => 'Aggiorna Modalità Privacy';
String get repeater_refreshPrivacyMode => 'Aggiorna Modalità Privacy';
@override
String get repeater_refreshAdvertisementSettings =>
@ -2167,7 +2210,7 @@ class AppLocalizationsIt extends AppLocalizations {
@override
String get repeater_cliHelpReboot =>
'Riavvia il dispositivo. (nota, potresti ottenere \'Timeout\' che è normale)';
'Riavvia il dispositivo. (nota, potresti ottenere \'Timeout\' che è normale)';
@override
String get repeater_cliHelpClock =>
@ -2199,7 +2242,7 @@ class AppLocalizationsIt extends AppLocalizations {
@override
String get repeater_cliHelpSetAllowReadOnly =>
'(Server della stanza) Se \'on\', allora l\'accesso con una password vuota sarà consentito, ma non sarà possibile pubblicare nella stanza. (solo lettura).';
'(Server della stanza) Se \'on\', allora l\'accesso con una password vuota sarà consentito, ma non sarà possibile pubblicare nella stanza. (solo lettura).';
@override
String get repeater_cliHelpSetFloodMax =>
@ -2207,7 +2250,7 @@ class AppLocalizationsIt extends AppLocalizations {
@override
String get repeater_cliHelpSetIntThresh =>
'Imposta il Limite di Interferenza (in dB). Il valore predefinito è 14. Imposta su 0 per disabilitare il rilevamento delle interferenze del canale.';
'Imposta il Limite di Interferenza (in dB). Il valore predefinito è 14. Imposta su 0 per disabilitare il rilevamento delle interferenze del canale.';
@override
String get repeater_cliHelpSetAgcResetInterval =>
@ -2219,7 +2262,7 @@ class AppLocalizationsIt extends AppLocalizations {
@override
String get repeater_cliHelpSetAdvertInterval =>
'Imposta l\'intervallo del timer in minuti per inviare un pacchetto di pubblicità locale (senza salto). Imposta su 0 per disabilitare.';
'Imposta l\'intervallo del timer in minuti per inviare un pacchetto di pubblicità locale (senza salto). Imposta su 0 per disabilitare.';
@override
String get repeater_cliHelpSetFloodAdvertInterval =>
@ -2250,11 +2293,11 @@ class AppLocalizationsIt extends AppLocalizations {
@override
String get repeater_cliHelpSetTxDelay =>
'Imposta un fattore moltiplicato con il tempo di mantenimento per un pacchetto di modalità allagamento e con un sistema di slot casuale, per ritardarne la trasmissione (per diminuire la probabilità di collisioni).';
'Imposta un fattore moltiplicato con il tempo di mantenimento per un pacchetto di modalità allagamento e con un sistema di slot casuale, per ritardarne la trasmissione (per diminuire la probabilità di collisioni).';
@override
String get repeater_cliHelpSetDirectTxDelay =>
'Uguale a txdelay, ma per applicare un ritardo casuale alla inoltrata di pacchetti in modalità diretta.';
'Uguale a txdelay, ma per applicare un ritardo casuale alla inoltrata di pacchetti in modalità diretta.';
@override
String get repeater_cliHelpSetBridgeEnabled => 'Abilita/Disabilita ponte.';
@ -2265,11 +2308,11 @@ class AppLocalizationsIt extends AppLocalizations {
@override
String get repeater_cliHelpSetBridgeSource =>
'Scegliere se il ponte dovrà ritrasmettere i pacchetti ricevuti o i pacchetti trasmessi.';
'Scegliere se il ponte dovrà ritrasmettere i pacchetti ricevuti o i pacchetti trasmessi.';
@override
String get repeater_cliHelpSetBridgeBaud =>
'Imposta la velocità di trasmissione per i ponti rs232.';
'Imposta la velocità di trasmissione per i ponti rs232.';
@override
String get repeater_cliHelpSetBridgeSecret =>
@ -2285,7 +2328,7 @@ class AppLocalizationsIt extends AppLocalizations {
@override
String get repeater_cliHelpSetPerm =>
'Modifica l\'ACL. Rimuove l\'entrata corrispondente (per prefisso di pubkey) se \"permissions\" è zero. Aggiunge una nuova entrata se il pubkey-hex ha lunghezza completa e non è attualmente nell\'ACL. Aggiorna l\'entrata per corrispondenza del prefisso di pubkey. I bit di permesso variano per ogni ruolo di firmware, ma i primi 2 bit sono: 0 (Guest), 1 (solo lettura), 2 (lettura/scrittura), 3 (Admin)';
'Modifica l\'ACL. Rimuove l\'entrata corrispondente (per prefisso di pubkey) se \"permissions\" è zero. Aggiunge una nuova entrata se il pubkey-hex ha lunghezza completa e non è attualmente nell\'ACL. Aggiorna l\'entrata per corrispondenza del prefisso di pubkey. I bit di permesso variano per ogni ruolo di firmware, ma i primi 2 bit sono: 0 (Guest), 1 (solo lettura), 2 (lettura/scrittura), 3 (Admin)';
@override
String get repeater_cliHelpGetBridgeType =>
@ -2305,7 +2348,7 @@ class AppLocalizationsIt extends AppLocalizations {
@override
String get repeater_cliHelpNeighbors =>
'Mostra un elenco di altri nodi repeater ricevuti tramite annunci zero-hop. Ogni riga è id-prefisso-esadecimale:timestamp:snr-volte-4';
'Mostra un elenco di altri nodi repeater ricevuti tramite annunci zero-hop. Ogni riga è id-prefisso-esadecimale:timestamp:snr-volte-4';
@override
String get repeater_cliHelpNeighborRemove =>
@ -2317,7 +2360,7 @@ class AppLocalizationsIt extends AppLocalizations {
@override
String get repeater_cliHelpRegionLoad =>
'NOTA: questo è un\'invocazione multi-comando speciale. Ogni comando successivo è un nome di regione (indentato con spazi per indicare la gerarchia parentale, con almeno uno spazio). Terminata inviando una riga vuota/comando.';
'NOTA: questo è un\'invocazione multi-comando speciale. Ogni comando successivo è un nome di regione (indentato con spazi per indicare la gerarchia parentale, con almeno uno spazio). Terminata inviando una riga vuota/comando.';
@override
String get repeater_cliHelpRegionGet =>
@ -2337,7 +2380,7 @@ class AppLocalizationsIt extends AppLocalizations {
@override
String get repeater_cliHelpRegionDenyf =>
'Rimuove il permesso \'F\'lood per la regione specificata. (NOTA: a questo stadio non è consigliato utilizzarlo sullo scope globale/legacy!!).';
'Rimuove il permesso \'F\'lood per la regione specificata. (NOTA: a questo stadio non è consigliato utilizzarlo sullo scope globale/legacy!!).';
@override
String get repeater_cliHelpRegionHome =>
@ -2352,7 +2395,7 @@ class AppLocalizationsIt extends AppLocalizations {
@override
String get repeater_cliHelpGps =>
'Mostra lo stato del GPS. Quando il GPS è spento, risponde solo \"spento\", se è acceso risponde con \"acceso\", \"stato\", \"fix\" e numero di satelliti.';
'Mostra lo stato del GPS. Quando il GPS è spento, risponde solo \"spento\", se è acceso risponde con \"acceso\", \"stato\", \"fix\" e numero di satelliti.';
@override
String get repeater_cliHelpGpsOnOff =>
@ -2409,7 +2452,7 @@ class AppLocalizationsIt extends AppLocalizations {
@override
String get repeater_gpsNote =>
'è stata introdotta una funzione gps per gestire le tematiche relative alla posizione.';
'è stata introdotta una funzione gps per gestire le tematiche relative alla posizione.';
@override
String get telemetry_receivedData => 'Dati Telemetria Ricevuti';
@ -2462,7 +2505,7 @@ class AppLocalizationsIt extends AppLocalizations {
@override
String telemetry_temperatureValue(String celsius, String fahrenheit) {
return '$celsius°C / $fahrenheit°F';
return '$celsius°C / $fahrenheit°F';
}
@override
@ -2530,7 +2573,7 @@ class AppLocalizationsIt extends AppLocalizations {
@override
String channelPath_observedPathTitle(int index, String hops) {
return 'Percorso osservato $index • $hops';
return 'Percorso osservato $index $hops';
}
@override
@ -2585,7 +2628,7 @@ class AppLocalizationsIt extends AppLocalizations {
@override
String channelPath_selectedPathLabel(String label, String prefixes) {
return '$label • $prefixes';
return '$label $prefixes';
}
@override
@ -2596,14 +2639,14 @@ class AppLocalizationsIt extends AppLocalizations {
String get channelPath_unknownRepeater => 'Ripetitore sconosciuto';
@override
String get community_title => 'Comunità';
String get community_title => 'Comunità';
@override
String get community_create => 'Crea Comunità';
String get community_create => 'Crea Comunità';
@override
String get community_createDesc =>
'Crea una nuova comunità e condividila tramite codice QR.';
'Crea una nuova comunità e condividila tramite codice QR.';
@override
String get community_join => 'Unisciti';
@ -2621,35 +2664,35 @@ class AppLocalizationsIt extends AppLocalizations {
@override
String get community_scanInstructions =>
'Punta la fotocamera su un codice QR della comunità';
'Punta la fotocamera su un codice QR della comunità';
@override
String get community_showQr => 'Mostra il codice QR';
@override
String get community_publicChannel => 'Comunità Pubblica';
String get community_publicChannel => 'Comunità Pubblica';
@override
String get community_hashtagChannel => 'Hashtag della Comunità';
String get community_hashtagChannel => 'Hashtag della Comunità';
@override
String get community_name => 'Nome della Comunità';
String get community_name => 'Nome della Comunità';
@override
String get community_enterName => 'Inserisci il nome della comunità';
String get community_enterName => 'Inserisci il nome della comunità';
@override
String community_created(String name) {
return 'Comunità \"$name\" creata';
return 'Comunità \"$name\" creata';
}
@override
String community_joined(String name) {
return 'Unito alla comunità \"$name\"';
return 'Unito alla comunità \"$name\"';
}
@override
String get community_qrTitle => 'Condividi Comunità';
String get community_qrTitle => 'Condividi Comunità';
@override
String community_qrInstructions(String name) {
@ -2664,16 +2707,16 @@ class AppLocalizationsIt extends AppLocalizations {
String get community_invalidQrCode => 'Codice QR della community non valido';
@override
String get community_alreadyMember => 'Già membro';
String get community_alreadyMember => 'Già membro';
@override
String community_alreadyMemberMessage(String name) {
return 'Sei già un membro di \"$name\".';
return 'Sei già un membro di \"$name\".';
}
@override
String get community_addPublicChannel =>
'Aggiungi Canale Pubblico della Comunità';
'Aggiungi Canale Pubblico della Comunità';
@override
String get community_addPublicChannelHint =>
@ -2687,10 +2730,10 @@ class AppLocalizationsIt extends AppLocalizations {
'Scansiona un codice QR o crea una community per iniziare.';
@override
String get community_manageCommunities => 'Gestisci Comunità';
String get community_manageCommunities => 'Gestisci Comunità';
@override
String get community_delete => 'Lascia la Comunità';
String get community_delete => 'Lascia la Comunità';
@override
String community_deleteConfirm(String name) {
@ -2699,12 +2742,12 @@ class AppLocalizationsIt extends AppLocalizations {
@override
String community_deleteChannelsWarning(int count) {
return 'Questo eliminerà anche $count canale/i e i loro messaggi.';
return 'Questo eliminerà anche $count canale/i e i loro messaggi.';
}
@override
String community_deleted(String name) {
return 'Hai lasciato la comunità \"$name\"';
return 'Hai lasciato la comunità \"$name\"';
}
@override
@ -2744,21 +2787,21 @@ class AppLocalizationsIt extends AppLocalizations {
'Aggiungi un canale con hashtag per questa community';
@override
String get community_selectCommunity => 'Seleziona Comunità';
String get community_selectCommunity => 'Seleziona Comunità';
@override
String get community_regularHashtag => 'Hashtag regolare';
@override
String get community_regularHashtagDesc =>
'Hashtag pubblico (chiunque può unirsi)';
'Hashtag pubblico (chiunque può unirsi)';
@override
String get community_communityHashtag => 'Hashtag della Comunità';
String get community_communityHashtag => 'Hashtag della Comunità';
@override
String get community_communityHashtagDesc =>
'Visibile solo ai membri della comunità';
'Visibile solo ai membri della comunità';
@override
String community_forCommunity(String name) {
@ -2825,7 +2868,7 @@ class AppLocalizationsIt extends AppLocalizations {
@override
String get pathTrace_someHopsNoLocation =>
'Uno o più dei luppoli mancano di una posizione!';
'Uno o più dei luppoli mancano di una posizione!';
@override
String get pathTrace_clearTooltip => 'Pulisci percorso';
@ -2847,7 +2890,7 @@ class AppLocalizationsIt extends AppLocalizations {
'Eseguire LOS per visualizzare il profilo altimetrico';
@override
String get losMenuTitle => 'Menù LOS';
String get losMenuTitle => 'Menù LOS';
@override
String get losMenuSubtitle =>
@ -2919,7 +2962,7 @@ class AppLocalizationsIt extends AppLocalizations {
@override
String get losErrorElevationUnavailable =>
'Dati di elevazione non disponibili per uno o più campioni.';
'Dati di elevazione non disponibili per uno o più campioni.';
@override
String get losErrorInvalidInput =>
@ -2957,7 +3000,7 @@ class AppLocalizationsIt extends AppLocalizations {
String get losFrequencyInfoTooltip => 'Visualizza i dettagli del calcolo';
@override
String get losFrequencyDialogTitle => 'Calcolo dell’orizzonte radio';
String get losFrequencyDialogTitle => 'Calcolo dellorizzonte radio';
@override
String losFrequencyDialogDescription(
@ -2997,13 +3040,13 @@ class AppLocalizationsIt extends AppLocalizations {
}
@override
String get contacts_clipboardEmpty => 'La clipboard è vuota.';
String get contacts_clipboardEmpty => 'La clipboard è vuota.';
@override
String get contacts_invalidAdvertFormat => 'Dati di contatto non validi';
@override
String get contacts_contactImported => 'Il contatto è stato importato.';
String get contacts_contactImported => 'Il contatto è stato importato.';
@override
String get contacts_contactImportFailed =>
@ -3045,7 +3088,7 @@ class AppLocalizationsIt extends AppLocalizations {
'Copia dell\'annuncio nella Clipboard non riuscita.';
@override
String get notification_activityTitle => 'Attività MeshCore';
String get notification_activityTitle => 'Attività MeshCore';
@override
String notification_messagesCount(int count) {
@ -3123,7 +3166,7 @@ class AppLocalizationsIt extends AppLocalizations {
@override
String get settings_gpxExportError =>
'Si è verificato un errore durante l\'esportazione.';
'Si è verificato un errore durante l\'esportazione.';
@override
String get settings_gpxExportRepeatersRoom =>

View file

@ -69,7 +69,7 @@ class AppLocalizationsNl extends AppLocalizations {
String get common_share => 'Delen';
@override
String get common_copy => 'Kopiëren';
String get common_copy => 'Kopiëren';
@override
String get common_retry => 'Nogmaals proberen';
@ -93,7 +93,7 @@ class AppLocalizationsNl extends AppLocalizations {
String get common_loading => 'Laden...';
@override
String get common_notAvailable => '—';
String get common_notAvailable => '';
@override
String common_voltageValue(String volts) {
@ -119,7 +119,7 @@ class AppLocalizationsNl extends AppLocalizations {
@override
String get usbScreenSubtitle =>
'Kies een gedetecteerd seriële apparaat en verbind deze direct met uw MeshCore-node.';
'Kies een gedetecteerd seriële apparaat en verbind deze direct met uw MeshCore-node.';
@override
String get usbScreenStatus => 'Selecteer een USB-apparaat';
@ -132,6 +132,48 @@ class AppLocalizationsNl extends AppLocalizations {
String get usbScreenEmptyState =>
'Geen USB-apparaten gevonden. Sluit er een aan en herlaad.';
@override
String get usbErrorPermissionDenied => 'Toegang via USB is geweigerd.';
@override
String get usbErrorDeviceMissing =>
'Het geselecteerde USB-apparaat is niet meer beschikbaar.';
@override
String get usbErrorInvalidPort => 'Selecteer een geldig USB-apparaat.';
@override
String get usbErrorBusy =>
'Een andere verzoek om een USB-verbinding is al in behandeling.';
@override
String get usbErrorNotConnected => 'Er is geen USB-apparaat aangesloten.';
@override
String get usbErrorOpenFailed =>
'Kon het geselecteerde USB-apparaat niet openen.';
@override
String get usbErrorConnectFailed =>
'Kon niet verbinding maken met het geselecteerde USB-apparaat.';
@override
String get usbErrorUnsupported =>
'USB-serieel is niet ondersteund op deze platform.';
@override
String get usbErrorAlreadyActive => 'Een USB-verbinding is al actief.';
@override
String get usbErrorNoDeviceSelected => 'Geen USB-apparaat is geselecteerd.';
@override
String get usbErrorPortClosed => 'De USB-verbinding is niet actief.';
@override
String get usbErrorConnectTimedOut =>
'Wachtperiode is verlopen, er is geen reactie ontvangen van het apparaat.';
@override
String get scanner_scanning => 'Scannen naar apparaten...';
@ -231,7 +273,7 @@ class AppLocalizationsNl extends AppLocalizations {
String get settings_location => 'Locatie';
@override
String get settings_locationSubtitle => 'GPS coördinaten';
String get settings_locationSubtitle => 'GPS coördinaten';
@override
String get settings_locationUpdated => 'Locatie bijgewerkt';
@ -450,10 +492,10 @@ class AppLocalizationsNl extends AppLocalizations {
String get appSettings_languageEn => 'English';
@override
String get appSettings_languageFr => 'Français';
String get appSettings_languageFr => 'Français';
@override
String get appSettings_languageEs => 'Español';
String get appSettings_languageEs => 'Español';
@override
String get appSettings_languageDe => 'Deutsch';
@ -462,16 +504,16 @@ class AppLocalizationsNl extends AppLocalizations {
String get appSettings_languagePl => 'Polski';
@override
String get appSettings_languageSl => 'Slovenščina';
String get appSettings_languageSl => 'Slovenščina';
@override
String get appSettings_languagePt => 'Português';
String get appSettings_languagePt => 'Português';
@override
String get appSettings_languageIt => 'Italiano';
@override
String get appSettings_languageZh => '中文';
String get appSettings_languageZh => '中文';
@override
String get appSettings_languageSv => 'Svenska';
@ -480,16 +522,16 @@ class AppLocalizationsNl extends AppLocalizations {
String get appSettings_languageNl => 'Nederlands';
@override
String get appSettings_languageSk => 'Slovenčina';
String get appSettings_languageSk => 'Slovenčina';
@override
String get appSettings_languageBg => 'Български';
String get appSettings_languageBg => 'Български';
@override
String get appSettings_languageRu => 'Russisch';
@override
String get appSettings_languageUk => 'Oekraïens';
String get appSettings_languageUk => 'Oekraïens';
@override
String get appSettings_enableMessageTracing => 'Berichttracking inschakelen';
@ -847,7 +889,7 @@ class AppLocalizationsNl extends AppLocalizations {
String get channels_public => 'Openbaar';
@override
String get channels_private => 'Privé';
String get channels_private => 'Privé';
@override
String get channels_publicChannel => 'Open kanaal';
@ -947,14 +989,14 @@ class AppLocalizationsNl extends AppLocalizations {
String get channels_sortUnread => 'Ongelezen';
@override
String get channels_createPrivateChannel => 'Maak een Privé Kanaal';
String get channels_createPrivateChannel => 'Maak een Privé Kanaal';
@override
String get channels_createPrivateChannelDesc =>
'Beveiligd met een geheime sleutel.';
@override
String get channels_joinPrivateChannel => 'Sluit een Privé Kanaal aan';
String get channels_joinPrivateChannel => 'Sluit een Privé Kanaal aan';
@override
String get channels_joinPrivateChannelDesc =>
@ -1336,7 +1378,7 @@ class AppLocalizationsNl extends AppLocalizations {
@override
String get map_nodesNeedGps =>
'Nodes moeten hun GPS-coördinaten delen\nom op de kaart te verschijnen';
'Nodes moeten hun GPS-coördinaten delen\nom op de kaart te verschijnen';
@override
String map_nodesCount(int count) {
@ -1364,7 +1406,7 @@ class AppLocalizationsNl extends AppLocalizations {
String get map_pinDm => 'Verzenden als bericht (DM)';
@override
String get map_pinPrivate => 'Beveiligd (Privé)';
String get map_pinPrivate => 'Beveiligd (Privé)';
@override
String get map_pinPublic => 'Openbaar spikken';
@ -2031,7 +2073,7 @@ class AppLocalizationsNl extends AppLocalizations {
@override
String get repeater_eraseSerialOnly =>
'Verwijderen is alleen beschikbaar via de seriële console.';
'Verwijderen is alleen beschikbaar via de seriële console.';
@override
String repeater_commandSent(String command) {
@ -2259,7 +2301,7 @@ class AppLocalizationsNl extends AppLocalizations {
@override
String get repeater_cliHelpSetBridgeBaud =>
'Stel de seriële link baudrate in voor rs232 bruggen.';
'Stel de seriële link baudrate in voor rs232 bruggen.';
@override
String get repeater_cliHelpSetBridgeSecret =>
@ -2275,7 +2317,7 @@ class AppLocalizationsNl extends AppLocalizations {
@override
String get repeater_cliHelpSetPerm =>
'Wijzigt de ACL. Verwijder de overeenkomstige entry (door pubkey prefix) als \"permissions\" 0 is. Voeg een nieuwe entry toe als pubkey-hex volledig is en niet momenteel in de ACL staat. Update de entry door matching pubkey prefix. Toestemming bits variëren per firmware rol, maar de onderste 2 bits zijn: 0 (Gast), 1 (Alleen lezen), 2 (Lezen/schrijven), 3 (Admin)';
'Wijzigt de ACL. Verwijder de overeenkomstige entry (door pubkey prefix) als \"permissions\" 0 is. Voeg een nieuwe entry toe als pubkey-hex volledig is en niet momenteel in de ACL staat. Update de entry door matching pubkey prefix. Toestemming bits variëren per firmware rol, maar de onderste 2 bits zijn: 0 (Gast), 1 (Alleen lezen), 2 (Lezen/schrijven), 3 (Admin)';
@override
String get repeater_cliHelpGetBridgeType =>
@ -2307,7 +2349,7 @@ class AppLocalizationsNl extends AppLocalizations {
@override
String get repeater_cliHelpRegionLoad =>
'LET OP: dit is een speciale multi-command aanroep. Elke volgende opdracht is een regiortaak (uitgelijnd met spaties om de ouderhiërarchie aan te duiden, met minimaal één spatie). Beëindigd door een lege regel/opdracht te sturen.';
'LET OP: dit is een speciale multi-command aanroep. Elke volgende opdracht is een regiortaak (uitgelijnd met spaties om de ouderhiërarchie aan te duiden, met minimaal één spatie). Beëindigd door een lege regel/opdracht te sturen.';
@override
String get repeater_cliHelpRegionGet =>
@ -2352,7 +2394,7 @@ class AppLocalizationsNl extends AppLocalizations {
@override
String get repeater_cliHelpGpsSetLoc =>
'Stel de positie van de node vast als GPS-coördinaten en sla de voorkeuren op.';
'Stel de positie van de node vast als GPS-coördinaten en sla de voorkeuren op.';
@override
String get repeater_cliHelpGpsAdvert =>
@ -2390,14 +2432,14 @@ class AppLocalizationsNl extends AppLocalizations {
@override
String get repeater_regionNote =>
'Regio-commando\'s zijn geïntroduceerd om regio-definities en permissies te beheren.';
'Regio-commando\'s zijn geïntroduceerd om regio-definities en permissies te beheren.';
@override
String get repeater_gpsManagement => 'Beheer GPS';
@override
String get repeater_gpsNote =>
'De GPS-commando is geïntroduceerd om locatiegerelateerde onderwerpen te beheren.';
'De GPS-commando is geïntroduceerd om locatiegerelateerde onderwerpen te beheren.';
@override
String get telemetry_receivedData => 'Ontvangen Telemetriedata';
@ -2450,7 +2492,7 @@ class AppLocalizationsNl extends AppLocalizations {
@override
String telemetry_temperatureValue(String celsius, String fahrenheit) {
return '$celsius°C / $fahrenheit°F';
return '$celsius°C / $fahrenheit°F';
}
@override
@ -2519,7 +2561,7 @@ class AppLocalizationsNl extends AppLocalizations {
@override
String channelPath_observedPathTitle(int index, String hops) {
return 'Waargenomen pad $index • $hops';
return 'Waargenomen pad $index $hops';
}
@override
@ -2574,7 +2616,7 @@ class AppLocalizationsNl extends AppLocalizations {
@override
String channelPath_selectedPathLabel(String label, String prefixes) {
return '$label • $prefixes';
return '$label $prefixes';
}
@override
@ -2991,11 +3033,11 @@ class AppLocalizationsNl extends AppLocalizations {
String get contacts_invalidAdvertFormat => 'Ongeldige contactgegevens';
@override
String get contacts_contactImported => 'Contact is geïmporteerd.';
String get contacts_contactImported => 'Contact is geïmporteerd.';
@override
String get contacts_contactImportFailed =>
'Contact kon niet geïmporteerd worden.';
'Contact kon niet geïmporteerd worden.';
@override
String get contacts_zeroHopAdvert => 'Zero Hop Reclame';
@ -3004,14 +3046,14 @@ class AppLocalizationsNl extends AppLocalizations {
String get contacts_floodAdvert => 'Overstromingsadvertentie';
@override
String get contacts_copyAdvertToClipboard => 'Advert naar klembord kopiëren';
String get contacts_copyAdvertToClipboard => 'Advert naar klembord kopiëren';
@override
String get contacts_addContactFromClipboard =>
'Contact uit klembord toevoegen';
@override
String get contacts_ShareContact => 'Kontakt naar Klembord kopiëren';
String get contacts_ShareContact => 'Kontakt naar Klembord kopiëren';
@override
String get contacts_ShareContactZeroHop => 'Contact delen via advertentie';
@ -3030,7 +3072,7 @@ class AppLocalizationsNl extends AppLocalizations {
@override
String get contacts_contactAdvertCopyFailed =>
'Kopiëren van advertentie naar Clipboard is mislukt.';
'Kopiëren van advertentie naar Clipboard is mislukt.';
@override
String get notification_activityTitle => 'MeshCore Activiteit';
@ -3099,8 +3141,7 @@ class AppLocalizationsNl extends AppLocalizations {
'Exporteert alle contacten met een locatie naar een GPX-bestand.';
@override
String get settings_gpxExportSuccess =>
'Succesvol GPX-bestand geëxporteerd.';
String get settings_gpxExportSuccess => 'Succesvol GPX-bestand geëxporteerd.';
@override
String get settings_gpxExportNoContacts => 'Geen contacten om te exporteren.';
@ -3124,7 +3165,7 @@ class AppLocalizationsNl extends AppLocalizations {
@override
String get settings_gpxExportShareText =>
'Kaartgegevens geëxporteerd uit meshcore-open';
'Kaartgegevens geëxporteerd uit meshcore-open';
@override
String get settings_gpxExportShareSubject =>

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,4 +1,4 @@
{
{
"channels_channelDeleteFailed": "Kan kanaal {name} niet verwijderen",
"@channels_channelDeleteFailed": {
"placeholders": {
@ -27,7 +27,7 @@
"common_create": "Maak",
"common_continue": "Doorgaan",
"common_share": "Delen",
"common_copy": "Kopiëren",
"common_copy": "Kopiëren",
"common_retry": "Nogmaals proberen",
"common_hide": "Verbergen",
"common_remove": "Verwijderen",
@ -35,7 +35,7 @@
"common_disable": "Uitschakelen",
"common_reboot": "Herstarten",
"common_loading": "Laden...",
"common_notAvailable": "—",
"common_notAvailable": "",
"common_voltageValue": "{volts} V",
"@common_voltageValue": {
"placeholders": {
@ -92,7 +92,7 @@
"settings_radioSettingsSubtitle": "Frequentie, vermogen, spredfactor",
"settings_radioSettingsUpdated": "Radio instellingen bijgewerkt",
"settings_location": "Locatie",
"settings_locationSubtitle": "GPS coördinaten",
"settings_locationSubtitle": "GPS coördinaten",
"settings_locationUpdated": "Locatie bijgewerkt",
"settings_locationBothRequired": "Voer zowel breedte- als lengtegraad in.",
"settings_locationInvalid": "Ongeldige breedtegraad of lengtegraad.",
@ -165,18 +165,18 @@
"appSettings_language": "Taal",
"appSettings_languageSystem": "Standaardinstelling",
"appSettings_languageEn": "English",
"appSettings_languageFr": "Français",
"appSettings_languageEs": "Español",
"appSettings_languageFr": "Français",
"appSettings_languageEs": "Español",
"appSettings_languageDe": "Deutsch",
"appSettings_languagePl": "Polski",
"appSettings_languageSl": "Slovenščina",
"appSettings_languagePt": "Português",
"appSettings_languageSl": "Slovenščina",
"appSettings_languagePt": "Português",
"appSettings_languageIt": "Italiano",
"appSettings_languageZh": "中文",
"appSettings_languageZh": "中文",
"appSettings_languageSv": "Svenska",
"appSettings_languageNl": "Nederlands",
"appSettings_languageSk": "Slovenčina",
"appSettings_languageBg": "Български",
"appSettings_languageSk": "Slovenčina",
"appSettings_languageBg": "Български",
"appSettings_notifications": "Notificaties",
"appSettings_enableNotifications": "Notificaties inschakelen",
"appSettings_enableNotificationsSubtitle": "Ontvang meldingen voor berichten en advertenties",
@ -338,7 +338,7 @@
},
"channels_hashtagChannel": "Hashtag kanaal",
"channels_public": "Openbaar",
"channels_private": "Privé",
"channels_private": "Privé",
"channels_publicChannel": "Open kanaal",
"channels_privateChannel": "Private kanaal",
"channels_editChannel": "Kanaal bewerken",
@ -623,7 +623,7 @@
"chat_invalidLink": "Ongeldig linkformaat",
"map_title": "Node Map",
"map_noNodesWithLocation": "Geen nodes met locatiegegevens",
"map_nodesNeedGps": "Nodes moeten hun GPS-coördinaten delen\nom op de kaart te verschijnen",
"map_nodesNeedGps": "Nodes moeten hun GPS-coördinaten delen\nom op de kaart te verschijnen",
"map_nodesCount": "Nodes: {count}",
"@map_nodesCount": {
"placeholders": {
@ -645,7 +645,7 @@
"map_room": "Ruimte",
"map_sensor": "Sensor",
"map_pinDm": "Verzenden als bericht (DM)",
"map_pinPrivate": "Beveiligd (Privé)",
"map_pinPrivate": "Beveiligd (Privé)",
"map_pinPublic": "Openbaar spikken",
"map_lastSeen": "Laaste keer gezien",
"map_disconnectConfirm": "Ben je er zeker van dat je verbinding met dit apparaat wilt verbreken?",
@ -1039,7 +1039,7 @@
"repeater_eraseFileSystem": "Verwijder Besturingssysteem",
"repeater_eraseFileSystemSubtitle": "Formateer het bestandsysteem van de repeater",
"repeater_eraseFileSystemConfirm": "WAARSCHUWING: Dit zal alle gegevens op de repeater wissen. Dit kan niet worden teruggedraaid!",
"repeater_eraseSerialOnly": "Verwijderen is alleen beschikbaar via de seriële console.",
"repeater_eraseSerialOnly": "Verwijderen is alleen beschikbaar via de seriële console.",
"repeater_commandSent": "Commando verzonden: {command}",
"@repeater_commandSent": {
"placeholders": {
@ -1143,11 +1143,11 @@
"repeater_cliHelpSetBridgeEnabled": "Poort inschakelen/uitschakelen.",
"repeater_cliHelpSetBridgeDelay": "Verzend vertraging instellen voor pakketten.",
"repeater_cliHelpSetBridgeSource": "Kies of de brug ontvangen pakketten of verzonden pakketten opnieuw moet versturen.",
"repeater_cliHelpSetBridgeBaud": "Stel de seriële link baudrate in voor rs232 bruggen.",
"repeater_cliHelpSetBridgeBaud": "Stel de seriële link baudrate in voor rs232 bruggen.",
"repeater_cliHelpSetBridgeSecret": "Stel bridge-geheim in voor espnow bridges.",
"repeater_cliHelpSetAdcMultiplier": "Stelt een aangepaste factor in om de gerapporteerde batterijspanning aan te passen (alleen ondersteund op selecte borden).",
"repeater_cliHelpTempRadio": "Stelt tijdelijke radio parameters in voor het opgegeven aantal minuten, en keert daarna terug naar de originele radio parameters. (wordt niet opgeslagen in de voorkeuren).",
"repeater_cliHelpSetPerm": "Wijzigt de ACL. Verwijder de overeenkomstige entry (door pubkey prefix) als \"permissions\" 0 is. Voeg een nieuwe entry toe als pubkey-hex volledig is en niet momenteel in de ACL staat. Update de entry door matching pubkey prefix. Toestemming bits variëren per firmware rol, maar de onderste 2 bits zijn: 0 (Gast), 1 (Alleen lezen), 2 (Lezen/schrijven), 3 (Admin)",
"repeater_cliHelpSetPerm": "Wijzigt de ACL. Verwijder de overeenkomstige entry (door pubkey prefix) als \"permissions\" 0 is. Voeg een nieuwe entry toe als pubkey-hex volledig is en niet momenteel in de ACL staat. Update de entry door matching pubkey prefix. Toestemming bits variëren per firmware rol, maar de onderste 2 bits zijn: 0 (Gast), 1 (Alleen lezen), 2 (Lezen/schrijven), 3 (Admin)",
"repeater_cliHelpGetBridgeType": "Ontvang brugtype: geen, rs232, espnow",
"repeater_cliHelpLogStart": "Start pakketlogging naar het bestandssysteem.",
"repeater_cliHelpLogStop": "Stoppen met het loggen van pakketten naar het bestandssysteem.",
@ -1155,7 +1155,7 @@
"repeater_cliHelpNeighbors": "Toont een lijst met andere repeater nodes die via nul-hop advertenties zijn gehoord. Elke regel is id-prefix-hex:timestamp:snr-times-4",
"repeater_cliHelpNeighborRemove": "Verwijdert de eerste overeenkomende vermelding (via pubkey prefix (hex)) uit de lijst van buren.",
"repeater_cliHelpRegion": "(Alleen Serieel) Lijst alle gedefinieerde regio's en huidige floodrechten.",
"repeater_cliHelpRegionLoad": "LET OP: dit is een speciale multi-command aanroep. Elke volgende opdracht is een regiortaak (uitgelijnd met spaties om de ouderhiërarchie aan te duiden, met minimaal één spatie). Beëindigd door een lege regel/opdracht te sturen.",
"repeater_cliHelpRegionLoad": "LET OP: dit is een speciale multi-command aanroep. Elke volgende opdracht is een regiortaak (uitgelijnd met spaties om de ouderhiërarchie aan te duiden, met minimaal één spatie). Beëindigd door een lege regel/opdracht te sturen.",
"repeater_cliHelpRegionGet": "Zoekt naar regio met gegeven naam voorvoegsel (of \"\" voor de globale scope). Antwoordt met \"-> regio-naam (ouder-naam) 'F'\"",
"repeater_cliHelpRegionPut": "Voegt of wijzigt een regio-definitie met de gegeven naam.",
"repeater_cliHelpRegionRemove": "Verwijdert een regio-definitie met de gegeven naam. (moet exact overeenkomen en geen kindregio's hebben)",
@ -1167,7 +1167,7 @@
"repeater_cliHelpGps": "Geeft de status van de GPS. Wanneer de GPS uit staat, antwoordt het alleen met \"uit\", als het aan staat, antwoordt het met \"aan\", status, fix, sat count.",
"repeater_cliHelpGpsOnOff": "Schakel de GPS-standby aan/uit.",
"repeater_cliHelpGpsSync": "Synchroniseer node met GPS-klok.",
"repeater_cliHelpGpsSetLoc": "Stel de positie van de node vast als GPS-coördinaten en sla de voorkeuren op.",
"repeater_cliHelpGpsSetLoc": "Stel de positie van de node vast als GPS-coördinaten en sla de voorkeuren op.",
"repeater_cliHelpGpsAdvert": "Geeft de locatie advertentieconfiguratie van de node:\n- none: locatie niet in advertenties opnemen\n- share: gps locatie delen (van SensorManager)\n- prefs: locatie adverteren die in de voorkeuren is opgeslagen",
"repeater_cliHelpGpsAdvertSet": "Stelt advertentie locatie configuratie in.",
"repeater_commandsListTitle": "Commandenlijst",
@ -1178,9 +1178,9 @@
"repeater_logging": "Logging",
"repeater_neighborsRepeaterOnly": "Buren (Alleen repeaters)",
"repeater_regionManagementRepeaterOnly": "Regiobeheer (Alleen Repeater)",
"repeater_regionNote": "Regio-commando's zijn geïntroduceerd om regio-definities en permissies te beheren.",
"repeater_regionNote": "Regio-commando's zijn geïntroduceerd om regio-definities en permissies te beheren.",
"repeater_gpsManagement": "Beheer GPS",
"repeater_gpsNote": "De GPS-commando is geïntroduceerd om locatiegerelateerde onderwerpen te beheren.",
"repeater_gpsNote": "De GPS-commando is geïntroduceerd om locatiegerelateerde onderwerpen te beheren.",
"telemetry_receivedData": "Ontvangen Telemetriedata",
"telemetry_requestTimeout": "Telemetryverzoek is uitgevallen.",
"telemetry_errorLoading": "Fout bij het laden van de telemetrie: {error}",
@ -1232,7 +1232,7 @@
}
}
},
"telemetry_temperatureValue": "{celsius}°C / {fahrenheit}°F",
"telemetry_temperatureValue": "{celsius}°C / {fahrenheit}°F",
"@telemetry_temperatureValue": {
"placeholders": {
"celsius": {
@ -1254,7 +1254,7 @@
"channelPath_repeatsLabel": "Repeats",
"channelPath_pathLabel": "Pad {index}",
"channelPath_observedLabel": "Waargenomen",
"channelPath_observedPathTitle": "Waargenomen pad {index} • {hops}",
"channelPath_observedPathTitle": "Waargenomen pad {index} {hops}",
"@channelPath_observedPathTitle": {
"placeholders": {
"index": {
@ -1329,7 +1329,7 @@
},
"channelPath_pathLabelTitle": "Pad",
"channelPath_observedPathHeader": "Waargenomen Pad",
"channelPath_selectedPathLabel": "{label} • {prefixes}",
"channelPath_selectedPathLabel": "{label} {prefixes}",
"@channelPath_selectedPathLabel": {
"placeholders": {
"label": {
@ -1369,8 +1369,8 @@
"neighbors_repeatersNeighbors": "Herhalingen Buren",
"neighbors_noData": "Geen gegevens van buren beschikbaar.",
"channels_createPrivateChannelDesc": "Beveiligd met een geheime sleutel.",
"channels_createPrivateChannel": "Maak een Privé Kanaal",
"channels_joinPrivateChannel": "Sluit een Privé Kanaal aan",
"channels_createPrivateChannel": "Maak een Privé Kanaal",
"channels_joinPrivateChannel": "Sluit een Privé Kanaal aan",
"channels_joinPrivateChannelDesc": "Handmatig een geheime sleutel invoeren.",
"channels_joinPublicChannel": "Sluit het Open Kanaal",
"channels_joinPublicChannelDesc": "Iedereen kan dit kanaal aanmelden.",
@ -1558,22 +1558,22 @@
"contacts_roomPing": "Ping kamer server",
"contacts_chatTraceRoute": "Route traceren",
"contacts_pathTraceTo": "Trace route to {name}",
"appSettings_languageUk": "Oekraïens",
"appSettings_languageUk": "Oekraïens",
"contacts_invalidAdvertFormat": "Ongeldige contactgegevens",
"contacts_contactImportFailed": "Contact kon niet geïmporteerd worden.",
"contacts_contactImportFailed": "Contact kon niet geïmporteerd worden.",
"contacts_zeroHopAdvert": "Zero Hop Reclame",
"contacts_floodAdvert": "Overstromingsadvertentie",
"contacts_copyAdvertToClipboard": "Advert naar klembord kopiëren",
"contacts_copyAdvertToClipboard": "Advert naar klembord kopiëren",
"appSettings_languageRu": "Russisch",
"appSettings_enableMessageTracing": "Berichttracking inschakelen",
"appSettings_enableMessageTracingSubtitle": "Gedetailleerde routerings- en timing-metadata voor berichten weergeven",
"contacts_clipboardEmpty": "Knipbord is leeg.",
"contacts_addContactFromClipboard": "Contact uit klembord toevoegen",
"contacts_contactImported": "Contact is geïmporteerd.",
"contacts_contactImported": "Contact is geïmporteerd.",
"contacts_zeroHopContactAdvertSent": "Contact verzonden via advertentie",
"contacts_contactAdvertCopied": "Reclame gekopieerd naar Klembord.",
"contacts_contactAdvertCopyFailed": "Kopiëren van advertentie naar Clipboard is mislukt.",
"contacts_ShareContact": "Kontakt naar Klembord kopiëren",
"contacts_contactAdvertCopyFailed": "Kopiëren van advertentie naar Clipboard is mislukt.",
"contacts_ShareContact": "Kontakt naar Klembord kopiëren",
"contacts_ShareContactZeroHop": "Contact delen via advertentie",
"contacts_zeroHopContactAdvertFailed": "Mislukt om contact te verzenden",
"notification_activityTitle": "MeshCore Activiteit",
@ -1584,7 +1584,7 @@
"notification_receivedNewMessage": "Nieuw bericht ontvangen",
"settings_gpxExportRepeatersSubtitle": "Exporteert repeaters / roomserver met een locatie naar GPX-bestand.",
"settings_gpxExportRepeaters": "Exporteer repeaters / roomserver naar GPX",
"settings_gpxExportSuccess": "Succesvol GPX-bestand geëxporteerd.",
"settings_gpxExportSuccess": "Succesvol GPX-bestand geëxporteerd.",
"settings_gpxExportNoContacts": "Geen contacten om te exporteren.",
"settings_gpxExportNotAvailable": "Niet ondersteund op uw apparaat/besturingssysteem",
"settings_gpxExportError": "Er was een fout bij het exporteren.",
@ -1595,7 +1595,7 @@
"settings_gpxExportRepeatersRoom": "Repeater- en kamer servers locaties",
"settings_gpxExportChat": "Locaties van metgezellen",
"settings_gpxExportAllContacts": "Alle contactlocaties",
"settings_gpxExportShareText": "Kaartgegevens geëxporteerd uit meshcore-open",
"settings_gpxExportShareText": "Kaartgegevens geëxporteerd uit meshcore-open",
"settings_gpxExportShareSubject": "meshcore-open GPX kaartgegevens exporteren",
"pathTrace_someHopsNoLocation": "Een of meer van de hops ontbreken een locatie!",
"map_removeLast": "Verwijder Laatste",
@ -1802,11 +1802,23 @@
"contacts_searchUsers": "Zoek {number}{str} gebruikers...",
"contacts_searchFavorites": "Zoek {number}{str} favorieten...",
"contacts_searchRoomServers": "Zoek {number}{str} Room servers...",
"connectionChoiceUsbLabel": "USB",
"connectionChoiceBluetoothLabel": "Bluetooth",
"usbScreenSubtitle": "Kies een gedetecteerd seriële apparaat en verbind deze direct met uw MeshCore-node.",
"usbScreenTitle": "Verbind via USB",
"usbScreenStatus": "Selecteer een USB-apparaat",
"usbScreenNote": "USB-serieel is actief op ondersteunde Android-apparaten en desktop-platforms.",
"usbScreenTitle": "Verbind via USB",
"usbScreenEmptyState": "Geen USB-apparaten gevonden. Sluit er een aan en herlaad."
"usbScreenSubtitle": "Kies een gedetecteerd seriële apparaat en verbind deze direct met uw MeshCore-node.",
"usbScreenEmptyState": "Geen USB-apparaten gevonden. Sluit er een aan en herlaad.",
"usbErrorPermissionDenied": "Toegang via USB is geweigerd.",
"usbErrorDeviceMissing": "Het geselecteerde USB-apparaat is niet meer beschikbaar.",
"usbErrorInvalidPort": "Selecteer een geldig USB-apparaat.",
"usbErrorBusy": "Een andere verzoek om een USB-verbinding is al in behandeling.",
"usbErrorNotConnected": "Er is geen USB-apparaat aangesloten.",
"usbErrorOpenFailed": "Kon het geselecteerde USB-apparaat niet openen.",
"usbErrorConnectFailed": "Kon niet verbinding maken met het geselecteerde USB-apparaat.",
"usbErrorUnsupported": "USB-serieel is niet ondersteund op deze platform.",
"usbErrorAlreadyActive": "Een USB-verbinding is al actief.",
"usbErrorNoDeviceSelected": "Geen USB-apparaat is geselecteerd.",
"usbErrorPortClosed": "De USB-verbinding is niet actief.",
"usbErrorConnectTimedOut": "Wachtperiode is verlopen, er is geen reactie ontvangen van het apparaat.",
"connectionChoiceUsbLabel": "USB",
"connectionChoiceBluetoothLabel": "Bluetooth"
}

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -2,6 +2,7 @@ import 'dart:async';
import 'dart:math' as math;
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:provider/provider.dart';
import '../connector/meshcore_connector.dart';
@ -481,7 +482,7 @@ class _UsbScreenState extends State<UsbScreen> {
setState(() {
_ports.clear();
_selectedPort = null;
_errorText = error.toString();
_errorText = _friendlyErrorMessage(error);
_isLoadingPorts = false;
});
}
@ -523,16 +524,56 @@ class _UsbScreenState extends State<UsbScreen> {
}
}
/// Strips the Dart runtime prefix (e.g. "Bad state: ", "Exception: ")
/// from error messages before showing them in the UI.
String _friendlyErrorMessage(Object error) {
final l10n = context.l10n;
if (error is PlatformException) {
switch (error.code) {
case 'usb_permission_denied':
return l10n.usbErrorPermissionDenied;
case 'usb_device_missing':
case 'usb_device_detached':
return l10n.usbErrorDeviceMissing;
case 'usb_invalid_port':
return l10n.usbErrorInvalidPort;
case 'usb_busy':
return l10n.usbErrorBusy;
case 'usb_not_connected':
return l10n.usbErrorNotConnected;
case 'usb_driver_missing':
case 'usb_open_failed':
return l10n.usbErrorOpenFailed;
case 'usb_connect_failed':
case 'usb_write_failed':
case 'usb_io_error':
return l10n.usbErrorConnectFailed;
}
}
var msg = error.toString();
// StateError surfaces as "Bad state: <message>"
if (msg.startsWith('Bad state: ')) {
msg = msg.substring('Bad state: '.length);
} else if (msg.startsWith('Exception: ')) {
msg = msg.substring('Exception: '.length);
}
switch (msg) {
case 'USB serial transport is already active':
return l10n.usbErrorAlreadyActive;
case 'No USB serial device selected':
return l10n.usbErrorNoDeviceSelected;
case 'USB serial port is not open':
return l10n.usbErrorPortClosed;
case 'USB serial is not supported on this platform.':
case 'Web Serial is not supported by this browser.':
return l10n.usbErrorUnsupported;
case 'Timed out waiting for SELF_INFO during connect':
return l10n.usbErrorConnectTimedOut;
}
if (msg.startsWith('Failed to open USB port ')) {
return l10n.usbErrorOpenFailed;
}
return msg;
}

View file

@ -140,7 +140,7 @@ class UsbSerialService {
'Android connect failed: $msg',
tag: 'USB Serial',
);
throw StateError(msg);
rethrow;
}
} else {
// Hot-restart guard

View file

@ -105,7 +105,7 @@ void main() {
);
testWidgets(
'UsbScreen keeps raw selection while showing connector USB display label',
'UsbScreen keeps raw selection when connector USB display label changes',
(tester) async {
final connector = _FakeMeshCoreConnector(
ports: <String>['COM6 - USB Serial Device (COM6)'],
@ -121,8 +121,6 @@ void main() {
connector.notifyListeners();
await tester.pump();
expect(find.text('KD3CGK mesh-utility.org'), findsOneWidget);
await tester.tap(find.widgetWithText(FilledButton, 'Connect'));
await tester.pump();