mirror of
https://github.com/zjs81/meshcore-open.git
synced 2026-04-20 22:13:48 +00:00
Add "Set as my location" option to the map long-press bottom sheet, allowing users to set their device position directly from the map. Includes connector, chat, contacts, and message retry service improvements.
1930 lines
68 KiB
Text
1930 lines
68 KiB
Text
{
|
|
"@@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_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_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"
|
|
}
|
|
}
|
|
},
|
|
"scanner_title": "MeshCore Open",
|
|
"connectionChoiceUsbLabel": "USB",
|
|
"connectionChoiceBluetoothLabel": "Bluetooth",
|
|
"connectionChoiceTcpLabel": "TCP",
|
|
"tcpScreenTitle": "Connect over TCP",
|
|
"tcpHostLabel": "IP Address",
|
|
"tcpHostHint": "192.168.40.10",
|
|
"tcpPortLabel": "Port",
|
|
"tcpPortHint": "5000",
|
|
"tcpStatus_notConnected": "Enter endpoint and connect",
|
|
"tcpStatus_connectingTo": "Connecting to {endpoint}...",
|
|
"@tcpStatus_connectingTo": {
|
|
"placeholders": {
|
|
"endpoint": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"tcpErrorHostRequired": "IP address 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",
|
|
"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_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_actions": "Actions",
|
|
"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_bleDebugLog": "BLE Debug Log",
|
|
"settings_bleDebugLogSubtitle": "BLE 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_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_groupName": "Group name",
|
|
"contacts_groupNameRequired": "Group name is required",
|
|
"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"
|
|
}
|
|
}
|
|
},
|
|
"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_hashtagChannel": "Hashtag channel",
|
|
"channels_public": "Public",
|
|
"channels_private": "Private",
|
|
"channels_publicChannel": "Public channel",
|
|
"channels_privateChannel": "Private channel",
|
|
"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_channelUpdated": "Channel \"{name}\" updated",
|
|
"@channels_channelUpdated": {
|
|
"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",
|
|
"chat_noMessages": "No messages yet",
|
|
"chat_sendMessageToStart": "Send a message to get started",
|
|
"chat_originalMessageNotFound": "Original message not found",
|
|
"chat_replyingTo": "Replying to {name}",
|
|
"@chat_replyingTo": {
|
|
"placeholders": {
|
|
"name": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"chat_replyTo": "Reply to {name}",
|
|
"@chat_replyTo": {
|
|
"placeholders": {
|
|
"name": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"chat_location": "Location",
|
|
"chat_sendMessageTo": "Send a message to {contactName}",
|
|
"@chat_sendMessageTo": {
|
|
"placeholders": {
|
|
"contactName": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"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_pathManagement": "Path Management",
|
|
"chat_ShowAllPaths": "Show all paths",
|
|
"chat_routingMode": "Routing mode",
|
|
"chat_autoUseSavedPath": "Auto (use saved path)",
|
|
"chat_forceFloodMode": "Force Flood Mode",
|
|
"chat_recentAckPaths": "Recent ACK Paths (tap to use):",
|
|
"chat_pathHistoryFull": "Path history is full. Remove entries to add new ones.",
|
|
"chat_hopSingular": "hop",
|
|
"chat_hopPlural": "hops",
|
|
"chat_hopsCount": "{count} {count, plural, =1{hop} other{hops}}",
|
|
"@chat_hopsCount": {
|
|
"placeholders": {
|
|
"count": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
"chat_successes": "successes",
|
|
"chat_removePath": "Remove path",
|
|
"chat_noPathHistoryYet": "No path history yet.\nSend a message to discover paths.",
|
|
"chat_pathActions": "Path Actions:",
|
|
"chat_setCustomPath": "Set Custom Path",
|
|
"chat_setCustomPathSubtitle": "Manually specify routing path",
|
|
"chat_clearPath": "Clear Path",
|
|
"chat_clearPathSubtitle": "Force rediscovery on next send",
|
|
"chat_pathCleared": "Path cleared. Next message will rediscover route.",
|
|
"chat_floodModeSubtitle": "Use routing toggle in app bar",
|
|
"chat_floodModeEnabled": "Flood mode enabled. Toggle back via routing icon in app bar.",
|
|
"chat_fullPath": "Full Path",
|
|
"chat_pathDetailsNotAvailable": "Path details not available yet. Try sending a message to refresh.",
|
|
"chat_pathSetHops": "Path set: {hopCount} {hopCount, plural, =1{hop} other{hops}} - {status}",
|
|
"@chat_pathSetHops": {
|
|
"placeholders": {
|
|
"hopCount": {
|
|
"type": "int"
|
|
},
|
|
"status": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"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_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_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_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_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_joinRoom": "Join Room",
|
|
"map_manageRepeater": "Manage Repeater",
|
|
"map_tapToAdd": "Tap on nodes to add them to the path.",
|
|
"map_runTrace": "Run Path Trace",
|
|
"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 to access settings and status.",
|
|
"login_roomDescription": "Enter the room password to access settings and status.",
|
|
"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_currentPath": "Current path: {path}",
|
|
"@path_currentPath": {
|
|
"placeholders": {
|
|
"path": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"path_usingHopsPath": "Using {count} {count, plural, =1{hop} other{hops}} path",
|
|
"@path_usingHopsPath": {
|
|
"placeholders": {
|
|
"count": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
"path_enterCustomPath": "Enter Custom Path",
|
|
"path_currentPathLabel": "Current path",
|
|
"path_hexPrefixInstructions": "Enter 2-character hex prefixes for each hop, separated by commas.",
|
|
"path_hexPrefixExample": "Example: A1,F2,3C (each node uses first byte of its public key)",
|
|
"path_labelHexPrefixes": "Path (hex prefixes)",
|
|
"path_helperMaxHops": "Max 64 hops. Each prefix is 2 hex characters (1 byte)",
|
|
"path_selectFromContacts": "Or select from contacts:",
|
|
"path_noRepeatersFound": "No repeaters or room servers found.",
|
|
"path_customPathsRequire": "Custom paths require intermediate hops that can relay messages.",
|
|
"path_invalidHexPrefixes": "Invalid hex prefixes: {prefixes}",
|
|
"@path_invalidHexPrefixes": {
|
|
"placeholders": {
|
|
"prefixes": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"path_tooLong": "Path too long. Maximum 64 hops allowed.",
|
|
"path_setPath": "Set Path",
|
|
"repeater_management": "Repeater Management",
|
|
"room_management": "Room Server Management",
|
|
"repeater_managementTools": "Management Tools",
|
|
"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_statusTitle": "Repeater Status",
|
|
"repeater_routingMode": "Routing mode",
|
|
"repeater_autoUseSavedPath": "Auto (use saved path)",
|
|
"repeater_forceFloodMode": "Force Flood Mode",
|
|
"repeater_pathManagement": "Path management",
|
|
"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_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_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_refreshLocationSettings": "Refresh Location Settings",
|
|
"repeater_refreshPacketForwarding": "Refresh Packet Forwarding",
|
|
"repeater_refreshGuestAccess": "Refresh Guest Access",
|
|
"repeater_refreshPrivacyMode": "Refresh Privacy Mode",
|
|
"repeater_refreshAdvertisementSettings": "Refresh Advertisement Settings",
|
|
"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_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.",
|
|
"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"
|
|
}
|
|
}
|
|
},
|
|
"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",
|
|
"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?"
|
|
}
|