diff --git a/CHANGELOG.md b/CHANGELOG.md index 1444e05d69..9cf30f9b7d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -199,7 +199,7 @@ # [16.0.0-rc.1](https://github.com/infra-geo-ouverte/igo2-lib/compare/16.0.0-rc.0...16.0.0-rc.1) (2023-09-22) -### Bug Fixes +### Reverts * **InteractiveTour:** add Placement types from [@floating-ui](https://github.com/floating-ui) ([#1407](https://github.com/infra-geo-ouverte/igo2-lib/issues/1407)) ([44b3d4a](https://github.com/infra-geo-ouverte/igo2-lib/commit/44b3d4ac88a23a83bc4704dde03a563230b90c53)) * **InteractiveTour:** options migration from popperJS to floatingUI ([#1399](https://github.com/infra-geo-ouverte/igo2-lib/issues/1399)) ([fbc4ff7](https://github.com/infra-geo-ouverte/igo2-lib/commit/fbc4ff7a26f501c8d42e28760440d4b45b99cbc6)) diff --git a/demo/src/locale/libs_locale/en.json b/demo/src/locale/libs_locale/en.json new file mode 100644 index 0000000000..93bb73f6e8 --- /dev/null +++ b/demo/src/locale/libs_locale/en.json @@ -0,0 +1,1207 @@ +{ + "igo": { + "auth": { + "accessAnonymous": "Access as anonymous", + "connection": "Connection", + "login": "Login", + "password": "Password", + "signOut": "Sign out", + "user": "User", + "welcome": "Welcome {{name}}!", + "deconnection": "You are logged out.", + "home": "Return to the home page", + "error": { + "Password expired": "Password expired", + "Maximun logins exceeded": "Maximum logins exceeded", + "Login lockout": "Maximum number of attempts exceeded. Your account is locked.", + "Wrong password": "Wrong password", + "Invalid username": "Invalid username" + }, + "microsoft": { + "login": "Sign in with Azure account" + }, + "microsoftb2c": { + "login": "Sign in" + } + }, + "common": { + "confirmDialog": { + "cancelBtn": "Cancel", + "confirmBtn": "Confirm", + "title": "Confirm" + }, + "table": { + "filter": "Filter" + }, + "entity-table": { + "targetHtmlUrl": "Open the external link" + }, + "form": { + "errors": { + "required": "This field is required" + } + }, + "actionbar": { + "scrollUp": "Scroll up", + "scrollDown": "Scroll down", + "icon": "Action list" + }, + "interactiveTour": { + "tooltipTourToolButton": "Interactive tour of the application", + "disaledTooltipTourToolButton": "To have access to this tool's tour, add contexts or layers", + "buttonTitle": "Discover", + "exitButton": "Exit", + "backButton": "Back", + "nextButton": "Next" + }, + "paginator": { + "firstPageLabel": "First page", + "itemsPerPageLabel": "Items per page:", + "lastPageLabel": "Last page", + "nextPageLabel": "Next page", + "previousPageLabel": "Previous page", + "of": "of" + } + }, + "context": { + "bookmarkButton": { + "create": "Create a new context", + "dialog": { + "createMsg": "The context '{{value}}' was created", + "createTitle": "Context created", + "placeholder": "Title", + "title": "New context" + } + }, + "contextManager": { + "clone": "Clone this context", + "delete": "Delete this context", + "dialog": { + "cloneMsg": "The context '{{value}}' was cloned", + "cloneTitle": "Context cloned", + "copyMsg": "Text copied", + "copyTitle": "Context ID", + "confirmDelete": "Are you sure you want to delete this context?", + "deleteMsg": "The context '{{value}}' was deleted", + "deleteTitle": "Context deleted", + "favoriteMsg": "The context '{{value}}' was set as favorite", + "favoriteTitle": "Favorite saved", + "saveMsg": "The context '{{value}}' was saved", + "saveTitle": "Context saved" + }, + "edit": "Edit this context", + "errors": { + "uncaught": { + "message": "Sorry, service is currently not available. Please try again later", + "title": "Error server" + }, + "addPermission": "The permission you are trying to add is already in the context.", + "addPermissionEmpty": "The permission you are trying to add is not valid", + "addPermissionTitle": "Add permission error" + }, + "favorite": "Set as favorite context", + "form": { + "copy": "Copy the context ID", + "edit": "Save", + "title": "Title", + "titleRequired": "Title required", + "uri": "ID", + "uriRequired": "ID required" + }, + "invalid": { + "text": "Context '{{value}}' is invalid. The default context was loaded.", + "title": "Invalid context" + }, + "managePermissions": "Manage permissions context", + "manageTools": "Manage tools context", + "ourContexts": "Our contexts", + "publicContexts": "Public contexts", + "save": "Save this context", + "sharedContexts": "Shared contexts", + "filterPlaceHolder": "Filter by name", + "sortAlphabetically": "Sort alphabetically", + "sortContextOrder": "Replace according to the creation date", + "userAccount": "User account", + "filterUser": "Filter by user group", + "emptyContext": "Empty context", + "emptyContextTooltip": "Create a new empty context", + "contextMap": "Context from map", + "contextMapTooltip": "Create a new context from map layers", + "hide": "Hide this context", + "show": "Show up this context", + "showHidden": "Show hidden contexts" + }, + "contextImportExport": { + "export": { + "exportPlaceHolder": "Layers", + "exportContextName": "Context name", + "exportSelectAll": "Select all", + "success": { + "text": "Context has been exported.", + "title": "Context export success" + }, + "nothing": { + "text": "No context could be exported.", + "title": "Nothing to export" + }, + "failed": { + "text": "Failed to export", + "title": "Failed to export context" + } + }, + "import": { + "success": { + "title": "Imported context", + "text": "The context '{{value}}' was added to the map" + }, + "empty": { + "text": "The context '{{value}}' contained nothing that could be imported.", + "title": "Nothing to import" + }, + "invalid": { + "text": "The context '{{value}}' is invalid.", + "title": "Invalid context" + }, + "unreadable": { + "title": "Unreadable context", + "text": "The context '{{value}}' is unreadable" + }, + "tooLarge": { + "text": "The context '{{value}}' is too large (Max: {{size}} MB)", + "title": "Context too large" + } + } + }, + "permission": { + "addBtn": "Add", + "delete": "Remove permission", + "dialog": { + "addMsg": "The permission '{{value}}' was added", + "addTitle": "Permission added", + "deleteMsg": "The permission '{{value}}' was removed", + "deleteTitle": "Permission removed", + "scopeChangedMsg": "The scope was changed to {{value}}", + "scopeChangedTitle": "Scope changed" + }, + "profil": "Profil", + "user": "User or group", + "profilRequired": "Profil required", + "read": "Read only", + "readOnlyTitle": "Read-only context", + "readOnlyMsg": "You can only revoke permission if the context is shared directly to your username.", + "scope": { + "private": "Private", + "protected": "Protected", + "shared": "Shared", + "public": "Public" + }, + "write": "Read and Write" + }, + "poiButton": { + "create": "Create a new zone of interest", + "dialog": { + "confirmDelete": "Are you sure you want to delete this zone of interest?", + "createMsg": "The zone of interest '{{value}}' was created", + "createTitle": "Zone of interest created", + "deleteMsg": "The zone of interest '{{value}}' was deleted", + "deleteTitle": "Zone of interest deleted", + "placeholder": "Title", + "title": "New zone of interest" + }, + "placeholder": "Zones of interest" + }, + "sidenav": { + "goBack": "Go Back", + "mainMenu": "Main Menu" + }, + "shareMap": { + "button": "Share map", + "refreshBtn": "Refresh sharing", + "copy": "Copy to clipboard", + "shareWithApi": "Share by context", + "shareWithUrl": "Share by url", + "dialog": { + "copyMsg": "Link copied to clipboard", + "copyTitle": "Link" + }, + "htmlClarifications": "", + "errorTitle": "Share Map error", + "placeholderLink": "Link", + "included": "Included in shared URL :", + "context": "The context when creating the sharing link.", + "center": "The coordinates of the center of the map (longitude, latitude).", + "zoom": "The zoom level of the map.", + "addedLayers": "The layers added by the catalog or by the search bar.", + "visibleInvisible": "Visibility status of layers.", + "excluded": "Excluded in the shared URL :", + "order": "The order of the layers.", + "opacity": "Modifications made to the opacity of the layers.", + "filterOgc": "Additions / modifications made to filters by attribute.", + "filterTime": "The current value for time filters." + }, + "tool": { + "dialog": { + "addMsg": "The tool '{{value}}' was added", + "addTitle": "Tool added", + "deleteMsg": "The tool '{{value}}' was removed", + "deleteTitle": "Tool removed" + } + }, + "userButton": { + "dialog": { + "email": "Email", + "expiration": "Expiration", + "user": "User", + "clearPreferences": "Clear my preferences" + }, + "infoTitle": "User info", + "logout": "Logout" + } + }, + "core": { + "message": { + "success": "Success", + "error": "Error", + "info": "Info", + "alert": "Alert" + }, + "errors": { + "uncaught": { + "message": "Sorry, service is currently not available. Please try again later", + "title": "Error server" + } + }, + "network": { + "online": { + "message": "Online", + "title": "Status:" + }, + "offline": { + "message": "Offline", + "title": "Status:" + } + } + }, + "geo": { + "catalog": { + "layer.addToMap": "Add to map", + "layer.addToMapOutRange": "Add to map. The layer is not visible at the current scale. Please zoom in/out", + "layer.removeFromMap": "Remove from map", + "layer.removeFromMapOutRange": "Remove from map. The layer is not visible at the current scale. Please zoom in/out", + "layer.removeFromMapNotVisible": "Remove from map. The layer is visible at the current scale but is not active. Toggle the map tool to adjust layer visibility.", + "group.addToMap": "Add all layers from this group to map", + "group.removeFromMap": "Remove all layers from this group to map", + "baseLayers": "Baselayers", + "unavailableTitle": "Catalog unavailable", + "unavailable": "The catalog '{{value}}' is unavailable at the moment or you don't have the required permissions.", + "someUnavailable": "Some of the layers from the current catalog are unavailable at the moment or you don't have the required permissions.", + "externalProvider": { + "catalog": "This catalog comes from an external organization.", + "group": "This layers comes from an external organization.", + "layer": "This layer comes from an external organization.", + "unavailableWithEmail": "The catalog '{{value}}' is unavailable at the moment. To add an external service to the predefined list, please contact us at {{emailAddress}}. Delays can apply if problems occurs with the provider." + }, + "library.add": "Add this catalog to the list", + "library.cancel": "Cancel", + "library.remove": "Remove this catalog from the list", + "library.inlist": { + "title": "Catalog already contained", + "message": "The catalog is already contained in the list." + }, + "library.addTitle": "Adding a catalog", + "library.addBtn": "Add a catalog" + }, + "clickOnMap": { + "clickedFeature": "Clicked Feature" + }, + "baselayersSwitcher": { + "title": "Basemaps" + }, + "dataSource": { + "unavailableTitle": "Layer unavailable", + "optionsApiUnavailable": "Layer information could not be retrieved. Some layers may not present the correct information.", + "unavailable": "The layer '{{value}}' is unavailable at the moment or you don't have the required permissions." + }, + "dropGeoFile": { + "invalid": { + "text": "The file '{{value}}' is invalid ({{mimeType}})", + "title": "Invalid file" + }, + "empty": { + "text": "The file '{{value}}' contained nothing that could be imported.", + "title": "Nothing to import" + }, + "success": { + "text": "The layer '{{value}}' was added to the map", + "title": "Imported file" + }, + "unreadable": { + "text": "The file '{{value}}' is unreadable", + "title": "Unreadable file" + }, + "tooLarge": { + "text": "The file '{{value}}' is too large (Max: {{size}} MB)", + "title": "File too large" + }, + "invalidSRS": { + "text": "The projection is valid. It must start with EPSG:", + "title": "Invalid projection" + }, + "ogreServer": { + "title": "Ogre server error 500", + "text": "Error in convert to geojson. Maybe file is too big, try to import that file in geojson format" + } + }, + "export": { + "customList": { + "text": "Some of the selected layers ( {{value}} ) limit the format's list", + "title": "Restricted list of formats" + }, + "nothing": { + "text": "No feature could be exported.", + "title": "Nothing to export" + }, + "noFormat": { + "text": "No export format valid for all selected layers. Please export the layers one at a time.", + "title": "No valid format" + }, + "failed": { + "text": "Failed to export", + "title": "Failed to export features" + }, + "popupBlocked": { + "text": "
Enable the popup in your browser.
For Chrome and Edge, on the right into the Address Bar.
{{extraMessage}}", + "selectAgain": "Fix it and re-select an output format.", + "retry": "Please retry to export", + "title": "Popup blocked by your browser" + }, + "success": { + "text": "Features have been exported.", + "title": "Features export success" + }, + "format": { + "GeoJSON": "GeoJSON", + "GML": "GML", + "GPX": "GPX", + "KML": "KML", + "Shapefile": "Shapefile", + "CSVcomma": "CSV (comma delimited)", + "CSVsemicolon": "CSV (Excel compatible)", + "URL": "External link" + }, + "gpx.error.poly": { + "title": "GPX error", + "text": "GPX format do now allow polygon features" + }, + "encoding": { + "LATIN1": "LATIN-1", + "UTF8": "UTF-8" + }, + "combinedLayers": "combinedLayers" + }, + "import": { + "promptStoreToIdb": "Do you want to save this layer to be used later in another session?" + }, + "importExportForm": { + "exportButton": "Export", + "exportButtonLink": "Open the link", + "exportButtonLinks": "Open the links", + "exportCombineResults": "Combine layers into one file", + "exportFormatPlaceholder": "Format", + "exportLayerPlaceholder": "Layer", + "exportFileNamePlaceholder": "Filename", + "exportSeparator": "Insert separator (empty row) between layers", + "encodingPlaceholder": "Encoding", + "exportTabTitle": "Export", + "exportFeatureInExtent": "Export only features in map extent", + "exportNoLayersExportable": "There is no exportable layer in your map", + "exportSelectedFeature": "Export only selected features", + "importButton": "Import", + "importProjPlaceholder": "Coordinate system of the file to import", + "importTabTitle": "Import", + "importClarifications": "Clarifications", + "importSizeMax": "The file size limit is {{size}} Mb", + "importFormatAuthorized": "Formats authorized: geojson, kml, gpx, gml, shapefile", + "importShpZip": "Shapefiles must be zipped AND geometries stored in Latitude Longitude coordinate (EPSG:4326/WGS:84)", + "importHtmlClarifications": "", + "exportHtmlClarifications": "", + "other": "other", + "others": "others", + "projections": { + "mtm": "MTM zone {{zone}} ({{code}})", + "utm": "UTM zone {{zone}} ({{code}})", + "webMercator": "Web Mercator ({{code}})", + "nad83": "Lat-Long NAD83 ({{code}})", + "wgs84": "Lat-Long WGS84 ({{code}})", + "choose": "You must choose a projection for your input file." + } + }, + "operators": { + "caseSensitive": "Case sensitive", + "And": "And", + "Or": "Or", + "PropertyIsEqualTo": "=", + "PropertyIsNotEqualTo": "!=", + "PropertyIsLike": "≈", + "PropertyIsGreaterThan": ">", + "PropertyIsGreaterThanOrEqualTo": ">=", + "PropertyIsLessThan": "<", + "PropertyIsLessThanOrEqualTo": "<=", + "PropertyIsBetween": "between", + "During": "during (temporal)", + "PropertyIsNull": "is null", + "Intersects": "intersects (spatial)", + "Within": "within (spatial)", + "Contains": "contains (spatial)", + "tooltip": { + "And": "Logical operator between filters where both conditions must be true", + "Or": "Logical operator between filters where at least one (1) condition must be true", + "PropertyIsEqualTo": "Identical (case sensitive)", + "PropertyIsNotEqualTo": "Different(case sensitive)", + "PropertyIsLike": "Like Example: *road* Finds any values that have 'road' in any position. road* Finds any values that begin by 'road'. wildCard ='*', singleChar = '.' escapeChar = '!' (case sensitive)", + "PropertyIsGreaterThan": "Greater than", + "PropertyIsGreaterThanOrEqualTo": "Greater than or equal to ", + "PropertyIsLessThan": "Lesser than", + "PropertyIsLessThanOrEqualTo": "Lesser than or equal to", + "PropertyIsBetween": "Apply a range check between the lower and upper boundary (values are included)", + "During": "Apply a range check for time attributes", + "PropertyIsNull": "Return features where the attribute is null", + "Intersects": "Return features in geometric intersection with the provided geometry", + "Within": "Return feature which are completely contained by the provided geometry", + "Contains": "Return feature completely containing by the provided geometry" + } + }, + "sourceFields": { + "selectField": "Choose a field" + }, + "filter": { + "resetFilters": "Reset default values", + "addFilter": "Add an empty filter to the current list", + "removeFilter": "Remove the current filter from the filters's list", + "toggleFilterState": "Enable/disable the current filter", + "refreshFilters": "Update this datasource with the active filter(s). To enable this button, the layer must be visible (or in the defined scale ranges) or you must modify the current filter.", + "layerFiltered": "This layer is currently filtered", + "layerFilterable": "This layer is filterable", + "filterBy": "Filter by", + "advancedOgcFilters": "Advanced filters", + "displayMoreResults": "Display more (+)", + "displayLessResults": "Display less (-)", + "placeholder": "Enter a value", + "placeholderSnrc": "Ex: 21L14", + "selectOperator": "Select an operator", + "sliderModeTitle": "Time slider", + "reportingDate": "Reporting date", + "noFilterableLayer": "No layer can be filtered in the current map" + }, + "spatialSelector": { + "fixedExtent": "Fixed extent", + "btnSetExtent": "Define the extent of the spatial filter to the current view", + "snrc": "SNRC", + "selectFeature": "", + "drawFeature": "" + }, + "layer": { + "hideLayer": "Hide Layer", + "lowerLayer": "Bring layer backward", + "hideSelectedLayers": "Hide selected layers", + "notInResolution": "Layer isn't visible at the active scale. Zoom in or out to display.", + "filterLowerLayer": "The backward movement is always done according to the order of the map!", + "filterPlaceholder": "Filter the layers list", + "activateSelectionMode": "Activate multiple selection mode", + "deactivateSelectionMode": "Deactivate multiple selection mode", + "tools": "Tools", + "selectAll": "Select all layers", + "deselectAll": "Deselect all layers", + "zoomLayer": "Zoom To Layer Extents", + "zoomLayers": "Zoom To Selected Layers Extents", + "opacity": "Opacity", + "raiseLayer": "Bring layer forward", + "filterRaiseLayer": "The forward movement is always done according to the order of the map!", + "moreOptions": "Layer's tools", + "removeLayer": "Remove this layer from the map", + "removeSelectedLayers": "Remove selected layers from the map", + "removeSelectedLayersRestriction": "Some selected layers cannot be removed", + "showFeaturesList": "Show features list", + "showLayer": "Show Layer", + "showSelectedLayers": "Show selected layers", + "subsetLayersListKeyword": "Subset the layers's list by title or type (wms, wfs,...)", + "deleteKeyword": "Delete the keyword", + "subsetLayersListOnlyVisible": "Subset the layers's list by visibility", + "subsetLayersListOnlyInRange": "Subset the layers's list by resolution range", + "sortAlphabetically": "Sort the layers's list alphabetically", + "sortMapOrder": "Sort the layers's list based on layer's order on the map", + "resetLayersList": "Remove the current applied filter to layers's list", + "trackFeature": "Track the feature", + "legend": { + "default": "Default", + "loadingLegendText": "Loading legend", + "noLegendText": "No legend available for this layer", + "noLegendScale": "No legend available for this scale", + "selectStyle": "Select the style of the legend", + "showAll": "Show all legends (non visible and out of range)", + "noLayersVisibleWithShowAllButton": "No layer currently visible. Activate the button above to see all the legends.", + "noLayersVisibleWithShowAllButtonButZoom": "No layer currently visible. If you zoom in the map, some layers will appear OR activate the button above to see all the legends.", + "noLayersVisible": "No layers currently visible.", + "noLayersVisibleButZoom": "No layers currently visible. However, if you zoom in the map, some layers will appear." + }, + "style": { + "styleModal": "Edit style", + "styleModalTooltip": "Edit the style of the selected entities " + }, + "saveBtn": "Save", + "cancelBtn": "Cancel", + "saveFeatureInLayer": "Save selection in layer", + "chooseOrSet": "Choose a layer or set a new layer name" + }, + "style": { + "styleModal": "Edit style", + "styleModalTooltipLayer": "Edit the style of the layer.", + "styleModalTooltipSelected": "Edit the style of the selected entities", + "colorPicker": "Click to open the color selector", + "cancel": "Cancel", + "fill": "Fill", + "stroke": "Stroke", + "fontSize": "Font size", + "fontStyle": "Font style", + "offsetX": "Horizontal offset", + "offsetY": "Vertical offset" + }, + "download": { + "action": "Download data", + "title": "Downloading file", + "start": "Started. Check the download progression in your browser", + "end": "Completed" + }, + "mapButtons": { + "baselayerSwitcher": "Change base layer", + "geolocate": "Show geolocation", + "geolocateInactive": "Hide geolocation", + "home-extent": "Go to the home map extent", + "offline": "Offline mode", + "online": "Online mode", + "zoomIn": "Zoom in ({{zoom}})", + "zoomOut": "Zoom out ({{zoom}})", + "resetRotation": "Azimuth: {{azimuth}}°N. Rotation: {{rotation}}°. Set map to north", + "tipRotation": "Hold Alt and SHIFT while dragging on map to rotate the map.", + "preventScreenLock": "Prevent the screen to enter in lock mode.", + "letScreenLock": "Allow the screen to enter in lock mode." + }, + "metadata": { + "show": "Show metadata" + }, + "printForm": { + "corsErrorMessageBody": "Unable to print due to non-owned access rights", + "corsErrorMessageHeader": "Print", + "comment": "Comment", + "doZipFile": "Zip file", + "outputFormat": "Output format", + "paperFormat": "Paper format", + "paperFormats": { + "A0": "33.1 X 46.8\" (A0)", + "A1": "23.4 X 33.1\" (A1)", + "A2": "16.5 X 23.5\" (A2)", + "A3": "11.7 X 16.5\" (A3)", + "A4": "8.3 X 11.7\" (A4)", + "A5": "5.8 X 8.3\" (A5)", + "Letter": "Letter", + "Legal": "Legal" + }, + "imageFormat": "Image format", + "orientation": "Orientation", + "landscape": "Landscape", + "portrait": "Portrait", + "projection": "Projection", + "resolution": "Resolution", + "saveBtn": "Save", + "scale": "Scale", + "showProjection": "Show projection", + "showScale": "Show scale", + "title": "Title", + "subtitle": "Subtitle", + "legendPosition": "Legend Position", + "legendPositions": { + "none": "No legend", + "topleft": "Top left corner of the map", + "topright": "Top right corner of the map", + "bottomleft": "Bottom left corner of the map", + "bottomright": "Bottom right corner of the map", + "newpage": "On a new page", + "newimage": "On a new image" + } + }, + "directionsForm": { + "stopLayer": "Directions - stops", + "routeLayer": "Directions - route", + "start": "Start", + "intermediate": "Intermediate", + "end": "End", + "directionsBtn": "Get route", + "resetDirectionsBtn": "Reset", + "zoomRoute": "Zoom on route", + "null": "", + "directions": "Directions", + "raiseStop": "Raise stop's priority", + "lowerStop": "Lower stop's priority", + "addStop": "Add a stop", + "clearStop": "Clear this stop", + "moveStop": "Move this stop", + "removeStop": "Remove this stop", + "drivingOptions": "Options", + "summary": "Direction's summary", + "stopsList": "Stops's list", + "instructions": "Instructions", + "copy": "Copy directions", + "geolocate": "Use current localisation as stop", + "link": "Link", + "dialog": { + "copyMsg": "Directions copied to clipboard", + "copyMsgLink": "Link for directions copied to clipboard", + "copyTitle": "Directions" + } + }, + "directions": { + "uturn": "u-turn", + "sharp right": "sharp right", + "right": "right", + "slight right": "slightly on right", + "sharp left": "sharp left", + "left": "left", + "slight left": "slightly on left", + "straight": "forward", + "turn": { + "straight": "Continue on {{route}}", + "uturn": "Make u-turn on {{route}}", + "else": "Turn {{translatedModifier}} onto {{route}}" + }, + "new name": "Head {{translatedDirection}} on {{route}}", + "depart": "Head {{translatedDirection}} on {{route}}", + "arrive": { + "lastStep": "You have reached your destination {{coma}} {{aggregatedDirection}}", + "intermediate": "You have reached the intermediate stop onto {{route}}" + }, + "merge": "Continue on {{route}}", + "on ramp": "Take the ramp {{aggregatedDirection}}", + "off ramp": "Take exit {{aggregatedDirection}}", + "fork": { + "left": "Merge left onto {{route}}", + "right": "Merge right onto {{route}}", + "else": "Continue on {{route}}" + }, + "end of road": "At the end of the road, turn {{translatedModifier}} onto {{route}}", + "use lane": "Take the lane ...", + "continue": { + "notUturn": "Continue on {{route}}" + }, + "roundabout": "At the roundabout, take the {{exit}}{{cntSuffix}} exit towards {{route}}", + "rotary": "Roundabout rotary ...", + "roundabout turn": "Roundabout, take the ...", + "exit roundabout": "Continue to {{route}}", + "notification": "notification ...", + "uturnText": "Make u-turn and head {{translatedDirection}} on {{route}}", + "unknown": "???", + "cntSuffix": { + "first": "st", + "secondAndMore": "rd" + }, + "modifier": { + "prefix": "on the " + } + }, + "cardinalPoints": { + "n": "north", + "ne": "northeast", + "e": "east", + "se": "southeast", + "s": "south", + "sw": "southwest", + "w": "west", + "nw": "northwest" + }, + "search": { + "placeholder": "Search for a localisation or a layer", + "emptyType.placeholder": "Please choose a search type", + "feature.title": "Localisation", + "feature.placeholder": "Search for a place localisation", + "layer.title": "Layer", + "layer.placeholder": "Search for a layer", + "ichercheReverse.name": "Search by coordinates", + "clearSearch": "Clear search", + "addToLayer": "Add to layer", + "ilayer": { + "name": "Layers", + "properties": { + "abstract": "Abstract", + "groupTitle": "Group", + "title": "Title", + "type": "Type", + "url": "URL", + "metadataUrl": "Metadata", + "name": "Layer name", + "urlInfo": "URL - WMS/WFS", + "downloadUrl": "Data download" + }, + "type": { + "layer": "Layer", + "groupLayer": "Group of layers" + } + }, + "nominatim": { + "type": { + "food": "Food", + "health": "Health", + "entertainment": "Entertainment", + "finance": "Finance" + }, + "country": { + "all": "The world", + "canada": "Canada" + } + }, + "workspace": { + "name": "Imported data (vector)", + "restrictExtent": { + "map": "Map extent", + "whole": "Whole dataset" + } + }, + "icherche": { + "name": "iCherche", + "type": { + "address": "Address", + "oldAddress": "Old address", + "district": "District", + "postalCode": "Postal Code", + "city": "City", + "oldCity": "Old city", + "mrc": "MRC", + "regadmin": "Administrative Region", + "road": "Road", + "intersection": "Intersection", + "place": "Place", + "exit": "Highway exit", + "cn": "CN mark", + "gcc": "Coast Guard mark (CCG)", + "sumi": "SUMI mark", + "km": "Mileage mark", + "hq": "Hydro-Quebec", + "entreprise": "Entreprise", + "cadastre": "Cadastre", + "restArea": "Rest area", + "cycleStop": "Cycle stop" + }, + "restrictExtent": { + "map": "Map extent", + "quebec": "Whole Quebec" + } + }, + "coordinates": { + "name": "Coordinates", + "coord": "Geographic (longitude, latitude)", + "reversedCoord": "Geographic (latitude, longitude)", + "coordDMS": "Geographic (longitude, latitude) (DMS)", + "reversedCoordDMS": "Geographic (latitude, longitude) (DMS)", + "radius": "Radius", + "conf": "Confidence" + }, + "menu.tooltip": "Search Options", + "settings": { + "title": "Settings" + }, + "pointerSearchSummary": { + "title": "Pointer position", + "tooltip": "Based on every search source, show the summary of the pointer location. Use F2 to activate/deactivate." + }, + "searchResultsGeometry": { + "title": "Show results geometries", + "tooltip": "Hide/ show the results geometries " + }, + "reverseCoordFormat": { + "title": "Display data in latitude/longitude", + "tooltipLonLat": "Display data in latitude/longitude", + "tooltipLatLon": "Display data in longitude/latitude" + }, + "searchSources": { + "selectAll": "Select All", + "unselectAll": "Unselect All", + "settings": { + "datasets": "Datasets", + "results type": "Results type", + "ecmax": "Maximum deviation", + "radius": "Search radius", + "results limit": "Number of results", + "multiple object": "Multiple object", + "restrictExtent": "Restrict the extent", + "selectAll": "Select All", + "unselectAll": "Unselect All", + "true": "Yes", + "false": "No" + } + }, + "displayMoreResults": "Display more results" + }, + "geometry": { + "geometry": "Geometry", + "point": "Point", + "line": "Line", + "polygon": "Polygon" + }, + "targetHtmlUrl": "Open the external link", + "targetHtmlUrlUnauthorizedTitle": "Unauthorized", + "targetHtmlUrlUnauthorized": "You do not have the credentials to open this external link.", + "searchByCoord": "Search by coordinates", + "searchByName": "Search by name", + "seeRouting": "See routing", + "timeFilter": { + "date": "Date", + "endDate": "End Date", + "startDate": "Start Date", + "hour": "Hour", + "minute": "Minute", + "endYear": "End Year", + "startYear": "Start Year" + }, + "spatialFilter": { + "spatialFilter": "Spatial filter", + "predefined": "Predefined Zone", + "draw": "Draw", + "polygon": "Polygon", + "point": "Circle", + "drawPolygon": "Draw a polygon", + "drawCircle": "Draw a circle", + "searchLabel": "Search by", + "buffer": "Buffer", + "search": "Search", + "drawControl": "Activate draw control", + "listLabel": "Zone", + "layer": "Layer", + "goSearch": "Launch research", + "removeLayer": "Remove results", + "exportLayer": "Export results", + "clearForm": "Remove draw", + "clearSearch": "Reset field", + "Address": "Addresses", + "Thematics": "Thematics", + "searchResults": "Search Results", + "showSearchResults": "Show search results", + "hideSearchResults": "Hide search results", + "type": "Type", + "radius": "Radius", + "radiusAlert": "Radius must be between 0 and 100 kilometers (or 100 000 meters)", + "bufferAlert": "Buffer must be between 0 and 100 kilometers (or 100 000 meters)", + "maxSizeAlert": "Search results number exceeds 10000. Some may be missing.", + "zeroResults": "There are no results for this search.", + "warning": "Warning", + "freehandControl": "Freehand", + "group": { + "toponyme": "Toponym", + "culturel": "Cultural", + "education": "Education", + "sante": "Health", + "securite": "Security", + "sepaq": "SEPAQ", + "transport": "Transportation" + } + }, + "terrapi": { + "AdmRegion": "Administratives region", + "Mun": "Municipalities", + "Arrond": "Boroughs", + "CircFed": "Federals districts", + "CircProv": "Provincials districts", + "DirReg": "Regionals directorates", + "MRC": "RCM", + "RegTour": "Touristics regions", + "limites": "Administrative boundaries", + "bornes": "Landmarks", + "hydro": "Hydrography", + "routes": "Roads", + "bati": "Buildings", + "batiment": "Buildings", + "camping": "Camping", + "equipement": "Equipment", + "commun": "Public", + "geographie": "Natural sites", + "parc": "Parks", + "secteur": "Sector", + "immeubles": "Tenement", + "sites": "Cultural sites", + "service-garde": "Child care", + "public": "Public schools", + "prive": "Private school", + "gouvernemental": "Government schools", + "colleges": "Colleges", + "universites": "University", + "aine": "Residences for seniors", + "ambulance": "Ambulance zones", + "clinique": "Clinics", + "etabl": "Health institutions", + "gmf": "Family doctors group", + "naissance": "Birth house", + "pharmacie": "Pharmacy", + "casernes": "Fire stations", + "correctionnel": "Correctional centres", + "organisme": "Security organization", + "palais-justice": "Courthouses", + "penitencier-fed": "Federal penitentiaries", + "penitencier-prov": "Provincial penitentiaries", + "polices": "Police station" + }, + "measure": { + "dialog": { + "title": "Sum of the selection", + "length.title": "Length", + "area.title": "Area", + "lengthInMeters": "m", + "lengthInKilometers": "km", + "lengthInMiles": "mi", + "lengthInFeet": "ft", + "areaInSquareMeters": "m²", + "areaInSquareKilometers": "km²", + "areaInSquareMiles": "mi²", + "areaInHectares": "ha", + "areaInAcres": "ac", + "perimeterInMeters": "Perimeter in meters" + }, + "layerTitle": "Measure on map", + "area": "Area", + "areaHeader": "Area", + "length": "Length", + "lengthHeader": "Length / Perimeter", + "perimeter": "Perimeter", + "meters": "m", + "m": "m", + "kilometers": "km", + "km": "km", + "miles": "mi", + "mi": "mi", + "feet": "ft", + "ft": "ft", + "squareMeters": "m²", + "m²": "m²", + "squareKilometers": "km²", + "km²": "km²", + "squareMiles": "mi²", + "mi²": "mi²", + "squareFeet": "ft²", + "ft²": "ft²", + "hectares": "ha", + "ha": "ha", + "acres": "ac", + "ac": "ac", + "toggleActive": "Activate measures", + "toggleDisplayLines": "Display distances of lines", + "toggleDisplayDistance": "Display distances of areas", + "toggleDisplayAreas": "Display areas", + "toggleAutoUnits": "Auto Units", + "actionbar": { + "calculate.tooltip": "Totals & Conversions", + "delete.tooltip": "Delete", + "modify.tooltip": "Modify" + } + }, + "draw": { + "abort": "Abort current drawing", + "cancel": "Cancel", + "Circle": "Circle", + "dialogInstruction": "Enter your drawing's label", + "dialogTitle": "Label", + "delete": "Remove Drawings from map", + "drawing": "Drawings", + "finish": "Finish current drawing", + "freehandMode": "Freehand drawing", + "icon": "Icons", + "InsertvalueRadius": "Use a predefined radius", + "labels": "Labels", + "LineString": "Line", + "move": "Center view on cursor", + "noIcon": "No icon", + "noLabel": "No label", + "Point": "Point", + "Polygon": "Polygon", + "radius": "Radius", + "shortcuts": "Keyboard shortcuts", + "styleSelect": "Select style", + "toggleMapTooltips": "Show map tooltips", + "undo": "Remove last vertex", + "layer": { + "title": "Title", + "createNewLayer": "Create new drawing layer", + "layerDialogInstruction": "Enter your drawing layer's title" + }, + "builtInInstructions": "Select an option", + "labelType": { + "Coordinates": "Coordinates", + "Length": "Length", + "Area": "Area", + "predefined": "Predefined", + "custom": "Customized", + "A": "A: " + }, + "popupTitle": "Drawing label" + }, + "network": { + "online": { + "message": "Online", + "title": "Status:" + }, + "offline": { + "message": "Offline", + "title": "Status:" + } + }, + "workspace": { + "deleteConfirmation": "Do you really want to delete this entity?", + "addConfirmation": "Do you really wish to add an entity?", + "modifyConfirmation": "Do you really wish to modify this entity?", + "deleteSuccess": "Entity has been deleted.", + "addSuccess": "Entity has been added.", + "modifySuccess": "Entity has been modified.", + "deleteError": "An error has occured. Entity could not be deleted.", + "addError": "An error has occured. Entity could not be added.", + "modifyError": "An error has occured. Entity could not be modified.", + "cancel": "Cancel", + "inMapExtent.active.tooltip": "Ne montrer que les entités contenues dans la carte", + "inMapExtent.inactive.tooltip": "Montrer tous les entités" + }, + "formValidation": { + "mandatory": "{{column}} is mandatory", + "minValue": "{{column}} is smaller than {{value}}", + "maxValue": "{{column}} is bigger than {{value}}", + "minLength": "{{column}} is shorter than {{value}} characters", + "maxLength": "{{column}} is longer than {{value}} characters" + }, + "query": { + "featureCountMax": "You may have more feature queryable on {{value}}. Zoom in to ensure you have access to all features.", + "link": { + "message": "Hyperlink copied to clipboard" + } + }, + "indexedDb": { + "data-download-start": "Downloading data. Please don't leave the current app.", + "data-download-completed": "Data download completed" + } + }, + "integration": { + "tools": { + "catalog": "Catalog", + "contexts": "Contexts", + "directions": "Directions", + "draw": "Draw", + "importExport": "Import & Export", + "ogcFilter": "Filter by", + "map": "Map", + "layers": "Layers", + "legend": "Legend", + "measurer": "Measure", + "print": "Print", + "searchResults": "Search Results", + "shareMap": "Share", + "timeFilter": "Time Filter", + "about": "About", + "spatialFilter": "Spatial Filter", + "advancedMap": "Advanced map tools", + "closestFeature": "Closest feature tool" + }, + "searchResultsTool": { + "noResults": "No results", + "doSearch": "", + "examples": "Search for addresses, locations, coordinates and layers using the search bar.

Address searches can be made with a combination of: Location search examples: You can also use keywords to refine your search. Examples: *Keywords appear as tooltips when hovering the results type in the 'ICherche' search options -> iCherche -> Results types.

Coordinate search examples:For more information on coordinate search : Consult IGO2's documentation", + "zoomOnFeatureTooltip": "Zoom on selected feature.", + "zoomOnFeatureTooltipOutOfView": "The feature is out of view. Zoom on selected feature." + }, + "aboutTool": { + "headerHtml": "", + "html": "
Features overview
Search Bar
Located in the upper-left portion of the interface, the Search Bar allows the user to locate an area of interest using an address, location or GPS coordinates. It can also be used to search for a layer.

It is also possible to search for a specific element using the hashtag \"#\" (for example, #municipalites québec). Accents and capital letters don't have any impact on Search Results when using a hashtag.

Contexts
Contexts are used to visualize groupings of layers related to a specific theme. When a context is selected, all the layers associated with it will be added to the Map. It is then possible to add other layers to the map by using the Catalog or the Search Bar.

WARNING : If a new context is selected, all the layers displayed on the Map will be replaced by the ones associated with the newly selected context.

Map
It is possible to personalize the Map by using the Catalog or the Search Bar. This space allows the user to add, delete, interrogate, filter and sort the displayed layers. It is also possible to visualize the legends associated with the layers.

Spatial Filter
The Spatial Filter can be used to search for adresses or themes by specifying a predefined zone (for example, electoral districts) or by drawing an area on the map. The results can then be exported by using the Import & Export tool.

Measure
This tool gives the option to either Measure distances or areas on the map.

Draw
The Draw tool can be used to draw points, lines, polygons or circles with labels. The color of the fill and the stroke can be set with the given selectors.

A Drawings layer can be exported by using the Import & Export tool.

Directions
It is possible to build a route and get Directions between two points by placing them on the map or by searching for addresses. It is also possible to add stops and copy the description or the link of the route to the clipboard.

Catalog
The Catalog contains all the layers that can be added to the Map. Click on the + of desired layer to add it.

Import & Export
It is possible to Import vector data by specifying a coordinate system or a projection.

It is possible to Export one or many layers in multiple formats.

It is also possible to Import or Export a context locally. This feature is useful to save contexts when the user is not authenticated.

Print
This tool is used to Print the map displayed on-screen. Multiple options can be specified like a title, a comment, the output format, the paper size and the orientation.

Share
The Share tool is used to create an URL that redirects to an exact representation of the map. This link can be shared or distributed in a document and allows the user to \"save\" the map for later use.

IGOIGO2 is a open source geospatial solution developed by collaborators and specialists from several departments and agencies of the Government of Quebec.

Version: {{version.lib}}

", + "trainingGuide": "Training guide", + "trainingGuideTooltip": "Click here to access IGO2's self-training guide" + }, + "mapTool": { + "empty": "No layer is currently active on this map. ", + "customize": "Customize it by adding layer from the : ", + "search-tool": "Search tool", + "catalog-tool": "Data catalog", + "context-tool": "Context manager", + "noLayersVisible": "There is no visible layers.", + "noLayersInRange": "There is no visible layers at the current scale. Please zoom in or out to discover theses layers." + }, + "importExportTool": { + "importExportData": "Layer", + "importExportContext": "Context" + }, + "workspace": { + "toggleWorkspace": "Open/Close the table view", + "ogcFilter.close": "Close", + "ogcFilter.title": "Filters", + "ogcFilter.tooltip": "Apply filters", + "download.title": "Download", + "download.tooltip": "Download", + "inMapExtent.title": "Show records contained in map", + "inMapExtent.active.tooltip": "Show records contained in map", + "inMapExtent.inactive.tooltip": "Show all records", + "zoomAuto.title": "Zoom auto", + "zoomAuto.tooltip": "Zoom auto", + "print.title": "Print the current table (PDF)", + "print.tooltip": "Print the current table (PDF)", + "selected.title": "Show selected records only", + "selected.tooltip": "Show selected records only", + "clearSelection.title": "Deselect all", + "clearSelection.tooltip": "Deselect all records", + "maximize": "Extend", + "maximizeTooltip": "Extend panel", + "standardExtent": "Reduce", + "standardExtentTooltip": "Reduce panel" + }, + "directions": { + "warning": { + "title": "Warning", + "message": "The route proposed in this tool does not take into account current road conditions, road congestion, obstacles present on the network and ferry schedules (daily and seasonal opening)." + } + }, + "map-proximity-tool": { + "lon": "Longitude", + "lat": "Latitude", + "method": "Location method", + "radiusM": "Search radius (meters)", + "geolocation": "Your current location", + "mapCenter": "Map center (black cross)", + "copyMsg": "Coordinates copied to clipboard", + "copyTitle": "Center's coordinate", + "feature": "Feature", + "distance": "Distance" + }, + "advanced-map-tool": { + "geolocation": { + "title": "Geolocation", + "tracking": "Activate/show the geolocation", + "follow": "Follow your position on map" + }, + "advanced-swipe": { + "swipe-select": "select the layers for swiping", + "selectAll": "Select all", + "empty": "No layer is currently active on this map. ", + "customize": "Customize it by adding layer from the : ", + "search-tool": "Search tool", + "catalog-tool": "Data catalog", + "context-tool": "Context manager", + "swipe": "Swipe", + "swipe-tool": "Swipe-Tool" + }, + "advanced-coordinates": { + "copy": "Copy coordinates", + "lon": "Longitude", + "lat": "Latitude", + "est": "Est", + "nord": "North", + "coordinates": "Coordinates", + "copyMsg": "Coordinates copied to clipboard", + "copyTitle": "Coordinates of center", + "center": "Display map center", + "coordSystem": "Systeme of coordinates", + "zoom": "Current zoom level: ", + "scale": "Current scale: ", + "resolution": "Current resolution: " + } + } + } + } +} \ No newline at end of file diff --git a/demo/src/locale/libs_locale/fr.json b/demo/src/locale/libs_locale/fr.json new file mode 100644 index 0000000000..47fe515db2 --- /dev/null +++ b/demo/src/locale/libs_locale/fr.json @@ -0,0 +1,1212 @@ +{ + "igo": { + "auth": { + "accessAnonymous": "Rester anonyme", + "connection": "Connexion", + "login": "Connecter", + "password": "Mot de passe", + "signOut": "Se déconnecter", + "user": "Utilisateur", + "welcome": "Bienvenue {{name}}!", + "deconnection": "Vous êtes déconnecté", + "home": "Retourner à la page d'accueil", + "error": { + "Password expired": "Votre mot de passe est expiré", + "Maximun logins exceeded": "Nombre maximal de connexions dépassé", + "Login lockout": "Nombre maximal d'essais dépassés. Votre compte est verrouillé.", + "Wrong password": "Mot de passe incorrect", + "Invalid username": "Utilisateur invalide" + }, + "google": { + "login": "Se connecter avec Google", + "logged": "Connecté avec Google" + }, + "microsoft": { + "login": "Se connecter avec compte Azure" + }, + "microsoftb2c": { + "login": "Se connecter" + } + }, + "common": { + "confirmDialog": { + "cancelBtn": "Annuler", + "confirmBtn": "Confirmer", + "title": "Confirmation" + }, + "table": { + "filter": "Filtre" + }, + "entity-table": { + "targetHtmlUrl": "Ouvrir le lien externe" + }, + "form": { + "errors": { + "required": "Ce champ est requis" + } + }, + "actionbar": { + "scrollUp": "Défiler vers le haut", + "scrollDown": "Défiler vers le bas", + "icon": "Actions supplémentaires" + }, + "interactiveTour": { + "tooltipTourToolButton": "Aide interactive sur l'outil", + "disaledTooltipTourToolButton": "Pour avoir accès au tour interactif de cet outil, ajouter des contextes ou des couches", + "buttonTitle": "Découvrir", + "exitButton": "Quitter", + "backButton": "Précédent", + "nextButton": "Suivant" + }, + "paginator": { + "firstPageLabel": "Première page", + "itemsPerPageLabel": "Entités par page:", + "lastPageLabel": "Dernière page", + "nextPageLabel": "Page suivante", + "previousPageLabel": "Page précédente", + "of": "de" + } + }, + "context": { + "bookmarkButton": { + "create": "Créer un contexte", + "dialog": { + "createMsg": "Le contexte '{{value}}' a été créé", + "createTitle": "Contexte créé", + "placeholder": "Titre", + "title": "Nouveau contexte" + } + }, + "contextManager": { + "clone": "Cloner ce contexte", + "delete": "Supprimer ce contexte", + "dialog": { + "cloneMsg": "Le contexte '{{value}}' a été cloné", + "cloneTitle": "Contexte cloné", + "copyMsg": "Texte copié", + "copyTitle": "Identifiant du contexte", + "confirmDelete": "Êtes-vous sûr de vouloir supprimer ce contexte ?", + "deleteMsg": "Le contexte '{{value}}' a été supprimé", + "deleteTitle": "Contexte supprimé", + "favoriteMsg": "Le contexte '{{value}}' a été défini comme favori", + "favoriteTitle": "Favori enregistré", + "saveMsg": "Le contexte '{{value}}' a été enregistré", + "saveTitle": "Contexte enregistré" + }, + "edit": "Éditer ce contexte", + "errors": { + "uncaught": { + "message": "Désolé! Le service que vous voulez utiliser n’est malheureusement pas disponible pour le moment. Essayez plus tard!", + "title": "Erreur de serveur" + }, + "addPermission": "La permission que vous tentez d'ajouter est déjà présente dans le contexte.", + "addPermissionEmpty": "La permission que vous tentez d'ajouter n'est pas valide", + "addPermissionTitle": "Erreur d'ajout de permission" + }, + "favorite": "Définir comme contexte favori", + "form": { + "copy": "Copier l'identifiant du contexte", + "edit": "Enregistrer", + "title": "Titre", + "titleRequired": "Le titre est obligatoire", + "uri": "Identifiant", + "uriRequired": "L'identifiant est obligatoire" + }, + "invalid": { + "text": "Le contexte \"{{value}}\" est invalide. Le contexte par défaut a été chargé.", + "title": "Contexte invalide" + }, + "managePermissions": "Gérer les permissions du contexte", + "manageTools": "Gérer les outils du contexte", + "ourContexts": "Mes contextes", + "publicContexts": "Contextes publics", + "save": "Sauvegarder ce contexte", + "sharedContexts": "Contextes partagés", + "filterPlaceHolder": "Filtrer par nom", + "sortAlphabetically": "Trier en ordre alphabétique", + "sortContextOrder": "Replacer selon la date de création", + "userAccount": "Profils utilisateurs", + "filterUser": "Filtrer par groupe d'utilisateur", + "emptyContext": "Contexte vide", + "emptyContextTooltip": "Créer un nouveau contexte vide", + "contextMap": "Contexte à partir de la carte", + "contextMapTooltip": "Créer un nouveau contexte à partir des couches la carte", + "hide": "Masquer ce contexte", + "show": "Montrer ce contexte", + "showHidden": "Montrer les contextes masqués" + }, + "contextImportExport": { + "export": { + "exportPlaceHolder": "Couches", + "exportContextName": "Nom du contexte", + "exportSelectAll": "Tout sélectionner", + "success": { + "text": "Contexte exporté avec succès.", + "title": "Exportation réussie" + }, + "nothing": { + "text": "Impossible d’exporter, contexte non valide ou aucun contexte sélectionné.", + "title": "Donnée non valide ou non présente" + }, + "failed": { + "text": "Impossible d’exporter, problème de contexte rencontré.", + "title": "Problème d’exportation" + } + }, + "import": { + "success": { + "title": "Contexte importé", + "text": "Le contexte '{{value}}' a été ajouté à la carte" + }, + "empty": { + "text": "Le contexte '{{value}}' est vide, impossible d'importer", + "title": "Contexte vide" + }, + "invalid": { + "text": "Le contexte '{{value}}' est invalide.", + "title": "Context invalide" + }, + "unreadable": { + "text": "Le contexte '{{value}}' est impossible à lire", + "title": "Context illisible" + }, + "tooLarge": { + "text": "Le contexte '{{value}}' est trop volumineux (Maximum: {{size}} Mo)", + "title": "Context trop volumineux" + } + } + }, + "permission": { + "addBtn": "Ajouter", + "delete": "Retirer la permission", + "dialog": { + "addMsg": "La permission '{{value}}' a été ajoutée", + "addTitle": "Permission ajoutée", + "deleteMsg": "La permission '{{value}}' a été supprimée", + "deleteTitle": "Permission retirée", + "scopeChangedMsg": "La portée du contexte a été changée pour {{value}}", + "scopeChangedTitle": "Changement de la portée" + }, + "profil": "Profil", + "user": "Utilisateur ou groupe", + "profilRequired": "Le profil est obligatoire", + "read": "Lecture seule", + "readOnlyTitle": "Contexte en lecture seule", + "readOnlyMsg": "Vous pouvez seulement retirer la permission si le contexte est directement partagé à votre nom d'utilisateur.", + "scope": { + "private": "Privé", + "protected": "Protégé", + "shared": "Partagé", + "public": "Public" + }, + "write": "Lecture et écriture" + }, + "poiButton": { + "create": "Créer une zone d'intérêt", + "dialog": { + "confirmDelete": "Êtes-vous sûr de vouloir supprimer cette zone d'intérêt ?", + "createMsg": "La zone d'intérêt '{{value}}' a été créée", + "createTitle": "Zone d'intérêt créée", + "deleteMsg": "La zone d'intérêt '{{value}}' a été supprimée", + "deleteTitle": "Zone d'intérêt supprimée", + "placeholder": "Titre", + "title": "Nouvelle zone d'intérêt" + }, + "placeholder": "Zones d'intérêt" + }, + "sidenav": { + "goBack": "Revenir", + "mainMenu": "Revenir au menu principal" + }, + "shareMap": { + "button": "Partager la carte", + "refreshBtn": "Actualiser le partage", + "copy": "Copier le lien", + "shareWithApi": "Partage par contexte", + "shareWithUrl": "Partage par URL", + "dialog": { + "copyMsg": "Lien copié", + "copyTitle": "Lien" + }, + "htmlClarifications": "", + "errorTitle": "Erreur lors du partage", + "placeholderLink": "Lien", + "included": "Inclus dans le lien de partage :", + "context": "Le contexte ouvert lors de la création du lien de partage.", + "center": "Les coordonnées du centre de la carte (longitude, latitude).", + "zoom": "Le niveau de zoom de la carte.", + "addedLayers": "Les couches ajoutées via le catalogue ou via la barre de recherche.", + "visibleInvisible": "Le statut de visibilité des couches.", + "excluded": "Exclus dans le lien de partage :", + "order": "L'ordre des couches.", + "opacity": "Les modifications effectuées à l'opacité des couches.", + "filterOgc": "Les ajouts/modifications faits aux filtres par attribut.", + "filterTime": "La valeur en cours pour les filtres temporels." + }, + "tool": { + "dialog": { + "addMsg": "L'outil a été ajouté", + "addTitle": "Outil ajouté", + "deleteMsg": "L'outil a été supprimé", + "deleteTitle": "Outil retiré" + } + }, + "userButton": { + "dialog": { + "email": "Courriel", + "expiration": "Expiration", + "user": "Utilisateur", + "clearPreferences": "Supprimer mes préférences" + }, + "infoTitle": "Info sur l'utilisateur", + "logout": "Se déconnecter" + } + }, + "core": { + "message": { + "success": "Succès", + "error": "Erreur", + "info": "Info", + "alert": "Alerte" + }, + "errors": { + "uncaught": { + "message": "Désolé! Le service que vous voulez utiliser n'est malheureusement pas disponible pour le moment. Essayez plus tard!", + "title": "Erreur serveur" + } + }, + "network": { + "online": { + "message": "En ligne", + "title": "Statut:" + }, + "offline": { + "message": "Hors-Ligne", + "title": "Statut:" + } + } + }, + "geo": { + "catalog": { + "layer.addToMap": "Ajouter à la carte", + "layer.addToMapOutRange": "Ajouter à la carte. La donnée est non visible à l'échelle active. Veuillez zoomer +/- si vous voulez l'apercevoir à la carte.", + "layer.removeFromMap": "Retirer de la carte", + "layer.removeFromMapOutRange": "Retirer de la carte. La donnée est non visible à l'échelle active. Veuillez zoomer +/- si vous voulez l'apercevoir à la carte.", + "layer.removeFromMapNotVisible": "Retirer de la carte. La donnée est visible à l'échelle active, mais n'est pas activée. Veuillez basculer vers l'outil carte pour la rendre visible.", + "group.addToMap": "Ajouter toutes les couches de ce groupe à la carte", + "group.removeFromMap": "Retirer toutes les couches de ce groupe de la carte", + "baseLayers": "Fonds de carte", + "unavailableTitle": "Catalogue indisponible", + "unavailable": "Le catalogue '{{value}}' est indisponible pour le moment ou vous n'avez pas les permissions requises.", + "someUnavailable": "Certaines couches d'information du catalogue sont indisponible pour le moment ou vous n'avez pas les permissions requises.", + "externalProvider": { + "catalog": "Ce catalogue provient d'une organisation externe.", + "group": "Ces couches proviennent d'une organisation externe.", + "layer": "Cette couche provient d'une organisation externe.", + "unavailableWithEmail": "Le catalogue '{{value}}' est indisponible pour le moment. Pour ajouter un service externe à la liste prédéfinie, veuillez contacter {{email}}. Des délais peuvent s'appliquer si problème il y a avec le fournisseur externe." + }, + "library.add": "Ajouter ce catalogue", + "library.cancel": "Annuler", + "library.remove": "Retirer ce catalogue de la liste", + "library.inlist": { + "title": "Catalogue déjà contenu", + "message": "Le catalogue à ajouter est déjà dans la liste" + }, + "library.addTitle": "Ajout d'un catalogue", + "library.addBtn": "Ajouter un catalogue" + }, + "clickOnMap": { + "clickedFeature": "Entités cliquées" + }, + "baselayersSwitcher": { + "title": "Fonds de carte" + }, + "dataSource": { + "unavailableTitle": "Couche indisponible", + "optionsApiUnavailable": "L'information sur les couches n'a pas pu être récupérée. Certaines couches pourraient ne pas présenter la bonne information.", + "unavailable": "La couche '{{value}}' est indisponible pour le moment ou vous n'avez pas les permissions requises." + }, + "dropGeoFile": { + "invalid": { + "text": "Le fichier '{{value}}' est invalide. ({{mimeType}})", + "title": "Fichier invalide" + }, + "empty": { + "text": "Le fichier '{{value}}' est vide, impossible d'importer", + "title": "Fichier vide" + }, + "success": { + "text": "La couche '{{value}}' a été ajoutée à la carte", + "title": "Fichier importé" + }, + "unreadable": { + "text": "Le fichier '{{value}}' est impossible à lire", + "title": "Fichier illisible" + }, + "tooLarge": { + "text": "Le fichier '{{value}}' est trop volumineux (Maximum: {{size}} Mo)", + "title": "Fichier trop volumineux" + }, + "invalidSRS": { + "text": "La projection est valide. Elle doit commencer par EPSG:", + "title": "Projection invalid" + }, + "ogreServer": { + "title": "Erreur 500 du service Ogre", + "text": "Erreur de la conversion du fichier en geojson. Il est possible que le fichier soit trop volumineux, essayer de l'importer en format geojson" + } + }, + "export": { + "customList": { + "text": "Certaines couches sélectionnées ( {{value}} ) réduisent la liste des formats possible", + "title": "Liste restreinte de formats" + }, + "nothing": { + "text": "Impossible d’exporter, donnée non valide ou aucune donnée sélectionnée.", + "title": "Donnée non valide ou non présente" + }, + "noFormat": { + "text": "Aucun format d'exportation valide pour toutes les couches sélectionnées. Veuillez exporter les couches une à la fois.", + "title": "Aucun format disponible" + }, + "failed": { + "text": "Impossible d’exporter, problème de donnée rencontré.", + "title": "Problème d’exportation" + }, + "popupBlocked": { + "text": "
Veuillez autoriser l'ouverture des fenêtres (popup) dans votre fureteur.
Pour Chrome and Edge, à droite dans la barre d'adresse).
{{extraMessage}}", + "selectAgain": "Faites le correctif et sélectionner à nouveau un format.", + "retry": "Veuillez recommencer l'exportation.", + "title": "Ouverture de fenêtre bloquée par votre fureteur" + }, + "success": { + "text": "Données exportées avec succès.", + "title": "Exportation réussie" + }, + "format": { + "GeoJSON": "GeoJSON", + "GML": "GML", + "GPX": "GPX", + "KML": "KML", + "Shapefile": "Shapefile", + "CSVcomma": "CSV (séparateur virgule)", + "CSVsemicolon": "CSV (compatible Excel)", + "URL": "Lien externe" + }, + "gpx.error.poly": { + "title": "GPX en erreur", + "text": "Le format GPX ne permet pas de stocker les polygones" + }, + "encoding": { + "LATIN1": "LATIN-1", + "UTF8": "UTF-8" + }, + "combinedLayers": "couchesCombinees" + }, + "import": { + "promptStoreToIdb": "Est-ce que vous voulez sauvegarder cette couche d'information afin d'être utilisée ultérieurement dans une autre session?" + }, + "importExportForm": { + "exportButton": "Exporter", + "exportButtonLink": "Ouvrir le lien", + "exportButtonLinks": "Ouvrir les liens", + "exportCombineResults": "Combiner les couches dans un seul fichier", + "exportFormatPlaceholder": "Format", + "exportLayerPlaceholder": "Couche(s)", + "exportFileNamePlaceholder": "Nom du fichier", + "exportSeparator": "Insérer un séparateur (ligne vide) entre les couches", + "encodingPlaceholder": "Encodage", + "exportTabTitle": "Exporter", + "exportFeatureInExtent": "Seulement les entités contenues dans la carte", + "exportNoLayersExportable": "Aucune couche exportable dans la carte courante", + "exportSelectedFeature": "Seulement les entités sélectionnées", + "importButton": "Importer", + "importProjPlaceholder": "Système de coordonnées du fichier à importer", + "importTabTitle": "Importer", + "importClarifications": "Précisions", + "importSizeMax": "La taille limite du fichier est de {{size}} Mo", + "importFormatAuthorized": "Formats autorisés: geojson, kml, gpx, gml, shapefile", + "importShpZip": "Les shapefiles doivent être compressés (zippés) ET leurs géométries doivent être en coordonnées Latitude Longitude (EPSG:4326/WGS84)", + "importHtmlClarifications": "", + "exportHtmlClarifications": "", + "other": "autre", + "others": "autres", + "projections": { + "mtm": "MTM {{zone}} ({{code}})", + "utm": "UTM {{zone}} ({{code}})", + "webMercator": "Web Mercator ({{code}})", + "nad83": "Lat-Long NAD83 ({{code}})", + "wgs84": "Lat-Long WGS84 ({{code}})", + "choose": "Vous devez choisir une projection avant d'importer le fichier." + } + }, + "operators": { + "caseSensitive": "Sensible à la case", + "And": "Et", + "Or": "Ou", + "PropertyIsEqualTo": "=", + "PropertyIsNotEqualTo": "!=", + "PropertyIsLike": "≈", + "PropertyIsGreaterThan": ">", + "PropertyIsGreaterThanOrEqualTo": ">=", + "PropertyIsLessThan": "<", + "PropertyIsLessThanOrEqualTo": "<=", + "PropertyIsBetween": "entre", + "During": "durant (temporel)", + "PropertyIsNull": "est nul", + "Intersects": "intersecte (géométrique)", + "Within": "contenu dans (géométrique)", + "Contains": "contient (géométrique)", + "tooltip": { + "And": "Opérateur logique entre les filtres où les deux conditions doivent être remplies", + "Or": "Opérateur logique entre les filtres où au moins une (1) condition doit être vraie", + "PropertyIsEqualTo": "Identique (sensible à la case)", + "PropertyIsNotEqualTo": "Différent (sensible à la case)", + "PropertyIsLike": "Comme. Exemple: *route* trouve toutes les valeurs contenent 'route', peu importe sa position dans l'attribut. route* trouve toutes les valeurs commencant par 'route'. Options avancées : wildCard ='*', singleChar = '.' escapeChar = '!' (sensible à la case)", + "PropertyIsGreaterThan": "Plus grand", + "PropertyIsGreaterThanOrEqualTo": "Plus grand ou égal", + "PropertyIsLessThan": "Plus petit", + "PropertyIsLessThanOrEqualTo": "Plus petit ou égal", + "PropertyIsBetween": "Doit être contenu entre les limites inférieure et supérieure (les valeurs sont incluses)", + "During": "Doit être contenu entre les périodes de temps spécifiées", + "PropertyIsNull": "Dont l'attribut est nul", + "Intersects": "Retourne les entités étant en intersection géométrique avec la géométrie fournie", + "Within": "Retourne les entités étant entièrement contenue par la géométrie fournie (Within)", + "Contains": "Retourne les entités complètement contenues par la géométrie fournie (Contains)" + } + }, + "sourceFields": { + "selectField": "Choisir un champ" + }, + "filter": { + "resetFilters": "Réinitialiser les valeurs par défaut", + "addFilter": "Ajouter un filtre vide à la liste courante", + "removeFilter": "Supprimer le présent filtre à la liste des filtres", + "toggleFilterState": "Activer/désactiver le présent filtre", + "refreshFilters": "Mettre à jour la source de donnée avec les filtres actifs de la liste. Pour activer ce boutton, la couche doit etre visible (et dans les échelles permises) ou veillez modifier le présent filtre.", + "layerFiltered": "Cette couche d'information est présentement filtrée.", + "layerFilterable": "Cette couche d'information est filtrable", + "filterBy": "Filtrer par", + "advancedOgcFilters": "Filtres avancés", + "displayMoreResults": "Afficher plus (+)", + "displayLessResults": "Afficher moins (-)", + "placeholder": "Saisir une valeur", + "placeholderSnrc": "Ex: 21L14", + "selectOperator": "Choisir un opérateur", + "sliderModeTitle": "Curseur temporel", + "reportingDate": "Date de signalement", + "noFilterableLayer": "Aucune couche ne peut être filtrée dans la carte actuelle" + }, + "spatialSelector": { + "fixedExtent": "Étendue fixe", + "btnSetExtent": "Définir l'étendue du filtre selon l'étendue courante de la carte", + "snrc": "SNRC", + "selectFeature": "", + "drawFeature": "" + }, + "layer": { + "hideLayer": "Masquer la couche", + "hideSelectedLayers": "Masquer les couches sélectionnées", + "notInResolution": "La couche n'est pas visible à l'échelle active. Veuillez zoomer ou dézoomer pour la visualiser.", + "lowerLayer": "Mettre en arrière", + "filterLowerLayer": "Le déplacement arrière se fait toujours selon l'ordre de la carte!", + "filterPlaceholder": "Filtrer la liste de couches", + "activateSelectionMode": "Activer le mode de sélection multiple", + "deactivateSelectionMode": "Désactiver le mode de sélection multiple", + "tools": "Outils", + "selectAll": "Sélectionner toutes les couches", + "deselectAll": "Désélectionner toutes les couches", + "zoomLayer": "Cadrer sur l'étendue de la couche", + "zoomLayers": "Cadrer sur l'étendue des couches sélectionnées", + "opacity": "Opacité", + "raiseLayer": "Mettre en avant", + "filterRaiseLayer": "Le déplacement avant se fait toujours selon l'ordre de la carte!", + "moreOptions": "Outils de la couche", + "removeLayer": "Retirer la couche de la carte", + "removeSelectedLayers": "Retirer les couches sélectionnées de la carte", + "removeSelectedLayersRestriction": "Certaines couches sélectionnées ne peuvent être supprimées", + "showFeaturesList": "Afficher la liste des entités", + "showLayer": "Afficher la couche", + "showSelectedLayers": "Afficher les couches sélectionnées", + "subsetLayersListKeyword": "Limiter l'affichage de la liste selon le titre ou par type (wms, wfs,...)", + "deleteKeyword": "Supprimer le mot-clé", + "subsetLayersListOnlyVisible": "Conserver seulement les couches visibles", + "subsetLayersListOnlyInRange": "Conserver seulement les couches de la plage d'échelle active", + "sortAlphabetically": "Trier la liste des couches en ordre alphabétique", + "sortMapOrder": "Replacer les couches selon l'ordre cartographique", + "resetLayersList": "Rétablir l'affichage de l'ensemble des couches", + "trackFeature": "Suivre l'entité", + "legend": { + "default": "Défaut", + "loadingLegendText": "Chargement de la légende", + "noLegendText": "Aucune symbologie disponible pour cette couche", + "noLegendScale": "Aucune symbologie disponible pour cette échelle", + "selectStyle": "Sélectionner le style de la légende", + "showAll": "Montrer toutes les couches (non visible et hors échelle)", + "noLayersVisibleWithShowAllButton": "Aucune couche actuellement visible. Activez le bouton ci haut pour voir toutes les légendes.", + "noLayersVisibleWithShowAllButtonButZoom": "Aucune couche actuellement visible. Si vous zoomez dans la carte, certaines couches apparaîtront OU activez le bouton ci-haut pour voir toutes les légendes.", + "noLayersVisible": "Aucune couche actuellement visible.", + "noLayersVisibleButZoom": "Aucune couche actuellement visible. Par contre, si vous zoomez dans la carte, certaines couches apparaîtront." + }, + "style": { + "styleModal": "Modifier le style", + "styleModalTooltip": "Éditer le style des entités sélectionnées" + }, + "saveBtn": "Sauvegarder", + "cancelBtn": "Cancel", + "saveFeatureInLayer": "Ajouter la sélection dans une couche", + "chooseOrSet": "Choisir une couche ou définir un nouveau nom" + }, + "style": { + "styleModal": "Modifier le style", + "styleModalTooltipLayer": "Éditer le style de la présente couche.", + "styleModalTooltipSelected": "Éditer le style des entités sélectionnées", + "colorPicker": "Cliquer pour ouvrir le sélecteur de couleurs", + "cancel": "Annuler", + "fill": "Remplissage", + "stroke": "Contour", + "fontSize": "Taille de police", + "fontStyle": "Style de police", + "offsetX": "Décalage horizontal", + "offsetY": "Décalage vertical" + }, + "download": { + "action": "Télécharger les données associées", + "title": "Téléchargement des données", + "start": "Vérifiez la progression du téléchargement dans votre navigateur", + "end": "Terminé" + }, + "mapButtons": { + "baselayerSwitcher": "Changer le fond de carte", + "geolocate": "Afficher votre position", + "geolocateInactive": "Masquer votre position", + "home-extent": "Aller à l'étendue de la carte", + "offline": "Passer en mode hors-ligne", + "online": "Passer en mode en ligne", + "zoomIn": "Zoomer ({{zoom}})", + "zoomOut": "Dézoomer ({{zoom}})", + "resetRotation": "Azimut: {{azimuth}}°N. Rotation: {{rotation}}°. Réinitialiser la carte vers le nord", + "tipRotation": "Maintenez les touches Alt et Majuscule (shift) tout en cliquant sur la carte pour faire pivoter la carte", + "preventScreenLock": "Préviens l'écran d'entrer en mode verrouillé.", + "letScreenLock": "Permets l'écran d'entrer en mode verrouillé." + }, + "metadata": { + "show": "Montrer les métadonnées" + }, + "printForm": { + "corsErrorMessageBody": "Impossible d'imprimer dû à des droits d'accès non détenus", + "corsErrorMessageHeader": "Impression", + "comment": "Commentaire", + "doZipFile": "Compresser le fichier", + "outputFormat": "Format de sortie", + "paperFormat": "Format du papier", + "paperFormats": { + "A0": "33.1 X 46.8\" (A0)", + "A1": "23.4 X 33.1\" (A1)", + "A2": "16.5 X 23.5\" (A2)", + "A3": "11.7 X 16.5\" (A3)", + "A4": "8.3 X 11.7\" (A4)", + "A5": "5.8 X 8.3\" (A5)", + "Letter": "Lettre", + "Legal": "Légal" + }, + "imageFormat": "Format de l'image", + "orientation": "Orientation", + "landscape": "Paysage", + "portrait": "Portrait", + "projection": "Projection", + "resolution": "Résolution", + "saveBtn": "Sauvegarder", + "scale": "Échelle", + "showProjection": "Afficher la projection", + "showScale": "Afficher l'échelle", + "title": "Titre", + "subtitle": "Sous-titre", + "legendPosition": "Position de la légende", + "legendPositions": { + "none": "Aucune légende", + "topleft": "Coin haut gauche de la carte", + "topright": "Coin haut droit de la carte", + "bottomleft": "Coin bas gauche de la carte", + "bottomright": "Coin bas droit de la carte", + "newpage": "Sur une nouvelle page", + "newimage": "Sur une nouvelle image" + } + }, + "directionsForm": { + "stopLayer": "Itinéraire - Arrêts", + "routeLayer": "Itinéraire - Tracé", + "start": "Début", + "intermediate": "Intermédiaire", + "end": "Fin", + "directionsBtn": "Obtenir l'itinéraire", + "resetDirectionsBtn": "Supprimer l'itinéraire", + "zoomRoute": "Zoomer sur l'itinéraire", + "null": "", + "directions": "Itinéraire", + "raiseStop": "Prioriser l'arrêt", + "lowerStop": "Reporter l'arrêt plus loin dans le parcours", + "addStop": "Ajouter un arrêt", + "clearStop": "Réinitialiser cet arrêt", + "moveStop": "Déplacer cet arrêt", + "removeStop": "Supprimer l'arrêt", + "drivingOptions": "Choix d'itinéraires", + "summary": "Résumé de l'itinéraire", + "stopsList": "Liste des lieux d'arrêts", + "instructions": "Indications", + "copy": "Copier l'itinéraire", + "geolocate": "Utiliser sa localisation comme point d'arrêt", + "link": "Lien", + "dialog": { + "copyMsg": "Itinéraire copié dans le presse-papier", + "copyMsgLink": "Le lien de l'itinéraire est copié dans le presse-papier", + "copyTitle": "Itinéraire" + } + }, + "directions": { + "uturn": "demi-tour", + "sharp right": "fortement à droite", + "right": "droite", + "slight right": "légèrement à droite", + "sharp left": "fortement à gauche", + "left": "gauche", + "slight left": "légèrement à gauche", + "straight": "tout droit", + "turn": { + "straight": "Continuer sur {{route}}", + "uturn": "Faire demi-tour sur {{route}}", + "else": "Tourner {{aggregatedDirection}} sur {{route}}" + }, + "new name": "Continuer en direction {{translatedDirection}} sur {{route}}", + "depart": "Aller en direction {{translatedDirection}} sur {{route}}", + "arrive": { + "lastStep": "Vous êtes arrivé {{coma}} {{aggregatedDirection}}", + "intermediate": "Vous atteignez le point intermédiaire sur {{route}}" + }, + "merge": "Continuer sur {{route}}", + "on ramp": "Prendre l'entrée d'autoroute {{aggregatedDirection}}", + "off ramp": "Prendre la sortie d'autoroute {{aggregatedDirection}}", + "fork": { + "left": "Garder la gauche sur {{route}}", + "right": "Garder la droite sur {{route}}", + "else": "Continuer sur {{route}}" + }, + "end of road": "À la fin de la route, tourner {{translatedModifier}} sur {{route}}", + "use lane": "Prendre la voie de ...", + "continue": { + "notUturn": "Continuer sur {{route}}" + }, + "roundabout": "Au rond-point, prendre la {{exit}}{{cntSuffix}} sortie vers {{route}}", + "rotary": "Rond-point rotary ...", + "roundabout turn": "Rond-point, prendre la ...", + "exit roundabout": "Poursuivre vers {{route}}", + "notification": "notification ...", + "uturnText": "Faire demi-tour et continuer en direction {{translatedDirection}} sur {{route}}", + "unknown": "???", + "cntSuffix": { + "first": "ère", + "secondAndMore": "e" + }, + "modifier": { + "prefix": "à " + } + }, + "cardinalPoints": { + "n": "nord", + "ne": "nord-est", + "e": "est", + "se": "sud-est", + "s": "sud", + "sw": "sud-ouest", + "w": "ouest", + "nw": "nord-ouest" + }, + "search": { + "placeholder": "Rechercher une localisation ou une couche de données", + "emptyType.placeholder": "Veuillez choisir un type de recherche", + "feature.title": "Localisation", + "feature.placeholder": "Rechercher une localisation", + "layer.title": "Couche de données", + "layer.placeholder": "Rechercher une couche de données.", + "ichercheReverse.name": "Recherche par coordonnées", + "clearSearch": "Effacer la recherche", + "addToLayer": "Ajouter à une couche", + "ilayer": { + "name": "Couches", + "properties": { + "abstract": "Description", + "groupTitle": "Groupe", + "title": "Titre", + "type": "Type", + "url": "URL", + "metadataUrl": "Métadonnées", + "name": "Nom de la couche", + "urlInfo": "Lien du service web WMS/WFS", + "downloadUrl": "Lien de téléchargement de la données" + }, + "type": { + "layer": "Couche", + "groupLayer": "Groupe de couches" + } + }, + "nominatim": { + "type": { + "food": "Restauration", + "health": "Santé", + "entertainment": "Divertissement", + "finance": "Finance" + }, + "country": { + "all": "Le monde", + "canada": "Canada" + } + }, + "workspace": { + "name": "Données importées (vecteurs)", + "restrictExtent": { + "map": "À l'étendue de la carte", + "whole": "L'entièreté du jeu de données" + } + }, + "icherche": { + "name": "iCherche", + "type": { + "address": "Adresse", + "oldAddress": "Ancienne adresse", + "district": "Arrondissement", + "postalCode": "Code Postal", + "city": "Municipalité", + "oldCity": "Ancienne municipalité", + "mrc": "MRC", + "regadmin": "Région administrative", + "road": "Route", + "intersection": "Intersection", + "place": "Lieu", + "exit": "Sortie d'autoroute", + "cn": "Borne du CN", + "gcc": "Repère de la garde cotière (GCC)", + "sumi": "Borne SUMI", + "km": "Repère kilométrique", + "hq": "Hydro-Québec", + "entreprise": "Entreprise", + "cadastre": "Cadastre", + "restArea": "Halte routière", + "cycleStop": "Halte cyclable" + }, + "restrictExtent": { + "map": "À l'étendue de la carte", + "quebec": "Au Québec" + } + }, + "coordinates": { + "name": "Coordonnées", + "coord": "Coordonnée (longitude, latitude)", + "reversedCoord": "Coordonnée (latitude, longitude)", + "coordDMS": "Coordonnée (longitude, latitude) (DMS)", + "reversedCoordDMS": "Coordonnée (latitude, longitude) (DMS)", + "radius": "Rayon", + "conf": "Confiance" + }, + "menu.tooltip": "Options de recherche", + "settings": { + "title": "Paramètres" + }, + "pointerSearchSummary": { + "title": "Position du curseur", + "tooltip": "Afficher les coordonnées du curseur ainsi que d'autres informations sur sa position en fonction des types de résultats activés. Utiliser F2 pour activer / désactiver." + }, + "searchResultsGeometry": { + "title": "Montrer tous les résultats", + "tooltip": "Afficher/cacher la géométrie des résultats" + }, + "reverseCoordFormat": { + "title": "Afficher les données en latitude/longitude", + "tooltipLonLat": "Afficher les données en latitude/longitude.", + "tooltipLatLon": "Afficher les données en longitude/latitude." + }, + "searchSources": { + "selectAll": "Tout sélectionner", + "unselectAll": "Tout désélectionner", + "settings": { + "datasets": "Jeu de données", + "results type": "Type de résultat", + "ecmax": "Écart maximal", + "radius": "Rayon de recherche", + "results limit": "Nombre de résultats", + "multiple object": "Objet multiple", + "restrictExtent": "Restreins l'étendue", + "selectAll": "Tout sélectionner", + "unselectAll": "Tout désélectionner", + "true": "Oui", + "false": "Non" + } + }, + "displayMoreResults": "Afficher plus de résultats" + }, + "geometry": { + "geometry": "Geometrie", + "point": "Point", + "line": "Ligne", + "polygon": "Surface" + }, + "targetHtmlUrl": "Ouvrir le lien externe", + "targetHtmlUrlUnauthorizedTitle": "Non autorisé", + "targetHtmlUrlUnauthorized": "Vous n'êtes pas autorisé à ouvrir ce lien externe.", + "searchByCoord": "Rechercher par coordonnées", + "searchByName": "Rechercher par nom", + "seeRouting": "Voir l'itinéraire", + "timeFilter": { + "date": "Date", + "endDate": "Date de fin", + "startDate": "Date de début", + "hour": "Heure", + "minute": "Minute", + "endYear": "Année de fin", + "startYear": "Année de début" + }, + "spatialFilter": { + "spatialFilter": "Filtre spatial", + "predefined": "Zone prédéfinie", + "draw": "Dessin", + "polygon": "Polygone", + "point": "Cercle", + "drawPolygon": "Dessiner un polygone", + "drawCircle": "Dessiner un cercle", + "searchLabel": "Rechercher par", + "buffer": "Zone tampon", + "search": "Recherche", + "drawControl": "Activer le contrôle de dessin", + "listLabel": "Zone", + "entity": "Entité", + "layer": "Couche", + "goSearch": "Lancer la recherche", + "removeLayer": "Retirer les résultats", + "exportLayer": "Exporter les résultats", + "clearForm": "Retirer le dessin", + "clearSearch": "Réinitialiser", + "Address": "Adresses", + "Thematics": "Thématiques", + "searchResults": "Résultats de la recherche", + "showSearchResults": "Afficher les résultats de la recherche", + "hideSearchResults": "Masquer les résultats de la recherche", + "type": "Type", + "radius": "Rayon", + "radiusAlert": "Le rayon doit être compris entre 0 et 100 kilomètres (ou 100 000 mètres)", + "bufferAlert": "La zone tampon doit être comprise entre 0 et 100 kilomètres (ou 100 000 mètres)", + "maxSizeAlert": "Le nombre de résultats excède 10000. Certains pourraient être manquants.", + "zeroResults": "Aucun résultat ne correspond à cette recherche.", + "warning": "Avertissement", + "freehandControl": "À main levée", + "group": { + "toponyme": "Toponyme", + "culturel": "Culturel", + "education": "Éducation", + "sante": "Santé", + "securite": "Sécurité", + "sepaq": "SÉPAQ", + "transport": "Transport" + } + }, + "terrapi": { + "AdmRegion": "Régions administratives", + "Mun": "Municipalités", + "Arrond": "Arrondissements", + "CircFed": "Circonscriptions fédérales", + "CircProv": "Circonscriptions provinciales", + "DirReg": "Directions régionales", + "MRC": "MRC", + "RegTour": "Régions touristiques", + "limites": "Limites administratives", + "bornes": "Bornes sumi", + "hydro": "Hydrographie", + "routes": "Routes", + "bati": "Bâtiments", + "batiment": "Bâtiments", + "camping": "Camping", + "equipement": "Équipements", + "commun": "Commun", + "geographie": "Lieux naturels", + "parc": "Parcs", + "secteur": "Secteurs", + "immeubles": "Immeubles patrimoniaux", + "sites": "Sites patrimoniaux", + "service-garde": "Services de garde", + "public": "Écoles publiques", + "prive": "Écoles privées", + "gouvernemental": "Écoles gouvernementales", + "colleges": "Collèges", + "universites": "Universités", + "aine": "Résidences pour aînés", + "ambulance": "Zones d'ambulance", + "clinique": "Cliniques", + "etabl": "Établissements de santé", + "gmf": "Groupes de médecins de famille", + "naissance": "Maisons de naissances", + "pharmacie": "Pharmacies", + "casernes": "Casernes de pompiers", + "correctionnel": "Centres correctionnels", + "organisme": "Organismes de sécurité", + "palais-justice": "Palais de justice", + "penitencier-fed": "Pénitenciers fédéraux", + "penitencier-prov": "Pénitenciers provinciaux", + "polices": "Poste de police" + }, + "measure": { + "dialog": { + "title": "Sommes de la sélection", + "length.title": "Distance", + "area.title": "Superficie", + "lengthInMeters": "m", + "lengthInKilometers": "km", + "lengthInMiles": "mi", + "lengthInFeet": "pi", + "areaInSquareMeters": "m²", + "areaInSquareKilometers": "km²", + "areaInSquareMiles": "mi²", + "areaInHectares": "ha", + "areaInAcres": "ac", + "perimeterInMeters": "Périmètre en mètres" + }, + "layerTitle": "Mesure à la carte", + "area": "Superficie", + "areaHeader": "Superficie", + "length": "Distance", + "lengthHeader": "Distance / Périmètre", + "perimeter": "Périmètre", + "meters": "m", + "m": "m", + "kilometers": "km", + "km": "km", + "miles": "mi", + "mi": "mi", + "feet": "pi", + "ft": "pi", + "squareMeters": "m²", + "m²": "m²", + "squareKilometers": "km²", + "km²": "km²", + "squareMiles": "mi²", + "mi²": "mi²", + "squareFeet": "pi²", + "ft²": "pi²", + "hectares": "ha", + "ha": "ha", + "acres": "ac", + "ac": "ac", + "toggleActive": "Activer le contrôle de mesure", + "toggleDisplayLines": "Afficher les distances pour les lignes", + "toggleDisplayDistance": "Afficher les distances pour les superficies", + "toggleDisplayAreas": "Afficher les superficies", + "toggleAutoUnits": "Unités automatiques", + "actionbar": { + "calculate.tooltip": "Totaux et conversions", + "delete.tooltip": "Supprimer", + "modify.tooltip": "Modifier" + } + }, + "draw": { + "abort": "Annuler le dessin en cours", + "cancel": "Annuler", + "Circle": "Cercle", + "dialogInstruction": "Veuillez entrer l'étiquette de votre dessin", + "dialogTitle": "Étiquette", + "delete": "Retirer les dessins de la carte", + "drawing": "Dessins", + "finish": "Terminer le dessin en cours", + "freehandMode": "Dessiner à main levée", + "icon": "Icônes", + "insertvalueRadius": "Utiliser un rayon prédéfini", + "labels": "Étiquettes", + "LineString": "Ligne", + "move": "Centrer la vue sur le curseur", + "noIcon": "Aucune icône", + "noLabel": "Aucune étiquette", + "Point": "Point", + "Polygon": "Polygone", + "radius": "Rayon", + "shortcuts": "Raccourcis clavier", + "styleSelect": "Sélectionner le style", + "toggleMapTooltips": "Afficher les étiquettes", + "undo": "Retirer le dernier sommet", + "layer": { + "title": "Titre", + "createNewLayer": "Créer une nouvelle couche de dessin", + "layerDialogInstruction": "Veuillez entrer le titre de votre couche de dessin" + }, + "builtInInstructions": "Sélectionnez une option", + "labelType": { + "Coordinates": "Coordonnées", + "Length": "Longueur", + "Area": "Superficie", + "predefined": "Prédéfinie", + "custom": "Personnalisée", + "A": "S: " + }, + "popupTitle": "Étiquette du dessin" + }, + "network": { + "online": { + "message": "En ligne", + "title": "Statut:" + }, + "offline": { + "message": "Hors-Ligne", + "title": "Statut:" + } + }, + "workspace": { + "deleteConfirmation": "Voulez-vous vraiment supprimer cette entité?", + "addConfirmation": "Voulez-vous vraiment ajouter une entité?", + "modifyConfirmation": "Voulez-vous vraiment modifier une entité?", + "deleteSuccess": "L'entité a été supprimée.", + "addSuccess": "L'entité a été ajoutée.", + "modifySuccess": "L'entité a été modifiée.", + "deleteError": "Un problème est survenu. L'entité n'a pas pu être supprimée.", + "addError": "Un problème est survenu. L'entité n'a pas pu être ajoutée.", + "modifyError": "Un problème est survenu. L'entité n'a pas pu être modifiée.", + "cancel": "Annuler", + "inMapExtent.active.tooltip": "Ne montrer que les enregistrements contenus dans la carte", + "inMapExtent.inactive.tooltip": "Montrer tous les enregistrements" + }, + "formValidation": { + "mandatory": "{{column}}est un champ obligatoire", + "minValue": "{{column}} doit être plus grand que {{value}}", + "maxValue": "{{column}}doit être plus petit que {{value}}", + "minLength": "{{column}} doit être plus long que {{value}} caractères", + "maxLength": "{{column}} doit être plus court que {{value}} caractères" + }, + "query": { + "featureCountMax": "Vous pourriez avoir plus d'entités interrogeables sur la couche {{value}}. Pour vous en assurer, vous pouvez zoomer et redéclencher l'interrogation.", + "link": { + "message": "Le lien a été copié dans le presse-papier" + } + }, + "indexedDb": { + "data-download-start": "Téléchargement des données. Veuillez ne pas quitter.", + "data-download-completed": "Téléchargement des données terminées." + } + }, + "integration": { + "tools": { + "catalog": "Catalogue", + "contexts": "Contextes", + "directions": "Itinéraire", + "draw": "Dessin", + "importExport": "Importer et exporter", + "ogcFilter": "Filtrer par", + "map": "Carte", + "layers": "Couches", + "legend": "Légende", + "measurer": "Mesurer", + "print": "Imprimer", + "searchResults": "Résultats de recherche", + "shareMap": "Partager", + "timeFilter": "Filtre temporel", + "about": "À propos", + "spatialFilter": "Filtre spatial", + "advancedMap": "Outils avancés", + "closestFeature": "Entités à proximité" + }, + "searchResultsTool": { + "noResults": "Aucun résultat", + "doSearch": "Veuillez effectuer une recherche dans la barre de recherche ci-dessus.", + "examples": "Permet de rechercher des adresses, des lieux, des coordonnées ou des couches.

Les recherches d'adresses peuvent être effectués selon une combinaison:
  • du no. immeuble
  • du nom de la rue
  • de la ville
  • du code postal
Exemples pour les lieux:
  • Lac Poulin
  • Mcdo Lévis
  • Saint-Isidore
Vous pouvez aussi utiliser des mots clés pour préciser votre recherche. Exemples:
  • #mun québec (pour rechercher une municipalité)
  • #sante Lévis (pour rechercher un établissement de santé)
  • #cpe joyeux (pour rechercher un centre de la petite enfance)
  • #intersection liégois + église (pour rechercher une intersection, le #+ peut aussi être utilisé)
*Les mots clés apparaissent au survol d'un type dans l'onglet des paramètres de recherche -> iCherche -> Type de résultat.

Exemple pour les coordonnées :
  • Degré décimal (-68.165547, 48.644546)
  • Degré minute seconde (-68 9 56, 48 38 40)
  • Degré minute décimal (-68 9.56, 48 38.40)
  • Projeté (UTM-19 561466.861, 5388278.862)
  • BELL (Lat: 48 38 40N Long: 68 9 56W UNC:100 CONF:90)
  • Metre Metre (111594.63, 445854.74;32198)
Pour plus d'informations sur la recherche par coordonnées : Consulter la documentation d'IGO2", + "zoomOnFeatureTooltip": "Zoomer sur l'entité sélectionnée.", + "zoomOnFeatureTooltipOutOfView": "L'entité est hors de la vue. Zoomer sur l'entité sélectionnée." + }, + "aboutTool": { + "headerHtml": "", + "html": "
Aperçu des fonctionnalités
Recherche
Située dans la portion supérieure gauche de l’interface, la barre de Recherche permet de se positionner à l’aide d’une adresse, d’un lieu ou de coordonnées GPS et peut également servir à rechercher une couche.

Il est également possible de rechercher un élément par type de résultats en utilisant le hashtag « # » (par exemple, #municipalites québec). Les accents et les lettres majuscules n'importent pas lors de l'utilisation du hashtag et n'ont pas d'impact sur les Résultats de recherche.

Contextes
Les Contextes permettent de visualiser des regroupements de couches faits par thème ou par contexte de travail. Lorsqu'un contexte est sélectionné, toutes les couches qu'il contient se retrouvent alors dans la Carte. Il est possible d'ajouter d’autres couches à partir du Catalogue ou de l’outil Recherche.

ATTENTION : Si un nouveau contexte est sélectionné, toutes les couches affichées dans la Carte seront remplacées par celles de ce nouveau contexte.

Carte
Il est possible de personnaliser la Carte à partir du Catalogue ou de l’outil Recherche. Cet espace permet entre autres d’ajouter, de supprimer, d’interroger, de filtrer et de trier les couches présentées. Il est également possible d'afficher les légendes des couches.

Filtre spatial
Le Filtre spatial permet de rechercher des adresses ou des thématiques selon des zones prédéfinies (par exemple, par arrondissement ou par MRC) ou selon un dessin réalisé par l'utilisateur. Les résultats du filtre peuvent être exportés à l'aide de l'outil Importer et exporter.

Mesurer
Cet outil permet de Mesurer des distances ou des superficies directement sur la carte.

Dessin
L'outil Dessin permet de dessiner des entités ponctuelles, linéaires, polygonales ou circulaires accompagnées ou non d'étiquettes. La couleur de remplissage et du contour des entités peuvent être choisies à l'aide des sélecteurs correspondants.

Une couche Dessins peut être exportée à l'aide de l'outil Importer et exporter.

Itinéraire
Il est possible de construire un Itinéraire entre deux points en sélectionnant un point de départ et un point d'arrivée dans la carte ou en recherchant des adresses. Il est ensuite possible d'ajouter des points d'arrêt intermédiaires et de copier la description ou le lien de l'itinéraire dans le presse-papier.

Catalogue
Le Catalogue contient toutes les couches qui peuvent être ajoutées à la Carte. L'utilisateur doit cliquer sur + de la couche désirée afin de l’ajouter à la Carte.

Importer et exporter
Il est possible d'Importer un fichier vectoriel tout en spécifiant un système de coordonnées ou une projection.

Il est possible d'Exporter une ou plusieurs couches dans plusieurs formats courants.

Il est également possible d'Importer ou d'Exporter un contexte localement. Cette dernière fonctionnalité permet ainsi de sauvegarder des contextes en mode non-authentifié ou anonyme.

Imprimer
Cet outil permet d'Imprimer la carte affichée à l’écran en spécifiant plusieurs options telles qu'un titre, un commentaire, le format de sortie, le format du papier et l'orientation de l'impression.

Partager
L'outil Partager permet de créer une adresse URL qui redirige vers une représentation exacte de la Carte affichée à l’écran. Ce lien peut, par exemple, être partagé ou diffusé dans un document, permettant ainsi de « sauvegarder » la carte pour une utilisation ultérieure.

IGOIGO2 est une solution Web libre géomatique développée en mode collaboratif par des spécialistes provenant de plusieurs ministères et organismes du gouvernement du Québec.

Version: {{version.lib}}

", + "trainingGuide": "Guide de formation", + "trainingGuideTooltip": "Cliquez ici pour accéder au guide d'autoformation de IGO2" + }, + "mapTool": { + "empty": "La carte ne contient aucune couche de données.", + "customize": "Personnalisez-la en ajoutant des couches à partir des outils suivants : ", + "search-tool": "Recherche", + "catalog-tool": "Catalogue de données", + "context-tool": "Gestionnaire de contextes", + "noLayersVisible": "Aucune couche visible.", + "noLayersInRange": "Aucune couche visible dans la plage d'échelle active. Veuillez zoomer ou dézoomer pour découvrir ces couches." + }, + "importExportTool": { + "importExportData": "Couche", + "importExportContext": "Contexte" + }, + "workspace": { + "toggleWorkspace": "Ouvrir/fermer la vue tabulaire", + "ogcFilter.close": "Fermer", + "ogcFilter.title": "Filtres", + "ogcFilter.tooltip": "Appliquer des filtres sur la couche", + "download.title": "Télécharger les données associées", + "download.tooltip": "Télécharger les données associées", + "inMapExtent.title": "Montrer les entités contenues dans la carte", + "inMapExtent.active.tooltip": "Montrer les entités contenues dans la carte", + "inMapExtent.inactive.tooltip": "Montrer toutes les entités", + "zoomAuto.title": "Zoom auto", + "zoomAuto.tooltip": "Zoom auto", + "print.title": "Imprimer la présente table (PDF)", + "print.tooltip": "Imprimer la présente table (PDF)", + "selected.title": "Montrer les entités sélectionnées", + "selected.tooltip": "Montrer les entités sélectionnées", + "clearSelection.title": "Tout désélectionner", + "clearSelection.tooltip": "Désélectionner les enregistrements sélectionnés", + "maximize": "Agrandir", + "maximizeTooltip": "Agrandir la fenêtre", + "standardExtent": "Réduire", + "standardExtentTooltip": "Réduire la fenêtre" + }, + "directions": { + "warning": { + "title": "Avertissement", + "message": "L'itinéraire proposé dans cet outil ne tient pas compte des conditions routières actuelles, de la congestion routière, des entraves présentes sur le réseau et des horaires de traversiers (ouverture quotidienne et saisonnière)." + } + }, + "map-proximity-tool": { + "lon": "Longitude", + "lat": "Latitude", + "method": "Méthode de localisation", + "radiusM": "Rayon de recherche (mètres)", + "geolocation": "Votre position", + "mapCenter": "Centre de la carte (croix noire)", + "copyMsg": "Coordonnées copiées", + "copyTitle": "Coordonnées du centre", + "feature": "Entité", + "distance": "Distance" + }, + "advanced-map-tool": { + "geolocation": { + "title": "Géolocalisation", + "tracking": "Activer/montrer votre localisation", + "follow": "Activer le suivi de position sur la carte" + }, + "advanced-swipe": { + "swipe-select": "Choisir les couches à comparer", + "selectAll": "Tout sélectionner", + "empty": "La carte ne contient aucune couche de données.", + "customize": "Personnalisez-la en ajoutant des couches à partir des outils suivants : ", + "search-tool": "Recherche", + "catalog-tool": "Catalogue de données", + "context-tool": "Gestionnaire de contextes", + "swipe": "Activer", + "swipe-tool": "Outil de comparaison" + }, + "advanced-coordinates": { + "copy": "Copier", + "lon": "Longitude", + "lat": "Latitude", + "nord": "Nord", + "est": "Est", + "coordinates": "Coordonnées du centre de la carte", + "copyMsg": "Coordonnées copiées", + "copyTitle": "Coordonnées du centre", + "center": "Afficher le centre de la carte", + "coordSystem": "Système de coordonnées", + "zoom": "Niveau de zoom courant: ", + "scale": "Échelle cartographique: ", + "resolution": "Résolution cartographique: " + } + } + } + } +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 8e0b025f18..f76b62bb65 100644 --- a/package-lock.json +++ b/package-lock.json @@ -41,6 +41,8 @@ "core-js": "^3.32.2", "file-saver": "^2.0.2", "flexsearch": "0.7.21", + "geostyler-legend": "^4.0.0", + "geostyler-openlayers-parser": "^4.2.1", "hammerjs": "2.0.8", "html2canvas": "^1.4.1", "jspdf": "^2.5.1", @@ -6833,6 +6835,11 @@ "@types/node": "*" } }, + "node_modules/@types/d3-selection": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.7.tgz", + "integrity": "sha512-qoj2O7KjfqCobmtFOth8FMvjwMVPUAAmn6xiUbLl1ld7vQCPgffvyV5BBcEFfqWdilAUm+3zciU/3P3vZrUMlg==" + }, "node_modules/@types/eslint": { "version": "8.56.2", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.2.tgz", @@ -6946,8 +6953,7 @@ "node_modules/@types/lodash": { "version": "4.14.202", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.202.tgz", - "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==", - "dev": true + "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==" }, "node_modules/@types/mime": { "version": "1.3.5", @@ -10345,6 +10351,11 @@ "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==", "dev": true }, + "node_modules/css-font-parser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/css-font-parser/-/css-font-parser-2.0.0.tgz", + "integrity": "sha512-YjgBiAq5rFNXfsPHofaEZwsUbCoSK0avstS76BSqNyVCM7+oiO44wZxbtq6YFSaQafCG0llS/f79oqlsmzaBJg==" + }, "node_modules/css-line-break": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/css-line-break/-/css-line-break-2.1.0.tgz", @@ -10746,11 +10757,246 @@ "type": "^1.0.1" } }, + "node_modules/d3": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.8.5.tgz", + "integrity": "sha512-JgoahDG51ncUfJu6wX/1vWQEqOflgXyl4MaHqlcSruTez7yhaRKR9i8VjjcQGeS2en/jnFivXuaIMnseMMt0XA==", + "peer": true, + "dependencies": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "4", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/d3-array": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" }, + "node_modules/d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "peer": true, + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "peer": true, + "dependencies": { + "d3-path": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-contour": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", + "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", + "peer": true, + "dependencies": { + "d3-array": "^3.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-contour/node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "peer": true, + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", + "peer": true, + "dependencies": { + "delaunator": "5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "peer": true, + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "peer": true, + "dependencies": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/d3-dsv/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "peer": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "peer": true, + "dependencies": { + "d3-dsv": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "peer": true, + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "peer": true, + "engines": { + "node": ">=12" + } + }, "node_modules/d3-geo": { "version": "1.7.1", "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.7.1.tgz", @@ -10759,6 +11005,229 @@ "d3-array": "1" } }, + "node_modules/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "peer": true, + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "peer": true, + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale-chromatic": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", + "integrity": "sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==", + "peer": true, + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale/node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "peer": true, + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "peer": true, + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "peer": true, + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "peer": true, + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time/node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "peer": true, + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "peer": true, + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "peer": true, + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3/node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "peer": true, + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3/node_modules/d3-geo": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.0.tgz", + "integrity": "sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==", + "peer": true, + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/dargs": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/dargs/-/dargs-8.1.0.tgz", @@ -11162,6 +11631,15 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/delaunator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.0.tgz", + "integrity": "sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==", + "peer": true, + "dependencies": { + "robust-predicates": "^3.0.0" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -13613,6 +14091,56 @@ "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.8.tgz", "integrity": "sha512-1rkryxURpr6aWP7R786/UQOkJ3PcpQiWkAXBmdWc7ryFWqN6a4xfK7BtjXvFBKO9LjQ+MWQSWxYeZX1OApnArA==" }, + "node_modules/geostyler-legend": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/geostyler-legend/-/geostyler-legend-4.0.0.tgz", + "integrity": "sha512-GXNcprNpsm9cfiJ9oiYnPHhJog9wkQm0Z7Ab+Raqln5CnTNydS4jFFhEfdoqkMTk3aEE6yonXNsX+vfm0DwUCA==", + "dependencies": { + "@types/d3-selection": "^3.0.1", + "geostyler-openlayers-parser": "^4.0.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "d3": ">=6", + "ol": ">=6" + } + }, + "node_modules/geostyler-openlayers-parser": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/geostyler-openlayers-parser/-/geostyler-openlayers-parser-4.2.1.tgz", + "integrity": "sha512-oP/wZyzHasSsYZFP0EA2rBG/6oWSZjt7aB+Ykbvz0Pn2Z9jDEFtSfWRgVeakfWubolzlXgLmb7JZko1EYOeW+g==", + "dependencies": { + "css-font-parser": "^2.0.0", + "geostyler-style": "^7.3.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://opencollective.com/geostyler" + }, + "peerDependencies": { + "ol": ">=7.4" + } + }, + "node_modules/geostyler-style": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/geostyler-style/-/geostyler-style-7.3.1.tgz", + "integrity": "sha512-9KOXmtRt0O7lhwWfmRORM5l3j3H1uR52NFHlHv1qTb1hgNGZIPhLUrGCaoceUdNkD9+P/Cjiqsea+X+H8h64zw==", + "dependencies": { + "@types/lodash": "^4.14.168", + "lodash": "^4.17.21" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=6.0.0" + }, + "funding": { + "url": "https://opencollective.com/geostyler" + } + }, "node_modules/geotiff": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/geotiff/-/geotiff-2.1.2.tgz", @@ -15001,6 +15529,15 @@ "node": ">=8" } }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "peer": true, + "engines": { + "node": ">=12" + } + }, "node_modules/ip": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", @@ -15935,7 +16472,6 @@ "version": "3.8.1", "resolved": "https://registry.npmjs.org/jspdf-autotable/-/jspdf-autotable-3.8.1.tgz", "integrity": "sha512-UjJqo80Z3/WUzDi4JipTGp0pAvNvR3Gsm38inJ5ZnwsJH0Lw4pEbssRSH6zMWAhR1ZkTrsDpQo5p6rZk987/AQ==", - "peer": true, "peerDependencies": { "jspdf": "^2.5.1" } @@ -16519,8 +17055,7 @@ "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "node_modules/lodash.debounce": { "version": "4.0.8", @@ -18476,7 +19011,7 @@ "version": "14.0.0", "resolved": "https://registry.npmjs.org/ngx-color-picker/-/ngx-color-picker-14.0.0.tgz", "integrity": "sha512-w28zx2DyVpIJeNsTB3T2LUI4Ed/Ujf5Uhxuh0dllputfpxXwZG9ocSJM/0L67+fxA3UnfvvXVZNUX1Ny5nZIIw==", - "peer": true, + "optional": true, "dependencies": { "tslib": "^2.3.0" }, @@ -21882,6 +22417,12 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/robust-predicates": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", + "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==", + "peer": true + }, "node_modules/rollup": { "version": "3.29.4", "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", @@ -21966,8 +22507,7 @@ "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/safevalues": { "version": "0.3.4", @@ -26029,6 +26569,22 @@ "engines": { "node": ">=18.10.0" }, + "optionalDependencies": { + "file-saver": "^2.0.2", + "flexsearch": "0.7.21", + "html2canvas": "^1.4.1", + "jspdf": "^2.5.1", + "jspdf-autotable": "^3.5.29", + "jszip": "^3.10.1", + "moment": "^2.29.4", + "ngx-color-picker": "^14.0.0", + "ngx-indexed-db": "^11.0.2", + "ol": "^7.5.2", + "ol-mapbox-style": "^12.0.0", + "proj4": "^2.9.0", + "rxjs": "^7.8.0", + "striptags": "^3.2.0" + }, "peerDependencies": { "@angular/animations": "^16.2.5", "@angular/common": "^16.2.5", @@ -26042,9 +26598,10 @@ "@mat-datetimepicker/core": "~12.0.0", "file-saver": "^2.0.2", "flexsearch": "0.7.21", + "geostyler-legend": "^4.0.0", + "geostyler-openlayers-parser": "^4.2.1", "html2canvas": "^1.4.1", "jspdf": "^2.5.1", - "jspdf-autotable": "^3.5.29", "jszip": "^3.10.1", "moment": "^2.29.4", "ngx-color-picker": "^14.0.0", @@ -26115,6 +26672,8 @@ "@igo2/integration": "*", "@igo2/utils": "*", "core-js": "^3.32.2", + "geostyler-legend": "^4.0.0", + "geostyler-openlayers-parser": "^4.2.1", "hammerjs": "^2.0.8", "ol": "^7.5.2", "rxjs": "^7.8.0", diff --git a/package.json b/package.json index 3d2cc01d11..89719fde8a 100644 --- a/package.json +++ b/package.json @@ -75,6 +75,8 @@ "core-js": "^3.32.2", "file-saver": "^2.0.2", "flexsearch": "0.7.21", + "geostyler-legend": "^4.0.0", + "geostyler-openlayers-parser": "^4.2.1", "hammerjs": "2.0.8", "html2canvas": "^1.4.1", "jspdf": "^2.5.1", diff --git a/packages/geo/package.json b/packages/geo/package.json index 03ab8236e5..c249793ef0 100644 --- a/packages/geo/package.json +++ b/packages/geo/package.json @@ -57,6 +57,23 @@ "@igo2/core": "*", "@igo2/utils": "*", "@mat-datetimepicker/core": "~12.0.0", + "file-saver": "^2.0.2", + "flexsearch": "0.7.21", + "geostyler-legend": "^4.0.0", + "geostyler-openlayers-parser": "^4.2.1", + "html2canvas": "^1.4.1", + "jspdf": "^2.5.1", + "jszip": "^3.10.1", + "moment": "^2.29.4", + "ngx-color-picker": "^14.0.0", + "ngx-indexed-db": "^11.0.2", + "ol-mapbox-style": "^12.0.0", + "ol": "^7.5.2", + "proj4": "^2.9.0", + "rxjs": "^7.8.0", + "striptags": "^3.2.0" + }, + "optionalDependencies": { "file-saver": "^2.0.2", "flexsearch": "0.7.21", "html2canvas": "^1.4.1", diff --git a/packages/geo/src/lib/layer/shared/layer.service.ts b/packages/geo/src/lib/layer/shared/layer.service.ts index 2ece5ae365..601ac92d7b 100644 --- a/packages/geo/src/lib/layer/shared/layer.service.ts +++ b/packages/geo/src/lib/layer/shared/layer.service.ts @@ -179,7 +179,6 @@ export class LayerService { layerOptions.igoStyle.igoStyleObject && layerOptions.idbInfo?.storeToIdb ) { - // temporary fix todo : handle it with geostyler. style = this.styleService.parseStyle( 'style', layerOptions.igoStyle.igoStyleObject @@ -278,7 +277,7 @@ export class LayerService { private createVectorTileLayer( layerOptions: VectorTileLayerOptions ): VectorTileLayer { - let style: Style[] | Style | OlStyleLike; + let style: Style[] | Style | OlStyleLike = layerOptions.style; let igoLayer: VectorTileLayer; if (!layerOptions.igoStyle) { diff --git a/packages/geo/src/lib/style/geostyler-service/geostyler.service.ts b/packages/geo/src/lib/style/geostyler-service/geostyler.service.ts new file mode 100644 index 0000000000..748c915c97 --- /dev/null +++ b/packages/geo/src/lib/style/geostyler-service/geostyler.service.ts @@ -0,0 +1,134 @@ +import { Injectable } from '@angular/core'; + +import LegendRenderer from 'geostyler-legend/dist/LegendRenderer/LegendRenderer'; +import { OlStyleParser as OpenLayersParser } from 'geostyler-openlayers-parser'; +import { + Style as GeoStylerStyle, + IconSymbolizer, + LineSymbolizer, + MarkSymbolizer, + WriteStyleResult +} from 'geostyler-style'; +import { Observable, from, map } from 'rxjs'; + +import { StyleSourceType } from '../shared'; + +@Injectable({ + providedIn: 'root' +}) +export class GeostylerStyleService { + /** + * Create a style based on a object as follow. + * Due to the legend renderer limitation, the symbolizers have a size limit in the legend. + * The legend will not affect the symbolizer size data, only on the display will it hava a limit. + * + * ## Feature styles + * + * "igoStyle": { + * "geoStyler": { + * "name": "GeoStyler Test", + * "symbolizers":[ + * { + * "kind": "Fill", + * "color": "#ff0000", + * "width": 5 + * } + * ], + * "scaleDenominator": { + * "min": 50, + * "max": 200 + * } + * } + * } + * + * @param options + * @returns + */ + geostylerToOl(options: GeoStylerStyle): Observable { + return this.geostylerTo(options, StyleSourceType.OpenLayers); + } + private geostylerTo( + options: GeoStylerStyle, + destStyle: StyleSourceType + ): Observable { + let parser: OpenLayersParser; + if (destStyle === StyleSourceType.OpenLayers) { + parser = new OpenLayersParser(); + } else if (destStyle === StyleSourceType.HoverStyle) { + parser = new OpenLayersParser(); + } + if (parser) { + return from(parser.writeStyle(options)); + } + } + + public getStylerStyleToLegend( + type: string, + styles: GeoStylerStyle[], + width: number = 300, + height: number = 300 + ): Observable { + const layerDescriptors: GeoStylerStyle[] = + this.transferLayersToLegend(styles); + const renderer = new LegendRenderer({ + maxColumnWidth: 300, + maxColumnHeight: 300, + overflow: 'auto', + styles: layerDescriptors, + size: [width, height], + hideRect: true + }); + return from(renderer.renderAsImage('svg')).pipe( + map((r: Element) => { + const serializer = new XMLSerializer(); + const svgXmlString = serializer.serializeToString(r); + if (type === 'svg') { + return svgXmlString; + } else { + const blob = new Blob([svgXmlString], { + type: 'image/svg+xml' + }); + const urlCreator = window.URL; + return urlCreator.createObjectURL(blob); + } + }) + ); + } + + private transferLayersToLegend(styles: GeoStylerStyle[]) { + const stylesCopy = [...styles]; + const layerDescriptorsList: GeoStylerStyle[] = []; + stylesCopy.forEach((stylesCopyItem) => { + const DescriptorLayerRulesAdapted = []; + let descriptorLayerName = stylesCopyItem.name; + stylesCopyItem.rules.map((styleRule) => { + var styleRuleSymbolizersAdapted = []; + styleRule.symbolizers.map((styleRuleSymbolizer) => { + switch (styleRuleSymbolizer.kind) { + case 'Mark': + (styleRuleSymbolizer as MarkSymbolizer).radius = 10; + break; + case 'Line': + (styleRuleSymbolizer as LineSymbolizer).width = 3; + break; + case 'Icon': + (styleRuleSymbolizer as IconSymbolizer).size = 15; + default: + break; + } + styleRuleSymbolizersAdapted.push(styleRuleSymbolizer); + }); + DescriptorLayerRulesAdapted.push({ + name: styleRule.name, + symbolizers: styleRuleSymbolizersAdapted + }); + }); + const styleNoRadius: any = { + name: descriptorLayerName, + rules: DescriptorLayerRulesAdapted + }; + layerDescriptorsList.push(styleNoRadius); + }); + return layerDescriptorsList; + } +} diff --git a/packages/geo/src/lib/style/geostyler-service/index.ts b/packages/geo/src/lib/style/geostyler-service/index.ts new file mode 100644 index 0000000000..a4d958db1a --- /dev/null +++ b/packages/geo/src/lib/style/geostyler-service/index.ts @@ -0,0 +1 @@ +export * from './geostyler.service'; diff --git a/packages/geo/src/lib/style/index.ts b/packages/geo/src/lib/style/index.ts index 5be03fe0cc..85d8cda384 100644 --- a/packages/geo/src/lib/style/index.ts +++ b/packages/geo/src/lib/style/index.ts @@ -2,3 +2,4 @@ export * from './shared'; export * from './style-service'; export * from './style-list'; export * from './style-modal'; +export * from './geostyler-service'; diff --git a/packages/geo/src/lib/style/shared/index.ts b/packages/geo/src/lib/style/shared/index.ts index eb89219cf9..c21dd14963 100644 --- a/packages/geo/src/lib/style/shared/index.ts +++ b/packages/geo/src/lib/style/shared/index.ts @@ -2,3 +2,4 @@ export * from './datasource'; export * from './vector'; export * from './overlay'; export * from './feature'; +export * from './style.enums'; diff --git a/packages/geo/src/lib/style/shared/style.enums.ts b/packages/geo/src/lib/style/shared/style.enums.ts new file mode 100644 index 0000000000..c01d49bda7 --- /dev/null +++ b/packages/geo/src/lib/style/shared/style.enums.ts @@ -0,0 +1,4 @@ +export enum StyleSourceType { + OpenLayers = 'ol', + HoverStyle = 'hs' +} diff --git a/packages/geo/src/lib/style/style.module.ts b/packages/geo/src/lib/style/style.module.ts index 4680fe7ff7..aa5e6ec671 100644 --- a/packages/geo/src/lib/style/style.module.ts +++ b/packages/geo/src/lib/style/style.module.ts @@ -12,6 +12,7 @@ import { MatTooltipModule } from '@angular/material/tooltip'; import { ColorPickerFormFieldModule } from '@igo2/common'; import { IgoLanguageModule } from '@igo2/core'; +import { GeostylerStyleService } from './geostyler-service/geostyler.service'; import { IgoStyleListModule } from './style-list/style-list.module'; import { StyleModalDrawingComponent } from './style-modal/drawing/style-modal-drawing.component'; import { StyleModalLayerButtonComponent } from './style-modal/layer-button/style-modal-layer-button.component'; @@ -51,7 +52,7 @@ export class IgoStyleModule { static forRoot(): ModuleWithProviders { return { ngModule: IgoStyleModule, - providers: [StyleService, DrawStyleService] + providers: [StyleService, DrawStyleService, GeostylerStyleService] }; } }