{
  "projectHistory": {
    "title": "Project History",
    "description": "Browse autosaved snapshots stored on this device.",
    "empty": "No autosaved snapshots yet.",
    "summary": "{{count}} layers · zoom {{zoom}}",
    "restore": "Restore",
    "discard": "Discard",
    "restoreError": "Could not restore this snapshot. It may be damaged or incompatible with this GeoLibre version.",
    "recoveryTitle": "Recover unsaved work?",
    "recoveryDescription": "GeoLibre did not close cleanly. A newer autosave of “{{name}}” is available."
  },
  "browser": {
    "title": "Browser",
    "services": "Services",
    "recent": "Recent",
    "databases": "Databases",
    "newDatabaseConnection": "New database connection",
    "searchPlaceholder": "Search data sources",
    "empty": "No saved services or recent projects yet.",
    "emptyGroup": "Empty",
    "noMatches": "No matches.",
    "addFailed": "Could not add this data source.",
    "builtinBadge": "built-in",
    "newConnection": "New {{kind}} connection",
    "loadingTables": "Loading tables…",
    "files": "Files",
    "addFolder": "Add folder",
    "addFolderFailed": "Could not add this folder.",
    "addFileFailed": "Could not add this file.",
    "loadFolderFailed": "Could not read this folder.",
    "unpinFolder": "Remove “{{name}}” from the list",
    "loadingFolder": "Loading…",
    "folderTruncated": "Showing first {{shown}} of {{total}}",
    "favorites": "Favorites",
    "favorite": "Add “{{name}}” to favorites",
    "unfavorite": "Remove “{{name}}” from favorites",
    "favoriteMissing": "That data source no longer exists — removed from Favorites.",
    "myData": "My Data",
    "renameLibraryLayer": "Rename “{{name}}”",
    "deleteLibraryLayer": "Remove “{{name}}” from My Data",
    "desktopOnlyBadge": "desktop",
    "importLibrary": "Import saved layers",
    "exportLibrary": "Export saved layers",
    "libraryFilterName": "Layer library JSON",
    "libraryImportFailed": "Could not read this layer library file.",
    "libraryExportFailed": "Could not export the layer library.",
    "libraryLayerMissing": "That saved layer no longer exists.",
    "libraryLayerNeedsDesktop": "This saved layer reads a file from disk, so it needs GeoLibre Desktop. Add the file again to save a new entry.",
    "libraryLayerConfigNotApplied": "Added the file for “{{name}}”, but its saved styling could not be matched to a single layer, so it was not reapplied.",
    "libraryLayerJoinsUnresolved_one": "Added the layer, but 1 saved join could not be reapplied: the layer it joins to is not in this project.",
    "libraryLayerJoinsUnresolved_other": "Added the layer, but {{count}} saved joins could not be reapplied: the layers they join to are not in this project."
  },
  "about": {
    "trigger": "About",
    "title": "About GeoLibre",
    "description": "GeoLibre is a lightweight cloud-native GIS platform.",
    "version": "Version",
    "checkForUpdates": "Check for updates",
    "tryAgain": "Try again",
    "checking": "Checking for updates",
    "upToDate": "You are up to date ({{version}}).",
    "upToDateNoVersion": "You are up to date.",
    "generalSectionTitle": "General",
    "homePage": "Home page",
    "githubRepository": "GitHub repository"
  },
  "updates": {
    "changelogTitle": "What's new",
    "noChangelog": "Release notes are not available. See the downloads page for details.",
    "stepsTitle": "How to update",
    "download": "Download update",
    "steps": {
      "download": "Download the installer for your platform from the downloads page.",
      "install": "Run the installer. Your local projects, settings, and API keys are kept.",
      "reopen": "Reopen GeoLibre to finish updating."
    },
    "severity": {
      "major": "Major release",
      "minor": "Feature update",
      "patch": "Patch update"
    },
    "available": {
      "title": "{{version}} is available",
      "fallback": "A new version",
      "summary": "You are running {{current}}."
    },
    "error": {
      "message": "Could not check for updates.",
      "rateLimit": "GitHub rate limit exceeded. Please try again later.",
      "http": "GitHub returned {{status}}.",
      "noTag": "The latest release does not include a version tag.",
      "network": "Could not reach GitHub. Check your connection and try again.",
      "viewDownloads": "View downloads",
      "viewDownloadsHint": "Opens the GeoLibre downloads page in your browser so you can check the latest version manually."
    },
    "startup": {
      "title": "Update available",
      "currentVersion": "Your current version",
      "latestVersion": "Latest available version",
      "download": "Download update package",
      "remindLater": "Remind me later",
      "skipVersion": "Skip this version",
      "settingsHint": "You can change update checks in Settings → Updates."
    }
  },
  "masBuild": {
    "unavailable": "This feature is not available in the Mac App Store version of GeoLibre Desktop."
  },
  "bookmark": {
    "captureStateLabel": "Include complete layer state (active, inactive, and layer order)",
    "captureStateTooltip": "Applies to the bookmark you save next, not as a global setting. Leave it on to restore exactly this layer arrangement later.",
    "export": "Export",
    "exportSelected": "Export Selected",
    "exportAll": "Export All",
    "newFolder": "New Folder",
    "defaultFolderName": "Folder"
  },
  "managePlugins": {
    "failed": "Failed",
    "failedToLoad": "Failed to load: {{message}}",
    "trust": {
      "title": "Load plugins from this project?",
      "description_one": "This project wants to load 1 external plugin from a URL you have not installed. Plugins run code with full access to the app.",
      "description_other": "This project wants to load {{count}} external plugins from URLs you have not installed. Plugins run code with full access to the app.",
      "warning": "Only load plugins from sources you trust. Loaded plugins run with the same privileges as GeoLibre itself.",
      "trustButton": "Trust and load",
      "dismissButton": "Don't load"
    },
    "title": "Manage Plugins",
    "searchAria": "Search plugins",
    "searchPlaceholder": "Search plugins",
    "refresh": "Refresh",
    "loadingRegistry": "Loading registry…",
    "registryEmpty": "No plugins are listed in the registry.",
    "noPluginsHere": "No plugins here.",
    "sectionAll": "All ({{total}})",
    "sectionInstalled": "Installed ({{total}})",
    "sectionNotInstalled": "Not installed ({{total}})",
    "sectionUpgradeable": "Upgradeable ({{total}})",
    "sectionSettings": "Settings",
    "openHomepageAria": "Open {{name}} homepage",
    "byAuthor": "by {{author}}",
    "updateAvailable": "update available",
    "requiresVersion": "requires GeoLibre {{version}}+",
    "install": "Install",
    "installAria": "Install {{name}}",
    "removeConfirm": "Remove?",
    "uninstall": "Uninstall",
    "uninstallAria": "Uninstall {{name}}",
    "confirmUninstallAria": "Confirm uninstall {{name}}",
    "update": "Update",
    "updateAria": "Update {{name}}",
    "loading": "Loading…",
    "installed": "Installed",
    "settingsIntro": "GeoLibre always scans its app data plugins directory. Install a packaged plugin (.zip) from a file, or add additional local directories (desktop-only). Manifest URLs (including marketplace installs) are loaded over the network; changes here apply immediately.",
    "installFromFile": "Install from file",
    "chooseZip": "Choose .zip…",
    "installFromFileHintDesktop": "Copy a packaged plugin archive into GeoLibre's plugins directory.",
    "installFromFileHintWeb": "Load a packaged plugin archive; it is stored in your browser and reloads on your next visit.",
    "localDirectories": "Local directories",
    "directoryAria": "Plugin directory",
    "browseDirectoryAria": "Browse plugin directory",
    "noDirectories": "No additional plugin directories configured.",
    "manifestUrls": "Manifest URLs",
    "manifestUrlAria": "Plugin manifest URL",
    "noManifestUrls": "No plugin manifest URLs configured.",
    "removeAria": "Remove {{name}}",
    "errorLoadRegistry": "Could not load the plugin registry.",
    "errorUpdate": "Could not update plugin.",
    "errorDirectoryPicker": "Could not open the directory picker.",
    "errorInstall": "Could not install the plugin.",
    "errorUninstall": "Could not uninstall the plugin.",
    "description": "Browse, install, update, and remove external GeoLibre plugins. Plugins are listed in the <registryLink>GeoLibre plugin registry</registryLink>."
  },
  "viewState": {
    "panelTitle": "Info"
  },
  "terrainMeasure": {
    "title": "Terrain (3D)",
    "surfaceDistance": "Surface distance",
    "surfaceArea": "Surface area",
    "elevationGainLoss": "Gain / loss",
    "elevationRange": "Min / max elevation",
    "meanSlope": "Mean slope",
    "computing": "Computing terrain…",
    "partialData": "Some samples had no terrain data"
  },
  "fileNamePrompt": {
    "title": "Save file as",
    "description": "Enter a file name. The file downloads to your browser's downloads folder.",
    "label": "File name"
  },
  "newProject": {
    "basemapDescription": "Choose an OpenFreeMap or Protomaps basemap, a blank background, or a MapLibre style URL.",
    "basemapDescriptionNoProtomaps": "Choose an OpenFreeMap basemap, a blank background, or a MapLibre style URL.",
    "sectionOpenFreeMap": "OpenFreeMap",
    "sectionProtomaps": "Protomaps",
    "sectionOther": "Other",
    "customUrlButton": "Custom URL",
    "invalidCustomUrl": "Enter a valid style.json or .pmtiles URL.",
    "savePromptTitle": "Save current project?",
    "savePromptDescription": "The current project has unsaved changes. Save them before creating a new project?",
    "doNotSave": "Do not save",
    "saving": "Saving...",
    "title": "New project",
    "projectName": "Project name",
    "savedTemplates": "Saved Templates",
    "deleteTemplate": "Delete template",
    "basemapLabel": "Basemap",
    "create": "Create"
  },
  "basemapPicker": {
    "title": "Change basemap",
    "applyCustom": "Apply",
    "invalidUrl": "Enter a valid HTTP or HTTPS style URL.",
    "sectionMoon": "The Moon",
    "sectionMars": "Mars",
    "sectionOther": "Other celestial bodies"
  },
  "planetSwitcher": {
    "label": "Celestial body",
    "earth": "Earth",
    "mercury": "Mercury",
    "venus": "Venus",
    "moon": "Moon",
    "mars": "Mars",
    "io": "Io",
    "europa": "Europa",
    "ganymede": "Ganymede",
    "callisto": "Callisto",
    "titan": "Titan",
    "pluto": "Pluto",
    "charon": "Charon"
  },
  "common": {
    "pickColorFromScreen": "Pick a color from the screen",
    "save": "Save",
    "cancel": "Cancel",
    "close": "Close",
    "retry": "Retry",
    "reset": "Reset",
    "remove": "Remove",
    "add": "Add",
    "ok": "OK",
    "done": "Done",
    "openWebApp": "Open the GeoLibre web app"
  },
  "addData": {
    "title": "Add Data",
    "kind": {
      "xyz": {
        "label": "Add XYZ Layer",
        "description": "Add a raster tile template using x, y, and z placeholders."
      },
      "wms": {
        "label": "Add WMS Layer",
        "description": "Add a WMS GetMap service as a tiled raster layer."
      },
      "wfs": {
        "label": "Add WFS Layer",
        "description": "Add WFS features by requesting GeoJSON from a GetFeature service."
      },
      "wmts": {
        "label": "Add WMTS Layer",
        "description": "Add a WMTS tile URL template as a raster layer."
      },
      "ogcFeatures": {
        "label": "Add OGC API - Features Layer",
        "description": "Add features from an OGC API - Features collection as a vector layer, following the service's paging links until the requested feature count is loaded."
      },
      "ogcVectorTiles": {
        "label": "Add OGC Vector Tiles",
        "description": "Add an OGC API - Tiles (vector) service from a TileJSON or tile template, optionally reading its source layers from a style URL."
      },
      "gpx": {
        "label": "Add GPX Layer",
        "description": "Add GPX waypoints, routes, and tracks as one or more vector layers."
      },
      "georss": {
        "label": "Add GeoRSS Layer",
        "description": "Add a GeoRSS feed (RSS, Atom, or RDF) from a URL or file as a vector layer."
      },
      "delimitedText": {
        "label": "Add Delimited Text Layer",
        "description": "Add a delimited text file or URL as a point layer using longitude and latitude fields, by geocoding an address column, or as a non-spatial attribute table when no coordinates are available."
      },
      "cad": {
        "label": "Add CAD (DXF/DWG) Layer",
        "description": "Add an AutoCAD DXF or DWG drawing as a vector layer, choosing which layer to load and the coordinate reference system to project it from."
      },
      "gdb": {
        "label": "Add File Geodatabase Layer",
        "description": "Add a layer from an Esri File Geodatabase (.gdb folder). The layer is read with the local GeoLibre server and reprojected to WGS84."
      },
      "photos": {
        "label": "Add Geotagged Photos",
        "description": "Import JPEG/HEIC photos as a point layer, placing each one from its EXIF GPS location."
      },
      "mbtiles": {
        "label": "Add MBTiles Layer",
        "description": "Add a local MBTiles file as a raster or vector tile layer."
      },
      "arcgis": {
        "label": "Add ArcGIS Layer",
        "description": "Add an ArcGIS FeatureServer, VectorTileServer, MapServer, or ImageServer layer, or a portal item."
      },
      "postgres": {
        "label": "Add PostgreSQL Layer",
        "description": "Start Martin locally, discover PostGIS sources, and add a source as vector tiles."
      },
      "deckglViz": {
        "label": "Add Deck.gl Layer",
        "description": "Pick a deck.gl layer type, then load the example data or upload a CSV/JSON/GeoJSON file or URL."
      },
      "video": {
        "label": "Add Video Layer",
        "description": "Add a georeferenced video overlay by supplying an MP4 URL and four corner coordinates."
      }
    },
    "shared": {
      "layerName": "Layer name",
      "insertBelow": "Insert below",
      "insertTop": "Top of layer list (default)",
      "layersGroup": "Layers",
      "basemapLayersGroup": "Basemap layers",
      "showBasemapLayers": "Show basemap layers (advanced)",
      "addLayer": "Add layer",
      "adding": "Adding…",
      "addError": "Could not add layer.",
      "sampleData": "Sample data",
      "loadSampleData": "Load sample data…"
    },
    "common": {
      "serviceUrl": "Service URL",
      "tileSize": "Tile size",
      "tileUrlTemplate": "Tile URL template",
      "sourceType": "Source type",
      "layerType": "Layer type",
      "format": "Format",
      "optional": "Optional",
      "chooseFile": "Choose file",
      "noFileSelected": "No file selected",
      "loading": "Loading...",
      "workspaceLayerPlaceholder": "workspace:layer",
      "requestFailed": "Request failed with status {{status}}",
      "networkFailure": "Could not reach the service. Check that the host is reachable and that its TLS certificate, firewall, and proxy settings allow the request; in the browser it may also be blocked by CORS, so try the desktop app.",
      "requestTimedOut": "The request timed out. The host may be slow, unreachable, or blocked by a firewall or proxy."
    },
    "serviceLibrary": {
      "title": "Saved services",
      "saveCurrent": "Save current",
      "importLibrary": "Import library from JSON",
      "exportLibrary": "Export library to JSON",
      "loadAria": "Load a saved service",
      "loadPlaceholder": "Load a saved service…",
      "builtin": "{{name}} (built-in)",
      "deleteAria": "Delete saved service",
      "empty": "No saved services yet — fill in the form and choose “Save current”.",
      "name": "Name",
      "category": "Category",
      "categoryPlaceholder": "Optional (e.g. country, theme)",
      "uncategorized": "Uncategorized",
      "errorName": "Enter a name for the saved service.",
      "saved": "Saved \"{{name}}\" to the service library.",
      "removed": "Removed \"{{name}}\".",
      "errorExport": "Could not export library.",
      "errorTooLarge": "File is too large to import (max 5 MB).",
      "errorNoServices": "No valid services found in that file.",
      "errorRead": "Could not read that file as a service library.",
      "imported_one": "Imported {{count}} service.",
      "imported_other": "Imported {{count}} services.",
      "importedWithDropped_one": "Imported {{count}} service ({{dropped}} skipped — library full).",
      "importedWithDropped_other": "Imported {{count}} services ({{dropped}} skipped — library full)."
    },
    "xyz": {
      "defaultName": "XYZ Layer",
      "sampleLabel": "USGS imagery",
      "errorUrl": "Enter an XYZ tile URL template.",
      "urlPlaceholder": "https://example.com/{z}/{x}/{y}.png",
      "shortUrlPlaceholder": "https://go.example.com/layer",
      "shortUrl": "Short URL"
    },
    "wms": {
      "defaultName": "WMS Layer",
      "sampleLabel": "USGS NAIP imagery",
      "sampleLabelGebco": "GEBCO ocean bathymetry",
      "errorUrl": "Enter a WMS service URL.",
      "errorLayers": "Enter one or more WMS layer names.",
      "urlPlaceholder": "https://example.com/geoserver/wms",
      "layers": "Layers",
      "styles": "Styles",
      "transparent": "Transparent background",
      "retrieveLayers": "Retrieve layers",
      "retrieving": "Retrieving...",
      "retrievedLayers": "Retrieved layers",
      "selectLayer_one": "Select from {{count}} layer",
      "selectLayer_other": "Select from {{count}} layers",
      "noLayersFound": "No layers were found for this service.",
      "retrieveError": "Could not retrieve layers from this service.",
      "version": "WMS version"
    },
    "wfs": {
      "defaultName": "WFS Layer",
      "sampleLabel": "US states (GeoServer)",
      "errorUrl": "Enter a WFS service URL.",
      "errorTypeName": "Enter a WFS feature type name.",
      "errorOutputFormat": "Enter a WFS output format.",
      "urlPlaceholder": "https://example.com/geoserver/wfs",
      "featureType": "Feature type",
      "version": "Version",
      "outputFormat": "Output format",
      "srsName": "SRS name",
      "maxFeatures": "Max features",
      "errorMaxFeaturesNumeric": "Enter a numeric max features value.",
      "retrieveTypes": "Retrieve types",
      "retrieving": "Retrieving...",
      "retrievedTypes": "Retrieved feature types",
      "selectType_one": "Select from {{count}} feature type",
      "selectType_other": "Select from {{count}} feature types",
      "noTypesFound": "No feature types were found for this service.",
      "retrieveError": "Could not retrieve feature types from this service."
    },
    "wmts": {
      "defaultName": "WMTS Layer",
      "sampleLabel": "EOX World Imagery (Sentinel-2)",
      "errorUrl": "Enter a WMTS tile URL template.",
      "urlPlaceholder": "https://example.com/wmts/{z}/{y}/{x}.png"
    },
    "ogcFeatures": {
      "defaultName": "OGC API - Features Layer",
      "sampleLabel": "Global lakes (pygeoapi demo)",
      "urlPlaceholder": "https://example.com/ogcapi",
      "urlHint": "The service landing page, or any URL copied from it (a /collections or /collections/{id}/items URL also works).",
      "retrieveCollections": "Retrieve collections",
      "retrieving": "Retrieving...",
      "retrievedCollections": "Retrieved collections",
      "selectCollection_one": "Select from {{count}} collection",
      "selectCollection_other": "Select from {{count}} collections",
      "noCollectionsFound": "No feature collections were found for this service.",
      "retrieveError": "Could not retrieve collections from this service.",
      "collection": "Collection",
      "collectionPlaceholder": "collection-id",
      "maxFeatures": "Max features",
      "bbox": "Bounding box",
      "datetime": "Date and time",
      "errorCollection": "Enter an OGC API - Features collection id.",
      "errorMaxFeatures": "Enter a max features value of 1 or more.",
      "errorBbox": "Enter the bounding box as \"west,south,east,north\".",
      "errorNoFeatures": "This collection returned no features."
    },
    "ogcVectorTiles": {
      "defaultName": "OGC Vector Tiles Layer",
      "tilesUrl": "Tiles URL",
      "tilesUrlPlaceholder": "https://example.com/tiles/WebMercatorQuad?f=tilejson",
      "tilesUrlHint": "A TileJSON metadata URL or a {z}/{y}/{x} MVT tile template.",
      "styleUrl": "Style URL",
      "styleUrlPlaceholder": "https://example.com/styles/default?f=mapbox",
      "styleUrlHint": "Optional Mapbox/MapLibre style JSON. Used to discover the tileset's source layers when the TileJSON omits them.",
      "sourceLayers": "Source layers",
      "sourceLayersPlaceholder": "layer_a, layer_b",
      "sourceLayersHint": "Optional comma-separated source layer names. Overrides the layers found in the TileJSON or style.",
      "sampleLabel": "PDOK BGT (Netherlands)",
      "errorUrl": "Enter a tiles URL or a style URL.",
      "errorNoTiles": "Could not determine the vector tile endpoint. Enter a TileJSON URL, a tile template, or a style URL.",
      "errorNoLayers": "Could not determine the vector tile source layers. Add a style URL or enter the source layer names."
    },
    "arcgis": {
      "defaultName": "ArcGIS Layer",
      "sampleFeatureLabel": "US major cities (feature)",
      "sampleVectorTileLabel": "Santa Monica parcels (vector tiles)",
      "sampleMapServiceLabel": "US boundaries (map service)",
      "sampleImageServiceLabel": "USGS 3DEP hillshade (image service)",
      "featureLayer": "Feature layer",
      "vectorTileLayer": "Vector tile layer",
      "mapServiceLayer": "Map service",
      "imageServiceLayer": "Image service",
      "portalItemId": "Portal item ID",
      "featureUrlPlaceholder": "https://services.arcgis.com/.../FeatureServer/0",
      "vectorTileUrlPlaceholder": "https://.../arcgis/rest/services/.../VectorTileServer",
      "mapServiceUrlPlaceholder": "https://.../arcgis/rest/services/.../MapServer",
      "imageServiceUrlPlaceholder": "https://.../arcgis/rest/services/.../ImageServer",
      "sublayers": "Sublayers",
      "sublayersPlaceholder": "All visible sublayers",
      "sublayersHint": "Optional comma-separated sublayer ids, for example 0,2,5. Selecting sublayers draws the service dynamically instead of using its cached tiles.",
      "renderingRule": "Rendering rule",
      "renderingRulePlaceholder": "{\"rasterFunction\":\"Hillshade\"}",
      "renderingRuleHint": "Optional raster function JSON applied by the service. A rendering rule draws the service dynamically instead of using its cached tiles.",
      "portalUrl": "Portal URL",
      "portalUrlPlaceholder": "https://www.arcgis.com/sharing/rest",
      "accessToken": "Access token",
      "pageSize": "Records per request",
      "pageSizePlaceholder": "Auto",
      "maxFeatures": "Maximum features",
      "maxFeaturesPlaceholder": "All",
      "pagingHint": "Feature layers download in pages. Lower the records per request if the service times out.",
      "loadingProgress": "Loaded {{loaded}} of {{total}} features…",
      "loadingProgressUnknown": "Loaded {{loaded}} features…"
    },
    "gpx": {
      "defaultName": "GPX Layer",
      "sampleLabel": "Fells Loop trail",
      "errorFileMissing": "GPX file data is missing.",
      "readError": "Could not read GPX file.",
      "errorChooseFile": "Choose a GPX file.",
      "errorUrl": "Enter a GPX URL.",
      "errorSelectType": "Select at least one GPX layer type.",
      "errorNotFound": "The selected GPX layer types were not found.",
      "waypoints": "Waypoints",
      "tracks": "Tracks",
      "trackPoints": "Track Points",
      "routes": "Routes",
      "routePoints": "Route Points",
      "url": "GPX URL",
      "file": "GPX file",
      "urlPlaceholder": "https://example.com/route.gpx",
      "layerTypes": "Layer types"
    },
    "georss": {
      "defaultName": "GeoRSS Layer",
      "sampleLabel": "USGS earthquakes (past day)",
      "errorFileMissing": "GeoRSS file data is missing.",
      "readError": "Could not read GeoRSS file.",
      "errorChooseFile": "Choose a GeoRSS file.",
      "errorUrl": "Enter a GeoRSS URL.",
      "url": "GeoRSS URL",
      "file": "GeoRSS file",
      "urlPlaceholder": "https://example.com/feed.atom"
    },
    "cad": {
      "defaultName": "CAD Layer",
      "fileFilter": "CAD (DXF/DWG)",
      "layer": "CAD layer",
      "layerPlaceholder": "Choose a CAD file first",
      "readingLayers": "Reading layers...",
      "layerOption": "{{name}} ({{type}}, {{count}} features)",
      "crs": "Source CRS",
      "crsPlaceholder": "e.g. EPSG:26915",
      "crsPresetLabel": "Common coordinate systems...",
      "crsHelp": "Leave blank if the drawing is already in longitude/latitude (WGS84). Otherwise enter the EPSG code of the drawing's coordinate system to reproject it.",
      "readError": "Could not read this CAD file.",
      "errorNoLayers": "No layers were found in this CAD file.",
      "errorChooseFile": "Choose a CAD (DXF/DWG) file first.",
      "errorNoLayer": "Select a CAD layer to load.",
      "errorUnsupportedGeometry": "This CAD layer contains mixed or collection geometry that cannot be displayed. Try another layer."
    },
    "gdb": {
      "defaultName": "Geodatabase Layer",
      "chooseFolder": "Choose .gdb folder...",
      "noFolderSelected": "No geodatabase selected",
      "layer": "Feature class",
      "layerPlaceholder": "Choose a geodatabase first",
      "readingLayers": "Reading layers...",
      "layerOption": "{{name}} ({{type}}, {{count}} features)",
      "help": "Attribute-only tables are not listed. The selected feature class is loaded through the local GeoLibre server and reprojected to WGS84.",
      "desktopOnly": "File Geodatabase layers are only available in GeoLibre Desktop. This feature reads a local .gdb folder through the local GeoLibre server, which the web app cannot access.",
      "readError": "Could not read this File Geodatabase.",
      "convertError": "Could not load this feature class.",
      "errorNotGdb": "Choose a folder ending in .gdb (an Esri File Geodatabase).",
      "errorNoLayers": "No feature classes with geometry were found in this geodatabase.",
      "errorChooseFolder": "Choose a .gdb folder first.",
      "errorNoLayer": "Select a feature class to load.",
      "errorTimeout": "Reading the geodatabase timed out.",
      "crs": "Source CRS",
      "crsPlaceholder": "e.g. EPSG:26915",
      "crsHelp": "This feature class's coordinate system could not be detected. Enter the EPSG (or ESRI) code it was stored in so it can be reprojected to WGS84.",
      "errorMissingCrs": "This feature class's coordinate system could not be detected. Enter its source CRS to add it."
    },
    "delimitedText": {
      "defaultName": "Delimited Text Layer",
      "sampleLabel": "US cities",
      "errorChooseFile": "Choose a delimited text file.",
      "errorUrl": "Enter a delimited text URL.",
      "errorFileMissing": "Delimited text file data is missing.",
      "readError": "Could not read delimited text file.",
      "errorDataMissing": "Delimited text data is missing.",
      "retrievedColumns_one": "Retrieved {{count}} column.",
      "retrievedColumns_other": "Retrieved {{count}} columns.",
      "retrievedColumnsTable_one": "Retrieved {{count}} column. No coordinate columns detected; it will be added as an attribute table.",
      "retrievedColumnsTable_other": "Retrieved {{count}} columns. No coordinate columns detected; it will be added as an attribute table.",
      "errorRetrieveColumns": "Could not retrieve column names.",
      "url": "Delimited text URL",
      "file": "Delimited text file",
      "urlPlaceholder": "https://example.com/data.csv",
      "retrieving": "Retrieving...",
      "retrieveColumns": "Retrieve columns",
      "delimiter": "Delimiter",
      "delimiterComma": "Comma",
      "delimiterTab": "Tab",
      "delimiterSemicolon": "Semicolon",
      "delimiterPipe": "Pipe",
      "delimiterCustom": "Custom",
      "customDelimiter": "Custom delimiter",
      "longitudeField": "Longitude field",
      "latitudeField": "Latitude field",
      "noneField": "None (attribute table)",
      "tableHint": "Leave both coordinate fields as None to add the file as a non-spatial attribute table (for use in an attribute join).",
      "crs": "Coordinate system",
      "crsPlaceholder": "e.g. EPSG:32643",
      "crsPresetLabel": "Common coordinate systems...",
      "crsHelp": "Leave blank if the coordinates are already longitude/latitude (WGS84). Otherwise enter the EPSG code of the coordinate columns and the points will be reprojected to WGS84. For a projected CRS, the longitude and latitude fields select the X (easting) and Y (northing) columns.",
      "importMode": "Import as",
      "modeCoordinates": "Coordinates",
      "modeAddresses": "Addresses (geocode)",
      "addressColumns": "Address columns",
      "addressColumnsEmptyHint": "Retrieve columns first to select address columns.",
      "addressColumnsHint": "Select one or more columns to concatenate into the address sent to the geocoder (e.g. street, city, state).",
      "errorNoAddressColumns": "Select at least one address column.",
      "errorNoAddressesFound": "No rows had a value in the selected address column(s)."
    },
    "photos": {
      "defaultName": "Photos",
      "chooseLabel": "Photos",
      "choosePhotos": "Choose photos",
      "hint": "Select JPEG, PNG, TIFF, or HEIC photos. Each one is placed from its EXIF GPS location. HEIC photos are located but shown without a thumbnail.",
      "readError": "Could not read the selected photos.",
      "errorChooseFiles": "Choose one or more photos.",
      "selectedCount_one": "{{count}} photo selected",
      "selectedCount_other": "{{count}} photos selected",
      "errorNoGps_one": "No GPS location was found in the selected photo.",
      "errorNoGps_other": "No GPS location was found in the {{count}} selected photos.",
      "addedSummary_one": "Added {{count}} geotagged photo.",
      "addedSummary_other": "Added {{count}} geotagged photos.",
      "skippedNote_one": "{{count}} photo was skipped (no GPS location).",
      "skippedNote_other": "{{count}} photos were skipped (no GPS location).",
      "noThumbnailNote_one": "{{count}} photo has no thumbnail (HEIC or unsupported format).",
      "noThumbnailNote_other": "{{count}} photos have no thumbnail (HEIC or unsupported format).",
      "manualPromptTitle": "No GPS location was found in this photo.",
      "manualPromptBody": "Place it at the current map center and drag it into position on the map.",
      "manualPromptCenter": "Map center: {{lng}}, {{lat}}",
      "manualPlace": "Place at map center",
      "manualHint": "Drag this pin to position the photo, then click Done."
    },
    "mbtiles": {
      "defaultName": "MBTiles Layer",
      "readError": "Could not read MBTiles file.",
      "errorChooseFile": "Choose an MBTiles file.",
      "errorSourceLayers": "Enter at least one vector source layer.",
      "tileType": "Tile type",
      "sourceLayers": "Source layers",
      "sourceLayersPlaceholder": "building, place, water"
    },
    "postgres": {
      "defaultName": "PostgreSQL Layer",
      "errorDesktopOnly": "PostgreSQL layers require GeoLibre Desktop.",
      "errorConnectionString": "Enter a PostgreSQL connection string.",
      "statusCheckingBinary": "Checking Martin binary...",
      "statusDownloaded": "Martin downloaded. Starting local server...",
      "statusStarting": "Starting local Martin server...",
      "statusReadingCatalog": "Reading Martin catalog...",
      "statusFound_one": "Found {{count}} source.",
      "statusFound_other": "Found {{count}} sources.",
      "statusNoSources": "Martin is running, but no compatible PostGIS sources were found.",
      "errorConnect": "Could not connect to PostgreSQL.",
      "statusStopped": "Martin stopped.",
      "errorStop": "Could not stop Martin.",
      "errorConnectFirst": "Connect to PostgreSQL first.",
      "errorNoVectorLayers": "The selected Martin source has no vector layers.",
      "errorSelectSource": "Select a Martin source to add.",
      "desktopOnlyNotice": "PostgreSQL layers are only available in GeoLibre Desktop. This feature runs a local Martin tile server, which the web app cannot launch.",
      "savedConnection": "Saved connection",
      "selectSavedConnection": "Select saved connection",
      "connectionString": "PostgreSQL connection string",
      "connectionStringPlaceholder": "postgres://user:password@host:5432/database",
      "defaultSrid": "Default SRID",
      "connect": "Connect",
      "stop": "Stop",
      "martinSource": "Martin source",
      "runningOnPort": "Martin is running on port {{port}}.",
      "loadMode": "Load as",
      "loadModeTiles": "Vector tiles (Martin, read-only)",
      "loadModeEditable": "Editable layer (loads all features)",
      "editableNotice": "Loads the table's features through the local processing server so they can be edited. Save changes back with the layer's \"Save edits to PostGIS table\" action.",
      "statusListingTables": "Reading spatial tables...",
      "statusTablesFound_one": "Found {{count}} spatial table.",
      "statusTablesFound_other": "Found {{count}} spatial tables.",
      "statusNoTables": "No spatial tables were found in this database.",
      "editableTable": "Table",
      "tableReadOnly": "{{table}} (read-only: no primary key)",
      "errorSelectTable": "Select a table to load.",
      "errorRuntimeMissing": "The processing server does not have the PostGIS runtime (psycopg) installed. Install the geolibre-server 'postgis' extra to load editable layers."
    },
    "video": {
      "defaultName": "Video Layer",
      "sampleLabel": "Coastal waves near San Francisco",
      "errorUrl": "Enter a video URL.",
      "errorHttps": "Video URLs must start with https://.",
      "cornerTopLeft": "top-left",
      "cornerTopRight": "top-right",
      "cornerBottomRight": "bottom-right",
      "cornerBottomLeft": "bottom-left",
      "errorCornerFormat": "Enter the {{corner}} corner as \"longitude, latitude\".",
      "errorCornerNumber": "Enter a numeric {{corner}} longitude and latitude.",
      "errorCornerLng": "{{corner}} longitude must be between -180 and 180.",
      "errorCornerLat": "{{corner}} latitude must be between -90 and 90.",
      "primaryUrl": "Primary video URL",
      "primaryUrlPlaceholder": "https://example.com/clip.mp4",
      "fallbackUrl": "Fallback video URL (optional)",
      "fallbackUrlPlaceholder": "https://example.com/clip.webm",
      "topLeft": "Top-left (lng, lat)",
      "topRight": "Top-right (lng, lat)",
      "bottomRight": "Bottom-right (lng, lat)",
      "bottomLeft": "Bottom-left (lng, lat)",
      "cornersNote": "The four corners georeference the video on the map. The video must be served over HTTPS and the host must allow cross-origin requests (CORS) for the frames to render."
    },
    "netcdf": {
      "sampleLabel": "Air temperature",
      "title": "Add NetCDF / HDF",
      "description": "Render a NetCDF or HDF5 dataset: a remote Cloud-Optimized file via a kerchunk reference (read over HTTP range requests), or a local NetCDF or HDF5 file read in your browser.",
      "sourceLabel": "Source",
      "sourceCloud": "Cloud-Optimized (kerchunk URL)",
      "sourceLocal": "Local file (NetCDF / HDF5)",
      "localFileLabel": "Local file",
      "chooseDifferentFile": "Choose a different file",
      "readingFile": "Reading...",
      "readingRemote": "Reading the file's metadata over HTTP...",
      "localFileHelp": "Select a local NetCDF or HDF5 file (.nc, .nc4, .cdf, .h5, or .hdf5); classic NetCDF-3 and NetCDF-4/HDF5 are both supported. It is decoded in your browser; large files use more memory.",
      "errorNoVariables": "No renderable (2-D or higher) variables found in the file.",
      "errorNoFile": "No file loaded.",
      "kerchunkUrlLabel": "Kerchunk reference or NetCDF/HDF file URL",
      "kerchunkUrlHelp": "Paste a kerchunk reference URL, or a direct NetCDF/HDF file URL (.nc, .nc4, .h5). A direct file is read by range request, so only the parts you view are downloaded; the server must allow cross-origin range requests.",
      "loading": "Loading...",
      "loadVariables": "Load variables",
      "variableLabel": "Variable",
      "dimIndexLabel": "{{dim}} index",
      "colormapLabel": "Colormap",
      "bandCombinationLabel": "Band combination",
      "bandCombinationHelp": "A single band is color-mapped; an RGB composite draws three bands of this variable as the red, green, and blue channels, each stretched to its own 2-98% range.",
      "modeSingleBand": "Single band (color-mapped)",
      "modeRgb": "RGB composite (three bands)",
      "channel": {
        "red": "Red band",
        "green": "Green band",
        "blue": "Blue band"
      },
      "colorMin": "Color min (optional)",
      "colorMax": "Color max (optional)",
      "adding": "Adding...",
      "addLayer": "Add layer"
    },
    "deckViz": {
      "defaultName": "Deck.gl Layer",
      "errorChooseFile": "Choose a CSV, JSON, or GeoJSON file.",
      "errorUrl": "Enter a data URL.",
      "errorUnknownType": "Unknown layer type.",
      "needsGeojson": "{{label}} needs a GeoJSON file.",
      "needsTabular": "{{label}} needs tabular CSV/JSON data, not GeoJSON.",
      "mapRequiredFields_one": "Map the required field: {{fields}}.",
      "mapRequiredFields_other": "Map the required fields: {{fields}}.",
      "errorExample": "Could not load the example data.",
      "loadedFeatures_one": "Loaded {{count}} feature.",
      "loadedFeatures_other": "Loaded {{count}} features.",
      "loadedRows_one": "{{count}} row",
      "loadedRows_other": "{{count}} rows",
      "loadedColumns_one": "{{count}} column",
      "loadedColumns_other": "{{count}} columns",
      "loadedTabular": "Loaded {{rows}} · {{columns}}.",
      "errorLoad": "Could not load the data.",
      "errorLoadFirst": "Load the example data, or a file/URL, first.",
      "useExample": "Use example data",
      "loadYourOwn": "Or load your own",
      "dataUrl": "Data URL",
      "localFile": "Local file",
      "urlPlaceholder": "https://example.com/data.csv",
      "chooseFileLoad": "Choose file & load",
      "loadData": "Load data",
      "selectRole": "— select —",
      "roleNone": "(none)",
      "closeAfterAdd": "Close dialog after adding layer",
      "color": "Color",
      "pointSize": "Point size",
      "cellSize": "Cell size",
      "lineWidth": "Line width",
      "extrusion": "3D extrusion",
      "modelUrlPlaceholder": "https://example.com/model.glb"
    },
    "nonGeographicCoordinates": "Coordinates in {{names}} are not longitude/latitude, so nothing will be drawn on the map. The CRS is mislabelled — reproject the data (or fix its .prj) and load it again."
  },
  "offline": {
    "title": "Download Offline Area",
    "description": "Save the current map view's basemap tiles so this area keeps working without a network connection.",
    "noServiceWorker": "Offline caching needs the installed web app. Tiles you download here won't be saved for offline use in this build.",
    "uncacheable": "The following basemap sources don't support offline downloading and will be missing from your offline map: {{hosts}}.",
    "cacheable": "The following basemap sources will be downloaded and available offline: {{hosts}}.",
    "includeExtra": "Include extra detail levels for zooming in",
    "currentViewOnly": "Current view only · Zoom {{zoom}}",
    "detailLevels": "Extra detail levels",
    "relativeLevels_one": "+{{count}} level · Zoom {{min}}–{{max}}",
    "relativeLevels_other": "+{{count}} levels · Zoom {{min}}–{{max}}",
    "tiles": "Resources to download",
    "tooManyTiles": "This area exceeds the offline cache limit ({{max}} resources); the oldest cached tiles may be evicted as newer resources download. Reduce the detail levels or pick a smaller area.",
    "acknowledgeEviction": "Download anyway, evicting older tiles if needed",
    "download": "Download",
    "cancel": "Cancel",
    "progress": "Downloading {{done}} / {{total}}…",
    "complete_one": "Offline area saved. {{count}} resource cached for offline use.",
    "complete_other": "Offline area saved. {{count}} resources cached for offline use.",
    "completeWithFailures": "Saved {{done}} of {{total}} resources ({{failed}} failed).",
    "retryFailed_one": "Retry {{count}} failed resource",
    "retryFailed_other": "Retry {{count}} failed resources",
    "retryAll": "Retry all resources",
    "advanced": "Advanced options",
    "concurrency": "Concurrent requests",
    "concurrencyHint": "Lower this to ease off servers that rate-limit rapid tile requests.",
    "timeout": "Request timeout (seconds)",
    "timeoutHint": "Each tile request is given up to {{seconds}}s before it counts as failed.",
    "timeoutDisabled": "No timeout — requests use the browser default. Raise it for slow connections."
  },
  "offlineManager": {
    "title": "Manage Offline Areas",
    "description": "Review the basemap areas you've downloaded for offline use, refresh them, or delete them to reclaim storage.",
    "noServiceWorker": "Offline caching needs the installed web app. Refreshing areas won't save tiles for offline use in this build.",
    "empty": "No offline areas yet. Use \"Download Offline Area\" to save the current map view for offline use.",
    "zoomRange": "Zoom {{min}}–{{max}}",
    "tilesCount_one": "{{count}} tile",
    "tilesCount_other": "{{count}} tiles",
    "savedOn": "Saved {{date}}",
    "rename": "Rename this area",
    "nameLabel": "Area name",
    "update": "Refresh this area",
    "delete": "Delete this area",
    "confirmDelete": "Delete",
    "updateAll": "Refresh all",
    "updating": "Refreshing {{done}} / {{total}}…",
    "totalFootprint_one": "{{size}} across {{count}} area",
    "totalFootprint_other": "{{size}} across {{count}} areas",
    "deviceUsage": "{{usage}} of {{quota}} used"
  },
  "recordTour": {
    "title": "Record Map Tour",
    "hint": "Pan and zoom the map, then capture each view. The map stays interactive while this panel is open.",
    "unsupported": "This browser cannot record the map canvas. Try a recent version of Chrome, Edge, or Firefox.",
    "addView": "Add current view",
    "pathTitle": "Generate from path",
    "pathNoLayers": "Add a LineString layer to generate keyframes from a path.",
    "pathLayer": "Path layer",
    "pathLayerOption": "{{name}} ({{count}} points)",
    "pathKeyframes": "Keyframes",
    "pathZoom": "Zoom",
    "pathPitch": "Pitch",
    "pathHold": "Hold",
    "pathTransition": "Move",
    "pathGenerate": "Generate",
    "pathConfirmReplace": "Replace the current keyframes with keyframes generated from this path?",
    "pathGenerated_one": "Generated {{count}} keyframe from the path.",
    "pathGenerated_other": "Generated {{count}} keyframes from the path.",
    "pathGenerateError": "Could not generate keyframes from this path.",
    "loadConfig": "Load setup",
    "saveConfig": "Save setup",
    "confirmLoad": "Replace the current keyframes with the loaded setup?",
    "configFileType": "Tour Configuration",
    "configSaved": "Saved setup as {{name}}",
    "configLoaded_one": "Loaded setup with {{count}} keyframe.",
    "configLoaded_other": "Loaded setup with {{count}} keyframes.",
    "configSaveError": "Could not save the tour setup. Please try again.",
    "configLoadError": "Could not load the tour setup. The file may be invalid.",
    "keyframeCount_one": "{{count}} keyframe",
    "keyframeCount_other": "{{count}} keyframes",
    "empty": "Pan and zoom the map to a starting view, then add it as the first keyframe. Add at least two keyframes to record a tour.",
    "flyToKeyframe": "Fly to this view",
    "hold": "Hold",
    "transition": "Transition",
    "secondsShort": "sec",
    "holdSeconds": "Seconds to hold on this view",
    "segmentSeconds": "Seconds to move to the next view",
    "resizeLeft": "Resize panel from the bottom-left corner",
    "resizeRight": "Resize panel from the bottom-right corner",
    "recapture": "Update to current map view",
    "moveUp": "Move keyframe up",
    "moveDown": "Move keyframe down",
    "removeKeyframe": "Remove keyframe",
    "fps": "Frames per second",
    "estimatedLength": "About {{seconds}}s",
    "record": "Record",
    "videoFileType": "WebM Video",
    "recordingStatus": "Recording… {{percent}}%",
    "savingStatus": "Saving video…",
    "stop": "Stop",
    "recordingReady": "Recording ready. Name it and save, or discard to re-record.",
    "fileNameLabel": "File name",
    "saveVideo": "Save video…",
    "discard": "Discard",
    "saved": "Saved {{name}}",
    "saveCancelled": "Save cancelled.",
    "recordError": "Could not record the tour. Please try again.",
    "saveError": "Could not save the video. Please try again."
  },
  "recordVideo": {
    "title": "Record Video",
    "hint": "Record the live map as a video. Pan and zoom while recording — every move is captured. This panel and the selection frame are not part of the video.",
    "unsupported": "This browser cannot record the map canvas. Try a recent version of Chrome, Edge, or Firefox.",
    "area": "Capture area",
    "wholeMap": "Whole map",
    "selectArea": "Select area…",
    "redrawArea": "Redraw area…",
    "drawHint": "Drag a rectangle on the map to set the recording area, or press Escape to cancel.",
    "regionChosen": "Recording area: {{width}} × {{height}} px. The frame stays fixed while the map moves under it.",
    "noRegion": "Draw a rectangle on the map to choose the recording area.",
    "needRegion": "Select an area on the map first.",
    "fps": "Frames per second",
    "caption": "Caption (burned into video)",
    "captionTitlePlaceholder": "Title (optional)",
    "captionTextLabel": "Caption subtitle or data source",
    "captionTextPlaceholder": "Subtitle or data source (optional)",
    "captionPosition": "Caption position",
    "captionPos": {
      "top-left": "Top left",
      "top-center": "Top center",
      "top-right": "Top right",
      "bottom-left": "Bottom left",
      "bottom-center": "Bottom center",
      "bottom-right": "Bottom right"
    },
    "includePanels": "Include map panels (legend, colorbar, HTML) in video",
    "record": "Record",
    "preparing": "Preparing…",
    "stop": "Stop",
    "savingStatus": "Saving video…",
    "recordingReady": "Recording ready. Name it and save, or discard to re-record.",
    "fileNameLabel": "File name",
    "saveVideo": "Save video…",
    "discard": "Discard",
    "videoFileType": "Video",
    "saved": "Saved {{name}}",
    "saveCancelled": "Save cancelled.",
    "recordError": "Could not record the video. Please try again.",
    "saveError": "Could not save the video. Please try again."
  },
  "fieldCollection": {
    "title": "Field Collection",
    "description": "Capture point, line, or polygon observations against a custom form. Place a point by GPS or by tapping the map, and draw lines and polygons vertex by vertex.",
    "captureDescription": "Capture a location by GPS or on the map, then fill in the form to save it.",
    "captureReviewDescription": "Review the captured location, complete the form, and save it to the layer.",
    "reopen": "Open Field Collection",
    "targetLayer": "Collection layer",
    "newLayer": "New collection layer…",
    "layerName": "Layer name",
    "layerNamePlaceholder": "Field Observations",
    "geometry": "Geometry",
    "geom": {
      "point": "Point",
      "line": "Line",
      "polygon": "Polygon"
    },
    "fields": "Form fields",
    "addField": "Add field",
    "fieldLabel": "Label",
    "fieldType": "Type",
    "options": "Options (comma-separated)",
    "required": "Required",
    "noFields": "No fields yet. Add fields to capture attributes, or create the layer to capture location-only points.",
    "type": {
      "text": "Text",
      "number": "Number",
      "date": "Date",
      "choice": "Choice"
    },
    "createLayer": "Create layer",
    "captureHint": "Use GPS or pick a point on the map to start a capture.",
    "drawHint": "Draw the shape on the map to start a capture.",
    "useGps": "Use GPS",
    "pickOnMap": "Pick on map",
    "reposition": "Reposition point",
    "drawOnMap": "Draw on map",
    "pickBannerTitle": "Placement mode active",
    "pickBannerHint": "Click anywhere on the map to pick a point, or press Esc to cancel.",
    "addGpsVertex": "Add GPS vertex",
    "undo": "Undo",
    "finish": "Finish",
    "vertices_one": "{{count}} vertex",
    "vertices_other": "{{count}} vertices",
    "needMore": "Add at least {{min}} vertices",
    "dblClickHint": "Tap to add vertices; double-click to finish.",
    "locating": "Locating…",
    "photo": "Photo",
    "photoOptional": "Photo (optional)",
    "choosePhoto": "Choose photo…",
    "removePhoto": "Remove",
    "save": {
      "point": "Save point",
      "line": "Save line",
      "polygon": "Save polygon"
    },
    "saved": {
      "point_one": "Saved {{count}} point to {{layer}}.",
      "point_other": "Saved {{count}} points to {{layer}}.",
      "line_one": "Saved {{count}} line to {{layer}}.",
      "line_other": "Saved {{count}} lines to {{layer}}.",
      "polygon_one": "Saved {{count}} polygon to {{layer}}.",
      "polygon_other": "Saved {{count}} polygons to {{layer}}."
    },
    "layerGone": "The collection layer is no longer available.",
    "noGeolocation": "Geolocation isn't available on this device.",
    "geolocationDenied": "Couldn't get your location. Check location permissions and try again.",
    "photoTooLarge": "That photo is too large (max {{max}}). Choose a smaller image.",
    "photoReadError": "Couldn't read that image. Try another file.",
    "errorRequired": "This field is required.",
    "errorNumber": "Enter a valid number.",
    "errorChoice": "Choose one of the listed options."
  },
  "gps": {
    "title": "GPS Tracking",
    "description": "Stream your position onto the map from this device or an NMEA receiver, record a track log, and capture points at your current location.",
    "start": "Start GPS",
    "stop": "Stop GPS",
    "follow": "Keep map centered on my position",
    "waitingForFix": "Waiting for a GPS fix…",
    "noGeolocation": "Geolocation isn't available on this device.",
    "permissionDenied": "Location permission was denied. Enable it in your browser or system settings and try again.",
    "trackLog": "Track log",
    "record": "Record track",
    "pause": "Pause",
    "resume": "Resume",
    "discard": "Discard",
    "saveTrack": "Save as layer",
    "exportGpx": "Export GPX",
    "exportGeojson": "Export GeoJSON",
    "points_one": "{{count}} point",
    "points_other": "{{count}} points",
    "trackLayerName": "GPS Track",
    "trackSaved": "Saved {{name}} as a layer.",
    "trackExported": "Track exported.",
    "exportCancelled": "Export cancelled.",
    "exportFailed": "Could not export the track. Please try again.",
    "capture": "Digitize",
    "capturePoint": "Capture point",
    "captureLayerName": "GPS Points",
    "captured_one": "{{count}} point captured this session.",
    "captured_other": "{{count}} points captured this session.",
    "pointCaptured": "Point saved to {{layer}}.",
    "captureBlocked": "Fix accuracy is ±{{accuracy}}, worse than the {{max}} m threshold. Point not saved.",
    "satellites": "Satellites",
    "satellitesShort": "Sat",
    "satellitesValue": "Satellites: {{value}}",
    "satellitesShortValue": "Sat: {{value}}",
    "notAvailable": "—",
    "settings": "Logging filters",
    "minDistance": "Min distance (m)",
    "minTime": "Min time (s)",
    "maxAccuracy": "Max accuracy (m)",
    "settingsHint": "Track fixes closer than the minimum distance or time are skipped. Fixes less accurate than the accuracy threshold are not logged, and point capture is blocked. 0 disables a filter.",
    "openDialog": "Open GPS Tracking",
    "altitudeValue": "Alt: {{value}} m",
    "speedValue": "{{value}} km/h",
    "headingValue": "{{value}}°",
    "source": "Position source",
    "sourceDevice": "This device",
    "sourceNmea": "NMEA receiver (serial or Bluetooth)",
    "nmeaBaudRate": "Baud rate",
    "nmeaConnectSerial": "Connect serial",
    "nmeaConnectBluetooth": "Connect Bluetooth",
    "nmeaConnecting": "Connecting…",
    "nmeaConnected": "Connected to {{device}}.",
    "nmeaDisconnect": "Disconnect",
    "nmeaNotConnected": "Connect an NMEA receiver above to start streaming positions.",
    "nmeaWaiting": "Waiting for sentences…",
    "nmeaStats": "{{parsed}} sentences · {{fixes}} fixes",
    "nmeaConnectFailed": "Could not connect to the receiver.",
    "nmeaDisconnected": "The receiver disconnected.",
    "nmeaUnsupportedDevice": "No NMEA service was found on that device. It may be a classic Bluetooth receiver, which has to be paired in your system settings and then connected here as a serial port.",
    "nmeaUnsupported": "Reading an NMEA receiver needs the Web Serial or Web Bluetooth APIs, which this browser does not provide. Open GeoLibre in a Chromium browser such as Chrome or Edge.",
    "nmeaSerialUnsupported": "Web Serial is not available here, so serial receivers cannot be opened.",
    "nmeaBluetoothUnsupported": "Web Bluetooth is not available here, so Bluetooth Low Energy receivers cannot be opened.",
    "nmeaBluetoothHint": "Most Bluetooth GPS receivers use classic Bluetooth: pair one in your system settings and it appears here as a serial port. Use Connect Bluetooth only for Bluetooth Low Energy receivers.",
    "fixQuality": {
      "invalid": "No fix",
      "gps": "GPS fix",
      "dgps": "Differential GPS",
      "pps": "PPS fix",
      "rtk-fixed": "RTK fixed",
      "rtk-float": "RTK float",
      "estimated": "Dead reckoning",
      "manual": "Manual input",
      "simulation": "Simulated"
    }
  },
  "georeferencer": {
    "title": "Georeference Image",
    "description": "Pin an image to the map: load it, link image points to map locations, then add it as a georeferenced overlay.",
    "loadImage": "Click to load an image (PNG, JPG, TIFF)",
    "imageTooLarge": "That image is too large (max {{max}}). Choose a smaller image.",
    "imageReadError": "Couldn't read that image. Try another file.",
    "imageNoDimensions": "Couldn't determine the image size. Use a raster image (PNG, JPG, TIFF).",
    "sourceImage": "Source image ({{w}} × {{h}} px)",
    "clickImageHint": "Click a point on the image, then link it on the map.",
    "pixelPicked": "Image point: {{x}}, {{y}}",
    "linkOnMap": "Link on map",
    "zoomIn": "Zoom in",
    "zoomOut": "Zoom out",
    "zoomReset": "Reset zoom",
    "importGcps": "Import",
    "exportGcps": "Export",
    "gcpsImported": "Imported {{count}} control point(s).",
    "gcpsReadError": "Couldn't read control points from that file.",
    "gcpsOutsideImage": "Some control points fall outside the loaded image — they may be from a different image.",
    "transformNeedsMore": "This transform needs at least {{min}} control points.",
    "gcps": "Control points ({{count}})",
    "needGcps": "Add at least {{min}} control points to georeference.",
    "collinear": "Control points are collinear or coincident — move one off the line.",
    "cornersOutOfRange": "This fit places the image outside valid map bounds. Adjust the control points.",
    "residual": "Residual",
    "rms": "RMS {{rms}} m",
    "opacity": "Overlay opacity",
    "addToMap": "Add to map",
    "clear": "Clear",
    "defaultName": "Georeferenced image",
    "exportTiff": "Export GeoTIFF",
    "exportTiffButton": "Export",
    "exportTiffHint": "Warps the image to a Cloud-Optimized GeoTIFF in your browser (GDAL/WASM). The engine downloads on first use.",
    "transform": {
      "affine": "Affine (linear)",
      "polynomial": "Polynomial (order 2)",
      "tps": "Thin plate spline"
    },
    "exporting": "Exporting GeoTIFF… (loading GDAL on first use)",
    "exported": "GeoTIFF exported.",
    "exportFailed": "GeoTIFF export failed. See the console for details."
  },
  "collaborate": {
    "title": "Live collaboration",
    "description": "Share a live session so others can see and edit this map with you in real time.",
    "displayName": "Your name",
    "displayNamePlaceholder": "e.g. Alex",
    "color": "Your color",
    "startHeading": "Start a session",
    "joinHeading": "Join a session",
    "mode": "Who can edit",
    "modeCoEdit": "Anyone can edit",
    "modeViewOnly": "Only you can edit (others watch)",
    "start": "Start session",
    "join": "Join",
    "joinSession": "Join session",
    "invitedHeading": "You've been invited",
    "invitedDescription": "Pick your name and color, then join the host's live session.",
    "startInstead": "Start a new session instead",
    "sessionCode": "Session code",
    "sessionCodePlaceholder": "Enter a code",
    "shareLink": "Share link",
    "scanToJoin": "Scan to join",
    "copyLink": "Copy link",
    "copyCode": "Copy code",
    "copied": "Copied",
    "participants": "Participants ({{count}})",
    "host": "Host",
    "you": "you",
    "guest": "Guest",
    "connectFailed": "Could not connect to the collaboration server.",
    "copyFailed": "Could not copy to clipboard.",
    "shareFailed": "Could not share the latest project changes.",
    "connecting": "Connecting…",
    "reconnecting": "Reconnecting…",
    "connected": "Live session active",
    "followHost": "Follow host's view",
    "goToMap": "Go to map and collaborate",
    "goToMapViewOnly": "Go to map and watch",
    "collapseRoster": "Collapse participant roster",
    "manageSession": "Manage session",
    "sessionStatusTooltip": "Live collaboration session. Click to see who's connected.",
    "announcements": "Session announcements",
    "participantJoined": "{{name}} joined the session",
    "participantLeft": "{{name}} left the session",
    "leave": "Leave session",
    "switchToCoEdit": "Allow everyone to edit",
    "switchToViewOnly": "Make view-only",
    "nameRequired": "Enter your name to continue.",
    "codeRequired": "Enter a session code to join.",
    "canEdit": "Can edit",
    "viewOnly": "View-only",
    "allowEdit": "Allow this person to edit",
    "setViewOnly": "Set this person to view-only",
    "chatLog": "Session chat",
    "chatCompose": "Type a message",
    "chatEmpty": "No messages yet.",
    "chatPlaceholder": "Send a message…",
    "chatSend": "Send message",
    "chatAttachLocation": "Attach the current map location",
    "chatLocationAttached": "Location attached (click to remove)",
    "chatGoToLocation": "Go to this location",
    "sessionStatusUnread_one": "Live collaboration session, {{count}} unread message. Click to see who's connected and chat.",
    "sessionStatusUnread_other": "Live collaboration session, {{count}} unread messages. Click to see who's connected and chat."
  },
  "share": {
    "title": "Share project",
    "description": "Upload the current project to {{shareHost}} and get a shareable link.",
    "setupIntro": "Connect your {{shareHost}} account before uploading.",
    "step1Title": "1. Get an API token",
    "step1Description": "Sign in to {{shareHost}}, then create a token under Settings → API tokens.",
    "getToken": "Get API token",
    "step2Title": "2. Add the token to GeoLibre",
    "step2Description": "Paste the token into Settings → Environment Variables on this device.",
    "configureToken": "Configure local token",
    "liveAt": "Your project is live at:",
    "credentialsRemoved": "{{count}} credential field(s) were not included. Recipients must provide their own credentials or use a brokered reference.",
    "copyLink": "Copy link",
    "open": "Open",
    "done": "Done",
    "projectTitle": "Project title",
    "titlePlaceholder": "Name your project",
    "titleRequired": "Enter a project title before sharing.",
    "visibility": "Visibility",
    "visibilityUnlisted": "Unlisted (anyone with the link)",
    "visibilityPublic": "Public (listed in the gallery)",
    "visibilityPrivate": "Private (only you)",
    "shareButton": "Share",
    "sharing": "Sharing…",
    "errorFallback": "Could not share the project.",
    "usernameRequired": "Set a username on your {{shareHost}} account before sharing. Open your account settings to choose one, then try again.",
    "openAccountSettings": "Open account settings"
  },
  "gallery": {
    "title": "Project gallery",
    "description": "Browse public projects shared on {{shareHost}} and open one in GeoLibre.",
    "searchPlaceholder": "Filter loaded projects by title, author, or tag",
    "loading": "Loading projects…",
    "loadingMore": "Loading more…",
    "loadMore": "Load more",
    "empty": "No public projects to show yet.",
    "noMatches": "No loaded projects match your filter.",
    "errorFallback": "Could not load the project gallery.",
    "errorTimeout": "The project gallery timed out. Please try again.",
    "errorNetwork": "Could not reach {{shareHost}}. Check your internet connection.",
    "errorHttp": "Could not load the gallery (HTTP {{status}}).",
    "errorInvalidResponse": "Could not load the gallery (invalid server response).",
    "errorUnauthorized": "Your {{shareHost}} API token is invalid or expired. Update it in Settings.",
    "errorUsernameRequired": "Set a username on your {{shareHost}} account before loading your projects.",
    "errorNotConfigured": "This deployment has no project sharing server configured.",
    "retry": "Retry",
    "open": "Open",
    "openCopy": "Open a copy",
    "opening": "Opening…",
    "openingCopy": "Opening copy…",
    "openOnWeb": "View on the web",
    "openError": "Could not open this project.",
    "byAuthor": "by {{author}}",
    "views_one": "{{count}} view",
    "views_other": "{{count}} views",
    "untitled": "Untitled Project",
    "noThumbnail": "No preview",
    "resizeDialog": "Resize gallery",
    "scopeFeatured": "Featured",
    "scopeAll": "All projects",
    "scopeMine": "My projects",
    "signedOutHint": "Add a {{shareHost}} API token in Settings to see your own unlisted and private projects.",
    "emptyFeatured": "No featured projects yet.",
    "emptyMine": "You have not shared any projects yet.",
    "visibilityUnlisted": "Unlisted",
    "visibilityPrivate": "Private"
  },
  "template": {
    "saveTitle": "Save as template",
    "saveDescription": "Save this project pre-configured as a reusable template in your personal library.",
    "defaultName": "Untitled Template",
    "nameLabel": "Template name",
    "namePlaceholder": "e.g. Standard Organization Map",
    "descriptionLabel": "Description (optional)",
    "descriptionPlaceholder": "e.g. Pre-configured basemap, styles, and dashboard layout for team maps",
    "stripDataLayersLabel": "Strip data layers",
    "stripDataLayersDesc": "Keep basemap, layer groups, styles, legend, widgets, and layout, but remove data layer content.",
    "saveAction": "Save to Template Library"
  },
  "language": {
    "label": "Language",
    "description": "Choose the language used for the interface."
  },
  "printLayout": {
    "title": "Print Layout",
    "description": "Compose a print-ready map with a title, legend, scale bar, and north arrow, then export it to PNG or PDF.",
    "preview": "Preview",
    "resizeControls": "Resize controls panel",
    "resizeDialog": "Resize dialog",
    "recapture": "Recapture map",
    "copyToClipboard": "Copy to Clipboard",
    "copied": "Copied",
    "exportPng": "Export PNG",
    "exportPdf": "Export PDF",
    "titleLabel": "Title",
    "titlePlaceholder": "Map title",
    "subtitleLabel": "Subtitle",
    "subtitlePlaceholder": "Optional subtitle",
    "size": "Size",
    "sizeGroup": {
      "paper": "Paper",
      "screen": "Screen / digital"
    },
    "sizeCustom": "Custom…",
    "orientation": "Orientation",
    "portrait": "Portrait",
    "landscape": "Landscape",
    "width": "Width",
    "height": "Height",
    "unit": "Unit",
    "titlePlacement": "Title placement",
    "placement": {
      "outside": "Outside frame",
      "inside": "Inside frame"
    },
    "alignment": "Alignment",
    "align": {
      "left": "Left",
      "center": "Center",
      "right": "Right"
    },
    "mapElements": "Map elements",
    "element": {
      "title": "Title",
      "subtitle": "Subtitle",
      "legend": "Legend",
      "scaleBar": "Scale bar",
      "northArrow": "North arrow",
      "groupNavigation": "Group north arrow & scale bar",
      "footer": "Footer text",
      "date": "Date",
      "attribution": "Include GeoLibre attribution",
      "pageBorder": "Page border",
      "infoBlock": "Info block (title block)",
      "colorbar": "Colorbar",
      "customLegend": "Custom legend",
      "dataTable": "Attribute table",
      "dataChart": "Chart"
    },
    "dataBlocks": {
      "layer": "Layer",
      "titleLabel": "Heading",
      "position": "Position",
      "filterToPage": "Only features in the page extent",
      "filterToPageHint": "Applies to atlas pages and a drawn print extent; otherwise the whole layer is used.",
      "filterToAtlasFeature": "Only the current atlas feature",
      "filterToAtlasFeatureHint": "Available when the table uses the atlas coverage layer. This takes priority over the page extent filter."
    },
    "dataTable": {
      "columns": "Columns",
      "columnsHint": "The first {{count}} fields are selected by default. Check columns to customize.",
      "maxRows": "Max rows",
      "moreRows_one": "+{{count}} more",
      "moreRows_other": "+{{count}} more",
      "noRows": "No rows to show with the current settings."
    },
    "dataChart": {
      "type": "Chart type",
      "typeBar": "Bar",
      "typePie": "Pie",
      "typeLine": "Line",
      "categoryField": "Category field",
      "aggregation": "Aggregate",
      "aggCount": "Count",
      "aggSum": "Sum",
      "aggMean": "Mean",
      "valueField": "Value field",
      "noNumericFields": "This layer has no numeric field to aggregate.",
      "noData": "No chart data with the current settings."
    },
    "customLegend": {
      "title": "Legend title",
      "color": "Color",
      "itemLabel": "Label",
      "position": "Position",
      "addItem": "Add item",
      "removeItem": "Remove item",
      "importFromDict": "Import from dictionary",
      "import": "Import",
      "importError": "Enter a valid {\"label\": \"color\"} dictionary."
    },
    "colorbar": {
      "colormap": "Colormap",
      "min": "Min value",
      "max": "Max value",
      "label": "Label",
      "labelPlaceholder": "e.g. Elevation (m)",
      "orientation": "Orientation",
      "vertical": "Vertical",
      "horizontal": "Horizontal",
      "position": "Position",
      "length": "Length"
    },
    "position": {
      "topLeft": "Top left",
      "topRight": "Top right",
      "bottomLeft": "Bottom left",
      "bottomRight": "Bottom right"
    },
    "footerTextLabel": "Footer text",
    "footerPlaceholder": "Custom footer text",
    "margin": "Margin",
    "marginOption": {
      "normal": "Normal",
      "narrow": "Narrow",
      "none": "None (borderless)"
    },
    "mapBackground": "Map background",
    "scaleLabel": "Scale (1:N)",
    "scalePlaceholder": "e.g. 25000",
    "scalePresets": "Presets…",
    "scalePresetsAria": "Scale preset",
    "extent": {
      "label": "Print extent",
      "draw": "Draw extent on map",
      "redraw": "Redraw extent on map",
      "useViewport": "Use active viewport",
      "useCustom": "Clip to custom extent",
      "clear": "Clear extent",
      "hint": "Drag a box on the map to set the exact print area. Hold Shift to match the page proportions."
    },
    "info": {
      "author": "Author",
      "authorPlaceholder": "Author or organization",
      "project": "Project No.",
      "projectPlaceholder": "Reference number",
      "crs": "CRS",
      "crsPlaceholder": "e.g. EPSG:4326",
      "scale": "Scale",
      "revision": "Revision",
      "revisionPlaceholder": "e.g. Rev 01"
    },
    "borderColor": "Border color",
    "borderWidth": "Border width",
    "mapBorderColor": "Map frame color",
    "mapBorderWidth": "Map frame width",
    "errors": {
      "mapNotReady": "Map is not ready yet. Try again in a moment.",
      "captureFailed": "Could not capture the map image.",
      "captureFirst": "Capture the map before exporting.",
      "exportFailed": "Failed to export {{format}}.",
      "clipboardFailed": "Could not copy the layout to the clipboard.",
      "scaleOutOfRange": "This scale is outside the range the current view can reach; showing the closest available scale."
    },
    "legend": {
      "section": "Legend",
      "titleLabel": "Legend title",
      "defaultTitle": "Legend",
      "groupByLayer": "Group classes by layer",
      "empty": "No visible layers to include in the legend.",
      "labelPlaceholder": "Label",
      "moveUp": "Move entry up",
      "moveDown": "Move entry down",
      "showEntry": "Show entry",
      "hideEntry": "Hide entry",
      "moreItems_one": "+{{count}} more",
      "moreItems_other": "+{{count}} more"
    },
    "atlas": {
      "section": "Atlas (map series)",
      "enable": "Generate a multi-page map series",
      "coverageLayer": "Coverage layer",
      "coverage": "Coverage",
      "coveragePerFeature": "One page per feature",
      "coverageAlongLine": "Pages along a line",
      "segmentLength": "Segment length (km)",
      "segmentRequired": "Enter a segment length of at least 0.1 km.",
      "segmentTruncated": "Series capped at {{count}} pages. Increase the segment length.",
      "noLineFeatures": "The coverage layer has no line features.",
      "noLayers": "No vector layers with loaded features. Add a GeoJSON or other local vector layer first.",
      "nameField": "Page name field",
      "nameFieldNone": "Feature number",
      "extentMode": "Page extent",
      "extentMargin": "Margin around feature",
      "extentScale": "Fixed scale",
      "marginLabel": "Margin (%)",
      "maskOutside": "Mask area outside current feature",
      "maskOutsideHint": "Applies a translucent inverted fill to emphasize the current atlas feature.",
      "scaleLabel": "Scale",
      "scaleRequired": "Enter a scale greater than zero.",
      "sortField": "Sort by",
      "sortNone": "Layer order",
      "sortOrder": "Order",
      "sortAsc": "Ascending",
      "sortDesc": "Descending",
      "filterLabel": "Filter",
      "filterPlaceholder": "e.g. POP2000 > 100000 and ST = \"CA\"",
      "filterError": "Could not parse the filter. Use field-operator-value comparisons (=, !=, >, >=, <, <=, contains) joined by \"and\".",
      "filenamePattern": "Page file name (ZIP export)",
      "pages_one": "{{count}} page",
      "pages_other": "{{count}} pages",
      "noPages": "No features match the current filter.",
      "pageOf": "Page {{current}} of {{total}}",
      "prevPage": "Previous atlas page",
      "nextPage": "Next atlas page",
      "exportZip": "Export PNG ZIP",
      "exportPdfPages_one": "Export PDF ({{count}} page)",
      "exportPdfPages_other": "Export PDF ({{count}} pages)",
      "exporting": "Exporting page {{current}} of {{total}}...",
      "tokensHint": "Tokens {atlas.name}, {atlas.pagenumber}, {atlas.total}, and {atlas.attr:FIELD} are replaced per page in the title, subtitle, footer, and page file name.",
      "alongLineHint": "Pages follow each line in order; km_start, km_end, segment, and segments are available as {atlas.attr:FIELD} tokens."
    }
  },
  "kml": {
    "importFailed": "Could not import KML/KMZ.",
    "timeOverlayGroup": "Time overlay animation"
  },
  "map": {
    "boundsRestricted": "Bounds locked",
    "boundsRestrictedTooltip": "Map bounds are restricted. You can change this in Settings.",
    "directionsMode": {
      "title": "Directions mode active",
      "hint": "Click the map to add waypoints. Drag a waypoint to move it, or click it to remove it. Routes update automatically.",
      "removeLast": "Remove last",
      "clear": "Clear",
      "exit": "Exit",
      "calculating": "Calculating route...",
      "totalDistance": "Distance",
      "estimatedTime": "Estimated time",
      "segment": "Segment {{index}}",
      "metricsUnavailable": "Route metrics unavailable",
      "distanceKilometers": "{{value}} km",
      "distanceMeters": "{{value}} m",
      "durationLessThanMinute": "< 1 min",
      "durationMinutes": "{{value}} min",
      "durationHours": "{{value}} hr",
      "durationHoursMinutes": "{{hours}} hr {{minutes}} min",
      "waypointCount_zero": "No waypoints placed yet",
      "waypointCount_one": "{{count}} waypoint placed",
      "waypointCount_other": "{{count}} waypoints placed"
    },
    "reverseGeocodeMode": {
      "title": "Reverse Geocode mode active",
      "hint": "Click anywhere on the map to look up the address at that point.",
      "exit": "Exit"
    },
    "pixelTimeSeriesMode": {
      "start": "Pixel time series"
    }
  },
  "terrainSettings": {
    "title": "Terrain exaggeration",
    "description": "Adjust the vertical exaggeration of the 3D terrain. Higher values make hills and mountains appear steeper.",
    "label": "Vertical exaggeration",
    "controlLabel": "Toggle terrain (double-click for exaggeration)",
    "reset": "Reset",
    "done": "Done"
  },
  "pixelTimeSeries": {
    "title": "Pixel time series",
    "empty": "Click a pixel on the map to plot its value over time. Add more pixels to compare.",
    "band": "Band",
    "bandOption": "Band {{index}}",
    "pointLabel": "Point {{number}}",
    "pickPoints": "Pick points",
    "stopPicking": "Stop picking",
    "clearAll": "Clear all",
    "removePoint": "Remove {{label}}",
    "close": "Close",
    "erroredExcluded": "Export excludes {{n}} failed read(s).",
    "querying": "Reading pixel values across the timeline...",
    "progress": "Reading {{done}} of {{total}}...",
    "noValues": "No values for the selected band at these locations (outside the raster or all timesteps are nodata).",
    "truncated": "Showing {{kept}} of {{total}} timeline steps (downsampled to limit reads).",
    "chartAria": "Line chart of pixel value over time",
    "yAxis": "Y axis",
    "yMin": "Min",
    "yMax": "Max",
    "axisAuto": "auto",
    "gapNote": "Dashed segments span dates with no reading (nodata or outside coverage).",
    "exportCsv": "Export CSV",
    "exportGeoParquet": "Export GeoParquet"
  },
  "basemapExtract": {
    "title": "Extract Offline Basemap",
    "url": "Basemap URL",
    "urlPlaceholder": "https://data.source.coop/…/planet.pmtiles",
    "useView": "Use map view",
    "drawBbox": "Draw on map",
    "drawing": "Drawing…",
    "drawHint": "Drag a box on the map to set the extract area.",
    "clearBbox": "Clear the drawn area",
    "north": "North",
    "south": "South",
    "west": "West",
    "east": "East",
    "bboxHint": "Enter a valid bounding box: west < east and south < north, within [-180, 180] and [-90, 90].",
    "minZoom": "Min zoom",
    "maxZoom": "Max zoom",
    "zoomHint": "Zoom levels must be whole numbers with min ≤ max (0–30). Levels above the archive's maximum are ignored.",
    "errorNoSourceLayers": "This vector archive has no layer metadata, so it can't be rendered. Try a different archive.",
    "savedTitle": "Saved basemaps",
    "openFile": "Open file…",
    "savedEmpty": "No saved basemaps yet. Extract one above, or open a .pmtiles file.",
    "errorNotBasemap": "This file isn't a Protomaps vector basemap, so it can't be styled.",
    "apply": "Use as basemap",
    "rename": "Rename",
    "delete": "Delete",
    "confirmDelete": "Delete?",
    "style": "Basemap style",
    "flavor": {
      "light": "Light",
      "dark": "Dark",
      "white": "White",
      "grayscale": "Grayscale",
      "black": "Black"
    },
    "flavorOverlay": "None (overlay layer)",
    "styleHintBasemap": "Renders the extract as a styled Protomaps basemap (roads, water, labels), offline.",
    "styleHintOverlay": "Adds the extract as a plain overlay layer instead of a styled basemap.",
    "phaseDirectories": "Reading archive directories…",
    "phaseData": "Downloading tiles…",
    "resize": "Resize panel",
    "estimatedSize": "≈ {{size}} · {{tiles}} tiles",
    "estimatedSizeLarge": "Large download: ≈ {{size}} · {{tiles}} tiles",
    "planWarning": "This extract is about {{size}} across {{tiles}} tiles and is assembled in memory. Continue?",
    "planContinue": "Continue",
    "extract": "Extract",
    "extracting": "Extracting…",
    "successSaved": "Saved to {{path}} and added to the map.",
    "successAdded": "Added to the map (the file was not saved).",
    "successAddedSaveFailed": "Added to the map, but saving to disk failed: {{error}}",
    "successBasemapSaved": "Saved to {{path}} and set as the basemap.",
    "successBasemapApplied": "Set as the basemap (the file was not saved).",
    "successBasemapSaveFailed": "Set as the basemap, but saving to disk failed: {{error}}"
  },
  "rasterSubset": {
    "title": "Extract subset",
    "drawBbox": "Draw bounding box",
    "drawing": "Drawing…",
    "drawHint": "Click and drag on the map to draw the extract area. Press Esc to cancel.",
    "useView": "Use view",
    "north": "North",
    "south": "South",
    "west": "West",
    "east": "East",
    "bboxHint": "Enter a valid box: west/east within -180 to 180, south/north within -90 to 90, with west < east and south < north.",
    "bboxAntimeridianHint": "West must be less than East. Boxes that cross the 180° meridian aren't supported; split them into two extracts.",
    "zoom": "Zoom level",
    "zoomHint": "Enter a whole zoom level between 0 and 30.",
    "resolution": "Resolution",
    "resolutionPlaceholder": "Native",
    "resolutionHint": "Output pixel size in the output CRS units. Leave blank to keep the source resolution.",
    "advanced": "Advanced options",
    "outputCrs": "Output CRS (EPSG)",
    "outputCrsPlaceholder": "Same as input",
    "nodata": "Nodata value",
    "nodataPlaceholder": "None",
    "additionalArgs": "Additional options",
    "additionalArgsPlaceholder": "level=2\nwidth=512",
    "additionalArgsHint": "One key=value per line, e.g. level, width, height.",
    "errorResolution": "Resolution must be a positive number.",
    "errorOutputCrs": "Output CRS must be a positive EPSG code.",
    "errorNodata": "Nodata must be a number.",
    "errorAdditionalArgs": "Additional options must be one key=value per line.",
    "extract": "Extract & save",
    "extracting": "Extracting…",
    "success": "Subset saved."
  },
  "mapGrid": {
    "layers": "Layers",
    "layersLabel": "Layer visibility for map {{number}}",
    "noLayers": "No layers yet",
    "labelPlaceholder": "Label",
    "labelLabel": "Label for map {{number}}",
    "removePane": "Remove map {{number}}",
    "show3d": "Show map {{number}} as a 3D globe",
    "show2d": "Show map {{number}} as a 2D map",
    "only2d": "2D only"
  },
  "mapContextMenu": {
    "copyCoordinatesHint": "Copy coordinates to clipboard",
    "quickActions": "Quick actions",
    "whatsHere": "What's here?",
    "copyGeoJson": "Copy as GeoJSON",
    "centerHere": "Center map here",
    "zoomInHere": "Zoom in here",
    "viewInGoogleMaps": "View in Google Maps",
    "viewInGoogleEarth": "View in Google Earth"
  },
  "quickAnalysis": {
    "menu": "Quick analysis",
    "bufferHere": "Buffer {{distance}} here",
    "bufferFeatures": "Buffer all features by {{distance}}",
    "driveTimeHere": "Drive time from here ({{contours}} min)",
    "walkTimeHere": "Walk time from here ({{contours}} min)",
    "centroids": "Centroids",
    "convexHull": "Convex hull",
    "boundingBox": "Bounding box",
    "openInProcessing": "Open in Processing…",
    "bufferLayerName": "Buffer {{distance}}",
    "bufferOfLayerName": "{{name}} buffer {{distance}}",
    "driveTimeLayerName": "Drive time",
    "walkTimeLayerName": "Walk time",
    "centroidsLayerName": "{{name}} centroids",
    "convexHullLayerName": "{{name}} convex hull",
    "boundingBoxLayerName": "{{name}} bounding box",
    "running": "Running {{tool}}…",
    "failed": "{{tool}} failed",
    "viewDetails": "View details",
    "unit": {
      "meters": "m",
      "kilometers": "km",
      "miles": "mi"
    }
  },
  "knowledgeCard": {
    "title": "Place info",
    "loading": "Looking up this place…",
    "empty": "No Wikipedia articles found near this place.",
    "error": "Could not load place info. Please try again.",
    "readMore": "Read more on Wikipedia",
    "nearby": "Nearby places",
    "attribution": "Content from Wikipedia, licensed CC BY-SA.",
    "noticeTitle": "Knowledge cards use Wikipedia",
    "noticeDesc": "Opening a knowledge card sends the coordinates of the place you clicked (and the title of any nearby article you open) to Wikipedia's public API to fetch a summary and photo — your coordinates leave your device for those requests."
  },
  "onboarding": {
    "title": "Welcome to GeoLibre",
    "description": "Choose your experience level to tailor the interface. You can change this any time in Settings → Interface.",
    "level": {
      "beginner": {
        "title": "Beginner",
        "description": "Show only the essential data sources and tools."
      },
      "intermediate": {
        "title": "Intermediate",
        "description": "Show common data sources, services, and plugins."
      },
      "advanced": {
        "title": "Advanced",
        "description": "Show everything GeoLibre has to offer."
      }
    },
    "showEverything": "Skip — show everything"
  },
  "settings": {
    "title": "Settings",
    "description": "Configure project preferences and runtime settings.",
    "saveButton": "Save Settings",
    "section": {
      "map": "Map",
      "layout": "Layout",
      "appearance": "Appearance",
      "interface": "Interface",
      "geocoding": "Geocoding",
      "ai": "AI Providers",
      "environment": "Environment",
      "updates": "Updates"
    },
    "menu": {
      "mapPreferences": "Map Preferences",
      "layoutSettings": "Layout Settings",
      "appearanceSettings": "Appearance Settings",
      "interfaceSettings": "Interface Settings",
      "geocoding": "Geocoding",
      "ai": "AI Providers",
      "environmentVariables": "Environment Variables",
      "updates": "Update Settings",
      "managePlugins": "Manage Plugins",
      "styleManager": "Style Manager",
      "urlOverrideNote": "URL layout parameters override saved settings."
    },
    "updates": {
      "title": "Software Updates",
      "description": "Control how GeoLibre checks for new versions when the desktop app starts.",
      "checkOnStartup": "Check for updates on startup",
      "checkOnStartupHint": "When enabled, GeoLibre checks for a newer version each time the app starts. Turn this off for a fully offline workflow.",
      "notificationLevel": "Notify me about",
      "notificationLevelHint": "Choose which kinds of releases trigger a startup notification.",
      "level": {
        "all": "All releases (major, minor, and patches)",
        "minor": "Major and minor releases only",
        "major": "Major releases only"
      }
    },
    "map": {
      "constraintsTitle": "Map constraints",
      "restrictBounds": "Restrict map bounds",
      "west": "West",
      "south": "South",
      "east": "East",
      "north": "North",
      "useCurrentView": "Use Current View",
      "useCurrentViewHint": "Captures the current map extent and turns on Restrict map bounds.",
      "useCurrentViewGlobeHint": "Switch to the Mercator projection before using this. In the Globe projection the map can still drift slightly beyond the captured bounds.",
      "minZoom": "Min zoom",
      "maxZoom": "Max zoom",
      "maxPitch": "Max pitch",
      "renderWorldCopies": "Render world copies",
      "ellipsoid": "Celestial body",
      "ellipsoidHint": "Sets the radius used for distance, area, and scale measurements. Pick a matching planetary basemap under Add Data.",
      "scaleUnit": "Scale bar units",
      "scaleUnitMetric": "Metric (m / km)",
      "scaleUnitImperial": "Imperial (ft / mi)",
      "scaleUnitNautical": "Nautical (nmi)",
      "scaleUnitHint": "Choose the units shown on the scale bar at the bottom of the map.",
      "errorBoundsUnavailable": "The map bounds are not available yet."
    },
    "layout": {
      "title": "Layout",
      "description": "Workspace visibility and toolbar presentation.",
      "toolbar": "Toolbar",
      "panels": "Panels",
      "showToolbarLabels": "Show toolbar labels",
      "showProjectInfo": "Show project info",
      "showProjectInfoToolbar": "Show project info in the toolbar",
      "showLayersPanel": "Show Layers panel",
      "showStylePanel": "Show Style panel",
      "showBrowserPanel": "Show Browser panel",
      "showCommentsPanel": "Show Comments panel",
      "showAttributePanel": "Show Attribute panel",
      "urlParamsNote": "URL layout parameters still apply when present in shared viewer links."
    },
    "appearance": {
      "title": "Appearance",
      "description": "Choose a light or dark mode and an accent color that applies on top of it.",
      "themeMode": "Mode",
      "mode": {
        "light": "Light",
        "dark": "Dark"
      },
      "accentColor": "Accent color",
      "custom": "Custom",
      "customColor": "Custom color",
      "customColorHex": "Custom color hex code",
      "scheme": {
        "blue": "Blue",
        "violet": "Violet",
        "emerald": "Emerald",
        "rose": "Rose",
        "amber": "Amber"
      }
    },
    "interface": {
      "title": "Interface profile",
      "description": "Choose an experience level to simplify the interface. Nothing is removed, so you can switch levels or re-enable items here at any time.",
      "presets": "Experience level",
      "presetsHint": "Beginner, Intermediate, and Advanced apply a curated layout instantly. Editing any item below switches to Custom, or click Custom to keep the current setup in custom mode.",
      "level": {
        "beginner": "Beginner",
        "intermediate": "Intermediate",
        "advanced": "Advanced",
        "custom": "Custom"
      },
      "dataSources": "Data sources",
      "plugins": "Plugins",
      "menus": "Menus",
      "lockedNote": "This interface profile is managed by your administrator and cannot be changed."
    },
    "env": {
      "tokenTitle": "Share.GeoLibre API token",
      "tokenDescription": "Project > Share uses this token to upload your maps to {{shareHost}}. Open <tokenLink>{{shareHost}}/settings</tokenLink>, create a token under Settings > API tokens, then paste it into the field below.",
      "tokenStorageNote": "Stored locally on this device and sent only to {{shareHost}} to authenticate uploads. On the web build it shares the same browser storage as other site data, so revoke it on {{shareHost}} if your machine is compromised.",
      "tokenUnavailable": "This deployment has no project sharing server configured, so no API token is needed.",
      "tokenHostInvalid": "This deployment's project sharing server address is not valid, so this token cannot be used.",
      "tokenPlaceholder": "glb_…",
      "cesiumTokenTitle": "Cesium Ion token",
      "cesiumTokenDescription": "The 3D globe (a split-view pane) uses Cesium Ion world imagery and terrain, which need an access token. Create a free account at <tokenLink>ion.cesium.com/tokens</tokenLink>, copy your default access token, and paste it below. Without a token the 3D globe toggle is hidden.",
      "cesiumTokenStorageNote": "Stored locally on this device (not in the project file, so it is never shared) and sent only to Cesium Ion. On the web build it shares the same browser storage as other site data.",
      "cesiumTokenPlaceholder": "eyJhbGciOi…",
      "variablesTitle": "Environment variables",
      "variablesCount_one": "{{count}} enabled runtime variable.",
      "variablesCount_other": "{{count}} enabled runtime variables.",
      "secretsWarning": "Values are stored in plain text in the project file and may be exposed when the project is shared. Avoid putting secrets here unless the project file stays private.",
      "empty": "No environment variables configured.",
      "variableFallback": "variable",
      "enableAria": "Enable {{name}}",
      "nameAria": "Variable name",
      "namePlaceholder": "VITE_EXAMPLE_KEY",
      "valueAria": "Variable value",
      "valuePlaceholder": "Value",
      "showValueAria": "Show value for {{name}}",
      "hideValueAria": "Hide value for {{name}}",
      "removeAria": "Remove {{name}}",
      "errorNamePattern": "Environment variable names must start with a letter or underscore and contain only letters, numbers, and underscores.",
      "errorDuplicate": "Environment variable \"{{name}}\" is duplicated.",
      "stripPromptTitle": "Strip credentials?",
      "stripPromptDesc": "This project has {{count}} credential-bearing field(s), such as API keys, request headers, or plugin settings. Remove them from the saved file? The current workspace keeps them either way.",
      "stripButton": "Strip credentials",
      "keepButton": "Keep in file"
    },
    "geocoding": {
      "title": "Geocoding",
      "description": "Choose the geocoding backend used by Geocode Addresses and Reverse Geocode. Nominatim is the default and needs no key.",
      "provider": "Provider",
      "requiresKey": "This provider needs an API key or access token.",
      "optionalKey": "The hosted service needs an API key; a self-hosted instance does not.",
      "noKey": "This provider works without an API key.",
      "apiKey": "API key",
      "apiKeyPlaceholder": "Paste the provider API key or token",
      "toggleApiKey": "Toggle API key visibility",
      "forwardEndpoint": "Forward endpoint (optional)",
      "reverseEndpoint": "Reverse endpoint (optional)",
      "email": "Contact email (optional)",
      "emailPlaceholder": "you@example.org",
      "emailHint": "Only used by Nominatim, which recommends providing it to help identify your application — sent only when provided.",
      "secretsWarning": "Keys are stored in plain text in the project file and may be exposed when the project is shared. They are also sent as query parameters, so they appear in geocoding request URLs visible in browser DevTools and any proxy logs.",
      "corsNote": "Google does not officially allow browser requests to its Geocoding API, so requests may be blocked unless served through a same-origin proxy."
    },
    "ai": {
      "title": "AI Assistant providers",
      "description": "Configure credentials for the AI Assistant. Choose a provider, fill in the fields it needs, then Save. Only one configured provider is required to start chatting.",
      "providerLabel": "Provider",
      "providerHint": "Choose a provider to reveal the exact fields it needs.",
      "configuredMark": "(configured)",
      "optionalMark": "(optional)",
      "statusReady": "{{provider}} is configured and ready to use.",
      "statusIncomplete": "Fill in the required fields below to enable {{provider}}.",
      "secretsNote": "Credentials are saved locally on this device, not in the project file you share, so they persist across restarts. Anyone with access to this device could read them.",
      "getCredentials": "Where to get {{provider}} credentials",
      "showValue": "Show {{name}}",
      "hideValue": "Hide {{name}}",
      "osEnvNote": "The desktop app also reads matching API keys from your system environment variables. Those are used automatically and are never saved to the project file — leave a field blank to keep using the environment value.",
      "osEnvField": "Read from your system environment variable {{name}}.",
      "osEnvPlaceholder": "Set in your system environment",
      "newProfile": "New profile",
      "cancel": "Cancel",
      "addProfile": "Add profile",
      "profileName": "Profile name",
      "profileNamePlaceholder": "e.g. Work Gemini, Local Ollama",
      "profileCount_one": "{{count}} profile",
      "profileCount_other": "{{count}} profiles",
      "noProfiles": "No profiles yet. Add one below to configure the AI Assistant.",
      "setDefault": "Set as default",
      "defaultProfile": "Default",
      "edit": "Edit",
      "deleteProfile": "Delete profile",
      "backToProfiles": "← Back to profiles",
      "saveProfile": "Save profile",
      "profileEditSaveHint": "Save or discard your profile changes above, then click Save Settings to commit all changes.",
      "field": {
        "apiKey": "API key",
        "baseUrl": "Base URL",
        "model": "Model",
        "region": "Region",
        "accessKeyId": "Access Key ID",
        "secretAccessKey": "Secret Access Key",
        "sessionToken": "Session token"
      },
      "placeholder": {
        "geminiKey": "AIza…",
        "anthropicKey": "sk-ant-…",
        "openaiKey": "sk-…",
        "ollamaBaseUrl": "http://localhost:11434",
        "ollamaModel": "llama3.2",
        "awsAccessKey": "AKIA…",
        "awsSecretKey": "wJalrXUtnFEMI…",
        "awsRegion": "us-east-1",
        "awsSessionToken": "FwoGZXIvYXdz… (if using temporary credentials)",
        "customBaseUrl": "https://api.example.com/v1",
        "customModel": "model-id",
        "customApiKey": "sk-… (if required)"
      }
    }
  },
  "toolbar": {
    "menu": {
      "project": "Project",
      "import": "Import",
      "edit": "Edit",
      "view": "View",
      "addData": "Add Data",
      "processing": "Processing",
      "controls": "Controls",
      "plugins": "Plugins",
      "help": "Help",
      "settings": "Settings"
    },
    "atmosphere": {
      "haloColor": "Halo color",
      "haloExtent": "Halo extent",
      "haloExtentHint": "How far the atmospheric glow reaches past the globe. Lower keeps data tight to the surface; higher gives a wide, airy halo.",
      "haloOpacity": "Halo strength",
      "spaceColor": "Space color",
      "reset": "Reset to defaults",
      "globeOnly": "Atmospheric effects are only available when Globe view is enabled."
    },
    "sun": {
      "title": "Sun",
      "date": "Date",
      "time": "Time",
      "timeOfDay": "Time of day",
      "play": "Play",
      "pause": "Pause",
      "stepBack": "Step back one hour",
      "stepForward": "Step forward one hour",
      "speed": "Animation speed",
      "loop": "Loop animation",
      "now": "Now",
      "shade": "Night shading",
      "close": "Close",
      "localTimeNote": "Times shown in your computer's time zone."
    },
    "routeAnimation": {
      "title": "Route Animation",
      "layer": "Route layer",
      "selectLayer": "Select a line layer…",
      "noLineLayers": "No line layers in the project",
      "play": "Play",
      "pause": "Pause",
      "loop": "Loop animation",
      "progress": "Progress",
      "speed": "Speed",
      "followCamera": "Follow",
      "followPitch": "Camera pitch",
      "followZoom": "Camera zoom",
      "followRotate": "Rotate to heading",
      "color": "Track color",
      "marker": "Marker",
      "markerStyle": {
        "arrow": "Arrow (heading)",
        "point": "Point",
        "none": "None"
      },
      "trail": "Trail",
      "saveVideoMp4": "Save as MP4",
      "saveVideoWebm": "Save as WebM",
      "estimatedLength": "≈ {{seconds}} s",
      "recordingStatus": "Recording… {{percent}}%",
      "savingVideo": "Saving video…",
      "stop": "Stop",
      "videoSaved": "Saved {{name}}",
      "videoError": "Could not record the animation. Please try again.",
      "videoUnsupported": "Video recording isn't supported in this browser.",
      "videoFileTypeMp4": "MP4 video",
      "videoFileTypeWebm": "WebM video",
      "collapse": "Collapse",
      "expand": "Expand",
      "close": "Close"
    },
    "flightSim": {
      "title": "Flight Simulator",
      "start": "Start flying",
      "stop": "Stop flying",
      "collapse": "Collapse",
      "expand": "Expand",
      "close": "Close",
      "speed": "Speed",
      "altitude": "Altitude",
      "heading": "Heading",
      "agl": "Above ground",
      "throttle": "Throttle",
      "maxSpeed": "Top speed",
      "minAgl": "Terrain clearance",
      "units": "Units",
      "imperial": "Knots / feet",
      "metric": "km/h / meters",
      "bankCamera": "Bank the horizon in turns",
      "invertPitch": "Invert pitch axis",
      "knots": "kt",
      "kph": "km/h",
      "feet": "ft",
      "meters": "m",
      "terrainWarning": "Terrain — pull up",
      "help": "Arrows or A/D steer · W/S or Page Up/Down throttle · Space levels the wings · Esc exits."
    },
    "setView": {
      "title": "Set View",
      "description": "Move the map to an exact camera.",
      "sectionCoordinates": "Coordinates",
      "smartPaste": "Paste coordinates",
      "smartPasteInputLabel": "Coordinate string",
      "smartPastePlaceholder": "e.g. 51.5074, -0.1278 or 51°30'26\"N, 0°07'39\"W",
      "smartPasteInfo": "Type or paste a full coordinate string in DD, DMS, or DDM, then run Process input. GeoLibre detects the format and fills the longitude and latitude fields below. Adjust zoom, pitch, and bearing separately before going.",
      "smartPasteInfoLabel": "About pasting coordinates",
      "smartPasteInvalid": "Could not read those coordinates. Enter a full longitude and latitude in DD, DMS, or DDM, for example 51.5074, -0.1278. A partial or incomplete string cannot be parsed.",
      "processInput": "Process input",
      "processed": "Filled the longitude and latitude fields below.",
      "sectionZoom": "Camera Zoom",
      "sectionOrientation": "Camera Orientation",
      "orientationHint": "Pitch and bearing default to 0 if left blank.",
      "format": "Manual entry format",
      "formatInfo": "These buttons only choose how you type the center by hand. The paste box above already accepts any format.\nDD: 51.5074, -0.1278\nDMS: 51°30'26\"N, 0°07'39\"W\nDDM: 51°30.44'N, 0°07.65'W",
      "formatInfoLabel": "About coordinate formats",
      "formatDd": "Decimal degrees (DD)",
      "formatDms": "Degrees, minutes, seconds (DMS)",
      "formatDdm": "Degrees and decimal minutes (DDM)",
      "formatDdShort": "DD",
      "formatDmsShort": "DMS",
      "formatDdmShort": "DDM",
      "longitude": "Longitude",
      "latitude": "Latitude",
      "degrees": "Degrees",
      "minutes": "Minutes",
      "seconds": "Seconds",
      "hemisphere": "Hemisphere",
      "zoom": "Zoom",
      "pitch": "Pitch",
      "bearing": "Bearing",
      "go": "Go",
      "invalid": "Enter a valid longitude (−180 to 180), latitude (−90 to 90), and zoom.",
      "invalidDms": "Enter valid degrees, minutes (0 to 59), seconds (0 to 59), and zoom.",
      "invalidDdm": "Enter valid degrees, decimal minutes (0 to < 60), and zoom."
    },
    "commandGroup": {
      "project": "Project",
      "addData": "Add Data",
      "processing": "Processing",
      "controls": "Controls",
      "view": "View",
      "help": "Help",
      "plugins": "Plugins",
      "settings": "Settings"
    },
    "command": {
      "projectNew": "New Project",
      "projectOpenFile": "Open Project from File",
      "projectOpenUrl": "Open Project from URL",
      "projectSave": "Save Project",
      "projectSaveAs": "Save Project As…",
      "projectShare": "Share Project…",
      "projectCollaborate": "Collaborate…",
      "projectPrint": "Print…",
      "addVectorLayer": "Add Vector Layer",
      "addRasterLayer": "Add Raster Layer",
      "addOsmPbfLayer": "Add OSM PBF Layer",
      "addLayer": "Add {{name}}",
      "addStacLayer": "Add STAC Layer",
      "addGeoparquetLayer": "Add GeoParquet Layer",
      "addFlatgeobufLayer": "Add FlatGeobuf Layer",
      "addPmtilesLayer": "Add PMTiles Layer",
      "addZarrLayer": "Add Zarr Layer",
      "addNetcdfLayer": "Add NetCDF / HDF Layer",
      "addLidarLayer": "Add LiDAR Layer",
      "addSplattingLayer": "Add Gaussian Splatting",
      "add3dTilesLayer": "Add 3D Tiles Layer",
      "addDuckdbLayer": "Add DuckDB Layer",
      "whiteboxTools": "Whitebox Tools",
      "sqlWorkspace": "SQL Workspace",
      "pythonConsole": "Python Console",
      "notebook": "Jupyter Notebook",
      "dashboard": "Dashboard",
      "assistant": "AI Assistant",
      "geocode": "Geocode Addresses",
      "modelBuilder": "Batch & Models",
      "planetaryComputer": "Planetary Computer",
      "earthEngine": "Earth Engine",
      "segmentation": "AI Segmentation",
      "objectDetection": "Object Detection",
      "segmentEverything": "Segment Everything",
      "toggleControl": "Toggle {{name}} Control",
      "toggleAtmosphereEffects": "Toggle Atmospheric Effects",
      "toggleDirections": "Toggle Directions",
      "toggleSearch": "Toggle Search",
      "toggleColorbar": "Toggle Colorbar",
      "toggleLegend": "Toggle Legend",
      "toggleHtmlPanel": "Toggle HTML Panel",
      "toggleMeasure": "Toggle Measure",
      "toggleBookmark": "Toggle Bookmark",
      "toggleMinimap": "Toggle Minimap",
      "toggleViewState": "Toggle View State",
      "previousView": "Previous View",
      "nextView": "Next View",
      "resetNorth": "Reset Bearing",
      "resetPitch": "Reset Pitch",
      "resetPitchBearing": "Reset Pitch & Bearing",
      "setView": "Set View",
      "viewComments": "View Comments",
      "zoomIn": "Zoom In",
      "zoomOut": "Zoom Out",
      "switchToLight": "Switch to Light Mode",
      "switchToDark": "Switch to Dark Mode",
      "keyboardShortcuts": "Keyboard Shortcuts",
      "website": "Website",
      "githubRepository": "GitHub repository",
      "diagnostics": "Diagnostics",
      "giveFeedback": "Give Feedback",
      "checkForUpdates": "Check for Updates",
      "about": "About",
      "togglePlugin": "Toggle {{name}}",
      "managePlugins": "Manage Plugins",
      "styleManager": "Style Manager…"
    },
    "layerType": {
      "delimitedText": "Delimited Text Layer",
      "photos": "Geotagged Photos",
      "gpx": "GPX Layer",
      "mbtiles": "MBTiles Layer",
      "xyz": "XYZ Layer",
      "wms": "WMS Layer",
      "wfs": "WFS Layer",
      "wmts": "WMTS Layer",
      "ogcFeatures": "OGC API - Features",
      "ogcVectorTiles": "OGC Vector Tiles",
      "arcgis": "ArcGIS Layer",
      "georss": "GeoRSS Layer",
      "video": "Video Layer",
      "deckglViz": "Deck.gl Layer",
      "gltfModel": "3D Model (glTF)",
      "postgres": "PostgreSQL Layer"
    },
    "conversion": {
      "vectorToVector": "Vector to Vector",
      "zipInputBrowserError": "Zipped Shapefiles can only be converted in the GeoLibre desktop app. In the browser, select the unzipped .shp together with its .dbf, .shx, and .prj files.",
      "browserOutputUnsupported": "In the browser, the output can be GeoJSON, CSV, GeoParquet, GeoPackage, FlatGeobuf, or Shapefile (.zip). \".{{extension}}\" output needs the GeoLibre desktop app.",
      "outputExtensionRequired": "Add a file extension to the output name to choose the format.",
      "readingWithDuckDb": "Reading {{name}} with DuckDB-WASM",
      "readFeatures": "Read {{features}} features from {{name}}",
      "savedFile": "Saved {{name}}",
      "saveCanceled": "Conversion finished; save was canceled.",
      "vectorToGeoparquet": "Vector to GeoParquet",
      "vectorToFlatgeobuf": "Vector to FlatGeobuf",
      "vectorToShapefile": "Vector to Shapefile",
      "vectorToGeopackage": "Vector to GeoPackage",
      "csvToGeoparquet": "CSV to GeoParquet",
      "vectorToPmtiles": "Vector to PMTiles",
      "rasterToCog": "Raster to COG",
      "rasterToPmtiles": "Raster to PMTiles",
      "needsDesktop": "This conversion needs the GeoLibre desktop app or a running sidecar.",
      "runsInBrowserDuckDb": "Conversion runs in your browser with DuckDB-WASM.",
      "runsInBrowserWriters": "Conversion runs in your browser with DuckDB-WASM and the bundled writers.",
      "runsInBrowserWasm": "Conversion runs in your browser with geolibre-wasm. No sidecar needed.",
      "convertingWithWasm": "Converting {{name}} with geolibre-wasm",
      "rasterShape": "Read {{width}}×{{height}} raster with {{bands}} band(s)",
      "wroteCog": "Wrote a tiled COG with overviews ({{compression}})",
      "notAGeoTiff": "This file is not a readable GeoTIFF. In the browser, Raster to COG reads GeoTIFF only; other formats need the desktop app.",
      "rasterTooLargeForBrowser": "In the browser this decodes the whole raster in WebAssembly, which is limited to about 4 GB, so this one does not fit. Convert it with the GeoLibre desktop app, or build the COG beforehand with gdal_translate or rio-cogeo.",
      "zoomRangeError": "Zoom levels must satisfy 0 ≤ min ≤ max ≤ {{max}}.",
      "colormap": "Colormap",
      "resampling": "Resampling",
      "colormapDefault": "Default (viridis)",
      "zoomNative": "native",
      "rasterToPmtilesDesc": "Render a raster into a single PMTiles archive of Web Mercator PNG tiles, ready for cloud-native serving. One band is rendered through a colormap, so multi-band imagery is not drawn in true colour. Runs entirely in WebAssembly, so it needs no sidecar on either the web or desktop app.",
      "cogBrowserNote": "In the browser, 8-bit rasters keep their type and everything else (Int16 DEMs, Float64, …) is written as Float32. The desktop app preserves the original type.",
      "noSidecarConversion": "{{kind}} has no sidecar conversion.",
      "minZoom": "Min zoom",
      "maxZoom": "Max zoom",
      "convertFailed": "Could not convert this file.",
      "notAGeoTiffRasterOnly": "This file is not a readable GeoTIFF. Raster to PMTiles reads GeoTIFF only, on both the web and desktop app.",
      "band": "Band",
      "bandError": "Band must be a positive whole number.",
      "bandOutOfRange": "Band {{band}} does not exist; this raster has {{bands}} band(s).",
      "runsInBrowserVectorEngines": "Conversion runs in your browser with DuckDB-WASM, or geolibre-wasm for FlatGeobuf output.",
      "vectorToVectorDesc": "Convert between any vector formats DuckDB's spatial extension supports. The input and output formats are detected from the file extensions. The desktop app writes any format (FlatGeobuf, GeoPackage, Shapefile, KML, GML, …); the browser writes GeoJSON, CSV, GeoParquet, GeoPackage, FlatGeobuf, and Shapefile.",
      "vectorToVectorInputLabel": "Input vector file",
      "vectorToVectorOutputLabel": "Output vector file",
      "vectorToGeoparquetDesc": "Convert a vector dataset to a Hilbert-sorted, compressed GeoParquet file optimized for cloud-native range requests.",
      "vectorToGeoparquetInputLabel": "Input vector file",
      "vectorToGeoparquetOutputLabel": "Output GeoParquet file",
      "vectorToFlatgeobufDesc": "Convert a vector dataset to a Hilbert-sorted FlatGeobuf with a packed spatial index for fast cloud-native access.",
      "vectorToFlatgeobufInputLabel": "Input vector file",
      "vectorToFlatgeobufOutputLabel": "Output FlatGeobuf file",
      "vectorToShapefileDesc": "Convert a vector dataset to a zipped ESRI Shapefile (.shp/.shx/.dbf/.prj). Field names are truncated to 10 characters.",
      "vectorToShapefileInputLabel": "Input vector file",
      "vectorToShapefileOutputLabel": "Output zipped Shapefile",
      "vectorToGeopackageDesc": "Convert a vector dataset to a GeoPackage (.gpkg) for sharing with QGIS, ArcGIS, and other GIS tools.",
      "vectorToGeopackageInputLabel": "Input vector file",
      "vectorToGeopackageOutputLabel": "Output GeoPackage file",
      "csvToGeoparquetDesc": "Build point geometries from longitude/latitude columns and write a Hilbert-sorted, compressed GeoParquet.",
      "csvToGeoparquetInputLabel": "Input CSV file",
      "csvToGeoparquetOutputLabel": "Output GeoParquet file",
      "vectorToPmtilesDesc": "Tile a vector dataset into a single PMTiles archive of vector tiles, ready for cloud-native serving.",
      "vectorToPmtilesInputLabel": "Input vector file",
      "vectorToPmtilesOutputLabel": "Output PMTiles file",
      "rasterToPmtilesInputLabel": "Input raster file",
      "rasterToPmtilesOutputLabel": "Output PMTiles file",
      "rasterToCogDesc": "Convert a raster dataset to a valid, compressed Cloud Optimized GeoTIFF with internal tiling and overviews.",
      "rasterToCogInputLabel": "Input raster file",
      "rasterToCogOutputLabel": "Output COG file",
      "outputFileName": "Output file name",
      "shapefileSidecarHint": "For Shapefiles, select the .shp together with its .dbf, .shx, and .prj files.",
      "longitudeColumn": "Longitude column",
      "latitudeColumn": "Latitude column",
      "compression": "Compression",
      "rowGroupSize": "Row group size",
      "layerName": "Layer name",
      "noOutput": "No output yet.",
      "fallbackTitle": "Conversion"
    },
    "vectorTool": {
      "buffer": "Buffer",
      "centroids": "Centroids",
      "convexHull": "Convex hull",
      "dissolve": "Dissolve",
      "boundingBox": "Bounding box",
      "simplify": "Simplify",
      "clip": "Clip",
      "intersection": "Intersection",
      "difference": "Difference",
      "union": "Union",
      "spatialJoin": "Spatial join",
      "attributeJoin": "Attribute join",
      "selectByValue": "Select by value",
      "selectByLocation": "Select by location",
      "randomExtract": "Random extract",
      "reproject": "Reproject",
      "explode": "Explode",
      "aggregate": "Aggregate by attribute",
      "smooth": "Smooth",
      "grid": "Regular grid",
      "voronoi": "Voronoi / Delaunay",
      "cellSectors": "Cell-site coverage",
      "dggsGenerator": "DGGS Generator",
      "dggsBinning": "DGGS Binning",
      "dggsCompact": "DGGS Compact",
      "trajectorySpeed": "Trajectory speed",
      "detectStops": "Detect stops",
      "spaceTimeProximity": "Space-time proximity",
      "checkValidity": "Check validity",
      "fixGeometries": "Fix geometries",
      "checkTopologyRules": "Check topology rules",
      "fixTopology": "Fix topology"
    },
    "networkTool": {
      "isochrone": "Isochrone / service area",
      "odMatrix": "OD cost matrix",
      "sequentialRoute": "Sequential route (directions)"
    },
    "statisticsTool": {
      "globalMoransI": "Global Moran's I",
      "localMoransI": "Local Moran's I (LISA)",
      "getisOrd": "Getis-Ord Gi* hotspots",
      "averageNearestNeighbor": "Average nearest neighbor",
      "kernelDensity": "Kernel density (heatmap)",
      "emergingHotSpot": "Emerging Hot Spot (space-time cube)"
    },
    "rasterTool": {
      "hillshade": "Hillshade",
      "slope": "Slope",
      "aspect": "Aspect",
      "reproject": "Reproject",
      "resample": "Resample",
      "clipExtent": "Clip by extent",
      "clipMask": "Clip by mask layer",
      "polygonize": "Polygonize",
      "contour": "Contour",
      "interpolate": "Interpolation (IDW / Kriging)",
      "zonal": "Zonal statistics",
      "rasterCalc": "Raster calculator",
      "spectralIndex": "Spectral index",
      "invalidSpectralIndex": "Invalid spectral index.",
      "reclassify": "Reclassify",
      "mosaic": "Mosaic / merge",
      "focal": "Focal statistics",
      "inputRaster": "Input raster",
      "inputRasterA": "Input raster A",
      "inputRaster1": "First raster",
      "inputPoints": "Input points (GeoJSON)",
      "engine": "Engine",
      "engineClient": "Client (browser)",
      "engineSidecar": "Sidecar (rasterio/GDAL)",
      "clientHint": "Computes in your browser and adds the result to the map. For large rasters or geographic-CRS terrain, prefer the sidecar.",
      "switchToClientHint": "Or switch the engine to Client to run this tool in your browser.",
      "chooseGeoTiff": "Choose a GeoTIFF",
      "downloadGeoTiff": "Download GeoTIFF",
      "chooseInputRaster": "Choose an input raster.",
      "useAddedLayer": "Use a layer on the map",
      "useAddedLayerPlaceholder": "Choose a layer…",
      "loadingLayer": "Loading layer…",
      "layerLoadError": "Could not load the selected layer.",
      "runningInBrowser": "Running \"{{tool}}\" in your browser...",
      "loadedRaster": "Loaded raster: {{width}}×{{height}}, {{bands}} band(s).",
      "computedInBrowser": "Computed \"{{tool}}\" in the browser.",
      "addedToMap": "Added \"{{name}}\" to the map.",
      "largeRasterWarning": "Large raster ({{mp}} M pixels); the browser may be unresponsive while computing.",
      "mapAddFailed": "Map add failed (the result is still available to download): {{message}}",
      "mapAddError": "Could not add the result to the map.",
      "runError": "Could not run raster tool.",
      "saveError": "Could not save the result.",
      "dialogTitle": "Raster tools",
      "dialogDescription": "Run common raster operations on the Python sidecar (rasterio/GDAL), or in your browser when no sidecar is available.",
      "outputFile": "Output file",
      "noOutput": "No output yet.",
      "errorConnect": "Could not connect to sidecar.",
      "needsDesktopSidecar": "Raster tools need the GeoLibre desktop app with a running sidecar.",
      "errorPoll": "Could not poll job.",
      "errorStartSidecar": "Could not start GeoLibre sidecar.",
      "errorStartTool": "Could not start raster tool."
    },
    "mapControl": {
      "navigation": "Navigation",
      "fullscreen": "Fullscreen",
      "compass": "Compass",
      "geolocate": "Geolocate",
      "globe": "Globe",
      "terrain": "Terrain",
      "scale": "Scale",
      "attribution": "Attribution",
      "logos": "Logos",
      "logo": "MapLibre logo",
      "maptoolkitLogo": "Maptoolkit logo",
      "maptoolkitLogoHint": "Add a Maptoolkit basemap to display its logo."
    },
    "position": {
      "topLeft": "Top left",
      "topRight": "Top right",
      "bottomLeft": "Bottom left",
      "bottomRight": "Bottom right"
    },
    "item": {
      "newEllipsis": "New...",
      "openFrom": "Open From",
      "fileEllipsis": "File...",
      "urlEllipsis": "URL...",
      "galleryEllipsis": "Gallery...",
      "openRecent": "Open Recent",
      "projectHistoryEllipsis": "History...",
      "noRecentProjects": "No recent projects",
      "removeFromRecent": "Remove {{name}} from recent projects",
      "clearRecentProjects": "Clear Recent Projects",
      "duplicate": "Duplicate project",
      "saveAsEllipsis": "Save As...",
      "saveAsTemplateEllipsis": "Save as template...",
      "shareEllipsis": "Share...",
      "shareHostUnavailable": "Unavailable: this deployment's sharing server address is not valid.",
      "exportHtmlEllipsis": "Export as HTML...",
      "htmlFile": "HTML",
      "collaborateEllipsis": "Collaborate...",
      "printEllipsis": "Print...",
      "printLayoutEllipsis": "Print Layout...",
      "offlineBasemapEllipsis": "Offline Basemap...",
      "undo": "Undo",
      "redo": "Redo",
      "selectByExpressionEllipsis": "Select by Expression...",
      "selectByLocationEllipsis": "Select by Location...",
      "zoomToSelection": "Zoom to Selection",
      "invertSelection": "Invert Selection",
      "clearSelection": "Clear Selection",
      "exportSelection": "Export Selected Features as Layer",
      "previousView": "Previous View",
      "nextView": "Next View",
      "resetOrientation": "Reset Orientation",
      "resetPitch": "Reset Pitch",
      "resetBearing": "Reset Bearing",
      "resetPitchBearing": "Reset Pitch & Bearing",
      "setView": "Set View…",
      "splitView": "Split View",
      "splitViewSingle": "Single map",
      "splitViewTwoColumns": "Two columns",
      "splitViewTwoRows": "Two rows",
      "splitViewGrid2x2": "2 × 2 grid",
      "splitViewGrid2x3": "2 × 3 grid",
      "splitViewGrid3x3": "3 × 3 grid",
      "splitViewSync": "Sync views",
      "viewInGoogleMaps": "View in Google Maps",
      "viewInGoogleEarth": "View in Google Earth",
      "zoomIn": "Zoom In",
      "zoomOut": "Zoom Out",
      "sectionFiles": "Files",
      "sectionWebServices": "Web services",
      "sectionCloudFormats": "Cloud formats",
      "section3dLayers": "3D layers",
      "sectionDatabases": "Databases",
      "georeferencing": "Georeferencing",
      "vectorLayer": "Vector Layer",
      "cadLayer": "CAD (DXF/DWG) Layer",
      "gdbLayer": "File Geodatabase (GDB)",
      "rasterLayer": "Raster Layer",
      "osmPbfLayer": "OSM PBF Layer",
      "stacLayer": "STAC Layer",
      "geoparquetLayer": "GeoParquet Layer",
      "flatgeobufLayer": "FlatGeobuf Layer",
      "pmtilesLayer": "PMTiles Layer",
      "basemapExtract": "Offline Basemap Extract",
      "zarrLayer": "Zarr Layer",
      "netcdfHdf": "NetCDF / HDF",
      "lidarLayer": "LiDAR Layer",
      "splattingLayer": "Gaussian Splatting",
      "threeDTilesLayer": "3D Tiles Layer",
      "duckdbLayer": "DuckDB Layer",
      "whitebox": "Whitebox",
      "geocode": "Geocode Addresses",
      "modelBuilder": "Batch & Models",
      "processingHistory": "History",
      "conversion": "Conversion",
      "vector": "Vector",
      "network": "Network",
      "statistics": "Spatial Statistics",
      "raster": "Raster",
      "hydrology": "Hydrology",
      "lidar": "LiDAR",
      "terrain": "Terrain",
      "remoteSensing": "Remote Sensing",
      "projection": "Projection",
      "geolibre": "GeoLibre",
      "subGroupGeometry": "Geometry",
      "subGroupOverlay": "Overlay",
      "subGroupJoin": "Join",
      "subGroupSelect": "Select",
      "subGroupDggs": "DGGS",
      "subGroupH3": "DGGS",
      "subGroupMovement": "Movement & time",
      "subGroupDataQuality": "Data quality",
      "subGroupTerrain": "Terrain",
      "subGroupReproject": "Reproject",
      "subGroupClip": "Clip",
      "subGroupRasterToVector": "Raster to Vector",
      "subGroupVectorToRaster": "Vector to Raster",
      "subGroupAnalysis": "Analysis",
      "mapControls": "Map controls",
      "fieldCollection": "Field Collection...",
      "gpsTracking": "GPS Tracking...",
      "recordTour": "Record Map Tour...",
      "recordVideo": "Record Video...",
      "atmosphereEffects": "Atmospheric Effects",
      "atmosphereEnabled": "Enabled",
      "spinGlobe": "Spinning Globe",
      "graticule": "Gridlines",
      "weather": "Weather",
      "weatherTooltip": "Overlay near-realtime weather layers you can animate.",
      "weatherPlay": "Play animation",
      "weatherPause": "Pause animation",
      "clouds": "Clouds",
      "cloudsShow": "Show clouds",
      "cloudsTooltip": "Near-realtime NASA satellite clouds, like Google Earth. Animate day by day.",
      "cloudsDate": "Date",
      "precipitation": "Precipitation",
      "precipitationShow": "Show precipitation",
      "precipitationTooltip": "Near-realtime RainViewer weather radar. Animate the last ~2 hours.",
      "precipitationTime": "Time",
      "sun": "Sun",
      "sunTooltip": "Simulate the sun's position and the day/night terminator for any date and time.",
      "routeAnimation": "Route Animation",
      "routeAnimationTooltip": "Animate a marker along a line layer, with play/pause, speed, a trail, and camera follow.",
      "flightSimulator": "Flight Simulator",
      "flightSimulatorTooltip": "Fly over the terrain with keyboard controls, like a flight simulator.",
      "spinGlobeBoundsTitle": "Bounds are locked",
      "spinGlobeBoundsDesc": "The globe can't spin while the map bounds are locked.",
      "spinGlobeBoundsHint": "Unlocking the bounds lets the globe spin freely. You can re-lock them anytime in Settings.",
      "spinGlobeBoundsUnlock": "Unlock bounds and spin",
      "directions": "Directions",
      "directionsTooltip": "Routing sends your waypoints to the public OSRM demo server (router.project-osrm.org).",
      "search": "Search",
      "colorbar": "Colorbar",
      "legend": "Legend",
      "html": "HTML",
      "measure": "Measure",
      "bookmark": "Bookmark",
      "minimap": "Minimap",
      "viewState": "View State",
      "activatePlugin": "Activate plugin",
      "deactivate": "Deactivate",
      "activate": "Activate",
      "position": "Position",
      "webServices": "Web Services",
      "dggs": "DGGS",
      "commandPalette": "Command Palette",
      "openProjectFromUrl": "Open project from URL",
      "importQgisProjectEllipsis": "Import QGIS Project…",
      "importArcgisProjectEllipsis": "Import ArcGIS Pro Project…",
      "arcgisImportComplete": "ArcGIS Pro project imported",
      "arcgisImportWarnings_one": "The project was imported, but {{count}} layer could not be loaded.",
      "arcgisImportWarnings_other": "The project was imported, but {{count}} layers could not be loaded.",
      "arcgisUnknownLayerType": "unknown",
      "arcgisImportReason": {
        "layer-type": "The {{layerType}} layer type is not supported.",
        "missing-source": "The layer has no readable local data source.",
        "format": "The layer's data format is not supported.",
        "network-path": "Network share paths are not loaded for security reasons.",
        "service": "ArcGIS service layers in projects are not supported yet.",
        "browser-local-file": "The local file is referenced, but browsers cannot reopen ArcGIS Pro data paths. Use GeoLibre Desktop to load it.",
        "map-extent": "The saved map extent uses a coordinate system GeoLibre cannot convert, so the map opened at a default view.",
        "nesting": "The group is nested too deeply, or the project refers back to a group that already contains it."
      },
      "qgisImportComplete": "QGIS project imported",
      "qgisImportWarnings_one": "The project was imported, but {{count}} layer could not be loaded.",
      "qgisImportWarnings_other": "The project was imported, but {{count}} layers could not be loaded.",
      "qgisUnknownProvider": "unknown",
      "qgisImportReason": {
        "non-vector": "Only file-based vector layers are supported in this first version.",
        "provider": "The {{provider}} data provider is not supported.",
        "missing-source": "The layer has no readable data source.",
        "format": "The layer's file format is not supported.",
        "remote-file": "Remote QGIS file sources are not supported yet.",
        "network-path": "Network share paths are not loaded for security reasons.",
        "browser-local-file": "The local file is referenced, but browsers cannot reopen QGIS data paths. Use GeoLibre Desktop to load it.",
        "browser-local-raster": "The raster is referenced by a local path. Use GeoLibre Desktop to load it."
      },
      "openProjectFromUrlDesc": "Load a `.geolibre.json` project and add it to recent projects.",
      "projectUrl": "Project URL",
      "opening": "Opening...",
      "open": "Open",
      "somethingWentWrong": "Something went wrong",
      "dismiss": "Dismiss",
      "saveProjectAsTitle": "Save project as",
      "saveProjectAsDesc": "Enter a file name. The project will download to your browser's downloads folder when you click Save.",
      "embedVectorTitle": "Embed local vector data?",
      "embedVectorDesc": "This project has {{count}} local vector layer(s) loaded from your computer. The browser cannot re-read them when the project is reopened, so their data must be embedded in the project file to be restored. Embedding adds about {{size}} to the file.",
      "embedVectorDescDesktop": "This project has {{count}} local vector layer(s) loaded from your computer. Embed their data to make the project self-contained (adds about {{size}}), or save file references that reload from disk when the project is reopened. References keep the file small but break if a source file is later moved or deleted.",
      "embedVectorEmbedButton": "Embed data",
      "embedVectorReferenceButton": "Save file references",
      "embedVectorSkipButton": "Save without data",
      "saveProjectFileName": "File name",
      "saveProjectFileNamePlaceholder": "my-project.geolibre.json",
      "exportHtmlAsTitle": "Export as interactive HTML",
      "exportHtmlAsDesc": "Enter a file name. The HTML page will download to your browser's downloads folder when you click Save.",
      "exportHtmlFileName": "File name",
      "exportHtmlFileNamePlaceholder": "my-map.html",
      "vectorDataFilter": "Vector data",
      "directionsNoticeTitle": "Directions uses a public routing server",
      "directionsNoticeDesc": "Turning on Directions sends the waypoints you place to the public OSRM demo server (router.project-osrm.org) to calculate routes — your coordinates leave your device for those requests. The demo server is rate-limited and supports driving only.",
      "reverseGeocode": "Reverse Geocode",
      "reverseGeocodeTooltip": "Click the map to look up an address. The clicked coordinates are sent to the configured geocoding provider (public Nominatim by default; change it in Settings → Geocoding).",
      "reverseGeocodeNoticeTitle": "Reverse Geocode uses an external service",
      "reverseGeocodeNoticeDesc": "Turning on Reverse Geocode sends the coordinates of each point you click to the configured geocoding provider (the public Nominatim service by default) to resolve an address — your coordinates leave your device for those requests. You can choose a different provider in Settings → Geocoding.",
      "networkNoticeTitle": "Network analysis uses an external routing server",
      "networkNoticeDesc": "Running a Network analysis tool sends the coordinates of your input points to a routing server to compute isochrones, cost matrices, and routes.",
      "networkNoticePrivacyHeading": "Data privacy",
      "networkNoticePrivacy": "Your input coordinates leave this device and are sent to the public Valhalla server at valhalla1.openstreetmap.de. Press Cancel if your project is bound by data privacy or data-sovereignty rules.",
      "networkNoticePrivacyCustom": "Your input coordinates leave this device and are sent to the configured routing server ({{endpoint}}). Press Cancel if your project is bound by data privacy or data-sovereignty rules.",
      "networkNoticePerformanceHeading": "Performance and limits",
      "networkNoticePerformance": "The public server is free but rate-limited, so large batches of points may be throttled or fail. For heavy use, run your own Valhalla server and enter its URL in the tool's \"Routing server (Valhalla)\" field (or set VITE_ROUTING_ENDPOINT in Settings → Environment Variables to make it the default).",
      "continue": "Continue",
      "largeOsmPbfTitle": "Large OSM PBF file",
      "largeOsmPbfDesc": "This file is about {{sizeMb}} MB. Parsing it converts every feature to GeoJSON in memory, which can be slow and may use a lot of memory in the browser. Continue?",
      "largeVectorDesc": "{{name}} has about {{count}} features. Loading it converts every feature to GeoJSON in memory and may slow down or freeze the app. Continue?",
      "addOsmPbfLayerTitle": "Add OSM PBF Layer",
      "addOsmPbfLayerDesc": "Load an OpenStreetMap .osm.pbf file. It is parsed in your browser and split into separate point, line, and polygon layers.",
      "urlLabel": "URL",
      "osmPbfUrlPlaceholder": "https://example.com/region.osm.pbf",
      "osmPbfSampleLabel": "Las Vegas",
      "osmPbfUrlHint": "Remote URLs load in the desktop app; in the browser the server must allow cross-origin requests (CORS).",
      "chooseLocalFile": "Choose local file…",
      "loadFromUrl": "Load from URL",
      "loadingOsmPbf": "Loading OSM PBF…",
      "loadingOsmPbfDesc": "Parsing the file and converting features to GeoJSON. This runs in the background and may take a moment for large extracts.",
      "loadingOsmPbfProgress": "Converting features to GeoJSON… {{processed}} of {{total}} OSM entities processed.",
      "projectName": "Project name",
      "storymapEllipsis": "Story Map..."
    },
    "plugin": {
      "maplibre-gl-annotations": "Annotations",
      "maplibre-gl-streetview": "Street View",
      "maplibre-gl-time-slider": "Time Slider",
      "geolibre-timelapse": "Timelapse",
      "maplibre-gl-esri-wayback": "Historical Imagery",
      "maplibre-gl-openaerialmap": "OpenAerialMap",
      "maplibre-gl-arcgis-hub": "ArcGIS Hub",
      "geolibre-stac-catalogs": "STAC Catalogs",
      "maplibre-gl-source-coop": "Source Cooperative",
      "maplibre-gl-natural-earth": "Natural Earth",
      "maplibre-gl-swipe": "Layer Swipe",
      "geolibre-elevation-profile": "Elevation Profile",
      "maplibre-gl-basemap-control": "Basemaps",
      "maplibre-layer-control": "Layer Control",
      "maplibre-gl-huggingface": "Hugging Face",
      "carto-light": "Carto Light Basemap",
      "geolibre-flight-simulator": "Flight Simulator",
      "geolibre-route-animation": "Route Animation",
      "geolibre-sun": "Sun Simulation",
      "maplibre-atmosphere-effects": "Atmospheric Effects",
      "maplibre-deckgl-viz": "Deck.gl Layer",
      "maplibre-gl-clouds": "Clouds",
      "maplibre-gl-components": "Components",
      "maplibre-gl-directions": "Directions",
      "maplibre-gl-earthdata-gis": "Earthdata GIS",
      "maplibre-gl-enviroatlas": "US EPA EnviroAtlas",
      "maplibre-gl-fema-wms": "FEMA NFHL",
      "maplibre-gl-geo-editor": "GeoEditor",
      "maplibre-gl-geoagent": "GeoAgent",
      "maplibre-gl-geolens": "GeoLens",
      "maplibre-gl-graticule": "Gridlines",
      "maplibre-gl-mapillary": "Mapillary",
      "maplibre-gl-nasa-earthdata": "NASA Earthdata",
      "maplibre-gl-national-map": "USGS National Map",
      "maplibre-gl-overture-maps": "Overture Maps",
      "maplibre-gl-precipitation": "Precipitation",
      "maplibre-gl-usgs-lidar": "USGS LiDAR",
      "maplibre-h3-grid": "H3",
      "maplibre-s2-grid": "S2",
      "maplibre-a5-grid": "A5",
      "maplibre-dggrid": "DGGRID",
      "maplibre-dggal": "DGGAL",
      "maplibre-olc": "OLC",
      "maplibre-geohash": "Geohash",
      "maplibre-tilecode": "Tilecode",
      "maplibre-reverse-geocode": "Reverse Geocode",
      "osm-basemap": "OpenStreetMap Basemap"
    },
    "fileDrop": {
      "overlayTitle": "Drop vector or raster files here to add layers",
      "overlaySubtext": "Your data is added instantly to the Layers panel.",
      "addedLayer": "Added \"{{name}}\" to the Layers panel.",
      "addedVectorLayers_one": "Added {{count}} vector layer to the Layers panel.",
      "addedVectorLayers_other": "Added {{count}} vector layers to the Layers panel.",
      "addedRasterLayers_one": "Added {{count}} raster layer to the Layers panel.",
      "addedRasterLayers_other": "Added {{count}} raster layers to the Layers panel.",
      "addedBoth": "Added {{vector}} and {{raster}} to the Layers panel.",
      "bothVectorLayers_one": "{{count}} vector layer",
      "bothVectorLayers_other": "{{count}} vector layers",
      "bothRasterLayers_one": "{{count}} raster layer",
      "bothRasterLayers_other": "{{count}} raster layers"
    },
    "error": {
      "couldNotOpenProject": "Could not open project.",
      "couldNotImportQgisProject": "Could not import QGIS project.",
      "couldNotImportArcgisProject": "Could not import ArcGIS Pro project.",
      "invalidProjectUrl": "Enter a valid HTTP or HTTPS project URL.",
      "couldNotOpenProjectUrl": "Could not open project URL.",
      "couldNotOpenRecentProject": "Could not open the recent project.",
      "couldNotLoadRecentProject": "Could not load the recent project.",
      "couldNotSaveProject": "Could not save the project.",
      "couldNotExportHtml": "Could not export the project to HTML.",
      "osmPbfNoFeatures": "No point, line, or polygon features were found in this OSM PBF file.",
      "couldNotLoadOsmPbf": "Could not load the OSM PBF file.",
      "osmPbfLoadFailedWithHint": "{{message}} If this is a Mapbox Vector Tile (.pbf), it cannot be loaded as an OSM extract.",
      "osmPbfTooLarge": "This OSM extract is too large to load and ran out of memory or time. Try a smaller region, or pre-filter the file first (for example with osmium-tool or QGIS) before loading it.",
      "couldNotOpenOsmPbf": "Could not open the OSM PBF file.",
      "invalidOsmPbfUrl": "Enter a valid http(s) URL to an .osm.pbf file.",
      "couldNotDownloadOsmPbf": "Could not download the OSM PBF file.",
      "scenegraphModelUrlRequired": "Enter a glTF/GLB model URL.",
      "scenegraphInvalidLngLat": "Enter a valid longitude and latitude.",
      "scenegraphOutOfRange": "Longitude must be between -180 and 180, and latitude between -90 and 90.",
      "scenegraphNoPointFeatures": "The GeoJSON has no point features to place models at."
    },
    "scenegraph": {
      "modelUrl": "glTF / GLB model URL",
      "placement": "Placement",
      "placementSingle": "Single location",
      "placementData": "From point data",
      "longitude": "Longitude",
      "latitude": "Latitude",
      "scale": "Scale",
      "bearing": "Bearing°",
      "altitude": "Altitude m"
    },
    "sqlWorkspace": {
      "description": {
        "postgis": "Run PostGIS SQL against loaded layers. The PostGIS extension is loaded, so ST_* functions are available. The first run loads a ~19 MB database engine.",
        "duckdb": "Run DuckDB SQL against loaded layers, files, and URLs. The spatial extension is loaded, so ST_* functions are available. Cloud URLs (s3://, gs://, az://) are supported for public data.",
        "sedona": "Run Apache Sedona spatial SQL against loaded layers. Runs in-browser via CereusDB (a WebAssembly build of SedonaDB); on desktop it uses the SedonaDB sidecar when the optional sedona extra is installed. ST_* functions are available."
      },
      "title": "SQL Workspace",
      "engine": "SQL engine",
      "resize": "Resize SQL workspace",
      "resizeEditor": "Resize editor and results panes",
      "collapse": "Collapse SQL workspace",
      "expand": "Expand SQL workspace",
      "close": "Close SQL workspace",
      "run": "Run",
      "runHint": "Run (Ctrl/Cmd+Enter)",
      "clear": "Clear",
      "completions": "Completions",
      "placeholder": "SQL here · Ctrl/Cmd+Enter to run · Tab or Ctrl+Space to autocomplete",
      "resultsPlaceholder": "Run a query to see results here.",
      "queryableHint": "Queryable layers: {{names}}",
      "queryableLayers": "Queryable layers:",
      "queryLabel": "SQL query",
      "engineOption": "Engine: {{name}}",
      "sampleQueries": "Sample queries…",
      "sampleQueriesLabel": "Insert a sample query",
      "history": "History…",
      "historyLabel": "Reuse a query from history",
      "sampleForLayer": "Sample query for layer…",
      "sampleForLayerLabel": "Insert a sample query for a layer",
      "noLayersEngine": "No vector layers are loaded as tables yet. Load a vector layer to query it with {{engine}}.",
      "noLayersReaders": "No vector layers are loaded as tables yet. You can still read files and URLs with read_parquet(), read_csv_auto(), or ST_Read().",
      "layerName": "Layer name",
      "layerNamePlaceholder": "Layer name (optional)",
      "addAsLayer": "Add as layer",
      "exportCsv": "Export CSV",
      "exportGeoParquet": "Export GeoParquet",
      "addedAsLayer_one": "Added {{count}} feature to the map as \"{{name}}\".",
      "addedAsLayer_other": "Added {{count}} features to the map as \"{{name}}\".",
      "addAsQueryLayer": "Add as query layer",
      "addAsQueryLayerHint": "Add the result as a live layer that re-runs this SQL when refreshed",
      "addedAsQueryLayer_one": "Added {{count}} feature to the map as query layer \"{{name}}\". Refresh it from the Layers panel to re-run the SQL.",
      "addedAsQueryLayer_other": "Added {{count}} features to the map as query layer \"{{name}}\". Refresh it from the Layers panel to re-run the SQL.",
      "savedAs": "Saved {{label}} as {{name}}.",
      "noRows": "Statement executed. No rows returned.",
      "showingRows": "Showing first {{shown}} of {{total}} rows. Export to see them all.",
      "rowsCount_one": "{{count}} row",
      "rowsCount_other": "{{count}} rows",
      "columnsCount_one": "{{count}} column",
      "columnsCount_other": "{{count}} columns",
      "samples": {
        "countriesGeom": "Countries with geometry",
        "attributesOnly": "Attributes only (no geometry)",
        "populationByContinent": "Population by continent (aggregate)",
        "mostPopulous": "Most populous countries (geometry)",
        "countryCentroids": "Country centroids (spatial)",
        "largestByArea": "Largest countries by area (spatial)",
        "postgisVersion": "PostGIS version",
        "makePoint": "Make a point (geometry)",
        "firstRows": "First rows of a layer",
        "featureCount": "Feature count",
        "layerCentroids": "Centroids of a layer (spatial)",
        "bufferFeatures": "Buffer features by 0.01 deg (spatial)",
        "boundingBox": "Bounding box of a layer (spatial)",
        "bufferPoint": "Buffer a point (spatial)",
        "areaPerFeature": "Area of each feature (spatial)"
      }
    }
  },
  "selection": {
    "byExpressionTitle": "Select by Expression",
    "byExpressionDescription": "Select features whose attributes match a boolean expression. The matches become the live selection, highlighted on the map and in the attribute table.",
    "byLocationTitle": "Select by Location",
    "byLocationDescription": "Select features by their spatial relationship to the features of another layer.",
    "targetLayer": "Select features from",
    "referenceLayer": "By comparing to the features of",
    "predicate": "Where the feature",
    "predicateIntersects": "Intersects",
    "predicateWithin": "Is within",
    "predicateContains": "Contains",
    "predicateDisjoint": "Is disjoint (no intersection)",
    "mode": "Modify current selection by",
    "modeNew": "Creating a new selection",
    "modeAdd": "Adding to the current selection",
    "modeRemove": "Removing from the current selection",
    "modeIntersect": "Selecting within the current selection",
    "expression": "Expression",
    "expressionPlaceholder": "[\">=\", [\"get\", \"population\"], 100000]",
    "expressionTarget": "Selection filter",
    "openBuilder": "Expression builder...",
    "invalidExpression": "Enter a valid boolean expression.",
    "select": "Select features",
    "noLayers": "Add a vector layer with features to make a selection.",
    "needTwoLayers": "Selecting by location needs two vector layers with features.",
    "summary": "{{selected}} of {{total}} feature(s) selected ({{matched}} matched).",
    "evaluationErrors": "{{count}} feature(s) could not be evaluated and were not matched.",
    "unevaluableDisjoint": "{{count}} feature(s) were excluded because their geometry could not be evaluated.",
    "tooManyPairs": "This comparison needs {{pairs}} feature-pair tests (limit {{limit}}). Use Processing → GeoLibre → Vector → Select by location with the Sidecar engine instead.",
    "exportedLayerName": "{{name}} (selection)"
  },
  "loadEditorFeatures": {
    "menuItem": "Load features into editor…",
    "title": "Load Features into Editor",
    "collapse": "Collapse panel",
    "expand": "Expand panel",
    "description": "Load the vector features visible in the current map view into the GeoEditor to edit them, then save every feature or only your changes as GeoJSON.",
    "vectorLayer": "Vector Layer",
    "selectPlaceholder": "Select a layer…",
    "refresh": "Refresh layer list",
    "noLayers": "No vector layers are in the current view. Add a vector layer or pan to a basemap area with vector features, then refresh.",
    "editSessionActive": "Finish the in-place geometry edit (Layers panel → Finish editing geometry) before loading or saving features here.",
    "editorName": "Editor Name",
    "editorNamePlaceholder": "Your name (optional)",
    "loadFeatures": "Load Features",
    "loading": "Loading features…",
    "selectLayer": "Please select a layer first.",
    "noneInView": "No features found in the current view for this layer.",
    "editorUnavailable": "Could not activate the GeoEditor. Try again once the map has fully loaded.",
    "noEditable": "No editable features were found in the current view for this layer.",
    "loaded": "Loaded {{count}} feature(s) from \"{{layer}}\".",
    "appended": "Appended {{count}} feature(s) from \"{{layer}}\".",
    "loadedWithDropped": "{{message}} (skipped {{dropped}} invalid)",
    "loadFailed": "Failed to load features into the editor.",
    "confirmExisting": "The editor already holds {{count}} feature(s). Append to them, or discard and replace?",
    "tooMany": "Loading {{count}} features may make the editor slow to respond. Load them anyway?",
    "loadAnyway": "Load Anyway",
    "append": "Append",
    "appendHint": "Add the new features alongside the existing ones.",
    "discard": "Discard & Replace",
    "discardHint": "Remove the existing features and load the new ones.",
    "noChanges": "No changes to save yet.",
    "nothingToSave": "No features to save.",
    "saved": "Saved {{count}} feature(s).",
    "savedChanges": "Saved changes: {{added}} added, {{modified}} modified, {{deleted}} deleted.",
    "saveFailed": "Failed to save the features.",
    "saveChanges": "Save Changes",
    "saveChangesHint": "Save only the features you added, edited, or deleted.",
    "saveAll": "Save All"
  },
  "geocode": {
    "title": "Geocode Addresses",
    "description": "Geocode a CSV of addresses into a point layer. Each matched row becomes a point carrying the original columns plus the resolved coordinates and match score.",
    "chooseFile": "Choose CSV file",
    "noFile": "No CSV file selected.",
    "fileLoaded": "{{name}} ({{count}} rows)",
    "provider": "Geocoding provider",
    "providerHint": "API keys and endpoints are managed in Settings.",
    "apiKeyRequired": "{{provider}} needs an API key. Add one in Settings to get results.",
    "corsNote": "Google does not officially allow browser requests to its Geocoding API; requests may be blocked unless served through a same-origin proxy.",
    "addressColumn": "Address column",
    "run": "Start Geocoding",
    "cancel": "Cancel",
    "outputPlaceholder": "Progress will appear here.",
    "usingEndpoint": "Using {{endpoint}}",
    "usingProvider": "Using {{provider}} ({{endpoint}})",
    "rowCapWarning": "Only the first {{cap}} rows will be geocoded to respect the public Nominatim usage policy. Configure a self-hosted endpoint for larger batches.",
    "skippedEmpty": "Skipped {{count}} row(s) with an empty address.",
    "progress": "Geocoding row {{current}} of {{total}}: {{address}}",
    "summary": "Geocoded {{matched}} of {{total}} row(s); {{failed}} had no match.",
    "failedRows": "Rows with no match: {{rows}}",
    "noMatches": "No rows could be geocoded.",
    "cancelledNoRows": "Cancelled before any rows were geocoded.",
    "cancelled": "Cancelled. Added {{matched}} matched row(s).",
    "error": "Error: {{message}}",
    "reverseLookingUp": "Looking up address...",
    "reverseNoAddress": "No address found.",
    "reverseCopyAddress": "Copy address",
    "reverseFailed": "Reverse geocoding failed."
  },
  "graticule": {
    "title": "Gridlines",
    "controlTitle": "Gridlines settings",
    "gridType": "Grid type",
    "typeGeographic": "Geographic (lat/long)",
    "typeUtm": "UTM (easting/northing)",
    "spacing": "Spacing",
    "spacingAuto": "Auto (by zoom)",
    "spacingFixed": "Fixed interval",
    "interval": "Interval (°)",
    "intervalMeters": "Interval (m)",
    "lineColor": "Line color",
    "lineWidth": "Line width",
    "lineOpacity": "Line opacity",
    "dashedLines": "Dashed lines",
    "showLabels": "Show labels",
    "labelFormat": "Label format",
    "formatDecimal": "Decimal degrees",
    "formatDms": "Deg/Min/Sec",
    "labelEdges": "Label edges",
    "edgesLeftBottom": "Left + bottom",
    "edgesAll": "All sides",
    "labelColor": "Label color",
    "labelSize": "Label size"
  },
  "h3Plugin": {
    "title": "H3 Grid",
    "controlTitle": "H3 grid settings",
    "autoResolution": "Automatic resolution",
    "resolution": "Resolution",
    "cellCount": "{{count}} cells in view",
    "tooManyCells": "This view exceeds the {{limit}} cell limit. Zoom in or lower the resolution.",
    "fillColor": "Fill color",
    "fillOpacity": "Fill opacity",
    "lineColor": "Outline color",
    "lineWidth": "Outline width",
    "showLabels": "Show cell IDs",
    "identifyHint": "Click the map to identify an H3 cell.",
    "selectedCell": "Selected cell",
    "noSelection": "No cell selected",
    "copyId": "Copy ID",
    "copied": "Copied",
    "parent": "Parent(s)",
    "children": "Children",
    "neighbors": "Neighbors",
    "baseCell": "Base cell",
    "center": "Center",
    "pentagon": "Pentagon",
    "yes": "Yes",
    "no": "No",
    "zoomToCell": "Zoom to cell",
    "addAsLayer": "Add grid as layer",
    "exportGeoJson": "Export GeoJSON",
    "exportCsv": "Export CSV",
    "includeNeighbors": "Include selected cell neighbors",
    "includeParents": "Include selected cell parent(s)",
    "showIcosahedron": "Show icosahedron"
  },
  "s2Plugin": {
    "title": "S2 Grid",
    "controlTitle": "S2 grid settings",
    "autoResolution": "Automatic resolution",
    "resolution": "Resolution",
    "cellCount": "{{count}} cells in view",
    "tooManyCells": "This view exceeds the {{limit}} cell limit. Zoom in or lower the resolution.",
    "fillColor": "Fill color",
    "fillOpacity": "Fill opacity",
    "lineColor": "Outline color",
    "lineWidth": "Outline width",
    "showLabels": "Show cell IDs",
    "identifyHint": "Click the map to identify an S2 cell.",
    "selectedCell": "Selected cell",
    "noSelection": "No cell selected",
    "copyId": "Copy ID",
    "parent": "Parent(s)",
    "children": "Children",
    "neighbors": "Neighbors",
    "center": "Center",
    "zoomToCell": "Zoom to cell",
    "addAsLayer": "Add grid as layer",
    "exportGeoJson": "Export GeoJSON",
    "exportCsv": "Export CSV",
    "includeNeighbors": "Include selected cell neighbors",
    "includeParents": "Include selected cell parent(s)"
  },
  "a5Plugin": {
    "title": "A5 Grid",
    "controlTitle": "A5 grid settings",
    "autoResolution": "Automatic resolution",
    "resolution": "Resolution",
    "cellCount": "{{count}} cells in view",
    "tooManyCells": "This view exceeds the {{limit}} cell limit. Zoom in or lower the resolution.",
    "fillColor": "Fill color",
    "fillOpacity": "Fill opacity",
    "lineColor": "Outline color",
    "lineWidth": "Outline width",
    "showLabels": "Show cell IDs",
    "identifyHint": "Click the map to identify an A5 cell.",
    "selectedCell": "Selected cell",
    "noSelection": "No cell selected",
    "copyId": "Copy ID",
    "parent": "Parent(s)",
    "children": "Children",
    "neighbors": "Neighbors",
    "center": "Center",
    "zoomToCell": "Zoom to cell",
    "addAsLayer": "Add grid as layer",
    "exportGeoJson": "Export GeoJSON",
    "exportCsv": "Export CSV",
    "includeNeighbors": "Include selected cell neighbors",
    "includeParents": "Include selected cell parent(s)"
  },
  "dggridPlugin": {
    "title": "DGGRID",
    "controlTitle": "DGGRID settings",
    "cellType": "Cell type",
    "topologyHexagon": "Hexagon",
    "topologyDiamond": "Diamond",
    "topologyTriangle": "Triangle",
    "projection": "Projection",
    "aperture": "Aperture",
    "autoResolution": "Automatic resolution",
    "resolution": "Resolution",
    "cellCount": "{{count}} cells in view",
    "tooManyCells": "This view exceeds the {{limit}} cell limit. Zoom in or lower the resolution.",
    "fillColor": "Fill color",
    "fillOpacity": "Fill opacity",
    "lineColor": "Outline color",
    "lineWidth": "Outline width",
    "showLabels": "Show cell IDs",
    "identifyHint": "Click the map to identify a DGGRID cell.",
    "selectedCell": "Selected cell",
    "noSelection": "No cell selected",
    "copyId": "Copy ID",
    "parent": "Parent(s)",
    "children": "Children",
    "neighbors": "Neighbors",
    "center": "Center",
    "zoomToCell": "Zoom to cell",
    "addAsLayer": "Add grid as layer",
    "exportGeoJson": "Export GeoJSON",
    "exportCsv": "Export CSV",
    "includeNeighbors": "Include selected cell neighbors",
    "includeParents": "Include selected cell parent(s)"
  },
  "dggalPlugin": {
    "title": "DGGAL",
    "controlTitle": "DGGAL settings",
    "gridType": "DGGS type",
    "autoResolution": "Automatic resolution",
    "resolution": "Resolution",
    "cellCount": "{{count}} cells in view",
    "tooManyCells": "This view exceeds the {{limit}} cell limit. Zoom in or lower the resolution.",
    "fillColor": "Fill color",
    "fillOpacity": "Fill opacity",
    "lineColor": "Outline color",
    "lineWidth": "Outline width",
    "showLabels": "Show cell IDs",
    "identifyHint": "Click the map to identify a DGGAL cell.",
    "selectedCell": "Selected cell",
    "noSelection": "No cell selected",
    "copyId": "Copy ID",
    "parent": "Parent(s)",
    "children": "Children",
    "neighbors": "Neighbors",
    "center": "Center",
    "zoomToCell": "Zoom to cell",
    "addAsLayer": "Add grid as layer",
    "exportGeoJson": "Export GeoJSON",
    "exportCsv": "Export CSV",
    "includeNeighbors": "Include selected cell neighbors",
    "includeParents": "Include selected cell parent(s)"
  },
  "olcPlugin": {
    "title": "OLC",
    "controlTitle": "OLC settings",
    "autoResolution": "Automatic resolution",
    "resolution": "Resolution",
    "cellCount": "{{count}} cells in view",
    "tooManyCells": "This view exceeds the {{limit}} cell limit. Zoom in or lower the resolution.",
    "fillColor": "Fill color",
    "fillOpacity": "Fill opacity",
    "lineColor": "Outline color",
    "lineWidth": "Outline width",
    "showLabels": "Show cell IDs",
    "identifyHint": "Click the map to identify an OLC cell.",
    "selectedCell": "Selected cell",
    "noSelection": "No cell selected",
    "copyId": "Copy ID",
    "parent": "Parent",
    "children": "Children",
    "neighbors": "Neighbors",
    "center": "Center",
    "zoomToCell": "Zoom to cell",
    "addAsLayer": "Add grid as layer",
    "exportGeoJson": "Export GeoJSON",
    "exportCsv": "Export CSV",
    "includeNeighbors": "Include selected cell neighbors",
    "includeParent": "Include selected cell parent"
  },
  "geohashPlugin": {
    "title": "Geohash",
    "controlTitle": "Geohash settings",
    "autoResolution": "Automatic resolution",
    "resolution": "Resolution",
    "cellCount": "{{count}} cells in view",
    "tooManyCells": "This view exceeds the {{limit}} cell limit. Zoom in or lower the resolution.",
    "fillColor": "Fill color",
    "fillOpacity": "Fill opacity",
    "lineColor": "Outline color",
    "lineWidth": "Outline width",
    "showLabels": "Show cell IDs",
    "identifyHint": "Click the map to identify a Geohash cell.",
    "selectedCell": "Selected cell",
    "noSelection": "No cell selected",
    "copyId": "Copy ID",
    "parent": "Parent",
    "children": "Children",
    "neighbors": "Neighbors",
    "center": "Center",
    "zoomToCell": "Zoom to cell",
    "addAsLayer": "Add grid as layer",
    "exportGeoJson": "Export GeoJSON",
    "exportCsv": "Export CSV",
    "includeNeighbors": "Include selected cell neighbors",
    "includeParent": "Include selected cell parent"
  },
  "tilecodePlugin": {
    "title": "Tilecode",
    "controlTitle": "Tilecode settings",
    "autoResolution": "Automatic resolution",
    "resolution": "Resolution",
    "cellCount": "{{count}} tiles in view",
    "tooManyCells": "This view exceeds the {{limit}} tile limit. Zoom in or lower the resolution.",
    "fillColor": "Fill color",
    "fillOpacity": "Fill opacity",
    "lineColor": "Outline color",
    "lineWidth": "Outline width",
    "showLabels": "Show tile IDs",
    "identifyHint": "Click the map to identify a tile.",
    "selectedCell": "Selected tile",
    "noSelection": "No tile selected",
    "copyId": "Copy ID",
    "quadkey": "Quadkey",
    "parent": "Parent",
    "children": "Children",
    "neighbors": "Neighbors",
    "center": "Center",
    "zoomToCell": "Zoom to tile",
    "addAsLayer": "Add grid as layer",
    "exportGeoJson": "Export GeoJSON",
    "exportCsv": "Export CSV",
    "includeNeighbors": "Include selected tile neighbors",
    "includeParent": "Include selected tile parent"
  },
  "timelapse": {
    "title": "Timelapse",
    "provider": "Imagery source",
    "legend": "Legend",
    "yearSlider": "Timelapse year",
    "play": "Play",
    "pause": "Pause",
    "speed": "Speed",
    "secondsPerYear": "Seconds per year",
    "secondsPerYearSuffix": "s/yr",
    "loop": "Loop",
    "record": "Record video",
    "stopRecording": "Stop recording",
    "recording": "Recording",
    "recordingFailed": "Recording failed.",
    "recordingUnsupported": "Canvas recording is not supported in this browser.",
    "loadingTiles": "Loading tiles…"
  },
  "mapillary": {
    "title": "Mapillary",
    "hint": "Click a coverage point on the map to view street-level imagery.",
    "noToken": "A Mapillary access token is required to load coverage and imagery. Paste one below to get started.",
    "tokenPlaceholder": "MLY|…",
    "tokenSave": "Save token",
    "tokenHelp": "Get a token",
    "tokenLabel": "Mapillary access token",
    "loading": "Loading imagery…",
    "loadError": "Could not load this image.",
    "coverageLines": "Mapillary Sequences",
    "coveragePoints": "Mapillary Images"
  },
  "openAerialMap": {
    "hint": "Search OpenAerialMap imagery by map view, a drawn box, or coordinates.",
    "search": "Search this view",
    "loadMore": "Load more",
    "searching": "Searching…",
    "loadingMore": "Loading more…",
    "noResults": "No imagery found in this area.",
    "showing": "Showing {{shown}} of {{total}} images.",
    "searchError": "Could not reach OpenAerialMap: {{message}}. Please try again.",
    "add": "Add",
    "remove": "Remove",
    "zoom": "Zoom",
    "download": "Download",
    "metadata": "Metadata",
    "addTitle": "Add this image to the map",
    "removeTitle": "Remove this image from the map",
    "addUnavailableTitle": "No tile service available for this image",
    "zoomTitle": "Zoom to this image",
    "downloadTitle": "Download the source GeoTIFF",
    "metadataTitle": "View this image's metadata",
    "modeView": "Map view",
    "modeDraw": "Draw box",
    "modeBbox": "Coordinates",
    "drawHint": "Click and drag on the map to draw a search box.",
    "drawStart": "Draw box on map",
    "drawCancel": "Cancel drawing",
    "drawnBox": "Search box: {{box}}",
    "coordWest": "West",
    "coordSouth": "South",
    "coordEast": "East",
    "coordNorth": "North",
    "coordSearch": "Search this box",
    "bboxInvalid": "Enter four valid coordinates with west < east and south < north.",
    "footprintsLayer": "OpenAerialMap footprints",
    "footprintUnavailable": "No tile service available for this image.",
    "metadataHeading": "Image metadata",
    "close": "Close",
    "metaTitle": "Title",
    "metaProvider": "Provider",
    "metaPlatform": "Platform",
    "metaResolution": "Resolution",
    "metaAcquired": "Acquired",
    "metaBounds": "Bounds (W, S, E, N)",
    "metaSource": "Source GeoTIFF",
    "metaRaw": "Raw metadata"
  },
  "arcgisHub": {
    "hint": "Search public datasets from ArcGIS Hub. Add supported layers to the map or download data.",
    "searchPlaceholder": "Search ArcGIS Hub datasets",
    "search": "Search",
    "searchCurrentView": "Search the current map area",
    "enterKeyword": "Enter a keyword to begin.",
    "loadMore": "Load more",
    "searching": "Searching…",
    "loadingMore": "Loading more datasets…",
    "noResults": "No public datasets found.",
    "searchError": "Could not search ArcGIS Hub.",
    "showing": "Showing {{shown}} of {{total}} datasets.",
    "noDescription": "No description provided.",
    "add": "Add to map",
    "adding": "Adding {{title}}…",
    "added": "Added {{title}}.",
    "addError": "Could not add this dataset.",
    "zoom": "Zoom",
    "download": "Download",
    "preparing": "Preparing {{title}}…",
    "downloading": "Downloading {{title}}: {{completed}} of {{total}} features…",
    "downloadStarted": "Download started for {{title}}.",
    "downloadFirstLayer": "{{title}} has {{layerCount}} layers; only the first was downloaded.",
    "downloadError": "Could not download this dataset.",
    "details": "Details"
  },
  "openDataCatalogs": {
    "socrataHint": "Search public Socrata open-data catalogs and add GeoJSON datasets.",
    "ckanHint": "Search the Humanitarian Data Exchange CKAN catalog and add available GeoJSON resources.",
    "searchPlaceholder": "Search {{name}}",
    "search": "Search",
    "enterKeyword": "Enter a keyword to begin.",
    "loadMore": "Load more",
    "searching": "Searching…",
    "noResults": "No datasets found.",
    "showing": "Showing {{shown}} of {{total}} datasets.",
    "noDescription": "No description provided.",
    "add": "Add to map",
    "details": "Details",
    "adding": "Adding {{title}}…",
    "added": "Added {{title}}.",
    "addError": "Could not add dataset.",
    "searchError": "Search failed."
  },
  "stacPlugin": {
    "title": "STAC Catalogs",
    "footprintLayerName": "STAC search footprints",
    "catalogSearch": "Find a public catalog from STAC Index",
    "catalogSearchPlaceholder": "Search catalog names…",
    "indexLoading": "Loading STAC Index…",
    "indexUnavailable": "STAC Index unavailable — enter a URL",
    "indexLoadFailed": "Could not load STAC Index",
    "urlLabel": "STAC catalog or API URL",
    "connect": "Connect",
    "connecting": "Connecting to STAC…",
    "connected": "Connected. Choose filters and search.",
    "connectFailed": "Could not connect to STAC",
    "selectCatalog": "Select a catalog…",
    "noMatchingCatalogs": "No matching catalogs",
    "catalogApiSuffix": " (API)",
    "catalogStaticSuffix": " (static)",
    "kindApi": "STAC API",
    "kindStatic": "static catalog",
    "collectionsHint": "Hold Ctrl/Cmd to select multiple collections; drag the bottom edge to resize",
    "limitToExtent": "Limit search to the current map extent",
    "bboxLabel": "Bounding box (west, south, east, north)",
    "bboxPlaceholder": "Optional; overrides map extent",
    "bboxInvalid": "Enter a valid bbox: west, south, east, north.",
    "drawBbox": "Draw bbox on map",
    "cancelDrawing": "Cancel drawing",
    "clearDrawnBbox": "Clear drawn bbox",
    "drawHint": "Click and drag on the map to draw a search bounding box.",
    "drawnBbox": "Drawn bbox: {{bbox}}",
    "drawnBboxCleared": "Drawn bbox cleared.",
    "mapNotReady": "The map is not ready for drawing.",
    "startDate": "Start date",
    "endDate": "End date",
    "additionalParams": "Additional search parameters (JSON, STAC API only)",
    "additionalInvalid": "Additional search parameters must be a JSON object.",
    "searchItems": "Search items",
    "clearResults": "Clear results",
    "resultsCleared": "Search results cleared.",
    "searching": "Searching STAC items…",
    "loadingMore": "Loading more items…",
    "noResults": "No STAC items matched these filters.",
    "searchFailed": "STAC search failed",
    "showing": "Showing {{count}} items.",
    "showingOfMatched": "Showing {{count}} of {{matched}} items.",
    "loadMore": "Load more",
    "renderOptions": "Raster rendering options",
    "bands": "Bands",
    "bandsPlaceholder": "e.g. 1 or 1,2,3 (default: auto)",
    "colormap": "Colormap (single-band only)",
    "colormapDefault": "Renderer default",
    "minValue": "Min value",
    "maxValue": "Max value",
    "nodata": "NoData value",
    "nodataPlaceholder": "Overrides the file's NoData tag",
    "renderHint": "Leave a field blank to let the renderer infer it from the GeoTIFF. Options apply to assets added after they change.",
    "initialStatus": "Choose a catalog from STAC Index or enter a URL.",
    "catalogInfo": "{{title}} · {{kind}}",
    "zoom": "Zoom",
    "add": "Add",
    "download": "Download",
    "adding": "Adding {{asset}}…",
    "added": "Added {{asset}} to the map.",
    "addUnsupported": "Only GeoTIFF/COG and GeoJSON assets can be added to the map",
    "addFailed": "Could not add asset",
    "cogUnsupported": "This GeoLibre host cannot visualize remote GeoTIFF assets"
  },
  "earthdataGis": {
    "hint": "Search NASA Earthdata GIS for imagery, map, and feature services.",
    "searchPlaceholder": "Search Earthdata GIS…",
    "search": "Search",
    "searching": "Searching…",
    "loadingMore": "Loading more…",
    "loadMore": "Load more",
    "noResults": "No services matched this search.",
    "showing": "Showing {{shown}} of {{total}} services.",
    "searchError": "Could not reach Earthdata GIS: {{message}}. Please try again.",
    "limitToView": "Limit to map view",
    "limitToViewTitle": "Only return services that intersect the current map view",
    "filterAll": "All",
    "filterImage": "Imagery",
    "filterMap": "Maps",
    "filterFeature": "Features",
    "kindImage": "Image service",
    "kindMap": "Map service",
    "kindFeature": "Feature service",
    "kindWebMap": "Web map",
    "filterWebMap": "Web maps",
    "webMapAdded_one": "Added {{count}} layer from this web map.",
    "webMapAdded_other": "Added {{count}} layers from this web map.",
    "webMapAddedPartial": "Added {{added}} of {{total}} layers from this web map; the rest could not be reached.",
    "webMapEmpty": "this web map has no layers GeoLibre can render.",
    "add": "Add",
    "adding": "Adding…",
    "remove": "Remove",
    "zoom": "Zoom",
    "details": "Details",
    "portal": "Portal",
    "portalTitle": "Open this item on the Earthdata GIS portal",
    "cog": "COG",
    "cogTitle": "Download this service as a Cloud Optimized GeoTIFF",
    "cogHeading": "Download as COG",
    "cogAreaView": "Current view",
    "cogAreaExtent": "Full extent",
    "cogSize": "Export size: {{width}} x {{height}} px",
    "cogResolution": "Ground resolution: {{metres}} m/px",
    "cogNote": "The service is re-exported at this size and re-encoded as a COG, so this is a resampled view of the area, not the source raster at native resolution.",
    "cogDownload": "Download",
    "cogDownloading": "Exporting and converting…",
    "cogRetrying": "The service refused that size; retrying at {{width}} x {{height}} px…",
    "cogConverting": "Converting to a COG…",
    "cogDone": "Saved the COG at {{width}} x {{height}} px.",
    "cogFailed": "Could not download the COG: {{message}}",
    "cogUnavailable": "Downloading requires the desktop app or a browser save dialog.",
    "cancel": "Cancel",
    "addTitle": "Add this service to the map",
    "removeTitle": "Remove this service from the map",
    "zoomTitle": "Zoom to this service",
    "zoomUnavailableTitle": "This service does not publish an extent",
    "detailsTitle": "View this service's metadata",
    "addError": "Could not add the service: {{message}}",
    "addTimeout": "it did not respond within a minute. The layer will still appear if it finishes.",
    "zoomedToData": "Zoomed in past this layer's full extent: the service only renders at higher zoom levels.",
    "detailsHeading": "Service details",
    "close": "Close",
    "metaTitle": "Title",
    "metaType": "Type",
    "metaSummary": "Summary",
    "metaDescription": "Description",
    "metaOwner": "Published by",
    "metaModified": "Last modified",
    "metaTags": "Tags",
    "metaExtent": "Extent (W, S, E, N)",
    "metaCredits": "Credits",
    "metaLicense": "Use constraints",
    "metaService": "Service URL",
    "metaPortalItem": "Portal item",
    "metaRaw": "Raw metadata"
  },
  "sourceCoop": {
    "hint": "Search Source Cooperative for open geospatial data, or enter an account/product id.",
    "searchPlaceholder": "Search data, or account/product",
    "search": "Search",
    "searching": "Searching…",
    "loading": "Loading catalog…",
    "loadError": "Could not reach Source Cooperative: {{message}}. Please try again.",
    "noResults": "No matching products.",
    "retry": "Retry",
    "featured": "Featured",
    "showing": "Showing {{shown}} of {{total}} products.",
    "browseAccount": "Browse all {{account}} products",
    "back": "Back",
    "files": "Files",
    "noFiles": "No files in this folder.",
    "loadingFiles": "Loading files…",
    "loadMore": "Load more",
    "parent": "Up one level",
    "add": "Add",
    "adding": "Adding…",
    "added": "Added",
    "stream": "Stream",
    "streaming": "Streaming",
    "remove": "Remove",
    "download": "Download",
    "copyUrl": "Copy URL",
    "copied": "Copied",
    "openProduct": "Open on source.coop",
    "addTitle": "Add this file to the map",
    "streamTitle": "Query this file where it sits, reading only the parts in view. The whole file is never copied into DuckDB — best for large files.",
    "removeTitle": "Remove this file from the map",
    "downloadTitle": "Download this file",
    "copyUrlTitle": "Copy this file's URL",
    "openProductTitle": "Open this product's page on source.coop",
    "unsupportedTitle": "GeoLibre cannot render this format — download it instead",
    "addError": "Could not add this file: {{message}}",
    "largeFileWarning": "This file is {{size}}. It streams from the source, so only the parts in view are read.",
    "streamHint": "This file is {{size}}. Add copies it into memory; Stream reads only the parts in view.",
    "tooLargeToOpen": "This file is {{size}} — too large for the browser to open ({{limit}} limit). Download it, or use a partitioned version of this dataset."
  },
  "huggingFace": {
    "browseTab": "Browse",
    "uploadTab": "Upload",
    "settingsTab": "Settings",
    "hint": "Search Hugging Face for dataset repos, or enter an account name or owner/dataset id.",
    "searchPlaceholder": "Search datasets, account, or owner/dataset",
    "search": "Search",
    "searching": "Searching…",
    "loadError": "Could not reach Hugging Face: {{message}}. Please try again.",
    "noResults": "No matching datasets.",
    "retry": "Retry",
    "suggestions": "Suggested datasets",
    "showing_one": "{{count}} dataset.",
    "showing_other": "{{count}} datasets.",
    "browseOwner": "Browse all {{owner}} datasets",
    "back": "Back",
    "private": "Private",
    "gated": "Gated",
    "privateHint": "This dataset is private or gated. Its files need an authenticated request, which a map source cannot make, so they cannot be added or downloaded here.",
    "stats": "{{likes}} likes · {{downloads}} downloads",
    "noFiles": "No files in this folder.",
    "loadingFiles": "Loading files…",
    "loadMore": "Load more",
    "parent": "Up one level",
    "add": "Add",
    "adding": "Adding…",
    "stream": "Stream",
    "streaming": "Streaming",
    "remove": "Remove",
    "download": "Download",
    "copyUrl": "Copy URL",
    "copied": "Copied",
    "openDataset": "Open on Hugging Face",
    "addTitle": "Add this file to the map",
    "streamTitle": "Query this file where it sits, reading only the parts in view. The whole file is never copied into DuckDB — best for large files.",
    "removeTitle": "Remove this file from the map",
    "downloadTitle": "Download this file",
    "copyUrlTitle": "Copy this file's URL",
    "openDatasetTitle": "Open this dataset's page on huggingface.co",
    "unsupportedTitle": "GeoLibre cannot render this format — download it instead",
    "addError": "Could not add this file: {{message}}",
    "notRasterIndex": "This JSON file does not index any rasters, so there is nothing to put on the map. MosaicJSON and STAC collections are supported.",
    "largeFileWarning": "This file is {{size}}. It streams from the source, so only the parts in view are read.",
    "streamHint": "This file is {{size}}. Add copies it into memory; Stream reads only the parts in view.",
    "tooLargeToOpen": "This file is {{size}} — too large for the browser to open ({{limit}} limit). Download it, or use a partitioned version of this dataset.",
    "tokenLabel": "Access token",
    "tokenHint": "Creating a dataset repo and uploading files needs a Hugging Face access token with write access. It is stored in this browser only and sent to huggingface.co alone.",
    "tokenPlaceholder": "hf_…",
    "tokenSave": "Save token",
    "tokenClear": "Clear",
    "tokenHelp": "Get a token",
    "tokenChecking": "Checking token…",
    "tokenError": "Could not verify this token: {{message}}",
    "signedInAs": "Signed in as {{name}}",
    "readOnlyToken": "This token is read-only. Create a token with write access to upload.",
    "createHeading": "Create a dataset repo",
    "ownerLabel": "Owner",
    "datasetNameLabel": "Dataset name",
    "datasetNamePlaceholder": "my-geodata",
    "privateLabel": "Private",
    "create": "Create",
    "creating": "Creating…",
    "createdRepo": "Created {{repoId}}.",
    "createError": "Could not create this dataset: {{message}}",
    "uploadHeading": "Upload files",
    "targetLabel": "Dataset",
    "targetPlaceholder": "owner/dataset",
    "folderLabel": "Folder (optional)",
    "folderPlaceholder": "data/",
    "chooseFiles": "Choose files",
    "chooseLayer": "Choose layer",
    "chooseLayerTitle": "Upload a map layer's features as a GeoJSON file",
    "layerPickerHeading": "Upload a layer as GeoJSON",
    "layerFeatures_one": "{{count}} feature",
    "layerFeatures_other": "{{count}} features",
    "layerOriginalFile": "Original file",
    "layerUnavailable": "{{name}} is no longer available to upload.",
    "remoteRasterNote": "Rasters loaded from a URL are not listed: their data is not in the browser, and they already have a link you can share. Only files opened locally can be uploaded.",
    "noUploadableLayers": "No layer on the map holds features that can be uploaded. Add a vector layer first.",
    "clearSelection": "Clear",
    "selectedFiles_one": "{{count}} file selected ({{size}}).",
    "selectedFiles_other": "{{count}} files selected ({{size}}).",
    "commitMessageLabel": "Commit message (optional)",
    "commitMessagePlaceholder": "Upload with GeoLibre",
    "upload": "Upload",
    "uploadPreparing": "Preparing upload…",
    "uploadHashing": "Hashing {{name}} ({{index}}/{{total}})…",
    "uploadSending": "Uploading {{name}} ({{index}}/{{total}})…",
    "uploadCommitting": "Committing…",
    "uploadDone_one": "Uploaded {{count}} file.",
    "uploadDone_other": "Uploaded {{count}} files.",
    "uploadError": "Upload failed: {{message}}",
    "fileTooLarge": "{{name}} is larger than the {{limit}} upload limit.",
    "selectionTooLarge": "The selected files total {{size}}, over the {{limit}} limit for one upload. Upload them in smaller batches.",
    "openUploaded": "Open the dataset",
    "rgbHeading": "Multiband imagery",
    "rgbHint": "Which bands become red, green and blue when an image has three or more of them. 1-indexed; the Style panel can still change any layer afterwards.",
    "bandR": "Red",
    "bandG": "Green",
    "bandB": "Blue",
    "colormapHeading": "Single-band imagery",
    "colormapHint": "The colormap applied when an image has one band.",
    "colormapLabel": "Colormap",
    "engineHeading": "Rendering engine",
    "engineHint": "Which renderer decodes the imagery. Unlike the settings above this is not per layer: it applies to every raster on the map, including ones already added.",
    "engineLabel": "Engine",
    "engineAuto": "Leave unchanged",
    "engineGpu": "GPU (deck.gl)",
    "engineWasm": "WebAssembly tiler",
    "engineTitiler": "TiTiler server",
    "resetDefaults": "Reset to defaults"
  },
  "basemaps": {
    "confirmStyleReplace_one": "Switching to \"{{name}}\" replaces the whole map style and will remove the stacked basemap you added. Continue?",
    "confirmStyleReplace_other": "Switching to \"{{name}}\" replaces the whole map style and will remove the {{count}} stacked basemaps you added. Continue?"
  },
  "annotations": {
    "toolbar": "Annotation tools",
    "layerName": "Annotations",
    "elementsPanelTitle": "Elements",
    "tools": {
      "text": "Text",
      "arrow": "Arrow",
      "rectangle": "Rectangle highlight",
      "ellipse": "Ellipse highlight",
      "freehand": "Freehand highlight",
      "pin": "Pin marker",
      "sticky_note": "Sticky note",
      "placed_image": "Placed image"
    },
    "color": "Annotation color",
    "width": "Line width",
    "widthOptions": {
      "thin": "Thin",
      "medium": "Medium",
      "thick": "Thick"
    },
    "deleteLast": "Delete last annotation",
    "clearAll": "Clear all annotations",
    "textPlaceholder": "Type label, Enter to place",
    "pinTitlePrompt": "Title",
    "pinDescPrompt": "Description",
    "stickyNotePrompt": "Note Content",
    "imageUrlPrompt": "Image URL",
    "cancel": "Cancel",
    "saveElement": "Save Element",
    "atPoint": "At Point",
    "pinnedToExtent": "Pinned to Extent"
  },
  "pythonConsole": {
    "title": "Python Console",
    "resize": "Resize Python console",
    "clear": "Clear output",
    "collapse": "Collapse Python console",
    "expand": "Expand Python console",
    "close": "Close Python console",
    "run": "Run",
    "runHint": "Run (Ctrl/Cmd+Enter)",
    "completions": "Completions",
    "placeholder": "Python here · Ctrl/Cmd+Enter to run · Tab to autocomplete · ↑/↓ for history",
    "intro": "Python console ready. Use the `geolibre` object to script the map, e.g. geolibre.get_center(). Tab autocompletes, ↑/↓ recall previous commands, and `await geolibre.load_package(\"numpy\")` adds packages.",
    "loadFailed": "Failed to load the Python runtime.",
    "showEditor": "Show editor",
    "hideEditor": "Hide editor",
    "resizeEditor": "Resize editor",
    "fileNew": "New script",
    "fileOpen": "Open script…",
    "fileSave": "Save script (Ctrl/Cmd+S)",
    "fileSaveAs": "Save script as…",
    "clearEditor": "Clear editor",
    "runScript": "Run script or selection (Ctrl/Cmd+Enter)",
    "untitled": "untitled.py",
    "discardChanges": "Discard unsaved changes to the current script?",
    "editorPlaceholder": "Write a multi-line Python script here. Ctrl/Cmd+Enter runs it (or the selection) in the console; Tab indents; Ctrl+Space autocompletes."
  },
  "notebook": {
    "title": "Notebook",
    "resize": "Resize notebook panel",
    "collapse": "Collapse notebook",
    "expand": "Expand notebook",
    "close": "Close notebook",
    "copyServerUrl": "Copy the server URL for external clients (VS Code…)",
    "serverUrlCopied": "Server URL copied",
    "loading": "Loading notebook…",
    "loadFailed": "Failed to load the notebook."
  },
  "dashboard": {
    "title": "Dashboard",
    "resize": "Resize dashboard panel",
    "collapse": "Collapse dashboard",
    "expand": "Expand dashboard",
    "close": "Close dashboard",
    "columns": "Columns",
    "addWidget": "Add widget",
    "widgetCount_one": "{{count}} widget",
    "widgetCount_other": "{{count}} widgets",
    "empty": "No widgets yet. Add a chart to summarize a layer.",
    "emptyNoLayers": "No compatible layers found. Add a vector or DuckDB query layer to your project using the Add Data menu above, then return here to start building charts.",
    "noLayersHint": "Add a vector or DuckDB query layer first.",
    "layerMissing": "Layer unavailable",
    "noData": "This layer has no chartable attributes.",
    "selectorMatches_one": "{{count}} of {{total}} feature",
    "selectorMatches_other": "{{count}} of {{total}} features",
    "selectorClear": "Clear",
    "moveBack": "Move back",
    "moveForward": "Move forward",
    "editWidget": "Edit widget",
    "removeWidget": "Remove widget",
    "chartType": {
      "histogram": "Histogram",
      "scatter": "Scatter",
      "bar": "Bar",
      "line": "Line",
      "box": "Box plot",
      "pie": "Pie",
      "indicator": "Indicator",
      "selector": "Selector",
      "list": "List"
    },
    "aggregate": {
      "count": "Count",
      "sum": "Sum",
      "mean": "Average"
    },
    "indicatorAggregation": {
      "count": "Count",
      "sum": "Sum",
      "mean": "Average",
      "min": "Minimum",
      "max": "Maximum",
      "median": "Median"
    },
    "chart": {
      "emptyNumeric": "No numeric values to plot.",
      "emptyScatter": "No rows have both fields set to a number.",
      "emptyBar": "No rows to group.",
      "emptyPie": "No positive values to chart.",
      "pieCaptionCount_one": "row count · {{count}} category",
      "pieCaptionCount_other": "row count · {{count}} categories",
      "pieCaptionSum_one": "sum · {{count}} category",
      "pieCaptionSum_other": "sum · {{count}} categories"
    },
    "editor": {
      "addTitle": "Add widget",
      "editTitle": "Edit widget",
      "description": "Choose a layer, a chart type, and the fields to plot.",
      "noLayers": "No chartable layers. Add a vector or DuckDB query layer first.",
      "noFields": "This layer has no numeric or categorical fields to chart.",
      "layer": "Layer",
      "chartType": "Chart type",
      "field": "Field",
      "bins": "Bins",
      "xAxis": "X axis",
      "yAxis": "Y axis",
      "category": "Category",
      "aggregate": "Aggregate",
      "value": "Value",
      "prefix": "Prefix",
      "suffix": "Suffix",
      "multiSelect": "Allow multiple selection",
      "listColumns": "Columns",
      "sortBy": "Sort by",
      "sortDir": "Direction",
      "ascending": "Ascending",
      "descending": "Descending",
      "limit": "Row limit",
      "titleLabel": "Title",
      "titlePlaceholder": "Optional title",
      "color": "Color",
      "colorReset": "Reset",
      "colorDefault": "Default chart colors",
      "cancel": "Cancel",
      "save": "Save"
    }
  },
  "assistant": {
    "title": "AI Assistant",
    "resize": "Resize assistant panel",
    "clear": "Clear conversation",
    "close": "Close assistant",
    "send": "Send",
    "sendHint": "Send (Ctrl/Cmd+Enter)",
    "stop": "Stop",
    "placeholder": "Ask about your data, e.g. \"show countries with population over 50 million\" · Ctrl/Cmd+Enter to send",
    "intro": "Chat with your data. I can run Spatial SQL, add or remove layers, restyle them, and move the map — every change is undoable. Try \"color the countries by population with a graduated red ramp\".",
    "setupTitle": "Set up the AI Assistant",
    "setupStatus": "The assistant needs an AI provider to do the thinking. Add credentials for any one provider below and the panel switches to chat mode as soon as you save.",
    "setupProviders": "Add credentials for any one provider",
    "setupOpenSettings": "Open Settings → AI Providers",
    "thinking": "Working…",
    "toolError": "failed",
    "provider": "LLM provider",
    "profile": "AI profile",
    "deploymentProxy": "Deployment proxy",
    "model": "Model",
    "codeApprovalTitle": "Run assistant code?",
    "codeApprovalBody": "The assistant wants to run {{language}} code in the app. Review it first — it can change the map and access app data.",
    "codeApprovalAlways": "Allow assistant code for the rest of this session",
    "codeApprovalRun": "Run",
    "codeApprovalDecline": "Cancel"
  },
  "storymap": {
    "title": "Story Map",
    "description": "Build a scroll-driven story from map chapters. Each chapter captures a camera view and text.",
    "chapters": "Chapters ({{count}})",
    "addChapter": "Add chapter",
    "empty": "No chapters yet. Navigate the map, then add a chapter to capture the current view.",
    "defaultChapterTitle": "Chapter {{index}}",
    "untitledChapter": "Untitled chapter",
    "present": "Present",
    "exportHtml": "Export HTML",
    "exitPresentation": "Exit",
    "preview": "Fly to this chapter",
    "captureView": "Set to current view",
    "composeOnMap": "Compose on map",
    "resizeDialog": "Resize dialog",
    "composeMode": {
      "title": "Composing chapter",
      "hint": "Pan, zoom, and tilt the map, then save the view to this chapter.",
      "save": "Save view and return to Story Map",
      "cancel": "Cancel",
      "waiting": "Wait for the map to finish moving"
    },
    "moveUp": "Move up",
    "moveDown": "Move down",
    "onEnter": "On enter",
    "onExit": "On exit",
    "addEffect": "Add layer effect",
    "field": {
      "title": "Title",
      "subtitle": "Subtitle",
      "byline": "Byline",
      "footer": "Footer",
      "theme": "Panel theme",
      "showMarkers": "Show markers",
      "markerColor": "Marker color",
      "inset": "Inset minimap",
      "hideChapterNav": "Hide chapter list",
      "startView": "Enable start view",
      "closingSlide": "Enable closing slide",
      "chapterTitle": "Chapter title",
      "description": "Description (HTML allowed)",
      "image": "Image URL",
      "alignment": "Panel alignment",
      "animation": "Map animation",
      "hidden": "Hide panel",
      "rotate": "Rotate camera",
      "imagePlaceholder": "https://example.com/image.jpg"
    },
    "theme": {
      "dark": "Dark",
      "light": "Light"
    },
    "align": {
      "left": "Left",
      "center": "Center",
      "right": "Right",
      "full": "Full"
    },
    "inset": {
      "topLeft": "Top left",
      "topRight": "Top right",
      "bottomLeft": "Bottom left",
      "bottomRight": "Bottom right"
    },
    "slide": {
      "blank": "Empty screen",
      "black": "Black screen",
      "global": "Global view",
      "startAdjacent": "Preview of first chapter",
      "endAdjacent": "Hold on last chapter"
    },
    "loadSample": "Load sample story",
    "htmlFile": "HTML",
    "handout": {
      "button": "Handout (PDF)",
      "title": "PDF Handout Generator",
      "description": "Export selected chapter views as a multi-page PDF handout.",
      "screens": "Screens ({{count}}/{{total}})",
      "selectAll": "Select all",
      "selectNone": "Select none",
      "paperSize": "Paper size",
      "orientation": "Orientation",
      "portrait": "Portrait",
      "landscape": "Landscape",
      "documentTitle": "Document title",
      "documentTitlePlaceholder": "Title shown at the top of each page",
      "subtitle": "Subtitle",
      "subtitlePlaceholder": "Subtitle shown under the title on each page",
      "byline": "Byline",
      "bylinePlaceholder": "Author or credit line",
      "footerText": "Footer text",
      "footerPlaceholder": "Footer shown at the bottom of each page",
      "startSlide": "Start slide",
      "endSlide": "Closing slide",
      "generate": "Generate PDF",
      "stop": "Stop",
      "cancelled": "Export cancelled.",
      "progress": "Capturing view {{current}} of {{total}}…",
      "pdfFile": "PDF Document",
      "noMap": "The map is not ready yet. Try again in a moment.",
      "noneSelected": "Select at least one screen to export."
    },
    "opacityLabel": "Opacity",
    "toggleNav": "Toggle chapter list",
    "chapterNav": "Story chapters",
    "durationLabel": "Transition (ms)",
    "dragHint": "Drag to move (double-click to reset)",
    "resizeHint": "Drag to resize",
    "import": "Import",
    "importJson": "Import JSON…",
    "importCsv": "Import CSV…",
    "exportData": "Export",
    "exportJson": "Export JSON",
    "exportCsv": "Export CSV",
    "reset": "Reset",
    "resetTitle": "Clear the story and start over",
    "resetConfirm": "Clear this story map? All chapters and settings will be removed so you can start your own."
  },
  "network": {
    "title": "Network analysis",
    "description": "Isochrones, service areas, and origin–destination cost matrices from your point layers.",
    "heading": "Network",
    "run": "Run",
    "outputPlaceholder": "Output will appear here.",
    "endpointNotice": "Point coordinates are sent to the routing server ({{endpoint}}). The default is a shared public Valhalla server (FOSSGIS), which is rate-limited. For heavy use, enter your own server's URL in the \"Routing server (Valhalla)\" field above."
  },
  "statistics": {
    "title": "Spatial statistics",
    "description": "Spatial autocorrelation, hotspot analysis, and density measures. Every tool runs client-side on your GeoJSON layers.",
    "heading": "Spatial Statistics",
    "run": "Run",
    "requiredFieldLegend": "Indicates a required field",
    "outputPlaceholder": "Output will appear here."
  },
  "processing": {
    "filePicker": {
      "filePath": "File path",
      "chooseFile": "Choose file",
      "chooseFilePlaceholder": "Choose a file",
      "chooseInputFile": "Choose input file",
      "chooseOutputFile": "Choose output file"
    },
    "searchTools": "Search tools",
    "refreshCatalog": "Refresh catalog",
    "increaseValue": "Increase value",
    "decreaseValue": "Decrease value",
    "distance": {
      "unitLabel": "Distance unit",
      "units": {
        "degrees": "Degrees",
        "meters": "Meters",
        "kilometers": "Kilometers",
        "feet": "Feet",
        "miles": "Miles"
      },
      "north": "{{latitude}}°N",
      "south": "{{latitude}}°S",
      "equator": "the equator",
      "geographicNote": "The selected layers use a geographic CRS (WGS84), so distances are in degrees. Pick a unit next to a distance field to enter meters instead, or reproject to a projected CRS for exact results.",
      "converted": "Sent to the tool as {{degrees}}°, converted at {{latitude}}. A degree varies with latitude and direction, so this is approximate.",
      "convertedEmpty": "Values will be converted to degrees at {{latitude}}. A degree varies with latitude and direction, so this is approximate.",
      "notANumber": "Not a number, so it is passed to the tool as typed instead of converted. Use a plain decimal such as 12000 or 1.5."
    },
    "history": {
      "title": "Processing History",
      "description": "Every processing run in this project, newest first. Re-run a tool, reopen it with the same parameters, or copy the run as JSON or Python.",
      "empty": "No processing runs recorded yet. Run a tool from the Processing menu and it will appear here.",
      "rerun": "Re-run",
      "editRerun": "Edit & re-run",
      "copyJson": "Copy JSON",
      "copyPython": "Copy Python",
      "copied": "Copied",
      "clear": "Clear history",
      "count_one": "{{count}} run recorded",
      "count_other": "{{count}} runs recorded",
      "toolUnavailable": "Tool \"{{toolId}}\" is no longer available"
    },
    "modelBuilder": {
      "moveStepUp": "Move step up",
      "moveStepDown": "Move step down",
      "removeStep": "Remove step",
      "title": "Batch & Models",
      "description": "Run a vector tool across many layers, or chain tools into a reusable model saved with your project.",
      "tabBatch": "Batch",
      "tabModels": "Models",
      "outputPlaceholder": "Output will appear here.",
      "tool": "Tool",
      "sharedParameters": "Shared parameters",
      "noExtraParameters": "This tool has no extra parameters.",
      "inputLayers": "Input layers",
      "selectAll": "Select all",
      "clearSelection": "Clear",
      "noCompatibleLayers": "No compatible GeoJSON layers.",
      "newModel": "New model",
      "noSavedModels": "No saved models yet.",
      "untitledModel": "Untitled model",
      "modelName": "Model name",
      "emptyPipelineHint": "Add a step to start building the pipeline. The first step reads an input layer; each later step receives the previous step's output.",
      "addStep": "Add step",
      "runModel": "Run model",
      "deleteModel": "Delete",
      "inputPreviousStep": "Input: ← previous step output",
      "unknownTool": "Unknown tool \"{{id}}\"",
      "noParameters": "No parameters."
    },
    "parameterField": {
      "selectLayer": "Select a layer...",
      "selectField": "Select a field...",
      "selectLayerFirst": "Select a layer first"
    },
    "whitebox": {
      "run": "Run",
      "running": "Running…",
      "runLocal": "Run locally (WASM)",
      "runLocalHint": "Run locally in WebAssembly (no Python sidecar)",
      "runningLocally": "Running locally with WebAssembly. No sidecar required.",
      "copyLink": "Copy link",
      "copyLinkCopied": "Copied!",
      "copyLinkHint": "Copy a shareable link that opens this tool with the current settings",
      "copyLinkFailed": "Could not copy the link to the clipboard.",
      "catalogSnapshotError": "Could not load Whitebox catalog snapshot.",
      "localRunnerError": "Could not load the local (WASM) tool runner. Refresh and try again, or use the sidecar if it is available.",
      "output": {
        "geojson": "GeoJSON (add to map)",
        "geoparquet": "GeoParquet (download, keeps CRS)",
        "flatgeobuf": "FlatGeobuf (download, keeps CRS)",
        "shapefile": "Shapefile (download, keeps CRS)",
        "projectedHint": "Saved to your downloads in the target CRS. The map only displays EPSG:4326, so a projected result is not added as a layer."
      },
      "filterBySource": "Filter by source",
      "allSources": "All sources",
      "geolibreTools": "GeoLibre tools",
      "whiteboxTools": "Whitebox tools",
      "toolbox": "Whitebox toolbox",
      "checkingRuntime": "Checking runtime.",
      "toolsAvailable_one": "{{count}} tool available.",
      "toolsAvailable_other": "{{count}} tools available.",
      "runtimeUnavailable": "Whitebox runtime is unavailable.",
      "useMapExtent": "Use map extent",
      "fromLayer": "From layer",
      "drawBbox": "Draw on map",
      "drawingBbox": "Drawing…",
      "drawBboxHint": "Drag a box on the map to set the bounding box. Press Esc to cancel.",
      "mapExtentPlaceholder": "minX,minY,maxX,maxY",
      "mapExtentUnavailable": "The map view is not available yet. Wait for the map to load, then try again.",
      "mapExtentInvalid": "The current map view can't be used as a bounding box: it wraps the 180° meridian or extends beyond valid longitude/latitude bounds. Adjust the view, then try again.",
      "extentLabel": "Area of interest",
      "extentNorth": "North",
      "extentSouth": "South",
      "extentWest": "West",
      "extentEast": "East",
      "extentHint": "Take the box from the current map view, or drag one on the map, instead of typing each boundary. Coordinates are filled in as WGS84 (EPSG:4326).",
      "noToolSelected": "No tool selected",
      "optionDefault": "Default",
      "optionPath": "Path",
      "selectedLayer": "Selected layer",
      "filePath": "File path",
      "auto": "Auto",
      "chooseOutputPath": "Choose output path",
      "chooseInputPath": "Choose input path",
      "categoryGeneral": "General",
      "categoryAll": "All ({{total}})",
      "errorLoadSnapshot": "Could not load Whitebox catalog snapshot.",
      "errorLoadLive": "Could not load live catalog.",
      "errorConnect": "Could not connect to sidecar.",
      "errorPoll": "Could not poll job.",
      "errorStartTool": "Could not start Whitebox tool.",
      "errorStartSidecar": "Could not start GeoLibre sidecar.",
      "errorStopSidecar": "Could not stop GeoLibre sidecar.",
      "noToolsFound": "No tools found.",
      "noParameters": "This tool has no parameters.",
      "noOutput": "No output yet.",
      "enabled": "Enabled",
      "requiredSuffix": " | required",
      "selectField": "Select a field",
      "fieldName": "Field name",
      "crs": {
        "browse": "Browse",
        "codePlaceholder": "EPSG code",
        "searchLabel": "Search coordinate reference systems",
        "searchPlaceholder": "Search by name or EPSG code",
        "geographic": "Geographic",
        "projected": "Projected",
        "noResults": "No matching coordinate system. Any EPSG code can still be typed."
      },
      "vectorUnitsNote": "Vector layers are read as WGS84, so distance, spacing and tolerance values are in degrees, not meters. 1° is about 111 km, and 0.001° is about 111 m."
    },
    "sidecar": {
      "unavailableTitle": "The processing server isn't available.",
      "showHelp": "Show what this means and how to fix it",
      "hideHelp": "Hide details",
      "intro": "The processing server is an optional local helper ({{sidecarUrl}}) that runs heavier Python-backed tools in the background, separate from the app. Most Whitebox tools don't need it: they can run entirely in your browser with WebAssembly.",
      "wasmTipTitle": "Run without the server",
      "wasmTip": "Enable \"Run locally (WASM)\" to run Whitebox tools in your browser. No server, install, or setup required.",
      "runLocallyButton": "Run locally (WASM)",
      "troubleshootingTitle": "Still want to use the server?",
      "stepStartServerDesktop": "Click \"Start server\" in the tool list panel to launch it, then wait a few seconds for it to come online.",
      "stepStartServerBrowser": "The server can only be started from the GeoLibre desktop app. In the browser, keep \"Run locally (WASM)\" enabled instead.",
      "stepCheckPort": "Make sure a firewall, antivirus, or network policy isn't blocking local port {{port}}.",
      "stepRestart": "If the server stopped unexpectedly, restart the GeoLibre desktop app and reopen this dialog."
    },
    "vectorTools": {
      "title": "Vector tools",
      "description": "Run common vector geometry operations on your GeoJSON layers.",
      "engine": "Engine",
      "engineClient": "Client (Turf.js)",
      "engineSidecar": "Sidecar (GeoPandas)",
      "enginePyodide": "Python (Pyodide)",
      "checkingSidecar": "Checking sidecar availability...",
      "sidecarUnavailableClient": "The GeoPandas sidecar is not available. Start the sidecar with the vector extra, or switch to the client engine.",
      "sidecarUnavailablePyodide": "The GeoPandas sidecar is not available. Start the sidecar with the vector extra, or switch to Python (Pyodide).",
      "pyodideNote": "Runs GeoPandas in your browser. The first run downloads the Python runtime (one-time, needs an internet connection).",
      "run": "Run",
      "outputPlaceholder": "Output will appear here.",
      "resolutionRange": "Resolution (0-{{max}})"
    }
  },
  "segmentation": {
    "title": "AI Segmentation",
    "description": "Turn imagery into vector features with SAM3 (segment-geospatial). Choose a GeoTIFF, describe what to segment, and get polygons back as a new layer.",
    "startServer": "Start server",
    "downloadDesktop": "Download desktop app",
    "imageLabel": "Image (GeoTIFF)",
    "imagePlaceholder": "Choose a GeoTIFF…",
    "chooseImage": "Choose image",
    "modeLabel": "Mode",
    "modeText": "Text prompt",
    "modeAutomatic": "Automatic (everything)",
    "promptLabel": "Prompt",
    "promptPlaceholder": "e.g. trees, buildings, water",
    "confidenceLabel": "Confidence threshold",
    "segment": "Segment",
    "status": {
      "checking": "Checking the AI segmentation service…",
      "unavailableDesktop": "The AI segmentation service is not running yet. Start the GeoLibre server with segment-geospatial enabled to use it.",
      "unavailableWeb": "AI segmentation isn't available in the browser. Use the GeoLibre desktop app to run it."
    },
    "error": {
      "chooseImage": "Choose an image (GeoTIFF) to segment.",
      "enterPrompt": "Enter a text prompt, e.g. “trees” or “buildings”.",
      "startServer": "Could not start GeoLibre sidecar.",
      "failed": "Segmentation failed."
    },
    "noObjects": "No objects found.",
    "added": "Added {{count}} feature(s) as “{{name}}”.",
    "layerName": "Segmentation: {{prompt}}",
    "layerNameDefault": "Segmentation",
    "sidecar": {
      "title": "Couldn't start the AI segmentation server.",
      "intro": "AI segmentation runs in a local helper server ({{sidecarUrl}}) that hosts the SAM3 model from segment-geospatial. It runs Python in the background, separate from the app, and isn't part of the browser build.",
      "troubleshootingTitle": "How to get the server running",
      "stepInstall": "Make sure the GeoLibre server is installed with the segment-geospatial backend enabled, so the segmentation model is available.",
      "stepStartServerDesktop": "Click \"Start server\" above to launch it, then wait a few seconds for the model to come online."
    }
  },
  "objectDetection": {
    "title": "Object Detection",
    "description": "Run a YOLO model exported to ONNX over a GeoTIFF or geotagged photo, fully in the browser. Each detected class is added as its own layer.",
    "hint": "Use a built-in COCO model (downloaded and cached once) or bring your own YOLOv5/v8/v11 ONNX. GeoTIFF detections become georeferenced boxes. Photo detections become points at the camera's GPS location because a photo does not define a ground footprint.",
    "imageLabel": "Image (GeoTIFF or geotagged photo)",
    "imagePlaceholder": "Choose a GeoTIFF, JPEG, PNG, or WebP…",
    "chooseImage": "Choose image",
    "modelLabel": "Model",
    "modelSourceBuiltin": "Built-in (download)",
    "modelSourceLocal": "Local file",
    "builtinModelLabel": "Built-in model",
    "modelFileLabel": "Model file (ONNX)",
    "modelPlaceholder": "Choose a .onnx model…",
    "chooseModel": "Choose model",
    "downloadingModel": "Downloading model…",
    "classNamesLabel": "Class names (comma-separated, optional)",
    "classNamesPlaceholder": "e.g. car, tree, building",
    "confidenceLabel": "Confidence",
    "iouLabel": "IoU (NMS)",
    "inputSizeLabel": "Input size",
    "detect": "Detect",
    "noObjects": "No objects detected. Try lowering the confidence threshold.",
    "added": "Added {{count}} detection(s) across {{classes}} class(es).",
    "layerName": "Detection: {{class}}",
    "error": {
      "chooseImage": "Choose a GeoTIFF or geotagged photo to run detection on.",
      "photoLocation": "This photo has no usable GPS coordinates. Choose a geotagged photo.",
      "chooseModel": "Choose a YOLO model exported to ONNX (.onnx).",
      "downloadModel": "Could not download the model. Check your connection and try again.",
      "failed": "Detection failed."
    }
  },
  "segmentEverything": {
    "title": "Segment Everything",
    "description": "Run SlimSAM automatically over a GeoTIFF, fully in the browser. Every detected object becomes a georeferenced polygon added as one layer.",
    "hint": "A grid of points is sampled across the image and segmented with SlimSAM (downloaded and cached once). No clicks or labels — denser grids find more objects but take longer.",
    "imageLabel": "Image (GeoTIFF)",
    "imagePlaceholder": "Choose a GeoTIFF…",
    "chooseImage": "Choose image",
    "gridLabel": "Grid",
    "qualityLabel": "Quality",
    "minSizeLabel": "Min size %",
    "run": "Segment",
    "downloadingModel": "Downloading model…",
    "progress": "Segmenting… {{done}}/{{total}}",
    "noObjects": "No objects segmented. Try a denser grid or a lower quality threshold.",
    "added": "Added {{count}} segment(s).",
    "layerName": "Segments",
    "error": {
      "chooseImage": "Choose an image (GeoTIFF) to segment.",
      "downloadModel": "Could not download the model. Check your connection and try again.",
      "failed": "Segmentation failed."
    }
  },
  "pluginPanel": {
    "expand": "Expand panel",
    "collapse": "Collapse panel",
    "close": "Close panel",
    "resize": "Resize panel",
    "moveLeft": "Move panel to the left",
    "moveRight": "Move panel to the right",
    "mergeIntoStyleRail": "Merge into the Style rail",
    "mergeIntoLayersRail": "Merge into the Layers rail",
    "detach": "Detach as a movable panel",
    "collapsedLabel": "{{title}} (collapsed)"
  },
  "sharedRail": {
    "label": "Sidebar",
    "layers": "Layers",
    "style": "Style",
    "expand": "Expand {{title}}",
    "collapse": "Collapse {{title}}"
  },
  "attributeTable": {
    "title": "Attribute table",
    "resize": "Resize attribute table",
    "editValues": "Edit attribute values",
    "editTitleFinishGeometry": "Finish geometry editing to edit attributes",
    "editTitleReadOnly": "Editing is not available for Add Vector Layer layers",
    "editTitleUseSaveCancel": "Use Save or Cancel to finish editing",
    "exitEditMode": "Exit edit mode",
    "editTitleDuckdb": "Edit displayed DuckDB query attributes in memory",
    "saveEdits": "Save attribute edits",
    "saveTitleInvalid": "Fix invalid JSON before saving",
    "saveTitleDuckdb": "Save in-memory DuckDB attribute edits",
    "addFieldTitle": "Add a new field",
    "addField": "Add field",
    "fieldCalculatorTitle": "Calculate field values from an expression",
    "fieldCalculator": "Field calculator",
    "manageFieldsTitle": "Show or hide fields",
    "manageFields": "Manage fields",
    "columnExplorerTitle": "Explore all fields at a glance",
    "columnExplorerTitleDisabled": "Column explorer requires a vector or DuckDB query layer",
    "columnExplorer": "Column explorer",
    "statisticsTitle": "Field statistics summary",
    "statisticsTitleDisabled": "Statistics require a vector or DuckDB query layer",
    "statistics": "Field statistics",
    "chartsTitle": "Chart numeric fields",
    "chartsTitleDisabled": "Charts require a vector or DuckDB query layer",
    "charts": "Charts",
    "dashboardTitle": "Open the dashboard to build chart widgets",
    "dashboard": "Dashboard",
    "exportSelectedLayer": "Export selected layer",
    "exportTitleDisabled": "Export requires a GeoJSON-backed layer",
    "cancelEdits": "Cancel attribute edits",
    "searchPlaceholder": "Search attributes...",
    "searchAria": "Search attributes",
    "clearSelectedFeature": "Clear selection",
    "statusFeatures_one": "{{count}} feature",
    "statusFeatures_other": "{{count}} features",
    "statusShown_one": "{{count}} shown",
    "statusShown_other": "{{count}} shown",
    "statusSelected_one": "{{count}} selected",
    "statusSelected_other": "{{count}} selected",
    "featureViewAria": "Feature view",
    "showAllFeatures": "Show All Features",
    "showSelectedFeatures": "Show Selected ({{count}})",
    "expand": "Expand attribute table",
    "collapse": "Collapse attribute table",
    "close": "Close attribute table",
    "newFieldPlaceholder": "e.g. category",
    "defaultValuePlaceholder": "Leave blank for empty",
    "newFieldNamePlaceholder": "New field name",
    "showFields": "Show fields",
    "noFields": "No fields",
    "showAllFields": "Show all fields",
    "buttons": {
      "edit": "Edit",
      "calculate": "Calculate",
      "fields": "Fields",
      "explore": "Explore",
      "statistics": "Statistics",
      "export": "Export"
    },
    "chart": {
      "field": "Field",
      "xAxis": "X axis",
      "yAxis": "Y axis",
      "category": "Category",
      "value": "Value",
      "title": "Charts",
      "description": "Visualize fields in \"{{layer}}\".",
      "noChartableFields": "This layer has no numeric or categorical fields to chart.",
      "chartType": "Chart type",
      "typeHistogram": "Histogram",
      "typeScatter": "Scatter",
      "typeBar": "Bar",
      "typeLine": "Line",
      "typeBox": "Box plot",
      "typePie": "Pie",
      "bins": "Bins",
      "aggregate": "Aggregate",
      "aggCount": "Count",
      "aggSum": "Sum",
      "aggAverage": "Average",
      "download": "Download",
      "downloadPng": "PNG image",
      "downloadSvg": "SVG vector",
      "exportError": "Could not export the chart."
    },
    "selectedLayerName": "- {{name}}",
    "noLayerSelected": "- select a layer with attributes",
    "zoomToSelection": "Zoom to selection",
    "loadingAttributes": "Loading layer attributes…",
    "requiresVectorLayer": "Attribute table requires a vector or DuckDB query layer.",
    "invalidJson": "Invalid JSON",
    "editCellAria": "Edit {{col}} for feature {{featureId}}",
    "resizeColumn": "Resize {{name}} column",
    "renameFieldAria": "Rename field {{name}}",
    "manageFieldTitle": "Manage field \"{{name}}\"",
    "manageFieldAria": "Manage field {{name}}",
    "renameField": "Rename field",
    "hideField": "Hide field",
    "excludeField": "Exclude field on export",
    "includeField": "Include field on export",
    "moveLeft": "Move left",
    "moveRight": "Move right",
    "deleteField": "Delete field",
    "joinedColumnTitle": "Joined column, derived from a join table. Edit the join table or the join definition instead.",
    "virtualColumnTitle": "Virtual field, computed from an expression. Edit its definition in the layer's style panel instead.",
    "deleteFieldConfirm": "This permanently removes the field \"{{field}}\" from every feature in \"{{layer}}\". Styling or labels that reference it will be cleared. This cannot be undone.",
    "addFieldDescription": "Add a new field to every feature in \"{{layer}}\".",
    "fieldName": "Field name",
    "fieldExists": "A field named \"{{name}}\" already exists.",
    "fieldType": "Type",
    "typeText": "Text",
    "typeNumber": "Number",
    "typeBoolean": "Boolean",
    "defaultValue": "Default value",
    "noDefault": "(no default)",
    "noFeaturesForField": "This layer has no features to add a field to.",
    "calcDescription": "Compute values from a JavaScript expression and write them to a field in \"{{layer}}\".",
    "targetField": "Target field",
    "updateField": "Update field",
    "createField": "Create field",
    "outputType": "Output type",
    "outputAuto": "Auto (keep computed type)",
    "expression": "Expression",
    "calcExpressionPlaceholder": "e.g. pop / area, or upper(name), or pop > 100 ? \"big\" : \"small\"",
    "fieldsLabel": "Fields:",
    "insertField": "Insert {{name}}",
    "functionsLabel": "Functions:",
    "insertFunction": "Insert {{name}}()",
    "geomMeasureLabel": "Geometry:",
    "geomMetric": {
      "length": "Length",
      "perimeter": "Perimeter",
      "area": "Area"
    },
    "geomInsert": "Insert",
    "sampleRowErrored": "Sample row errored (other rows may still compute): {{message}}",
    "preview": "Preview:",
    "onlySelectedFeature": "Only update the selected features",
    "evaluationFailed": "Evaluation failed.",
    "invalidExpression": "Invalid expression.",
    "calcCouldNotApply": "Could not apply the calculation to this layer.",
    "calcAppliedWithErrors": "Applied, but {{errors}} of {{evaluated}} feature(s) errored and were written as null.",
    "exportFailed": "Could not export the selected layer.",
    "saveTitleFormErrors": "Fix attribute form violations before saving"
  },
  "styleManager": {
    "title": "Style Manager",
    "description": "Save, browse, and apply reusable styles, symbols, label presets, and color ramps across layers and projects.",
    "searchPlaceholder": "Search styles and tags…",
    "presetsSection": "Built-in presets",
    "librarySection": "My library",
    "projectSection": "This project",
    "empty": "No saved styles match. Save a layer's style or import a library to get started.",
    "apply": "Apply",
    "delete": "Delete",
    "saveCurrent": "Save current style…",
    "nameLabel": "Name",
    "kindLabel": "What to save",
    "kindStyle": "Full style",
    "kindSymbol": "Symbol only",
    "kindLabels": "Labels only",
    "kindRamp": "Color ramp only",
    "tagsLabel": "Tags",
    "tagsPlaceholder": "boundary, basemap (comma-separated)",
    "scopeLabel": "Store in",
    "scopeApp": "My library (all projects)",
    "scopeProject": "This project only",
    "saveButton": "Save style",
    "cancel": "Cancel",
    "import": "Import…",
    "export": "Export…",
    "importFilterName": "Style library / QML / SLD",
    "exportFilterName": "GeoLibre style library",
    "applied": "Applied \"{{name}}\" to {{layer}}.",
    "appliedRampHint": "Applied \"{{name}}\". Switch the layer to graduated or categorized styling to see the ramp.",
    "saved": "Saved \"{{name}}\" to the library.",
    "deleted": "Deleted \"{{name}}\".",
    "importedCount_one": "Imported {{count}} style.",
    "importedCount_other": "Imported {{count}} styles.",
    "importedEntryName": "Imported style",
    "importInvalid": "That file is not a style library, QML, or SLD.",
    "importNoMatch": "No symbology could be read from that style.",
    "exportEmpty": "There are no saved styles to export.",
    "exportFailed": "Could not export the style library.",
    "exportSuccess": "Style library exported.",
    "noLayer": "Select a vector layer to save or apply styles."
  },
  "style": {
    "panelLabel": "Layer style",
    "panelLabelCollapsed": "Layer style (collapsed)",
    "heading": "Style",
    "headingWithLayer": "Style - {{name}}",
    "resizePanel": "Resize Style panel",
    "expand": "Expand style",
    "collapse": "Collapse style",
    "openStyleManager": "Saved styles…",
    "addClass": "Add class",
    "removeClass": "Remove class",
    "beforeIdSavedUnavailable": "Saved (unavailable)",
    "raster": {
      "greyscale": "Greyscale",
      "greyscaleHint": "Toggle a greyscale basemap (drives saturation to its minimum)",
      "reset": "Reset",
      "resetHint": "Reset adjustments to their default values",
      "exactValueHint": "Double-click to enter an exact value",
      "opacity": "Opacity",
      "brightnessMin": "Brightness Min",
      "brightnessMax": "Brightness Max",
      "saturation": "Saturation",
      "contrast": "Contrast",
      "hueRotate": "Hue Rotate",
      "footerDeck": "Changes apply live to the raster layer opacity.",
      "footerMaplibre": "Changes apply live to MapLibre raster paint properties.",
      "valueAria": "{{label}} value",
      "editValueAria": "Edit {{label}} value"
    },
    "visibility": {
      "minZoom": "Min zoom",
      "maxZoom": "Max zoom",
      "minZoomTooltip": "Zoom level at which this layer appears. Higher numbers are more zoomed in.",
      "maxZoomTooltip": "Zoom level at which this layer disappears. Higher numbers are more zoomed in."
    },
    "joins": {
      "heading": "Joins",
      "empty": "Attach columns from another layer or table by matching key fields. Joined columns update when the join table changes and persist with the project.",
      "addJoin": "Add join",
      "joinLayer": "Join layer",
      "selectLayer": "Select a layer…",
      "joinField": "Join field",
      "targetField": "Target field",
      "selectField": "Select a field…",
      "fields": "Fields to join",
      "fieldCount_one": "{{count}} field",
      "fieldCount_other": "{{count}} fields",
      "prefix": "Field name prefix",
      "prefixPlaceholder": "e.g. census_",
      "add": "Add",
      "cancel": "Cancel",
      "remove": "Remove join",
      "enabledTitle": "Apply this join",
      "missingLayer": "Join layer not found",
      "noCandidates": "No other layer has an attribute table to join",
      "statsMatched": "{{matched}} of {{total}} features matched",
      "statsUnmatchedJoin_one": "{{count}} join row unmatched",
      "statsUnmatchedJoin_other": "{{count}} join rows unmatched"
    },
    "virtualFields": {
      "heading": "Virtual fields",
      "empty": "Add expression-backed columns that recompute whenever the data changes. Virtual fields persist with the project and appear everywhere fields do: the attribute table, styling, labels, and selection.",
      "addField": "Add virtual field",
      "name": "Field name",
      "namePlaceholder": "e.g. density",
      "nameTaken": "A column with this name already exists",
      "nameConflict": "Not applied: the name collides with an existing column",
      "expression": "Expression",
      "expressionPlaceholder": "[\"/\", [\"get\", \"pop\"], [\"get\", \"area_km2\"]]",
      "expressionTarget": "Virtual field expression",
      "openBuilder": "Open builder",
      "invalidExpression": "Invalid expression",
      "add": "Add",
      "save": "Save",
      "cancel": "Cancel",
      "edit": "Edit virtual field",
      "remove": "Remove virtual field",
      "enabledTitle": "Apply this virtual field",
      "evaluationErrors_one": "{{count}} feature failed to evaluate (null cell)",
      "evaluationErrors_other": "{{count}} features failed to evaluate (null cells)"
    },
    "labels": {
      "heading": "Labels",
      "show": "Show labels",
      "field": "Label field",
      "noAttributes": "No attributes found",
      "selectField": "Select a field…",
      "placement": "Placement",
      "placementPoint": "Centroid / point",
      "placementLine": "Along line / polygon edge",
      "textSize": "Text size",
      "haloWidth": "Halo width",
      "textColor": "Text color",
      "haloColor": "Halo color",
      "minZoom": "Min zoom",
      "maxZoom": "Max zoom",
      "allowOverlap": "Allow labels to overlap",
      "anchor": "Anchor",
      "anchorCenter": "Center",
      "anchorLeft": "Left",
      "anchorRight": "Right",
      "anchorTop": "Top",
      "anchorBottom": "Bottom",
      "anchorTopLeft": "Top left",
      "anchorTopRight": "Top right",
      "anchorBottomLeft": "Bottom left",
      "anchorBottomRight": "Bottom right",
      "offsetX": "Offset X (em)",
      "offsetY": "Offset Y (em)",
      "rotation": "Rotation (°)",
      "maxWidth": "Wrap width (em)",
      "transform": "Letter case",
      "transformNone": "As entered",
      "transformUppercase": "UPPERCASE",
      "transformLowercase": "lowercase",
      "dedupe": "Duplicate labels",
      "dedupeOff": "Label every feature",
      "dedupeUnique": "One label per location",
      "dedupeConcatenate": "Merge values at a location",
      "dedupeHint": "Collapses points stacked at the same coordinate. Uses the label field on local point layers.",
      "expression": "Expression (optional)",
      "expressionHint": "A MapLibre expression (JSON). Overrides the field when set.",
      "expressionInvalid": "Not a valid MapLibre expression (must be a JSON array). This value is ignored.",
      "dataDefined": {
        "heading": "Data-defined overrides",
        "size": "Size",
        "color": "Color",
        "opacity": "Opacity",
        "visibility": "Visibility",
        "priority": "Priority",
        "sizeTarget": "Label size expression",
        "colorTarget": "Label color expression",
        "opacityTarget": "Label opacity expression",
        "visibilityTarget": "Label visibility expression",
        "priorityTarget": "Label priority expression",
        "notSet": "Not set",
        "clear": "Clear expression",
        "hint": "Per-feature MapLibre expressions. Size, opacity, and priority produce numbers (labels with lower priority values are placed first), color a color, visibility true/false. Ignored while duplicate-label collapsing is active. An opacity expression replaces the layer opacity for labels."
      }
    },
    "elevation3d": {
      "mode": "3D (Z values)",
      "fillColor": "Fill color",
      "outlineColor": "Outline color",
      "strokeWidth": "Stroke width",
      "strokeWidthMeters": "Stroke width (meters)",
      "fillOpacity": "Fill opacity",
      "circleRadius": "Circle radius",
      "verticalScale": "Vertical exaggeration",
      "verticalScaleTooltip": "Multiplies each coordinate's Z value. 1 renders true elevations; larger values emphasize relief.",
      "offset": "Altitude offset (m)",
      "offsetTooltip": "Constant height in meters added to every feature, e.g. to lift a track above 3D buildings or terrain.",
      "footer": "Rendered in 3D at coordinate Z values via deck.gl. Changes apply live. Identify and feature highlighting are not available in this mode."
    },
    "diagrams": {
      "heading": "Diagrams",
      "chartType": "Chart type",
      "typeNone": "None",
      "typePie": "Pie chart",
      "typeDonut": "Donut chart",
      "typeBar": "Bar chart",
      "typeStackedBar": "Stacked bar chart",
      "fields": "Attributes",
      "addField": "Add attribute",
      "removeField": "Remove attribute",
      "noFields": "Add numeric attributes to chart on each feature.",
      "fieldAttribute": "Diagram attribute {{index}}",
      "sizeMode": "Size",
      "sizeFixed": "Fixed size",
      "sizeSum": "Scaled by sum of attributes",
      "sizeAttribute": "Scaled by attribute",
      "sizeField": "Size attribute",
      "size": "Size (px)",
      "minZoom": "Minimum zoom",
      "declutter": "Hide overlapping diagrams",
      "truncated": "Diagrams are drawn for only {{count}} features; the rest are not charted.",
      "atlasFull": "{{count}} diagrams do not fit at this size and are hidden. Reduce the diagram size."
    },
    "symbology": {
      "colormap": "Colormap",
      "modeSingle": "Single symbology",
      "modeGraduated": "Graduated",
      "modeCategorized": "Categorized",
      "modeRuleBased": "Rule-based",
      "modeExpression": "Advanced expression",
      "rules": "Rules",
      "addRule": "Add rule",
      "removeRule": "Remove rule",
      "noRulesPrefix": "No rules yet. Add a rule and give it a MapLibre filter expression (e.g. ",
      "noRulesSuffix": "). The first matching rule wins; the Else rule colors everything else.",
      "ruleColor": "Rule {{index}} color",
      "ruleColorPick": "Pick rule {{index}} color from the screen",
      "ruleLabel": "Rule {{index}} label",
      "ruleFilter": "Rule {{index}} filter",
      "ruleEnabled": "Enable rule {{index}}",
      "ruleAddChild": "Add sub-rule",
      "ruleOptions": "Symbol and visibility",
      "ruleMinZoom": "Min zoom",
      "ruleMaxZoom": "Max zoom",
      "ruleZoomInvalid": "Min zoom must be below max zoom - this rule never applies while the range is empty.",
      "ruleStrokeWidth": "Stroke width",
      "ruleFillOpacity": "Fill opacity",
      "ruleCircleSize": "Circle radius",
      "ruleOutlineColor": "Override outline color",
      "ruleOutlineColorPick": "Pick rule {{index}} outline color from the screen",
      "ruleInherit": "Inherit",
      "ruleGroupNote": "This rule has sub-rules: it narrows what its children match and does not draw itself.",
      "labelPlaceholder": "Label (optional)",
      "filterInvalid": "Invalid filter — must be a JSON array expression. This rule is skipped until fixed.",
      "elseRuleColor": "Else rule color",
      "elseRuleColorPick": "Pick the else rule color from the screen",
      "elseRuleEnabled": "Enable the else rule (when off, features matching no rule are hidden)",
      "elseAllOtherFeatures": "Else (all other features)",
      "applyHint": "Click Apply to activate rule-based rendering.",
      "rulesApplyLive": "Rule changes apply to the map immediately — no separate apply step is needed.",
      "proportionalSize": "Proportional size",
      "sizeByValue": "Size by value",
      "sizeField": "Size field",
      "chooseField": "Choose a field…",
      "minValue": "Min value",
      "maxValue": "Max value",
      "minSize": "Min size (px)",
      "maxSize": "Max size (px)",
      "sizeLegend": "Size legend",
      "fillPattern": "Fill pattern",
      "patternColor": "Pattern color",
      "patternSvg": "Pattern SVG",
      "svgPlaceholder": "<svg xmlns='http://www.w3.org/2000/svg' ...>…</svg> or a data/https URL",
      "marker": "Marker",
      "useMarkerIcon": "Use marker icon",
      "markerShape": "Marker shape",
      "markerColor": "Marker color",
      "markerSize": "Marker size (px)",
      "markerSvg": "Marker SVG",
      "markerShapes": {
        "circle": "Circle",
        "square": "Square",
        "triangle": "Triangle",
        "diamond": "Diamond",
        "star": "Star",
        "cross": "Cross",
        "pin": "Pin",
        "custom": "Custom SVG"
      },
      "fillPatterns": {
        "none": "None (solid fill)",
        "hatch": "Hatch",
        "crossHatch": "Cross-hatch",
        "horizontal": "Horizontal lines",
        "vertical": "Vertical lines",
        "dots": "Dots",
        "svg": "Custom SVG"
      },
      "transparent": "Transparent",
      "transparentSwatch": "No color (transparent). Click to choose a color.",
      "styleType": "Style type",
      "attribute": "Attribute",
      "classes": "Classes",
      "allClasses": "All ({{total}})",
      "scheme": "Scheme",
      "stops": "Stops",
      "categories": "Categories",
      "classColor": "Class {{index}} color",
      "classColorPick": "Pick class {{index}} color from the screen",
      "classValue": "Class {{index}} value",
      "colorExpression": "Color expression",
      "applyStyleType": "Apply style type",
      "pointRenderer": "Point renderer",
      "pointRendererSingle": "Single symbol",
      "pointRendererHeatmap": "Heatmap",
      "pointRendererClustered": "Clustered",
      "heatmapRadius": "Heatmap radius",
      "heatmapIntensity": "Heatmap intensity",
      "clusterRadius": "Cluster radius (px)",
      "clusterMaxZoom": "Cluster max zoom",
      "strokeWidthUnit": "Stroke width unit",
      "strokeWidthUnitPixels": "Pixels (constant on screen)",
      "strokeWidthUnitMeters": "Meters (scales with map)",
      "textHaloColor": "Text halo color",
      "textHaloWidth": "Text halo width",
      "schemeEqualInterval": "Equal interval",
      "schemeQuantile": "Quantile",
      "schemeNaturalBreaks": "Natural breaks",
      "schemeTopValues": "Most frequent",
      "schemeAlphabetical": "Alphabetical",
      "schemeFirstValues": "First values",
      "errorChooseAttribute": "Choose an attribute for this style mode.",
      "errorAttributesUnavailable": "Could not load this layer's attribute values.",
      "errorProportionalSizeField": "Size field must be numeric with more than one distinct value.",
      "errorGraduatedStops": "Graduated style requires at least two numeric stops.",
      "errorCategorizedStops": "Categorized style requires at least one category.",
      "invertedFill": "Inverted fill",
      "invertedFillHint": "Fill outside features"
    },
    "suggestions": {
      "title": "Style suggestions",
      "dismiss": "Dismiss suggestions",
      "categorize": "Categorize by {{field}}",
      "graduate": "Graduate by {{field}}",
      "heatmap": "Heatmap"
    },
    "selectLayerHint": "Select a layer to edit its style.",
    "layerOrderDefault": "Layer order (default)",
    "increaseValue": "Increase {{label}}",
    "decreaseValue": "Decrease {{label}}",
    "visualization": "Visualization",
    "mode2d": "2D",
    "mode3dExtrusion": "3D extrusion",
    "noControls": "Style controls are not available for this layer type yet.",
    "selectedLayerType": "Selected layer type: {{type}}",
    "footerDeck": "Changes apply live to DuckDB deck.gl layer styling.",
    "footerMaplibre": "Changes apply live to MapLibre paint properties.",
    "pluginPaintedFooter": "This layer is drawn by its plugin, which provides its own styling controls.",
    "extrusion": {
      "color": "Extrusion color",
      "opacity": "Extrusion opacity",
      "advanced": "Advanced height expression",
      "heightExpression": "Height expression",
      "heightProperty": "Height property",
      "heightScale": "Height scale",
      "base": "Base height",
      "apply": "Apply 3D extrusion",
      "footer": "3D extrusion settings apply when saved."
    },
    "expressionLabels": {
      "style": "Style expression",
      "color": "Color expression",
      "height": "Height expression"
    },
    "expressionErrors": {
      "notArray": "{{label}} must be a JSON array expression.",
      "notOperator": "{{label}} must start with an operator, e.g. [\"==\", [\"get\", \"field\"], value].",
      "notJson": "{{label}} is not valid JSON: {{message}}"
    },
    "expressionBuilder": {
      "title": "Expression Builder",
      "openBuilder": "Open expression builder",
      "openBuilderForRule": "Open expression builder for rule {{index}}",
      "expressionLabel": "Expression",
      "clear": "Clear expression",
      "valid": "Valid expression.",
      "apply": "Apply",
      "preview": "Preview",
      "previewEmpty": "Enter an expression to see a live preview.",
      "previewNoFeatures": "No features to preview against.",
      "sampleFeature": "Feature {{index}} of {{count}}",
      "previousFeature": "Previous feature",
      "nextFeature": "Next feature",
      "filterMatches": "Matches this feature",
      "filterNoMatch": "Does not match this feature",
      "fields": "Fields",
      "noFields": "This layer has no attribute fields.",
      "insertField": "Insert field {{name}}",
      "functionsHeading": "Functions",
      "functionSearch": "Search functions",
      "noFunctionMatches": "No functions match the search.",
      "variables": "Variables",
      "variablesHint": "Variables are replaced with their current values when the expression is applied.",
      "categories": {
        "data": "Data & lookup",
        "decision": "Conditionals & comparison",
        "math": "Math",
        "string": "Strings",
        "conversion": "Type conversion",
        "camera": "Zoom & color"
      },
      "functions": {
        "get": "Returns the value of the named feature attribute.",
        "has": "True when the feature has the named attribute.",
        "id": "Returns the feature's id.",
        "properties": "Returns the feature's full attribute object.",
        "geometryType": "Returns the feature's geometry type (Point, LineString, Polygon, ...).",
        "at": "Returns the array element at the given index.",
        "in": "True when the first value is contained in the second (string or array).",
        "indexOf": "Returns the position of the first value in the second, or -1.",
        "length": "Returns the length of a string or array.",
        "literal": "Embeds a literal array or object in the expression.",
        "typeofOp": "Returns the type name of the value.",
        "caseOp": "Returns the first output whose condition is true, else the fallback.",
        "match": "Compares an input against listed values and returns the matching output.",
        "coalesce": "Returns the first non-null value.",
        "eq": "True when both values are equal.",
        "neq": "True when the values differ.",
        "gt": "True when the first value is greater than the second.",
        "gte": "True when the first value is greater than or equal to the second.",
        "lt": "True when the first value is less than the second.",
        "lte": "True when the first value is less than or equal to the second.",
        "all": "True when every condition is true.",
        "any": "True when at least one condition is true.",
        "not": "Negates a boolean.",
        "add": "Adds numbers.",
        "subtract": "Subtracts the second number from the first.",
        "multiply": "Multiplies numbers.",
        "divide": "Divides the first number by the second.",
        "modulo": "Returns the remainder of a division.",
        "power": "Raises the first number to the power of the second.",
        "abs": "Returns the absolute value.",
        "ceil": "Rounds up to the nearest integer.",
        "floor": "Rounds down to the nearest integer.",
        "round": "Rounds to the nearest integer.",
        "sqrt": "Returns the square root.",
        "ln": "Returns the natural logarithm.",
        "log10": "Returns the base-10 logarithm.",
        "min": "Returns the smallest of the values.",
        "max": "Returns the largest of the values.",
        "concat": "Joins values into one string.",
        "upcase": "Converts a string to upper case.",
        "downcase": "Converts a string to lower case.",
        "slice": "Returns a section of a string or array.",
        "toNumber": "Converts a value to a number.",
        "toString": "Converts a value to a string.",
        "toBoolean": "Converts a value to true or false.",
        "toColor": "Converts a value to a color.",
        "zoom": "The current map zoom level (evaluated live by the map).",
        "interpolate": "Blends smoothly between outputs as the input changes.",
        "step": "Returns stepped outputs at the given input thresholds.",
        "rgb": "Builds a color from red, green, and blue (0-255).",
        "rgba": "Builds a color from red, green, blue, and alpha."
      }
    },
    "decorations": {
      "heading": "Line decoration",
      "typeNone": "None",
      "typeArrow": "Arrows",
      "typeTriangle": "Triangles",
      "typeCircle": "Circles",
      "typeSquare": "Squares",
      "color": "Decoration color",
      "size": "Symbol size (px)",
      "spacing": "Spacing (px)"
    },
    "generator": {
      "heading": "Geometry generator",
      "type": "Derived geometry",
      "typeNone": "None",
      "typeCentroid": "Centroids",
      "typeBoundingBox": "Bounding boxes",
      "typeConvexHull": "Convex hulls",
      "typeBuffer": "Buffers",
      "bufferDistance": "Buffer distance (m)",
      "fillColor": "Fill color",
      "strokeColor": "Outline color",
      "strokeWidth": "Outline width (px)",
      "opacity": "Fill opacity",
      "circleRadius": "Point radius (px)"
    },
    "attributeForm": {
      "heading": "Attributes Form",
      "empty": "No fields configured. Assign an edit widget, constraint, or visibility rule to a field.",
      "configureField": "Configure field",
      "field": "Field",
      "selectField": "Select field…",
      "widgetLabel": "Edit widget",
      "widget": {
        "text": "Text",
        "number": "Number",
        "range": "Range",
        "checkbox": "Checkbox",
        "date": "Date",
        "valueMap": "Value map"
      },
      "alias": "Alias",
      "required": "Required",
      "requiredTag": "required",
      "constraintTag": "constraint",
      "visibilityTag": "visibility",
      "valueMap": "Value map entries",
      "valueMapPlaceholder": "residential=Residential\ncommercial=Commercial",
      "valueMapHint": "One entry per line: value or value=Label.",
      "min": "Min",
      "max": "Max",
      "step": "Step",
      "constraintExpression": "Constraint expression",
      "constraintPlaceholder": "[\">\", [\"get\", \"population\"], 0]",
      "constraintDescription": "Constraint description",
      "constraintDescriptionPlaceholder": "Shown when the constraint fails",
      "visibilityExpression": "Visibility expression",
      "visibilityPlaceholder": "[\"==\", [\"get\", \"type\"], \"school\"]",
      "invalidExpression": "Invalid expression",
      "openBuilder": "Open expression builder",
      "edit": "Edit field configuration",
      "remove": "Remove field configuration",
      "cancel": "Cancel",
      "save": "Save",
      "noFields": "The layer has no attribute fields to configure.",
      "minMaxInvalid": "Min must be less than or equal to Max."
    }
  },
  "vectorExport": {
    "invalidKmlCoordinatesByPosition": "KML export could not write feature {{position}} because it has invalid coordinates.",
    "invalidKmlCoordinatesById": "KML export could not write feature ID {{id}} because it has invalid coordinates."
  },
  "layers": {
    "panelCollapsedLabel": "Layers (collapsed)",
    "expand": "Expand layers",
    "collapse": "Collapse layers",
    "resizePanel": "Resize Layers panel",
    "dragToReorder": "Drag to reorder",
    "saveGeometryEdits": "Save geometry edits",
    "discardGeometryEdits": "Discard geometry edits",
    "moveUp": "Move up",
    "moveDown": "Move down",
    "zoomToLayer": "Zoom to layer",
    "layerActions": "Layer actions",
    "metadata": "Metadata",
    "removeLayer": "Remove layer",
    "identifyFeatures": "Identify features",
    "identifyDeactivate": "Deactivate identify",
    "identifyInspectPixels": "Inspect pixel values",
    "identifyStopInspectPixels": "Stop inspecting pixel values",
    "identifyUnavailable": "Identify is only available for vector, WMS, and COG layers",
    "exportGeoTiff": "GeoTIFF (COG)",
    "extractSubset": "Extract subset…",
    "stylesMenu": "Styles",
    "exportMapboxStyle": "Export as Mapbox GL style",
    "exportSldStyle": "Export as OGC SLD",
    "exportQmlStyle": "Export as QGIS QML",
    "exportStyleSuccess": "Style exported.",
    "exportStyleDataNotReady": "Layer data is not ready yet. Try again in a moment.",
    "exportStyleNeedsFeatures": "Style export requires a vector layer with features.",
    "exportStyleError": "Could not export this layer's style.",
    "importStyle": "Import style (Mapbox GL / SLD / QML)…",
    "openStyleManager": "Saved styles (Style Manager)…",
    "importStyleSuccess": "Style imported.",
    "importStyleInvalid": "That file is not valid JSON, SLD, or QML.",
    "importStyleNoMatch": "No symbology could be read from that style.",
    "importStyleError": "Could not import this style.",
    "copyStyle": "Copy style",
    "pasteStyle": "Paste style",
    "pasteStyleFrom": "Paste style from \"{{name}}\"",
    "pasteStyleEmpty": "Copy a layer's style first",
    "pasteStyleMismatch": "The copied style is for a different layer type",
    "styleCopied": "Copied style from \"{{name}}\".",
    "stylePasted": "Pasted style from \"{{name}}\".",
    "saveToLibrary": "Save to My Data",
    "savedToLibrary": "Saved “{{name}}” to My Data.",
    "saveToLibraryNoSource": "This layer has no re-addable source, so it cannot be saved to My Data.",
    "saveToLibraryTooLarge": "This layer's features are its only copy and are too large to save to My Data.",
    "saveToLibraryConfigTooLarge": "This layer's saved configuration is too large for My Data.",
    "bindToTimeSlider": "Bind to Time Slider…",
    "bindTimeDimensionToTimeSlider": "Bind time dimension to Time Slider",
    "bindNoTimeDimension": "This layer has no readable time dimension.",
    "unbindFromTimeSlider": "Unbind from Time Slider",
    "bindDialogDescription": "Filter this layer's features by a date or timestamp property as you scrub the timeline. The layer keeps its styling and opacity.",
    "bindScanning": "Scanning features for date and timestamp properties…",
    "bindNoProperty": "No date or timestamp property was found in this layer.",
    "bindNoTimestamps": "The selected property has no readable timestamps. Pick a different property.",
    "bindTileNoFeatures": "No tiles are loaded for this layer yet. Zoom to the layer, then try again.",
    "bindRange": "Time range",
    "bindRangeEnd": "Time range end",
    "bindRangeHint": "Taken from the tiles loaded so far, so it may be narrower than the full dataset. Enter a year (1958) or a date (1958-03-01).",
    "bindRangeInvalid": "Enter both bounds as a year (1958) or a date (1958-03-01).",
    "bindProperty": "Time property",
    "bindWindow": "Show features",
    "bindWindowStep": "In the current step",
    "bindWindowWide": "Within one step before and after",
    "bindWindowWider": "Within three steps before and after",
    "bindWindowCumulative": "Everything up to the current step (cumulative)",
    "bindCancel": "Cancel",
    "bindConfirm": "Bind",
    "openStylePanel": "Open Style panel",
    "openRasterStylePanel": "Edit raster style…",
    "exportRasterSuccess": "Raster exported.",
    "exportRasterError": "Could not export this raster.",
    "saveEditsToSource": "Save edits to source file",
    "saveEditsSuccess": "Saved {{count}} feature(s) to the source file.",
    "saveEditsNoFeatures": "This layer has no features to save.",
    "saveEditsError": "Could not save edits to the source file.",
    "saveEditsToPostgis": "Save edits to PostGIS table",
    "saveEditsPostgisSuccess": "Saved to {{table}}: {{inserted}} inserted, {{updated}} updated, {{deleted}} deleted.",
    "saveEditsPostgisSkippedFields": "Fields without a matching table column were not saved: {{fields}}.",
    "saveEditsPostgisRefreshWarning": "Edits were saved to the table, but refreshing the layer failed. Reload the layer before saving again, or new features may be inserted twice.",
    "saveEditsPostgisNoConnection": "No PostgreSQL connection is available for this layer. Reconnect in Add Data > PostgreSQL, then try again.",
    "typeBasemap": "basemap",
    "searchPlaces": "Search places",
    "searchPlacesPlaceholder": "Search places, lat, lon, or H3 cell...",
    "searchPlacesSearching": "Searching...",
    "searchPlacesNoResults": "No places found",
    "searchPlacesError": "Search failed. Try again.",
    "searchPlacesClear": "Clear search",
    "searchPlacesGoToCoordinate": "Go to {{coordinate}}",
    "searchPlacesGoToH3Cell": "Go to H3 cell {{cell}} (res {{resolution}})",
    "background": "Background",
    "backgroundCannotReorder": "Background cannot be reordered",
    "hideBackground": "Hide background",
    "showBackground": "Show background",
    "opacity": "Opacity",
    "opacityExactHint": "Double-click to enter an exact value",
    "opacityFor": "Opacity for {{name}}",
    "opacityValueInputAria": "{{label}} value",
    "opacityValueEditAria": "Edit {{label}} value",
    "basemapOpacity": "Basemap opacity",
    "newGroup": "New group",
    "basemaps": "Basemaps",
    "geoEditor": "GeoEditor",
    "collapseGroup": "Collapse group",
    "expandGroup": "Expand group",
    "hideGroup": "Hide group",
    "showGroup": "Show group",
    "renameGroup": "Rename group",
    "moveGroupUp": "Move group up",
    "moveGroupDown": "Move group down",
    "ungroupKeepLayers": "Ungroup (keep layers)",
    "deleteGroupAndLayers": "Delete group and layers",
    "groupActions": "Group actions",
    "addDataToGroup": "Add data to group",
    "groupOpacity": "Opacity",
    "groupOpacityAria": "{{name}} group opacity",
    "doubleClickToRename": "Double-click to rename",
    "doubleClickToChangeBasemap": "Double-click to change the basemap",
    "renameNamed": "Rename {{name}}",
    "newGroupFromLayer": "New group from layer",
    "newGroupFromSelectedLayers": "New group from selected layers",
    "moveToGroup": "Move to group",
    "moveSelectedToGroup": "Move selected layers to group",
    "removeFromGroup": "Remove from group",
    "hiddenByGroup": "Hidden because its group is not visible",
    "empty": "No data layers. Add data from the toolbar.",
    "emptyBeginner": "No layers yet. Add basemaps via Plugins → Basemaps, or your own data via the Add Data menu.",
    "hideAllLayers": "Hide all layers",
    "showAllLayers": "Show all layers",
    "dragNamedToReorder": "Drag {{name}} to reorder",
    "hideLayer": "Hide layer",
    "showLayer": "Show layer",
    "editingGeometry": "Editing geometry",
    "rename": "Rename",
    "materializeToEditable": "Materialize to editable layer",
    "finishEditingGeometry": "Finish editing geometry",
    "editGeometry": "Edit geometry",
    "openAttributeTable": "Open attribute table",
    "openRasterAttributeTable": "Open raster attribute table",
    "export": "Export",
    "refresh": "Refresh",
    "autoRefreshOn": "Auto refresh on",
    "lastSynced": "Last synced {{time}}",
    "syncErrorStatus": "Sync failed: {{message}}",
    "autoRefresh": "Auto refresh",
    "refreshWfsGeojsonOnly": "WFS and GeoJSON URLs only",
    "editSqlQuery": "Edit query in SQL Workspace",
    "reloadFromDisk": "Reload from disk",
    "watchFile": "Watch file for changes",
    "watchError": "Could not watch this file for changes.",
    "autoRefreshDialogTitle": "{{name}} Auto Refresh",
    "layerFallback": "Layer",
    "autoRefreshDialogDescription": "Reload this layer from its source on a fixed interval.",
    "interval": "Interval",
    "custom": "Custom",
    "customIntervalSeconds": "Custom interval (seconds)",
    "refreshFailurePolicy": "If refresh fails",
    "refreshFailureKeepLast": "Keep the last successful data",
    "refreshFailureClear": "Clear the layer",
    "apply": "Apply",
    "enterPositiveSeconds": "Enter a positive number of seconds.",
    "metadataDialogTitle": "{{name}} Metadata",
    "metadataDialogDescription": "Layer metadata and source information",
    "metadataRasterLoading": "Reading raster metadata…",
    "metadataRasterError": "Could not read this raster's metadata.",
    "resizeMetadataDialog": "Resize metadata dialog",
    "removeLayerConfirmTitle": "Remove layer?",
    "removeLayerConfirmBody": "This removes {{name}} from the project and map.",
    "thisLayerFallback": "this layer",
    "refreshingAuto": "Auto refreshing...",
    "refreshing": "Refreshing...",
    "refreshVectorControlError": "Could not refresh this layer. Try re-opening the Add Vector Layer panel.",
    "refreshed": "Refreshed.",
    "refreshedCount": "Refreshed {{count}} features.",
    "refreshError": "Could not refresh this layer.",
    "exportNeedsFeatures": "Export requires a vector layer with features.",
    "exportedWithWarnings": "Layer exported. {{warnings}}",
    "exported": "Layer exported.",
    "exportLayerError": "Could not export this layer.",
    "refreshIntervals": {
      "off": "Off",
      "s15": "15 seconds",
      "s30": "30 seconds",
      "m1": "1 minute",
      "m5": "5 minutes",
      "m15": "15 minutes"
    }
  },
  "timeSliderSymbology": {
    "bands": "Bands",
    "bandsPlaceholder": "auto",
    "bandsHint": "1-based band numbers, comma separated (e.g. 4,3,2). Leave empty for the renderer default.",
    "bandsInvalid": "Enter whole band numbers of 1 or more, separated by commas.",
    "colormapNone": "None (RGB / multi-band)"
  },
  "rasterSymbology": {
    "gamma": "Gamma",
    "min": "Min",
    "max": "Max",
    "value": "Value",
    "autoPlaceholder": "auto",
    "colorRampLabel": "Color ramp",
    "reverseRamp": "Reverse ramp",
    "customRamp": "Custom…",
    "customColors": "Custom colors",
    "customColorsValid": "{{count}} colors, low to high. Use Reverse to flip.",
    "customColorsHint": "Enter at least two hex codes, separated by commas or spaces.",
    "imagePalette": "Image palette",
    "createLegend": "Create legend from palette",
    "createLegendHint": "Adds a legend with one item per pixel value, using the raster's palette colors. Rename items to class names afterward.",
    "createLegendPending": "Reading palette…",
    "createLegendEmpty": "No palette colors found for this raster.",
    "createLegendError": "Could not read the raster palette.",
    "heading": "Raster symbology",
    "renderMode": "Render mode",
    "modeSingle": "Single band (pseudocolor)",
    "modeIndex": "Index (normalized difference)",
    "modeRgb": "RGB composite",
    "band": "Band",
    "stretch": "Stretch",
    "stretchLinear": "Linear",
    "stretchLog": "Logarithmic",
    "stretchSqrt": "Square root",
    "index": "Index",
    "classifyToggle": "Classify into discrete classes",
    "method": "Method",
    "methodEqualInterval": "Equal interval",
    "methodQuantile": "Quantile",
    "methodManual": "Manual breaks",
    "classes": "Classes",
    "classEdges": "Class edges",
    "noData": "No data",
    "nodataAuto": "Auto (from file)",
    "nodataOff": "Render all pixels",
    "nodataCustom": "Custom value"
  },
  "netcdfSymbology": {
    "heading": "NetCDF symbology",
    "colorRampLabel": "Colormap",
    "reverse": "Reverse colormap",
    "colorMin": "Color min",
    "colorMax": "Color max",
    "resetRange": "Reset to data range",
    "openCube": "3D cube"
  },
  "netcdfCube": {
    "heading": "3D image cube",
    "close": "Close",
    "settings": "Settings",
    "setupTitle": "3D image cube",
    "setupDescription": "Choose what to read before building the cube. Every band is a separate read, so the extent and band count decide how long it takes.",
    "extent": "Extent",
    "extentView": "Current map view",
    "extentDraw": "Draw on map",
    "extentFull": "Full layer extent",
    "viewHint": "Reads whatever the map is showing when the cube is built.",
    "fullHint": "Reads the whole grid. Slow for a scene-sized cube.",
    "drawBbox": "Draw on map",
    "drawing": "Drag a box on the map to set the cube's extent",
    "drawHint": "Drag a box on the map to set the extent.",
    "drawnExtent": "W {{west}}, S {{south}}, E {{east}}, N {{north}}",
    "detail": "Detail",
    "detailOption": "{{size}} cells per side",
    "bands": "Bands",
    "allBands": "All ({{count}})",
    "rgbOverlay": "RGB image on top",
    "rgbHint": "Composes three bands into a color image laid over the top face, so the cube is recognizable as a place.",
    "red": "Red",
    "green": "Green",
    "blue": "Blue",
    "planeEstimate": "{{count}} band reads",
    "create": "Create cube",
    "colorRampLabel": "Colormap",
    "reverse": "Reverse",
    "showRgb": "RGB top",
    "rgbBands": "RGB bands",
    "recomposing": "reading...",
    "zScale": "Height",
    "slice": "Slice",
    "sliceAt": "cut at {{band}} {{units}}",
    "reading": "Reading band {{done}} of {{total}}...",
    "summary": "{{nx}} x {{ny}} cells, {{nz}} bands along {{axis}}",
    "errorNoCube": "This layer's source file is no longer open, so a cube cannot be read.",
    "error": {
      "shapeMismatch": "The variable's band planes do not share one shape, so they cannot be stacked into a cube.",
      "rgbShapeMismatch": "The chosen RGB bands do not match the cube's shape.",
      "noBands": "This variable has no bands to read.",
      "noReadWindow": "This cube cannot be updated in place. Rebuild it from Settings."
    }
  },
  "netcdfProfile": {
    "heading": "Spectral profile",
    "clear": "Clear",
    "chartAria": "Sampled pixel values along the band axis",
    "popOut": "Pop out",
    "dock": "Dock",
    "poppedOutHint": "The chart is open in a window on the map.",
    "noValues": "No values to chart for these pixels.",
    "exportPng": "PNG",
    "exportCsv": "CSV",
    "exportError": "Could not export the chart."
  },
  "netcdfIdentify": {
    "noData": "no data",
    "coordinates": "lon, lat",
    "cell": "row, col"
  },
  "rasterAttributeTable": {
    "title": "Raster attribute table",
    "resize": "Resize raster attribute table",
    "noRasterSelected": "Select a raster layer to view its attribute table.",
    "computing": "Reading raster classes…",
    "empty": "No classes yet. Use Recompute to build the table.",
    "band": "Band",
    "bandOption": "Band {{band}}",
    "close": "Close raster attribute table",
    "noSource": "This raster has no readable source file.",
    "readError": "Could not read the raster's data.",
    "bandMissing": "Band {{band}} was not found in this raster.",
    "notCategorical": "This band has too many distinct values to be categorical.",
    "tooManyClasses": "Applying symbology supports up to {{max}} classes.",
    "symbologyApplied": "Symbology applied from the table.",
    "noPalette": "This raster has no embedded palette.",
    "legendError": "Could not open the legend.",
    "csvError": "Could not export the CSV file.",
    "recomputeTitle": "Scan the raster and rebuild the class table",
    "applyTitle": "Color the raster by the table's classes",
    "paletteTitle": "Reset colors from the raster's embedded palette",
    "legendTitle": "Fill the on-map legend with the table's classes",
    "csvTitle": "Export the table to CSV",
    "buttons": {
      "recompute": "Recompute",
      "apply": "Apply symbology",
      "palette": "From palette",
      "legend": "To legend",
      "csv": "CSV"
    },
    "columns": {
      "value": "Value",
      "count": "Count",
      "percent": "%",
      "area_m2": "Area (m²)",
      "area_ha": "Area (ha)",
      "area_km2": "Area (km²)",
      "color": "Color",
      "label": "Label"
    },
    "rowColor": "Color for value {{value}}",
    "rowLabel": "Label for value {{value}}"
  },
  "raster": {
    "filePickerLabel": "Rasters",
    "cogConvertConfirm": "\"{{name}}\" is a plain (striped) GeoTIFF, which cannot be displayed directly. Convert it to a Cloud-Optimized GeoTIFF now and load that?",
    "cogConvertRemoteConfirm": "\"{{name}}\" is a plain (striped) GeoTIFF, which cannot be displayed directly. Displaying it means downloading the full file and converting it to a Cloud-Optimized GeoTIFF in the browser, which can be slow and memory-intensive for large files. Proceed?",
    "cogConvertLargeConfirm": "\"{{name}}\" is a large {{width}}×{{height}} GeoTIFF that is not a Cloud-Optimized GeoTIFF. Converting it in the browser may be slow and memory-intensive. Convert and load it anyway?",
    "cogConvertFailed": "Could not convert \"{{name}}\" to a Cloud-Optimized GeoTIFF. Try converting it with gdal_translate or rio cogeo, then load the result.",
    "rasterDownloadFailed": "Could not download \"{{name}}\". The server may be slow, unreachable, or blocking cross-origin requests, or the file may be too large to hold in memory. Check the URL and try again.",
    "rasterNotGeotiff": "\"{{name}}\" did not return a GeoTIFF. The server may have sent an error or login page instead. Check the URL and try again."
  },
  "attributeForm": {
    "error": {
      "required": "A value is required",
      "number": "Must be a number",
      "range": "Must be between {{min}} and {{max}}",
      "rangeMin": "Must be at least {{min}}",
      "rangeMax": "Must be at most {{max}}",
      "valueMap": "Value is not in the allowed list",
      "constraint": "Constraint not satisfied"
    }
  },
  "legendPanel": {
    "edit": "Edit legend",
    "done": "Done editing",
    "close": "Close legend",
    "empty": "No visible layers to list.",
    "renameTitle": "Legend title",
    "renameEntry": "Rename {{name}}",
    "renameItem": "Rename {{name}}",
    "moveUp": "Move up",
    "moveDown": "Move down",
    "hideEntry": "Hide from legend",
    "showEntry": "Show in legend",
    "hideItem": "Hide item",
    "showItem": "Show item",
    "customizeEntry": "Customize items",
    "resetEntry": "Reset to automatic",
    "removeSection": "Remove section",
    "addSection": "Add custom section",
    "newSectionTitle": "New section",
    "newItemLabel": "New item",
    "addItem": "Add item",
    "removeItem": "Remove item",
    "itemColor": "Item color",
    "position": "Position",
    "positions": {
      "top-left": "Top left",
      "top-right": "Top right",
      "bottom-left": "Bottom left",
      "bottom-right": "Bottom right"
    },
    "low": "Low",
    "high": "High",
    "addFromDictionary": "Add from dictionary",
    "dictionaryHint": "A JSON object of {\"label\": \"color\"} pairs, or one \"label: color\" per line.",
    "dictionaryAdd": "Add section",
    "cancel": "Cancel",
    "resize": "Resize legend",
    "collapseEntry": "Collapse section",
    "expandEntry": "Expand section",
    "collapsePanel": "Collapse legend",
    "expandPanel": "Expand legend",
    "exportJson": "Export as JSON"
  },
  "errorBoundary": {
    "title": "Something went wrong",
    "description": "GeoLibre hit an unexpected error and could not continue. Your work may be unsaved — try recovering before reloading.",
    "tryAgain": "Try again",
    "reload": "Reload app",
    "sectionFailed": "{{label}} failed to render. The rest of GeoLibre is still available."
  },
  "commandPalette": {
    "title": "Command palette",
    "searchAria": "Search commands",
    "searchPlaceholder": "Search commands…",
    "listAria": "Commands",
    "noMatches": "No matching commands"
  },
  "shortcuts": {
    "title": "Keyboard shortcuts",
    "description": "Press {{shortcut}} to search every action in the command palette.",
    "groupGeneral": "General",
    "groupMapNavigation": "Map navigation",
    "openCommandPalette": "Open command palette",
    "showKeyboardShortcuts": "Show keyboard shortcuts",
    "nav": {
      "zoomIn": "Zoom in",
      "zoomOut": "Zoom out",
      "pan": "Pan",
      "rotate": "Rotate",
      "tilt": "Tilt"
    }
  },
  "diagnostics": {
    "title": "Diagnostics",
    "description": "Recent network requests, MapLibre errors, console warnings, and runtime exceptions.",
    "countTotal_one": "{{count}} total",
    "countTotal_other": "{{count}} total",
    "countErrors_one": "{{count}} error",
    "countErrors_other": "{{count}} errors",
    "countWarnings_one": "{{count}} warning",
    "countWarnings_other": "{{count}} warnings",
    "countNetwork_one": "{{count}} network",
    "countNetwork_other": "{{count}} network",
    "countNetworkErrors_one": "{{count}} network error",
    "countNetworkErrors_other": "{{count}} network errors",
    "logAllRequests": "Log all network requests",
    "logAllRequestsHint": "Record successful and aborted network requests from now on; requests made while logging was off are not backfilled. Off by default because logging every request slows the app down.",
    "copyJson": "Copy JSON",
    "copied": "Copied",
    "clear": "Clear",
    "emptyAll": "No diagnostics captured.",
    "emptyError": "No error diagnostics captured.",
    "emptyWarning": "No warning diagnostics captured.",
    "emptyInfo": "No info diagnostics captured.",
    "emptyNetwork": "No network diagnostics captured.",
    "emptyNetworkError": "No network error diagnostics captured."
  },
  "shell": {
    "workspaceTitle": "GeoLibre map workspace",
    "section": {
      "toolbar": "Toolbar",
      "sharedLeftSidebar": "Shared left sidebar",
      "pluginPanelLeftOfLayers": "Plugin panel (left of Layers)",
      "layerPanel": "Layer panel",
      "pluginPanelRightOfLayers": "Plugin panel (right of Layers)",
      "map": "Map",
      "pluginFloatingPanels": "Plugin floating panels",
      "selectionPanels": "Selection panels",
      "sunSimulationPanel": "Sun simulation panel",
      "routeAnimationPanel": "Route animation panel",
      "flightSimulatorPanel": "Flight simulator panel",
      "sharedRightSidebar": "Shared right sidebar",
      "pluginPanelLeftOfStyle": "Plugin panel (left of Style)",
      "stylePanel": "Style panel",
      "pluginPanelRightOfStyle": "Plugin panel (right of Style)",
      "notebook": "Notebook",
      "attributeTable": "Attribute table",
      "rasterAttributeTable": "Raster attribute table",
      "dashboard": "Dashboard",
      "pythonConsole": "Python console",
      "sqlWorkspace": "SQL workspace",
      "assistant": "Assistant",
      "statusBar": "Status bar"
    }
  },
  "attributeStats": {
    "title": "Field statistics",
    "description": "Summary statistics for a field in \"{{layer}}\".",
    "noFields": "This layer has no fields to summarize.",
    "field": "Field",
    "scope": "Scope",
    "scopeAll": "All features ({{total}})",
    "scopeFiltered": "Filtered ({{total}})",
    "copiedToClipboard": "Copied to clipboard.",
    "copy": "Copy",
    "copyHeader": "Field statistics — {{field}}",
    "copyHeaderFiltered": "Field statistics — {{field}} (filtered)",
    "noValues": "No values to summarize.",
    "mostFrequent": "Most frequent values",
    "noPopulated": "No populated values.",
    "stat": {
      "count": "Count",
      "nulls": "Nulls",
      "nonNumeric": "Non-numeric",
      "unique": "Unique",
      "min": "Min",
      "max": "Max",
      "mean": "Mean",
      "median": "Median",
      "std": "Std dev",
      "sum": "Sum"
    }
  },
  "columnExplorer": {
    "title": "Column explorer",
    "description": "Type, completeness, and distribution of every field in \"{{layer}}\".",
    "noFields": "This layer has no fields to explore.",
    "findField": "Find field",
    "findFieldPlaceholder": "Filter fields by name...",
    "scope": "Scope",
    "scopeAll": "All features ({{total}})",
    "scopeFiltered": "Filtered ({{total}})",
    "fieldsShown": "{{shown}} of {{total}} fields",
    "noMatches": "No fields match \"{{search}}\".",
    "typeNumeric": "Numeric",
    "typeText": "Text",
    "completenessTitle": "{{populated}} populated, {{nulls}} null",
    "populated": "{{total}} populated",
    "null": "{{total}} null",
    "unique": "{{total}} unique",
    "min": "Min",
    "mean": "Mean",
    "max": "Max",
    "noNumericValues": "No numeric values to plot.",
    "distributionAria": "Distribution of {{field}}: {{total}} values from {{min}} to {{max}}",
    "noPopulated": "No populated values.",
    "moreValues": "+{{total}} more values"
  },
  "comments": {
    "title": "Comments",
    "addDialogTitle": "Add Review Comment",
    "addDialogDescription": "Post an anchored note on this project for team review or offline reference.",
    "authorNameLabel": "Your Name (Asked once, saved automatically)",
    "authorNamePlaceholder": "e.g. Alex or Sarah",
    "commentLabel": "Comment / Feedback",
    "commentPlaceholder": "Type your review note or feedback here...",
    "post": "Post Comment",
    "postShortcutTooltip": "Post Comment ({{shortcut}})",
    "confirmDelete": "Are you sure you want to delete this comment thread?",
    "sessionDisconnected": "Session disconnected.",
    "defaultAuthorName": "Author"
  }
}
