mirror of
https://github.com/FoggedLens/deflock-app.git
synced 2026-02-13 01:03:03 +00:00
345 lines
14 KiB
JSON
345 lines
14 KiB
JSON
{
|
||
"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"
|
||
}
|
||
} |