diff --git a/lib/connector/meshcore_connector.dart b/lib/connector/meshcore_connector.dart index 5d6c7e6..5cdab78 100644 --- a/lib/connector/meshcore_connector.dart +++ b/lib/connector/meshcore_connector.dart @@ -90,6 +90,8 @@ class MeshCoreConnector extends ChangeNotifier { int? _currentBwHz; int? _currentSf; int? _currentCr; + bool? _clientRepeat; + int? _firmwareVerCode; int? _batteryMillivolts; double? _selfLatitude; double? _selfLongitude; @@ -200,6 +202,8 @@ class MeshCoreConnector extends ChangeNotifier { int? get currentBwHz => _currentBwHz; int? get currentSf => _currentSf; int? get currentCr => _currentCr; + bool? get clientRepeat => _clientRepeat; + int? get firmwareVerCode => _firmwareVerCode; Map? get currentCustomVars => _currentCustomVars; int? get batteryMillivolts => _batteryMillivolts; int get maxContacts => _maxContacts; @@ -916,6 +920,8 @@ class MeshCoreConnector extends ChangeNotifier { _selfName = null; _selfLatitude = null; _selfLongitude = null; + _clientRepeat = null; + _firmwareVerCode = null; _batteryMillivolts = null; _batteryRequested = false; _awaitingSelfInfo = false; @@ -1820,6 +1826,13 @@ class MeshCoreConnector extends ChangeNotifier { void _handleDeviceInfo(Uint8List frame) { if (frame.length < 4) return; + _firmwareVerCode = frame[1]; + + // Parse client_repeat from firmware v9+ (byte 80) + if (frame.length >= 81) { + _clientRepeat = frame[80] != 0; + } + // Firmware reports MAX_CONTACTS / 2 for v3+ device info. final reportedContacts = frame[2]; final reportedChannels = frame[3]; @@ -1840,8 +1853,8 @@ class MeshCoreConnector extends ChangeNotifier { unawaited(getChannels(maxChannels: nextMaxChannels)); } } - notifyListeners(); } + notifyListeners(); } void _handleNoMoreMessages() { diff --git a/lib/connector/meshcore_protocol.dart b/lib/connector/meshcore_protocol.dart index 25359a8..0b78c65 100644 --- a/lib/connector/meshcore_protocol.dart +++ b/lib/connector/meshcore_protocol.dart @@ -550,18 +550,24 @@ Uint8List buildSetChannelFrame(int channelIndex, String name, Uint8List psk) { } // Build CMD_SET_RADIO_PARAMS frame -// Format: [cmd][freq x4][bw x4][sf][cr] +// Format: [cmd][freq x4][bw x4][sf][cr] (pre-v9) +// [cmd][freq x4][bw x4][sf][cr][repeat] (firmware v9+) // freq: frequency in Hz (300000-2500000) // bw: bandwidth in Hz (7000-500000) // sf: spreading factor (5-12) // cr: coding rate (5-8) -Uint8List buildSetRadioParamsFrame(int freqHz, int bwHz, int sf, int cr) { +// clientRepeat: enable off-grid packet repeat (firmware v9+, omit for older) +Uint8List buildSetRadioParamsFrame(int freqHz, int bwHz, int sf, int cr, + {bool? clientRepeat}) { final writer = BufferWriter(); writer.writeByte(cmdSetRadioParams); writer.writeUInt32LE(freqHz); writer.writeUInt32LE(bwHz); writer.writeByte(sf); writer.writeByte(cr); + if (clientRepeat != null) { + writer.writeByte(clientRepeat ? 1 : 0); + } return writer.toBytes(); } diff --git a/lib/l10n/app_bg.arb b/lib/l10n/app_bg.arb index a1cfb3e..567c74c 100644 --- a/lib/l10n/app_bg.arb +++ b/lib/l10n/app_bg.arb @@ -131,9 +131,6 @@ "settings_infoContactsCount": "Брой контакти", "settings_infoChannelCount": "Брой канали", "settings_presets": "Предварителни настройки", - "settings_preset915Mhz": "915 MHz", - "settings_preset868Mhz": "868 MHz", - "settings_preset433Mhz": "433 MHz", "settings_frequency": "Честота (MHz)", "settings_frequencyHelper": "300.0 - 2500.0", "settings_frequencyInvalid": "Невалидна честота (300-2500 MHz)", @@ -143,8 +140,6 @@ "settings_txPower": "TX Мощност (dBm)", "settings_txPowerHelper": "0 - 22", "settings_txPowerInvalid": "Невалидна мощност на TX (0-22 dBm)", - "settings_longRange": "Дълъг обхват", - "settings_fastSpeed": "Бърза скорост", "settings_error": "Грешка: {message}", "@settings_error": { "placeholders": { @@ -1598,5 +1593,8 @@ "map_tapToAdd": "Натиснете върху възлите, за да ги добавите към пътя.", "scanner_bluetoothOff": "Bluetooth е изключен.", "scanner_enableBluetooth": "Активирайте Bluetooth", - "scanner_bluetoothOffMessage": "Моля, активирайте Bluetooth, за да сканирате за устройства." + "scanner_bluetoothOffMessage": "Моля, активирайте Bluetooth, за да сканирате за устройства.", + "settings_clientRepeatSubtitle": "Позволете на това устройство да предава пакети към мрежата за други устройства.", + "settings_clientRepeatFreqWarning": "За повторение извън мрежата са необходими честоти от 433, 869 или 918 MHz.", + "settings_clientRepeat": "Без електричество – повторение" } diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb index 2e66222..7aba89b 100644 --- a/lib/l10n/app_de.arb +++ b/lib/l10n/app_de.arb @@ -131,9 +131,6 @@ "settings_infoContactsCount": "Anzahl Kontakte", "settings_infoChannelCount": "Anzahl Kanäle", "settings_presets": "Voreinstellungen", - "settings_preset915Mhz": "915 MHz", - "settings_preset868Mhz": "868 MHz", - "settings_preset433Mhz": "433 MHz", "settings_frequency": "Frequenz (MHz)", "settings_frequencyHelper": "300,00 - 2.500,00", "settings_frequencyInvalid": "Ungültige Frequenz (300-2500 MHz)", @@ -143,8 +140,6 @@ "settings_txPower": "TX-Leistung (dBm)", "settings_txPowerHelper": "0 - 22", "settings_txPowerInvalid": "Ungültige TX-Leistung (0-22 dBm)", - "settings_longRange": "Grosse Reichweite", - "settings_fastSpeed": "Schnelle Geschwindigkeit", "settings_error": "Fehler: {message}", "@settings_error": { "placeholders": { @@ -1626,5 +1621,8 @@ "map_pathTraceCancelled": "Pfadverfolgung abgebrochen.", "scanner_bluetoothOffMessage": "Bitte aktivieren Sie Bluetooth, um nach Geräten zu suchen.", "scanner_bluetoothOff": "Bluetooth ist deaktiviert.", - "scanner_enableBluetooth": "Bluetooth aktivieren" + "scanner_enableBluetooth": "Bluetooth aktivieren", + "settings_clientRepeat": "Wiederholung, ohne Stromanschluss", + "settings_clientRepeatFreqWarning": "Die Kommunikation ohne Stromversorgung erfordert Frequenzen von 433, 869 oder 918 MHz.", + "settings_clientRepeatSubtitle": "Ermöglichen Sie diesem Gerät, Mesh-Pakete für andere zu wiederholen." } diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 890b992..cfd6330 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -1,12 +1,9 @@ { "@@locale": "en", - "appTitle": "MeshCore Open", - "nav_contacts": "Contacts", "nav_channels": "Channels", "nav_map": "Map", - "common_cancel": "Cancel", "common_ok": "OK", "common_connect": "Connect", @@ -35,16 +32,19 @@ "common_voltageValue": "{volts} V", "@common_voltageValue": { "placeholders": { - "volts": {"type": "String"} + "volts": { + "type": "String" + } } }, "common_percentValue": "{percent}%", "@common_percentValue": { "placeholders": { - "percent": {"type": "int"} + "percent": { + "type": "int" + } } }, - "scanner_title": "MeshCore Open", "scanner_scanning": "Scanning for devices...", "scanner_connecting": "Connecting...", @@ -53,7 +53,9 @@ "scanner_connectedTo": "Connected to {deviceName}", "@scanner_connectedTo": { "placeholders": { - "deviceName": {"type": "String"} + "deviceName": { + "type": "String" + } } }, "scanner_searchingDevices": "Searching for MeshCore devices...", @@ -61,7 +63,9 @@ "scanner_connectionFailed": "Connection failed: {error}", "@scanner_connectionFailed": { "placeholders": { - "error": {"type": "String"} + "error": { + "type": "String" + } } }, "scanner_stop": "Stop", @@ -69,10 +73,8 @@ "scanner_bluetoothOff": "Bluetooth is off", "scanner_bluetoothOffMessage": "Please turn on Bluetooth to scan for devices", "scanner_enableBluetooth": "Enable Bluetooth", - "device_quickSwitch": "Quick switch", "device_meshcore": "MeshCore", - "settings_title": "Settings", "settings_deviceInfo": "Device Info", "settings_appSettings": "App Settings", @@ -122,7 +124,9 @@ "settings_aboutVersion": "MeshCore Open v{version}", "@settings_aboutVersion": { "placeholders": { - "version": {"type": "String"} + "version": { + "type": "String" + } } }, "settings_aboutLegalese": "2026 MeshCore Open Source Project", @@ -135,9 +139,6 @@ "settings_infoContactsCount": "Contacts Count", "settings_infoChannelCount": "Channel Count", "settings_presets": "Presets", - "settings_preset915Mhz": "915 MHz", - "settings_preset868Mhz": "868 MHz", - "settings_preset433Mhz": "433 MHz", "settings_frequency": "Frequency (MHz)", "settings_frequencyHelper": "300.0 - 2500.0", "settings_frequencyInvalid": "Invalid frequency (300-2500 MHz)", @@ -147,15 +148,17 @@ "settings_txPower": "TX Power (dBm)", "settings_txPowerHelper": "0 - 22", "settings_txPowerInvalid": "Invalid TX power (0-22 dBm)", - "settings_longRange": "Long Range", - "settings_fastSpeed": "Fast Speed", + "settings_clientRepeat": "Off-Grid Repeat", + "settings_clientRepeatSubtitle": "Allow this device to repeat mesh packets for others", + "settings_clientRepeatFreqWarning": "Off-grid repeat requires 433, 869, or 918 MHz frequency", "settings_error": "Error: {message}", "@settings_error": { "placeholders": { - "message": {"type": "String"} + "message": { + "type": "String" + } } }, - "appSettings_title": "App Settings", "appSettings_appearance": "Appearance", "appSettings_theme": "Theme", @@ -205,7 +208,9 @@ "appSettings_batteryChemistryPerDevice": "Set per device ({deviceName})", "@appSettings_batteryChemistryPerDevice": { "placeholders": { - "deviceName": {"type": "String"} + "deviceName": { + "type": "String" + } } }, "appSettings_batteryChemistryConnectFirst": "Connect to a device to choose", @@ -224,7 +229,9 @@ "appSettings_timeFilterShowLast": "Show nodes from last {hours} hours", "@appSettings_timeFilterShowLast": { "placeholders": { - "hours": {"type": "int"} + "hours": { + "type": "int" + } } }, "appSettings_mapTimeFilter": "Map Time Filter", @@ -239,8 +246,12 @@ "appSettings_areaSelectedZoom": "Area selected (zoom {minZoom}-{maxZoom})", "@appSettings_areaSelectedZoom": { "placeholders": { - "minZoom": {"type": "int"}, - "maxZoom": {"type": "int"} + "minZoom": { + "type": "int" + }, + "maxZoom": { + "type": "int" + } } }, "appSettings_debugCard": "Debug", @@ -248,7 +259,6 @@ "appSettings_appDebugLoggingSubtitle": "Log app debug messages for troubleshooting", "appSettings_appDebugLoggingEnabled": "App debug logging enabled", "appSettings_appDebugLoggingDisabled": "App debug logging disabled", - "contacts_title": "Contacts", "contacts_noContacts": "No contacts yet", "contacts_contactsWillAppear": "Contacts will appear when devices advertise", @@ -259,7 +269,9 @@ "contacts_removeConfirm": "Remove {contactName} from contacts?", "@contacts_removeConfirm": { "placeholders": { - "contactName": {"type": "String"} + "contactName": { + "type": "String" + } } }, "contacts_manageRepeater": "Manage Repeater", @@ -271,7 +283,9 @@ "contacts_deleteGroupConfirm": "Remove \"{groupName}\"?", "@contacts_deleteGroupConfirm": { "placeholders": { - "groupName": {"type": "String"} + "groupName": { + "type": "String" + } } }, "contacts_newGroup": "New Group", @@ -280,7 +294,9 @@ "contacts_groupAlreadyExists": "Group \"{name}\" already exists", "@contacts_groupAlreadyExists": { "placeholders": { - "name": {"type": "String"} + "name": { + "type": "String" + } } }, "contacts_filterContacts": "Filter contacts...", @@ -290,24 +306,29 @@ "contacts_lastSeenMinsAgo": "Last seen {minutes} mins ago", "@contacts_lastSeenMinsAgo": { "placeholders": { - "minutes": {"type": "int"} + "minutes": { + "type": "int" + } } }, "contacts_lastSeenHourAgo": "Last seen 1 hour ago", "contacts_lastSeenHoursAgo": "Last seen {hours} hours ago", "@contacts_lastSeenHoursAgo": { "placeholders": { - "hours": {"type": "int"} + "hours": { + "type": "int" + } } }, "contacts_lastSeenDayAgo": "Last seen 1 day ago", "contacts_lastSeenDaysAgo": "Last seen {days} days ago", "@contacts_lastSeenDaysAgo": { "placeholders": { - "days": {"type": "int"} + "days": { + "type": "int" + } } }, - "channels_title": "Channels", "channels_noChannelsConfigured": "No channels configured", "channels_addPublicChannel": "Add Public Channel", @@ -316,7 +337,9 @@ "channels_channelIndex": "Channel {index}", "@channels_channelIndex": { "placeholders": { - "index": {"type": "int"} + "index": { + "type": "int" + } } }, "channels_hashtagChannel": "Hashtag channel", @@ -329,13 +352,17 @@ "channels_deleteChannelConfirm": "Delete \"{name}\"? This cannot be undone.", "@channels_deleteChannelConfirm": { "placeholders": { - "name": {"type": "String"} + "name": { + "type": "String" + } } }, "channels_channelDeleted": "Channel \"{name}\" deleted", "@channels_channelDeleted": { "placeholders": { - "name": {"type": "String"} + "name": { + "type": "String" + } } }, "channels_addChannel": "Add Channel", @@ -350,20 +377,26 @@ "channels_channelAdded": "Channel \"{name}\" added", "@channels_channelAdded": { "placeholders": { - "name": {"type": "String"} + "name": { + "type": "String" + } } }, "channels_editChannelTitle": "Edit Channel {index}", "@channels_editChannelTitle": { "placeholders": { - "index": {"type": "int"} + "index": { + "type": "int" + } } }, "channels_smazCompression": "SMAZ compression", "channels_channelUpdated": "Channel \"{name}\" updated", "@channels_channelUpdated": { "placeholders": { - "name": {"type": "String"} + "name": { + "type": "String" + } } }, "channels_publicChannelAdded": "Public channel added", @@ -384,34 +417,41 @@ "channels_scanQrCodeComingSoon": "Coming soon", "channels_enterHashtag": "Enter hashtag", "channels_hashtagHint": "e.g. #team", - "chat_noMessages": "No messages yet", "chat_sendMessageToStart": "Send a message to get started", "chat_originalMessageNotFound": "Original message not found", "chat_replyingTo": "Replying to {name}", "@chat_replyingTo": { "placeholders": { - "name": {"type": "String"} + "name": { + "type": "String" + } } }, "chat_replyTo": "Reply to {name}", "@chat_replyTo": { "placeholders": { - "name": {"type": "String"} + "name": { + "type": "String" + } } }, "chat_location": "Location", "chat_sendMessageTo": "Send a message to {contactName}", "@chat_sendMessageTo": { "placeholders": { - "contactName": {"type": "String"} + "contactName": { + "type": "String" + } } }, "chat_typeMessage": "Type a message...", "chat_messageTooLong": "Message too long (max {maxBytes} bytes).", "@chat_messageTooLong": { "placeholders": { - "maxBytes": {"type": "int"} + "maxBytes": { + "type": "int" + } } }, "chat_messageCopied": "Message copied", @@ -420,8 +460,12 @@ "chat_retryCount": "Retry {current}/{max}", "@chat_retryCount": { "placeholders": { - "current": {"type": "int"}, - "max": {"type": "int"} + "current": { + "type": "int" + }, + "max": { + "type": "int" + } } }, "chat_sendGif": "Send GIF", @@ -453,39 +497,53 @@ "debugFrame_length": "Frame Length: {count} bytes", "@debugFrame_length": { "placeholders": { - "count": {"type": "int"} + "count": { + "type": "int" + } } }, "debugFrame_command": "Command: 0x{value}", "@debugFrame_command": { "placeholders": { - "value": {"type": "String"} + "value": { + "type": "String" + } } }, "debugFrame_textMessageHeader": "Text Message Frame:", "debugFrame_destinationPubKey": "- Destination PubKey: {pubKey}", "@debugFrame_destinationPubKey": { "placeholders": { - "pubKey": {"type": "String"} + "pubKey": { + "type": "String" + } } }, "debugFrame_timestamp": "- Timestamp: {timestamp}", "@debugFrame_timestamp": { "placeholders": { - "timestamp": {"type": "int"} + "timestamp": { + "type": "int" + } } }, "debugFrame_flags": "- Flags: 0x{value}", "@debugFrame_flags": { "placeholders": { - "value": {"type": "String"} + "value": { + "type": "String" + } } }, "debugFrame_textType": "- Text Type: {type} ({label})", "@debugFrame_textType": { "placeholders": { - "type": {"type": "int"}, - "label": {"type": "String"} + "type": { + "type": "int" + }, + "label": { + "type": "String" + } } }, "debugFrame_textTypeCli": "CLI", @@ -493,7 +551,9 @@ "debugFrame_text": "- Text: \"{text}\"", "@debugFrame_text": { "placeholders": { - "text": {"type": "String"} + "text": { + "type": "String" + } } }, "debugFrame_hexDump": "Hex Dump:", @@ -508,7 +568,9 @@ "chat_hopsCount": "{count} {count, plural, =1{hop} other{hops}}", "@chat_hopsCount": { "placeholders": { - "count": {"type": "int"} + "count": { + "type": "int" + } } }, "chat_successes": "successes", @@ -527,8 +589,12 @@ "chat_pathSetHops": "Path set: {hopCount} {hopCount, plural, =1{hop} other{hops}} - {status}", "@chat_pathSetHops": { "placeholders": { - "hopCount": {"type": "int"}, - "status": {"type": "String"} + "hopCount": { + "type": "int" + }, + "status": { + "type": "String" + } } }, "chat_pathSavedLocally": "Saved locally. Connect to sync.", @@ -543,7 +609,9 @@ "chat_hopsForced": "{count} hops (forced)", "@chat_hopsForced": { "placeholders": { - "count": {"type": "int"} + "count": { + "type": "int" + } } }, "chat_floodAuto": "Flood (auto)", @@ -552,7 +620,9 @@ "chat_unread": "Unread: {count}", "@chat_unread": { "placeholders": { - "count": {"type": "int"} + "count": { + "type": "int" + } } }, "chat_openLink": "Open Link?", @@ -561,24 +631,29 @@ "chat_couldNotOpenLink": "Could not open link: {url}", "@chat_couldNotOpenLink": { "placeholders": { - "url": {"type": "String"} + "url": { + "type": "String" + } } }, "chat_invalidLink": "Invalid link format", - "map_title": "Node Map", "map_noNodesWithLocation": "No nodes with location data", "map_nodesNeedGps": "Nodes need to share their GPS coordinates\nto appear on the map", "map_nodesCount": "Nodes: {count}", "@map_nodesCount": { "placeholders": { - "count": {"type": "int"} + "count": { + "type": "int" + } } }, "map_pinsCount": "Pins: {count}", "@map_pinsCount": { "placeholders": { - "count": {"type": "int"} + "count": { + "type": "int" + } } }, "map_chat": "Chat", @@ -604,7 +679,9 @@ "map_publicLocationShareConfirm": "You are about to share a location in {channelLabel}. This channel is public and anyone with the PSK can see it.", "@map_publicLocationShareConfirm": { "placeholders": { - "channelLabel": {"type": "String"} + "channelLabel": { + "type": "String" + } } }, "map_connectToShareMarkers": "Connect to a device to share markers", @@ -633,21 +710,29 @@ "mapCache_downloadTilesPrompt": "Download {count} tiles for offline use?", "@mapCache_downloadTilesPrompt": { "placeholders": { - "count": {"type": "int"} + "count": { + "type": "int" + } } }, "mapCache_downloadAction": "Download", "mapCache_cachedTiles": "Cached {count} tiles", "@mapCache_cachedTiles": { "placeholders": { - "count": {"type": "int"} + "count": { + "type": "int" + } } }, "mapCache_cachedTilesWithFailed": "Cached {downloaded} tiles ({failed} failed)", "@mapCache_cachedTilesWithFailed": { "placeholders": { - "downloaded": {"type": "int"}, - "failed": {"type": "int"} + "downloaded": { + "type": "int" + }, + "failed": { + "type": "int" + } } }, "mapCache_clearOfflineCacheTitle": "Clear offline cache", @@ -660,14 +745,20 @@ "mapCache_estimatedTiles": "Estimated tiles: {count}", "@mapCache_estimatedTiles": { "placeholders": { - "count": {"type": "int"} + "count": { + "type": "int" + } } }, "mapCache_downloadedTiles": "Downloaded {completed} / {total}", "@mapCache_downloadedTiles": { "placeholders": { - "completed": {"type": "int"}, - "total": {"type": "int"} + "completed": { + "type": "int" + }, + "total": { + "type": "int" + } } }, "mapCache_downloadTilesButton": "Download Tiles", @@ -675,36 +766,51 @@ "mapCache_failedDownloads": "Failed downloads: {count}", "@mapCache_failedDownloads": { "placeholders": { - "count": {"type": "int"} + "count": { + "type": "int" + } } }, "mapCache_boundsLabel": "N {north}, S {south}, E {east}, W {west}", "@mapCache_boundsLabel": { "placeholders": { - "north": {"type": "String"}, - "south": {"type": "String"}, - "east": {"type": "String"}, - "west": {"type": "String"} + "north": { + "type": "String" + }, + "south": { + "type": "String" + }, + "east": { + "type": "String" + }, + "west": { + "type": "String" + } } }, - "time_justNow": "Just now", "time_minutesAgo": "{minutes}m ago", "@time_minutesAgo": { "placeholders": { - "minutes": {"type": "int"} + "minutes": { + "type": "int" + } } }, "time_hoursAgo": "{hours}h ago", "@time_hoursAgo": { "placeholders": { - "hours": {"type": "int"} + "hours": { + "type": "int" + } } }, "time_daysAgo": "{days}d ago", "@time_daysAgo": { "placeholders": { - "days": {"type": "int"} + "days": { + "type": "int" + } } }, "time_hour": "hour", @@ -717,10 +823,8 @@ "time_months": "months", "time_minutes": "minutes", "time_allTime": "All Time", - "dialog_disconnect": "Disconnect", "dialog_disconnectConfirm": "Are you sure you want to disconnect from this device?", - "login_repeaterLogin": "Repeater Login", "login_roomLogin": "Room Server Login", "login_password": "Password", @@ -738,32 +842,39 @@ "login_attempt": "Attempt {current}/{max}", "@login_attempt": { "placeholders": { - "current": {"type": "int"}, - "max": {"type": "int"} + "current": { + "type": "int" + }, + "max": { + "type": "int" + } } }, "login_failed": "Login failed: {error}", "@login_failed": { "placeholders": { - "error": {"type": "String"} + "error": { + "type": "String" + } } }, "login_failedMessage": "Login failed. Either the password is incorrect or the repeater is unreachable.", - - "common_reload": "Reload", "common_clear": "Clear", - "path_currentPath": "Current path: {path}", "@path_currentPath": { "placeholders": { - "path": {"type": "String"} + "path": { + "type": "String" + } } }, "path_usingHopsPath": "Using {count} {count, plural, =1{hop} other{hops}} path", "@path_usingHopsPath": { "placeholders": { - "count": {"type": "int"} + "count": { + "type": "int" + } } }, "path_enterCustomPath": "Enter Custom Path", @@ -778,12 +889,13 @@ "path_invalidHexPrefixes": "Invalid hex prefixes: {prefixes}", "@path_invalidHexPrefixes": { "placeholders": { - "prefixes": {"type": "String"} + "prefixes": { + "type": "String" + } } }, "path_tooLong": "Path too long. Maximum 64 hops allowed.", "path_setPath": "Set Path", - "repeater_management": "Repeater Management", "room_management": "Room Server Management", "repeater_managementTools": "Management Tools", @@ -797,7 +909,6 @@ "repeater_neighboursSubtitle": "View zero hop neighbors.", "repeater_settings": "Settings", "repeater_settingsSubtitle": "Configure repeater parameters", - "repeater_statusTitle": "Repeater Status", "repeater_routingMode": "Routing mode", "repeater_autoUseSavedPath": "Auto (use saved path)", @@ -808,7 +919,9 @@ "repeater_errorLoadingStatus": "Error loading status: {error}", "@repeater_errorLoadingStatus": { "placeholders": { - "error": {"type": "String"} + "error": { + "type": "String" + } } }, "repeater_systemInformation": "System Information", @@ -830,42 +943,67 @@ "repeater_daysHoursMinsSecs": "{days} days {hours}h {minutes}m {seconds}s", "@repeater_daysHoursMinsSecs": { "placeholders": { - "days": {"type": "int"}, - "hours": {"type": "int"}, - "minutes": {"type": "int"}, - "seconds": {"type": "int"} + "days": { + "type": "int" + }, + "hours": { + "type": "int" + }, + "minutes": { + "type": "int" + }, + "seconds": { + "type": "int" + } } }, "repeater_packetTxTotal": "Total: {total}, Flood: {flood}, Direct: {direct}", "@repeater_packetTxTotal": { "placeholders": { - "total": {"type": "int"}, - "flood": {"type": "String"}, - "direct": {"type": "String"} + "total": { + "type": "int" + }, + "flood": { + "type": "String" + }, + "direct": { + "type": "String" + } } }, "repeater_packetRxTotal": "Total: {total}, Flood: {flood}, Direct: {direct}", "@repeater_packetRxTotal": { "placeholders": { - "total": {"type": "int"}, - "flood": {"type": "String"}, - "direct": {"type": "String"} + "total": { + "type": "int" + }, + "flood": { + "type": "String" + }, + "direct": { + "type": "String" + } } }, "repeater_duplicatesFloodDirect": "Flood: {flood}, Direct: {direct}", "@repeater_duplicatesFloodDirect": { "placeholders": { - "flood": {"type": "String"}, - "direct": {"type": "String"} + "flood": { + "type": "String" + }, + "direct": { + "type": "String" + } } }, "repeater_duplicatesTotal": "Total: {total}", "@repeater_duplicatesTotal": { "placeholders": { - "total": {"type": "int"} + "total": { + "type": "int" + } } }, - "repeater_settingsTitle": "Repeater Settings", "repeater_basicSettings": "Basic Settings", "repeater_repeaterName": "Repeater Name", @@ -899,14 +1037,18 @@ "repeater_localAdvertIntervalMinutes": "{minutes} minutes", "@repeater_localAdvertIntervalMinutes": { "placeholders": { - "minutes": {"type": "int"} + "minutes": { + "type": "int" + } } }, "repeater_floodAdvertInterval": "Flood Advertisement Interval", "repeater_floodAdvertIntervalHours": "{hours} hours", "@repeater_floodAdvertIntervalHours": { "placeholders": { - "hours": {"type": "int"} + "hours": { + "type": "int" + } } }, "repeater_encryptedAdvertInterval": "Encrypted Advertisement Interval", @@ -924,13 +1066,17 @@ "repeater_commandSent": "Command sent: {command}", "@repeater_commandSent": { "placeholders": { - "command": {"type": "String"} + "command": { + "type": "String" + } } }, "repeater_errorSendingCommand": "Error sending command: {error}", "@repeater_errorSendingCommand": { "placeholders": { - "error": {"type": "String"} + "error": { + "type": "String" + } } }, "repeater_confirm": "Confirm", @@ -938,7 +1084,9 @@ "repeater_errorSavingSettings": "Error saving settings: {error}", "@repeater_errorSavingSettings": { "placeholders": { - "error": {"type": "String"} + "error": { + "type": "String" + } } }, "repeater_refreshBasicSettings": "Refresh Basic Settings", @@ -952,16 +1100,19 @@ "repeater_refreshed": "{label} refreshed", "@repeater_refreshed": { "placeholders": { - "label": {"type": "String"} + "label": { + "type": "String" + } } }, "repeater_errorRefreshing": "Error refreshing {label}", "@repeater_errorRefreshing": { "placeholders": { - "label": {"type": "String"} + "label": { + "type": "String" + } } }, - "repeater_cliTitle": "Repeater CLI", "repeater_debugNextCommand": "Debug Next Command", "repeater_commandHelp": "Command Help", @@ -976,7 +1127,9 @@ "repeater_cliCommandError": "Error: {error}", "@repeater_cliCommandError": { "placeholders": { - "error": {"type": "String"} + "error": { + "type": "String" + } } }, "repeater_cliQuickGetName": "Get Name", @@ -1056,14 +1209,18 @@ "telemetry_errorLoading": "Error loading telemetry: {error}", "@telemetry_errorLoading": { "placeholders": { - "error": {"type": "String"} + "error": { + "type": "String" + } } }, "telemetry_noData": "No telemetry data available.", "telemetry_channelTitle": "Channel {channel}", "@telemetry_channelTitle": { "placeholders": { - "channel": {"type": "int"} + "channel": { + "type": "int" + } } }, "telemetry_batteryLabel": "Battery", @@ -1074,36 +1231,49 @@ "telemetry_batteryValue": "{percent}% / {volts}V", "@telemetry_batteryValue": { "placeholders": { - "percent": {"type": "int"}, - "volts": {"type": "String"} + "percent": { + "type": "int" + }, + "volts": { + "type": "String" + } } }, "telemetry_voltageValue": "{volts}V", "@telemetry_voltageValue": { "placeholders": { - "volts": {"type": "String"} + "volts": { + "type": "String" + } } }, "telemetry_currentValue": "{amps}A", "@telemetry_currentValue": { "placeholders": { - "amps": {"type": "String"} + "amps": { + "type": "String" + } } }, "telemetry_temperatureValue": "{celsius}°C / {fahrenheit}°F", "@telemetry_temperatureValue": { "placeholders": { - "celsius": {"type": "String"}, - "fahrenheit": {"type": "String"} + "celsius": { + "type": "String" + }, + "fahrenheit": { + "type": "String" + } } }, - "neighbors_receivedData": "Received Neighbours Data", "neighbors_requestTimedOut": "Neighbours request timed out.", "neighbors_errorLoading": "Error loading neighbors: {error}", "@neighbors_errorLoading": { "placeholders": { - "error": {"type": "String"} + "error": { + "type": "String" + } } }, "neighbors_repeatersNeighbours": "Repeaters Neighbours", @@ -1111,13 +1281,17 @@ "neighbors_unknownContact": "Unknown {pubkey}", "@neighbors_unknownContact": { "placeholders": { - "pubkey": {"type": "String"} + "pubkey": { + "type": "String" + } } }, "neighbors_heardAgo": "Heard: {time} ago", "@neighbors_heardAgo": { "placeholders": { - "time": {"type": "String"} + "time": { + "type": "String" + } } }, "channelPath_title": "Packet Path", @@ -1129,28 +1303,40 @@ "channelPath_senderLabel": "Sender", "channelPath_timeLabel": "Time", "channelPath_repeatsLabel": "Repeats", - "channelPath_pathLabel": "Path", + "channelPath_pathLabel": "Path {index}", "channelPath_observedLabel": "Observed", "channelPath_observedPathTitle": "Observed path {index} • {hops}", "@channelPath_observedPathTitle": { "placeholders": { - "index": {"type": "int"}, - "hops": {"type": "String"} + "index": { + "type": "int" + }, + "hops": { + "type": "String" + } } }, "channelPath_noLocationData": "No location data", "channelPath_timeWithDate": "{day}/{month} {time}", "@channelPath_timeWithDate": { "placeholders": { - "day": {"type": "int"}, - "month": {"type": "int"}, - "time": {"type": "String"} + "day": { + "type": "int" + }, + "month": { + "type": "int" + }, + "time": { + "type": "String" + } } }, "channelPath_timeOnly": "{time}", "@channelPath_timeOnly": { "placeholders": { - "time": {"type": "String"} + "time": { + "type": "String" + } } }, "channelPath_unknownPath": "Unknown", @@ -1159,14 +1345,20 @@ "channelPath_observedZeroOf": "0 of {total} hops", "@channelPath_observedZeroOf": { "placeholders": { - "total": {"type": "int"} + "total": { + "type": "int" + } } }, "channelPath_observedSomeOf": "{observed} of {total} hops", "@channelPath_observedSomeOf": { "placeholders": { - "observed": {"type": "int"}, - "total": {"type": "int"} + "observed": { + "type": "int" + }, + "total": { + "type": "int" + } } }, "channelPath_mapTitle": "Path Map", @@ -1174,13 +1366,16 @@ "channelPath_primaryPath": "Path {index} (Primary)", "@channelPath_primaryPath": { "placeholders": { - "index": {"type": "int"} + "index": { + "type": "int" + } } }, - "channelPath_pathLabel": "Path {index}", "@channelPath_pathLabel": { "placeholders": { - "index": {"type": "int"} + "index": { + "type": "int" + } } }, "channelPath_pathLabelTitle": "Path", @@ -1188,13 +1383,16 @@ "channelPath_selectedPathLabel": "{label} • {prefixes}", "@channelPath_selectedPathLabel": { "placeholders": { - "label": {"type": "String"}, - "prefixes": {"type": "String"} + "label": { + "type": "String" + }, + "prefixes": { + "type": "String" + } } }, "channelPath_noHopDetailsAvailable": "No hop details available for this packet.", "channelPath_unknownRepeater": "Unknown Repeater", - "community_title": "Community", "community_create": "Create Community", "community_createDesc": "Create a new community and share via QR code.", @@ -1203,7 +1401,9 @@ "community_joinConfirmation": "Do you want to join the community \"{name}\"?", "@community_joinConfirmation": { "placeholders": { - "name": {"type": "String"} + "name": { + "type": "String" + } } }, "community_scanQr": "Scan Community QR", @@ -1216,20 +1416,26 @@ "community_created": "Community \"{name}\" created", "@community_created": { "placeholders": { - "name": {"type": "String"} + "name": { + "type": "String" + } } }, "community_joined": "Joined community \"{name}\"", "@community_joined": { "placeholders": { - "name": {"type": "String"} + "name": { + "type": "String" + } } }, "community_qrTitle": "Share Community", "community_qrInstructions": "Scan this QR code to join \"{name}\"", "@community_qrInstructions": { "placeholders": { - "name": {"type": "String"} + "name": { + "type": "String" + } } }, "community_hashtagPrivacyHint": "Community hashtag channels are only joinable by members of the community", @@ -1238,7 +1444,9 @@ "community_alreadyMemberMessage": "You are already a member of \"{name}\".", "@community_alreadyMemberMessage": { "placeholders": { - "name": {"type": "String"} + "name": { + "type": "String" + } } }, "community_addPublicChannel": "Add Community Public Channel", @@ -1250,46 +1458,60 @@ "community_deleteConfirm": "Leave \"{name}\"?", "@community_deleteConfirm": { "placeholders": { - "name": {"type": "String"} + "name": { + "type": "String" + } } }, "community_deleteChannelsWarning": "This will also delete {count} channel(s) and their messages.", "@community_deleteChannelsWarning": { "placeholders": { - "count": {"type": "int"} + "count": { + "type": "int" + } } }, "community_deleted": "Left community \"{name}\"", "@community_deleted": { "placeholders": { - "name": {"type": "String"} + "name": { + "type": "String" + } } }, "community_regenerateSecret": "Regenerate Secret", "community_regenerateSecretConfirm": "Regenerate the secret key for \"{name}\"? All members will need to scan the new QR code to continue communicating.", "@community_regenerateSecretConfirm": { "placeholders": { - "name": {"type": "String"} + "name": { + "type": "String" + } } }, "community_regenerate": "Regenerate", "community_secretRegenerated": "Secret regenerated for \"{name}\"", "@community_secretRegenerated": { "placeholders": { - "name": {"type": "String"} + "name": { + "type": "String" + } } }, "community_updateSecret": "Update Secret", "community_secretUpdated": "Secret updated for \"{name}\"", "@community_secretUpdated": { "placeholders": { - "name": {"type": "String"} + "name": { + "type": "String" + } } }, "community_scanToUpdateSecret": "Scan the new QR code to update the secret for \"{name}\"", "@community_scanToUpdateSecret": { "placeholders": { - "name": {"type": "String"} + "name": { + "type": "String" + } } }, "community_addHashtagChannel": "Add Community Hashtag", @@ -1302,10 +1524,11 @@ "community_forCommunity": "For {name}", "@community_forCommunity": { "placeholders": { - "name": {"type": "String"} + "name": { + "type": "String" + } } }, - "listFilter_tooltip": "Filter and sort", "listFilter_sortBy": "Sort by", "listFilter_latestMessages": "Latest messages", @@ -1318,7 +1541,6 @@ "listFilter_roomServers": "Room servers", "listFilter_unreadOnly": "Unread only", "listFilter_newGroup": "New group", - "pathTrace_you": "You", "pathTrace_failed": "Path trace failed.", "pathTrace_notAvailable": "Path trace not available.", @@ -1335,52 +1557,59 @@ "contacts_pathTraceTo": "Trace route to {name}", "@contacts_pathTraceTo": { "placeholders": { - "name": {"type": "String"} + "name": { + "type": "String" + } } }, - "contacts_clipboardEmpty": "Clipboard is empty.", "contacts_invalidAdvertFormat": "Invalid contact data", "contacts_contactImported": "Contact has been imported.", "contacts_contactImportFailed": "Failed to import contact.", - "contacts_zeroHopAdvert":"Zero Hop Advert", - "contacts_floodAdvert":"Flood Advert", - "contacts_copyAdvertToClipboard":"Copy Advert to Clipboard", - "contacts_addContactFromClipboard":"Add Contact from Clipboard", + "contacts_zeroHopAdvert": "Zero Hop Advert", + "contacts_floodAdvert": "Flood Advert", + "contacts_copyAdvertToClipboard": "Copy Advert to Clipboard", + "contacts_addContactFromClipboard": "Add Contact from Clipboard", "contacts_ShareContact": "Copy contact to Clipboard", "contacts_ShareContactZeroHop": "Share contact by advert", "contacts_zeroHopContactAdvertSent": "Sent contact by advert.", "contacts_zeroHopContactAdvertFailed": "Failed to send contact.", "contacts_contactAdvertCopied": "Advert copied to Clipboard.", "contacts_contactAdvertCopyFailed": "Copying advert to Clipboard failed.", - "notification_activityTitle": "MeshCore Activity", "notification_messagesCount": "{count} {count, plural, =1{message} other{messages}}", "@notification_messagesCount": { "placeholders": { - "count": {"type": "int"} + "count": { + "type": "int" + } } }, "notification_channelMessagesCount": "{count} {count, plural, =1{channel message} other{channel messages}}", "@notification_channelMessagesCount": { "placeholders": { - "count": {"type": "int"} + "count": { + "type": "int" + } } }, "notification_newNodesCount": "{count} {count, plural, =1{new node} other{new nodes}}", "@notification_newNodesCount": { "placeholders": { - "count": {"type": "int"} + "count": { + "type": "int" + } } }, "notification_newTypeDiscovered": "New {contactType} discovered", "@notification_newTypeDiscovered": { "placeholders": { - "contactType": {"type": "String"} + "contactType": { + "type": "String" + } } }, "notification_receivedNewMessage": "Received new message", - "settings_gpxExportRepeaters": "Export repeaters / room server to GPX", "settings_gpxExportRepeatersSubtitle": "Exports repeaters / roomserver with a location to GPX file.", "settings_gpxExportContacts": "Export companions to GPX", diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb index e6b22fa..4250a6f 100644 --- a/lib/l10n/app_es.arb +++ b/lib/l10n/app_es.arb @@ -131,9 +131,6 @@ "settings_infoContactsCount": "Número de contactos", "settings_infoChannelCount": "Número de canales", "settings_presets": "Preajustes", - "settings_preset915Mhz": "915 MHz", - "settings_preset868Mhz": "868 MHz", - "settings_preset433Mhz": "433 MHz", "settings_frequency": "Frecuencia (MHz)", "settings_frequencyHelper": "300,0 - 2500,0", "settings_frequencyInvalid": "Frecuencia inválida (300-2500 MHz)", @@ -143,8 +140,6 @@ "settings_txPower": "TX Potencia (dBm)", "settings_txPowerHelper": "0 - 22", "settings_txPowerInvalid": "Potencia de TX inválida (0-22 dBm)", - "settings_longRange": "Largo Alcance", - "settings_fastSpeed": "Velocidad Rápida", "settings_error": "Error: {message}", "@settings_error": { "placeholders": { @@ -1626,5 +1621,8 @@ "map_pathTraceCancelled": "Rastreo de ruta cancelado.", "scanner_bluetoothOffMessage": "Por favor, active el Bluetooth para escanear dispositivos.", "scanner_bluetoothOff": "Bluetooth está desactivado.", - "scanner_enableBluetooth": "Habilitar Bluetooth" + "scanner_enableBluetooth": "Habilitar Bluetooth", + "settings_clientRepeatFreqWarning": "Para la comunicación fuera de la red, se requiere una frecuencia de 433, 869 o 918 MHz.", + "settings_clientRepeat": "Repetir sin conexión", + "settings_clientRepeatSubtitle": "Permita que este dispositivo repita los paquetes de red para otros usuarios." } diff --git a/lib/l10n/app_fr.arb b/lib/l10n/app_fr.arb index f11238b..56d4a41 100644 --- a/lib/l10n/app_fr.arb +++ b/lib/l10n/app_fr.arb @@ -131,9 +131,6 @@ "settings_infoContactsCount": "Nombre de contacts", "settings_infoChannelCount": "Nombre de canaux", "settings_presets": "Préréglages", - "settings_preset915Mhz": "915 MHz", - "settings_preset868Mhz": "868 MHz", - "settings_preset433Mhz": "433 MHz", "settings_frequency": "Fréquence (MHz)", "settings_frequencyHelper": "300,0 - 2 500,0", "settings_frequencyInvalid": "Fréquence invalide (300-2500 MHz)", @@ -143,8 +140,6 @@ "settings_txPower": "TX Puissance (dBm)", "settings_txPowerHelper": "0 - 22", "settings_txPowerInvalid": "Puissance TX invalide (0-22 dBm)", - "settings_longRange": "Portée Longue", - "settings_fastSpeed": "Vitesse Rapide", "settings_error": "Erreur : {message}", "@settings_error": { "placeholders": { @@ -1598,5 +1593,8 @@ "map_runTrace": "Exécuter la traçage de chemin", "scanner_bluetoothOffMessage": "Veuillez activer le Bluetooth pour rechercher des appareils.", "scanner_bluetoothOff": "Le Bluetooth est désactivé.", - "scanner_enableBluetooth": "Activer le Bluetooth" + "scanner_enableBluetooth": "Activer le Bluetooth", + "settings_clientRepeatFreqWarning": "Pour les transmissions hors réseau, il est nécessaire d'utiliser les fréquences de 433, 869 ou 918 MHz.", + "settings_clientRepeatSubtitle": "Permettez à cet appareil de répéter les paquets de données pour les autres.", + "settings_clientRepeat": "Répétition hors réseau" } diff --git a/lib/l10n/app_it.arb b/lib/l10n/app_it.arb index 601f1af..239c765 100644 --- a/lib/l10n/app_it.arb +++ b/lib/l10n/app_it.arb @@ -131,9 +131,6 @@ "settings_infoContactsCount": "Numero contatti", "settings_infoChannelCount": "Numero Canale", "settings_presets": "Preset", - "settings_preset915Mhz": "915 MHz", - "settings_preset868Mhz": "868 MHz", - "settings_preset433Mhz": "433 MHz", "settings_frequency": "Frequenza (MHz)", "settings_frequencyHelper": "300,0 - 2500,0", "settings_frequencyInvalid": "Frequenza non valida (300-2500 MHz)", @@ -143,8 +140,6 @@ "settings_txPower": "TX Potenza (dBm)", "settings_txPowerHelper": "0 - 22", "settings_txPowerInvalid": "Potere TX non valido (0-22 dBm)", - "settings_longRange": "Lungo Raggio", - "settings_fastSpeed": "Velocità Rapida", "settings_error": "Errore: {message}", "@settings_error": { "placeholders": { @@ -1598,5 +1593,8 @@ "map_tapToAdd": "Tocca i nodi per aggiungerli al percorso.", "scanner_bluetoothOff": "Il Bluetooth è disattivato.", "scanner_bluetoothOffMessage": "Si prega di attivare il Bluetooth per effettuare la scansione dei dispositivi.", - "scanner_enableBluetooth": "Abilita il Bluetooth" + "scanner_enableBluetooth": "Abilita il Bluetooth", + "settings_clientRepeat": "Ripetizione \"fuori dalla rete\"", + "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." } diff --git a/lib/l10n/app_localizations.dart b/lib/l10n/app_localizations.dart index bc1cfbd..7235e90 100644 --- a/lib/l10n/app_localizations.dart +++ b/lib/l10n/app_localizations.dart @@ -748,24 +748,6 @@ abstract class AppLocalizations { /// **'Presets'** String get settings_presets; - /// No description provided for @settings_preset915Mhz. - /// - /// In en, this message translates to: - /// **'915 MHz'** - String get settings_preset915Mhz; - - /// No description provided for @settings_preset868Mhz. - /// - /// In en, this message translates to: - /// **'868 MHz'** - String get settings_preset868Mhz; - - /// No description provided for @settings_preset433Mhz. - /// - /// In en, this message translates to: - /// **'433 MHz'** - String get settings_preset433Mhz; - /// No description provided for @settings_frequency. /// /// In en, this message translates to: @@ -820,17 +802,23 @@ abstract class AppLocalizations { /// **'Invalid TX power (0-22 dBm)'** String get settings_txPowerInvalid; - /// No description provided for @settings_longRange. + /// No description provided for @settings_clientRepeat. /// /// In en, this message translates to: - /// **'Long Range'** - String get settings_longRange; + /// **'Off-Grid Repeat'** + String get settings_clientRepeat; - /// No description provided for @settings_fastSpeed. + /// No description provided for @settings_clientRepeatSubtitle. /// /// In en, this message translates to: - /// **'Fast Speed'** - String get settings_fastSpeed; + /// **'Allow this device to repeat mesh packets for others'** + String get settings_clientRepeatSubtitle; + + /// No description provided for @settings_clientRepeatFreqWarning. + /// + /// In en, this message translates to: + /// **'Off-grid repeat requires 433, 869, or 918 MHz frequency'** + String get settings_clientRepeatFreqWarning; /// No description provided for @settings_error. /// diff --git a/lib/l10n/app_localizations_bg.dart b/lib/l10n/app_localizations_bg.dart index 695bde2..fdf9ec7 100644 --- a/lib/l10n/app_localizations_bg.dart +++ b/lib/l10n/app_localizations_bg.dart @@ -350,15 +350,6 @@ class AppLocalizationsBg extends AppLocalizations { @override String get settings_presets => 'Предварителни настройки'; - @override - String get settings_preset915Mhz => '915 MHz'; - - @override - String get settings_preset868Mhz => '868 MHz'; - - @override - String get settings_preset433Mhz => '433 MHz'; - @override String get settings_frequency => 'Честота (MHz)'; @@ -387,10 +378,15 @@ class AppLocalizationsBg extends AppLocalizations { String get settings_txPowerInvalid => 'Невалидна мощност на TX (0-22 dBm)'; @override - String get settings_longRange => 'Дълъг обхват'; + String get settings_clientRepeat => 'Без електричество – повторение'; @override - String get settings_fastSpeed => 'Бърза скорост'; + String get settings_clientRepeatSubtitle => + 'Позволете на това устройство да предава пакети към мрежата за други устройства.'; + + @override + String get settings_clientRepeatFreqWarning => + 'За повторение извън мрежата са необходими честоти от 433, 869 или 918 MHz.'; @override String settings_error(String message) { diff --git a/lib/l10n/app_localizations_de.dart b/lib/l10n/app_localizations_de.dart index 6e04655..c0fc4c8 100644 --- a/lib/l10n/app_localizations_de.dart +++ b/lib/l10n/app_localizations_de.dart @@ -344,15 +344,6 @@ class AppLocalizationsDe extends AppLocalizations { @override String get settings_presets => 'Voreinstellungen'; - @override - String get settings_preset915Mhz => '915 MHz'; - - @override - String get settings_preset868Mhz => '868 MHz'; - - @override - String get settings_preset433Mhz => '433 MHz'; - @override String get settings_frequency => 'Frequenz (MHz)'; @@ -381,10 +372,15 @@ class AppLocalizationsDe extends AppLocalizations { String get settings_txPowerInvalid => 'Ungültige TX-Leistung (0-22 dBm)'; @override - String get settings_longRange => 'Grosse Reichweite'; + String get settings_clientRepeat => 'Wiederholung, ohne Stromanschluss'; @override - String get settings_fastSpeed => 'Schnelle Geschwindigkeit'; + String get settings_clientRepeatSubtitle => + 'Ermöglichen Sie diesem Gerät, Mesh-Pakete für andere zu wiederholen.'; + + @override + String get settings_clientRepeatFreqWarning => + 'Die Kommunikation ohne Stromversorgung erfordert Frequenzen von 433, 869 oder 918 MHz.'; @override String settings_error(String message) { diff --git a/lib/l10n/app_localizations_en.dart b/lib/l10n/app_localizations_en.dart index 5ed8162..4f0bed1 100644 --- a/lib/l10n/app_localizations_en.dart +++ b/lib/l10n/app_localizations_en.dart @@ -342,15 +342,6 @@ class AppLocalizationsEn extends AppLocalizations { @override String get settings_presets => 'Presets'; - @override - String get settings_preset915Mhz => '915 MHz'; - - @override - String get settings_preset868Mhz => '868 MHz'; - - @override - String get settings_preset433Mhz => '433 MHz'; - @override String get settings_frequency => 'Frequency (MHz)'; @@ -379,10 +370,15 @@ class AppLocalizationsEn extends AppLocalizations { String get settings_txPowerInvalid => 'Invalid TX power (0-22 dBm)'; @override - String get settings_longRange => 'Long Range'; + String get settings_clientRepeat => 'Off-Grid Repeat'; @override - String get settings_fastSpeed => 'Fast Speed'; + String get settings_clientRepeatSubtitle => + 'Allow this device to repeat mesh packets for others'; + + @override + String get settings_clientRepeatFreqWarning => + 'Off-grid repeat requires 433, 869, or 918 MHz frequency'; @override String settings_error(String message) { diff --git a/lib/l10n/app_localizations_es.dart b/lib/l10n/app_localizations_es.dart index ff4e8f3..f56e4e4 100644 --- a/lib/l10n/app_localizations_es.dart +++ b/lib/l10n/app_localizations_es.dart @@ -347,15 +347,6 @@ class AppLocalizationsEs extends AppLocalizations { @override String get settings_presets => 'Preajustes'; - @override - String get settings_preset915Mhz => '915 MHz'; - - @override - String get settings_preset868Mhz => '868 MHz'; - - @override - String get settings_preset433Mhz => '433 MHz'; - @override String get settings_frequency => 'Frecuencia (MHz)'; @@ -384,10 +375,15 @@ class AppLocalizationsEs extends AppLocalizations { String get settings_txPowerInvalid => 'Potencia de TX inválida (0-22 dBm)'; @override - String get settings_longRange => 'Largo Alcance'; + String get settings_clientRepeat => 'Repetir sin conexión'; @override - String get settings_fastSpeed => 'Velocidad Rápida'; + String get settings_clientRepeatSubtitle => + 'Permita que este dispositivo repita los paquetes de red para otros usuarios.'; + + @override + String get settings_clientRepeatFreqWarning => + 'Para la comunicación fuera de la red, se requiere una frecuencia de 433, 869 o 918 MHz.'; @override String settings_error(String message) { diff --git a/lib/l10n/app_localizations_fr.dart b/lib/l10n/app_localizations_fr.dart index f8b7775..e1325da 100644 --- a/lib/l10n/app_localizations_fr.dart +++ b/lib/l10n/app_localizations_fr.dart @@ -348,15 +348,6 @@ class AppLocalizationsFr extends AppLocalizations { @override String get settings_presets => 'Préréglages'; - @override - String get settings_preset915Mhz => '915 MHz'; - - @override - String get settings_preset868Mhz => '868 MHz'; - - @override - String get settings_preset433Mhz => '433 MHz'; - @override String get settings_frequency => 'Fréquence (MHz)'; @@ -385,10 +376,15 @@ class AppLocalizationsFr extends AppLocalizations { String get settings_txPowerInvalid => 'Puissance TX invalide (0-22 dBm)'; @override - String get settings_longRange => 'Portée Longue'; + String get settings_clientRepeat => 'Répétition hors réseau'; @override - String get settings_fastSpeed => 'Vitesse Rapide'; + String get settings_clientRepeatSubtitle => + 'Permettez à cet appareil de répéter les paquets de données pour les autres.'; + + @override + String get settings_clientRepeatFreqWarning => + 'Pour les transmissions hors réseau, il est nécessaire d\'utiliser les fréquences de 433, 869 ou 918 MHz.'; @override String settings_error(String message) { diff --git a/lib/l10n/app_localizations_it.dart b/lib/l10n/app_localizations_it.dart index d8fd612..15d5354 100644 --- a/lib/l10n/app_localizations_it.dart +++ b/lib/l10n/app_localizations_it.dart @@ -346,15 +346,6 @@ class AppLocalizationsIt extends AppLocalizations { @override String get settings_presets => 'Preset'; - @override - String get settings_preset915Mhz => '915 MHz'; - - @override - String get settings_preset868Mhz => '868 MHz'; - - @override - String get settings_preset433Mhz => '433 MHz'; - @override String get settings_frequency => 'Frequenza (MHz)'; @@ -383,10 +374,15 @@ class AppLocalizationsIt extends AppLocalizations { String get settings_txPowerInvalid => 'Potere TX non valido (0-22 dBm)'; @override - String get settings_longRange => 'Lungo Raggio'; + String get settings_clientRepeat => 'Ripetizione \"fuori dalla rete\"'; @override - String get settings_fastSpeed => 'Velocità Rapida'; + String get settings_clientRepeatSubtitle => + 'Permetti a questo dispositivo di ripetere i pacchetti di rete per gli altri.'; + + @override + String get settings_clientRepeatFreqWarning => + 'Per la comunicazione fuori rete, è necessario utilizzare frequenze di 433, 869 o 918 MHz.'; @override String settings_error(String message) { diff --git a/lib/l10n/app_localizations_nl.dart b/lib/l10n/app_localizations_nl.dart index de6c909..17b3bce 100644 --- a/lib/l10n/app_localizations_nl.dart +++ b/lib/l10n/app_localizations_nl.dart @@ -344,15 +344,6 @@ class AppLocalizationsNl extends AppLocalizations { @override String get settings_presets => 'Presets'; - @override - String get settings_preset915Mhz => '915 MHz'; - - @override - String get settings_preset868Mhz => '868 MHz'; - - @override - String get settings_preset433Mhz => '433 MHz'; - @override String get settings_frequency => 'Frequentie (MHz)'; @@ -381,10 +372,15 @@ class AppLocalizationsNl extends AppLocalizations { String get settings_txPowerInvalid => 'Ongeldige TX-vermogen (0-22 dBm)'; @override - String get settings_longRange => 'Lange Afstand'; + String get settings_clientRepeat => 'Herhalen: Afgekoppeld'; @override - String get settings_fastSpeed => 'Hoge Snelheid'; + String get settings_clientRepeatSubtitle => + 'Laat dit apparaat de mesh-pakketten opnieuw verzenden voor andere apparaten.'; + + @override + String get settings_clientRepeatFreqWarning => + 'Om een signaal buiten het netwerk te versturen, zijn frequenties van 433, 869 of 918 MHz vereist.'; @override String settings_error(String message) { diff --git a/lib/l10n/app_localizations_pl.dart b/lib/l10n/app_localizations_pl.dart index c5d2bd9..147e160 100644 --- a/lib/l10n/app_localizations_pl.dart +++ b/lib/l10n/app_localizations_pl.dart @@ -347,15 +347,6 @@ class AppLocalizationsPl extends AppLocalizations { @override String get settings_presets => 'Preset'; - @override - String get settings_preset915Mhz => '915 MHz'; - - @override - String get settings_preset868Mhz => '868 MHz'; - - @override - String get settings_preset433Mhz => '433 MHz'; - @override String get settings_frequency => 'Częstotliwość (MHz)'; @@ -385,10 +376,15 @@ class AppLocalizationsPl extends AppLocalizations { String get settings_txPowerInvalid => 'Nieprawidłowa moc TX (0-22 dBm)'; @override - String get settings_longRange => 'Długi zasięg'; + String get settings_clientRepeat => 'Powtórzenie: Niezależne od sieci'; @override - String get settings_fastSpeed => 'Szybka prędkość'; + String get settings_clientRepeatSubtitle => + 'Pozwól temu urządzeniu powtarzać pakiety danych dla innych urządzeń.'; + + @override + String get settings_clientRepeatFreqWarning => + 'Powtórka poza siecią wymaga częstotliwości 433, 869 lub 918 MHz.'; @override String settings_error(String message) { diff --git a/lib/l10n/app_localizations_pt.dart b/lib/l10n/app_localizations_pt.dart index b5ffdd6..b481775 100644 --- a/lib/l10n/app_localizations_pt.dart +++ b/lib/l10n/app_localizations_pt.dart @@ -348,15 +348,6 @@ class AppLocalizationsPt extends AppLocalizations { @override String get settings_presets => 'Presets'; - @override - String get settings_preset915Mhz => '915 MHz'; - - @override - String get settings_preset868Mhz => '868 MHz'; - - @override - String get settings_preset433Mhz => '433 MHz'; - @override String get settings_frequency => 'Frequência (MHz)'; @@ -385,10 +376,15 @@ class AppLocalizationsPt extends AppLocalizations { String get settings_txPowerInvalid => 'Potência de TX inválida (0-22 dBm)'; @override - String get settings_longRange => 'Alcance Longo'; + String get settings_clientRepeat => 'Repetição sem rede'; @override - String get settings_fastSpeed => 'Velocidade Rápida'; + String get settings_clientRepeatSubtitle => + 'Permita que este dispositivo repita pacotes de rede para outros dispositivos.'; + + @override + String get settings_clientRepeatFreqWarning => + 'A repetição fora da rede requer frequências de 433, 869 ou 918 MHz.'; @override String settings_error(String message) { diff --git a/lib/l10n/app_localizations_ru.dart b/lib/l10n/app_localizations_ru.dart index c41bf20..e5875b1 100644 --- a/lib/l10n/app_localizations_ru.dart +++ b/lib/l10n/app_localizations_ru.dart @@ -345,15 +345,6 @@ class AppLocalizationsRu extends AppLocalizations { @override String get settings_presets => 'Пресеты'; - @override - String get settings_preset915Mhz => '915 МГц'; - - @override - String get settings_preset868Mhz => '868 МГц'; - - @override - String get settings_preset433Mhz => '433 МГц'; - @override String get settings_frequency => 'Частота (МГц)'; @@ -383,10 +374,15 @@ class AppLocalizationsRu extends AppLocalizations { 'Недопустимая мощность передачи (0–22 дБм)'; @override - String get settings_longRange => 'Дальний радиус'; + String get settings_clientRepeat => 'Повторение \"вне сети\"'; @override - String get settings_fastSpeed => 'Высокая скорость'; + String get settings_clientRepeatSubtitle => + 'Позвольте этому устройству повторять пакеты данных для других устройств.'; + + @override + String get settings_clientRepeatFreqWarning => + 'Для работы в режиме \"без подключения к сети\" требуется частота 433, 869 или 918 МГц.'; @override String settings_error(String message) { diff --git a/lib/l10n/app_localizations_sk.dart b/lib/l10n/app_localizations_sk.dart index e0ee455..4e8b4cb 100644 --- a/lib/l10n/app_localizations_sk.dart +++ b/lib/l10n/app_localizations_sk.dart @@ -344,15 +344,6 @@ class AppLocalizationsSk extends AppLocalizations { @override String get settings_presets => 'Prednastavenia'; - @override - String get settings_preset915Mhz => '915 MHz'; - - @override - String get settings_preset868Mhz => '868 MHz'; - - @override - String get settings_preset433Mhz => '433 MHz'; - @override String get settings_frequency => 'Frekvencia (MHz)'; @@ -381,10 +372,15 @@ class AppLocalizationsSk extends AppLocalizations { String get settings_txPowerInvalid => 'Neplatná hodnota výkonu TX (0-22 dBm)'; @override - String get settings_longRange => 'Dlhý dosah'; + String get settings_clientRepeat => 'Opätovné použitie bez elektrickej siete'; @override - String get settings_fastSpeed => 'Rýchla rýchlosť'; + String get settings_clientRepeatSubtitle => + 'Umožnite, aby toto zariadenie opakovávalo siete pre ostatných.'; + + @override + String get settings_clientRepeatFreqWarning => + 'Použitie off-grid systému vyžaduje frekvencie 433, 869 alebo 918 MHz.'; @override String settings_error(String message) { diff --git a/lib/l10n/app_localizations_sl.dart b/lib/l10n/app_localizations_sl.dart index 36445f7..e01151e 100644 --- a/lib/l10n/app_localizations_sl.dart +++ b/lib/l10n/app_localizations_sl.dart @@ -343,15 +343,6 @@ class AppLocalizationsSl extends AppLocalizations { @override String get settings_presets => 'Prednastavitve'; - @override - String get settings_preset915Mhz => '915 MHz'; - - @override - String get settings_preset868Mhz => '868 MHz'; - - @override - String get settings_preset433Mhz => '433 MHz'; - @override String get settings_frequency => 'Frekvenca (MHz)'; @@ -380,10 +371,15 @@ class AppLocalizationsSl extends AppLocalizations { String get settings_txPowerInvalid => 'Neveljavna TX moč (0-22 dBm)'; @override - String get settings_longRange => 'DDolg doseg'; + String get settings_clientRepeat => 'Neovadno ponavljanje'; @override - String get settings_fastSpeed => 'Visoka hitrost'; + String get settings_clientRepeatSubtitle => + 'Omogočite temu naprave, da ponavlja paketne sporočila za druge.'; + + @override + String get settings_clientRepeatFreqWarning => + 'Za ponovni prenos na brezžični način so potrebne frekvence 433, 869 ali 918 MHz.'; @override String settings_error(String message) { diff --git a/lib/l10n/app_localizations_sv.dart b/lib/l10n/app_localizations_sv.dart index cbfa45d..f081711 100644 --- a/lib/l10n/app_localizations_sv.dart +++ b/lib/l10n/app_localizations_sv.dart @@ -341,15 +341,6 @@ class AppLocalizationsSv extends AppLocalizations { @override String get settings_presets => 'Fördefinierade inställningar'; - @override - String get settings_preset915Mhz => '915 MHz'; - - @override - String get settings_preset868Mhz => '868 MHz'; - - @override - String get settings_preset433Mhz => '433 MHz'; - @override String get settings_frequency => 'Frekvens (MHz)'; @@ -378,10 +369,15 @@ class AppLocalizationsSv extends AppLocalizations { String get settings_txPowerInvalid => 'Ogiltig TX-effekt (0-22 dBm)'; @override - String get settings_longRange => 'Lång räckvidd'; + String get settings_clientRepeat => 'Upprepa utan elnät'; @override - String get settings_fastSpeed => 'Snabb hastighet'; + String get settings_clientRepeatSubtitle => + 'Låt enheten repetera nätpaket för andra användare.'; + + @override + String get settings_clientRepeatFreqWarning => + 'För att kunna kommunicera utanför elnätet krävs frekvenserna 433, 869 eller 918 MHz.'; @override String settings_error(String message) { diff --git a/lib/l10n/app_localizations_uk.dart b/lib/l10n/app_localizations_uk.dart index 4dfa260..847c3e5 100644 --- a/lib/l10n/app_localizations_uk.dart +++ b/lib/l10n/app_localizations_uk.dart @@ -346,15 +346,6 @@ class AppLocalizationsUk extends AppLocalizations { @override String get settings_presets => 'Попередні налаштування'; - @override - String get settings_preset915Mhz => '915 МГц'; - - @override - String get settings_preset868Mhz => '868 МГц'; - - @override - String get settings_preset433Mhz => '433 МГц'; - @override String get settings_frequency => 'Частота (МГц)'; @@ -383,10 +374,15 @@ class AppLocalizationsUk extends AppLocalizations { String get settings_txPowerInvalid => 'Некоректна потужність TX (0-22 дБм)'; @override - String get settings_longRange => 'Дальній діапазон'; + String get settings_clientRepeat => 'Автономна система'; @override - String get settings_fastSpeed => 'Висока швидкість'; + String get settings_clientRepeatSubtitle => + 'Дозвольте цьому пристрою повторювати пакети даних для інших пристроїв.'; + + @override + String get settings_clientRepeatFreqWarning => + 'Повтор без підключення до мережі вимагає частоти 433, 869 або 918 МГц.'; @override String settings_error(String message) { diff --git a/lib/l10n/app_localizations_zh.dart b/lib/l10n/app_localizations_zh.dart index 4441b22..fdc4531 100644 --- a/lib/l10n/app_localizations_zh.dart +++ b/lib/l10n/app_localizations_zh.dart @@ -331,15 +331,6 @@ class AppLocalizationsZh extends AppLocalizations { @override String get settings_presets => '预设'; - @override - String get settings_preset915Mhz => '915 兆赫'; - - @override - String get settings_preset868Mhz => '868 兆赫'; - - @override - String get settings_preset433Mhz => '433 兆赫'; - @override String get settings_frequency => '频率 (MHz)'; @@ -368,10 +359,14 @@ class AppLocalizationsZh extends AppLocalizations { String get settings_txPowerInvalid => '无效的发射功率(0-22 dBm)'; @override - String get settings_longRange => '远距离'; + String get settings_clientRepeat => '离网重复'; @override - String get settings_fastSpeed => '高速'; + String get settings_clientRepeatSubtitle => '允许此设备重复发送网状数据包给其他设备'; + + @override + String get settings_clientRepeatFreqWarning => + '离网重复通信需要使用 433、869 或 918 兆赫兹的频率。'; @override String settings_error(String message) { diff --git a/lib/l10n/app_nl.arb b/lib/l10n/app_nl.arb index b150d62..7c397b4 100644 --- a/lib/l10n/app_nl.arb +++ b/lib/l10n/app_nl.arb @@ -131,9 +131,6 @@ "settings_infoContactsCount": "Aantal Contacten", "settings_infoChannelCount": "Aantal Kanalen", "settings_presets": "Presets", - "settings_preset915Mhz": "915 MHz", - "settings_preset868Mhz": "868 MHz", - "settings_preset433Mhz": "433 MHz", "settings_frequency": "Frequentie (MHz)", "settings_frequencyHelper": "300,0 - 2500,0", "settings_frequencyInvalid": "Ongeldige frequentie (300-2500 MHz)", @@ -143,8 +140,6 @@ "settings_txPower": "TX Vermogen (dBm)", "settings_txPowerHelper": "0 - 22", "settings_txPowerInvalid": "Ongeldige TX-vermogen (0-22 dBm)", - "settings_longRange": "Lange Afstand", - "settings_fastSpeed": "Hoge Snelheid", "settings_error": "Fout: {message}", "@settings_error": { "placeholders": { @@ -1598,5 +1593,8 @@ "map_runTrace": "Padeshulp traceren", "scanner_enableBluetooth": "Activeer Bluetooth", "scanner_bluetoothOffMessage": "Zorg ervoor dat Bluetooth is ingeschakeld om naar apparaten te zoeken.", - "scanner_bluetoothOff": "Bluetooth is uitgeschakeld" + "scanner_bluetoothOff": "Bluetooth is uitgeschakeld", + "settings_clientRepeat": "Herhalen: Afgekoppeld", + "settings_clientRepeatSubtitle": "Laat dit apparaat de mesh-pakketten opnieuw verzenden voor andere apparaten.", + "settings_clientRepeatFreqWarning": "Om een signaal buiten het netwerk te versturen, zijn frequenties van 433, 869 of 918 MHz vereist." } diff --git a/lib/l10n/app_pl.arb b/lib/l10n/app_pl.arb index d576fca..5ebeebf 100644 --- a/lib/l10n/app_pl.arb +++ b/lib/l10n/app_pl.arb @@ -131,9 +131,6 @@ "settings_infoContactsCount": "Liczba kontaktów", "settings_infoChannelCount": "Liczba kanałów", "settings_presets": "Preset", - "settings_preset915Mhz": "915 MHz", - "settings_preset868Mhz": "868 MHz", - "settings_preset433Mhz": "433 MHz", "settings_frequency": "Częstotliwość (MHz)", "settings_frequencyHelper": "300,0 - 2500,0", "settings_frequencyInvalid": "Nieprawidłowa częstotliwość (300-2500 MHz)", @@ -143,8 +140,6 @@ "settings_txPower": "TX Moc (dBm)", "settings_txPowerHelper": "0 - 22", "settings_txPowerInvalid": "Nieprawidłowa moc TX (0-22 dBm)", - "settings_longRange": "Długi zasięg", - "settings_fastSpeed": "Szybka prędkość", "settings_error": "Błąd: {message}", "@settings_error": { "placeholders": { @@ -1598,5 +1593,8 @@ "map_tapToAdd": "Kliknij na węzły, aby dodać je do ścieżki.", "scanner_bluetoothOffMessage": "Prosimy włączyć Bluetooth, aby przeskanować urządzenia.", "scanner_bluetoothOff": "Bluetooth jest wyłączony", - "scanner_enableBluetooth": "Włącz Bluetooth" + "scanner_enableBluetooth": "Włącz Bluetooth", + "settings_clientRepeatSubtitle": "Pozwól temu urządzeniu powtarzać pakiety danych dla innych urządzeń.", + "settings_clientRepeat": "Powtórzenie: Niezależne od sieci", + "settings_clientRepeatFreqWarning": "Powtórka poza siecią wymaga częstotliwości 433, 869 lub 918 MHz." } diff --git a/lib/l10n/app_pt.arb b/lib/l10n/app_pt.arb index 53c43fe..a88e038 100644 --- a/lib/l10n/app_pt.arb +++ b/lib/l10n/app_pt.arb @@ -131,9 +131,6 @@ "settings_infoContactsCount": "Número de Contatos", "settings_infoChannelCount": "Número do Canal", "settings_presets": "Presets", - "settings_preset915Mhz": "915 MHz", - "settings_preset868Mhz": "868 MHz", - "settings_preset433Mhz": "433 MHz", "settings_frequency": "Frequência (MHz)", "settings_frequencyHelper": "300,0 - 2500,0", "settings_frequencyInvalid": "Frequência inválida (300-2500 MHz)", @@ -143,8 +140,6 @@ "settings_txPower": "TX Potência (dBm)", "settings_txPowerHelper": "0 - 22", "settings_txPowerInvalid": "Potência de TX inválida (0-22 dBm)", - "settings_longRange": "Alcance Longo", - "settings_fastSpeed": "Velocidade Rápida", "settings_error": "Erro: {message}", "@settings_error": { "placeholders": { @@ -1598,5 +1593,8 @@ "map_tapToAdd": "Toque nos nós para adicioná-los ao caminho.", "scanner_enableBluetooth": "Ative o Bluetooth", "scanner_bluetoothOff": "Bluetooth está desativado", - "scanner_bluetoothOffMessage": "Por favor, ative o Bluetooth para escanear por dispositivos." + "scanner_bluetoothOffMessage": "Por favor, ative o Bluetooth para escanear por dispositivos.", + "settings_clientRepeatFreqWarning": "A repetição fora da rede requer frequências de 433, 869 ou 918 MHz.", + "settings_clientRepeat": "Repetição sem rede", + "settings_clientRepeatSubtitle": "Permita que este dispositivo repita pacotes de rede para outros dispositivos." } diff --git a/lib/l10n/app_ru.arb b/lib/l10n/app_ru.arb index 19b4990..fc17eee 100644 --- a/lib/l10n/app_ru.arb +++ b/lib/l10n/app_ru.arb @@ -101,9 +101,6 @@ "settings_infoContactsCount": "Количество контактов", "settings_infoChannelCount": "Количество каналов", "settings_presets": "Пресеты", - "settings_preset915Mhz": "915 МГц", - "settings_preset868Mhz": "868 МГц", - "settings_preset433Mhz": "433 МГц", "settings_frequency": "Частота (МГц)", "settings_frequencyHelper": "300.0 – 2500.0", "settings_frequencyInvalid": "Недопустимая частота (300–2500 МГц)", @@ -113,8 +110,6 @@ "settings_txPower": "Мощность передачи (дБм)", "settings_txPowerHelper": "0 – 22", "settings_txPowerInvalid": "Недопустимая мощность передачи (0–22 дБм)", - "settings_longRange": "Дальний радиус", - "settings_fastSpeed": "Высокая скорость", "settings_error": "Ошибка: {message}", "appSettings_title": "Настройки приложения", "appSettings_appearance": "Внешний вид", @@ -838,5 +833,8 @@ "map_runTrace": "Запустить трассировку пути", "scanner_enableBluetooth": "Включите Bluetooth", "scanner_bluetoothOff": "Bluetooth выключен", - "scanner_bluetoothOffMessage": "Пожалуйста, включите Bluetooth, чтобы найти устройства." + "scanner_bluetoothOffMessage": "Пожалуйста, включите Bluetooth, чтобы найти устройства.", + "settings_clientRepeatFreqWarning": "Для работы в режиме \"без подключения к сети\" требуется частота 433, 869 или 918 МГц.", + "settings_clientRepeatSubtitle": "Позвольте этому устройству повторять пакеты данных для других устройств.", + "settings_clientRepeat": "Повторение \"вне сети\"" } diff --git a/lib/l10n/app_sk.arb b/lib/l10n/app_sk.arb index 3f61292..14cd3ec 100644 --- a/lib/l10n/app_sk.arb +++ b/lib/l10n/app_sk.arb @@ -131,9 +131,6 @@ "settings_infoContactsCount": "Počet kontaktov", "settings_infoChannelCount": "Počet kanálov", "settings_presets": "Prednastavenia", - "settings_preset915Mhz": "915 MHz", - "settings_preset868Mhz": "868 MHz", - "settings_preset433Mhz": "433 MHz", "settings_frequency": "Frekvencia (MHz)", "settings_frequencyHelper": "300,0 – 2500,0", "settings_frequencyInvalid": "Neplatná frekvencia (300-2500 MHz)", @@ -143,8 +140,6 @@ "settings_txPower": "TX Výkon (dBm)", "settings_txPowerHelper": "0 - 22", "settings_txPowerInvalid": "Neplatná hodnota výkonu TX (0-22 dBm)", - "settings_longRange": "Dlhý dosah", - "settings_fastSpeed": "Rýchla rýchlosť", "settings_error": "Chyba: {message}", "@settings_error": { "placeholders": { @@ -1598,5 +1593,8 @@ "map_pathTraceCancelled": "Zrušenie stopáže cesty bolo zrušené.", "scanner_bluetoothOffMessage": "Prosím, zapnite Bluetooth, aby ste mohli skenovať pre zariadenia.", "scanner_bluetoothOff": "Bluetooth je vypnutý", - "scanner_enableBluetooth": "Povolte Bluetooth" + "scanner_enableBluetooth": "Povolte Bluetooth", + "settings_clientRepeat": "Opätovné použitie bez elektrickej siete", + "settings_clientRepeatFreqWarning": "Použitie off-grid systému vyžaduje frekvencie 433, 869 alebo 918 MHz.", + "settings_clientRepeatSubtitle": "Umožnite, aby toto zariadenie opakovávalo siete pre ostatných." } diff --git a/lib/l10n/app_sl.arb b/lib/l10n/app_sl.arb index d94695e..e633965 100644 --- a/lib/l10n/app_sl.arb +++ b/lib/l10n/app_sl.arb @@ -131,9 +131,6 @@ "settings_infoContactsCount": "Število stikov", "settings_infoChannelCount": "Število kanalov", "settings_presets": "Prednastavitve", - "settings_preset915Mhz": "915 MHz", - "settings_preset868Mhz": "868 MHz", - "settings_preset433Mhz": "433 MHz", "settings_frequency": "Frekvenca (MHz)", "settings_frequencyHelper": "300,00 - 2500,00", "settings_frequencyInvalid": "Neveljavna frekvenca (300-2500 MHz)", @@ -143,8 +140,6 @@ "settings_txPower": "TX Moč (dBm)", "settings_txPowerHelper": "0 - 22", "settings_txPowerInvalid": "Neveljavna TX moč (0-22 dBm)", - "settings_longRange": "DDolg doseg", - "settings_fastSpeed": "Visoka hitrost", "settings_error": "Napaka: {message}", "@settings_error": { "placeholders": { @@ -1598,5 +1593,8 @@ "map_pathTraceCancelled": "Spremljanje poti je prekinjeno.", "scanner_enableBluetooth": "Omogočite Bluetooth", "scanner_bluetoothOffMessage": "Prosimo, vklopite Bluetooth, da lahko poiščete naprave.", - "scanner_bluetoothOff": "Bluetooth je izklopljen" + "scanner_bluetoothOff": "Bluetooth je izklopljen", + "settings_clientRepeatFreqWarning": "Za ponovni prenos na brezžični način so potrebne frekvence 433, 869 ali 918 MHz.", + "settings_clientRepeatSubtitle": "Omogočite temu naprave, da ponavlja paketne sporočila za druge.", + "settings_clientRepeat": "Neovadno ponavljanje" } diff --git a/lib/l10n/app_sv.arb b/lib/l10n/app_sv.arb index 59b3fca..4e50409 100644 --- a/lib/l10n/app_sv.arb +++ b/lib/l10n/app_sv.arb @@ -131,9 +131,6 @@ "settings_infoContactsCount": "Kontakterantal", "settings_infoChannelCount": "Kanalantal", "settings_presets": "Fördefinierade inställningar", - "settings_preset915Mhz": "915 MHz", - "settings_preset868Mhz": "868 MHz", - "settings_preset433Mhz": "433 MHz", "settings_frequency": "Frekvens (MHz)", "settings_frequencyHelper": "300,0 - 2500,0", "settings_frequencyInvalid": "Ogiltig frekvens (300-2500 MHz)", @@ -143,8 +140,6 @@ "settings_txPower": "TX-effekt (dBm)", "settings_txPowerHelper": "0 - 22", "settings_txPowerInvalid": "Ogiltig TX-effekt (0-22 dBm)", - "settings_longRange": "Lång räckvidd", - "settings_fastSpeed": "Snabb hastighet", "settings_error": "Fel: {message}", "@settings_error": { "placeholders": { @@ -1598,5 +1593,8 @@ "map_removeLast": "Ta bort sista", "scanner_enableBluetooth": "Aktivera Bluetooth", "scanner_bluetoothOffMessage": "Vänligen aktivera Bluetooth för att söka efter enheter.", - "scanner_bluetoothOff": "Bluetooth är avstängt" + "scanner_bluetoothOff": "Bluetooth är avstängt", + "settings_clientRepeatSubtitle": "Låt enheten repetera nätpaket för andra användare.", + "settings_clientRepeat": "Upprepa utan elnät", + "settings_clientRepeatFreqWarning": "För att kunna kommunicera utanför elnätet krävs frekvenserna 433, 869 eller 918 MHz." } diff --git a/lib/l10n/app_uk.arb b/lib/l10n/app_uk.arb index 26f3984..afa1179 100644 --- a/lib/l10n/app_uk.arb +++ b/lib/l10n/app_uk.arb @@ -131,9 +131,6 @@ "settings_infoContactsCount": "Кількість контактів", "settings_infoChannelCount": "Кількість каналів", "settings_presets": "Попередні налаштування", - "settings_preset915Mhz": "915 МГц", - "settings_preset868Mhz": "868 МГц", - "settings_preset433Mhz": "433 МГц", "settings_frequency": "Частота (МГц)", "settings_frequencyHelper": "300.0 - 2500.0", "settings_frequencyInvalid": "Некоректна частота (300-2500 МГц)", @@ -143,8 +140,6 @@ "settings_txPower": "Потужність TX (дБм)", "settings_txPowerHelper": "0 - 22", "settings_txPowerInvalid": "Некоректна потужність TX (0-22 дБм)", - "settings_longRange": "Дальній діапазон", - "settings_fastSpeed": "Висока швидкість", "settings_error": "Помилка: {message}", "@settings_error": { "placeholders": { @@ -1598,5 +1593,8 @@ "map_pathTraceCancelled": "Відмінується трасування шляху", "scanner_enableBluetooth": "Увімкніть Bluetooth", "scanner_bluetoothOffMessage": "Будь ласка, увімкніть Bluetooth, щоб сканувати пристрої.", - "scanner_bluetoothOff": "Bluetooth вимкнено" + "scanner_bluetoothOff": "Bluetooth вимкнено", + "settings_clientRepeatFreqWarning": "Повтор без підключення до мережі вимагає частоти 433, 869 або 918 МГц.", + "settings_clientRepeatSubtitle": "Дозвольте цьому пристрою повторювати пакети даних для інших пристроїв.", + "settings_clientRepeat": "Автономна система" } diff --git a/lib/l10n/app_zh.arb b/lib/l10n/app_zh.arb index 7b4b3ab..312ed1a 100644 --- a/lib/l10n/app_zh.arb +++ b/lib/l10n/app_zh.arb @@ -136,9 +136,6 @@ "settings_infoContactsCount": "联系人数量", "settings_infoChannelCount": "通道数量", "settings_presets": "预设", - "settings_preset915Mhz": "915 兆赫", - "settings_preset868Mhz": "868 兆赫", - "settings_preset433Mhz": "433 兆赫", "settings_frequency": "频率 (MHz)", "settings_frequencyHelper": "300.0 - 2500.0", "settings_frequencyInvalid": "无效频率(300-2500 MHz)", @@ -148,8 +145,6 @@ "settings_txPower": "TX 功率(dBm)", "settings_txPowerHelper": "0 - 22", "settings_txPowerInvalid": "无效的发射功率(0-22 dBm)", - "settings_longRange": "远距离", - "settings_fastSpeed": "高速", "settings_error": "[保存:{message}]\n错误:{message}", "@settings_error": { "placeholders": { @@ -1598,5 +1593,8 @@ "map_runTrace": "运行路径跟踪", "scanner_bluetoothOffMessage": "请打开蓝牙功能,以便搜索设备。", "scanner_bluetoothOff": "蓝牙已关闭", - "scanner_enableBluetooth": "启用蓝牙" + "scanner_enableBluetooth": "启用蓝牙", + "settings_clientRepeat": "离网重复", + "settings_clientRepeatSubtitle": "允许此设备重复发送网状数据包给其他设备", + "settings_clientRepeatFreqWarning": "离网重复通信需要使用 433、869 或 918 兆赫兹的频率。" } diff --git a/lib/models/radio_settings.dart b/lib/models/radio_settings.dart index 20b7771..5125698 100644 --- a/lib/models/radio_settings.dart +++ b/lib/models/radio_settings.dart @@ -59,46 +59,29 @@ class RadioSettings { required this.txPowerDbm, }); - // Preset configurations - static RadioSettings get preset915MHz => RadioSettings( - frequencyMHz: 915.0, - bandwidth: LoRaBandwidth.bw125, - spreadingFactor: LoRaSpreadingFactor.sf7, - codingRate: LoRaCodingRate.cr4_5, - txPowerDbm: 20, - ); - - static RadioSettings get preset868MHz => RadioSettings( - frequencyMHz: 868.0, - bandwidth: LoRaBandwidth.bw125, - spreadingFactor: LoRaSpreadingFactor.sf7, - codingRate: LoRaCodingRate.cr4_5, - txPowerDbm: 14, - ); - - static RadioSettings get preset433MHz => RadioSettings( - frequencyMHz: 433.0, - bandwidth: LoRaBandwidth.bw125, - spreadingFactor: LoRaSpreadingFactor.sf7, - codingRate: LoRaCodingRate.cr4_5, - txPowerDbm: 20, - ); - - static RadioSettings get presetLongRange => RadioSettings( - frequencyMHz: 915.0, - bandwidth: LoRaBandwidth.bw125, - spreadingFactor: LoRaSpreadingFactor.sf12, - codingRate: LoRaCodingRate.cr4_8, - txPowerDbm: 20, - ); - - static RadioSettings get presetFastSpeed => RadioSettings( - frequencyMHz: 915.0, - bandwidth: LoRaBandwidth.bw500, - spreadingFactor: LoRaSpreadingFactor.sf7, - codingRate: LoRaCodingRate.cr4_5, - txPowerDbm: 20, - ); + // Regional preset configurations + static final List<(String, RadioSettings)> presets = [ + ('Australia', RadioSettings(frequencyMHz: 915.8, bandwidth: LoRaBandwidth.bw250, spreadingFactor: LoRaSpreadingFactor.sf10, codingRate: LoRaCodingRate.cr4_5, txPowerDbm: 20)), + ('Australia (Narrow)', RadioSettings(frequencyMHz: 916.575, bandwidth: LoRaBandwidth.bw62_5, spreadingFactor: LoRaSpreadingFactor.sf7, codingRate: LoRaCodingRate.cr4_5, txPowerDbm: 20)), + ('Australia SA, WA, QLD', RadioSettings(frequencyMHz: 923.125, bandwidth: LoRaBandwidth.bw62_5, spreadingFactor: LoRaSpreadingFactor.sf8, codingRate: LoRaCodingRate.cr4_5, txPowerDbm: 20)), + ('Czech Republic', RadioSettings(frequencyMHz: 869.432, bandwidth: LoRaBandwidth.bw62_5, spreadingFactor: LoRaSpreadingFactor.sf7, codingRate: LoRaCodingRate.cr4_5, txPowerDbm: 14)), + ('EU 433MHz', RadioSettings(frequencyMHz: 433.650, bandwidth: LoRaBandwidth.bw250, spreadingFactor: LoRaSpreadingFactor.sf11, codingRate: LoRaCodingRate.cr4_5, txPowerDbm: 20)), + ('EU/UK (Long Range)', RadioSettings(frequencyMHz: 869.525, bandwidth: LoRaBandwidth.bw250, spreadingFactor: LoRaSpreadingFactor.sf11, codingRate: LoRaCodingRate.cr4_5, txPowerDbm: 14)), + ('EU/UK (Medium Range)', RadioSettings(frequencyMHz: 869.525, bandwidth: LoRaBandwidth.bw250, spreadingFactor: LoRaSpreadingFactor.sf10, codingRate: LoRaCodingRate.cr4_5, txPowerDbm: 14)), + ('EU/UK (Narrow)', RadioSettings(frequencyMHz: 869.618, bandwidth: LoRaBandwidth.bw62_5, spreadingFactor: LoRaSpreadingFactor.sf8, codingRate: LoRaCodingRate.cr4_5, txPowerDbm: 14)), + ('New Zealand', RadioSettings(frequencyMHz: 917.375, bandwidth: LoRaBandwidth.bw250, spreadingFactor: LoRaSpreadingFactor.sf11, codingRate: LoRaCodingRate.cr4_5, txPowerDbm: 20)), + ('New Zealand (Narrow)', RadioSettings(frequencyMHz: 917.375, bandwidth: LoRaBandwidth.bw62_5, spreadingFactor: LoRaSpreadingFactor.sf7, codingRate: LoRaCodingRate.cr4_5, txPowerDbm: 20)), + ('Portugal 433', RadioSettings(frequencyMHz: 433.375, bandwidth: LoRaBandwidth.bw62_5, spreadingFactor: LoRaSpreadingFactor.sf9, codingRate: LoRaCodingRate.cr4_5, txPowerDbm: 20)), + ('Portugal 869', RadioSettings(frequencyMHz: 869.618, bandwidth: LoRaBandwidth.bw62_5, spreadingFactor: LoRaSpreadingFactor.sf7, codingRate: LoRaCodingRate.cr4_5, txPowerDbm: 14)), + ('Switzerland', RadioSettings(frequencyMHz: 869.618, bandwidth: LoRaBandwidth.bw62_5, spreadingFactor: LoRaSpreadingFactor.sf8, codingRate: LoRaCodingRate.cr4_5, txPowerDbm: 14)), + ('USA Arizona', RadioSettings(frequencyMHz: 908.205, bandwidth: LoRaBandwidth.bw62_5, spreadingFactor: LoRaSpreadingFactor.sf10, codingRate: LoRaCodingRate.cr4_5, txPowerDbm: 20)), + ('USA/Canada', RadioSettings(frequencyMHz: 910.525, bandwidth: LoRaBandwidth.bw62_5, spreadingFactor: LoRaSpreadingFactor.sf7, codingRate: LoRaCodingRate.cr4_5, txPowerDbm: 20)), + ('Vietnam', RadioSettings(frequencyMHz: 920.250, bandwidth: LoRaBandwidth.bw250, spreadingFactor: LoRaSpreadingFactor.sf11, codingRate: LoRaCodingRate.cr4_5, txPowerDbm: 20)), + // Off-grid repeat presets (valid client_repeat frequencies) + ('Off-Grid 433', RadioSettings(frequencyMHz: 433.0, bandwidth: LoRaBandwidth.bw250, spreadingFactor: LoRaSpreadingFactor.sf11, codingRate: LoRaCodingRate.cr4_5, txPowerDbm: 20)), + ('Off-Grid 869', RadioSettings(frequencyMHz: 869.0, bandwidth: LoRaBandwidth.bw250, spreadingFactor: LoRaSpreadingFactor.sf11, codingRate: LoRaCodingRate.cr4_5, txPowerDbm: 14)), + ('Off-Grid 918', RadioSettings(frequencyMHz: 918.0, bandwidth: LoRaBandwidth.bw250, spreadingFactor: LoRaSpreadingFactor.sf11, codingRate: LoRaCodingRate.cr4_5, txPowerDbm: 20)), + ]; int get frequencyHz => (frequencyMHz * 1000).round(); int get bandwidthHz => bandwidth.hz; diff --git a/lib/screens/settings_screen.dart b/lib/screens/settings_screen.dart index 73376f0..f131ecb 100644 --- a/lib/screens/settings_screen.dart +++ b/lib/screens/settings_screen.dart @@ -862,6 +862,7 @@ class _RadioSettingsDialogState extends State<_RadioSettingsDialog> { LoRaSpreadingFactor _spreadingFactor = LoRaSpreadingFactor.sf7; LoRaCodingRate _codingRate = LoRaCodingRate.cr4_5; final _txPowerController = TextEditingController(text: '20'); + bool _clientRepeat = false; @override void initState() { @@ -911,6 +912,8 @@ class _RadioSettingsDialogState extends State<_RadioSettingsDialog> { if (widget.connector.currentTxPower != null) { _txPowerController.text = widget.connector.currentTxPower.toString(); } + + _clientRepeat = widget.connector.clientRepeat ?? false; } @override @@ -960,9 +963,23 @@ class _RadioSettingsDialogState extends State<_RadioSettingsDialog> { widget.connector.currentCr, ); + final supportsRepeat = + (widget.connector.firmwareVerCode ?? 0) >= 9; + + if (supportsRepeat) { + const validRepeatFreqsKHz = {433000, 869000, 918000}; + if (_clientRepeat && !validRepeatFreqsKHz.contains(freqHz)) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text(l10n.settings_clientRepeatFreqWarning)), + ); + return; + } + } + try { await widget.connector.sendFrame( - buildSetRadioParamsFrame(freqHz, bwHz, sf, cr), + buildSetRadioParamsFrame(freqHz, bwHz, sf, cr, + clientRepeat: supportsRepeat ? _clientRepeat : null), ); await widget.connector.sendFrame(buildSetRadioTxPowerFrame(txPower)); await widget.connector.refreshDeviceInfo(); @@ -1001,37 +1018,25 @@ class _RadioSettingsDialogState extends State<_RadioSettingsDialog> { mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text( - l10n.settings_presets, - style: const TextStyle(fontWeight: FontWeight.bold), - ), - const SizedBox(height: 8), - Wrap( - spacing: 8, - children: [ - _PresetChip( - label: l10n.settings_preset915Mhz, - onTap: () => _applyPreset(RadioSettings.preset915MHz), - ), - _PresetChip( - label: l10n.settings_preset868Mhz, - onTap: () => _applyPreset(RadioSettings.preset868MHz), - ), - _PresetChip( - label: l10n.settings_preset433Mhz, - onTap: () => _applyPreset(RadioSettings.preset433MHz), - ), - _PresetChip( - label: l10n.settings_longRange, - onTap: () => _applyPreset(RadioSettings.presetLongRange), - ), - _PresetChip( - label: l10n.settings_fastSpeed, - onTap: () => _applyPreset(RadioSettings.presetFastSpeed), - ), + DropdownButtonFormField( + decoration: InputDecoration( + labelText: l10n.settings_presets, + border: const OutlineInputBorder(), + ), + items: [ + for (var i = 0; i < RadioSettings.presets.length; i++) + DropdownMenuItem( + value: i, + child: Text(RadioSettings.presets[i].$1), + ), ], + onChanged: (index) { + if (index != null) { + _applyPreset(RadioSettings.presets[index].$2); + } + }, ), - const SizedBox(height: 24), + const SizedBox(height: 16), TextField( controller: _frequencyController, decoration: InputDecoration( @@ -1103,6 +1108,16 @@ class _RadioSettingsDialogState extends State<_RadioSettingsDialog> { ), keyboardType: TextInputType.number, ), + if ((widget.connector.firmwareVerCode ?? 0) >= 9) ...[ + const SizedBox(height: 16), + SwitchListTile( + title: Text(l10n.settings_clientRepeat), + subtitle: Text(l10n.settings_clientRepeatSubtitle), + value: _clientRepeat, + onChanged: (value) => setState(() => _clientRepeat = value), + contentPadding: EdgeInsets.zero, + ), + ], ], ), ), @@ -1117,14 +1132,3 @@ class _RadioSettingsDialogState extends State<_RadioSettingsDialog> { } } -class _PresetChip extends StatelessWidget { - final String label; - final VoidCallback onTap; - - const _PresetChip({required this.label, required this.onTap}); - - @override - Widget build(BuildContext context) { - return ActionChip(label: Text(label), onPressed: onTap); - } -}