mirror of
https://github.com/dz0ny/meshcore-sar.git
synced 2026-08-11 16:30:28 +00:00
- Updated localization files for French, Croatian, Italian, Slovenian to include translations for German, Spanish, French, and Italian. - Added new methods for handling drawing messages sent to the public channel in multiple languages. - Enhanced the Contact model to identify public channels using a dedicated method. - Implemented echo detection for public channel messages, including tracking and reporting of echoes. - Updated BLE response handling to support echo detection and tracking of sent messages. - Modified UI components to reflect new localization strings and echo statuses.
2144 lines
51 KiB
Plaintext
2144 lines
51 KiB
Plaintext
{
|
|
"@@locale": "en",
|
|
|
|
"appTitle": "MeshCore SAR",
|
|
"@appTitle": {
|
|
"description": "The application title"
|
|
},
|
|
|
|
"messages": "Messages",
|
|
"@messages": {
|
|
"description": "Messages tab label"
|
|
},
|
|
|
|
"contacts": "Contacts",
|
|
"@contacts": {
|
|
"description": "Contacts tab label"
|
|
},
|
|
|
|
"map": "Map",
|
|
"@map": {
|
|
"description": "Map tab label"
|
|
},
|
|
|
|
"settings": "Settings",
|
|
"@settings": {
|
|
"description": "Settings screen title"
|
|
},
|
|
|
|
"connect": "Connect",
|
|
"@connect": {
|
|
"description": "Connect button label"
|
|
},
|
|
|
|
"disconnect": "Disconnect",
|
|
"@disconnect": {
|
|
"description": "Disconnect button label"
|
|
},
|
|
|
|
"scanningForDevices": "Scanning for devices...",
|
|
"@scanningForDevices": {
|
|
"description": "Text shown when scanning for BLE devices"
|
|
},
|
|
|
|
"noDevicesFound": "No devices found",
|
|
"@noDevicesFound": {
|
|
"description": "Text shown when no BLE devices are found"
|
|
},
|
|
|
|
"scanAgain": "Scan Again",
|
|
"@scanAgain": {
|
|
"description": "Button to restart BLE scanning"
|
|
},
|
|
|
|
"tapToConnect": "Tap to connect",
|
|
"@tapToConnect": {
|
|
"description": "Subtitle text for device in scan list"
|
|
},
|
|
|
|
"deviceNotConnected": "Device not connected",
|
|
"@deviceNotConnected": {
|
|
"description": "Error message when device is not connected"
|
|
},
|
|
|
|
"locationPermissionDenied": "Location permission denied",
|
|
"@locationPermissionDenied": {
|
|
"description": "Error when location permission is denied"
|
|
},
|
|
|
|
"locationPermissionPermanentlyDenied": "Location permission permanently denied. Please enable in Settings.",
|
|
"@locationPermissionPermanentlyDenied": {
|
|
"description": "Error when location permission is permanently denied"
|
|
},
|
|
|
|
"locationPermissionRequired": "Location permission is required for GPS tracking and team coordination. You can enable it later in Settings.",
|
|
"@locationPermissionRequired": {
|
|
"description": "Message when location permission is needed"
|
|
},
|
|
|
|
"locationServicesDisabled": "Location services are disabled. Please enable them in Settings.",
|
|
"@locationServicesDisabled": {
|
|
"description": "Error when location services are disabled"
|
|
},
|
|
|
|
"failedToGetGpsLocation": "Failed to get GPS location",
|
|
"@failedToGetGpsLocation": {
|
|
"description": "Error when GPS location cannot be obtained"
|
|
},
|
|
|
|
"advertisedAtLocation": "Advertised at {latitude}, {longitude}",
|
|
"@advertisedAtLocation": {
|
|
"description": "Success message showing advertised location",
|
|
"placeholders": {
|
|
"latitude": {
|
|
"type": "String"
|
|
},
|
|
"longitude": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
|
|
"failedToAdvertise": "Failed to advertise: {error}",
|
|
"@failedToAdvertise": {
|
|
"description": "Error message for failed advertisement",
|
|
"placeholders": {
|
|
"error": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
|
|
"reconnecting": "Reconnecting... ({attempt}/{max})",
|
|
"@reconnecting": {
|
|
"description": "Text shown during reconnection attempts",
|
|
"placeholders": {
|
|
"attempt": {
|
|
"type": "int"
|
|
},
|
|
"max": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
|
|
"cancelReconnection": "Cancel reconnection",
|
|
"@cancelReconnection": {
|
|
"description": "Tooltip for cancel reconnection button"
|
|
},
|
|
|
|
"mapManagement": "Map Management",
|
|
"@mapManagement": {
|
|
"description": "Menu item for map management"
|
|
},
|
|
|
|
"general": "General",
|
|
"@general": {
|
|
"description": "General settings section header"
|
|
},
|
|
|
|
"theme": "Theme",
|
|
"@theme": {
|
|
"description": "Theme setting label"
|
|
},
|
|
|
|
"chooseTheme": "Choose Theme",
|
|
"@chooseTheme": {
|
|
"description": "Theme selection dialog title"
|
|
},
|
|
|
|
"light": "Light",
|
|
"@light": {
|
|
"description": "Light theme option"
|
|
},
|
|
|
|
"dark": "Dark",
|
|
"@dark": {
|
|
"description": "Dark theme option"
|
|
},
|
|
|
|
"blueLightTheme": "Blue light theme",
|
|
"@blueLightTheme": {
|
|
"description": "Description for blue light theme"
|
|
},
|
|
|
|
"blueDarkTheme": "Blue dark theme",
|
|
"@blueDarkTheme": {
|
|
"description": "Description for blue dark theme"
|
|
},
|
|
|
|
"sarRed": "SAR Red",
|
|
"@sarRed": {
|
|
"description": "SAR Red theme option"
|
|
},
|
|
|
|
"alertEmergencyMode": "Alert/Emergency mode",
|
|
"@alertEmergencyMode": {
|
|
"description": "Description for SAR Red theme"
|
|
},
|
|
|
|
"sarGreen": "SAR Green",
|
|
"@sarGreen": {
|
|
"description": "SAR Green theme option"
|
|
},
|
|
|
|
"safeAllClearMode": "Safe/All Clear mode",
|
|
"@safeAllClearMode": {
|
|
"description": "Description for SAR Green theme"
|
|
},
|
|
|
|
"autoSystem": "Auto (System)",
|
|
"@autoSystem": {
|
|
"description": "Auto/System theme option"
|
|
},
|
|
|
|
"followSystemTheme": "Follow system theme",
|
|
"@followSystemTheme": {
|
|
"description": "Description for system theme"
|
|
},
|
|
|
|
"showRxTxIndicators": "Show RX/TX Indicators",
|
|
"@showRxTxIndicators": {
|
|
"description": "Setting to show RX/TX indicators"
|
|
},
|
|
|
|
"displayPacketActivity": "Display packet activity indicators in top bar",
|
|
"@displayPacketActivity": {
|
|
"description": "Description for RX/TX indicators setting"
|
|
},
|
|
|
|
"language": "Language",
|
|
"@language": {
|
|
"description": "Language setting label"
|
|
},
|
|
|
|
"chooseLanguage": "Choose Language",
|
|
"@chooseLanguage": {
|
|
"description": "Language selection dialog title"
|
|
},
|
|
|
|
"english": "English",
|
|
"@english": {
|
|
"description": "English language option"
|
|
},
|
|
|
|
"slovenian": "Slovenian",
|
|
"@slovenian": {
|
|
"description": "Slovenian language option"
|
|
},
|
|
|
|
"croatian": "Croatian",
|
|
"@croatian": {
|
|
"description": "Croatian language option"
|
|
},
|
|
|
|
"german": "German",
|
|
"@german": {
|
|
"description": "German language option"
|
|
},
|
|
|
|
"spanish": "Spanish",
|
|
"@spanish": {
|
|
"description": "Spanish language option"
|
|
},
|
|
|
|
"french": "French",
|
|
"@french": {
|
|
"description": "French language option"
|
|
},
|
|
|
|
"italian": "Italian",
|
|
"@italian": {
|
|
"description": "Italian language option"
|
|
},
|
|
|
|
"locationBroadcasting": "Location Broadcasting",
|
|
"@locationBroadcasting": {
|
|
"description": "Location settings section header"
|
|
},
|
|
|
|
"autoLocationTracking": "Auto Location Tracking",
|
|
"@autoLocationTracking": {
|
|
"description": "Auto location tracking setting"
|
|
},
|
|
|
|
"automaticallyBroadcastPosition": "Automatically broadcast position updates",
|
|
"@automaticallyBroadcastPosition": {
|
|
"description": "Description for auto location tracking"
|
|
},
|
|
|
|
"configureTracking": "Configure Tracking",
|
|
"@configureTracking": {
|
|
"description": "Configure tracking button label"
|
|
},
|
|
|
|
"distanceAndTimeThresholds": "Distance and time thresholds",
|
|
"@distanceAndTimeThresholds": {
|
|
"description": "Description for tracking configuration"
|
|
},
|
|
|
|
"locationTrackingConfiguration": "Location Tracking Configuration",
|
|
"@locationTrackingConfiguration": {
|
|
"description": "Tracking configuration dialog title"
|
|
},
|
|
|
|
"configureWhenLocationBroadcasts": "Configure when location broadcasts are sent to the mesh network",
|
|
"@configureWhenLocationBroadcasts": {
|
|
"description": "Description for tracking configuration dialog"
|
|
},
|
|
|
|
"minimumDistance": "Minimum Distance",
|
|
"@minimumDistance": {
|
|
"description": "Minimum distance setting label"
|
|
},
|
|
|
|
"broadcastAfterMoving": "Broadcast only after moving {distance} meters",
|
|
"@broadcastAfterMoving": {
|
|
"description": "Description for minimum distance",
|
|
"placeholders": {
|
|
"distance": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
|
|
"maximumDistance": "Maximum Distance",
|
|
"@maximumDistance": {
|
|
"description": "Maximum distance setting label"
|
|
},
|
|
|
|
"alwaysBroadcastAfterMoving": "Always broadcast after moving {distance} meters",
|
|
"@alwaysBroadcastAfterMoving": {
|
|
"description": "Description for maximum distance",
|
|
"placeholders": {
|
|
"distance": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
|
|
"minimumTimeInterval": "Minimum Time Interval",
|
|
"@minimumTimeInterval": {
|
|
"description": "Minimum time interval setting label"
|
|
},
|
|
|
|
"alwaysBroadcastEvery": "Always broadcast every {duration}",
|
|
"@alwaysBroadcastEvery": {
|
|
"description": "Description for time interval",
|
|
"placeholders": {
|
|
"duration": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
|
|
"save": "Save",
|
|
"@save": {
|
|
"description": "Save button label"
|
|
},
|
|
|
|
"cancel": "Cancel",
|
|
"@cancel": {
|
|
"description": "Cancel button label"
|
|
},
|
|
|
|
"close": "Close",
|
|
"@close": {
|
|
"description": "Close button label"
|
|
},
|
|
|
|
"about": "About",
|
|
"@about": {
|
|
"description": "About section header"
|
|
},
|
|
|
|
"appVersion": "App Version",
|
|
"@appVersion": {
|
|
"description": "App version label"
|
|
},
|
|
|
|
"appName": "App Name",
|
|
"@appName": {
|
|
"description": "App name label"
|
|
},
|
|
|
|
"aboutMeshCoreSar": "About MeshCore SAR",
|
|
"@aboutMeshCoreSar": {
|
|
"description": "About dialog title"
|
|
},
|
|
|
|
"aboutDescription": "A Search & Rescue application designed for emergency response teams. Features include:\n\n• BLE mesh networking for device-to-device communication\n• Offline maps with multiple layer options\n• Real-time team member tracking\n• SAR tactical markers (found person, fire, staging)\n• Contact management and messaging\n• GPS tracking with compass heading\n• Map tile caching for offline use",
|
|
"@aboutDescription": {
|
|
"description": "About dialog description"
|
|
},
|
|
|
|
"technologiesUsed": "Technologies Used:",
|
|
"@technologiesUsed": {
|
|
"description": "Technologies used section title"
|
|
},
|
|
|
|
"technologiesList": "• Flutter for cross-platform development\n• BLE (Bluetooth Low Energy) for mesh networking\n• OpenStreetMap for mapping\n• Provider for state management\n• SharedPreferences for local storage",
|
|
"@technologiesList": {
|
|
"description": "List of technologies used"
|
|
},
|
|
|
|
"developer": "Developer",
|
|
"@developer": {
|
|
"description": "Developer section header"
|
|
},
|
|
|
|
"packageName": "Package Name",
|
|
"@packageName": {
|
|
"description": "Package name label"
|
|
},
|
|
|
|
"sampleData": "Sample Data",
|
|
"@sampleData": {
|
|
"description": "Sample data section header"
|
|
},
|
|
|
|
"sampleDataDescription": "Load or clear sample contacts, channel messages, and SAR markers for testing",
|
|
"@sampleDataDescription": {
|
|
"description": "Sample data section description"
|
|
},
|
|
|
|
"loadSampleData": "Load Sample Data",
|
|
"@loadSampleData": {
|
|
"description": "Load sample data button"
|
|
},
|
|
|
|
"clearAllData": "Clear All Data",
|
|
"@clearAllData": {
|
|
"description": "Clear all data button"
|
|
},
|
|
|
|
"clearAllDataConfirmTitle": "Clear All Data",
|
|
"@clearAllDataConfirmTitle": {
|
|
"description": "Clear data confirmation dialog title"
|
|
},
|
|
|
|
"clearAllDataConfirmMessage": "This will clear all contacts and SAR markers. Are you sure?",
|
|
"@clearAllDataConfirmMessage": {
|
|
"description": "Clear data confirmation message"
|
|
},
|
|
|
|
"clear": "Clear",
|
|
"@clear": {
|
|
"description": "Clear button label"
|
|
},
|
|
|
|
"loadedSampleData": "Loaded {teamCount} team members, {channelCount} channels, {sarCount} SAR markers, {messageCount} messages",
|
|
"@loadedSampleData": {
|
|
"description": "Success message after loading sample data",
|
|
"placeholders": {
|
|
"teamCount": {
|
|
"type": "int"
|
|
},
|
|
"channelCount": {
|
|
"type": "int"
|
|
},
|
|
"sarCount": {
|
|
"type": "int"
|
|
},
|
|
"messageCount": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
|
|
"failedToLoadSampleData": "Failed to load sample data: {error}",
|
|
"@failedToLoadSampleData": {
|
|
"description": "Error message when sample data fails to load",
|
|
"placeholders": {
|
|
"error": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
|
|
"allDataCleared": "All data cleared",
|
|
"@allDataCleared": {
|
|
"description": "Success message after clearing all data"
|
|
},
|
|
|
|
"failedToStartBackgroundTracking": "Failed to start background tracking. Check permissions and BLE connection.",
|
|
"@failedToStartBackgroundTracking": {
|
|
"description": "Error message when background tracking fails to start"
|
|
},
|
|
|
|
"locationBroadcast": "Location broadcast: {latitude}, {longitude}",
|
|
"@locationBroadcast": {
|
|
"description": "Success message for location broadcast",
|
|
"placeholders": {
|
|
"latitude": {
|
|
"type": "String"
|
|
},
|
|
"longitude": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
|
|
"defaultPinInfo": "The default pin for devices without a screen is 123456. Trouble pairing? Forget the bluetooth device in system settings.",
|
|
"@defaultPinInfo": {
|
|
"description": "Information about default PIN for pairing"
|
|
},
|
|
|
|
"noMessagesYet": "No messages yet",
|
|
"@noMessagesYet": {
|
|
"description": "Empty state message when there are no messages"
|
|
},
|
|
|
|
"pullDownToSync": "Pull down to sync messages",
|
|
"@pullDownToSync": {
|
|
"description": "Instruction to pull down to refresh messages"
|
|
},
|
|
|
|
"deleteContact": "Delete Contact",
|
|
"@deleteContact": {
|
|
"description": "Delete contact action label"
|
|
},
|
|
|
|
"delete": "Delete",
|
|
"@delete": {
|
|
"description": "Delete button label"
|
|
},
|
|
|
|
"viewOnMap": "View on Map",
|
|
"@viewOnMap": {
|
|
"description": "Action to view contact location on map"
|
|
},
|
|
|
|
"refresh": "Refresh",
|
|
"@refresh": {
|
|
"description": "Refresh button label"
|
|
},
|
|
|
|
"sendDirectMessage": "Send Direct Message",
|
|
"@sendDirectMessage": {
|
|
"description": "Action to send direct message to contact"
|
|
},
|
|
|
|
"resetPath": "Reset Path (Re-route)",
|
|
"@resetPath": {
|
|
"description": "Action to reset contact path for re-routing"
|
|
},
|
|
|
|
"publicKeyCopied": "Public key copied to clipboard",
|
|
"@publicKeyCopied": {
|
|
"description": "Success message when public key is copied"
|
|
},
|
|
|
|
"copiedToClipboard": "{label} copied to clipboard",
|
|
"@copiedToClipboard": {
|
|
"description": "Success message when a value is copied to clipboard",
|
|
"placeholders": {
|
|
"label": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
|
|
"pleaseEnterPassword": "Please enter a password",
|
|
"@pleaseEnterPassword": {
|
|
"description": "Validation message for empty password field"
|
|
},
|
|
|
|
"failedToSyncContacts": "Failed to sync contacts: {error}",
|
|
"@failedToSyncContacts": {
|
|
"description": "Error message when contact sync fails",
|
|
"placeholders": {
|
|
"error": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
|
|
"loggedInSuccessfully": "Logged in successfully! Waiting for room messages...",
|
|
"@loggedInSuccessfully": {
|
|
"description": "Success message after successful room login"
|
|
},
|
|
|
|
"loginFailed": "Login failed - incorrect password",
|
|
"@loginFailed": {
|
|
"description": "Error message when room login fails"
|
|
},
|
|
|
|
"loggingIn": "Logging in to {roomName}...",
|
|
"@loggingIn": {
|
|
"description": "Status message during room login process",
|
|
"placeholders": {
|
|
"roomName": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
|
|
"failedToSendLogin": "Failed to send login: {error}",
|
|
"@failedToSendLogin": {
|
|
"description": "Error message when login command fails to send",
|
|
"placeholders": {
|
|
"error": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
|
|
"lowLocationAccuracy": "Low Location Accuracy",
|
|
"@lowLocationAccuracy": {
|
|
"description": "Warning title for low GPS accuracy"
|
|
},
|
|
|
|
"continue_": "Continue",
|
|
"@continue_": {
|
|
"description": "Continue button label"
|
|
},
|
|
|
|
"sendSarMarker": "Send SAR marker",
|
|
"@sendSarMarker": {
|
|
"description": "Action to send SAR marker"
|
|
},
|
|
|
|
"deleteDrawing": "Delete Drawing",
|
|
"@deleteDrawing": {
|
|
"description": "Action to delete a map drawing"
|
|
},
|
|
|
|
"drawLine": "Draw Line",
|
|
"@drawLine": {
|
|
"description": "Map drawing mode: line"
|
|
},
|
|
|
|
"drawLineDesc": "Draw a freehand line on the map",
|
|
"@drawLineDesc": {
|
|
"description": "Description for line drawing mode"
|
|
},
|
|
|
|
"drawRectangle": "Draw Rectangle",
|
|
"@drawRectangle": {
|
|
"description": "Map drawing mode: rectangle"
|
|
},
|
|
|
|
"drawRectangleDesc": "Draw a rectangular area on the map",
|
|
"@drawRectangleDesc": {
|
|
"description": "Description for rectangle drawing mode"
|
|
},
|
|
|
|
"shareDrawings": "Share Drawings",
|
|
"@shareDrawings": {
|
|
"description": "Action to share drawings to network"
|
|
},
|
|
|
|
"clearAllDrawings": "Clear All Drawings",
|
|
"@clearAllDrawings": {
|
|
"description": "Action to clear all local drawings"
|
|
},
|
|
|
|
"clearAll": "Clear All",
|
|
"@clearAll": {
|
|
"description": "Clear all button label"
|
|
},
|
|
|
|
"noLocalDrawings": "No local drawings to share",
|
|
"@noLocalDrawings": {
|
|
"description": "Message when there are no drawings to share"
|
|
},
|
|
|
|
"publicChannel": "Public Channel",
|
|
"@publicChannel": {
|
|
"description": "Public channel option for sharing"
|
|
},
|
|
|
|
"broadcastToAll": "Broadcast to all nearby nodes (ephemeral)",
|
|
"@broadcastToAll": {
|
|
"description": "Description for public channel broadcast"
|
|
},
|
|
|
|
"storedPermanently": "Stored permanently in room",
|
|
"@storedPermanently": {
|
|
"description": "Description for room storage permanence"
|
|
},
|
|
|
|
"drawingsSentToPublicChannel": "Sent {count} map drawing{plural} to Public Channel",
|
|
"@drawingsSentToPublicChannel": {
|
|
"description": "System message when drawings are sent to public channel",
|
|
"placeholders": {
|
|
"count": {"type": "int"},
|
|
"plural": {"type": "String"}
|
|
}
|
|
},
|
|
|
|
"drawingsSharedToPublicChannel": "Shared {success}/{total} drawings to Public Channel",
|
|
"@drawingsSharedToPublicChannel": {
|
|
"description": "Snackbar message showing success count for drawings shared to public channel",
|
|
"placeholders": {
|
|
"success": {"type": "int"},
|
|
"total": {"type": "int"}
|
|
}
|
|
},
|
|
|
|
"notConnectedToDevice": "Not connected to device",
|
|
"@notConnectedToDevice": {
|
|
"description": "Error message when device is not connected for direct messaging"
|
|
},
|
|
|
|
"directMessage": "Direct Message",
|
|
"@directMessage": {
|
|
"description": "Title for direct message sheet"
|
|
},
|
|
|
|
"directMessageSentTo": "Direct message sent to {contactName}",
|
|
"@directMessageSentTo": {
|
|
"description": "Success message after sending direct message",
|
|
"placeholders": {
|
|
"contactName": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
|
|
"failedToSend": "Failed to send: {error}",
|
|
"@failedToSend": {
|
|
"description": "Error message when sending direct message fails",
|
|
"placeholders": {
|
|
"error": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
|
|
"directMessageInfo": "This message will be sent directly to {contactName}. It will also appear in the main messages feed.",
|
|
"@directMessageInfo": {
|
|
"description": "Information about direct messaging behavior",
|
|
"placeholders": {
|
|
"contactName": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
|
|
"typeYourMessage": "Type your message...",
|
|
"@typeYourMessage": {
|
|
"description": "Placeholder text for message input field"
|
|
},
|
|
|
|
"quickLocationMarker": "Quick location marker",
|
|
"@quickLocationMarker": {
|
|
"description": "Subtitle for SAR marker sheet header"
|
|
},
|
|
|
|
"markerType": "Marker Type",
|
|
"@markerType": {
|
|
"description": "Label for marker type selection section"
|
|
},
|
|
|
|
"sendTo": "Send To",
|
|
"@sendTo": {
|
|
"description": "Label for destination selection section"
|
|
},
|
|
|
|
"noDestinationsAvailable": "No destinations available.",
|
|
"@noDestinationsAvailable": {
|
|
"description": "Warning when no rooms or channels exist"
|
|
},
|
|
|
|
"selectDestination": "Select destination...",
|
|
"@selectDestination": {
|
|
"description": "Placeholder for destination dropdown"
|
|
},
|
|
|
|
"ephemeralBroadcastInfo": "Ephemeral: Broadcast over-the-air only. Not stored - nodes must be online.",
|
|
"@ephemeralBroadcastInfo": {
|
|
"description": "Information about ephemeral channel broadcasts"
|
|
},
|
|
|
|
"persistentRoomInfo": "Persistent: Stored immutably in room. Synced automatically and preserved offline.",
|
|
"@persistentRoomInfo": {
|
|
"description": "Information about persistent room storage"
|
|
},
|
|
|
|
"location": "Location",
|
|
"@location": {
|
|
"description": "Label for location section"
|
|
},
|
|
|
|
"fromMap": "From Map",
|
|
"@fromMap": {
|
|
"description": "Badge showing location is from map tap"
|
|
},
|
|
|
|
"gettingLocation": "Getting location...",
|
|
"@gettingLocation": {
|
|
"description": "Loading message while fetching GPS location"
|
|
},
|
|
|
|
"locationError": "Location Error",
|
|
"@locationError": {
|
|
"description": "Title for location error messages"
|
|
},
|
|
|
|
"retry": "Retry",
|
|
"@retry": {
|
|
"description": "Retry button label"
|
|
},
|
|
|
|
"refreshLocation": "Refresh location",
|
|
"@refreshLocation": {
|
|
"description": "Tooltip for refresh location button"
|
|
},
|
|
|
|
"accuracyMeters": "Accuracy: ±{accuracy}m",
|
|
"@accuracyMeters": {
|
|
"description": "Display of GPS accuracy in meters",
|
|
"placeholders": {
|
|
"accuracy": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
|
|
"notesOptional": "Notes (optional)",
|
|
"@notesOptional": {
|
|
"description": "Label for optional notes field"
|
|
},
|
|
|
|
"addAdditionalInformation": "Add additional information...",
|
|
"@addAdditionalInformation": {
|
|
"description": "Placeholder for notes field"
|
|
},
|
|
|
|
"lowAccuracyWarning": "Location accuracy is ±{accuracy}m. This may not be accurate enough for SAR operations.\n\nContinue anyway?",
|
|
"@lowAccuracyWarning": {
|
|
"description": "Warning dialog content for low GPS accuracy",
|
|
"placeholders": {
|
|
"accuracy": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
|
|
"loginToRoom": "Login to Room",
|
|
"@loginToRoom": {
|
|
"description": "Title for room login dialog"
|
|
},
|
|
|
|
"enterPasswordInfo": "Enter the password to access this room. The password will be saved for future use.",
|
|
"@enterPasswordInfo": {
|
|
"description": "Information about room password"
|
|
},
|
|
|
|
"password": "Password",
|
|
"@password": {
|
|
"description": "Password field label"
|
|
},
|
|
|
|
"enterRoomPassword": "Enter room password",
|
|
"@enterRoomPassword": {
|
|
"description": "Password field hint"
|
|
},
|
|
|
|
"loggingInDots": "Logging in...",
|
|
"@loggingInDots": {
|
|
"description": "Button text while logging in"
|
|
},
|
|
|
|
"login": "Login",
|
|
"@login": {
|
|
"description": "Login button label"
|
|
},
|
|
|
|
"failedToAddRoom": "Failed to add room to device: {error}\n\nThe room may not have advertised yet.\nTry waiting for the room to broadcast.",
|
|
"@failedToAddRoom": {
|
|
"description": "Error message when adding room fails",
|
|
"placeholders": {
|
|
"error": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
|
|
"direct": "Direct",
|
|
"@direct": {
|
|
"description": "Direct routing indicator"
|
|
},
|
|
|
|
"flood": "Flood",
|
|
"@flood": {
|
|
"description": "Flood routing indicator"
|
|
},
|
|
|
|
"admin": "Admin",
|
|
"@admin": {
|
|
"description": "Admin badge label"
|
|
},
|
|
|
|
"loggedIn": "Logged In",
|
|
"@loggedIn": {
|
|
"description": "Logged in status badge"
|
|
},
|
|
|
|
"noGpsData": "No GPS data",
|
|
"@noGpsData": {
|
|
"description": "Message when GPS data is not available"
|
|
},
|
|
|
|
"distance": "Distance",
|
|
"@distance": {
|
|
"description": "Distance label"
|
|
},
|
|
|
|
"pingingDirect": "Pinging {name} (direct via path)...",
|
|
"@pingingDirect": {
|
|
"description": "Status message for direct ping",
|
|
"placeholders": {
|
|
"name": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
|
|
"pingingFlood": "Pinging {name} (flooding - no path)...",
|
|
"@pingingFlood": {
|
|
"description": "Status message for flood ping",
|
|
"placeholders": {
|
|
"name": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
|
|
"directPingTimeout": "Direct ping timeout - retrying {name} with flooding...",
|
|
"@directPingTimeout": {
|
|
"description": "Warning when direct ping times out",
|
|
"placeholders": {
|
|
"name": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
|
|
"pingSuccessful": "Ping successful to {name}{fallback}",
|
|
"@pingSuccessful": {
|
|
"description": "Success message for ping",
|
|
"placeholders": {
|
|
"name": {
|
|
"type": "String"
|
|
},
|
|
"fallback": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
|
|
"viaFloodingFallback": " (via flooding fallback)",
|
|
"@viaFloodingFallback": {
|
|
"description": "Suffix for ping success with fallback"
|
|
},
|
|
|
|
"pingFailed": "Ping failed to {name} - no response received",
|
|
"@pingFailed": {
|
|
"description": "Error message when ping fails",
|
|
"placeholders": {
|
|
"name": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
|
|
"deleteContactConfirmation": "Are you sure you want to delete \"{name}\"?\n\nThis will remove the contact from both the app and the companion radio device.",
|
|
"@deleteContactConfirmation": {
|
|
"description": "Confirmation message for deleting contact",
|
|
"placeholders": {
|
|
"name": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
|
|
"removingContact": "Removing {name}...",
|
|
"@removingContact": {
|
|
"description": "Status message while removing contact",
|
|
"placeholders": {
|
|
"name": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
|
|
"contactRemoved": "Contact \"{name}\" removed",
|
|
"@contactRemoved": {
|
|
"description": "Success message after removing contact",
|
|
"placeholders": {
|
|
"name": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
|
|
"failedToRemoveContact": "Failed to remove contact: {error}",
|
|
"@failedToRemoveContact": {
|
|
"description": "Error message when contact removal fails",
|
|
"placeholders": {
|
|
"error": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
|
|
"type": "Type",
|
|
"@type": {
|
|
"description": "Contact type label"
|
|
},
|
|
|
|
"publicKey": "Public Key",
|
|
"@publicKey": {
|
|
"description": "Public key label"
|
|
},
|
|
|
|
"lastSeen": "Last Seen",
|
|
"@lastSeen": {
|
|
"description": "Last seen label"
|
|
},
|
|
|
|
"roomStatus": "Room Status",
|
|
"@roomStatus": {
|
|
"description": "Room status section header"
|
|
},
|
|
|
|
"loginStatus": "Login Status",
|
|
"@loginStatus": {
|
|
"description": "Login status label"
|
|
},
|
|
|
|
"notLoggedIn": "Not Logged In",
|
|
"@notLoggedIn": {
|
|
"description": "Not logged in status"
|
|
},
|
|
|
|
"adminAccess": "Admin Access",
|
|
"@adminAccess": {
|
|
"description": "Admin access label"
|
|
},
|
|
|
|
"yes": "Yes",
|
|
"@yes": {
|
|
"description": "Yes answer"
|
|
},
|
|
|
|
"no": "No",
|
|
"@no": {
|
|
"description": "No answer"
|
|
},
|
|
|
|
"permissions": "Permissions",
|
|
"@permissions": {
|
|
"description": "Permissions label"
|
|
},
|
|
|
|
"passwordSaved": "Password Saved",
|
|
"@passwordSaved": {
|
|
"description": "Password saved label"
|
|
},
|
|
|
|
"locationColon": "Location:",
|
|
"@locationColon": {
|
|
"description": "Location section header"
|
|
},
|
|
|
|
"telemetry": "Telemetry",
|
|
"@telemetry": {
|
|
"description": "Telemetry section header"
|
|
},
|
|
|
|
"requestingTelemetry": "Requesting telemetry from {name}...",
|
|
"@requestingTelemetry": {
|
|
"description": "Status message while requesting telemetry",
|
|
"placeholders": {
|
|
"name": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
|
|
"voltage": "Voltage",
|
|
"@voltage": {
|
|
"description": "Voltage label"
|
|
},
|
|
|
|
"battery": "Battery",
|
|
"@battery": {
|
|
"description": "Battery label"
|
|
},
|
|
|
|
"temperature": "Temperature",
|
|
"@temperature": {
|
|
"description": "Temperature label"
|
|
},
|
|
|
|
"humidity": "Humidity",
|
|
"@humidity": {
|
|
"description": "Humidity label"
|
|
},
|
|
|
|
"pressure": "Pressure",
|
|
"@pressure": {
|
|
"description": "Pressure label"
|
|
},
|
|
|
|
"gpsTelemetry": "GPS (Telemetry)",
|
|
"@gpsTelemetry": {
|
|
"description": "GPS from telemetry label"
|
|
},
|
|
|
|
"updated": "Updated",
|
|
"@updated": {
|
|
"description": "Updated timestamp label"
|
|
},
|
|
|
|
"pathResetInfo": "Path reset for {name}. Next message will find a new route.",
|
|
"@pathResetInfo": {
|
|
"description": "Info message after path reset",
|
|
"placeholders": {
|
|
"name": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
|
|
"reLoginToRoom": "Re-Login to Room",
|
|
"@reLoginToRoom": {
|
|
"description": "Button to re-login to room"
|
|
},
|
|
|
|
"heading": "Heading",
|
|
"@heading": {
|
|
"description": "Compass heading label"
|
|
},
|
|
|
|
"elevation": "Elevation",
|
|
"@elevation": {
|
|
"description": "Elevation/altitude label"
|
|
},
|
|
|
|
"accuracy": "Accuracy",
|
|
"@accuracy": {
|
|
"description": "GPS accuracy label"
|
|
},
|
|
|
|
"filterMarkers": "Filter Markers",
|
|
"@filterMarkers": {
|
|
"description": "Title for filter markers dialog"
|
|
},
|
|
|
|
"filterMarkersTooltip": "Filter markers",
|
|
"@filterMarkersTooltip": {
|
|
"description": "Tooltip for filter button"
|
|
},
|
|
|
|
"contactsFilter": "Contacts",
|
|
"@contactsFilter": {
|
|
"description": "Filter option for contacts"
|
|
},
|
|
|
|
"repeatersFilter": "Repeaters",
|
|
"@repeatersFilter": {
|
|
"description": "Filter option for repeaters"
|
|
},
|
|
|
|
"sarMarkers": "SAR Markers",
|
|
"@sarMarkers": {
|
|
"description": "SAR markers section header"
|
|
},
|
|
|
|
"foundPerson": "Found Person",
|
|
"@foundPerson": {
|
|
"description": "Found person SAR marker type"
|
|
},
|
|
|
|
"fire": "Fire",
|
|
"@fire": {
|
|
"description": "Fire SAR marker type"
|
|
},
|
|
|
|
"stagingArea": "Staging Area",
|
|
"@stagingArea": {
|
|
"description": "Staging area SAR marker type"
|
|
},
|
|
|
|
"showAll": "Show All",
|
|
"@showAll": {
|
|
"description": "Button to show all filters"
|
|
},
|
|
|
|
"nearbyContacts": "Nearby Contacts",
|
|
"@nearbyContacts": {
|
|
"description": "Title for nearby contacts list in compass"
|
|
},
|
|
|
|
"locationUnavailable": "Location unavailable",
|
|
"@locationUnavailable": {
|
|
"description": "Message when GPS location is unavailable"
|
|
},
|
|
|
|
"ahead": "ahead",
|
|
"@ahead": {
|
|
"description": "Relative bearing direction - ahead"
|
|
},
|
|
|
|
"degreesRight": "{degrees}° right",
|
|
"@degreesRight": {
|
|
"description": "Relative bearing direction - right",
|
|
"placeholders": {
|
|
"degrees": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
|
|
"degreesLeft": "{degrees}° left",
|
|
"@degreesLeft": {
|
|
"description": "Relative bearing direction - left",
|
|
"placeholders": {
|
|
"degrees": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
|
|
"latLonFormat": "Lat: {latitude} Lon: {longitude}",
|
|
"@latLonFormat": {
|
|
"description": "Latitude and longitude display format",
|
|
"placeholders": {
|
|
"latitude": {
|
|
"type": "String"
|
|
},
|
|
"longitude": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
|
|
"noContactsYet": "No contacts yet",
|
|
"@noContactsYet": {
|
|
"description": "Empty state message when there are no contacts"
|
|
},
|
|
|
|
"connectToDeviceToLoadContacts": "Connect to a device to load contacts",
|
|
"@connectToDeviceToLoadContacts": {
|
|
"description": "Instruction to connect device to load contacts"
|
|
},
|
|
|
|
"teamMembers": "Team Members",
|
|
"@teamMembers": {
|
|
"description": "Section header for team members (chat contacts)"
|
|
},
|
|
|
|
"repeaters": "Repeaters",
|
|
"@repeaters": {
|
|
"description": "Section header for repeater nodes"
|
|
},
|
|
|
|
"rooms": "Rooms",
|
|
"@rooms": {
|
|
"description": "Section header for rooms"
|
|
},
|
|
|
|
"channels": "Channels",
|
|
"@channels": {
|
|
"description": "Section header for broadcast channels"
|
|
},
|
|
|
|
"cacheStatistics": "Cache Statistics",
|
|
"@cacheStatistics": {
|
|
"description": "Title for cache statistics section"
|
|
},
|
|
|
|
"totalTiles": "Total Tiles",
|
|
"@totalTiles": {
|
|
"description": "Label for total number of cached tiles"
|
|
},
|
|
|
|
"cacheSize": "Cache Size",
|
|
"@cacheSize": {
|
|
"description": "Label for cache size in MB"
|
|
},
|
|
|
|
"storeName": "Store Name",
|
|
"@storeName": {
|
|
"description": "Label for cache store name"
|
|
},
|
|
|
|
"noCacheStatistics": "No cache statistics available",
|
|
"@noCacheStatistics": {
|
|
"description": "Message when cache statistics are unavailable"
|
|
},
|
|
|
|
"downloadRegion": "Download Region",
|
|
"@downloadRegion": {
|
|
"description": "Title for download region section"
|
|
},
|
|
|
|
"mapLayer": "Map Layer",
|
|
"@mapLayer": {
|
|
"description": "Label for map layer selection"
|
|
},
|
|
|
|
"regionBounds": "Region Bounds",
|
|
"@regionBounds": {
|
|
"description": "Title for region bounds input section"
|
|
},
|
|
|
|
"north": "North",
|
|
"@north": {
|
|
"description": "Label for north coordinate"
|
|
},
|
|
|
|
"south": "South",
|
|
"@south": {
|
|
"description": "Label for south coordinate"
|
|
},
|
|
|
|
"east": "East",
|
|
"@east": {
|
|
"description": "Label for east coordinate"
|
|
},
|
|
|
|
"west": "West",
|
|
"@west": {
|
|
"description": "Label for west coordinate"
|
|
},
|
|
|
|
"zoomLevels": "Zoom Levels",
|
|
"@zoomLevels": {
|
|
"description": "Title for zoom levels section"
|
|
},
|
|
|
|
"minZoom": "Min: {zoom}",
|
|
"@minZoom": {
|
|
"description": "Label for minimum zoom level",
|
|
"placeholders": {
|
|
"zoom": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
|
|
"maxZoom": "Max: {zoom}",
|
|
"@maxZoom": {
|
|
"description": "Label for maximum zoom level",
|
|
"placeholders": {
|
|
"zoom": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
|
|
"downloadingDots": "Downloading...",
|
|
"@downloadingDots": {
|
|
"description": "Status message during download"
|
|
},
|
|
|
|
"cancelDownload": "Cancel Download",
|
|
"@cancelDownload": {
|
|
"description": "Button to cancel download"
|
|
},
|
|
|
|
"downloadRegionButton": "Download Region",
|
|
"@downloadRegionButton": {
|
|
"description": "Button to start region download"
|
|
},
|
|
|
|
"downloadNote": "Note: Large regions or high zoom levels may take significant time and storage.",
|
|
"@downloadNote": {
|
|
"description": "Warning about download size and time"
|
|
},
|
|
|
|
"cacheManagement": "Cache Management",
|
|
"@cacheManagement": {
|
|
"description": "Title for cache management section"
|
|
},
|
|
|
|
"clearAllMaps": "Clear All Maps",
|
|
"@clearAllMaps": {
|
|
"description": "Button to clear all cached maps"
|
|
},
|
|
|
|
"clearMapsConfirmTitle": "Clear All Maps",
|
|
"@clearMapsConfirmTitle": {
|
|
"description": "Title for clear maps confirmation dialog"
|
|
},
|
|
|
|
"clearMapsConfirmMessage": "Are you sure you want to delete all downloaded maps? This action cannot be undone.",
|
|
"@clearMapsConfirmMessage": {
|
|
"description": "Confirmation message for clearing maps"
|
|
},
|
|
|
|
"mapDownloadCompleted": "Map download completed!",
|
|
"@mapDownloadCompleted": {
|
|
"description": "Success message after map download"
|
|
},
|
|
|
|
"cacheClearedSuccessfully": "Cache cleared successfully!",
|
|
"@cacheClearedSuccessfully": {
|
|
"description": "Success message after clearing cache"
|
|
},
|
|
|
|
"downloadCancelled": "Download cancelled",
|
|
"@downloadCancelled": {
|
|
"description": "Message when download is cancelled"
|
|
},
|
|
|
|
"startingDownload": "Starting download...",
|
|
"@startingDownload": {
|
|
"description": "Initial status when download begins"
|
|
},
|
|
|
|
"downloadingMapTiles": "Downloading map tiles...",
|
|
"@downloadingMapTiles": {
|
|
"description": "Status during tile download"
|
|
},
|
|
|
|
"downloadCompletedSuccessfully": "Download completed successfully!",
|
|
"@downloadCompletedSuccessfully": {
|
|
"description": "Status after successful download"
|
|
},
|
|
|
|
"cancellingDownload": "Cancelling download...",
|
|
"@cancellingDownload": {
|
|
"description": "Status while cancelling download"
|
|
},
|
|
|
|
"errorLoadingStats": "Error loading stats: {error}",
|
|
"@errorLoadingStats": {
|
|
"description": "Error message when loading cache stats fails",
|
|
"placeholders": {
|
|
"error": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
|
|
"downloadFailed": "Download failed: {error}",
|
|
"@downloadFailed": {
|
|
"description": "Error message when download fails",
|
|
"placeholders": {
|
|
"error": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
|
|
"cancelFailed": "Cancel failed: {error}",
|
|
"@cancelFailed": {
|
|
"description": "Error message when cancel fails",
|
|
"placeholders": {
|
|
"error": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
|
|
"clearCacheFailed": "Clear cache failed: {error}",
|
|
"@clearCacheFailed": {
|
|
"description": "Error message when clearing cache fails",
|
|
"placeholders": {
|
|
"error": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
|
|
"minZoomError": "Min zoom: {error}",
|
|
"@minZoomError": {
|
|
"description": "Validation error for minimum zoom",
|
|
"placeholders": {
|
|
"error": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
|
|
"maxZoomError": "Max zoom: {error}",
|
|
"@maxZoomError": {
|
|
"description": "Validation error for maximum zoom",
|
|
"placeholders": {
|
|
"error": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
|
|
"minZoomGreaterThanMax": "Minimum zoom must be less than or equal to maximum zoom",
|
|
"@minZoomGreaterThanMax": {
|
|
"description": "Validation error when min zoom > max zoom"
|
|
},
|
|
|
|
"selectMapLayer": "Select Map Layer",
|
|
"@selectMapLayer": {
|
|
"description": "Title for map layer selection dialog"
|
|
},
|
|
|
|
"mapOptions": "Map Options",
|
|
"@mapOptions": {
|
|
"description": "Title for map options dialog"
|
|
},
|
|
|
|
"showLegend": "Show Legend",
|
|
"@showLegend": {
|
|
"description": "Toggle for showing map legend"
|
|
},
|
|
|
|
"displayMarkerTypeCounts": "Display marker type counts",
|
|
"@displayMarkerTypeCounts": {
|
|
"description": "Description for show legend toggle"
|
|
},
|
|
|
|
"rotateMapWithHeading": "Rotate Map with Heading",
|
|
"@rotateMapWithHeading": {
|
|
"description": "Toggle for rotating map with compass heading"
|
|
},
|
|
|
|
"mapFollowsDirection": "Map follows your direction when moving",
|
|
"@mapFollowsDirection": {
|
|
"description": "Description for rotate map toggle"
|
|
},
|
|
|
|
"showMapDebugInfo": "Show Map Debug Info",
|
|
"@showMapDebugInfo": {
|
|
"description": "Toggle for showing map debug information"
|
|
},
|
|
|
|
"displayZoomLevelBounds": "Display zoom level and bounds",
|
|
"@displayZoomLevelBounds": {
|
|
"description": "Description for debug info toggle"
|
|
},
|
|
|
|
"fullscreenMode": "Fullscreen Mode",
|
|
"@fullscreenMode": {
|
|
"description": "Toggle for fullscreen map mode"
|
|
},
|
|
|
|
"hideUiFullMapView": "Hide all UI controls for full map view",
|
|
"@hideUiFullMapView": {
|
|
"description": "Description for fullscreen mode toggle"
|
|
},
|
|
|
|
"openStreetMap": "OpenStreetMap",
|
|
"@openStreetMap": {
|
|
"description": "OpenStreetMap layer name"
|
|
},
|
|
|
|
"openTopoMap": "OpenTopoMap",
|
|
"@openTopoMap": {
|
|
"description": "OpenTopoMap layer name"
|
|
},
|
|
|
|
"esriSatellite": "ESRI Satellite",
|
|
"@esriSatellite": {
|
|
"description": "ESRI Satellite imagery layer name"
|
|
},
|
|
|
|
"downloadVisibleArea": "Download visible area",
|
|
"@downloadVisibleArea": {
|
|
"description": "Tooltip for download visible area button"
|
|
},
|
|
|
|
"initializingMap": "Initializing map...",
|
|
"@initializingMap": {
|
|
"description": "Loading message for map initialization"
|
|
},
|
|
|
|
"dragToPosition": "Drag to Position",
|
|
"@dragToPosition": {
|
|
"description": "Label when dragging a pin on map"
|
|
},
|
|
|
|
"createSarMarker": "Create SAR Marker",
|
|
"@createSarMarker": {
|
|
"description": "Label for creating SAR marker from pin"
|
|
},
|
|
|
|
"compass": "Compass",
|
|
"@compass": {
|
|
"description": "Compass title in detailed compass dialog"
|
|
},
|
|
|
|
"navigationAndContacts": "Navigation & Contacts",
|
|
"@navigationAndContacts": {
|
|
"description": "Subtitle for compass dialog"
|
|
},
|
|
|
|
"sarAlert": "SAR ALERT",
|
|
"@sarAlert": {
|
|
"description": "Label for SAR alert badge on messages"
|
|
},
|
|
|
|
"messageSentToPublicChannel": "Message sent to public channel",
|
|
"@messageSentToPublicChannel": {
|
|
"description": "Success message when message is sent to public channel"
|
|
},
|
|
|
|
"pleaseSelectRoomToSendSar": "Please select a room to send SAR marker",
|
|
"@pleaseSelectRoomToSendSar": {
|
|
"description": "Error when no room is selected for SAR marker"
|
|
},
|
|
|
|
"failedToSendSarMarker": "Failed to send SAR marker: {error}",
|
|
"@failedToSendSarMarker": {
|
|
"description": "Error message when SAR marker fails to send",
|
|
"placeholders": {
|
|
"error": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
|
|
"sarMarkerSentTo": "SAR marker sent to {roomName}",
|
|
"@sarMarkerSentTo": {
|
|
"description": "Success message when SAR marker is sent to room",
|
|
"placeholders": {
|
|
"roomName": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
|
|
"notConnectedCannotSync": "Not connected - cannot sync messages",
|
|
"@notConnectedCannotSync": {
|
|
"description": "Warning when trying to sync messages while not connected"
|
|
},
|
|
|
|
"syncedMessageCount": "Synced {count} message(s)",
|
|
"@syncedMessageCount": {
|
|
"description": "Success message showing number of synced messages",
|
|
"placeholders": {
|
|
"count": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
|
|
"noNewMessages": "No new messages",
|
|
"@noNewMessages": {
|
|
"description": "Info message when no new messages to sync"
|
|
},
|
|
|
|
"syncFailed": "Sync failed: {error}",
|
|
"@syncFailed": {
|
|
"description": "Error message when sync fails",
|
|
"placeholders": {
|
|
"error": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
|
|
"failedToResendMessage": "Failed to resend message",
|
|
"@failedToResendMessage": {
|
|
"description": "Error when message retry fails"
|
|
},
|
|
|
|
"retryingMessage": "Retrying message...",
|
|
"@retryingMessage": {
|
|
"description": "Info message when retrying a failed message"
|
|
},
|
|
|
|
"retryFailed": "Retry failed: {error}",
|
|
"@retryFailed": {
|
|
"description": "Error message when retry fails",
|
|
"placeholders": {
|
|
"error": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
|
|
"textCopiedToClipboard": "Text copied to clipboard",
|
|
"@textCopiedToClipboard": {
|
|
"description": "Success message when text is copied"
|
|
},
|
|
|
|
"cannotReplySenderMissing": "Cannot reply: sender information missing",
|
|
"@cannotReplySenderMissing": {
|
|
"description": "Error when sender info is missing for reply"
|
|
},
|
|
|
|
"cannotReplyContactNotFound": "Cannot reply: contact not found",
|
|
"@cannotReplyContactNotFound": {
|
|
"description": "Error when contact not found for reply"
|
|
},
|
|
|
|
"messageDeleted": "Message deleted",
|
|
"@messageDeleted": {
|
|
"description": "Info message when message is deleted"
|
|
},
|
|
|
|
"refreshedContacts": "Refreshed contacts",
|
|
"@refreshedContacts": {
|
|
"description": "Success message when contacts are refreshed"
|
|
},
|
|
|
|
"justNow": "Just now",
|
|
"@justNow": {
|
|
"description": "Time indicator for very recent activity"
|
|
},
|
|
|
|
"minutesAgo": "{minutes}m ago",
|
|
"@minutesAgo": {
|
|
"description": "Time indicator for minutes ago",
|
|
"placeholders": {
|
|
"minutes": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
|
|
"hoursAgo": "{hours}h ago",
|
|
"@hoursAgo": {
|
|
"description": "Time indicator for hours ago",
|
|
"placeholders": {
|
|
"hours": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
|
|
"daysAgo": "{days}d ago",
|
|
"@daysAgo": {
|
|
"description": "Time indicator for days ago",
|
|
"placeholders": {
|
|
"days": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
|
|
"secondsAgo": "{seconds}s ago",
|
|
"@secondsAgo": {
|
|
"description": "Time indicator for seconds ago",
|
|
"placeholders": {
|
|
"seconds": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
|
|
"sending": "Sending...",
|
|
"@sending": {
|
|
"description": "Delivery status: sending"
|
|
},
|
|
|
|
"sent": "Sent",
|
|
"@sent": {
|
|
"description": "Delivery status: sent"
|
|
},
|
|
|
|
"delivered": "Delivered",
|
|
"@delivered": {
|
|
"description": "Delivery status: delivered"
|
|
},
|
|
|
|
"deliveredWithTime": "Delivered ({time}ms)",
|
|
"@deliveredWithTime": {
|
|
"description": "Delivery status with round-trip time",
|
|
"placeholders": {
|
|
"time": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
|
|
"failed": "Failed",
|
|
"@failed": {
|
|
"description": "Delivery status: failed"
|
|
},
|
|
|
|
"broadcast": "Broadcast",
|
|
"@broadcast": {
|
|
"description": "Delivery status for channel messages (no echoes yet)"
|
|
},
|
|
|
|
"sarMarkerFoundPerson": "Found Person",
|
|
"@sarMarkerFoundPerson": {
|
|
"description": "SAR marker type: found person"
|
|
},
|
|
|
|
"sarMarkerFire": "Fire Location",
|
|
"@sarMarkerFire": {
|
|
"description": "SAR marker type: fire"
|
|
},
|
|
|
|
"sarMarkerStagingArea": "Staging Area",
|
|
"@sarMarkerStagingArea": {
|
|
"description": "SAR marker type: staging area"
|
|
},
|
|
|
|
"sarMarkerObject": "Object Found",
|
|
"@sarMarkerObject": {
|
|
"description": "SAR marker type: object"
|
|
},
|
|
|
|
"from": "From",
|
|
"@from": {
|
|
"description": "Sender label in notifications"
|
|
},
|
|
|
|
"coordinates": "Coordinates",
|
|
"@coordinates": {
|
|
"description": "Coordinates label"
|
|
},
|
|
|
|
"tapToViewOnMap": "Tap to view on map",
|
|
"@tapToViewOnMap": {
|
|
"description": "Notification action text"
|
|
},
|
|
|
|
"radioSettings": "Radio Settings",
|
|
"@radioSettings": {
|
|
"description": "Section title for radio settings"
|
|
},
|
|
|
|
"frequencyMHz": "Frequency (MHz)",
|
|
"@frequencyMHz": {
|
|
"description": "Label for radio frequency field"
|
|
},
|
|
|
|
"frequencyExample": "e.g., 869.618",
|
|
"@frequencyExample": {
|
|
"description": "Helper text example for frequency"
|
|
},
|
|
|
|
"bandwidth": "Bandwidth",
|
|
"@bandwidth": {
|
|
"description": "Label for bandwidth dropdown"
|
|
},
|
|
|
|
"spreadingFactor": "Spreading Factor",
|
|
"@spreadingFactor": {
|
|
"description": "Label for spreading factor dropdown"
|
|
},
|
|
|
|
"codingRate": "Coding Rate",
|
|
"@codingRate": {
|
|
"description": "Label for coding rate dropdown"
|
|
},
|
|
|
|
"txPowerDbm": "TX Power (dBm)",
|
|
"@txPowerDbm": {
|
|
"description": "Label for TX power field"
|
|
},
|
|
|
|
"maxPowerDbm": "Max: {power} dBm",
|
|
"@maxPowerDbm": {
|
|
"description": "Helper text showing maximum TX power",
|
|
"placeholders": {
|
|
"power": { "type": "int" }
|
|
}
|
|
},
|
|
|
|
"you": "You",
|
|
"@you": {
|
|
"description": "Label for the current user in message bubbles"
|
|
},
|
|
|
|
"offlineVectorMaps": "Offline Vector Maps",
|
|
"@offlineVectorMaps": {
|
|
"description": "Title for offline vector maps section"
|
|
},
|
|
|
|
"offlineVectorMapsDescription": "Import and manage offline vector map tiles (MBTiles format) for use without internet connection",
|
|
"@offlineVectorMapsDescription": {
|
|
"description": "Description for offline vector maps section"
|
|
},
|
|
|
|
"importMbtiles": "Import MBTiles File",
|
|
"@importMbtiles": {
|
|
"description": "Button to import MBTiles file"
|
|
},
|
|
|
|
"importMbtilesNote": "Supports MBTiles files with vector tiles (PBF/MVT format). Geofabrik extracts work great!",
|
|
"@importMbtilesNote": {
|
|
"description": "Note about supported MBTiles file types"
|
|
},
|
|
|
|
"noMbtilesFiles": "No offline vector maps found",
|
|
"@noMbtilesFiles": {
|
|
"description": "Message when no MBTiles files are available"
|
|
},
|
|
|
|
"mbtilesImportedSuccessfully": "MBTiles file imported successfully",
|
|
"@mbtilesImportedSuccessfully": {
|
|
"description": "Success message after importing MBTiles file"
|
|
},
|
|
|
|
"failedToImportMbtiles": "Failed to import MBTiles file",
|
|
"@failedToImportMbtiles": {
|
|
"description": "Error message when MBTiles import fails"
|
|
},
|
|
|
|
"deleteMbtilesConfirmTitle": "Delete Offline Map",
|
|
"@deleteMbtilesConfirmTitle": {
|
|
"description": "Title for delete MBTiles confirmation dialog"
|
|
},
|
|
|
|
"deleteMbtilesConfirmMessage": "Are you sure you want to delete \"{name}\"? This will permanently remove the offline map.",
|
|
"@deleteMbtilesConfirmMessage": {
|
|
"description": "Confirmation message for deleting MBTiles file",
|
|
"placeholders": {
|
|
"name": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
|
|
"mbtilesDeletedSuccessfully": "Offline map deleted successfully",
|
|
"@mbtilesDeletedSuccessfully": {
|
|
"description": "Success message after deleting MBTiles file"
|
|
},
|
|
|
|
"failedToDeleteMbtiles": "Failed to delete offline map",
|
|
"@failedToDeleteMbtiles": {
|
|
"description": "Error message when MBTiles deletion fails"
|
|
},
|
|
|
|
"vectorTiles": "Vector Tiles",
|
|
"@vectorTiles": {
|
|
"description": "Label for vector tile type"
|
|
},
|
|
|
|
"schema": "Schema",
|
|
"@schema": {
|
|
"description": "Label for vector tile schema"
|
|
},
|
|
|
|
"unknown": "Unknown",
|
|
"@unknown": {
|
|
"description": "Unknown value label"
|
|
},
|
|
|
|
"bounds": "Bounds",
|
|
"@bounds": {
|
|
"description": "Label for geographic bounds"
|
|
},
|
|
|
|
"onlineLayers": "Online Layers",
|
|
"@onlineLayers": {
|
|
"description": "Section header for online map layers"
|
|
},
|
|
|
|
"offlineLayers": "Offline Layers",
|
|
"@offlineLayers": {
|
|
"description": "Section header for offline map layers (MBTiles)"
|
|
},
|
|
|
|
"locationTrail": "Location Trail",
|
|
"@locationTrail": {
|
|
"description": "Location trail title"
|
|
},
|
|
|
|
"showTrailOnMap": "Show Trail on Map",
|
|
"@showTrailOnMap": {
|
|
"description": "Toggle to show/hide trail on map"
|
|
},
|
|
|
|
"trailVisible": "Trail is visible on the map",
|
|
"@trailVisible": {
|
|
"description": "Trail visibility status - visible"
|
|
},
|
|
|
|
"trailHiddenRecording": "Trail is hidden (still recording)",
|
|
"@trailHiddenRecording": {
|
|
"description": "Trail visibility status - hidden but recording"
|
|
},
|
|
|
|
"distance": "Distance",
|
|
"@distance": {
|
|
"description": "Distance label"
|
|
},
|
|
|
|
"duration": "Duration",
|
|
"@duration": {
|
|
"description": "Duration label"
|
|
},
|
|
|
|
"points": "Points",
|
|
"@points": {
|
|
"description": "Trail points count label"
|
|
},
|
|
|
|
"clearTrail": "Clear Trail",
|
|
"@clearTrail": {
|
|
"description": "Button to clear location trail"
|
|
},
|
|
|
|
"clearTrailQuestion": "Clear Trail?",
|
|
"@clearTrailQuestion": {
|
|
"description": "Confirmation dialog title"
|
|
},
|
|
|
|
"clearTrailConfirmation": "Are you sure you want to clear the current location trail? This action cannot be undone.",
|
|
"@clearTrailConfirmation": {
|
|
"description": "Confirmation dialog message"
|
|
},
|
|
|
|
"noTrailRecorded": "No trail recorded yet",
|
|
"@noTrailRecorded": {
|
|
"description": "Message when no trail exists"
|
|
},
|
|
|
|
"startTrackingToRecord": "Start location tracking to record your trail",
|
|
"@startTrackingToRecord": {
|
|
"description": "Instructions to start trail recording"
|
|
},
|
|
|
|
"trailControls": "Trail Controls",
|
|
"@trailControls": {
|
|
"description": "Trail controls tooltip"
|
|
},
|
|
|
|
"deviceInformation": "Device Information",
|
|
"@deviceInformation": {
|
|
"description": "Device information section header"
|
|
},
|
|
|
|
"bleName": "BLE Name",
|
|
"@bleName": {
|
|
"description": "Bluetooth Low Energy device name label"
|
|
},
|
|
|
|
"meshName": "Mesh Name",
|
|
"@meshName": {
|
|
"description": "Mesh network name label"
|
|
},
|
|
|
|
"notSet": "Not set",
|
|
"@notSet": {
|
|
"description": "Label when a value is not set"
|
|
},
|
|
|
|
"model": "Model",
|
|
"@model": {
|
|
"description": "Device model label"
|
|
},
|
|
|
|
"version": "Version",
|
|
"@version": {
|
|
"description": "Version label"
|
|
},
|
|
|
|
"buildDate": "Build Date",
|
|
"@buildDate": {
|
|
"description": "Firmware build date label"
|
|
},
|
|
|
|
"firmware": "Firmware",
|
|
"@firmware": {
|
|
"description": "Firmware label"
|
|
},
|
|
|
|
"maxContacts": "Max Contacts",
|
|
"@maxContacts": {
|
|
"description": "Maximum contacts capacity label"
|
|
},
|
|
|
|
"maxChannels": "Max Channels",
|
|
"@maxChannels": {
|
|
"description": "Maximum channels capacity label"
|
|
},
|
|
|
|
"publicInfo": "Public Info",
|
|
"@publicInfo": {
|
|
"description": "Public information section header"
|
|
},
|
|
|
|
"meshNetworkName": "Mesh Network Name",
|
|
"@meshNetworkName": {
|
|
"description": "Mesh network name field label"
|
|
},
|
|
|
|
"nameBroadcastInMesh": "Name broadcast in mesh advertisements",
|
|
"@nameBroadcastInMesh": {
|
|
"description": "Helper text for mesh network name field"
|
|
},
|
|
|
|
"telemetryAndLocationSharing": "Telemetry & Location Sharing",
|
|
"@telemetryAndLocationSharing": {
|
|
"description": "Telemetry and location sharing toggle label"
|
|
},
|
|
|
|
"lat": "Lat",
|
|
"@lat": {
|
|
"description": "Latitude field label (short form)"
|
|
},
|
|
|
|
"lon": "Lon",
|
|
"@lon": {
|
|
"description": "Longitude field label (short form)"
|
|
},
|
|
|
|
"useCurrentLocation": "Use current location",
|
|
"@useCurrentLocation": {
|
|
"description": "Tooltip for use current location button"
|
|
},
|
|
|
|
"noneUnknown": "None/Unknown",
|
|
"@noneUnknown": {
|
|
"description": "Device type: none or unknown"
|
|
},
|
|
|
|
"chatNode": "Chat Node",
|
|
"@chatNode": {
|
|
"description": "Device type: chat node"
|
|
},
|
|
|
|
"repeater": "Repeater",
|
|
"@repeater": {
|
|
"description": "Device type: repeater"
|
|
},
|
|
|
|
"roomChannel": "Room/Channel",
|
|
"@roomChannel": {
|
|
"description": "Device type: room or channel"
|
|
},
|
|
|
|
"typeNumber": "Type {number}",
|
|
"@typeNumber": {
|
|
"description": "Generic device type with number",
|
|
"placeholders": {
|
|
"number": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
|
|
"copiedToClipboardShort": "Copied {label} to clipboard",
|
|
"@copiedToClipboardShort": {
|
|
"description": "Short success message when copying to clipboard",
|
|
"placeholders": {
|
|
"label": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
|
|
"failedToSave": "Failed to save: {error}",
|
|
"@failedToSave": {
|
|
"description": "Generic error message for save failures",
|
|
"placeholders": {
|
|
"error": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
|
|
"failedToGetLocation": "Failed to get location: {error}",
|
|
"@failedToGetLocation": {
|
|
"description": "Error message when getting location fails",
|
|
"placeholders": {
|
|
"error": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
}
|
|
}
|