{ "language": { "name": "English" }, "app": { "title": "DeFlock" }, "about": { "title": "DeFlock - Surveillance Transparency", "description": "DeFlock is a privacy-focused mobile app for mapping public surveillance infrastructure using OpenStreetMap. Document cameras, ALPRs, gunshot detectors, and other surveillance devices in your community to make this infrastructure visible and searchable.", "features": "• Offline-capable mapping with downloadable areas\n• Upload directly to OpenStreetMap with OAuth2\n• Built-in profiles for major manufacturers\n• Privacy-respecting - no user data collected\n• Multiple map tile providers (OSM, satellite imagery)", "initiative": "Part of the broader DeFlock initiative to promote surveillance transparency.", "footer": "Visit: deflock.me\nBuilt with Flutter • Open Source" }, "actions": { "tagNode": "New Node", "download": "Download", "settings": "Settings", "edit": "Edit", "delete": "Delete", "cancel": "Cancel", "ok": "OK", "close": "Close", "submit": "Submit", "saveEdit": "Save Edit", "clear": "Clear" }, "followMe": { "off": "Enable follow-me (north up)", "northUp": "Enable follow-me (rotating)", "rotating": "Disable follow-me" }, "settings": { "title": "Settings", "language": "Language", "systemDefault": "System Default", "aboutInfo": "About / Info", "aboutThisApp": "About This App", "aboutSubtitle": "App information and credits", "languageSubtitle": "Choose your preferred language", "maxNodes": "Max nodes drawn", "maxNodesSubtitle": "Set an upper limit for the number of nodes on the map (default: 250).", "maxNodesWarning": "You probably don't want to do that unless you are absolutely sure you have a good reason for it.", "offlineMode": "Offline Mode", "offlineModeSubtitle": "Disable all network requests except for local/offline areas.", "offlineModeWarningTitle": "Active Downloads", "offlineModeWarningMessage": "Enabling offline mode will cancel any active area downloads. Do you want to continue?", "enableOfflineMode": "Enable Offline Mode", "profiles": "Profiles", "profilesSubtitle": "Manage node and operator profiles", "offlineSettings": "Offline Settings", "offlineSettingsSubtitle": "Manage offline mode and downloaded areas", "advancedSettings": "Advanced Settings", "advancedSettingsSubtitle": "Performance, alerts, and tile provider settings", "proximityAlerts": "Proximity Alerts", "networkStatusIndicator": "Network Status Indicator" }, "proximityAlerts": { "getNotified": "Get notified when approaching surveillance devices", "batteryUsage": "Uses extra battery for continuous location monitoring", "notificationsEnabled": "✓ Notifications enabled", "notificationsDisabled": "⚠ Notifications disabled", "permissionRequired": "Notification permission required", "permissionExplanation": "Push notifications are disabled. You'll only see in-app alerts and won't be notified when the app is in background.", "enableNotifications": "Enable Notifications", "checkingPermissions": "Checking permissions...", "alertDistance": "Alert distance: ", "meters": "meters", "rangeInfo": "Range: {}-{} meters (default: {})" }, "node": { "title": "Node #{}", "tagSheetTitle": "Surveillance Device Tags", "queuedForUpload": "Node queued for upload", "editQueuedForUpload": "Node edit queued for upload", "deleteQueuedForUpload": "Node deletion queued for upload", "confirmDeleteTitle": "Delete Node", "confirmDeleteMessage": "Are you sure you want to delete node #{}? This action cannot be undone." }, "addNode": { "profile": "Profile", "direction": "Direction {}°", "profileNoDirectionInfo": "This profile does not require a direction.", "mustBeLoggedIn": "You must be logged in to submit new nodes. Please log in via Settings.", "enableSubmittableProfile": "Enable a submittable profile in Settings to submit new nodes.", "profileViewOnlyWarning": "This profile is for map viewing only. Please select a submittable profile to submit new nodes.", "refineTags": "Refine Tags", "refineTagsWithProfile": "Refine Tags ({})" }, "editNode": { "title": "Edit Node #{}", "profile": "Profile", "direction": "Direction {}°", "profileNoDirectionInfo": "This profile does not require a direction.", "mustBeLoggedIn": "You must be logged in to edit nodes. Please log in via Settings.", "sandboxModeWarning": "Cannot submit edits on production nodes to sandbox. Switch to Production mode in Settings to edit nodes.", "enableSubmittableProfile": "Enable a submittable profile in Settings to edit nodes.", "profileViewOnlyWarning": "This profile is for map viewing only. Please select a submittable profile to edit nodes.", "refineTags": "Refine Tags", "refineTagsWithProfile": "Refine Tags ({})" }, "download": { "title": "Download Map Area", "maxZoomLevel": "Max zoom level", "storageEstimate": "Storage estimate:", "tilesAndSize": "{} tiles, {} MB", "minZoom": "Min zoom:", "maxRecommendedZoom": "Max recommended zoom: Z{}", "withinTileLimit": "Within {} tile limit", "exceedsTileLimit": "Current selection exceeds {} tile limit", "offlineModeWarning": "Downloads disabled while in offline mode. Disable offline mode to download new areas.", "downloadStarted": "Download started! Fetching tiles and nodes...", "downloadFailed": "Failed to start download: {}" }, "uploadMode": { "title": "Upload Destination", "subtitle": "Choose where cameras are uploaded", "production": "Production", "sandbox": "Sandbox", "simulate": "Simulate", "productionDescription": "Upload to the live OSM database (visible to all users)", "sandboxDescription": "Uploads go to the OSM Sandbox (safe for testing, resets regularly).", "simulateDescription": "Simulate uploads (does not contact OSM servers)" }, "auth": { "loggedInAs": "Logged in as {}", "loginToOSM": "Log in to OpenStreetMap", "tapToLogout": "Tap to logout", "requiredToSubmit": "Required to submit camera data", "loggedOut": "Logged out", "testConnection": "Test Connection", "testConnectionSubtitle": "Verify OSM credentials are working", "connectionOK": "Connection OK - credentials are valid", "connectionFailed": "Connection failed - please re-login" }, "queue": { "pendingUploads": "Pending uploads: {}", "simulateModeEnabled": "Simulate mode enabled – uploads simulated", "sandboxMode": "Sandbox mode – uploads go to OSM Sandbox", "tapToViewQueue": "Tap to view queue", "clearUploadQueue": "Clear Upload Queue", "removeAllPending": "Remove all {} pending uploads", "clearQueueTitle": "Clear Queue", "clearQueueConfirm": "Remove all {} pending uploads?", "queueCleared": "Queue cleared", "uploadQueueTitle": "Upload Queue ({} items)", "queueIsEmpty": "Queue is empty", "cameraWithIndex": "Camera {}", "error": " (Error)", "completing": " (Completing...)", "destination": "Dest: {}", "latitude": "Lat: {}", "longitude": "Lon: {}", "direction": "Direction: {}°", "attempts": "Attempts: {}", "uploadFailedRetry": "Upload failed. Tap retry to try again.", "retryUpload": "Retry upload", "clearAll": "Clear All" }, "tileProviders": { "title": "Tile Providers", "noProvidersConfigured": "No tile providers configured", "tileTypesCount": "{} tile types", "apiKeyConfigured": "API Key configured", "needsApiKey": "Needs API key", "editProvider": "Edit Provider", "addProvider": "Add Provider", "deleteProvider": "Delete Provider", "deleteProviderConfirm": "Are you sure you want to delete \"{}\"?", "providerName": "Provider Name", "providerNameHint": "e.g., Custom Maps Inc.", "providerNameRequired": "Provider name is required", "apiKey": "API Key (Optional)", "apiKeyHint": "Enter API key if required by tile types", "tileTypes": "Tile Types", "addType": "Add Type", "noTileTypesConfigured": "No tile types configured", "atLeastOneTileTypeRequired": "At least one tile type is required", "manageTileProviders": "Manage Providers" }, "tileTypeEditor": { "editTileType": "Edit Tile Type", "addTileType": "Add Tile Type", "name": "Name", "nameHint": "e.g., Satellite", "nameRequired": "Name is required", "urlTemplate": "URL Template", "urlTemplateHint": "https://example.com/{z}/{x}/{y}.png", "urlTemplateRequired": "URL template is required", "urlTemplatePlaceholders": "URL must contain {z}, {x}, and {y} placeholders", "attribution": "Attribution", "attributionHint": "© Map Provider", "attributionRequired": "Attribution is required", "maxZoom": "Max Zoom Level", "maxZoomHint": "Maximum zoom level (1-23)", "maxZoomRequired": "Max zoom is required", "maxZoomInvalid": "Max zoom must be a number", "maxZoomRange": "Max zoom must be between {} and {}", "fetchPreview": "Fetch Preview", "previewTileLoaded": "Preview tile loaded successfully", "previewTileFailed": "Failed to fetch preview: {}", "save": "Save" }, "profiles": { "nodeProfiles": "Node Profiles", "newProfile": "New Profile", "builtIn": "Built-in", "custom": "Custom", "view": "View", "deleteProfile": "Delete Profile", "deleteProfileConfirm": "Are you sure you want to delete \"{}\"?", "profileDeleted": "Profile deleted" }, "mapTiles": { "title": "Map Tiles", "manageProviders": "Manage Providers", "attribution": "Map Attribution" }, "profileEditor": { "viewProfile": "View Profile", "newProfile": "New Profile", "editProfile": "Edit Profile", "profileName": "Profile name", "profileNameHint": "e.g., Custom ALPR Camera", "profileNameRequired": "Profile name is required", "requiresDirection": "Requires Direction", "requiresDirectionSubtitle": "Whether cameras of this type need a direction tag", "submittable": "Submittable", "submittableSubtitle": "Whether this profile can be used for camera submissions", "osmTags": "OSM Tags", "addTag": "Add tag", "saveProfile": "Save Profile", "keyHint": "key", "valueHint": "value", "atLeastOneTagRequired": "At least one tag is required", "profileSaved": "Profile \"{}\" saved" }, "operatorProfileEditor": { "newOperatorProfile": "New Operator Profile", "editOperatorProfile": "Edit Operator Profile", "operatorName": "Operator name", "operatorNameHint": "e.g., Austin Police Department", "operatorNameRequired": "Operator name is required", "operatorProfileSaved": "Operator profile \"{}\" saved" }, "operatorProfiles": { "title": "Operator Profiles", "noProfilesMessage": "No operator profiles defined. Create one to apply operator tags to node submissions.", "tagsCount": "{} tags", "deleteOperatorProfile": "Delete Operator Profile", "deleteOperatorProfileConfirm": "Are you sure you want to delete \"{}\"?", "operatorProfileDeleted": "Operator profile deleted" }, "offlineAreas": { "title": "Offline Areas", "noAreasTitle": "No offline areas", "noAreasSubtitle": "Download a map area for offline use.", "provider": "Provider", "maxZoom": "Max zoom", "zoomLevels": "Z{}-{}", "latitude": "Lat", "longitude": "Lon", "tiles": "Tiles", "size": "Size", "nodes": "Nodes", "areaIdFallback": "Area {}...", "renameArea": "Rename area", "refreshWorldTiles": "Refresh/re-download world tiles", "deleteOfflineArea": "Delete offline area", "cancelDownload": "Cancel download", "renameAreaDialogTitle": "Rename Offline Area", "areaNameLabel": "Area Name", "renameButton": "Rename", "megabytes": "MB", "kilobytes": "KB", "progress": "{}%", "refreshArea": "Refresh area", "refreshAreaDialogTitle": "Refresh Offline Area", "refreshAreaDialogSubtitle": "Choose what to refresh for this area:", "refreshTiles": "Refresh Map Tiles", "refreshTilesSubtitle": "Re-download all tiles for updated imagery", "refreshNodes": "Refresh Nodes", "refreshNodesSubtitle": "Re-fetch node data for this area", "startRefresh": "Start Refresh", "refreshStarted": "Refresh started!", "refreshFailed": "Refresh failed: {}" }, "refineTagsSheet": { "title": "Refine Tags", "operatorProfile": "Operator Profile", "done": "Done", "none": "None", "noAdditionalOperatorTags": "No additional operator tags", "additionalTags": "additional tags", "additionalTagsTitle": "Additional Tags", "noTagsDefinedForProfile": "No tags defined for this operator profile.", "noOperatorProfiles": "No operator profiles defined", "noOperatorProfilesMessage": "Create operator profiles in Settings to apply additional tags to your node submissions." }, "layerSelector": { "cannotChangeTileTypes": "Cannot change tile types while downloading offline areas", "selectMapLayer": "Select Map Layer", "noTileProvidersAvailable": "No tile providers available" }, "networkStatus": { "showIndicator": "Show network status indicator", "showIndicatorSubtitle": "Display network loading and error status on the map" }, "navigation": { "searchLocation": "Search Location", "searchPlaceholder": "Search places or coordinates...", "routeTo": "Route To", "routeFrom": "Route From", "selectLocation": "Select Location", "calculatingRoute": "Calculating route...", "routeCalculationFailed": "Route calculation failed", "start": "Start", "resume": "Resume", "endRoute": "End Route", "routeOverview": "Route Overview", "retry": "Retry", "cancelSearch": "Cancel search", "noResultsFound": "No results found", "searching": "Searching...", "location": "Location", "startPoint": "Start", "endPoint": "End", "startSelect": "Start (select)", "endSelect": "End (select)", "distance": "Distance: {} km", "routeActive": "Route active", "navigationSettings": "Navigation", "navigationSettingsSubtitle": "Route planning and avoidance settings", "avoidanceDistance": "Avoidance Distance", "avoidanceDistanceSubtitle": "Minimum distance to stay away from surveillance devices", "searchHistory": "Max Search History", "searchHistorySubtitle": "Maximum number of recent searches to remember", "units": "Units", "unitsSubtitle": "Display units for distances and measurements", "metric": "Metric (km, m)", "imperial": "Imperial (mi, ft)", "meters": "meters", "feet": "feet" } }