mirror of
https://github.com/zjs81/meshcore-open.git
synced 2026-07-12 20:02:01 +10:00
e1a4900dc0
This adds a simple UI in repeater management settings for remotely setting a repeater's private key. A key can be pasted from an external key generator, or a random one can be generated here, optionally with a specified prefix. If a prefix is specified, searching is done in 30ms batches in order to keep the UI responsive and show the progress indicator animation smoothly. Searches can be interrupted. An estimation of search length is given as expected number of generated key pairs. (A future improvement would be to observe keys per second performance and give time estimates based on that.) When it generates a new private key on your behalf, it can tell you what the corresponding public key will be. Unfortunately, if you paste one in from another source, it can't compute the corresponding public key. This is because the standard Dart crypto library doesn't provide that capability, nor does it give access to the elliptic curve functions it implements so we could do it ourselves. Our only recourse would be to copy the source for all those things, and I didn't think it was worth it. This will not check the validity of a pasted key, but the remote repeater will. It does limit it to the correct length and hexadecimal charset. Prefixes are limited to 4 characters. There's no technical reason for this, but users are unlikely to want more, and I think it would just be a bad experience to allow more and spin for a very long time. If someone really wants a longer one, they can use an external generator like they do now. Possible TODO: rewrite background processing using isolates. Closes #142.
2651 lines
96 KiB
Plaintext
2651 lines
96 KiB
Plaintext
{
|
|
"@@locale": "en",
|
|
"appTitle": "MeshCore Open",
|
|
"nav_contacts": "Contacts",
|
|
"nav_channels": "Channels",
|
|
"nav_map": "Map",
|
|
"common_cancel": "Cancel",
|
|
"common_ok": "OK",
|
|
"common_connect": "Connect",
|
|
"common_unknownDevice": "Unknown Device",
|
|
"common_save": "Save",
|
|
"common_delete": "Delete",
|
|
"common_deleteAll": "Delete All",
|
|
"common_close": "Close",
|
|
"common_done": "Done",
|
|
"common_edit": "Edit",
|
|
"common_add": "Add",
|
|
"common_settings": "Settings",
|
|
"common_disconnect": "Disconnect",
|
|
"common_connected": "Connected",
|
|
"common_disconnected": "Disconnected",
|
|
"common_create": "Create",
|
|
"common_continue": "Continue",
|
|
"common_share": "Share",
|
|
"common_copy": "Copy",
|
|
"common_retry": "Retry",
|
|
"common_hide": "Hide",
|
|
"common_remove": "Remove",
|
|
"common_enable": "Enable",
|
|
"common_disable": "Disable",
|
|
"common_undo": "Undo",
|
|
"messageStatus_sent": "Sent",
|
|
"messageStatus_delivered": "Delivered",
|
|
"messageStatus_pending": "Sending",
|
|
"messageStatus_failed": "Failed to send",
|
|
"messageStatus_repeated": "Heard repeated",
|
|
"common_reboot": "Reboot",
|
|
"common_loading": "Loading...",
|
|
"common_notAvailable": "—",
|
|
"common_voltageValue": "{volts} V",
|
|
"@common_voltageValue": {
|
|
"placeholders": {
|
|
"volts": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"common_percentValue": "{percent}%",
|
|
"@common_percentValue": {
|
|
"placeholders": {
|
|
"percent": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
"common_autoRefresh": "Autorefresh",
|
|
"common_interval": "Interval",
|
|
"scanner_title": "MeshCore Open",
|
|
"connectionChoiceUsbLabel": "USB",
|
|
"connectionChoiceBluetoothLabel": "Bluetooth",
|
|
"connectionChoiceTcpLabel": "TCP",
|
|
"tcpScreenTitle": "Connect over TCP",
|
|
"tcpHostLabel": "Endpoint",
|
|
"tcpHostHint": "192.168.40.10 / example.com",
|
|
"tcpPortLabel": "Port",
|
|
"tcpPortHint": "5000",
|
|
"tcpStatus_notConnected": "Enter endpoint and connect",
|
|
"tcpStatus_connectingTo": "Connecting to {endpoint}...",
|
|
"@tcpStatus_connectingTo": {
|
|
"placeholders": {
|
|
"endpoint": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"tcpErrorHostRequired": "Host is required.",
|
|
"tcpErrorPortInvalid": "Port must be between 1 and 65535.",
|
|
"tcpErrorUnsupported": "TCP transport is not supported on this platform.",
|
|
"tcpErrorTimedOut": "TCP connection timed out.",
|
|
"tcpConnectionFailed": "TCP connection failed: {error}",
|
|
"@tcpConnectionFailed": {
|
|
"placeholders": {
|
|
"error": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"usbScreenTitle": "Connect over USB",
|
|
"usbScreenSubtitle": "Choose a detected serial device and connect directly to your MeshCore node.",
|
|
"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": "Connection timed out. Make sure the device has USB Companion firmware.",
|
|
"usbFallbackDeviceName": "Web Serial Device",
|
|
"usbStatus_notConnected": "Select a USB device",
|
|
"usbStatus_connecting": "Connecting to USB device...",
|
|
"usbStatus_searching": "Searching for USB devices...",
|
|
"usbConnectionFailed": "USB connection failed: {error}",
|
|
"@usbConnectionFailed": {
|
|
"placeholders": {
|
|
"error": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"scanner_scanning": "Scanning for devices...",
|
|
"scanner_connecting": "Connecting...",
|
|
"scanner_disconnecting": "Disconnecting...",
|
|
"scanner_notConnected": "Not connected",
|
|
"scanner_connectedTo": "Connected to {deviceName}",
|
|
"@scanner_connectedTo": {
|
|
"placeholders": {
|
|
"deviceName": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"scanner_searchingDevices": "Searching for MeshCore devices...",
|
|
"scanner_tapToScan": "Tap Scan to find MeshCore devices",
|
|
"scanner_connectionFailed": "Connection failed: {error}",
|
|
"@scanner_connectionFailed": {
|
|
"placeholders": {
|
|
"error": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"scanner_stop": "Stop",
|
|
"scanner_scan": "Scan",
|
|
"scanner_bluetoothOff": "Bluetooth is off",
|
|
"scanner_bluetoothOffMessage": "Please turn on Bluetooth to scan for devices",
|
|
"scanner_chromeRequired": "Chrome Browser Required",
|
|
"scanner_chromeRequiredMessage": "This web application requires Google Chrome or a Chromium-based browser for Bluetooth support.",
|
|
"scanner_enableBluetooth": "Enable Bluetooth",
|
|
"scanner_bluetoothWebUnsupported": "Bluetooth isn't available in the browser. Connect over USB instead.",
|
|
"device_quickSwitch": "Quick switch",
|
|
"device_meshcore": "MeshCore",
|
|
"settings_title": "Settings",
|
|
"settings_deviceInfo": "Device Info",
|
|
"settings_appSettings": "App Settings",
|
|
"settings_appSettingsSubtitle": "Notifications, messaging, and map preferences",
|
|
"settings_nodeSettings": "Node Settings",
|
|
"settings_nodeName": "Node Name",
|
|
"settings_nodeNameNotSet": "Not set",
|
|
"settings_nodeNameHint": "Enter node name",
|
|
"settings_nodeNameUpdated": "Name updated",
|
|
"settings_radioSettings": "Radio Settings",
|
|
"settings_radioSettingsSubtitle": "Frequency, power, spreading factor",
|
|
"settings_radioSettingsUpdated": "Radio settings updated",
|
|
"settings_regionSettings": "Regions",
|
|
"settings_regionSettingsSubtitle": "Manage stored regions",
|
|
"settings_regionManagement_screenTitle": "Region Management",
|
|
"settings_regionNameHint": "Enter region name",
|
|
"settings_regionAddRegion": "Add region",
|
|
"settings_regionFetchRegions": "Fetch regions from repeaters",
|
|
"settings_regionFetchRegionsFail": "No regions were found",
|
|
"settings_regionFetchRegionsAlreadyExists": "This region has already been added",
|
|
"settings_regionName": "Region Name",
|
|
"settings_regionDeleted": "Region deleted",
|
|
"settings_deleteRegion": "Delete Region",
|
|
"settings_deleteRegionConfirm": "Remove \"{region}\" from region list?",
|
|
"@settings_deleteRegionConfirm": {
|
|
"placeholders": {
|
|
"region": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"settings_location": "Location",
|
|
"settings_locationSubtitle": "GPS coordinates",
|
|
"settings_locationUpdated": "Location and GPS settings updated",
|
|
"settings_locationBothRequired": "Enter both latitude and longitude.",
|
|
"settings_locationInvalid": "Invalid latitude or longitude.",
|
|
"settings_locationGPSEnable": "GPS Enable",
|
|
"settings_locationGPSEnableSubtitle": "Enables GPS to automatically update location.",
|
|
"settings_locationIntervalSec": "Interval for GPS (Seconds)",
|
|
"settings_locationIntervalInvalid": "Interval must be at least 60 seconds, and less than 86400 seconds.",
|
|
"settings_latitude": "Latitude",
|
|
"settings_longitude": "Longitude",
|
|
"settings_contactSettings": "Contact Settings",
|
|
"settings_contactSettingsSubtitle": "Settings for how contacts are added.",
|
|
"settings_privacyMode": "Privacy Mode",
|
|
"settings_privacyModeSubtitle": "Hide name/location in advertisements",
|
|
"settings_privacyModeToggle": "Toggle privacy mode to hide your name and location in advertisements.",
|
|
"settings_privacyModeEnabled": "Privacy mode enabled",
|
|
"settings_privacyModeDisabled": "Privacy mode disabled",
|
|
"settings_privacy": "Privacy Settings",
|
|
"settings_privacySubtitle": "Control what information is shared.",
|
|
"settings_privacySettingsDescription": "Choose what information your device shares with others.",
|
|
"settings_denyAll": "Deny all",
|
|
"settings_allowByContact": "Allow by contact flags",
|
|
"settings_allowAll": "Allow all",
|
|
"settings_telemetryBaseMode": "Telemetry Base Mode",
|
|
"settings_telemetryLocationMode": "Telemetry Location Mode",
|
|
"settings_telemetryEnvironmentMode": "Telemetry Environment Mode",
|
|
"settings_advertLocation": "Advert Location",
|
|
"settings_advertLocationSubtitle": "Include location in advert.",
|
|
"settings_multiAck": "Multi-ACKs",
|
|
"settings_telemetryModeUpdated": "Telemetry mode updated",
|
|
"settings_actions": "Actions",
|
|
"settings_deleteAllPaths": "Delete All Paths",
|
|
"settings_deleteAllPathsSubtitle": "Clear all path data from contacts.",
|
|
"settings_sendAdvertisement": "Send Advertisement",
|
|
"settings_sendAdvertisementSubtitle": "Broadcast presence now",
|
|
"settings_advertisementSent": "Advertisement sent",
|
|
"settings_syncTime": "Sync Time",
|
|
"settings_syncTimeSubtitle": "Set device clock to phone time",
|
|
"settings_timeSynchronized": "Time synchronized",
|
|
"settings_refreshContacts": "Refresh Contacts",
|
|
"settings_refreshContactsSubtitle": "Reload contact list from device",
|
|
"settings_rebootDevice": "Reboot Device",
|
|
"settings_rebootDeviceSubtitle": "Restart the MeshCore device",
|
|
"settings_rebootDeviceConfirm": "Are you sure you want to reboot the device? You will be disconnected.",
|
|
"settings_debug": "Debug",
|
|
"settings_companionDebugLog": "Companion Debug Log",
|
|
"settings_companionDebugLogSubtitle": "BLE/TCP/USB commands, responses, and raw data",
|
|
"settings_appDebugLog": "App Debug Log",
|
|
"settings_appDebugLogSubtitle": "Application debug messages",
|
|
"settings_about": "About",
|
|
"settings_aboutVersion": "MeshCore Open v{version}",
|
|
"@settings_aboutVersion": {
|
|
"placeholders": {
|
|
"version": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"settings_aboutLegalese": "2026 MeshCore Open Source Project",
|
|
"settings_aboutDescription": "An open-source Flutter client for MeshCore LoRa mesh networking devices.",
|
|
"settings_aboutOpenMeteoAttribution": "LOS elevation data: Open-Meteo (CC BY 4.0)",
|
|
"settings_infoName": "Name",
|
|
"settings_infoId": "ID",
|
|
"settings_infoStatus": "Status",
|
|
"settings_infoBattery": "Battery",
|
|
"settings_infoPublicKey": "Public Key",
|
|
"settings_infoContactsCount": "Contacts Count",
|
|
"settings_infoChannelCount": "Channel Count",
|
|
"settings_presets": "Presets",
|
|
"settings_frequency": "Frequency (MHz)",
|
|
"settings_frequencyHelper": "300.0 - 2500.0",
|
|
"settings_frequencyInvalid": "Invalid frequency (300-2500 MHz)",
|
|
"settings_bandwidth": "Bandwidth",
|
|
"settings_spreadingFactor": "Spreading Factor",
|
|
"settings_codingRate": "Coding Rate",
|
|
"settings_txPower": "TX Power (dBm)",
|
|
"settings_txPowerHelper": "0 - 22",
|
|
"settings_txPowerInvalid": "Invalid TX power (0-22 dBm)",
|
|
"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"
|
|
}
|
|
}
|
|
},
|
|
"appSettings_title": "App Settings",
|
|
"appSettings_appearance": "Appearance",
|
|
"appSettings_theme": "Theme",
|
|
"appSettings_themeSystem": "System default",
|
|
"appSettings_themeLight": "Light",
|
|
"appSettings_themeDark": "Dark",
|
|
"appSettings_language": "Language",
|
|
"appSettings_languageSystem": "System default",
|
|
"appSettings_languageEn": "English",
|
|
"appSettings_languageFr": "Français",
|
|
"appSettings_languageEs": "Español",
|
|
"appSettings_languageDe": "Deutsch",
|
|
"appSettings_languagePl": "Polski",
|
|
"appSettings_languageSl": "Slovenščina",
|
|
"appSettings_languagePt": "Português",
|
|
"appSettings_languageIt": "Italiano",
|
|
"appSettings_languageZh": "中文",
|
|
"appSettings_languageSv": "Svenska",
|
|
"appSettings_languageNl": "Nederlands",
|
|
"appSettings_languageSk": "Slovenčina",
|
|
"appSettings_languageBg": "Български",
|
|
"appSettings_languageRu": "Русский",
|
|
"appSettings_languageUk": "Українська",
|
|
"appSettings_enableMessageTracing": "Enable Message Tracing",
|
|
"appSettings_enableMessageTracingSubtitle": "Show detailed routing and timing metadata for messages",
|
|
"appSettings_notifications": "Notifications",
|
|
"appSettings_enableNotifications": "Enable Notifications",
|
|
"appSettings_enableNotificationsSubtitle": "Receive notifications for messages and adverts",
|
|
"appSettings_notificationPermissionDenied": "Notification permission denied",
|
|
"appSettings_notificationsEnabled": "Notifications enabled",
|
|
"appSettings_notificationsDisabled": "Notifications disabled",
|
|
"appSettings_messageNotifications": "Message Notifications",
|
|
"appSettings_messageNotificationsSubtitle": "Show notification when receiving new messages",
|
|
"appSettings_channelMessageNotifications": "Channel Message Notifications",
|
|
"appSettings_channelMessageNotificationsSubtitle": "Show notification when receiving channel messages",
|
|
"appSettings_advertisementNotifications": "Advertisement Notifications",
|
|
"appSettings_advertisementNotificationsSubtitle": "Show notification when new nodes are discovered",
|
|
"appSettings_messaging": "Messaging",
|
|
"appSettings_clearPathOnMaxRetry": "Clear Path on Max Retry",
|
|
"appSettings_clearPathOnMaxRetrySubtitle": "Reset contact path after 5 failed send attempts",
|
|
"appSettings_pathsWillBeCleared": "Paths will be cleared after 5 failed retries",
|
|
"appSettings_pathsWillNotBeCleared": "Paths will not be auto-cleared",
|
|
"appSettings_autoRouteRotation": "Auto Route Rotation",
|
|
"appSettings_autoRouteRotationSubtitle": "Cycle between best paths and flood mode",
|
|
"appSettings_autoRouteRotationEnabled": "Auto route rotation enabled",
|
|
"appSettings_autoRouteRotationDisabled": "Auto route rotation disabled",
|
|
"appSettings_maxRouteWeight": "Max Route Weight",
|
|
"appSettings_maxRouteWeightSubtitle": "Maximum weight a path can accumulate from successful deliveries",
|
|
"appSettings_initialRouteWeight": "Initial Route Weight",
|
|
"appSettings_initialRouteWeightSubtitle": "Starting weight for newly discovered paths",
|
|
"appSettings_routeWeightSuccessIncrement": "Success Weight Increment",
|
|
"appSettings_routeWeightSuccessIncrementSubtitle": "Weight added to a path after successful delivery",
|
|
"appSettings_routeWeightFailureDecrement": "Failure Weight Decrement",
|
|
"appSettings_routeWeightFailureDecrementSubtitle": "Weight removed from a path after failed delivery",
|
|
"appSettings_maxMessageRetries": "Max Message Retries",
|
|
"appSettings_maxMessageRetriesSubtitle": "Number of retry attempts before marking a message as failed",
|
|
"appSettings_battery": "Battery",
|
|
"appSettings_batteryChemistry": "Battery Chemistry",
|
|
"appSettings_batteryChemistryPerDevice": "Set per device ({deviceName})",
|
|
"@appSettings_batteryChemistryPerDevice": {
|
|
"placeholders": {
|
|
"deviceName": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"appSettings_batteryChemistryConnectFirst": "Connect to a device to choose",
|
|
"appSettings_batteryNmc": "18650 NMC (3.0-4.2V)",
|
|
"appSettings_batteryLifepo4": "LiFePO4 (2.6-3.65V)",
|
|
"appSettings_batteryLipo": "LiPo (3.0-4.2V)",
|
|
"appSettings_mapDisplay": "Map Display",
|
|
"appSettings_showRepeaters": "Show Repeaters",
|
|
"appSettings_showRepeatersSubtitle": "Display repeater nodes on the map",
|
|
"appSettings_showChatNodes": "Show Chat Nodes",
|
|
"appSettings_showChatNodesSubtitle": "Display chat nodes on the map",
|
|
"appSettings_showOtherNodes": "Show Other Nodes",
|
|
"appSettings_showOtherNodesSubtitle": "Display other node types on the map",
|
|
"appSettings_timeFilter": "Time Filter",
|
|
"appSettings_timeFilterShowAll": "Show all nodes",
|
|
"appSettings_timeFilterShowLast": "Show nodes from last {hours} hours",
|
|
"@appSettings_timeFilterShowLast": {
|
|
"placeholders": {
|
|
"hours": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
"appSettings_mapTimeFilter": "Map Time Filter",
|
|
"appSettings_showNodesDiscoveredWithin": "Show nodes discovered within:",
|
|
"appSettings_allTime": "All time",
|
|
"appSettings_lastHour": "Last hour",
|
|
"appSettings_last6Hours": "Last 6 hours",
|
|
"appSettings_last24Hours": "Last 24 hours",
|
|
"appSettings_lastWeek": "Last week",
|
|
"appSettings_offlineMapCache": "Offline Map Cache",
|
|
"appSettings_unitsTitle": "Units",
|
|
"appSettings_unitsMetric": "Metric (m / km)",
|
|
"appSettings_unitsImperial": "Imperial (ft / mi)",
|
|
"appSettings_noAreaSelected": "No area selected",
|
|
"appSettings_areaSelectedZoom": "Area selected (zoom {minZoom}-{maxZoom})",
|
|
"@appSettings_areaSelectedZoom": {
|
|
"placeholders": {
|
|
"minZoom": {
|
|
"type": "int"
|
|
},
|
|
"maxZoom": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
"appSettings_debugCard": "Debug",
|
|
"appSettings_appDebugLogging": "App Debug Logging",
|
|
"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",
|
|
"contacts_unread": "Unread",
|
|
"contacts_searchContactsNoNumber": "Search Contacts...",
|
|
"contacts_searchContacts": "Search {number}{str} Contacts...",
|
|
"@contacts_searchContacts": {
|
|
"placeholders": {
|
|
"number": {
|
|
"type": "int"
|
|
},
|
|
"str": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"contacts_searchFavorites": "Search {number}{str} Favorites...",
|
|
"@contacts_searchFavorites": {
|
|
"placeholders": {
|
|
"number": {
|
|
"type": "int"
|
|
},
|
|
"str": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"contacts_searchUsers": "Search {number}{str} Users...",
|
|
"@contacts_searchUsers": {
|
|
"placeholders": {
|
|
"number": {
|
|
"type": "int"
|
|
},
|
|
"str": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"contacts_searchRepeaters": "Search {number}{str} Repeaters...",
|
|
"@contacts_searchRepeaters": {
|
|
"placeholders": {
|
|
"number": {
|
|
"type": "int"
|
|
},
|
|
"str": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"contacts_searchRoomServers": "Search {number}{str} Room servers...",
|
|
"@contacts_searchRoomServers": {
|
|
"placeholders": {
|
|
"number": {
|
|
"type": "int"
|
|
},
|
|
"str": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"contacts_noUnreadContacts": "No unread contacts",
|
|
"contacts_noContactsFound": "No contacts or groups found",
|
|
"contacts_deleteContact": "Delete Contact",
|
|
"contacts_removeConfirm": "Remove {contactName} from contacts?",
|
|
"@contacts_removeConfirm": {
|
|
"placeholders": {
|
|
"contactName": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"contacts_manageRepeater": "Manage Repeater",
|
|
"contacts_manageRoom": "Manage Room Server",
|
|
"contacts_roomLogin": "Room Server Login",
|
|
"contacts_openChat": "Open Chat",
|
|
"contacts_editGroup": "Edit Group",
|
|
"contacts_deleteGroup": "Delete Group",
|
|
"contacts_deleteGroupConfirm": "Remove \"{groupName}\"?",
|
|
"@contacts_deleteGroupConfirm": {
|
|
"placeholders": {
|
|
"groupName": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"contacts_newGroup": "New Group",
|
|
"contacts_moreOptions": "More options",
|
|
"contacts_searchOpen": "Search contacts",
|
|
"contacts_searchClose": "Close search",
|
|
"contacts_groupName": "Group name",
|
|
"contacts_groupNameRequired": "Group name is required",
|
|
"contacts_groupNameReserved": "This group name is reserved",
|
|
"contacts_groupAlreadyExists": "Group \"{name}\" already exists",
|
|
"@contacts_groupAlreadyExists": {
|
|
"placeholders": {
|
|
"name": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"contacts_filterContacts": "Filter contacts...",
|
|
"contacts_noContactsMatchFilter": "No contacts match your filter",
|
|
"contacts_noMembers": "No members",
|
|
"contacts_lastSeenNow": "recently",
|
|
"contacts_lastSeenMinsAgo": "~ {minutes} min.",
|
|
"@contacts_lastSeenMinsAgo": {
|
|
"placeholders": {
|
|
"minutes": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
"contacts_lastSeenHourAgo": "~ 1 hour",
|
|
"contacts_lastSeenHoursAgo": "~ {hours} hours",
|
|
"@contacts_lastSeenHoursAgo": {
|
|
"placeholders": {
|
|
"hours": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
"contacts_lastSeenDayAgo": "~ 1 day",
|
|
"contacts_lastSeenDaysAgo": "~ {days} days",
|
|
"@contacts_lastSeenDaysAgo": {
|
|
"placeholders": {
|
|
"days": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
"contact_info": "Contact Info",
|
|
"contact_settings": "Contact Settings",
|
|
"contact_telemetry": "Telemetry",
|
|
"contact_lastSeen": "Last seen",
|
|
"contact_clearChat": "Clear Chat",
|
|
"contact_teleBase": "Telemetry Base",
|
|
"contact_teleBaseSubtitle": "Allow sharing battery level and basic telemetry",
|
|
"contact_teleLoc": "Telemetry Location",
|
|
"contact_teleLocSubtitle": "Allow sharing location data",
|
|
"contact_teleEnv": "Telemetry Environment",
|
|
"contact_teleEnvSubtitle": "Allow sharing environment sensor data",
|
|
"channels_title": "Channels",
|
|
"channels_noChannelsConfigured": "No channels configured",
|
|
"channels_addPublicChannel": "Add Public Channel",
|
|
"channels_searchChannels": "Search channels...",
|
|
"channels_noChannelsFound": "No channels found",
|
|
"channels_channelIndex": "Channel {index}",
|
|
"@channels_channelIndex": {
|
|
"placeholders": {
|
|
"index": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
"channels_public": "Public",
|
|
"channels_via": "via {path}",
|
|
"@channels_via": {
|
|
"placeholders": {
|
|
"path": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"channels_private": "Private",
|
|
"channels_editChannel": "Edit channel",
|
|
"channels_muteChannel": "Mute channel",
|
|
"channels_unmuteChannel": "Unmute channel",
|
|
"channels_deleteChannel": "Delete channel",
|
|
"channels_deleteChannelConfirm": "Delete \"{name}\"? This cannot be undone.",
|
|
"@channels_deleteChannelConfirm": {
|
|
"placeholders": {
|
|
"name": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"channels_channelDeleteFailed": "Failed to delete channel \"{name}\"",
|
|
"@channels_channelDeleteFailed": {
|
|
"placeholders": {
|
|
"name": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"channels_channelDeleted": "Channel \"{name}\" deleted",
|
|
"@channels_channelDeleted": {
|
|
"placeholders": {
|
|
"name": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"channels_addChannel": "Add Channel",
|
|
"channels_channelIndexLabel": "Channel Index",
|
|
"channels_channelName": "Channel Name",
|
|
"channels_usePublicChannel": "Use Public Channel",
|
|
"channels_standardPublicPsk": "Standard public PSK",
|
|
"channels_pskHex": "PSK (Hex)",
|
|
"channels_generateRandomPsk": "Generate random PSK",
|
|
"channels_enterChannelName": "Please enter a channel name",
|
|
"channels_pskMustBe32Hex": "PSK must be 32 hex characters",
|
|
"channels_channelAdded": "Channel \"{name}\" added",
|
|
"@channels_channelAdded": {
|
|
"placeholders": {
|
|
"name": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"channels_editChannelTitle": "Edit Channel {index}",
|
|
"@channels_editChannelTitle": {
|
|
"placeholders": {
|
|
"index": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
"channels_smazCompression": "SMAZ compression",
|
|
"channels_cyr2latCompression": "Cyr2Lat compression",
|
|
"channels_cyr2latCompressionDscr": "Replaces some Cyrillic characters with Latin characters when sending.",
|
|
"channels_cyr2latSettingsHeading": "Cyr2Lat Setup",
|
|
"channels_cyr2latSettingsSubheading": "List of replacements",
|
|
"channels_cyr2latSettingsDscr": "Edit the JSON configuration of character replacement",
|
|
"channels_cyr2latSettingsDialogHint": "JSON replacement map",
|
|
"channels_cyr2latSettingsDialogWrongJSON": "Invalid JSON: {error}",
|
|
"@channels_cyr2latSettingsDialogWrongJSON": {
|
|
"placeholders": {
|
|
"error": {}
|
|
}
|
|
},
|
|
"channels_channelUpdated": "Channel \"{name}\" updated",
|
|
"@channels_channelUpdated": {
|
|
"placeholders": {
|
|
"name": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"settings_cyr2latProfileAdd": "Add Cyr2Lat Profile",
|
|
"settings_cyr2latProfileName": "Profile Name",
|
|
"settings_cyr2latProfileNameEmpty": "Profile name cannot be empty",
|
|
"settings_cyr2latProfileAdded": "Profile added successfully",
|
|
"settings_cyr2latProfileUpdated": "Profile updated successfully",
|
|
"settings_cyr2latProfileEdit": "Edit Cyr2Lat Profile",
|
|
"settings_cyr2latProfileDelete": "Delete Cyr2Lat Profile",
|
|
"settings_cyr2latProfileDeleted": "Profile deleted successfully",
|
|
"settings_cyr2latProfileDeleteDscr": "Are you sure you want to delete the profile \"{name}\"?",
|
|
"@settings_cyr2latProfileDeleteDscr": {
|
|
"placeholders": {
|
|
"name": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"channels_publicChannelAdded": "Public channel added",
|
|
"channels_sortBy": "Sort by",
|
|
"channels_sortManual": "Manual",
|
|
"channels_sortAZ": "A-Z",
|
|
"channels_sortLatestMessages": "Latest messages",
|
|
"channels_sortUnread": "Unread",
|
|
"channels_createPrivateChannel": "Create a Private Channel",
|
|
"channels_createPrivateChannelDesc": "Secured with a secret key.",
|
|
"channels_joinPrivateChannel": "Join a Private Channel",
|
|
"channels_joinPrivateChannelDesc": "Manually enter a secret key.",
|
|
"channels_joinPublicChannel": "Join the Public Channel",
|
|
"channels_joinPublicChannelDesc": "Anyone can join this channel.",
|
|
"channels_joinHashtagChannel": "Join a Hashtag Channel",
|
|
"channels_joinHashtagChannelDesc": "Anyone can join hashtag channels.",
|
|
"channels_scanQrCode": "Scan a QR Code",
|
|
"channels_scanQrCodeComingSoon": "Coming soon",
|
|
"channels_enterHashtag": "Enter hashtag",
|
|
"channels_hashtagHint": "e.g. #team",
|
|
"channels_regionSetTo": "Region: {region}",
|
|
"@channels_regionSetTo": {
|
|
"placeholders": {
|
|
"region": {
|
|
"type": "String",
|
|
"example": "de-mitte"
|
|
}
|
|
}
|
|
},
|
|
"channels_regionNotSet": "Region: none",
|
|
"channels_regionSelect_Title": "Select a region",
|
|
"channels_clearRegion": "Clear region",
|
|
"chat_noMessages": "No messages yet",
|
|
"chat_sendMessage": "Send message",
|
|
"chat_sendMessageTo": "Send a message to {contactName}",
|
|
"@chat_sendMessageTo": {
|
|
"placeholders": {
|
|
"contactName": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"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"
|
|
}
|
|
}
|
|
},
|
|
"chat_replyTo": "Reply to {name}",
|
|
"@chat_replyTo": {
|
|
"placeholders": {
|
|
"name": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"chat_location": "Location",
|
|
"chat_typeMessage": "Type a message...",
|
|
"chat_messageTooLong": "Message too long (max {maxBytes} bytes).",
|
|
"@chat_messageTooLong": {
|
|
"placeholders": {
|
|
"maxBytes": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
"chat_messageCopied": "Message copied",
|
|
"chat_messageDeleted": "Message deleted",
|
|
"chat_retryingMessage": "Retrying message",
|
|
"chat_retryCount": "Retry {current}/{max}",
|
|
"@chat_retryCount": {
|
|
"placeholders": {
|
|
"current": {
|
|
"type": "int"
|
|
},
|
|
"max": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
"chat_sendGif": "Send GIF",
|
|
"chat_reply": "Reply",
|
|
"chat_addReaction": "Add Reaction",
|
|
"chat_me": "Me",
|
|
"emojiCategorySmileys": "Smileys",
|
|
"emojiCategoryGestures": "Gestures",
|
|
"emojiCategoryHearts": "Hearts",
|
|
"emojiCategoryObjects": "Objects",
|
|
"gifPicker_title": "Choose a GIF",
|
|
"gifPicker_searchHint": "Search GIFs...",
|
|
"gifPicker_poweredBy": "Powered by GIPHY",
|
|
"gifPicker_noGifsFound": "No GIFs found",
|
|
"gifPicker_failedLoad": "Failed to load GIFs",
|
|
"gifPicker_failedSearch": "Failed to search GIFs",
|
|
"gifPicker_noInternet": "No internet connection",
|
|
"debugLog_appTitle": "App Debug Log",
|
|
"debugLog_bleTitle": "BLE Debug Log",
|
|
"debugLog_copyLog": "Copy log",
|
|
"debugLog_clearLog": "Clear log",
|
|
"debugLog_copied": "Debug log copied",
|
|
"debugLog_bleCopied": "BLE log copied",
|
|
"debugLog_noEntries": "No debug logs yet",
|
|
"debugLog_enableInSettings": "Enable app debug logging in settings",
|
|
"debugLog_frames": "Frames",
|
|
"debugLog_rawLogRx": "Raw Log-RX",
|
|
"debugLog_noBleActivity": "No BLE activity yet",
|
|
"debugFrame_length": "Frame Length: {count} bytes",
|
|
"@debugFrame_length": {
|
|
"placeholders": {
|
|
"count": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
"debugFrame_command": "Command: 0x{value}",
|
|
"@debugFrame_command": {
|
|
"placeholders": {
|
|
"value": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"debugFrame_textMessageHeader": "Text Message Frame:",
|
|
"debugFrame_destinationPubKey": "- Destination PubKey: {pubKey}",
|
|
"@debugFrame_destinationPubKey": {
|
|
"placeholders": {
|
|
"pubKey": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"debugFrame_timestamp": "- Timestamp: {timestamp}",
|
|
"@debugFrame_timestamp": {
|
|
"placeholders": {
|
|
"timestamp": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
"debugFrame_flags": "- Flags: 0x{value}",
|
|
"@debugFrame_flags": {
|
|
"placeholders": {
|
|
"value": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"debugFrame_textType": "- Text Type: {type} ({label})",
|
|
"@debugFrame_textType": {
|
|
"placeholders": {
|
|
"type": {
|
|
"type": "int"
|
|
},
|
|
"label": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"debugFrame_textTypeCli": "CLI",
|
|
"debugFrame_textTypePlain": "Plain",
|
|
"debugFrame_text": "- Text: \"{text}\"",
|
|
"@debugFrame_text": {
|
|
"placeholders": {
|
|
"text": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"debugFrame_hexDump": "Hex Dump:",
|
|
"chat_hopsCount": "{count} {count, plural, =1{hop} other{hops}}",
|
|
"@chat_hopsCount": {
|
|
"placeholders": {
|
|
"count": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
"chat_removePath": "Remove path",
|
|
"chat_noPathHistoryYet": "No path history yet.\nSend a message to discover paths.",
|
|
"chat_pathCleared": "Path cleared. Next message will rediscover route.",
|
|
"chat_fullPath": "Full Path",
|
|
"routing_title": "Routing",
|
|
"routing_modeAuto": "Auto",
|
|
"routing_modeFlood": "Flood",
|
|
"routing_modeManual": "Manual",
|
|
"routing_modeAutoHint": "Picks the best known path automatically, flooding when none is known.",
|
|
"routing_modeFloodHint": "Broadcasts through every repeater. Most reliable, but uses more airtime.",
|
|
"routing_modeManualHint": "Always sends along the exact path you set.",
|
|
"routing_currentRoute": "Current route",
|
|
"routing_directNoHops": "Direct — no repeater hops",
|
|
"routing_noPathYet": "No path yet. The next message floods until a route is discovered.",
|
|
"routing_floodBroadcast": "Broadcast through every repeater",
|
|
"routing_editPath": "Edit path",
|
|
"routing_forgetPath": "Forget path",
|
|
"routing_knownPaths": "Known paths",
|
|
"routing_knownPathsHint": "Tap a path to switch to it.",
|
|
"routing_inUse": "In use",
|
|
"routing_qualityStrong": "Strong first hop",
|
|
"routing_qualityGood": "Good first hop",
|
|
"routing_qualityFair": "Fair first hop",
|
|
"routing_qualityWorked": "Has delivered",
|
|
"routing_qualityFlood": "Heard via flood",
|
|
"routing_qualityUntested": "Untested",
|
|
"routing_lastWorked": "worked {when}",
|
|
"@routing_lastWorked": {
|
|
"placeholders": {
|
|
"when": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"routing_neverWorked": "never confirmed",
|
|
"routing_deliveryCounts": "{successes} delivered, {failures} failed",
|
|
"@routing_deliveryCounts": {
|
|
"placeholders": {
|
|
"successes": {
|
|
"type": "int"
|
|
},
|
|
"failures": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
"routing_floodDelivery": "Flood delivery",
|
|
"pathEditor_title": "Build Path",
|
|
"pathEditor_hopCounter": "{count} of 64 hops",
|
|
"@pathEditor_hopCounter": {
|
|
"placeholders": {
|
|
"count": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
"pathEditor_noHops": "No hops yet. Tap repeaters below to add them in order, or save with no hops to send direct.",
|
|
"pathEditor_addHops": "Add hops in order",
|
|
"pathEditor_searchRepeaters": "Search repeaters",
|
|
"pathEditor_advancedHex": "Advanced: raw hex path",
|
|
"pathEditor_hexLabel": "Hex prefixes",
|
|
"pathEditor_hexHelper": "Two hex characters per hop, separated by commas",
|
|
"pathEditor_invalidTokens": "Invalid: {tokens}",
|
|
"@pathEditor_invalidTokens": {
|
|
"placeholders": {
|
|
"tokens": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"pathEditor_tooManyHops": "Maximum 64 hops",
|
|
"pathEditor_usePath": "Use this path",
|
|
"pathEditor_removeHop": "Remove hop",
|
|
"pathEditor_unknownHop": "Unknown repeater",
|
|
"chat_pathSavedLocally": "Saved locally. Connect to sync.",
|
|
"chat_pathDeviceConfirmed": "Device confirmed.",
|
|
"chat_pathDeviceNotConfirmed": "Device not confirmed yet.",
|
|
"chat_type": "Type",
|
|
"chat_path": "Path",
|
|
"chat_publicKey": "Public Key",
|
|
"chat_compressOutgoingMessages": "Compress outgoing messages",
|
|
"chat_floodForced": "Flood (forced)",
|
|
"chat_directForced": "Direct (forced)",
|
|
"chat_hopsForced": "{count} hops (forced)",
|
|
"@chat_hopsForced": {
|
|
"placeholders": {
|
|
"count": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
"chat_floodAuto": "Flood (auto)",
|
|
"chat_direct": "Direct",
|
|
"chat_poiShared": "POI Shared",
|
|
"chat_unread": "Unread: {count}",
|
|
"@chat_unread": {
|
|
"placeholders": {
|
|
"count": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
"chat_markAsUnread": "Mark as Unread",
|
|
"chat_newMessages": "New messages",
|
|
"chat_openLink": "Open Link?",
|
|
"chat_openLinkConfirmation": "Do you want to open this link in your browser?",
|
|
"chat_open": "Open",
|
|
"chat_couldNotOpenLink": "Could not open link: {url}",
|
|
"@chat_couldNotOpenLink": {
|
|
"placeholders": {
|
|
"url": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"chat_invalidLink": "Invalid link format",
|
|
"map_title": "Node Map",
|
|
"map_searchHint": "Search node name or ID",
|
|
"map_activity": "Activity",
|
|
"map_online": "Online",
|
|
"map_recent": "Recent",
|
|
"map_stale": "Stale",
|
|
"map_visible": "Visible",
|
|
"map_hidden": "Hidden",
|
|
"map_centerOnNode": "Center on node",
|
|
"map_details": "Details",
|
|
"map_noGps": "No GPS",
|
|
"map_noResults": "No matching nodes",
|
|
"map_lineOfSight": "Line of Sight",
|
|
"map_losScreenTitle": "Line of Sight",
|
|
"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"
|
|
}
|
|
}
|
|
},
|
|
"map_pinsCount": "Pins: {count}",
|
|
"@map_pinsCount": {
|
|
"placeholders": {
|
|
"count": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
"map_chat": "Chat",
|
|
"map_repeater": "Repeater",
|
|
"map_room": "Room",
|
|
"map_sensor": "Sensor",
|
|
"map_pinDm": "Pin (DM)",
|
|
"map_pinPrivate": "Pin (Private)",
|
|
"map_pinPublic": "Pin (Public)",
|
|
"map_lastSeen": "Last Seen",
|
|
"map_disconnectConfirm": "Are you sure you want to disconnect from this device?",
|
|
"map_from": "From",
|
|
"map_source": "Source",
|
|
"map_flags": "Flags",
|
|
"map_type": "Type",
|
|
"map_path": "Path",
|
|
"map_location": "Location",
|
|
"map_estLocation": "Est. Location",
|
|
"map_publicKey": "Public Key",
|
|
"map_publicKeyPrefixHint": "e.g. ab12",
|
|
"map_shareMarkerHere": "Share marker here",
|
|
"map_setAsMyLocation": "Set as my location",
|
|
"map_pinLabel": "Pin label",
|
|
"map_label": "Label",
|
|
"map_pointOfInterest": "Point of interest",
|
|
"map_sendToContact": "Send to contact",
|
|
"map_sendToChannel": "Send to channel",
|
|
"map_noChannelsAvailable": "No channels available",
|
|
"map_publicLocationShare": "Public location share",
|
|
"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"
|
|
}
|
|
}
|
|
},
|
|
"map_connectToShareMarkers": "Connect to a device to share markers",
|
|
"map_filterNodes": "Filter Nodes",
|
|
"map_nodeTypes": "Node Types",
|
|
"map_chatNodes": "Chat Nodes",
|
|
"map_repeaters": "Repeaters",
|
|
"map_otherNodes": "Other Nodes",
|
|
"map_showOverlaps": "Repeater Key Overlaps",
|
|
"map_keyPrefix": "Key Prefix",
|
|
"map_filterByKeyPrefix": "Filter by key prefix",
|
|
"map_publicKeyPrefix": "Public key prefix",
|
|
"map_markers": "Markers",
|
|
"map_showSharedMarkers": "Show shared markers",
|
|
"map_showGuessedLocations": "Show guessed node locations",
|
|
"map_showDiscoveryContacts": "Show Discovery Contacts",
|
|
"map_guessedLocation": "Guessed location",
|
|
"map_lastSeenTime": "Last Seen Time",
|
|
"map_sharedPin": "Shared pin",
|
|
"map_sharedAt": "Shared",
|
|
"map_joinRoom": "Join Room",
|
|
"map_manageRepeater": "Manage Repeater",
|
|
"map_tapToAdd": "Tap on nodes to add them to the path.",
|
|
"map_runTrace": "Run path trace",
|
|
"map_runTraceWithReturnPath": "Return back on the same path.",
|
|
"map_removeLast": "Remove Last",
|
|
"map_pathTraceCancelled": "Path trace cancelled.",
|
|
"mapCache_title": "Offline Map Cache",
|
|
"mapCache_selectAreaFirst": "Select an area to cache first",
|
|
"mapCache_noTilesToDownload": "No tiles to download for this area",
|
|
"mapCache_downloadTilesTitle": "Download tiles",
|
|
"mapCache_downloadTilesPrompt": "Download {count} tiles for offline use?",
|
|
"@mapCache_downloadTilesPrompt": {
|
|
"placeholders": {
|
|
"count": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
"mapCache_downloadAction": "Download",
|
|
"mapCache_cachedTiles": "Cached {count} tiles",
|
|
"@mapCache_cachedTiles": {
|
|
"placeholders": {
|
|
"count": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
"mapCache_cachedTilesWithFailed": "Cached {downloaded} tiles ({failed} failed)",
|
|
"@mapCache_cachedTilesWithFailed": {
|
|
"placeholders": {
|
|
"downloaded": {
|
|
"type": "int"
|
|
},
|
|
"failed": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
"mapCache_clearOfflineCacheTitle": "Clear offline cache",
|
|
"mapCache_clearOfflineCachePrompt": "Remove all cached map tiles?",
|
|
"mapCache_offlineCacheCleared": "Offline cache cleared",
|
|
"mapCache_noAreaSelected": "No area selected",
|
|
"mapCache_cacheArea": "Cache Area",
|
|
"mapCache_useCurrentView": "Use Current View",
|
|
"mapCache_zoomRange": "Zoom Range",
|
|
"mapCache_estimatedTiles": "Estimated tiles: {count}",
|
|
"@mapCache_estimatedTiles": {
|
|
"placeholders": {
|
|
"count": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
"mapCache_downloadedTiles": "Downloaded {completed} / {total}",
|
|
"@mapCache_downloadedTiles": {
|
|
"placeholders": {
|
|
"completed": {
|
|
"type": "int"
|
|
},
|
|
"total": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
"mapCache_downloadTilesButton": "Download Tiles",
|
|
"mapCache_clearCacheButton": "Clear Cache",
|
|
"mapCache_failedDownloads": "Failed downloads: {count}",
|
|
"@mapCache_failedDownloads": {
|
|
"placeholders": {
|
|
"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"
|
|
}
|
|
}
|
|
},
|
|
"time_justNow": "Just now",
|
|
"time_minutesAgo": "{minutes}m ago",
|
|
"@time_minutesAgo": {
|
|
"placeholders": {
|
|
"minutes": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
"time_hoursAgo": "{hours}h ago",
|
|
"@time_hoursAgo": {
|
|
"placeholders": {
|
|
"hours": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
"time_daysAgo": "{days}d ago",
|
|
"@time_daysAgo": {
|
|
"placeholders": {
|
|
"days": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
"time_hour": "hour",
|
|
"time_hours": "hours",
|
|
"time_day": "day",
|
|
"time_days": "days",
|
|
"time_week": "week",
|
|
"time_weeks": "weeks",
|
|
"time_month": "month",
|
|
"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",
|
|
"login_enterPassword": "Enter password",
|
|
"login_savePassword": "Save password",
|
|
"login_savePasswordSubtitle": "Password will be stored securely on this device",
|
|
"login_repeaterDescription": "Enter the repeater password for guest or admin access.",
|
|
"login_roomDescription": "Enter the room password for guest or admin access.",
|
|
"login_routing": "Routing",
|
|
"login_routingMode": "Routing mode",
|
|
"login_autoUseSavedPath": "Auto (use saved path)",
|
|
"login_forceFloodMode": "Force Flood Mode",
|
|
"login_managePaths": "Manage Paths",
|
|
"login_login": "Login",
|
|
"login_attempt": "Attempt {current}/{max}",
|
|
"@login_attempt": {
|
|
"placeholders": {
|
|
"current": {
|
|
"type": "int"
|
|
},
|
|
"max": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
"login_failed": "Login failed: {error}",
|
|
"@login_failed": {
|
|
"placeholders": {
|
|
"error": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"login_failedMessage": "Login failed. Either the password is incorrect or the repeater is unreachable.",
|
|
"common_reload": "Reload",
|
|
"common_clear": "Clear",
|
|
"path_currentPathLabel": "Current path",
|
|
"path_noRepeatersFound": "No repeaters or room servers found.",
|
|
"repeater_management": "Repeater Management",
|
|
"room_management": "Room Server Management",
|
|
"repeater_guest": "Repeater Information",
|
|
"room_guest": "Room Server Information",
|
|
"repeater_managementTools": "Management Tools",
|
|
"repeater_guestTools": "Guest Tools",
|
|
"repeater_status": "Status",
|
|
"repeater_statusSubtitle": "View repeater status, stats, and neighbors",
|
|
"repeater_telemetry": "Telemetry",
|
|
"repeater_telemetrySubtitle": "View telemetry of sensors and system stats",
|
|
"repeater_cli": "CLI",
|
|
"repeater_cliSubtitle": "Send commands to the repeater",
|
|
"repeater_neighbors": "Neighbors",
|
|
"repeater_neighborsSubtitle": "View zero hop neighbors.",
|
|
"repeater_settings": "Settings",
|
|
"repeater_settingsSubtitle": "Configure repeater parameters",
|
|
"repeater_clockSyncAfterLogin": "Clock sync after login",
|
|
"@repeater_clockSyncAfterLogin": {
|
|
"description": "Repeater setting: auto sync device clock after successful login"
|
|
},
|
|
"repeater_clockSyncAfterLoginSubtitle": "Automatically send \"clock sync\" after a successful login",
|
|
"@repeater_clockSyncAfterLoginSubtitle": {
|
|
"description": "Repeater setting subtitle: describes the clock sync after login behavior"
|
|
},
|
|
"repeater_statusTitle": "Repeater Status",
|
|
"repeater_routingMode": "Routing mode",
|
|
"repeater_refresh": "Refresh",
|
|
"repeater_statusRequestTimeout": "Status request timed out.",
|
|
"repeater_errorLoadingStatus": "Error loading status: {error}",
|
|
"@repeater_errorLoadingStatus": {
|
|
"placeholders": {
|
|
"error": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"repeater_systemInformation": "System Information",
|
|
"repeater_battery": "Battery",
|
|
"repeater_clockAtLogin": "Clock (at login)",
|
|
"repeater_uptime": "Uptime",
|
|
"repeater_queueLength": "Queue Length",
|
|
"repeater_debugFlags": "Debug Flags",
|
|
"repeater_radioStatistics": "Radio Statistics",
|
|
"repeater_lastRssi": "Last RSSI",
|
|
"repeater_lastSnr": "Last SNR",
|
|
"repeater_noiseFloor": "Noise Floor",
|
|
"repeater_txAirtime": "TX Airtime",
|
|
"repeater_rxAirtime": "RX Airtime",
|
|
"repeater_chanUtil": "Channel Utilization",
|
|
"repeater_packetStatistics": "Packet Statistics",
|
|
"repeater_sent": "Sent",
|
|
"repeater_received": "Received",
|
|
"repeater_duplicates": "Duplicates",
|
|
"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"
|
|
}
|
|
}
|
|
},
|
|
"repeater_packetTxTotal": "Total: {total}, Flood: {flood}, Direct: {direct}",
|
|
"@repeater_packetTxTotal": {
|
|
"placeholders": {
|
|
"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"
|
|
}
|
|
}
|
|
},
|
|
"repeater_duplicatesFloodDirect": "Flood: {flood}, Direct: {direct}",
|
|
"@repeater_duplicatesFloodDirect": {
|
|
"placeholders": {
|
|
"flood": {
|
|
"type": "String"
|
|
},
|
|
"direct": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"repeater_duplicatesTotal": "Total: {total}",
|
|
"@repeater_duplicatesTotal": {
|
|
"placeholders": {
|
|
"total": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
"repeater_settingsTitle": "Repeater Settings",
|
|
"repeater_basicSettings": "Basic Settings",
|
|
"repeater_repeaterName": "Repeater Name",
|
|
"repeater_repeaterNameHelper": "Display name for this repeater",
|
|
"repeater_adminPassword": "Admin Password",
|
|
"repeater_adminPasswordHelper": "Full access password",
|
|
"repeater_guestPassword": "Guest Password",
|
|
"repeater_guestPasswordHelper": "Read-only access password",
|
|
"repeater_radioSettings": "Radio Settings",
|
|
"repeater_frequencyMhz": "Frequency (MHz)",
|
|
"repeater_frequencyHelper": "300-2500 MHz",
|
|
"repeater_txPower": "TX Power",
|
|
"repeater_txPowerHelper": "1-30 dBm",
|
|
"repeater_bandwidth": "Bandwidth",
|
|
"repeater_spreadingFactor": "Spreading Factor",
|
|
"repeater_codingRate": "Coding Rate",
|
|
"repeater_locationSettings": "Location Settings",
|
|
"repeater_latitude": "Latitude",
|
|
"repeater_latitudeHelper": "Decimal degrees (e.g., 37.7749)",
|
|
"repeater_longitude": "Longitude",
|
|
"repeater_longitudeHelper": "Decimal degrees (e.g., -122.4194)",
|
|
"repeater_features": "Features",
|
|
"repeater_packetForwarding": "Packet Forwarding",
|
|
"repeater_packetForwardingSubtitle": "Enable repeater to forward packets",
|
|
"repeater_guestAccess": "Guest Access",
|
|
"repeater_guestAccessSubtitle": "Allow read-only guest access",
|
|
"repeater_privacyMode": "Privacy Mode",
|
|
"repeater_privacyModeSubtitle": "Hide name/location in advertisements",
|
|
"repeater_advertisementSettings": "Advertisement Settings",
|
|
"repeater_localAdvertInterval": "Local Advertisement Interval",
|
|
"repeater_localAdvertIntervalMinutes": "{minutes} minutes",
|
|
"@repeater_localAdvertIntervalMinutes": {
|
|
"placeholders": {
|
|
"minutes": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
"repeater_floodAdvertInterval": "Flood Advertisement Interval",
|
|
"repeater_floodAdvertIntervalHours": "{hours} hours",
|
|
"@repeater_floodAdvertIntervalHours": {
|
|
"placeholders": {
|
|
"hours": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
"repeater_encryptedAdvertInterval": "Encrypted Advertisement Interval",
|
|
"repeater_dangerZone": "Danger Zone",
|
|
"repeater_rebootRepeater": "Reboot Repeater",
|
|
"repeater_rebootRepeaterSubtitle": "Restart the repeater device",
|
|
"repeater_rebootRepeaterConfirm": "Are you sure you want to reboot this repeater?",
|
|
"repeater_regenerateIdentityKey": "Regenerate Identity Key",
|
|
"repeater_regenerateIdentityKeySubtitle": "Generate new public/private key pair",
|
|
"repeater_regenerateIdentityKeyConfirm": "This will generate a new identity for the repeater. Continue?",
|
|
"repeater_eraseFileSystem": "Erase File System",
|
|
"repeater_eraseFileSystemSubtitle": "Format the repeater file system",
|
|
"repeater_eraseFileSystemConfirm": "WARNING: This will erase all data on the repeater. This cannot be undone!",
|
|
"repeater_eraseSerialOnly": "Erase is only available over serial console.",
|
|
"repeater_commandSent": "Command sent: {command}",
|
|
"@repeater_commandSent": {
|
|
"placeholders": {
|
|
"command": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"repeater_errorSendingCommand": "Error sending command: {error}",
|
|
"@repeater_errorSendingCommand": {
|
|
"placeholders": {
|
|
"error": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"repeater_confirm": "Confirm",
|
|
"repeater_settingsSaved": "Settings saved successfully",
|
|
"repeater_rxGain": "Boosted RX gain",
|
|
"repeater_rxGainHelper": "Higher sensitivity, more current draw (SX1262/SX1268 only)",
|
|
"repeater_refreshRxGain": "Refresh boosted RX gain",
|
|
"repeater_multiAcks": "Multi-ACKs",
|
|
"repeater_multiAcksSubtitle": "Acknowledge messages over multiple paths for better delivery",
|
|
"repeater_refreshMultiAcks": "Refresh multi-ACKs",
|
|
"repeater_networkHealth": "Network health",
|
|
"repeater_loopDetect": "Loop detection",
|
|
"repeater_loopDetectHelper": "Drop flood packets that look like routing loops",
|
|
"repeater_loopDetectOff": "Off",
|
|
"repeater_loopDetectMinimal": "Minimal",
|
|
"repeater_loopDetectModerate": "Moderate",
|
|
"repeater_loopDetectStrict": "Strict",
|
|
"repeater_dutyCycle": "Duty cycle",
|
|
"repeater_dutyCycleHelper": "Maximum percentage of airtime",
|
|
"repeater_dutyCyclePercent": "{percent}%",
|
|
"@repeater_dutyCyclePercent": {
|
|
"placeholders": {
|
|
"percent": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
"repeater_ownerInfo": "Operator info",
|
|
"repeater_ownerInfoHelper": "Public metadata for this repeater",
|
|
"repeater_refreshOwnerInfo": "Refresh operator info",
|
|
"repeater_floodMax": "Flood max hops",
|
|
"repeater_floodMaxHelper": "Maximum hops a flood packet may travel (0-64)",
|
|
"repeater_advancedSettings": "Advanced",
|
|
"repeater_advancedSettingsSubtitle": "Tuning knobs for experienced operators",
|
|
"repeater_pathHashMode": "Path hash mode",
|
|
"repeater_pathHashModeHelper": "Bytes used to encode this repeater's ID in flood path/loop-detect tags. 0=1 byte (256 IDs, up to 64 hops), 1=2 bytes (65K IDs, up to 32 hops), 2=3 bytes (16M IDs, up to 21 hops). v1.13 and older firmware drops multi-byte paths — only raise once your network is on v1.14+.",
|
|
"repeater_keySettings": "Change Identity Keys",
|
|
"repeater_keySettingsSubtitle": "Change the public/private keypair",
|
|
"repeater_prvKey": "Private key",
|
|
"repeater_prvKeyHelper": "A new private key for the repeater, a 128-character hex string.",
|
|
"repeater_generatePrvKey": "Generate a random keypair",
|
|
"repeater_stopGeneratingPrvKey": "Interrupt search for keypair",
|
|
"repeater_pubKey": "Public key",
|
|
"repeater_pubKeyHelper": "This is the public key that goes with the generated private key. You can't set this directly.",
|
|
"repeater_pubKeyPrefix": "Desired prefix",
|
|
"repeater_pubKeyPrefixHelper": "Find a public key that starts with these hex digits. Expected tries needed: {tries}.",
|
|
"@repeater_pubKeyPrefixHelper": {
|
|
"placeholders": {
|
|
"tries": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
|
|
|
|
|
|
"repeater_txDelay": "Flood TX delay",
|
|
"repeater_txDelayHelper": "Retransmit spacing for flood traffic, as a multiplier of the packet's airtime (0-2, default 0.5). Higher = fewer collisions but slower delivery.",
|
|
"repeater_directTxDelay": "Direct TX delay",
|
|
"repeater_directTxDelayHelper": "Retransmit spacing for direct (non-flood) traffic, as a multiplier of the packet's airtime (0-2, default 0.3).",
|
|
"repeater_intThresh": "Interference threshold",
|
|
"repeater_intThreshHelper": "Threshold passed to the radio's noise-floor calibration so it rejects interference above this level. 0 disables — only raise if you see RX errors in a noisy band.",
|
|
"repeater_agcResetInterval": "AGC reset interval",
|
|
"repeater_agcResetIntervalHelper": "How often to reset the radio's automatic gain control to recover from a stuck gain state. Seconds, snapped down to a multiple of 4. 0 disables periodic resets.",
|
|
"repeater_actionsTitle": "Actions",
|
|
"repeater_sendAdvert": "Send flood advert",
|
|
"repeater_sendAdvertSubtitle": "Broadcast a flood advert through the network",
|
|
"repeater_sendAdvertZeroHop": "Send zero-hop advert",
|
|
"repeater_sendAdvertZeroHopSubtitle": "Broadcast a one-hop advert (no relays)",
|
|
"repeater_clockSync": "Sync clock now",
|
|
"repeater_clockSyncSubtitle": "Push your phone's time to the repeater",
|
|
"repeater_actionSucceeded": "{action} succeeded",
|
|
"@repeater_actionSucceeded": {
|
|
"placeholders": {
|
|
"action": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"repeater_actionFailed": "{action} failed: {error}",
|
|
"@repeater_actionFailed": {
|
|
"placeholders": {
|
|
"action": {
|
|
"type": "String"
|
|
},
|
|
"error": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"repeater_settingsSavedRebootNeeded": "Settings saved — reboot the repeater to apply",
|
|
"repeater_settingsPartialFailure": "Some settings failed: {failures}",
|
|
"@repeater_settingsPartialFailure": {
|
|
"placeholders": {
|
|
"failures": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"repeater_errorSavingSettings": "Error saving settings: {error}",
|
|
"@repeater_errorSavingSettings": {
|
|
"placeholders": {
|
|
"error": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"repeater_refreshBasicSettings": "Refresh Basic Settings",
|
|
"repeater_refreshRadioSettings": "Refresh Radio Settings",
|
|
"repeater_refreshTxPower": "Refresh TX power",
|
|
"repeater_refreshPacketForwarding": "Refresh Packet Forwarding",
|
|
"repeater_refreshGuestAccess": "Refresh Guest Access",
|
|
"repeater_refreshPrivacyMode": "Refresh Privacy Mode",
|
|
"repeater_refreshed": "{label} refreshed",
|
|
"@repeater_refreshed": {
|
|
"placeholders": {
|
|
"label": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"repeater_errorRefreshing": "Error refreshing {label}",
|
|
"@repeater_errorRefreshing": {
|
|
"placeholders": {
|
|
"label": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"repeater_cliTitle": "Repeater CLI",
|
|
"repeater_debugNextCommand": "Debug Next Command",
|
|
"repeater_commandHelp": "Command Help",
|
|
"repeater_clearHistory": "Clear History",
|
|
"repeater_noCommandsSent": "No commands sent yet",
|
|
"repeater_typeCommandOrUseQuick": "Type a command below or use quick commands",
|
|
"repeater_enterCommandHint": "Enter command...",
|
|
"repeater_previousCommand": "Previous command",
|
|
"repeater_nextCommand": "Next command",
|
|
"repeater_enterCommandFirst": "Enter a command first",
|
|
"repeater_cliCommandFrameTitle": "CLI Command Frame",
|
|
"repeater_cliCommandError": "Error: {error}",
|
|
"@repeater_cliCommandError": {
|
|
"placeholders": {
|
|
"error": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"repeater_cliQuickGetName": "Get Name",
|
|
"repeater_cliQuickGetRadio": "Get Radio",
|
|
"repeater_cliQuickGetTx": "Get TX",
|
|
"repeater_cliQuickNeighbors": "Neighbors",
|
|
"repeater_cliQuickVersion": "Version",
|
|
"repeater_cliQuickAdvertise": "Advertise",
|
|
"repeater_cliQuickClock": "Clock",
|
|
"repeater_cliQuickClockSync": "Clock Sync",
|
|
"repeater_cliQuickDiscovery": "Discover Neighbors",
|
|
"repeater_cliHelpAdvert": "Sends an advertisement packet",
|
|
"repeater_cliHelpReboot": "Reboots the device. (note, you'll prob get 'Timeout' which is normal)",
|
|
"repeater_cliHelpClock": "Displays current time per device's clock.",
|
|
"repeater_cliHelpPassword": "Sets a new admin password for the device.",
|
|
"repeater_cliHelpVersion": "Shows the device version and firmware build date.",
|
|
"repeater_cliHelpClearStats": "Resets various stats counters to zero.",
|
|
"repeater_cliHelpSetAf": "Sets the air-time-factor.",
|
|
"repeater_cliHelpSetTx": "Sets LoRa transmit power in dBm. (reboot to apply)",
|
|
"repeater_cliHelpSetRepeat": "Enables or disables the repeater role for this node.",
|
|
"repeater_cliHelpSetAllowReadOnly": "(Room server) If 'on', then login in blank password will be allowed, but cannot Post to room. (just read only)",
|
|
"repeater_cliHelpSetFloodMax": "Sets the maximum number of hops of inbound flood packet (if >= max, packet is not forwarded)",
|
|
"repeater_cliHelpSetIntThresh": "Sets the Interference Threshold (in DB). Default is 14. Set to 0 to disable channel interference detection.",
|
|
"repeater_cliHelpSetAgcResetInterval": "Sets the interval to reset the Auto Gain Controller. Set to 0 to disable.",
|
|
"repeater_cliHelpSetMultiAcks": "Enables or disables the 'double ACKs' feature.",
|
|
"repeater_cliHelpSetAdvertInterval": "Sets the timer interval in minutes to send a local (zero-hop) advertisement packet. Set to 0 to disable.",
|
|
"repeater_cliHelpSetFloodAdvertInterval": "Sets the timer interval in hours to send a flood advertisement packet. Set to 0 to disable.",
|
|
"repeater_cliHelpSetGuestPassword": "Sets/updates the guest password. (for repeaters, guest logins can send the \"Get Stats\" request)",
|
|
"repeater_cliHelpSetName": "Sets the advertisement name.",
|
|
"repeater_cliHelpSetLat": "Sets the advertisement map latitude. (decimal degrees)",
|
|
"repeater_cliHelpSetLon": "Sets the advertisement map longitude. (decimal degrees)",
|
|
"repeater_cliHelpSetRadio": "Sets completely new radio params, and saves to preferences. Requires a \"reboot\" command to apply.",
|
|
"repeater_cliHelpSetRxDelay": "Sets (experimental) base (must be > 1 for effect) for applying slight delay to received packets, based on signal strength/score. Set to 0 to disable.",
|
|
"repeater_cliHelpSetTxDelay": "Sets a factor multiplied with time-on-air for a flood-mode packet and with a randomized slot system, to delay its forwarding. (to decrease likelihood of collisions)",
|
|
"repeater_cliHelpSetDirectTxDelay": "Same as txdelay, but for applying a random delay to the forwarding of direct-mode packets.",
|
|
"repeater_cliHelpSetBridgeEnabled": "Enable/Disable bridge.",
|
|
"repeater_cliHelpSetBridgeDelay": "Set delay before retransmitting packets.",
|
|
"repeater_cliHelpSetBridgeSource": "Choose wether the bridge will retransmit received packets or transmitted packets.",
|
|
"repeater_cliHelpSetBridgeBaud": "Set serial link baudrate for rs232 bridges.",
|
|
"repeater_cliHelpSetBridgeSecret": "Set bridge secret for espnow bridges.",
|
|
"repeater_cliHelpSetAdcMultiplier": "Sets custom factor to adjust reported battery voltage (only supported on select boards).",
|
|
"repeater_cliHelpTempRadio": "Sets temporary radio params for the given number of minutes, reverting to original radio params afterward. (does NOT save to preferences).",
|
|
"repeater_cliHelpSetPerm": "Modifies the ACL. Removes matching entry (by pubkey prefix) if \"permissions\" is zero. Adds new entry if pubkey-hex is full length and is not currently in ACL. Updates entry by matching pubkey prefix. Permission bits vary per firmware role, but low 2 bits are: 0 (Guest), 1 (Read only), 2 (Read write), 3 (Admin)",
|
|
"repeater_cliHelpGetBridgeType": "Gets bridge type none, rs232, espnow",
|
|
"repeater_cliHelpLogStart": "Starts packet logging to file system.",
|
|
"repeater_cliHelpLogStop": "Stops packet logging to file system.",
|
|
"repeater_cliHelpLogErase": "Erases the packet logs from file system.",
|
|
"repeater_cliHelpNeighbors": "Shows a list of other repeater nodes heard via zero-hop adverts. Each line is id-prefix-hex:timestamp:snr-times-4",
|
|
"repeater_cliHelpNeighborRemove": "Removes first matching entry (by pubkey prefix (hex)), from neighbors list.",
|
|
"repeater_cliHelpRegion": "(serial only) Lists all defined regions and current flood permissions.",
|
|
"repeater_cliHelpRegionLoad": "NOTE: this is a special multi-command invocation. Each subsequent command is a region name (indented with spaces to indicate parent hierarchy, with one space at minimum). Terminated by sending a blank line/command.",
|
|
"repeater_cliHelpRegionGet": "Searches for region with given name prefix (or \"*\" for the global scope). Replies with \"-> region-name (parent-name) 'F'\"",
|
|
"repeater_cliHelpRegionPut": "Adds or updates a region definition with given name.",
|
|
"repeater_cliHelpRegionRemove": "Removes a region definition with given name. (must match exactly, and have no child regions)",
|
|
"repeater_cliHelpRegionAllowf": "Sets the 'F'lood permission for the given region. ('*' for the global/legacy scope)",
|
|
"repeater_cliHelpRegionDenyf": "Removes the 'F'lood permission for the given region. (NOTE: at this stage NOT advised to use this on the global/legacy scope!!)",
|
|
"repeater_cliHelpRegionHome": "Replies with the current 'home' region. (Note applied anywhere yet, reserved for future)",
|
|
"repeater_cliHelpRegionHomeSet": "Sets the 'home' region.",
|
|
"repeater_cliHelpRegionSave": "Persists the region list/map to storage.",
|
|
"repeater_cliHelpGps": "Gives status of gps. When gps is off, it replies only off, if on it replies with on, status, fix, sat count",
|
|
"repeater_cliHelpGpsOnOff": "Toggles gps power state.",
|
|
"repeater_cliHelpGpsSync": "Syncs node time with gps clock.",
|
|
"repeater_cliHelpGpsSetLoc": "Sets node's position to gps coordinates and save preferences.",
|
|
"repeater_cliHelpGpsAdvert": "Gives location advert configuration of the node:\n- none: don't include location in adverts\n- share: share gps location (from SensorManager)\n- prefs: advert the location stored in preferences",
|
|
"repeater_cliHelpGpsAdvertSet": "Sets location advert configuration.",
|
|
"repeater_commandsListTitle": "Commands List",
|
|
"repeater_commandsListNote": "NOTE: for the various \"set ...\" commands, there is also a \"get ...\" command.",
|
|
"repeater_general": "General",
|
|
"repeater_settingsCategory": "Settings",
|
|
"repeater_bridge": "Bridge",
|
|
"repeater_logging": "Logging",
|
|
"repeater_neighborsRepeaterOnly": "Neighbors (Repeater only)",
|
|
"repeater_regionManagementRepeaterOnly": "Region Management (Repeater only)",
|
|
"repeater_regionNote": "Region commands have been introduced to manage region definitions and permissions.",
|
|
"repeater_gpsManagement": "GPS Management",
|
|
"repeater_gpsNote": "gps command has been introduced to manage location related topics.",
|
|
"repeater_getCategory": "Get Values",
|
|
"repeater_powerMgmt": "Power Management",
|
|
"repeater_sensors": "Sensors",
|
|
"repeater_cliHelpPowerOff": "Powers the device off. (no response expected)",
|
|
"repeater_cliHelpClkReboot": "Resets the clock to a known epoch and reboots the device.",
|
|
"repeater_cliHelpAdvertZeroHop": "Sends a zero-hop advertisement (immediate neighbors only).",
|
|
"repeater_cliHelpStartOta": "Starts an over-the-air firmware update on supported boards.",
|
|
"repeater_cliHelpTime": "Sets the device clock to the given Unix epoch seconds. Clock cannot move backwards.",
|
|
"repeater_cliHelpBoard": "Shows the board manufacturer / hardware identifier.",
|
|
"repeater_cliHelpDiscoverNeighbors": "Sends a node-discovery request to nearby neighbors. (Repeater only)",
|
|
"repeater_cliHelpPowersaving": "Shows whether powersaving mode is on or off.",
|
|
"repeater_cliHelpPowersavingOnOff": "Enables or disables powersaving mode (where supported).",
|
|
"repeater_cliHelpErase": "(Serial only) Formats the device file system. Wipes all settings and contacts.",
|
|
"repeater_cliHelpSetDutyCycle": "Sets the maximum allowed transmit duty cycle as a percentage (1-100). Internally adjusts the airtime factor.",
|
|
"repeater_cliHelpSetPrvKey": "Replaces the device identity private key. Reboot required to apply. Generates a new public key.",
|
|
"repeater_cliHelpSetRadioRxGain": "(SX126x only) Toggles boosted RX gain for improved sensitivity at higher current draw.",
|
|
"repeater_cliHelpSetOwnerInfo": "Sets the owner contact info string included in adverts. Use '|' for newlines.",
|
|
"repeater_cliHelpSetPathHashMode": "Sets the path-hash mode. 0 = legacy, 1 = standard, 2 = strict. Affects how routing paths are matched.",
|
|
"repeater_cliHelpSetLoopDetect": "Sets the routing loop-detection sensitivity: off, minimal, moderate, or strict.",
|
|
"repeater_cliHelpSetFreq": "(Serial only) Quickly sets just the frequency. Reboot required. Prefer \"set radio\" for full radio params.",
|
|
"repeater_cliHelpSetBridgeChannel": "(ESPNow bridge only) Sets the WiFi channel (1-14) used by the bridge.",
|
|
"repeater_cliHelpGetName": "Shows the configured node name.",
|
|
"repeater_cliHelpGetRole": "Shows the firmware role (Repeater, Room Server, etc.).",
|
|
"repeater_cliHelpGetPublicKey": "Shows the device public key.",
|
|
"repeater_cliHelpGetPrvKey": "(Serial only) Shows the device private key. Treat as a secret.",
|
|
"repeater_cliHelpGetRepeat": "Shows whether packet forwarding (repeater role) is on or off.",
|
|
"repeater_cliHelpGetTx": "Shows the current TX power in dBm.",
|
|
"repeater_cliHelpGetFreq": "Shows the configured radio frequency in MHz.",
|
|
"repeater_cliHelpGetRadio": "Shows full radio params: freq, bandwidth, spreading factor, coding rate.",
|
|
"repeater_cliHelpGetRadioRxGain": "(SX126x only) Shows the RX boosted gain state.",
|
|
"repeater_cliHelpGetAf": "Shows the current airtime factor.",
|
|
"repeater_cliHelpGetDutyCycle": "Shows the current allowed duty cycle as a percentage.",
|
|
"repeater_cliHelpGetIntThresh": "Shows the channel interference threshold in dB.",
|
|
"repeater_cliHelpGetAgcResetInterval": "Shows the AGC reset interval in seconds.",
|
|
"repeater_cliHelpGetMultiAcks": "Shows whether double-ACK mode is on (1) or off (0).",
|
|
"repeater_cliHelpGetAllowReadOnly": "Shows whether guest read-only access is allowed.",
|
|
"repeater_cliHelpGetAdvertInterval": "Shows the local advertisement interval in minutes.",
|
|
"repeater_cliHelpGetFloodAdvertInterval": "Shows the flood advertisement interval in hours.",
|
|
"repeater_cliHelpGetGuestPassword": "Shows the configured guest password.",
|
|
"repeater_cliHelpGetLat": "Shows the configured latitude.",
|
|
"repeater_cliHelpGetLon": "Shows the configured longitude.",
|
|
"repeater_cliHelpGetRxDelay": "Shows the rxdelay base value.",
|
|
"repeater_cliHelpGetTxDelay": "Shows the flood-mode txdelay factor.",
|
|
"repeater_cliHelpGetDirectTxDelay": "Shows the direct-mode txdelay factor.",
|
|
"repeater_cliHelpGetFloodMax": "Shows the maximum flood hop count.",
|
|
"repeater_cliHelpGetOwnerInfo": "Shows the owner contact info string.",
|
|
"repeater_cliHelpGetPathHashMode": "Shows the path-hash mode (0/1/2).",
|
|
"repeater_cliHelpGetLoopDetect": "Shows the loop-detection sensitivity.",
|
|
"repeater_cliHelpGetAcl": "(Serial only) Lists the access-control entries on a repeater.",
|
|
"repeater_cliHelpGetBridgeEnabled": "Shows whether the bridge is enabled.",
|
|
"repeater_cliHelpGetBridgeDelay": "Shows the bridge delay in ms.",
|
|
"repeater_cliHelpGetBridgeSource": "Shows whether the bridge logs RX or TX packets.",
|
|
"repeater_cliHelpGetBridgeBaud": "(RS232 bridge only) Shows the bridge baud rate.",
|
|
"repeater_cliHelpGetBridgeChannel": "(ESPNow bridge only) Shows the bridge WiFi channel.",
|
|
"repeater_cliHelpGetBridgeSecret": "(ESPNow bridge only) Shows the bridge shared secret.",
|
|
"repeater_cliHelpGetBootloaderVer": "(NRF52 only) Shows the bootloader version.",
|
|
"repeater_cliHelpGetAdcMultiplier": "Shows the ADC multiplier (battery-voltage scaling).",
|
|
"repeater_cliHelpGetPwrMgtSupport": "Reports whether the board has power-management support.",
|
|
"repeater_cliHelpGetPwrMgtSource": "Shows the current power source: external or battery.",
|
|
"repeater_cliHelpGetPwrMgtBootReason": "Shows the most recent reset and shutdown reasons.",
|
|
"repeater_cliHelpGetPwrMgtBootMv": "Shows the boot-time battery voltage in mV.",
|
|
"repeater_cliHelpSensorGet": "Reads a custom sensor setting by key.",
|
|
"repeater_cliHelpSensorSet": "Writes a custom sensor setting.",
|
|
"repeater_cliHelpSensorList": "Lists all custom sensor settings, paginated from optional start index.",
|
|
"repeater_cliHelpRegionDefault": "Shows the current default region scope.",
|
|
"repeater_cliHelpRegionDefaultSet": "Sets the default region scope. Use \"<null>\" to clear.",
|
|
"repeater_cliHelpRegionListAllowed": "Lists regions that allow flood traffic.",
|
|
"repeater_cliHelpRegionListDenied": "Lists regions that deny flood traffic.",
|
|
"repeater_cliHelpStatsPackets": "(Serial only) Shows packet-level statistics.",
|
|
"repeater_cliHelpStatsRadio": "(Serial only) Shows radio statistics.",
|
|
"repeater_cliHelpStatsCore": "(Serial only) Shows core firmware statistics.",
|
|
"telemetry_receivedData": "Received Telemetry Data",
|
|
"telemetry_requestTimeout": "Telemetry request timed out.",
|
|
"telemetry_errorLoading": "Error loading telemetry: {error}",
|
|
"@telemetry_errorLoading": {
|
|
"placeholders": {
|
|
"error": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"telemetry_noData": "No telemetry data available.",
|
|
"telemetry_channelTitle": "Channel {channel}",
|
|
"@telemetry_channelTitle": {
|
|
"placeholders": {
|
|
"channel": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
"telemetry_batteryLabel": "Battery",
|
|
"telemetry_voltageLabel": "Voltage",
|
|
"telemetry_mcuTemperatureLabel": "MCU Temperature",
|
|
"telemetry_temperatureLabel": "Temperature",
|
|
"telemetry_currentLabel": "Current",
|
|
"telemetry_batteryValue": "{percent}% / {volts}V",
|
|
"@telemetry_batteryValue": {
|
|
"placeholders": {
|
|
"percent": {
|
|
"type": "int"
|
|
},
|
|
"volts": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"telemetry_voltageValue": "{volts}V",
|
|
"@telemetry_voltageValue": {
|
|
"placeholders": {
|
|
"volts": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"telemetry_currentValue": "{amps}A",
|
|
"@telemetry_currentValue": {
|
|
"placeholders": {
|
|
"amps": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"telemetry_temperatureValue": "{celsius}°C / {fahrenheit}°F",
|
|
"@telemetry_temperatureValue": {
|
|
"placeholders": {
|
|
"celsius": {
|
|
"type": "String"
|
|
},
|
|
"fahrenheit": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"telemetry_digitalInputLabel": "Digital Input",
|
|
"telemetry_digitalOutputLabel": "Digital Output",
|
|
"telemetry_analogInputLabel": "Analog Input",
|
|
"telemetry_analogOutputLabel": "Analog Output",
|
|
"telemetry_genericLabel": "Generic Sensor",
|
|
"telemetry_luminosityLabel": "Luminosity",
|
|
"telemetry_presenceLabel": "Presence",
|
|
"telemetry_humidityLabel": "Humidity",
|
|
"telemetry_accelerometerLabel": "Accelerometer",
|
|
"telemetry_pressureLabel": "Pressure",
|
|
"telemetry_altitudeLabel": "Altitude",
|
|
"telemetry_frequencyLabel": "Frequency",
|
|
"telemetry_percentageLabel": "Percentage",
|
|
"telemetry_concentrationLabel": "Concentration",
|
|
"telemetry_powerLabel": "Power",
|
|
"telemetry_distanceLabel": "Distance",
|
|
"telemetry_energyLabel": "Energy",
|
|
"telemetry_directionLabel": "Direction",
|
|
"telemetry_timeLabel": "Time",
|
|
"telemetry_gyrometerLabel": "Gyrometer",
|
|
"telemetry_colourLabel": "Colour",
|
|
"telemetry_gpsLabel": "GPS",
|
|
"telemetry_switchLabel": "Switch",
|
|
"telemetry_polylineLabel": "Polyline",
|
|
"telemetry_altitudeValue": "{meters} m",
|
|
"@telemetry_altitudeValue": {
|
|
"placeholders": {
|
|
"meters": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"telemetry_frequencyValue": "{hertz} Hz",
|
|
"@telemetry_frequencyValue": {
|
|
"placeholders": {
|
|
"hertz": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"telemetry_pressureValue": "{hpa} hPa",
|
|
"@telemetry_pressureValue": {
|
|
"placeholders": {
|
|
"hpa": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"telemetry_luminosityValue": "{lux} lx",
|
|
"@telemetry_luminosityValue": {
|
|
"placeholders": {
|
|
"lux": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"telemetry_powerValue": "{watts} W",
|
|
"@telemetry_powerValue": {
|
|
"placeholders": {
|
|
"watts": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"telemetry_distanceValue": "{meters} m",
|
|
"@telemetry_distanceValue": {
|
|
"placeholders": {
|
|
"meters": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"telemetry_energyValue": "{kilowattHours} kWh",
|
|
"@telemetry_energyValue": {
|
|
"placeholders": {
|
|
"kilowattHours": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"telemetry_directionValue": "{degrees}°",
|
|
"@telemetry_directionValue": {
|
|
"placeholders": {
|
|
"degrees": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"telemetry_concentrationValue": "{ppm} ppm",
|
|
"@telemetry_concentrationValue": {
|
|
"placeholders": {
|
|
"ppm": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"telemetry_percentageValue": "{percent}%",
|
|
"@telemetry_percentageValue": {
|
|
"placeholders": {
|
|
"percent": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"telemetry_analogValue": "{value}",
|
|
"@telemetry_analogValue": {
|
|
"placeholders": {
|
|
"value": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"telemetry_autoFetchQuantity": "Requests quantity",
|
|
"telemetry_error": "Unable to retrieve data",
|
|
"neighbors_receivedData": "Received Neighbors Data",
|
|
"neighbors_requestTimedOut": "Neighbors request timed out.",
|
|
"neighbors_errorLoading": "Error loading neighbors: {error}",
|
|
"@neighbors_errorLoading": {
|
|
"placeholders": {
|
|
"error": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"neighbors_repeatersNeighbors": "Repeaters Neighbors",
|
|
"neighbors_noData": "No neighbors data available.",
|
|
"neighbors_unknownContact": "Unknown {pubkey}",
|
|
"@neighbors_unknownContact": {
|
|
"placeholders": {
|
|
"pubkey": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"neighbors_heardAgo": "Heard: {time} ago",
|
|
"@neighbors_heardAgo": {
|
|
"placeholders": {
|
|
"time": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"channelPath_title": "Packet Path",
|
|
"channelPath_viewMap": "View map",
|
|
"channelPath_otherObservedPaths": "Other Observed Paths",
|
|
"channelPath_repeaterHops": "Repeater Hops",
|
|
"channelPath_noHopDetails": "Hop details are not provided for this packet.",
|
|
"channelPath_messageDetails": "Message Details",
|
|
"channelPath_senderLabel": "Sender",
|
|
"channelPath_timeLabel": "Time",
|
|
"channelPath_repeatsLabel": "Repeats",
|
|
"channelPath_pathLabel": "Path {index}",
|
|
"channelPath_observedLabel": "Observed",
|
|
"channelPath_observedPathTitle": "Observed path {index} • {hops}",
|
|
"@channelPath_observedPathTitle": {
|
|
"placeholders": {
|
|
"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"
|
|
}
|
|
}
|
|
},
|
|
"channelPath_timeOnly": "{time}",
|
|
"@channelPath_timeOnly": {
|
|
"placeholders": {
|
|
"time": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"channelPath_unknownPath": "Unknown",
|
|
"channelPath_floodPath": "Flood",
|
|
"channelPath_directPath": "Direct",
|
|
"channelPath_observedZeroOf": "0 of {total} hops",
|
|
"@channelPath_observedZeroOf": {
|
|
"placeholders": {
|
|
"total": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
"channelPath_observedSomeOf": "{observed} of {total} hops",
|
|
"@channelPath_observedSomeOf": {
|
|
"placeholders": {
|
|
"observed": {
|
|
"type": "int"
|
|
},
|
|
"total": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
"channelPath_mapTitle": "Path Map",
|
|
"channelPath_noRepeaterLocations": "No repeater locations available for this path.",
|
|
"channelPath_primaryPath": "Path {index} (Primary)",
|
|
"@channelPath_primaryPath": {
|
|
"placeholders": {
|
|
"index": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
"@channelPath_pathLabel": {
|
|
"placeholders": {
|
|
"index": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
"channelPath_pathLabelTitle": "Path",
|
|
"channelPath_observedPathHeader": "Observed Path",
|
|
"channelPath_selectedPathLabel": "{label} • {prefixes}",
|
|
"@channelPath_selectedPathLabel": {
|
|
"placeholders": {
|
|
"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.",
|
|
"community_join": "Join",
|
|
"community_joinTitle": "Join Community",
|
|
"community_joinConfirmation": "Do you want to join the community \"{name}\"?",
|
|
"@community_joinConfirmation": {
|
|
"placeholders": {
|
|
"name": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"community_scanQr": "Scan Community QR",
|
|
"community_scanInstructions": "Point the camera at a community QR code",
|
|
"community_showQr": "Show QR Code",
|
|
"community_publicChannel": "Community Public",
|
|
"community_hashtagChannel": "Community Hashtag",
|
|
"community_name": "Community Name",
|
|
"community_enterName": "Enter community name",
|
|
"community_created": "Community \"{name}\" created",
|
|
"@community_created": {
|
|
"placeholders": {
|
|
"name": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"community_joined": "Joined community \"{name}\"",
|
|
"@community_joined": {
|
|
"placeholders": {
|
|
"name": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"community_qrTitle": "Share Community",
|
|
"community_qrInstructions": "Scan this QR code to join \"{name}\"",
|
|
"@community_qrInstructions": {
|
|
"placeholders": {
|
|
"name": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"community_hashtagPrivacyHint": "Community hashtag channels are only joinable by members of the community",
|
|
"community_invalidQrCode": "Invalid community QR code",
|
|
"community_alreadyMember": "Already a Member",
|
|
"community_alreadyMemberMessage": "You are already a member of \"{name}\".",
|
|
"@community_alreadyMemberMessage": {
|
|
"placeholders": {
|
|
"name": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"community_addPublicChannel": "Add Community Public Channel",
|
|
"community_addPublicChannelHint": "Automatically add the public channel for this community",
|
|
"community_noCommunities": "No communities joined yet",
|
|
"community_scanOrCreate": "Scan a QR code or create a community to get started",
|
|
"community_manageCommunities": "Manage Communities",
|
|
"community_delete": "Leave Community",
|
|
"community_deleteConfirm": "Leave \"{name}\"?",
|
|
"@community_deleteConfirm": {
|
|
"placeholders": {
|
|
"name": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"community_deleteChannelsWarning": "This will also delete {count} channel(s) and their messages.",
|
|
"@community_deleteChannelsWarning": {
|
|
"placeholders": {
|
|
"count": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
"community_deleted": "Left community \"{name}\"",
|
|
"@community_deleted": {
|
|
"placeholders": {
|
|
"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"
|
|
}
|
|
}
|
|
},
|
|
"community_regenerate": "Regenerate",
|
|
"community_secretRegenerated": "Secret regenerated for \"{name}\"",
|
|
"@community_secretRegenerated": {
|
|
"placeholders": {
|
|
"name": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"community_updateSecret": "Update Secret",
|
|
"community_secretUpdated": "Secret updated for \"{name}\"",
|
|
"@community_secretUpdated": {
|
|
"placeholders": {
|
|
"name": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"community_scanToUpdateSecret": "Scan the new QR code to update the secret for \"{name}\"",
|
|
"@community_scanToUpdateSecret": {
|
|
"placeholders": {
|
|
"name": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"community_addHashtagChannel": "Add Community Hashtag",
|
|
"community_addHashtagChannelDesc": "Add a hashtag channel for this community",
|
|
"community_selectCommunity": "Select Community",
|
|
"community_regularHashtag": "Regular Hashtag",
|
|
"community_regularHashtagDesc": "Public hashtag (anyone can join)",
|
|
"community_communityHashtag": "Community Hashtag",
|
|
"community_communityHashtagDesc": "Private to community members",
|
|
"community_forCommunity": "For {name}",
|
|
"@community_forCommunity": {
|
|
"placeholders": {
|
|
"name": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"listFilter_tooltip": "Filter and sort",
|
|
"listFilter_sortBy": "Sort by",
|
|
"listFilter_latestMessages": "Latest messages",
|
|
"listFilter_heardRecently": "Heard recently",
|
|
"listFilter_az": "A-Z",
|
|
"listFilter_filters": "Filters",
|
|
"listFilter_all": "All",
|
|
"listFilter_favorites": "Favorites",
|
|
"listFilter_addToFavorites": "Add to favorites",
|
|
"listFilter_removeFromFavorites": "Remove from favorites",
|
|
"listFilter_users": "Users",
|
|
"listFilter_repeaters": "Repeaters",
|
|
"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.",
|
|
"pathTrace_refreshTooltip": "Refresh Path Trace.",
|
|
"pathTrace_someHopsNoLocation": "One or more of the hops is missing a location!",
|
|
"pathTrace_clearTooltip": "Clear path.",
|
|
"losSelectStartEnd": "Select start and end nodes for LOS.",
|
|
"losRunFailed": "Line-of-sight check failed: {error}",
|
|
"@losRunFailed": {
|
|
"placeholders": {
|
|
"error": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"losClearAllPoints": "Clear all points",
|
|
"losRunToViewElevationProfile": "Run LOS to view elevation profile",
|
|
"losMenuTitle": "LOS Menu",
|
|
"losMenuSubtitle": "Tap nodes or long-press map for custom points",
|
|
"losShowDisplayNodes": "Show display nodes",
|
|
"losCustomPoints": "Custom points",
|
|
"losCustomPointLabel": "Custom {index}",
|
|
"@losCustomPointLabel": {
|
|
"placeholders": {
|
|
"index": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
"losPointA": "Point A",
|
|
"losPointB": "Point B",
|
|
"losAntennaA": "Antenna A: {value} {unit}",
|
|
"@losAntennaA": {
|
|
"placeholders": {
|
|
"value": {
|
|
"type": "String"
|
|
},
|
|
"unit": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"losAntennaB": "Antenna B: {value} {unit}",
|
|
"@losAntennaB": {
|
|
"placeholders": {
|
|
"value": {
|
|
"type": "String"
|
|
},
|
|
"unit": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"losRun": "Run LOS",
|
|
"losNoElevationData": "No elevation data",
|
|
"losProfileClear": "{distance} {distanceUnit}, clear LOS, min clearance {clearance} {heightUnit}",
|
|
"@losProfileClear": {
|
|
"placeholders": {
|
|
"distance": {
|
|
"type": "String"
|
|
},
|
|
"distanceUnit": {
|
|
"type": "String"
|
|
},
|
|
"clearance": {
|
|
"type": "String"
|
|
},
|
|
"heightUnit": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"losProfileBlocked": "{distance} {distanceUnit}, blocked by {obstruction} {heightUnit}",
|
|
"@losProfileBlocked": {
|
|
"placeholders": {
|
|
"distance": {
|
|
"type": "String"
|
|
},
|
|
"distanceUnit": {
|
|
"type": "String"
|
|
},
|
|
"obstruction": {
|
|
"type": "String"
|
|
},
|
|
"heightUnit": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"losStatusChecking": "LOS: checking...",
|
|
"losStatusNoData": "LOS: no data",
|
|
"losStatusSummary": "LOS: {clear}/{total} clear, {blocked} blocked, {unknown} unknown",
|
|
"@losStatusSummary": {
|
|
"placeholders": {
|
|
"clear": {
|
|
"type": "int"
|
|
},
|
|
"total": {
|
|
"type": "int"
|
|
},
|
|
"blocked": {
|
|
"type": "int"
|
|
},
|
|
"unknown": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
"losErrorElevationUnavailable": "Elevation data unavailable for one or more samples.",
|
|
"losErrorInvalidInput": "Invalid points/elevation data for LOS calculation.",
|
|
"losRenameCustomPoint": "Rename custom point",
|
|
"losPointName": "Point name",
|
|
"losShowPanelTooltip": "Show LOS panel",
|
|
"losHidePanelTooltip": "Hide LOS panel",
|
|
"losElevationAttribution": "Elevation data: Open-Meteo (CC BY 4.0)",
|
|
"losLegendRadioHorizon": "Radio horizon",
|
|
"losLegendLosBeam": "LOS beam",
|
|
"losLegendTerrain": "Terrain",
|
|
"losBlockedSpotsTitle": "Blocked spots",
|
|
"losBlockedSpotsHint": "Tap a blocked spot to highlight it on the map.",
|
|
"losBlockedSpotChip": "{distance} {distanceUnit} • {obstruction} {heightUnit}",
|
|
"@losBlockedSpotChip": {
|
|
"placeholders": {
|
|
"distance": {
|
|
"type": "String"
|
|
},
|
|
"distanceUnit": {
|
|
"type": "String"
|
|
},
|
|
"obstruction": {
|
|
"type": "String"
|
|
},
|
|
"heightUnit": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"losSelectedObstructionTitle": "Selected obstruction",
|
|
"losSelectedObstructionDetails": "Blocked by {obstruction} {heightUnit}, {distanceFromA} from A and {distanceFromB} from B ({distanceUnit}).",
|
|
"@losSelectedObstructionDetails": {
|
|
"placeholders": {
|
|
"obstruction": {
|
|
"type": "String"
|
|
},
|
|
"heightUnit": {
|
|
"type": "String"
|
|
},
|
|
"distanceFromA": {
|
|
"type": "String"
|
|
},
|
|
"distanceUnit": {
|
|
"type": "String"
|
|
},
|
|
"distanceFromB": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"losFrequencyLabel": "Frequency",
|
|
"losFrequencyInfoTooltip": "View calculation details",
|
|
"losFrequencyDialogTitle": "Radio horizon calculation",
|
|
"losFrequencyDialogDescription": "Starting from k={baselineK} at {baselineFreq} MHz, the calculation adjusts the k-factor for the current {frequencyMHz} MHz band, which defines the curved radio horizon cap.",
|
|
"@losFrequencyDialogDescription": {
|
|
"description": "Explain how the calculation uses the baseline frequency and derived k-factor.",
|
|
"placeholders": {
|
|
"baselineK": {
|
|
"type": "double"
|
|
},
|
|
"baselineFreq": {
|
|
"type": "double"
|
|
},
|
|
"frequencyMHz": {
|
|
"type": "double"
|
|
},
|
|
"kFactor": {
|
|
"type": "double"
|
|
}
|
|
}
|
|
},
|
|
"contacts_pathTrace": "Path Trace",
|
|
"contacts_ping": "Ping",
|
|
"contacts_repeaterPathTrace": "Path trace to repeater",
|
|
"contacts_repeaterPing": "Ping repeater",
|
|
"contacts_roomPathTrace": "Path trace to room server",
|
|
"contacts_roomPing": "Ping room server",
|
|
"contacts_chatTraceRoute": "Path trace route",
|
|
"contacts_pathTraceTo": "Trace route to {name}",
|
|
"@contacts_pathTraceTo": {
|
|
"placeholders": {
|
|
"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_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"
|
|
}
|
|
}
|
|
},
|
|
"notification_channelMessagesCount": "{count} {count, plural, =1{channel message} other{channel messages}}",
|
|
"@notification_channelMessagesCount": {
|
|
"placeholders": {
|
|
"count": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
"notification_newNodesCount": "{count} {count, plural, =1{new node} other{new nodes}}",
|
|
"@notification_newNodesCount": {
|
|
"placeholders": {
|
|
"count": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
"notification_newTypeDiscovered": "New {contactType} discovered",
|
|
"@notification_newTypeDiscovered": {
|
|
"placeholders": {
|
|
"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",
|
|
"settings_gpxExportContactsSubtitle": "Exports companions with a location to GPX file.",
|
|
"settings_gpxExportAll": "Export all contacts to GPX",
|
|
"settings_gpxExportAllSubtitle": "Exports all contacts with a location to GPX file.",
|
|
"settings_gpxExportSuccess": "Successfully exported GPX file.",
|
|
"settings_gpxExportNoContacts": "No contacts to export.",
|
|
"settings_gpxExportNotAvailable": "Not supported on your device/OS",
|
|
"settings_gpxExportError": "There was an error when exporting.",
|
|
"settings_gpxExportRepeatersRoom": "Repeater & room server locations",
|
|
"settings_gpxExportChat": "Companion locations",
|
|
"settings_gpxExportAllContacts": "All contacts locations",
|
|
"settings_gpxExportShareText": "Map data exported from meshcore-open",
|
|
"settings_gpxExportShareSubject": "meshcore-open GPX map data export",
|
|
"snrIndicator_nearByRepeaters": "Nearby Repeaters",
|
|
"snrIndicator_lastSeen": "Last seen",
|
|
"contactsSettings_title": "Contacts settings",
|
|
"contactsSettings_autoAddTitle": "Automatic Discovery",
|
|
"contactsSettings_otherTitle": "Other contact related settings",
|
|
"contactsSettings_autoAddUsersTitle": "Auto-add users",
|
|
"contactsSettings_autoAddUsersSubtitle": "Allow the companion to automatically add discovered users.",
|
|
"contactsSettings_autoAddRepeatersTitle": "Auto-add repeaters",
|
|
"contactsSettings_autoAddRepeatersSubtitle": "Allow the companion to automatically add discovered repeaters.",
|
|
"contactsSettings_autoAddRoomServersTitle": "Auto-add room servers",
|
|
"contactsSettings_autoAddRoomServersSubtitle": "Allow the companion to automatically add discovered room servers.",
|
|
"contactsSettings_autoAddSensorsTitle": "Auto-add sensors",
|
|
"contactsSettings_autoAddSensorsSubtitle": "Allow the companion to automatically add discovered sensors.",
|
|
"contactsSettings_overwriteOldestTitle": "Overwrite Oldest",
|
|
"contactsSettings_overwriteOldestSubtitle": "When the contact list is full, the oldest non-favorited contact will be replaced.",
|
|
"discoveredContacts_Title": "Discovered Contacts",
|
|
"discoveredContacts_noMatching": "No matching contacts",
|
|
"discoveredContacts_searchHint": "Search discovered contacts",
|
|
"discoveredContacts_contactAdded": "Contact added",
|
|
"discoveredContacts_addContact": "Add Contact",
|
|
"discoveredContacts_copyContact": "Copy Contact to clipboard",
|
|
"discoveredContacts_deleteContact": "Delete Discovered Contact",
|
|
"discoveredContacts_deleteContactAll": "Delete All Discovered Contacts",
|
|
"discoveredContacts_deleteContactAllContent": "Are you sure you want to delete all discovered contacts?",
|
|
"chat_sendCooldown": "Please wait a moment before sending again.",
|
|
"appSettings_jumpToOldestUnread": "Jump to oldest unread",
|
|
"appSettings_jumpToOldestUnreadSubtitle": "When opening a chat with unread messages, scroll to the first unread instead of the latest.",
|
|
"appSettings_languageHu": "Hungarian",
|
|
"appSettings_languageJa": "Japanese",
|
|
"appSettings_languageKo": "Korean",
|
|
"radioStats_tooltip": "Radio & mesh stats",
|
|
"radioStats_screenTitle": "Radio stats",
|
|
"radioStats_notConnected": "Connect to a device to view radio statistics.",
|
|
"radioStats_firmwareTooOld": "Radio statistics require companion firmware v8 or newer.",
|
|
"radioStats_waiting": "Waiting for data…",
|
|
"radioStats_noiseFloor": "Noise floor: {noiseDbm} dBm",
|
|
"@radioStats_noiseFloor": {
|
|
"placeholders": {
|
|
"noiseDbm": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
"radioStats_lastRssi": "Last RSSI: {rssiDbm} dBm",
|
|
"@radioStats_lastRssi": {
|
|
"placeholders": {
|
|
"rssiDbm": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
"radioStats_lastSnr": "Last SNR: {snr} dB",
|
|
"@radioStats_lastSnr": {
|
|
"placeholders": {
|
|
"snr": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"radioStats_txAir": "TX airtime (total): {seconds} s",
|
|
"@radioStats_txAir": {
|
|
"placeholders": {
|
|
"seconds": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
"radioStats_rxAir": "RX airtime (total): {seconds} s",
|
|
"@radioStats_rxAir": {
|
|
"placeholders": {
|
|
"seconds": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
"radioStats_chartCaption": "Noise floor (dBm) over recent samples.",
|
|
"radioStats_stripNoise": "Noise floor: {noiseDbm} dBm",
|
|
"@radioStats_stripNoise": {
|
|
"placeholders": {
|
|
"noiseDbm": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
"radioStats_stripWaiting": "Fetching radio stats…",
|
|
"radioStats_settingsTile": "Radio stats",
|
|
"radioStats_settingsSubtitle": "Noise floor, RSSI, SNR, and airtime",
|
|
"translation_title": "Translation",
|
|
"translation_enableTitle": "Enable translation",
|
|
"translation_enableSubtitle": "Translate incoming messages and allow pre-send translation.",
|
|
"translation_composerTitle": "Translate before sending",
|
|
"translation_composerSubtitle": "Controls the default state of the composer translation icon.",
|
|
"translation_autoIncomingTitle": "Auto-translate incoming messages",
|
|
"translation_autoIncomingSubtitle": "Translates Messages for notification and for chat or channel automatically.",
|
|
"translation_translateMessage": "Translate message",
|
|
"translation_targetLanguage": "Target language",
|
|
"translation_useAppLanguage": "Use app language",
|
|
"translation_downloadedModelLabel": "Downloaded model",
|
|
"translation_presetModelLabel": "Preset Hugging Face model",
|
|
"translation_manualUrlLabel": "Manual model URL",
|
|
"translation_downloadModel": "Download model",
|
|
"translation_downloading": "Downloading...",
|
|
"translation_working": "Working...",
|
|
"translation_stop": "Stop",
|
|
"translation_mergingChunks": "Merging downloaded chunks into final file...",
|
|
"translation_downloadedModels": "Downloaded models",
|
|
"translation_deleteModel": "Delete model",
|
|
"translation_modelDownloaded": "Translation model downloaded.",
|
|
"translation_downloadStopped": "Download stopped.",
|
|
"translation_downloadFailed": "Download failed: {error}",
|
|
"@translation_downloadFailed": {
|
|
"placeholders": {
|
|
"error": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"translation_enterUrlFirst": "Enter a model URL first.",
|
|
"scanner_linuxPairingShowPin": "Show PIN",
|
|
"scanner_linuxPairingHidePin": "Hide PIN",
|
|
"scanner_linuxPairingPinTitle": "Bluetooth Pairing PIN",
|
|
"scanner_linuxPairingPinPrompt": "Enter PIN for {deviceName} (leave blank if none).",
|
|
"@scanner_linuxPairingPinPrompt": {
|
|
"placeholders": {
|
|
"deviceName": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"translation_messageTranslation": "Message translation",
|
|
"translation_translateBeforeSending": "Translate before sending",
|
|
"translation_composerEnabledHint": "Messages will be translated before send.",
|
|
"translation_composerDisabledHint": "Send messages in the original typed language.",
|
|
"translation_translateTo": "Translate to {language}",
|
|
"@translation_translateTo": {
|
|
"placeholders": {
|
|
"language": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"translation_translationOptions": "Translation options",
|
|
"translation_systemLanguage": "System language",
|
|
"background_serviceTitle": "MeshCore running",
|
|
"background_serviceText": "Keeping BLE connected",
|
|
"appSettings_translationModelDeleted": "Deleted {name}",
|
|
"@appSettings_translationModelDeleted": {
|
|
"placeholders": {
|
|
"name": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"appSettings_translationModelDeleteFailed": "Failed to delete: {error}",
|
|
"@appSettings_translationModelDeleteFailed": {
|
|
"placeholders": {
|
|
"error": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"channels_channelUpdateFailed": "Failed to update channel: {error}",
|
|
"@channels_channelUpdateFailed": {
|
|
"placeholders": {
|
|
"error": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"contact_typeChat": "Chat",
|
|
"contact_typeRepeater": "Repeater",
|
|
"contact_typeRoom": "Room",
|
|
"contact_typeSensor": "Sensor",
|
|
"contact_typeUnknown": "Unknown",
|
|
"map_zoomIn": "Zoom in",
|
|
"map_zoomOut": "Zoom out",
|
|
"map_centerMap": "Center map",
|
|
"chrome_bluetoothRequiresChromium": "Web Bluetooth requires a Chromium browser",
|
|
"channels_communityShortId": "ID: {id}...",
|
|
"@channels_communityShortId": {
|
|
"placeholders": {
|
|
"id": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"pathTrace_legendGpsConfirmed": "GPS confirmed",
|
|
"pathTrace_legendInferred": "Inferred position",
|
|
"pathMap_viewSingle": "Single",
|
|
"pathMap_viewCombined": "Combined",
|
|
"pathMap_play": "Play",
|
|
"pathMap_pause": "Pause",
|
|
"pathMap_replay": "Replay",
|
|
"pathMap_stepBack": "Previous hop",
|
|
"pathMap_stepForward": "Next hop",
|
|
"pathMap_animationOn": "Show packet animation",
|
|
"pathMap_animationOff": "Hide packet animation",
|
|
"pathMap_hopOf": "Hop {current} of {total}",
|
|
"@pathMap_hopOf": {
|
|
"placeholders": {
|
|
"current": {
|
|
"type": "int"
|
|
},
|
|
"total": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
"pathMap_observedPaths": "Observed paths: {count}",
|
|
"@pathMap_observedPaths": {
|
|
"placeholders": {
|
|
"count": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
"pathMap_primary": "Primary",
|
|
"pathMap_alternate": "Alt {index}",
|
|
"@pathMap_alternate": {
|
|
"placeholders": {
|
|
"index": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
"pathMap_hopCount": "{count, plural, =1{1 hop} other{{count} hops}}",
|
|
"@pathMap_hopCount": {
|
|
"placeholders": {
|
|
"count": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
"pathMap_gpsCount": "{confirmed}/{total} GPS",
|
|
"@pathMap_gpsCount": {
|
|
"placeholders": {
|
|
"confirmed": {
|
|
"type": "int"
|
|
},
|
|
"total": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
"pathMap_legendShared": "Shared segment",
|
|
"pathMap_legendEstimated": "Estimated segment",
|
|
"pathMap_sharedNodeCount": "Used by {count} paths",
|
|
"@pathMap_sharedNodeCount": {
|
|
"placeholders": {
|
|
"count": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
"pathMap_partialAnimation": "{count, plural, =1{1 hop has no location — the shown path is partial} other{{count} hops have no location — the shown path is partial}}",
|
|
"@pathMap_partialAnimation": {
|
|
"placeholders": {
|
|
"count": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
"pathMap_showAllPaths": "Show all",
|
|
"pathMap_hidePath": "Hide path",
|
|
"pathMap_showPath": "Show path",
|
|
"pathMap_collapsePanel": "Collapse panel",
|
|
"pathMap_expandPanel": "Expand panel",
|
|
"pathMap_noLocation": "No location",
|
|
"pathMap_followPacket": "Lock view to packet",
|
|
"pathMap_unfollowPacket": "Unlock view from packet"
|
|
}
|